|
@@ -37,6 +37,7 @@ import (
|
|
|
"reflect"
|
|
"reflect"
|
|
|
"runtime"
|
|
"runtime"
|
|
|
"strconv"
|
|
"strconv"
|
|
|
|
|
+ "strings"
|
|
|
"sync/atomic"
|
|
"sync/atomic"
|
|
|
"testing"
|
|
"testing"
|
|
|
"time"
|
|
"time"
|
|
@@ -70,6 +71,8 @@ var (
|
|
|
testSkipIntf bool
|
|
testSkipIntf bool
|
|
|
testInternStr bool
|
|
testInternStr bool
|
|
|
testUseMust bool
|
|
testUseMust bool
|
|
|
|
|
+ testCheckCircRef bool
|
|
|
|
|
+ testJsonIndent int
|
|
|
|
|
|
|
|
skipVerifyVal interface{} = &(struct{}{})
|
|
skipVerifyVal interface{} = &(struct{}{})
|
|
|
|
|
|
|
@@ -104,7 +107,9 @@ func testInitFlags() {
|
|
|
flag.BoolVar(&testInternStr, "te", false, "Set InternStr option")
|
|
flag.BoolVar(&testInternStr, "te", false, "Set InternStr option")
|
|
|
flag.BoolVar(&testSkipIntf, "tf", false, "Skip Interfaces")
|
|
flag.BoolVar(&testSkipIntf, "tf", false, "Skip Interfaces")
|
|
|
flag.BoolVar(&testUseReset, "tr", false, "Use Reset")
|
|
flag.BoolVar(&testUseReset, "tr", false, "Use Reset")
|
|
|
|
|
+ flag.IntVar(&testJsonIndent, "td", 0, "Use JSON Indent")
|
|
|
flag.BoolVar(&testUseMust, "tm", true, "Use Must(En|De)code")
|
|
flag.BoolVar(&testUseMust, "tm", true, "Use Must(En|De)code")
|
|
|
|
|
+ flag.BoolVar(&testCheckCircRef, "tl", false, "Use Check Circular Ref")
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
func testByteBuf(in []byte) *bytes.Buffer {
|
|
func testByteBuf(in []byte) *bytes.Buffer {
|
|
@@ -115,6 +120,46 @@ type TestABC struct {
|
|
|
A, B, C string
|
|
A, B, C string
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+func (x *TestABC) MarshalBinary() ([]byte, error) {
|
|
|
|
|
+ return []byte(fmt.Sprintf("%s %s %s", x.A, x.B, x.C)), nil
|
|
|
|
|
+}
|
|
|
|
|
+func (x *TestABC) MarshalText() ([]byte, error) {
|
|
|
|
|
+ return []byte(fmt.Sprintf("%s %s %s", x.A, x.B, x.C)), nil
|
|
|
|
|
+}
|
|
|
|
|
+func (x *TestABC) MarshalJSON() ([]byte, error) {
|
|
|
|
|
+ return []byte(fmt.Sprintf(`"%s %s %s"`, x.A, x.B, x.C)), nil
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func (x *TestABC) UnmarshalBinary(data []byte) (err error) {
|
|
|
|
|
+ ss := strings.Split(string(data), " ")
|
|
|
|
|
+ x.A, x.B, x.C = ss[0], ss[1], ss[2]
|
|
|
|
|
+ return
|
|
|
|
|
+}
|
|
|
|
|
+func (x *TestABC) UnmarshalText(data []byte) (err error) {
|
|
|
|
|
+ return x.UnmarshalBinary(data)
|
|
|
|
|
+}
|
|
|
|
|
+func (x *TestABC) UnmarshalJSON(data []byte) (err error) {
|
|
|
|
|
+ return x.UnmarshalBinary(data[1 : len(data)-1])
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+type TestABC2 struct {
|
|
|
|
|
+ A, B, C string
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func (x TestABC2) MarshalText() ([]byte, error) {
|
|
|
|
|
+ return []byte(fmt.Sprintf("%s %s %s", x.A, x.B, x.C)), nil
|
|
|
|
|
+}
|
|
|
|
|
+func (x *TestABC2) UnmarshalText(data []byte) (err error) {
|
|
|
|
|
+ ss := strings.Split(string(data), " ")
|
|
|
|
|
+ x.A, x.B, x.C = ss[0], ss[1], ss[2]
|
|
|
|
|
+ return
|
|
|
|
|
+ // _, err = fmt.Sscanf(string(data), "%s %s %s", &x.A, &x.B, &x.C)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+type TestRpcABC struct {
|
|
|
|
|
+ A, B, C string
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
type TestRpcInt struct {
|
|
type TestRpcInt struct {
|
|
|
i int
|
|
i int
|
|
|
}
|
|
}
|
|
@@ -122,7 +167,7 @@ type TestRpcInt struct {
|
|
|
func (r *TestRpcInt) Update(n int, res *int) error { r.i = n; *res = r.i; return nil }
|
|
func (r *TestRpcInt) Update(n int, res *int) error { r.i = n; *res = r.i; return nil }
|
|
|
func (r *TestRpcInt) Square(ignore int, res *int) error { *res = r.i * r.i; return nil }
|
|
func (r *TestRpcInt) Square(ignore int, res *int) error { *res = r.i * r.i; return nil }
|
|
|
func (r *TestRpcInt) Mult(n int, res *int) error { *res = r.i * n; return nil }
|
|
func (r *TestRpcInt) Mult(n int, res *int) error { *res = r.i * n; return nil }
|
|
|
-func (r *TestRpcInt) EchoStruct(arg TestABC, res *string) error {
|
|
|
|
|
|
|
+func (r *TestRpcInt) EchoStruct(arg TestRpcABC, res *string) error {
|
|
|
*res = fmt.Sprintf("%#v", arg)
|
|
*res = fmt.Sprintf("%#v", arg)
|
|
|
return nil
|
|
return nil
|
|
|
}
|
|
}
|
|
@@ -292,6 +337,7 @@ func testInit() {
|
|
|
bh := v.getBasicHandle()
|
|
bh := v.getBasicHandle()
|
|
|
bh.InternString = testInternStr
|
|
bh.InternString = testInternStr
|
|
|
bh.Canonical = testCanonical
|
|
bh.Canonical = testCanonical
|
|
|
|
|
+ bh.CheckCircularRef = testCheckCircRef
|
|
|
bh.StructToArray = testStructToArray
|
|
bh.StructToArray = testStructToArray
|
|
|
// mostly doing this for binc
|
|
// mostly doing this for binc
|
|
|
if testWriteNoSymbols {
|
|
if testWriteNoSymbols {
|
|
@@ -301,27 +347,20 @@ func testInit() {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ testJsonH.Indent = int8(testJsonIndent)
|
|
|
testMsgpackH.RawToString = true
|
|
testMsgpackH.RawToString = true
|
|
|
|
|
|
|
|
// testMsgpackH.AddExt(byteSliceTyp, 0, testMsgpackH.BinaryEncodeExt, testMsgpackH.BinaryDecodeExt)
|
|
// testMsgpackH.AddExt(byteSliceTyp, 0, testMsgpackH.BinaryEncodeExt, testMsgpackH.BinaryDecodeExt)
|
|
|
// testMsgpackH.AddExt(timeTyp, 1, testMsgpackH.TimeEncodeExt, testMsgpackH.TimeDecodeExt)
|
|
// testMsgpackH.AddExt(timeTyp, 1, testMsgpackH.TimeEncodeExt, testMsgpackH.TimeDecodeExt)
|
|
|
- timeEncExt := func(rv reflect.Value) (bs []byte, err error) {
|
|
|
|
|
- defer panicToErr(&err)
|
|
|
|
|
- bs = timeExt{}.WriteExt(rv.Interface())
|
|
|
|
|
- return
|
|
|
|
|
- }
|
|
|
|
|
- timeDecExt := func(rv reflect.Value, bs []byte) (err error) {
|
|
|
|
|
- defer panicToErr(&err)
|
|
|
|
|
- timeExt{}.ReadExt(rv.Interface(), bs)
|
|
|
|
|
- return
|
|
|
|
|
- }
|
|
|
|
|
|
|
|
|
|
// add extensions for msgpack, simple for time.Time, so we can encode/decode same way.
|
|
// add extensions for msgpack, simple for time.Time, so we can encode/decode same way.
|
|
|
// use different flavors of XXXExt calls, including deprecated ones.
|
|
// use different flavors of XXXExt calls, including deprecated ones.
|
|
|
- testSimpleH.AddExt(timeTyp, 1, timeEncExt, timeDecExt)
|
|
|
|
|
|
|
+ // NOTE:
|
|
|
|
|
+ // DO NOT set extensions for JsonH, so we can test json(M|Unm)arshal support.
|
|
|
|
|
+ testSimpleH.AddExt(timeTyp, 1, timeExtEncFn, timeExtDecFn)
|
|
|
testMsgpackH.SetBytesExt(timeTyp, 1, timeExt{})
|
|
testMsgpackH.SetBytesExt(timeTyp, 1, timeExt{})
|
|
|
testCborH.SetInterfaceExt(timeTyp, 1, &testUnixNanoTimeExt{})
|
|
testCborH.SetInterfaceExt(timeTyp, 1, &testUnixNanoTimeExt{})
|
|
|
- testJsonH.SetInterfaceExt(timeTyp, 1, &testUnixNanoTimeExt{})
|
|
|
|
|
|
|
+ // testJsonH.SetInterfaceExt(timeTyp, 1, &testUnixNanoTimeExt{})
|
|
|
|
|
|
|
|
primitives := []interface{}{
|
|
primitives := []interface{}{
|
|
|
int8(-8),
|
|
int8(-8),
|
|
@@ -818,8 +857,8 @@ func testCodecRpcOne(t *testing.T, rr Rpc, h Handle, doRequest bool, exitSleepMs
|
|
|
checkEqualT(t, sq, 25, "sq=25")
|
|
checkEqualT(t, sq, 25, "sq=25")
|
|
|
checkErrT(t, cl.Call("TestRpcInt.Mult", 20, &mult))
|
|
checkErrT(t, cl.Call("TestRpcInt.Mult", 20, &mult))
|
|
|
checkEqualT(t, mult, 100, "mult=100")
|
|
checkEqualT(t, mult, 100, "mult=100")
|
|
|
- checkErrT(t, cl.Call("TestRpcInt.EchoStruct", TestABC{"Aa", "Bb", "Cc"}, &rstr))
|
|
|
|
|
- checkEqualT(t, rstr, fmt.Sprintf("%#v", TestABC{"Aa", "Bb", "Cc"}), "rstr=")
|
|
|
|
|
|
|
+ checkErrT(t, cl.Call("TestRpcInt.EchoStruct", TestRpcABC{"Aa", "Bb", "Cc"}, &rstr))
|
|
|
|
|
+ checkEqualT(t, rstr, fmt.Sprintf("%#v", TestRpcABC{"Aa", "Bb", "Cc"}), "rstr=")
|
|
|
checkErrT(t, cl.Call("TestRpcInt.Echo123", []string{"A1", "B2", "C3"}, &rstr))
|
|
checkErrT(t, cl.Call("TestRpcInt.Echo123", []string{"A1", "B2", "C3"}, &rstr))
|
|
|
checkEqualT(t, rstr, fmt.Sprintf("%#v", []string{"A1", "B2", "C3"}), "rstr=")
|
|
checkEqualT(t, rstr, fmt.Sprintf("%#v", []string{"A1", "B2", "C3"}), "rstr=")
|
|
|
}
|
|
}
|
|
@@ -917,6 +956,95 @@ func doTestMapEncodeForCanonical(t *testing.T, name string, h Handle) {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+func doTestStdEncIntf(t *testing.T, name string, h Handle) {
|
|
|
|
|
+ args := [][2]interface{}{
|
|
|
|
|
+ {&TestABC{"A", "BB", "CCC"}, new(TestABC)},
|
|
|
|
|
+ {&TestABC2{"AAA", "BB", "C"}, new(TestABC2)},
|
|
|
|
|
+ }
|
|
|
|
|
+ for _, a := range args {
|
|
|
|
|
+ var b []byte
|
|
|
|
|
+ e := NewEncoderBytes(&b, h)
|
|
|
|
|
+ e.MustEncode(a[0])
|
|
|
|
|
+ d := NewDecoderBytes(b, h)
|
|
|
|
|
+ d.MustDecode(a[1])
|
|
|
|
|
+ if err := deepEqual(a[0], a[1]); err == nil {
|
|
|
|
|
+ logT(t, "++++ Objects match")
|
|
|
|
|
+ } else {
|
|
|
|
|
+ logT(t, "---- Objects do not match: y1: %v, err: %v", a[1], err)
|
|
|
|
|
+ failT(t)
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func doTestEncCircularRef(t *testing.T, name string, h Handle) {
|
|
|
|
|
+ type T1 struct {
|
|
|
|
|
+ S string
|
|
|
|
|
+ B bool
|
|
|
|
|
+ T interface{}
|
|
|
|
|
+ }
|
|
|
|
|
+ type T2 struct {
|
|
|
|
|
+ S string
|
|
|
|
|
+ T *T1
|
|
|
|
|
+ }
|
|
|
|
|
+ type T3 struct {
|
|
|
|
|
+ S string
|
|
|
|
|
+ T *T2
|
|
|
|
|
+ }
|
|
|
|
|
+ t1 := T1{"t1", true, nil}
|
|
|
|
|
+ t2 := T2{"t2", &t1}
|
|
|
|
|
+ t3 := T3{"t3", &t2}
|
|
|
|
|
+ t1.T = &t3
|
|
|
|
|
+
|
|
|
|
|
+ var bs []byte
|
|
|
|
|
+ var err error
|
|
|
|
|
+
|
|
|
|
|
+ bh := h.getBasicHandle()
|
|
|
|
|
+ if !bh.CheckCircularRef {
|
|
|
|
|
+ bh.CheckCircularRef = true
|
|
|
|
|
+ defer func() { bh.CheckCircularRef = false }()
|
|
|
|
|
+ }
|
|
|
|
|
+ err = NewEncoderBytes(&bs, h).Encode(&t3)
|
|
|
|
|
+ if err == nil {
|
|
|
|
|
+ logT(t, "expecting error due to circular reference. found none")
|
|
|
|
|
+ t.FailNow()
|
|
|
|
|
+ }
|
|
|
|
|
+ if x := err.Error(); strings.Contains(x, "circular") || strings.Contains(x, "cyclic") {
|
|
|
|
|
+ logT(t, "error detected as expected: %v", x)
|
|
|
|
|
+ } else {
|
|
|
|
|
+ logT(t, "error detected was not as expected: %v", x)
|
|
|
|
|
+ t.FailNow()
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// TestAnonCycleT{1,2,3} types are used to test anonymous cycles.
|
|
|
|
|
+// They are top-level, so that they can have circular references.
|
|
|
|
|
+type (
|
|
|
|
|
+ TestAnonCycleT1 struct {
|
|
|
|
|
+ S string
|
|
|
|
|
+ TestAnonCycleT2
|
|
|
|
|
+ }
|
|
|
|
|
+ TestAnonCycleT2 struct {
|
|
|
|
|
+ S2 string
|
|
|
|
|
+ TestAnonCycleT3
|
|
|
|
|
+ }
|
|
|
|
|
+ TestAnonCycleT3 struct {
|
|
|
|
|
+ *TestAnonCycleT1
|
|
|
|
|
+ }
|
|
|
|
|
+)
|
|
|
|
|
+
|
|
|
|
|
+func doTestAnonCycle(t *testing.T, name string, h Handle) {
|
|
|
|
|
+ var x TestAnonCycleT1
|
|
|
|
|
+ x.S = "hello"
|
|
|
|
|
+ x.TestAnonCycleT2.S2 = "hello.2"
|
|
|
|
|
+ x.TestAnonCycleT2.TestAnonCycleT3.TestAnonCycleT1 = &x
|
|
|
|
|
+
|
|
|
|
|
+ // just check that you can get typeInfo for T1
|
|
|
|
|
+ rt := reflect.TypeOf((*TestAnonCycleT1)(nil)).Elem()
|
|
|
|
|
+ rtid := reflect.ValueOf(rt).Pointer()
|
|
|
|
|
+ pti := h.getBasicHandle().getTypeInfo(rtid, rt)
|
|
|
|
|
+ logT(t, "pti: %v", pti)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
// Comprehensive testing that generates data encoded from python handle (cbor, msgpack),
|
|
// Comprehensive testing that generates data encoded from python handle (cbor, msgpack),
|
|
|
// and validates that our code can read and write it out accordingly.
|
|
// and validates that our code can read and write it out accordingly.
|
|
|
// We keep this unexported here, and put actual test in ext_dep_test.go.
|
|
// We keep this unexported here, and put actual test in ext_dep_test.go.
|
|
@@ -1038,7 +1166,7 @@ func doTestMsgpackRpcSpecGoClientToPythonSvc(t *testing.T) {
|
|
|
cl := rpc.NewClientWithCodec(cc)
|
|
cl := rpc.NewClientWithCodec(cc)
|
|
|
defer cl.Close()
|
|
defer cl.Close()
|
|
|
var rstr string
|
|
var rstr string
|
|
|
- checkErrT(t, cl.Call("EchoStruct", TestABC{"Aa", "Bb", "Cc"}, &rstr))
|
|
|
|
|
|
|
+ checkErrT(t, cl.Call("EchoStruct", TestRpcABC{"Aa", "Bb", "Cc"}, &rstr))
|
|
|
//checkEqualT(t, rstr, "{'A': 'Aa', 'B': 'Bb', 'C': 'Cc'}")
|
|
//checkEqualT(t, rstr, "{'A': 'Aa', 'B': 'Bb', 'C': 'Cc'}")
|
|
|
var mArgs MsgpackSpecRpcMultiArgs = []interface{}{"A1", "B2", "C3"}
|
|
var mArgs MsgpackSpecRpcMultiArgs = []interface{}{"A1", "B2", "C3"}
|
|
|
checkErrT(t, cl.Call("Echo123", mArgs, &rstr))
|
|
checkErrT(t, cl.Call("Echo123", mArgs, &rstr))
|
|
@@ -1061,7 +1189,7 @@ func doTestMsgpackRpcSpecPythonClientToGoSvc(t *testing.T) {
|
|
|
t.FailNow()
|
|
t.FailNow()
|
|
|
}
|
|
}
|
|
|
checkEqualT(t, string(cmdout),
|
|
checkEqualT(t, string(cmdout),
|
|
|
- fmt.Sprintf("%#v\n%#v\n", []string{"A1", "B2", "C3"}, TestABC{"Aa", "Bb", "Cc"}), "cmdout=")
|
|
|
|
|
|
|
+ fmt.Sprintf("%#v\n%#v\n", []string{"A1", "B2", "C3"}, TestRpcABC{"Aa", "Bb", "Cc"}), "cmdout=")
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
func TestBincCodecsTable(t *testing.T) {
|
|
func TestBincCodecsTable(t *testing.T) {
|
|
@@ -1076,6 +1204,10 @@ func TestBincCodecsEmbeddedPointer(t *testing.T) {
|
|
|
testCodecEmbeddedPointer(t, testBincH)
|
|
testCodecEmbeddedPointer(t, testBincH)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+func TestBincStdEncIntf(t *testing.T) {
|
|
|
|
|
+ doTestStdEncIntf(t, "binc", testBincH)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
func TestSimpleCodecsTable(t *testing.T) {
|
|
func TestSimpleCodecsTable(t *testing.T) {
|
|
|
testCodecTableOne(t, testSimpleH)
|
|
testCodecTableOne(t, testSimpleH)
|
|
|
}
|
|
}
|
|
@@ -1088,6 +1220,10 @@ func TestSimpleCodecsEmbeddedPointer(t *testing.T) {
|
|
|
testCodecEmbeddedPointer(t, testSimpleH)
|
|
testCodecEmbeddedPointer(t, testSimpleH)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+func TestSimpleStdEncIntf(t *testing.T) {
|
|
|
|
|
+ doTestStdEncIntf(t, "simple", testSimpleH)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
func TestMsgpackCodecsTable(t *testing.T) {
|
|
func TestMsgpackCodecsTable(t *testing.T) {
|
|
|
testCodecTableOne(t, testMsgpackH)
|
|
testCodecTableOne(t, testMsgpackH)
|
|
|
}
|
|
}
|
|
@@ -1100,6 +1236,10 @@ func TestMsgpackCodecsEmbeddedPointer(t *testing.T) {
|
|
|
testCodecEmbeddedPointer(t, testMsgpackH)
|
|
testCodecEmbeddedPointer(t, testMsgpackH)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+func TestMsgpackStdEncIntf(t *testing.T) {
|
|
|
|
|
+ doTestStdEncIntf(t, "msgpack", testMsgpackH)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
func TestCborCodecsTable(t *testing.T) {
|
|
func TestCborCodecsTable(t *testing.T) {
|
|
|
testCodecTableOne(t, testCborH)
|
|
testCodecTableOne(t, testCborH)
|
|
|
}
|
|
}
|
|
@@ -1116,6 +1256,14 @@ func TestCborMapEncodeForCanonical(t *testing.T) {
|
|
|
doTestMapEncodeForCanonical(t, "cbor", testCborH)
|
|
doTestMapEncodeForCanonical(t, "cbor", testCborH)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+func TestCborCodecChan(t *testing.T) {
|
|
|
|
|
+ testCodecChan(t, testCborH)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func TestCborStdEncIntf(t *testing.T) {
|
|
|
|
|
+ doTestStdEncIntf(t, "cbor", testCborH)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
func TestJsonCodecsTable(t *testing.T) {
|
|
func TestJsonCodecsTable(t *testing.T) {
|
|
|
testCodecTableOne(t, testJsonH)
|
|
testCodecTableOne(t, testJsonH)
|
|
|
}
|
|
}
|
|
@@ -1132,8 +1280,18 @@ func TestJsonCodecChan(t *testing.T) {
|
|
|
testCodecChan(t, testJsonH)
|
|
testCodecChan(t, testJsonH)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-func TestCborCodecChan(t *testing.T) {
|
|
|
|
|
- testCodecChan(t, testCborH)
|
|
|
|
|
|
|
+func TestJsonStdEncIntf(t *testing.T) {
|
|
|
|
|
+ doTestStdEncIntf(t, "json", testJsonH)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// ----- ALL (framework based) -----
|
|
|
|
|
+
|
|
|
|
|
+func TestAllEncCircularRef(t *testing.T) {
|
|
|
|
|
+ doTestEncCircularRef(t, "cbor", testCborH)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func TestAllAnonCycle(t *testing.T) {
|
|
|
|
|
+ doTestAnonCycle(t, "cbor", testCborH)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// ----- RPC -----
|
|
// ----- RPC -----
|
|
@@ -1180,6 +1338,7 @@ func TestBincUnderlyingType(t *testing.T) {
|
|
|
// - struct tags:
|
|
// - struct tags:
|
|
|
// on anonymous fields, _struct (all fields), etc
|
|
// on anonymous fields, _struct (all fields), etc
|
|
|
// - codecgen of struct containing channels.
|
|
// - codecgen of struct containing channels.
|
|
|
|
|
+// - bad input with large array length prefix
|
|
|
//
|
|
//
|
|
|
// Cleanup tests:
|
|
// Cleanup tests:
|
|
|
// - The are brittle in their handling of validation and skipping
|
|
// - The are brittle in their handling of validation and skipping
|