From ab38c3a7a3ba88f954f383539956c42325629fe1 Mon Sep 17 00:00:00 2001 From: edwardmack Date: Tue, 21 Jan 2020 10:02:12 -0500 Subject: [PATCH 1/9] create encoder for []string --- codec/decode.go | 8 +++++++ codec/decode_ptr_test.go | 2 ++ codec/encode.go | 8 +++++++ codec/encode_test.go | 51 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 69 insertions(+) diff --git a/codec/decode.go b/codec/decode.go index 9ddaabdbb8..be3923c250 100644 --- a/codec/decode.go +++ b/codec/decode.go @@ -534,6 +534,14 @@ func (sd *Decoder) DecodeTuple(t interface{}) (interface{}, error) { // get the pointer to the value and set the value ptr := fieldValue.(*string) *ptr = string(o.([]byte)) + case []string: + // todo ed, find way to split array before calling decode byte array + o, err = sd.DecodeByteArray() + if err != nil { + break + } + ptr := fieldValue.(*[]string) + *ptr = []string{"hello"} default: _, err = sd.Decode(v.Field(i).Interface()) if err != nil { diff --git a/codec/decode_ptr_test.go b/codec/decode_ptr_test.go index 37d2675941..50a92b6699 100644 --- a/codec/decode_ptr_test.go +++ b/codec/decode_ptr_test.go @@ -156,12 +156,14 @@ func TestLargeDecodePtrByteArrays(t *testing.T) { func TestDecodePtrByteArrays(t *testing.T) { for _, test := range decodeByteArrayTests { var result = make([]byte, len(test.output)) + t.Logf("before %v", result) err := DecodePtr(test.val, result) if err != nil { t.Error(err) } else if !bytes.Equal(result, test.output) { t.Errorf("Fail: got %d expected %d", len(result), len(test.output)) } + t.Logf("after %v", result) } } diff --git a/codec/encode.go b/codec/encode.go index 5da5be0589..b7e0d5195b 100644 --- a/codec/encode.go +++ b/codec/encode.go @@ -306,6 +306,14 @@ func (se *Encoder) encodeArray(t interface{}) (bytesEncoded int, err error) { n, err = se.encodeArray(elem) bytesEncoded += n } + case []string: + n, err = se.encodeInteger(uint(len(arr))) + bytesEncoded += n + + for _, elem := range arr { + n, err = se.encodeByteArray([]byte(elem)) + bytesEncoded += n + } } return bytesEncoded, err diff --git a/codec/encode_test.go b/codec/encode_test.go index 1dc2921e95..8b66cdd7d2 100644 --- a/codec/encode_test.go +++ b/codec/encode_test.go @@ -190,3 +190,54 @@ func TestEncodeAndDecodeStringInStruct(t *testing.T) { t.Fatalf("Fail: got %v expected %v", dec, test) } } + +func TestEncodeString(t *testing.T) { + //var test = []string{"test"} + //var test = "test" + var test = &struct { + Foo []byte + Bar []byte + }{[]byte{0x01}, []byte{0xff, 0xff, 0x02}} + + enc, err := Encode(test) + if err != nil { + t.Fatal(err) + } + t.Logf("encoded %v", enc) + + dec, err := Decode(enc, &struct{Foo []byte; Bar []byte}{}) + if err != nil { + t.Fatal(err) + } + t.Logf("decoded: %v", dec) +} + +func TestEncodeAndDecodeStringArrayInStruct(t *testing.T) { + test := &struct{ + A []string + } { + A: []string{"noot", "noot2"}, + } + + enc, err := Encode(test) + if err != nil { + t.Fatal(err) + } + + if len(enc) == 0 { + t.Fatal("fail to encode StringArrayInStruct") + } + + t.Logf("encoded %v", enc) + + //dec, err := Decode(enc, &struct{A []string}{}) + var ts = &struct {A []string }{} + err = DecodePtr(enc, ts) + if err != nil { + t.Fatal(err) + } + t.Logf("decoded %v", ts) + if !reflect.DeepEqual(test, ts) { + t.Fatalf("Fail: got %v expected %v", ts, test) + } +} \ No newline at end of file From 77ae97d731e030fa6d9bd44c10e55b9f5959f8ea Mon Sep 17 00:00:00 2001 From: edwardmack Date: Tue, 21 Jan 2020 17:25:46 -0500 Subject: [PATCH 2/9] save commit --- codec/decode.go | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/codec/decode.go b/codec/decode.go index be3923c250..7c235cf378 100644 --- a/codec/decode.go +++ b/codec/decode.go @@ -378,7 +378,13 @@ func (sd *Decoder) DecodeArray(t interface{}) (interface{}, error) { var arr = [32]byte{} copy(arr[:], buf) *ptr = arr + case []string: + o, err = sd.DecodeByteArray() + if err != nil { + break + } default: + fmt.Errorf("unexpected type: %s", reflect.TypeOf(t)) err = errors.New("could not decode invalid slice or array") } @@ -535,8 +541,12 @@ func (sd *Decoder) DecodeTuple(t interface{}) (interface{}, error) { ptr := fieldValue.(*string) *ptr = string(o.([]byte)) case []string: + //sd.DecodePtrByteArray(v.Field(i).Interface()) // todo ed, find way to split array before calling decode byte array - o, err = sd.DecodeByteArray() + //var qty int8 + //o, err = sd.DecodeFixedWidthInt(qty) + var res = []string{""} + o, err = sd.DecodeArray(res) if err != nil { break } From 52299327ab5598efd8f5f4b0787606904530e7ef Mon Sep 17 00:00:00 2001 From: edwardmack Date: Wed, 22 Jan 2020 13:52:37 -0500 Subject: [PATCH 3/9] added ability to decode []string --- codec/decode.go | 43 +++++++++++++---------------------------- codec/decode_ptr.go | 16 +++++++++++++++ codec/encode_test.go | 46 +++++++------------------------------------- go.mod | 1 + go.sum | 1 + 5 files changed, 38 insertions(+), 69 deletions(-) diff --git a/codec/decode.go b/codec/decode.go index 7c235cf378..f3d57d2119 100644 --- a/codec/decode.go +++ b/codec/decode.go @@ -281,22 +281,6 @@ func (sd *Decoder) DecodeByteArray() (o []byte, err error) { return b, nil } -// DecodePtrByteArray accepts a byte array representing a SCALE encoded byte array and performs SCALE decoding -// of the byte array -func (sd *Decoder) DecodePtrByteArray(output interface{}) error { - _, err := sd.DecodeInteger() - if err != nil { - return err - } - - _, err = sd.Reader.Read(output.([]byte)) - if err != nil { - return errors.New("could not decode invalid byte array: reached early EOF") - } - - return nil -} - // DecodeBool accepts a byte array representing a SCALE encoded bool and performs SCALE decoding // of the bool then returns it. if invalid, return false and an error func (sd *Decoder) DecodeBool() (bool, error) { @@ -378,13 +362,7 @@ func (sd *Decoder) DecodeArray(t interface{}) (interface{}, error) { var arr = [32]byte{} copy(arr[:], buf) *ptr = arr - case []string: - o, err = sd.DecodeByteArray() - if err != nil { - break - } default: - fmt.Errorf("unexpected type: %s", reflect.TypeOf(t)) err = errors.New("could not decode invalid slice or array") } @@ -541,17 +519,22 @@ func (sd *Decoder) DecodeTuple(t interface{}) (interface{}, error) { ptr := fieldValue.(*string) *ptr = string(o.([]byte)) case []string: - //sd.DecodePtrByteArray(v.Field(i).Interface()) - // todo ed, find way to split array before calling decode byte array - //var qty int8 - //o, err = sd.DecodeFixedWidthInt(qty) - var res = []string{""} - o, err = sd.DecodeArray(res) + length, err := sd.DecodeInteger() if err != nil { - break + return nil, err } + s := make([]string, length) + + for i := 0; i < int(length); i++ { + o, err = sd.DecodeByteArray() + s[i] = string(o.([]byte)[:]) // cast []byte into string + if err != nil { + break + } + } + // get the pointer to the value and set the value ptr := fieldValue.(*[]string) - *ptr = []string{"hello"} + *ptr = s default: _, err = sd.Decode(v.Field(i).Interface()) if err != nil { diff --git a/codec/decode_ptr.go b/codec/decode_ptr.go index 6b7dd133f9..d2be79700e 100644 --- a/codec/decode_ptr.go +++ b/codec/decode_ptr.go @@ -117,6 +117,22 @@ func (sd *Decoder) DecodePtrFixedWidthInt(t interface{}) (err error) { return err } +// DecodePtrByteArray accepts a byte array representing a SCALE encoded byte array and performs SCALE decoding +// of the byte array +func (sd *Decoder) DecodePtrByteArray(output interface{}) error { + _, err := sd.DecodeInteger() + if err != nil { + return err + } + + _, err = sd.Reader.Read(output.([]byte)) + if err != nil { + return errors.New("could not decode invalid byte array: reached early EOF") + } + + return nil +} + // DecodePtrBigInt decodes a SCALE encoded byte array into a *big.Int // Changes the value of output to decoded value // Works for all integers, including ints > 2**64 diff --git a/codec/encode_test.go b/codec/encode_test.go index 8b66cdd7d2..b0374542f7 100644 --- a/codec/encode_test.go +++ b/codec/encode_test.go @@ -18,6 +18,7 @@ package codec import ( "bytes" + "github.com/stretchr/testify/require" "math/big" "reflect" "strings" @@ -191,27 +192,6 @@ func TestEncodeAndDecodeStringInStruct(t *testing.T) { } } -func TestEncodeString(t *testing.T) { - //var test = []string{"test"} - //var test = "test" - var test = &struct { - Foo []byte - Bar []byte - }{[]byte{0x01}, []byte{0xff, 0xff, 0x02}} - - enc, err := Encode(test) - if err != nil { - t.Fatal(err) - } - t.Logf("encoded %v", enc) - - dec, err := Decode(enc, &struct{Foo []byte; Bar []byte}{}) - if err != nil { - t.Fatal(err) - } - t.Logf("decoded: %v", dec) -} - func TestEncodeAndDecodeStringArrayInStruct(t *testing.T) { test := &struct{ A []string @@ -220,24 +200,12 @@ func TestEncodeAndDecodeStringArrayInStruct(t *testing.T) { } enc, err := Encode(test) - if err != nil { - t.Fatal(err) - } + require.Nil(t, err) + require.NotEqual(t, 0, len(enc), "Failed to encode StringArrayInStruct") - if len(enc) == 0 { - t.Fatal("fail to encode StringArrayInStruct") - } + var result = &struct {A []string }{} - t.Logf("encoded %v", enc) - - //dec, err := Decode(enc, &struct{A []string}{}) - var ts = &struct {A []string }{} - err = DecodePtr(enc, ts) - if err != nil { - t.Fatal(err) - } - t.Logf("decoded %v", ts) - if !reflect.DeepEqual(test, ts) { - t.Fatalf("Fail: got %v expected %v", ts, test) - } + err = DecodePtr(enc, result) + require.Nil(t, err) + require.Equal(t, test, result, "Decoding failed") } \ No newline at end of file diff --git a/go.mod b/go.mod index 193d6aefa4..da297cc6fd 100644 --- a/go.mod +++ b/go.mod @@ -22,6 +22,7 @@ require ( github.com/naoina/go-stringutil v0.1.0 // indirect github.com/naoina/toml v0.1.1 github.com/opentracing/opentracing-go v1.1.0 // indirect + github.com/stretchr/testify v1.4.0 github.com/urfave/cli v1.20.0 github.com/wasmerio/go-ext-wasm v0.0.0-20191206132826-225d01fcd22c golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876 diff --git a/go.sum b/go.sum index 899469b992..5d2527b2e6 100644 --- a/go.sum +++ b/go.sum @@ -653,6 +653,7 @@ gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkep gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= From c8627bcac35d2170d056912cd62e6b47c7a06d13 Mon Sep 17 00:00:00 2001 From: edwardmack Date: Wed, 22 Jan 2020 13:54:51 -0500 Subject: [PATCH 4/9] go fmt project --- codec/decode.go | 2 +- codec/encode_test.go | 11 ++++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/codec/decode.go b/codec/decode.go index f3d57d2119..ffec0dec04 100644 --- a/codec/decode.go +++ b/codec/decode.go @@ -527,7 +527,7 @@ func (sd *Decoder) DecodeTuple(t interface{}) (interface{}, error) { for i := 0; i < int(length); i++ { o, err = sd.DecodeByteArray() - s[i] = string(o.([]byte)[:]) // cast []byte into string + s[i] = string(o.([]byte)[:]) // cast []byte into string if err != nil { break } diff --git a/codec/encode_test.go b/codec/encode_test.go index b0374542f7..f83e0b2753 100644 --- a/codec/encode_test.go +++ b/codec/encode_test.go @@ -18,11 +18,12 @@ package codec import ( "bytes" - "github.com/stretchr/testify/require" "math/big" "reflect" "strings" "testing" + + "github.com/stretchr/testify/require" ) type encodeTest struct { @@ -193,9 +194,9 @@ func TestEncodeAndDecodeStringInStruct(t *testing.T) { } func TestEncodeAndDecodeStringArrayInStruct(t *testing.T) { - test := &struct{ + test := &struct { A []string - } { + }{ A: []string{"noot", "noot2"}, } @@ -203,9 +204,9 @@ func TestEncodeAndDecodeStringArrayInStruct(t *testing.T) { require.Nil(t, err) require.NotEqual(t, 0, len(enc), "Failed to encode StringArrayInStruct") - var result = &struct {A []string }{} + var result = &struct{ A []string }{} err = DecodePtr(enc, result) require.Nil(t, err) require.Equal(t, test, result, "Decoding failed") -} \ No newline at end of file +} From bc15493705836cded561685a35c711922d992086 Mon Sep 17 00:00:00 2001 From: edwardmack Date: Wed, 22 Jan 2020 14:03:31 -0500 Subject: [PATCH 5/9] removed extra logging --- codec/decode_ptr_test.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/codec/decode_ptr_test.go b/codec/decode_ptr_test.go index 50a92b6699..37d2675941 100644 --- a/codec/decode_ptr_test.go +++ b/codec/decode_ptr_test.go @@ -156,14 +156,12 @@ func TestLargeDecodePtrByteArrays(t *testing.T) { func TestDecodePtrByteArrays(t *testing.T) { for _, test := range decodeByteArrayTests { var result = make([]byte, len(test.output)) - t.Logf("before %v", result) err := DecodePtr(test.val, result) if err != nil { t.Error(err) } else if !bytes.Equal(result, test.output) { t.Errorf("Fail: got %d expected %d", len(result), len(test.output)) } - t.Logf("after %v", result) } } From 0ffcb9ed48847e1d9b21c536ac864e874a6635ed Mon Sep 17 00:00:00 2001 From: edwardmack Date: Wed, 22 Jan 2020 14:09:20 -0500 Subject: [PATCH 6/9] cleanup error check --- codec/decode.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codec/decode.go b/codec/decode.go index ffec0dec04..a971ef5155 100644 --- a/codec/decode.go +++ b/codec/decode.go @@ -529,7 +529,7 @@ func (sd *Decoder) DecodeTuple(t interface{}) (interface{}, error) { o, err = sd.DecodeByteArray() s[i] = string(o.([]byte)[:]) // cast []byte into string if err != nil { - break + return nil, err } } // get the pointer to the value and set the value From ab0a47f8683e6c40c650061fcd878988889e0233 Mon Sep 17 00:00:00 2001 From: edwardmack Date: Wed, 22 Jan 2020 14:11:40 -0500 Subject: [PATCH 7/9] refactor flow --- codec/decode.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/codec/decode.go b/codec/decode.go index a971ef5155..e39b36f7e7 100644 --- a/codec/decode.go +++ b/codec/decode.go @@ -527,10 +527,11 @@ func (sd *Decoder) DecodeTuple(t interface{}) (interface{}, error) { for i := 0; i < int(length); i++ { o, err = sd.DecodeByteArray() - s[i] = string(o.([]byte)[:]) // cast []byte into string if err != nil { return nil, err } + s[i] = string(o.([]byte)[:]) // cast []byte into string + } // get the pointer to the value and set the value ptr := fieldValue.(*[]string) From 3e036abc573a31e3f0dd0b2684b35561a4fc8483 Mon Sep 17 00:00:00 2001 From: edwardmack Date: Wed, 22 Jan 2020 14:29:54 -0500 Subject: [PATCH 8/9] added DecodeStringArray function --- codec/decode.go | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/codec/decode.go b/codec/decode.go index e39b36f7e7..27c8f1865e 100644 --- a/codec/decode.go +++ b/codec/decode.go @@ -519,23 +519,12 @@ func (sd *Decoder) DecodeTuple(t interface{}) (interface{}, error) { ptr := fieldValue.(*string) *ptr = string(o.([]byte)) case []string: - length, err := sd.DecodeInteger() + o, err = sd.DecodeStringArray() if err != nil { - return nil, err - } - s := make([]string, length) - - for i := 0; i < int(length); i++ { - o, err = sd.DecodeByteArray() - if err != nil { - return nil, err - } - s[i] = string(o.([]byte)[:]) // cast []byte into string - + break } - // get the pointer to the value and set the value ptr := fieldValue.(*[]string) - *ptr = s + *ptr = o.([]string) default: _, err = sd.Decode(v.Field(i).Interface()) if err != nil { @@ -606,3 +595,20 @@ func (sd *Decoder) DecodeBoolArray() ([]bool, error) { } return o, nil } + +func (sd *Decoder) DecodeStringArray() ([]string, error) { + length, err := sd.DecodeInteger() + if err != nil { + return nil, err + } + s := make([]string, length) + + for i := 0; i < int(length); i++ { + o, err := sd.DecodeByteArray() + if err != nil { + return nil, err + } + s[i] = string(o[:]) // cast []byte into string + } + return s, nil +} \ No newline at end of file From 11973802551d94409936676fb4992d91153b031c Mon Sep 17 00:00:00 2001 From: edwardmack Date: Wed, 22 Jan 2020 14:32:52 -0500 Subject: [PATCH 9/9] go fmt code --- codec/decode.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codec/decode.go b/codec/decode.go index 27c8f1865e..bc6495ce23 100644 --- a/codec/decode.go +++ b/codec/decode.go @@ -611,4 +611,4 @@ func (sd *Decoder) DecodeStringArray() ([]string, error) { s[i] = string(o[:]) // cast []byte into string } return s, nil -} \ No newline at end of file +}