Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 9 additions & 2 deletions proto/jtop/jtop.go
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ func (e *Encoder) transBool(token *Token, field *metadata.Field) {
return
}
wire, pv, ok := e.parseNumber(token, field)
if !ok {
if !ok || pv == 0 {
return
}
e.encodeKey(field.Tag, wire)
Expand All @@ -134,14 +134,17 @@ func (e *Encoder) transNull(token *Token, field *metadata.Field) {

func (e *Encoder) transNumber(token *Token, field *metadata.Field) {
wire, pv, ok := e.parseNumber(token, field)
if !ok {
if !ok || pv == 0 {
return
}
e.encodeKey(field.Tag, wire)
e.encodeWire(wire, pv)
}

func (e *Encoder) transString(token *Token, field *metadata.Field) {
if len(token.Value) == 2 {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

transString 不能只通过判断空字符串跳过,在 {"a": ["", "", ""]} 情况下,假设 a 的 tag 为 1,应该返回 [10, 0, 10, 0, 10, 0]

return
}
var pv []byte
switch field.Kind {
case metadata.StringKind:
Expand Down Expand Up @@ -292,6 +295,10 @@ func (e *Encoder) packNumeric(_ *Token, field *metadata.Field) {
}
packEnc.encodeWire(wire, pv)
}
if len(packEnc.buf.Bytes()) == 0 {
putEncoder(packEnc)
return
}
e.encodeBytes(field.Tag, packEnc.buf.Bytes())
putEncoder(packEnc)
}
Expand Down
138 changes: 137 additions & 1 deletion proto/jtop/jtop_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"github.com/golang/protobuf/proto"
"github.com/zhiduoke/gapi/metadata"
"github.com/zhiduoke/gapi/proto/jtop/testdata"
"github.com/zhiduoke/gapi/proto/jtop/testdata/noomitzero"
"google.golang.org/protobuf/reflect/protoreflect"
"reflect"
"testing"
Expand Down Expand Up @@ -71,7 +72,74 @@ func TestEncode(t *testing.T) {
t.Errorf("proto marshal error: %s\n", err)
return
}
if !reflect.DeepEqual(r, r1) {
if !reflect.DeepEqual(r, r1) && !(len(r) == 0 && len(r1) == 0) {
diffbytes(t, r, r1)
t.Errorf("protobuf not equal\n")
return
}
t.Logf("pass!\n")
}
}

func TestEncodeZeroValue(t *testing.T) {
type TestCase struct {
name string
in interface{}
msg *metadata.Message
}

cases := [...]TestCase{
{
name: "number",
in: &numberReqNoOmit,
msg: testdata.TestMessages[".jtop.test.NumberReq"],
},
{
name: "string",
in: &stringReqNoOmit,
msg: testdata.TestMessages[".jtop.test.StringReq"],
},
{
name: "bool",
in: &boolReqNoOmit,
msg: testdata.TestMessages[".jtop.test.BoolReq"],
},
{
name: "object",
in: &objectReqNoOmit,
msg: testdata.TestMessages[".jtop.test.ObjectReq"],
},
{
name: "array",
in: &arrayReqNoOmit,
msg: testdata.TestMessages[".jtop.test.ArrayReq"],
},
{
name: "map",
in: &mapReq1NoOmit,
msg: testdata.TestMessages[".jtop.test.MapReq"],
},
}
for _, c := range cases {
t.Logf("test %s\n", c.name)
jsonData, err := json.Marshal(c.in)
if err != nil {
t.Log(err)
return
}
//t.Logf("json: %s\n", jsonData)
r, err := Encode(c.msg, jsonData)
if err != nil {
t.Errorf("encode error: %s\n", err)
return
}
r1, err := proto.Marshal(proto.MessageV1(c.in.(protoreflecter).ProtoReflect()))
if err != nil {
t.Errorf("proto marshal error: %s\n", err)
return
}

if !reflect.DeepEqual(r, r1) && !(len(r) == 0 && len(r1) == 0) {
diffbytes(t, r, r1)
t.Errorf("protobuf not equal\n")
return
Expand Down Expand Up @@ -178,3 +246,71 @@ var mapReq1 = testdata.MapReq{
//Imo: map[int32]*testdata.ObjectReq{0: &objectReq, 1: &objectReq1},
Sma: map[string]*testdata.ArrayReq{"a": &arrayReq},
}

var numberReqNoOmit = noomitzero.NumberReq{
I32: 0,
I64: -64,
Ui32: 32,
Ui64: 64,
Si32: -32,
Si64: -64,
Float: 66.66,
Double: -66.66,
Fix32: 32,
Fix64: 64,
Sfix32: -32,
Sfix64: -64,
}

var boolReqNoOmit = noomitzero.BoolReq{
A: true,
B: false,
}

var stringReqNoOmit = noomitzero.StringReq{
Str: "",
Bae64: nil,
}

var objectReq1NoOmit = noomitzero.ObjectReq{
Num: &numberReqNoOmit,
Str: &stringReqNoOmit,
Bool: &boolReqNoOmit,
Obj: nil,
A: 200,
B: false,
}

var objectReqNoOmit = noomitzero.ObjectReq{
Num: &numberReqNoOmit,
Str: &stringReqNoOmit,
Bool: &boolReqNoOmit,
Obj: &objectReq1NoOmit,
A: 100,
B: true,
}

var arrayReqNoOmit = noomitzero.ArrayReq{
Nums: []int32{},
Strs: []string{},
Bools: []bool{},
Objs: []*noomitzero.ObjectReq{&objectReqNoOmit, &objectReq1NoOmit, &objectReq1NoOmit},
}

var mapReqNoOmit = noomitzero.MapReq{
Sms: map[string]string{"a": "1a", "b": "2b"},
Smi: map[string]int32{"1": 1, "2": 2},
//Bms: map[bool]string{true: "true", false: "false"},
Smo: map[string]*noomitzero.ObjectReq{"obj0": &objectReqNoOmit, "obj1": &objectReq1NoOmit},
//Imo: map[int32]*noomit.ObjectReq{0: &objectReq, 1: &objectReq1},
Sma: map[string]*noomitzero.ArrayReq{"a": &arrayReqNoOmit, "b": &arrayReqNoOmit},
}

var mapReq1NoOmit = noomitzero.MapReq{
Sms: map[string]string{"a": "1a"},
Smi: map[string]int32{"1": 1},
//Bms: map[bool]string{true: "true", false: "false"},
Smo: map[string]*noomitzero.ObjectReq{"obj0": &objectReqNoOmit},
//Imo: map[int32]*noomit.ObjectReq{0: &objectReq, 1: &objectReq1},
Sma: map[string]*noomitzero.ArrayReq{"a": &arrayReqNoOmit},
}
Loading