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 2019/12/14 10:26:51 UTC
[dubbo-go-hessian2] branch master updated: Ftr: add BigInteger
support (#141)
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 d24d44e Ftr: add BigInteger support (#141)
d24d44e is described below
commit d24d44ed7246be32f055c3ba9b58938d04b60a38
Author: huiren <zh...@gmail.com>
AuthorDate: Sat Dec 14 18:26:44 2019 +0800
Ftr: add BigInteger support (#141)
add biginteger support
---
date_test.go | 2 +-
go.mod | 4 +-
go.sum | 12 ++-
serialize.go | 31 ++++++
serialize_test.go | 107 ++++++++++++++++++++-
.../src/main/java/test/TestCustomDecode.java | 24 ++++-
.../src/main/java/test/TestCustomReply.java | 55 ++++++++++-
7 files changed, 218 insertions(+), 17 deletions(-)
diff --git a/date_test.go b/date_test.go
index 0bb6640..c55df10 100644
--- a/date_test.go
+++ b/date_test.go
@@ -142,7 +142,7 @@ func TestDateNulJavaDecode(t *testing.T) {
Name: "zs",
Date: ZeroDate,
}
- testJavaDecode(t, "customArgTypedFixedList_DateNull", date)
+ testJavaDecode(t, "customArgTypedFixed_DateNull", date)
}
func TestDateNilDecode(t *testing.T) {
diff --git a/go.mod b/go.mod
index 5a38e9e..a5576d6 100644
--- a/go.mod
+++ b/go.mod
@@ -1,7 +1,7 @@
module github.com/apache/dubbo-go-hessian2
require (
- github.com/dubbogo/gost v1.1.1
+ github.com/dubbogo/gost v1.4.0
github.com/pkg/errors v0.8.1
- github.com/stretchr/testify v1.3.0
+ github.com/stretchr/testify v1.4.0
)
diff --git a/go.sum b/go.sum
index 526c431..2686d90 100644
--- a/go.sum
+++ b/go.sum
@@ -1,11 +1,15 @@
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/dubbogo/gost v1.1.1 h1:JCM7vx5edPIjDA5ovJTuzEEXuw2t7xLyrlgi2mi5jHI=
-github.com/dubbogo/gost v1.1.1/go.mod h1:R7wZm1DrmrKGr50mBZVcg6C9ekG8aL5hP+sgWcIDwQg=
+github.com/dubbogo/gost v1.4.0 h1:7YoSpTVvceK9OcZKeUB5stW1IfTPkZOVdJmsqWTu1D0=
+github.com/dubbogo/gost v1.4.0/go.mod h1:pPTjVyoJan3aPxBPNUX0ADkXjPibLo+/Ib0/fADXSG8=
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
-github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
-github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
+github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
+gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
diff --git a/serialize.go b/serialize.go
index 08cc45e..bb5860f 100644
--- a/serialize.go
+++ b/serialize.go
@@ -25,7 +25,12 @@ import (
big "github.com/dubbogo/gost/math/big"
)
+type bigInteger = big.Integer
+
func init() {
+ RegisterPOJO(&bigInteger{})
+ SetSerializer("java.math.BigInteger", IntegerSerializer{})
+
RegisterPOJO(&big.Decimal{})
SetSerializer("java.math.BigDecimal", DecimalSerializer{})
}
@@ -46,6 +51,32 @@ func GetSerializer(key string) (Serializer, bool) {
return codec, ok
}
+type IntegerSerializer struct{}
+
+func (IntegerSerializer) DecObject(d *Decoder, typ reflect.Type, cls classInfo) (interface{}, error) {
+ bigInt, err := d.decInstance(typ, cls)
+ if err != nil {
+ return nil, err
+ }
+
+ result, ok := bigInt.(*bigInteger)
+ if !ok {
+ panic("result type is not Integer, please check the whether the conversion is ok")
+ }
+
+ result.FromSignAndMag(result.Signum, result.Mag)
+ return result, nil
+}
+
+func (IntegerSerializer) EncObject(e *Encoder, v POJO) error {
+ bigInt, ok := v.(bigInteger)
+ if !ok {
+ return e.encObject(v)
+ }
+ bigInt.Signum, bigInt.Mag = bigInt.GetSignAndMag()
+ return e.encObject(bigInt)
+}
+
type DecimalSerializer struct{}
func (DecimalSerializer) EncObject(e *Encoder, v POJO) error {
diff --git a/serialize_test.go b/serialize_test.go
index 1dff269..f521a18 100644
--- a/serialize_test.go
+++ b/serialize_test.go
@@ -18,6 +18,7 @@
package hessian
import (
+ "fmt"
"reflect"
"testing"
)
@@ -53,20 +54,92 @@ func TestDecimalGoDecode(t *testing.T) {
var d big.Decimal
_ = d.FromString("100.256")
d.Value = d.String()
- doTestDecimal(t, "customReplyTypedFixedDecimal", "100.256")
+ doTestStringer(t, "customReplyTypedFixedDecimal", "100.256")
}
func TestDecimalJavaDecode(t *testing.T) {
var d big.Decimal
_ = d.FromString("100.256")
d.Value = d.String()
- testJavaDecode(t, "customArgTypedFixedList_Decimal", d)
+ testJavaDecode(t, "customArgTypedFixed_Decimal", d)
}
-func doTestDecimal(t *testing.T, method, content string) {
+func TestEncodeDecodeInteger(t *testing.T) {
+ var bigInt bigInteger
+ //bigInt := new(bigInteger)
+ _ = bigInt.FromString("100256")
+ e := NewEncoder()
+ err := e.Encode(bigInt)
+ if err != nil {
+ t.Error(err)
+ t.FailNow()
+ }
+
+ d := NewDecoder(e.buffer)
+ bigIntObj, err := d.Decode()
+ if err != nil {
+ t.Error(err)
+ t.FailNow()
+ }
+
+ if !reflect.DeepEqual(bigInt.String(), bigIntObj.(*bigInteger).String()) {
+ t.Errorf("expect: %v, but get: %v", bigInt, bigIntObj)
+ }
+}
+
+func TestIntegerGoDecode(t *testing.T) {
+ doTestStringer(t, "customReplyTypedFixedIntegerZero", "0")
+ doTestStringer(t, "customReplyTypedFixedInteger", "4294967298")
+ doTestStringer(t, "customReplyTypedFixedIntegerSigned", "-4294967298")
+}
+
+func TestIntegerJavaDecode(t *testing.T) {
+ var i bigInteger
+ _ = i.FromString("4294967298")
+ testJavaDecode(t, "customArgTypedFixed_Integer", i)
+
+ _ = i.FromString("0")
+ testJavaDecode(t, "customArgTypedFixed_IntegerZero", i)
+
+ _ = i.FromString("-4294967298")
+ testJavaDecode(t, "customArgTypedFixed_IntegerSigned", i)
+}
+
+func TestIntegerListGoDecode(t *testing.T) {
+ data := []string{
+ "1234",
+ "12347890",
+ "123478901234",
+ "1234789012345678",
+ "123478901234567890",
+ "1234789012345678901234",
+ "12347890123456789012345678",
+ "123478901234567890123456781234",
+ "1234789012345678901234567812345678",
+ "12347890123456789012345678123456781234",
+ "-12347890123456789012345678123456781234",
+ "0",
+ }
+
+ out, err := decodeJavaResponse(`customReplyTypedFixedList_BigInteger`, ``, false)
+ if err != nil {
+ t.Errorf("%#v %v", out, err)
+ return
+ }
+
+ resp := out.([]*big.Integer)
+ for i := range data {
+ gotInteger := resp[i]
+ if gotInteger.String() != data[i] {
+ t.Errorf("java: %s go: %s", gotInteger.String(), data[i])
+ }
+ }
+}
+
+func doTestStringer(t *testing.T, method, content string) {
testDecodeFrameworkFunc(t, method, func(r interface{}) {
t.Logf("%#v", r)
- assert.Equal(t, content, r.(*big.Decimal).String())
+ assert.Equal(t, content, r.(fmt.Stringer).String())
})
}
@@ -91,3 +164,29 @@ func TestDecimalListGoDecode(t *testing.T) {
}
}
}
+
+func TestObjectListGoDecode(t *testing.T) {
+ data := []string{
+ "1234",
+ "-12347890",
+ "0",
+ "123.4",
+ "-123.45",
+ "0",
+ }
+
+ out, err := decodeJavaResponse(`customReplyTypedFixedList_CustomObject`, ``, false)
+ if err != nil {
+ t.Error(err)
+ return
+ }
+
+ resp := out.([]Object)
+ for i := range data {
+ elem := resp[i]
+ if elem.(fmt.Stringer).String() != data[i] {
+ t.Logf("%T %#v", elem, elem)
+ t.Errorf("java: %s go: %s", elem.(fmt.Stringer).String(), data[i])
+ }
+ }
+}
diff --git a/test_hessian/src/main/java/test/TestCustomDecode.java b/test_hessian/src/main/java/test/TestCustomDecode.java
index e9a928f..9e72a0a 100644
--- a/test_hessian/src/main/java/test/TestCustomDecode.java
+++ b/test_hessian/src/main/java/test/TestCustomDecode.java
@@ -20,14 +20,15 @@ package test;
import com.caucho.hessian.io.Hessian2Input;
import com.caucho.hessian.test.A0;
import com.caucho.hessian.test.A1;
-import test.model.DateDemo;
-
import java.io.InputStream;
import java.math.BigDecimal;
+import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
+import test.model.DateDemo;
+
public class TestCustomDecode {
@@ -166,12 +167,27 @@ public class TestCustomDecode {
return Arrays.deepEquals(list, (Object[]) o);
}
- public Object customArgTypedFixedList_Decimal() throws Exception {
+ public Object customArgTypedFixed_Integer() throws Exception {
+ BigInteger o = (BigInteger) input.readObject();
+ return o.toString().equals("4294967298");
+ }
+
+ public Object customArgTypedFixed_IntegerZero() throws Exception {
+ BigInteger o = (BigInteger) input.readObject();
+ return o.toString().equals("0");
+ }
+
+ public Object customArgTypedFixed_IntegerSigned() throws Exception {
+ BigInteger o = (BigInteger) input.readObject();
+ return o.toString().equals("-4294967298");
+ }
+
+ public Object customArgTypedFixed_Decimal() throws Exception {
BigDecimal o = (BigDecimal) input.readObject();
return o.toString().equals("100.256");
}
- public Object customArgTypedFixedList_DateNull() throws Exception {
+ public Object customArgTypedFixed_DateNull() throws Exception {
DateDemo o = (DateDemo) input.readObject();
return o.getDate() == null && o.getDate1() == null;
}
diff --git a/test_hessian/src/main/java/test/TestCustomReply.java b/test_hessian/src/main/java/test/TestCustomReply.java
index 1f32a7e..a260f02 100644
--- a/test_hessian/src/main/java/test/TestCustomReply.java
+++ b/test_hessian/src/main/java/test/TestCustomReply.java
@@ -20,13 +20,14 @@ package test;
import com.alibaba.com.caucho.hessian.io.Hessian2Output;
import com.caucho.hessian.test.A0;
import com.caucho.hessian.test.A1;
-import test.model.DateDemo;
-
import java.io.OutputStream;
import java.io.Serializable;
import java.math.BigDecimal;
+import java.math.BigInteger;
import java.util.Date;
import java.util.HashMap;
+import test.model.DateDemo;
+
public class TestCustomReply {
@@ -344,6 +345,56 @@ public class TestCustomReply {
output.flush();
}
+ public void customReplyTypedFixedInteger() throws Exception {
+ BigInteger integer = new BigInteger("4294967298");
+ output.writeObject(integer);
+ output.flush();
+ }
+
+ public void customReplyTypedFixedList_BigInteger() throws Exception {
+ BigInteger[] integers = new BigInteger[] {
+ new BigInteger("1234"),
+ new BigInteger("12347890"),
+ new BigInteger("123478901234"),
+ new BigInteger("1234789012345678"),
+ new BigInteger("123478901234567890"),
+ new BigInteger("1234789012345678901234"),
+ new BigInteger("12347890123456789012345678"),
+ new BigInteger("123478901234567890123456781234"),
+ new BigInteger("1234789012345678901234567812345678"),
+ new BigInteger("12347890123456789012345678123456781234"),
+ new BigInteger("-12347890123456789012345678123456781234"),
+ new BigInteger("0"),
+ };
+ output.writeObject(integers);
+ output.flush();
+ }
+
+ public void customReplyTypedFixedList_CustomObject() throws Exception {
+ Object[] objects = new Object[] {
+ new BigInteger("1234"),
+ new BigInteger("-12347890"),
+ new BigInteger("0"),
+ new BigDecimal("123.4"),
+ new BigDecimal("-123.45"),
+ new BigDecimal("0"),
+ };
+ output.writeObject(objects);
+ output.flush();
+ }
+
+ public void customReplyTypedFixedIntegerZero() throws Exception {
+ BigInteger integer = new BigInteger("0");
+ output.writeObject(integer);
+ output.flush();
+ }
+
+ public void customReplyTypedFixedIntegerSigned() throws Exception {
+ BigInteger integer = new BigInteger("-4294967298");
+ output.writeObject(integer);
+ output.flush();
+ }
+
public void customReplyTypedFixedDecimal() throws Exception {
BigDecimal decimal = new BigDecimal("100.256");
output.writeObject(decimal);