github.com/hyperledger/burrow@v0.34.5-0.20220512172541-77f09336001d/execution/evm/abi/packing_test.go (about) 1 package abi 2 3 import ( 4 "encoding/json" 5 "math/big" 6 "reflect" 7 "testing" 8 9 "github.com/hyperledger/burrow/execution/solidity" 10 "github.com/stretchr/testify/assert" 11 "github.com/stretchr/testify/require" 12 ) 13 14 func TestPackEvent(t *testing.T) { 15 t.Run("simple event", func(t *testing.T) { 16 eventAbi := `{"anonymous":false,"name":"TestEvent","type":"event","inputs":[{"indexed":true,"name":"direction","type":"bytes32"},{"indexed":false,"name":"trueism","type":"bool"},{"indexed":true,"name":"newDepth","type":"int128"},{"indexed":true,"name":"hash","type":"string"}]}` 17 18 type args struct { 19 Direction string 20 Trueism bool 21 NewDepth int64 22 Hash string 23 } 24 in := &args{ 25 Direction: "foo", 26 Trueism: true, 27 NewDepth: 232, 28 Hash: "DEADBEEFCAFEBADE01234567DEADBEEF", 29 } 30 eventSpec := new(EventSpec) 31 32 err := json.Unmarshal([]byte(eventAbi), eventSpec) 33 require.NoError(t, err) 34 35 topics, data, err := PackEvent(eventSpec, in) 36 require.NoError(t, err) 37 38 out := new(args) 39 err = UnpackEvent(eventSpec, topics, data, out) 40 require.NoError(t, err) 41 assert.Equal(t, in, out) 42 }) 43 44 t.Run("EventEmitter", func(t *testing.T) { 45 type args struct { 46 Direction []byte 47 Trueism bool 48 German string 49 NewDepth *big.Int 50 Bignum int8 51 Hash string 52 } 53 spec, err := ReadSpec(solidity.Abi_EventEmitter) 54 require.NoError(t, err) 55 56 eventSpec := spec.EventsByName["ManyTypes"] 57 58 dir := make([]byte, 32) 59 copy(dir, "frogs") 60 bignum := big.NewInt(1000) 61 in := args{ 62 Direction: dir, 63 Trueism: false, 64 German: "foo", 65 NewDepth: bignum, 66 Bignum: 100, 67 Hash: "ba", 68 } 69 topics, data, err := PackEvent(eventSpec, in) 70 require.NoError(t, err) 71 72 out := new(args) 73 err = UnpackEvent(eventSpec, topics, data, out) 74 require.NoError(t, err) 75 }) 76 77 } 78 79 func splatPtr(v interface{}) []interface{} { 80 rv := reflect.ValueOf(v).Elem() 81 82 vals := make([]interface{}, rv.NumField()) 83 for i := 0; i < rv.NumField(); i++ { 84 vals[i] = rv.Field(i).Addr().Interface() 85 } 86 87 return vals 88 } 89 90 func splat(v interface{}) []interface{} { 91 rv := reflect.ValueOf(v).Elem() 92 93 vals := make([]interface{}, rv.NumField()) 94 for i := 0; i < rv.NumField(); i++ { 95 vals[i] = rv.Field(i).Interface() 96 } 97 98 return vals 99 }