diff --git a/encoding/README.md b/encoding/README.md deleted file mode 100644 index c147b3b..0000000 --- a/encoding/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# encoding - -## msgpack - -```shell -go get -u github.com/go-kratos/kratos/contrib/encoding/msgpack/v2 -``` diff --git a/encoding/encoding.go b/encoding/encoding.go index 3ecdc33..f9defe6 100644 --- a/encoding/encoding.go +++ b/encoding/encoding.go @@ -1,7 +1,6 @@ package encoding import ( - "fmt" "strings" ) @@ -39,6 +38,5 @@ func RegisterCodec(codec Codec) { // // The content-subtype is expected to be lowercase. func GetCodec(contentSubtype string) Codec { - fmt.Println("xx", contentSubtype) return registeredCodecs[contentSubtype] } diff --git a/encoding/form/form_test.go b/encoding/form/form_test.go deleted file mode 100644 index 013edbd..0000000 --- a/encoding/form/form_test.go +++ /dev/null @@ -1,211 +0,0 @@ -package form - -import ( - "encoding/base64" - "reflect" - "testing" - - "google.golang.org/protobuf/types/known/durationpb" - "google.golang.org/protobuf/types/known/fieldmaskpb" - "google.golang.org/protobuf/types/known/timestamppb" - "google.golang.org/protobuf/types/known/wrapperspb" - - "github.com/go-kratos/kratos/v2/encoding" - bdtest "github.com/go-kratos/kratos/v2/internal/testdata/binding" - "github.com/go-kratos/kratos/v2/internal/testdata/complex" - ectest "github.com/go-kratos/kratos/v2/internal/testdata/encoding" -) - -type LoginRequest struct { - Username string `json:"username,omitempty"` - Password string `json:"password,omitempty"` -} - -func TestFormCodecMarshal(t *testing.T) { - req := &LoginRequest{ - Username: "kratos", - Password: "kratos_pwd", - } - content, err := encoding.GetCodec(Name).Marshal(req) - if err != nil { - t.Fatal(err) - } - if !reflect.DeepEqual([]byte("password=kratos_pwd&username=kratos"), content) { - t.Errorf("expect %s, got %s", "password=kratos_pwd&username=kratos", content) - } - - req = &LoginRequest{ - Username: "kratos", - Password: "", - } - content, err = encoding.GetCodec(Name).Marshal(req) - if err != nil { - t.Fatal(err) - } - if !reflect.DeepEqual([]byte("username=kratos"), content) { - t.Errorf("expect %s, got %s", "username=kratos", content) - } - - m := struct { - ID int32 `json:"id"` - Name string `json:"name"` - }{ - ID: 1, - Name: "kratos", - } - content, err = encoding.GetCodec(Name).Marshal(m) - if err != nil { - t.Fatal(err) - } - if !reflect.DeepEqual([]byte("id=1&name=kratos"), content) { - t.Errorf("expect %s, got %s", "id=1&name=kratos", content) - } -} - -func TestFormCodecUnmarshal(t *testing.T) { - req := &LoginRequest{ - Username: "kratos", - Password: "kratos_pwd", - } - content, err := encoding.GetCodec(Name).Marshal(req) - if err != nil { - t.Fatal(err) - } - - bindReq := new(LoginRequest) - err = encoding.GetCodec(Name).Unmarshal(content, bindReq) - if err != nil { - t.Fatal(err) - } - if !reflect.DeepEqual("kratos", bindReq.Username) { - t.Errorf("expect %v, got %v", "kratos", bindReq.Username) - } - if !reflect.DeepEqual("kratos_pwd", bindReq.Password) { - t.Errorf("expect %v, got %v", "kratos_pwd", bindReq.Password) - } -} - -func TestProtoEncodeDecode(t *testing.T) { - in := &complex.Complex{ - Id: 2233, - NoOne: "2233", - Simple: &complex.Simple{Component: "5566"}, - Simples: []string{"3344", "5566"}, - B: true, - Sex: complex.Sex_woman, - Age: 18, - A: 19, - Count: 3, - Price: 11.23, - D: 22.22, - Byte: []byte("123"), - Map: map[string]string{"kratos": "https://go-kratos.dev/"}, - - Timestamp: ×tamppb.Timestamp{Seconds: 20, Nanos: 2}, - Duration: &durationpb.Duration{Seconds: 120, Nanos: 22}, - Field: &fieldmaskpb.FieldMask{Paths: []string{"1", "2"}}, - Double: &wrapperspb.DoubleValue{Value: 12.33}, - Float: &wrapperspb.FloatValue{Value: 12.34}, - Int64: &wrapperspb.Int64Value{Value: 64}, - Int32: &wrapperspb.Int32Value{Value: 32}, - Uint64: &wrapperspb.UInt64Value{Value: 64}, - Uint32: &wrapperspb.UInt32Value{Value: 32}, - Bool: &wrapperspb.BoolValue{Value: false}, - String_: &wrapperspb.StringValue{Value: "go-kratos"}, - Bytes: &wrapperspb.BytesValue{Value: []byte("123")}, - } - content, err := encoding.GetCodec(Name).Marshal(in) - if err != nil { - t.Fatal(err) - } - if "a=19&age=18&b=true&bool=false&byte=MTIz&bytes=MTIz&count=3&d=22.22&double=12.33&duration="+ - "2m0.000000022s&field=1%2C2&float=12.34&id=2233&int32=32&int64=64&map%5Bkratos%5D=https%3A%2F%2Fgo-kratos.dev%2F&"+ - "numberOne=2233&price=11.23&sex=woman&simples=3344&simples=5566&string=go-kratos"+ - "×tamp=1970-01-01T00%3A00%3A20.000000002Z&uint32=32&uint64=64&very_simple.component=5566" != string(content) { - t.Errorf("rawpath is not equal to %s", content) - } - in2 := &complex.Complex{} - err = encoding.GetCodec(Name).Unmarshal(content, in2) - if err != nil { - t.Fatal(err) - } - if int64(2233) != in2.Id { - t.Errorf("expect %v, got %v", int64(2233), in2.Id) - } - if "2233" != in2.NoOne { - t.Errorf("expect %v, got %v", "2233", in2.NoOne) - } - if in2.Simple == nil { - t.Errorf("expect %v, got %v", nil, in2.Simple) - } - if "5566" != in2.Simple.Component { - t.Errorf("expect %v, got %v", "5566", in2.Simple.Component) - } - if in2.Simples == nil { - t.Errorf("expect %v, got %v", nil, in2.Simples) - } - if len(in2.Simples) != 2 { - t.Errorf("expect %v, got %v", 2, len(in2.Simples)) - } - if "3344" != in2.Simples[0] { - t.Errorf("expect %v, got %v", "3344", in2.Simples[0]) - } - if "5566" != in2.Simples[1] { - t.Errorf("expect %v, got %v", "5566", in2.Simples[1]) - } -} - -func TestDecodeStructPb(t *testing.T) { - req := new(ectest.StructPb) - query := `data={"name":"kratos"}&data_list={"name1": "kratos"}&data_list={"name2": "go-kratos"}` - if err := encoding.GetCodec(Name).Unmarshal([]byte(query), req); err != nil { - t.Fatal(err) - } - if "kratos" != req.Data.GetFields()["name"].GetStringValue() { - t.Errorf("except %v, got %v", "kratos", req.Data.GetFields()["name"].GetStringValue()) - } - if len(req.DataList) != 2 { - t.Fatalf("execpt %v, got %v", 2, len(req.DataList)) - } - if "kratos" != req.DataList[0].GetFields()["name1"].GetStringValue() { - t.Errorf("except %v, got %v", "kratos", req.Data.GetFields()["name1"].GetStringValue()) - } - if "go-kratos" != req.DataList[1].GetFields()["name2"].GetStringValue() { - t.Errorf("except %v, got %v", "go-kratos", req.Data.GetFields()["name2"].GetStringValue()) - } -} - -func TestDecodeBytesValuePb(t *testing.T) { - url := "https://example.com/xx/?a=1&b=2&c=3" - val := base64.URLEncoding.EncodeToString([]byte(url)) - content := "bytes=" + val - in2 := &complex.Complex{} - if err := encoding.GetCodec(Name).Unmarshal([]byte(content), in2); err != nil { - t.Error(err) - } - if url != string(in2.Bytes.Value) { - t.Errorf("except %s, got %s", val, in2.Bytes.Value) - } -} - -func TestEncodeFieldMask(t *testing.T) { - req := &bdtest.HelloRequest{ - UpdateMask: &fieldmaskpb.FieldMask{Paths: []string{"foo", "bar"}}, - } - if v := EncodeFieldMask(req.ProtoReflect()); v != "updateMask=foo,bar" { - t.Errorf("got %s", v) - } -} - -func TestOptional(t *testing.T) { - v := int32(100) - req := &bdtest.HelloRequest{ - Name: "foo", - Sub: &bdtest.Sub{Name: "bar"}, - OptInt32: &v, - } - query, _ := EncodeValues(req) - if query.Encode() != "name=foo&optInt32=100&sub.naming=bar" { - t.Fatalf("got %s", query.Encode()) - } -} diff --git a/encoding/form/proto_decode_test.go b/encoding/form/proto_decode_test.go deleted file mode 100644 index fbe2343..0000000 --- a/encoding/form/proto_decode_test.go +++ /dev/null @@ -1,217 +0,0 @@ -package form - -import ( - "fmt" - "net/url" - "reflect" - "strconv" - "testing" - - "google.golang.org/protobuf/reflect/protoreflect" - - "github.com/go-kratos/kratos/v2/internal/testdata/complex" -) - -func TestDecodeValues(t *testing.T) { - form, err := url.ParseQuery("a=19&age=18&b=true&bool=false&byte=MTIz&bytes=MTIz&count=3&d=22.22&double=12.33&duration=" + - "2m0.000000022s&field=1%2C2&float=12.34&id=2233&int32=32&int64=64&numberOne=2233&price=11.23&sex=woman&simples=3344&" + - "simples=5566&string=go-kratos×tamp=1970-01-01T00%3A00%3A20.000000002Z&uint32=32&uint64=64&very_simple.component=5566") - if err != nil { - t.Fatal(err) - } - - comp := &complex.Complex{} - err = DecodeValues(comp, form) - if err != nil { - t.Fatal(err) - } - if comp.Id != int64(2233) { - t.Errorf("want %v, got %v", int64(2233), comp.Id) - } - if comp.NoOne != "2233" { - t.Errorf("want %v, got %v", "2233", comp.NoOne) - } - if comp.Simple == nil { - t.Fatalf("want %v, got %v", nil, comp.Simple) - } - if comp.Simple.Component != "5566" { - t.Errorf("want %v, got %v", "5566", comp.Simple.Component) - } - if len(comp.Simples) != 2 { - t.Fatalf("want %v, got %v", 2, len(comp.Simples)) - } - if comp.Simples[0] != "3344" { - t.Errorf("want %v, got %v", "3344", comp.Simples[0]) - } - if comp.Simples[1] != "5566" { - t.Errorf("want %v, got %v", "5566", comp.Simples[1]) - } -} - -func TestGetFieldDescriptor(t *testing.T) { - comp := &complex.Complex{} - - field := getFieldDescriptor(comp.ProtoReflect(), "id") - if field.Kind() != protoreflect.Int64Kind { - t.Errorf("want: %d, got: %d", protoreflect.Int64Kind, field.Kind()) - } - - field = getFieldDescriptor(comp.ProtoReflect(), "simples") - if field.Kind() != protoreflect.StringKind { - t.Errorf("want: %d, got: %d", protoreflect.StringKind, field.Kind()) - } -} - -func TestPopulateRepeatedField(t *testing.T) { - query, err := url.ParseQuery("simples=3344&simples=5566") - if err != nil { - t.Fatal(err) - } - comp := &complex.Complex{} - field := getFieldDescriptor(comp.ProtoReflect(), "simples") - - err = populateRepeatedField(field, comp.ProtoReflect().Mutable(field).List(), query["simples"]) - if err != nil { - t.Fatal(err) - } - if !reflect.DeepEqual([]string{"3344", "5566"}, comp.GetSimples()) { - t.Errorf("want: %v, got: %v", []string{"3344", "5566"}, comp.GetSimples()) - } -} - -func TestPopulateMapField(t *testing.T) { - query, err := url.ParseQuery("map%5Bkratos%5D=https://go-kratos.dev/") - if err != nil { - t.Fatal(err) - } - comp := &complex.Complex{} - field := getFieldDescriptor(comp.ProtoReflect(), "map") - // Fill the comp map field with the url query values - err = populateMapField(field, comp.ProtoReflect().Mutable(field).Map(), []string{"kratos"}, query["map[kratos]"]) - if err != nil { - t.Fatal(err) - } - // Get the comp map field value - if query["map[kratos]"][0] != comp.Map["kratos"] { - t.Errorf("want: %s, got: %s", query["map[kratos]"], comp.Map["kratos"]) - } -} - -func TestParseField(t *testing.T) { - tests := []struct { - name string - fieldName string - protoReflectKind protoreflect.Kind - value string - targetProtoReflectValue protoreflect.Value - targetErr error - }{ - { - name: "BoolKind", - fieldName: "b", - protoReflectKind: protoreflect.BoolKind, - value: "true", - targetProtoReflectValue: protoreflect.ValueOfBool(true), - targetErr: nil, - }, - { - name: "BoolKind", - fieldName: "b", - protoReflectKind: protoreflect.BoolKind, - value: "a", - targetProtoReflectValue: protoreflect.Value{}, - targetErr: &strconv.NumError{Func: "ParseBool", Num: "a", Err: strconv.ErrSyntax}, - }, - { - name: "EnumKind", - fieldName: "sex", - protoReflectKind: protoreflect.EnumKind, - value: "1", - targetProtoReflectValue: protoreflect.ValueOfEnum(1), - targetErr: nil, - }, - { - name: "EnumKind", - fieldName: "sex", - protoReflectKind: protoreflect.EnumKind, - value: "2", - targetProtoReflectValue: protoreflect.Value{}, - targetErr: fmt.Errorf("%q is not a valid value", "2"), - }, - } - for _, test := range tests { - t.Run(test.name, func(t *testing.T) { - comp := &complex.Complex{} - field := getFieldDescriptor(comp.ProtoReflect(), test.fieldName) - if test.protoReflectKind != field.Kind() { - t.Fatalf("want: %d, got: %d", test.protoReflectKind, field.Kind()) - } - val, err := parseField(field, test.value) - if !reflect.DeepEqual(test.targetErr, err) { - t.Fatalf("want: %s, got: %s", test.targetErr, err) - } - if !reflect.DeepEqual(test.targetProtoReflectValue, val) { - t.Errorf("want: %s, got: %s", test.targetProtoReflectValue, val) - } - }) - } -} - -func TestJsonSnakeCase(t *testing.T) { - tests := []struct { - camelCase string - snakeCase string - }{ - { - "userId", "user_id", - }, - { - "user", "user", - }, - { - "userIdAndUsername", "user_id_and_username", - }, - { - "", "", - }, - } - for _, test := range tests { - t.Run(test.camelCase, func(t *testing.T) { - snake := jsonSnakeCase(test.camelCase) - if snake != test.snakeCase { - t.Errorf("want: %s, got: %s", test.snakeCase, snake) - } - }) - } -} - -func TestIsASCIIUpper(t *testing.T) { - tests := []struct { - b byte - upper bool - }{ - { - 'A', true, - }, - { - 'a', false, - }, - { - ',', false, - }, - { - '1', false, - }, - { - ' ', false, - }, - } - for _, test := range tests { - t.Run(string(test.b), func(t *testing.T) { - upper := isASCIIUpper(test.b) - if test.upper != upper { - t.Errorf("'%s' is not ascii upper", string(test.b)) - } - }) - } -} diff --git a/encoding/form/proto_encode_test.go b/encoding/form/proto_encode_test.go deleted file mode 100644 index 7d0cfa9..0000000 --- a/encoding/form/proto_encode_test.go +++ /dev/null @@ -1,110 +0,0 @@ -package form - -import ( - "testing" - - "google.golang.org/protobuf/types/known/durationpb" - "google.golang.org/protobuf/types/known/fieldmaskpb" - "google.golang.org/protobuf/types/known/timestamppb" - "google.golang.org/protobuf/types/known/wrapperspb" - - "github.com/go-kratos/kratos/v2/internal/testdata/complex" -) - -func TestEncodeValues(t *testing.T) { - in := &complex.Complex{ - Id: 2233, - NoOne: "2233", - Simple: &complex.Simple{Component: "5566"}, - Simples: []string{"3344", "5566"}, - B: true, - Sex: complex.Sex_woman, - Age: 18, - A: 19, - Count: 3, - Price: 11.23, - D: 22.22, - Byte: []byte("123"), - Map: map[string]string{"kratos": "https://go-kratos.dev/", "kratos_start": "https://go-kratos.dev/en/docs/getting-started/start/"}, - - Timestamp: ×tamppb.Timestamp{Seconds: 20, Nanos: 2}, - Duration: &durationpb.Duration{Seconds: 120, Nanos: 22}, - Field: &fieldmaskpb.FieldMask{Paths: []string{"1", "2"}}, - Double: &wrapperspb.DoubleValue{Value: 12.33}, - Float: &wrapperspb.FloatValue{Value: 12.34}, - Int64: &wrapperspb.Int64Value{Value: 64}, - Int32: &wrapperspb.Int32Value{Value: 32}, - Uint64: &wrapperspb.UInt64Value{Value: 64}, - Uint32: &wrapperspb.UInt32Value{Value: 32}, - Bool: &wrapperspb.BoolValue{Value: false}, - String_: &wrapperspb.StringValue{Value: "go-kratos"}, - Bytes: &wrapperspb.BytesValue{Value: []byte("123")}, - } - query, err := EncodeValues(in) - if err != nil { - t.Fatal(err) - } - want := "a=19&age=18&b=true&bool=false&byte=MTIz&bytes=MTIz&count=3&d=22.22&double=12.33&duration=2m0.000000022s&field=1%2C2&float=12.34&id=2233&int32=32&int64=64&map%5Bkratos%5D=https%3A%2F%2Fgo-kratos.dev%2F&map%5Bkratos_start%5D=https%3A%2F%2Fgo-kratos.dev%2Fen%2Fdocs%2Fgetting-started%2Fstart%2F&numberOne=2233&price=11.23&sex=woman&simples=3344&simples=5566&string=go-kratos×tamp=1970-01-01T00%3A00%3A20.000000002Z&uint32=32&uint64=64&very_simple.component=5566" // nolint:lll - if got := query.Encode(); want != got { - t.Errorf("want: %s, got: %s", want, got) - } -} - -func TestJsonCamelCase(t *testing.T) { - tests := []struct { - camelCase string - snakeCase string - }{ - { - "userId", "user_id", - }, - { - "user", "user", - }, - { - "userIdAndUsername", "user_id_and_username", - }, - { - "", "", - }, - } - for _, test := range tests { - t.Run(test.snakeCase, func(t *testing.T) { - camel := jsonCamelCase(test.snakeCase) - if camel != test.camelCase { - t.Errorf("want: %s, got: %s", test.camelCase, camel) - } - }) - } -} - -func TestIsASCIILower(t *testing.T) { - tests := []struct { - b byte - lower bool - }{ - { - 'A', false, - }, - { - 'a', true, - }, - { - ',', false, - }, - { - '1', false, - }, - { - ' ', false, - }, - } - for _, test := range tests { - t.Run(string(test.b), func(t *testing.T) { - lower := isASCIILower(test.b) - if test.lower != lower { - t.Errorf("'%s' is not ascii lower", string(test.b)) - } - }) - } -} diff --git a/encoding/form/well_known_types_test.go b/encoding/form/well_known_types_test.go deleted file mode 100644 index 5018cf7..0000000 --- a/encoding/form/well_known_types_test.go +++ /dev/null @@ -1,95 +0,0 @@ -package form - -import ( - "encoding/base64" - "testing" - "time" - - "google.golang.org/protobuf/reflect/protoreflect" - "google.golang.org/protobuf/types/known/durationpb" - "google.golang.org/protobuf/types/known/timestamppb" - "google.golang.org/protobuf/types/known/wrapperspb" -) - -func TestMarshalTimeStamp(t *testing.T) { - tests := []struct { - input *timestamppb.Timestamp - expect string - }{ - { - input: timestamppb.New(time.Date(2022, 1, 2, 3, 4, 5, 6, time.UTC)), - expect: "2022-01-02T03:04:05.000000006Z", - }, - { - input: timestamppb.New(time.Date(2022, 13, 1, 13, 61, 61, 100, time.UTC)), - expect: "2023-01-01T14:02:01.000000100Z", - }, - } - for _, v := range tests { - got, err := marshalTimestamp(v.input.ProtoReflect()) - if err != nil { - t.Fatal(err) - } - if want := v.expect; got != want { - t.Errorf("expect %v, got %v", want, got) - } - } -} - -func TestMarshalDuration(t *testing.T) { - tests := []struct { - input *durationpb.Duration - expect string - }{ - { - input: durationpb.New(time.Duration(1<<63 - 1)), - expect: "2562047h47m16.854775807s", - }, - { - input: durationpb.New(time.Duration(-1 << 63)), - expect: "-2562047h47m16.854775808s", - }, - { - input: durationpb.New(100 * time.Second), - expect: "1m40s", - }, - { - input: durationpb.New(-100 * time.Second), - expect: "-1m40s", - }, - } - for _, v := range tests { - got, err := marshalDuration(v.input.ProtoReflect()) - if err != nil { - t.Fatal(err) - } - if want := v.expect; got != want { - t.Errorf("expect %s, got %s", want, got) - } - } -} - -func TestMarshalBytes(t *testing.T) { - tests := []struct { - input protoreflect.Message - expect string - }{ - { - input: wrapperspb.Bytes([]byte("abc123!?$*&()'-=@~")).ProtoReflect(), - expect: base64.StdEncoding.EncodeToString([]byte("abc123!?$*&()'-=@~")), - }, - { - input: wrapperspb.Bytes([]byte("kratos")).ProtoReflect(), - expect: base64.StdEncoding.EncodeToString([]byte("kratos")), - }, - } - for _, v := range tests { - got, err := marshalBytes(v.input) - if err != nil { - t.Fatal(err) - } - if want := v.expect; got != want { - t.Errorf("expect %v, got %v", want, got) - } - } -} diff --git a/encoding/json/json_test.go b/encoding/json/json_test.go deleted file mode 100644 index b43e4ef..0000000 --- a/encoding/json/json_test.go +++ /dev/null @@ -1,147 +0,0 @@ -package json - -import ( - "encoding/json" - "reflect" - "strings" - "testing" - - testData "github.com/go-kratos/kratos/v2/internal/testdata/encoding" -) - -type testEmbed struct { - Level1a int `json:"a"` - Level1b int `json:"b"` - Level1c int `json:"c"` -} - -type testMessage struct { - Field1 string `json:"a"` - Field2 string `json:"b"` - Field3 string `json:"c"` - Embed *testEmbed `json:"embed,omitempty"` -} - -type mock struct { - value int -} - -const ( - Unknown = iota - Gopher - Zebra -) - -func (a *mock) UnmarshalJSON(b []byte) error { - var s string - if err := json.Unmarshal(b, &s); err != nil { - return err - } - switch strings.ToLower(s) { - default: - a.value = Unknown - case "gopher": - a.value = Gopher - case "zebra": - a.value = Zebra - } - - return nil -} - -func (a *mock) MarshalJSON() ([]byte, error) { - var s string - switch a.value { - default: - s = "unknown" - case Gopher: - s = "gopher" - case Zebra: - s = "zebra" - } - - return json.Marshal(s) -} - -func TestJSON_Marshal(t *testing.T) { - tests := []struct { - input interface{} - expect string - }{ - { - input: &testMessage{}, - expect: `{"a":"","b":"","c":""}`, - }, - { - input: &testMessage{Field1: "a", Field2: "b", Field3: "c"}, - expect: `{"a":"a","b":"b","c":"c"}`, - }, - { - input: &testData.TestModel{Id: 1, Name: "go-kratos", Hobby: []string{"1", "2"}}, - expect: `{"id":"1","name":"go-kratos","hobby":["1","2"],"attrs":{}}`, - }, - { - input: &mock{value: Gopher}, - expect: `"gopher"`, - }, - } - for _, v := range tests { - data, err := (codec{}).Marshal(v.input) - if err != nil { - t.Errorf("marshal(%#v): %s", v.input, err) - } - if got, want := string(data), v.expect; strings.ReplaceAll(got, " ", "") != want { - if strings.Contains(want, "\n") { - t.Errorf("marshal(%#v):\nHAVE:\n%s\nWANT:\n%s", v.input, got, want) - } else { - t.Errorf("marshal(%#v):\nhave %#q\nwant %#q", v.input, got, want) - } - } - } -} - -func TestJSON_Unmarshal(t *testing.T) { - p := testMessage{} - p2 := testData.TestModel{} - p3 := &testData.TestModel{} - p4 := &mock{} - tests := []struct { - input string - expect interface{} - }{ - { - input: `{"a":"","b":"","c":""}`, - expect: &testMessage{}, - }, - { - input: `{"a":"a","b":"b","c":"c"}`, - expect: &p, - }, - { - input: `{"id":"1","name":"go-kratos","hobby":["1","2"],"attrs":{}}`, - expect: &p2, - }, - { - input: `{"id":1,"name":"go-kratos","hobby":["1","2"]}`, - expect: &p3, - }, - { - input: `"zebra"`, - expect: p4, - }, - } - for _, v := range tests { - want := []byte(v.input) - err := (codec{}).Unmarshal(want, v.expect) - if err != nil { - t.Errorf("marshal(%#v): %s", v.input, err) - } - got, err := codec{}.Marshal(v.expect) - if err != nil { - t.Errorf("marshal(%#v): %s", v.input, err) - } - if !reflect.DeepEqual(strings.ReplaceAll(string(got), " ", ""), strings.ReplaceAll(string(want), " ", "")) { - t.Errorf("marshal(%#v):\nhave %#q\nwant %#q", v.input, got, want) - } - } -} diff --git a/encoding/proto/proto.go b/encoding/proto/proto.go index 0da5e0d..cd7d07a 100644 --- a/encoding/proto/proto.go +++ b/encoding/proto/proto.go @@ -3,9 +3,8 @@ package proto import ( + "git.diulo.com/mogfee/kit/encoding" "google.golang.org/protobuf/proto" - - "github.com/go-kratos/kratos/v2/encoding" ) // Name is the name registered for the proto compressor. diff --git a/encoding/proto/proto_test.go b/encoding/proto/proto_test.go deleted file mode 100644 index 1d33b33..0000000 --- a/encoding/proto/proto_test.go +++ /dev/null @@ -1,46 +0,0 @@ -package proto - -import ( - "reflect" - "testing" - - testData "github.com/go-kratos/kratos/v2/internal/testdata/encoding" -) - -func TestName(t *testing.T) { - c := new(codec) - if !reflect.DeepEqual(c.Name(), "proto") { - t.Errorf("no expect float_key value: %v, but got: %v", c.Name(), "proto") - } -} - -func TestCodec(t *testing.T) { - c := new(codec) - - model := testData.TestModel{ - Id: 1, - Name: "kratos", - Hobby: []string{"study", "eat", "play"}, - } - - m, err := c.Marshal(&model) - if err != nil { - t.Errorf("Marshal() should be nil, but got %s", err) - } - - var res testData.TestModel - - err = c.Unmarshal(m, &res) - if err != nil { - t.Errorf("Unmarshal() should be nil, but got %s", err) - } - if !reflect.DeepEqual(res.Id, model.Id) { - t.Errorf("ID should be %d, but got %d", res.Id, model.Id) - } - if !reflect.DeepEqual(res.Name, model.Name) { - t.Errorf("Name should be %s, but got %s", res.Name, model.Name) - } - if !reflect.DeepEqual(res.Hobby, model.Hobby) { - t.Errorf("Hobby should be %s, but got %s", res.Hobby, model.Hobby) - } -} diff --git a/encoding/xml/xml.go b/encoding/xml/xml.go index 3352fdf..c0419bc 100644 --- a/encoding/xml/xml.go +++ b/encoding/xml/xml.go @@ -2,8 +2,7 @@ package xml import ( "encoding/xml" - - "github.com/go-kratos/kratos/v2/encoding" + "git.diulo.com/mogfee/kit/encoding" ) // Name is the name registered for the xml codec. diff --git a/encoding/xml/xml_test.go b/encoding/xml/xml_test.go deleted file mode 100644 index 09e7d03..0000000 --- a/encoding/xml/xml_test.go +++ /dev/null @@ -1,117 +0,0 @@ -package xml - -import ( - "reflect" - "strings" - "testing" -) - -type Plain struct { - V interface{} -} - -type NestedOrder struct { - XMLName struct{} `xml:"result"` - Field1 string `xml:"parent>c"` - Field2 string `xml:"parent>b"` - Field3 string `xml:"parent>a"` -} - -func TestCodec_Marshal(t *testing.T) { - tests := []struct { - Value interface{} - ExpectXML string - }{ - // Test value types - {Value: &Plain{true}, ExpectXML: `true`}, - {Value: &Plain{false}, ExpectXML: `false`}, - {Value: &Plain{42}, ExpectXML: `42`}, - { - Value: &NestedOrder{Field1: "C", Field2: "B", Field3: "A"}, - ExpectXML: `` + - `` + - `C` + - `B` + - `A` + - `` + - ``, - }, - } - for _, tt := range tests { - data, err := (codec{}).Marshal(tt.Value) - if err != nil { - t.Errorf("marshal(%#v): %s", tt.Value, err) - } - if got, want := string(data), tt.ExpectXML; got != want { - if strings.Contains(want, "\n") { - t.Errorf("marshal(%#v):\nHAVE:\n%s\nWANT:\n%s", tt.Value, got, want) - } else { - t.Errorf("marshal(%#v):\nhave %#q\nwant %#q", tt.Value, got, want) - } - } - } -} - -func TestCodec_Unmarshal(t *testing.T) { - tests := []struct { - want interface{} - InputXML string - }{ - { - want: &NestedOrder{Field1: "C", Field2: "B", Field3: "A"}, - InputXML: `` + - `` + - `C` + - `B` + - `A` + - `` + - ``, - }, - } - - for _, tt := range tests { - vt := reflect.TypeOf(tt.want) - dest := reflect.New(vt.Elem()).Interface() - data := []byte(tt.InputXML) - err := (codec{}).Unmarshal(data, dest) - if err != nil { - t.Errorf("unmarshal(%#v, %#v): %s", tt.InputXML, dest, err) - } - if got, want := dest, tt.want; !reflect.DeepEqual(got, want) { - t.Errorf("unmarshal(%q):\nhave %#v\nwant %#v", tt.InputXML, got, want) - } - } -} - -func TestCodec_NilUnmarshal(t *testing.T) { - tests := []struct { - want interface{} - InputXML string - }{ - { - want: &NestedOrder{Field1: "C", Field2: "B", Field3: "A"}, - InputXML: `` + - `` + - `C` + - `B` + - `A` + - `` + - ``, - }, - } - - for _, tt := range tests { - s := struct { - A string `xml:"a"` - B *NestedOrder - }{A: "a"} - data := []byte(tt.InputXML) - err := (codec{}).Unmarshal(data, &s.B) - if err != nil { - t.Errorf("unmarshal(%#v, %#v): %s", tt.InputXML, s.B, err) - } - if got, want := s.B, tt.want; !reflect.DeepEqual(got, want) { - t.Errorf("unmarshal(%q):\nhave %#v\nwant %#v", tt.InputXML, got, want) - } - } -} diff --git a/encoding/yaml/yaml.go b/encoding/yaml/yaml.go index 1364b24..d2d3710 100644 --- a/encoding/yaml/yaml.go +++ b/encoding/yaml/yaml.go @@ -1,9 +1,8 @@ package yaml import ( + "git.diulo.com/mogfee/kit/encoding" "gopkg.in/yaml.v3" - - "github.com/go-kratos/kratos/v2/encoding" ) // Name is the name registered for the yaml codec. diff --git a/encoding/yaml/yaml_test.go b/encoding/yaml/yaml_test.go deleted file mode 100644 index 5cb7464..0000000 --- a/encoding/yaml/yaml_test.go +++ /dev/null @@ -1,104 +0,0 @@ -package yaml - -import ( - "math" - "reflect" - "testing" -) - -func TestCodec_Unmarshal(t *testing.T) { - tests := []struct { - data string - value interface{} - }{ - { - "", - (*struct{})(nil), - }, - { - "{}", &struct{}{}, - }, - { - "v: hi", - map[string]string{"v": "hi"}, - }, - { - "v: hi", map[string]interface{}{"v": "hi"}, - }, - { - "v: true", - map[string]string{"v": "true"}, - }, - { - "v: true", - map[string]interface{}{"v": true}, - }, - { - "v: 10", - map[string]interface{}{"v": 10}, - }, - { - "v: 0b10", - map[string]interface{}{"v": 2}, - }, - { - "v: 0xA", - map[string]interface{}{"v": 10}, - }, - { - "v: 4294967296", - map[string]int64{"v": 4294967296}, - }, - { - "v: 0.1", - map[string]interface{}{"v": 0.1}, - }, - { - "v: .1", - map[string]interface{}{"v": 0.1}, - }, - { - "v: .Inf", - map[string]interface{}{"v": math.Inf(+1)}, - }, - { - "v: -.Inf", - map[string]interface{}{"v": math.Inf(-1)}, - }, - { - "v: -10", - map[string]interface{}{"v": -10}, - }, - { - "v: -.1", - map[string]interface{}{"v": -0.1}, - }, - } - for _, tt := range tests { - v := reflect.ValueOf(tt.value).Type() - value := reflect.New(v) - err := (codec{}).Unmarshal([]byte(tt.data), value.Interface()) - if err != nil { - t.Fatalf("(codec{}).Unmarshal should not return err") - } - } - spec := struct { - A string - B map[string]interface{} - }{A: "a"} - err := (codec{}).Unmarshal([]byte("v: hi"), &spec.B) - if err != nil { - t.Fatalf("(codec{}).Unmarshal should not return err") - } -} - -func TestCodec_Marshal(t *testing.T) { - value := map[string]string{"v": "hi"} - got, err := (codec{}).Marshal(value) - if err != nil { - t.Fatalf("should not return err") - } - if string(got) != "v: hi\n" { - t.Fatalf("want \"v: hi\n\" return \"%s\"", string(got)) - } -}