Jelajahi Sumber

fix: fix protobuf decode bug (#2209)

Signed-off-by: Rui-Gan <1171530954@qq.com>
Regina 1 tahun lalu
induk
melakukan
1ff1df6905

+ 42 - 0
internal/converter/protobuf/converter_test.go

@@ -218,3 +218,45 @@ func TestStatic(t *testing.T) {
 		}
 	}
 }
+
+func TestDecodeProto3(t *testing.T) {
+	c, err := NewConverter("../../schema/test/test4.proto", "", "Classroom")
+	if err != nil {
+		t.Fatal(err)
+	}
+	tests := []struct {
+		m map[string]interface{}
+		r []byte
+	}{
+		{
+			m: map[string]interface{}{
+				"name":   "test",
+				"number": int64(1),
+				"stu":    []interface{}{},
+			},
+			r: []byte{0x0a, 0x04, 0x74, 0x65, 0x73, 0x74, 0x10, 0x01},
+		},
+		{
+			m: map[string]interface{}{
+				"name":   "test",
+				"number": int64(1),
+				"stu": []map[string]interface{}{
+					{
+						"age":  int64(12),
+						"name": "test",
+						"info": nil,
+					},
+				},
+			},
+			r: []byte{0x0a, 0x04, 0x74, 0x65, 0x73, 0x74, 0x10, 0x01, 0x1a, 0x08, 0x08, 0x0c, 0x12, 0x04, 0x74, 0x65, 0x73, 0x74},
+		},
+	}
+
+	for i, tt := range tests {
+		t.Run(fmt.Sprintf("test %d", i), func(t *testing.T) {
+			a, err := c.Decode(tt.r)
+			assert.NoError(t, err)
+			assert.Equal(t, tt.m, a)
+		})
+	}
+}

+ 2 - 0
internal/converter/protobuf/fieldConverterSingleton.go

@@ -336,6 +336,8 @@ func (fc *FieldConverter) DecodeMessage(message *dynamic.Message, outputType *de
 		return message.GetFieldByNumber(1)
 	} else if WrapperVoid == outputType.GetFullyQualifiedName() {
 		return nil
+	} else if message == nil {
+		return nil
 	}
 	result := make(map[string]interface{})
 	for _, field := range outputType.GetFields() {

+ 16 - 0
internal/schema/test/test4.proto

@@ -0,0 +1,16 @@
+syntax = "proto3";
+
+message Classroom{
+  message Stu {
+    int32 age = 1;
+    string name = 2;
+    Info info = 3;
+  }
+  message Info {
+    repeated int32 number = 1;
+    repeated string addr = 2;
+  }
+  string name = 1;
+  int32 number = 2;
+  repeated Stu stu = 3;
+}