aboutsummaryrefslogtreecommitdiffstats
path: root/accounts/abi/abi_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'accounts/abi/abi_test.go')
-rw-r--r--accounts/abi/abi_test.go128
1 files changed, 128 insertions, 0 deletions
diff --git a/accounts/abi/abi_test.go b/accounts/abi/abi_test.go
index d1b8330e3..170f3f74b 100644
--- a/accounts/abi/abi_test.go
+++ b/accounts/abi/abi_test.go
@@ -365,6 +365,134 @@ func ExampleJSON() {
// 1f2c40920000000000000000000000000000000000000000000000000000000000000001
}
+func TestInputVariableInputLength(t *testing.T) {
+ const definition = `[
+ { "type" : "function", "name" : "strOne", "const" : true, "inputs" : [ { "name" : "str", "type" : "string" } ] },
+ { "type" : "function", "name" : "bytesOne", "const" : true, "inputs" : [ { "name" : "str", "type" : "bytes" } ] },
+ { "type" : "function", "name" : "strTwo", "const" : true, "inputs" : [ { "name" : "str", "type" : "string" }, { "name" : "str1", "type" : "string" } ] }
+]`
+
+ abi, err := JSON(strings.NewReader(definition))
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ // test one string
+ strin := "hello world"
+ strpack, err := abi.Pack("strOne", strin)
+ if err != nil {
+ t.Error(err)
+ }
+
+ offset := make([]byte, 32)
+ offset[31] = 32
+ length := make([]byte, 32)
+ length[31] = byte(len(strin))
+ value := common.RightPadBytes([]byte(strin), 32)
+ exp := append(offset, append(length, value...)...)
+
+ // ignore first 4 bytes of the output. This is the function identifier
+ strpack = strpack[4:]
+ if !bytes.Equal(strpack, exp) {
+ t.Errorf("expected %x, got %x\n", exp, strpack)
+ }
+
+ // test one bytes
+ btspack, err := abi.Pack("bytesOne", []byte(strin))
+ if err != nil {
+ t.Error(err)
+ }
+ // ignore first 4 bytes of the output. This is the function identifier
+ btspack = btspack[4:]
+ if !bytes.Equal(btspack, exp) {
+ t.Errorf("expected %x, got %x\n", exp, btspack)
+ }
+
+ // test two strings
+ str1 := "hello"
+ str2 := "world"
+ str2pack, err := abi.Pack("strTwo", str1, str2)
+ if err != nil {
+ t.Error(err)
+ }
+
+ offset1 := make([]byte, 32)
+ offset1[31] = 64
+ length1 := make([]byte, 32)
+ length1[31] = byte(len(str1))
+ value1 := common.RightPadBytes([]byte(str1), 32)
+
+ offset2 := make([]byte, 32)
+ offset2[31] = 128
+ length2 := make([]byte, 32)
+ length2[31] = byte(len(str2))
+ value2 := common.RightPadBytes([]byte(str2), 32)
+
+ exp2 := append(offset1, offset2...)
+ exp2 = append(exp2, append(length1, value1...)...)
+ exp2 = append(exp2, append(length2, value2...)...)
+
+ // ignore first 4 bytes of the output. This is the function identifier
+ str2pack = str2pack[4:]
+ if !bytes.Equal(str2pack, exp2) {
+ t.Errorf("expected %x, got %x\n", exp, str2pack)
+ }
+
+ // test two strings, first > 32, second < 32
+ str1 = strings.Repeat("a", 33)
+ str2pack, err = abi.Pack("strTwo", str1, str2)
+ if err != nil {
+ t.Error(err)
+ }
+
+ offset1 = make([]byte, 32)
+ offset1[31] = 64
+ length1 = make([]byte, 32)
+ length1[31] = byte(len(str1))
+ value1 = common.RightPadBytes([]byte(str1), 64)
+ offset2[31] = 160
+
+ exp2 = append(offset1, offset2...)
+ exp2 = append(exp2, append(length1, value1...)...)
+ exp2 = append(exp2, append(length2, value2...)...)
+
+ // ignore first 4 bytes of the output. This is the function identifier
+ str2pack = str2pack[4:]
+ if !bytes.Equal(str2pack, exp2) {
+ t.Errorf("expected %x, got %x\n", exp, str2pack)
+ }
+
+ // test two strings, first > 32, second >32
+ str1 = strings.Repeat("a", 33)
+ str2 = strings.Repeat("a", 33)
+ str2pack, err = abi.Pack("strTwo", str1, str2)
+ if err != nil {
+ t.Error(err)
+ }
+
+ offset1 = make([]byte, 32)
+ offset1[31] = 64
+ length1 = make([]byte, 32)
+ length1[31] = byte(len(str1))
+ value1 = common.RightPadBytes([]byte(str1), 64)
+
+ offset2 = make([]byte, 32)
+ offset2[31] = 160
+ length2 = make([]byte, 32)
+ length2[31] = byte(len(str2))
+ value2 = common.RightPadBytes([]byte(str2), 64)
+
+ exp2 = append(offset1, offset2...)
+ exp2 = append(exp2, append(length1, value1...)...)
+ exp2 = append(exp2, append(length2, value2...)...)
+
+ // ignore first 4 bytes of the output. This is the function identifier
+ str2pack = str2pack[4:]
+ if !bytes.Equal(str2pack, exp2) {
+ t.Errorf("expected %x, got %x\n", exp, str2pack)
+ }
+}
+
func TestBytes(t *testing.T) {
const definition = `[
{ "type" : "function", "name" : "balance", "const" : true, "inputs" : [ { "name" : "address", "type" : "bytes20" } ] },