You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by wo...@apache.org on 2022/10/31 09:01:27 UTC

[dubbo-go-hessian2] branch master updated: Fix decode enum not correctly (#332)

This is an automated email from the ASF dual-hosted git repository.

wongoo pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/dubbo-go-hessian2.git


The following commit(s) were added to refs/heads/master by this push:
     new d520464  Fix decode enum not correctly (#332)
d520464 is described below

commit d520464544d64e8dc00278d38786d0264c6cf8c6
Author: 望哥 <wo...@apache.org>
AuthorDate: Mon Oct 31 17:01:23 2022 +0800

    Fix decode enum not correctly (#332)
    
    * fix enum decode
    
    * fix duplicate name struct unit test
    
    * add unit tests in sub directories
    
    * add unit test for type convert
    
    * format code
    
    * format import
---
 .github/workflows/github-actions.yml |  2 +-
 hessian_test/dup_struct_name_test.go | 14 ------
 object.go                            | 15 ++++---
 testcases/user/user.go               | 87 ++++++++++++++++++++++++++++++++++++
 testcases/user/user_test.go          | 57 +++++++++++++++++++++++
 5 files changed, 154 insertions(+), 21 deletions(-)

diff --git a/.github/workflows/github-actions.yml b/.github/workflows/github-actions.yml
index 459f4f8..132f03e 100644
--- a/.github/workflows/github-actions.yml
+++ b/.github/workflows/github-actions.yml
@@ -80,7 +80,7 @@ jobs:
       run: golangci-lint run --timeout=10m -v
 
     - name: Go Test
-      run: GO111MODULE=on && go mod vendor && go test -race -v && go test -bench . -race -coverprofile=coverage.txt
+      run: GO111MODULE=on && go mod vendor && go test ./... -race -v && go test -bench . -race -coverprofile=coverage.txt
 
     - name: Coverage
       run: bash <(curl -s https://codecov.io/bash)
diff --git a/hessian_test/dup_struct_name_test.go b/hessian_test/dup_struct_name_test.go
index 14a0666..0c4954f 100644
--- a/hessian_test/dup_struct_name_test.go
+++ b/hessian_test/dup_struct_name_test.go
@@ -106,13 +106,6 @@ func TestDupStructNameResponse(t *testing.T) {
 	assert.Nil(t, err)
 
 	decodedResponse := &hessian.Response{}
-	decodedResponse.RspObj = &dupclass.CaseZ{}
-	err = codecR.ReadBody(decodedResponse)
-	assert.NotNil(t, err)
-	assert.Equal(t, ExpectedErrorMsg, err.Error())
-
-	decodedResponse = &hessian.Response{}
-	decodedResponse.RspObj = &CaseZ{}
 	err = codecR.ReadBody(decodedResponse)
 	assert.Nil(t, err)
 
@@ -134,13 +127,6 @@ func TestDupStructNameResponse2(t *testing.T) {
 	assert.Nil(t, err)
 
 	decodedResponse := &hessian.Response{}
-	decodedResponse.RspObj = &CaseZ{}
-	err = codecR.ReadBody(decodedResponse)
-	assert.NotNil(t, err)
-	assert.Equal(t, ExpectedErrorMsg, err.Error())
-
-	decodedResponse = &hessian.Response{}
-	decodedResponse.RspObj = &dupclass.CaseZ{}
 	err = codecR.ReadBody(decodedResponse)
 	assert.Nil(t, err)
 
diff --git a/object.go b/object.go
index 3d16043..f5898cf 100644
--- a/object.go
+++ b/object.go
@@ -508,17 +508,20 @@ func (d *Decoder) decInstance(typ reflect.Type, cls *ClassInfo) (interface{}, er
 			if err != nil {
 				// java enum
 				if fldRawValue.Type().Implements(javaEnumType) {
-					d.unreadByte() // Enum parsing, decInt64 above has read a byte, so you need to return a byte here
-					s, decErr := d.DecodeValue()
+					_ = d.unreadByte() // Enum parsing, decInt64 above has read a byte, so you need to return a byte here
+					enumVal, decErr := d.DecodeValue()
 					if decErr != nil {
 						return nil, perrors.Wrapf(decErr, "decInstance->decObject field name:%s", fieldName)
 					}
-					enumValue, _ := s.(JavaEnum)
-					num = int32(enumValue)
-				} else {
-					return nil, perrors.Wrapf(err, "decInstance->decInt32, field name:%s", fieldName)
+
+					SetValue(fldRawValue, reflect.ValueOf(enumVal))
+
+					continue
 				}
+
+				return nil, perrors.Wrapf(err, "decInstance->decInt32, field name:%s", fieldName)
 			}
+
 			fldRawValue.SetInt(int64(num))
 		case reflect.Uint16, reflect.Uint8:
 			num, err := d.decInt32(TAG_READ)
diff --git a/testcases/user/user.go b/testcases/user/user.go
new file mode 100644
index 0000000..888951b
--- /dev/null
+++ b/testcases/user/user.go
@@ -0,0 +1,87 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package user
+
+import (
+	"fmt"
+	"strconv"
+	"time"
+)
+
+import (
+	hessian "github.com/apache/dubbo-go-hessian2"
+)
+
+type Gender hessian.JavaEnum
+
+const (
+	MAN Gender = iota
+	WOMAN
+)
+
+var genderName = map[Gender]string{
+	MAN:   "MAN",
+	WOMAN: "WOMAN",
+}
+
+var genderValue = map[string]Gender{
+	"MAN":   MAN,
+	"WOMAN": WOMAN,
+}
+
+func (g Gender) JavaClassName() string {
+	return "org.apache.dubbo.sample.Gender"
+}
+
+func (g Gender) String() string {
+	s, ok := genderName[g]
+	if ok {
+		return s
+	}
+
+	return strconv.Itoa(int(g))
+}
+
+func (g Gender) EnumValue(s string) hessian.JavaEnum {
+	v, ok := genderValue[s]
+	if ok {
+		return hessian.JavaEnum(v)
+	}
+
+	return hessian.InvalidJavaEnum
+}
+
+type User struct {
+	// !!! Cannot define lowercase names of variable
+	ID   string
+	Name string
+	Age  int32
+	Time time.Time
+	Sex  Gender // notice: java enum Object <--> go string
+}
+
+func (u User) String() string {
+	return fmt.Sprintf(
+		"User{ID:%s, Name:%s, Age:%d, Time:%s, Sex:%s}",
+		u.ID, u.Name, u.Age, u.Time, u.Sex,
+	)
+}
+
+func (u *User) JavaClassName() string {
+	return "org.apache.dubbo.sample.User"
+}
diff --git a/testcases/user/user_test.go b/testcases/user/user_test.go
new file mode 100644
index 0000000..3c7cf9d
--- /dev/null
+++ b/testcases/user/user_test.go
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package user
+
+import (
+	"testing"
+	"time"
+)
+
+import (
+	hessian "github.com/apache/dubbo-go-hessian2"
+)
+
+import (
+	"github.com/stretchr/testify/assert"
+)
+
+func TestEnumConvert(t *testing.T) {
+	var g interface{}
+	g = WOMAN
+
+	// new defined type cant be converted to the original type.
+	failConvertedValue, ok := g.(hessian.JavaEnum)
+	assert.False(t, ok)
+	assert.Equal(t, hessian.JavaEnum(0), failConvertedValue)
+}
+
+func TestUserEncodeDecode(t *testing.T) {
+	ts, _ := time.Parse("2006-01-02 15:04:05", "2019-01-01 12:34:56")
+	u1 := &User{ID: "001", Name: "Lily", Age: 18, Time: ts.Local(), Sex: WOMAN}
+	hessian.RegisterPOJO(u1)
+
+	encoder := hessian.NewEncoder()
+	err := encoder.Encode(u1)
+	assert.Nil(t, err)
+
+	buf := encoder.Buffer()
+	decoder := hessian.NewDecoder(buf)
+	dec, err := decoder.Decode()
+	assert.Nil(t, err)
+	assert.Equal(t, u1, dec)
+}