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  }