github.com/filecoin-project/specs-actors/v4@v4.0.2/actors/builtin/account/account_test.go (about)

     1  package account_test
     2  
     3  import (
     4  	"strings"
     5  	"testing"
     6  
     7  	"github.com/filecoin-project/go-address"
     8  	"github.com/filecoin-project/go-state-types/exitcode"
     9  	"github.com/stretchr/testify/assert"
    10  	"github.com/stretchr/testify/require"
    11  
    12  	"github.com/filecoin-project/specs-actors/v4/actors/builtin"
    13  	"github.com/filecoin-project/specs-actors/v4/actors/builtin/account"
    14  	"github.com/filecoin-project/specs-actors/v4/support/mock"
    15  	tutil "github.com/filecoin-project/specs-actors/v4/support/testing"
    16  )
    17  
    18  type constructorTestCase struct {
    19  	desc     string
    20  	addr     address.Address
    21  	exitCode exitcode.ExitCode
    22  }
    23  
    24  func TestExports(t *testing.T) {
    25  	mock.CheckActorExports(t, account.Actor{})
    26  }
    27  
    28  func TestAccountactor(t *testing.T) {
    29  	actor := account.Actor{}
    30  
    31  	receiver := tutil.NewIDAddr(t, 100)
    32  	builder := mock.NewBuilder(receiver).WithCaller(builtin.SystemActorAddr, builtin.SystemActorCodeID)
    33  
    34  	testCases := []constructorTestCase{
    35  		{
    36  			desc:     "happy path construct SECP256K1 address",
    37  			addr:     tutil.NewSECP256K1Addr(t, "secpaddress"),
    38  			exitCode: exitcode.Ok,
    39  		},
    40  		{
    41  			desc:     "happy path construct BLS address",
    42  			addr:     tutil.NewBLSAddr(t, 1),
    43  			exitCode: exitcode.Ok,
    44  		},
    45  		{
    46  			desc:     "fail to construct account actor using ID address",
    47  			addr:     tutil.NewIDAddr(t, 1),
    48  			exitCode: exitcode.ErrIllegalArgument,
    49  		},
    50  		{
    51  			desc:     "fail to construct account actor using Actor address",
    52  			addr:     tutil.NewActorAddr(t, "actoraddress"),
    53  			exitCode: exitcode.ErrIllegalArgument,
    54  		},
    55  	}
    56  	for _, tc := range testCases {
    57  		t.Run(tc.desc, func(t *testing.T) {
    58  			rt := builder.Build(t)
    59  			rt.ExpectValidateCallerAddr(builtin.SystemActorAddr)
    60  
    61  			if tc.exitCode.IsSuccess() {
    62  				rt.Call(actor.Constructor, &tc.addr)
    63  
    64  				var st account.State
    65  				rt.GetState(&st)
    66  				assert.Equal(t, tc.addr, st.Address)
    67  
    68  				rt.ExpectValidateCallerAny()
    69  				pubkeyAddress := rt.Call(actor.PubkeyAddress, nil).(*address.Address)
    70  				assert.Equal(t, &tc.addr, pubkeyAddress)
    71  
    72  				checkState(t, rt)
    73  			} else {
    74  				rt.ExpectAbort(tc.exitCode, func() {
    75  					rt.Call(actor.Constructor, &tc.addr)
    76  				})
    77  			}
    78  			rt.Verify()
    79  		})
    80  	}
    81  }
    82  
    83  func checkState(t *testing.T, rt *mock.Runtime) {
    84  	testAddress, err := address.NewIDAddress(1000)
    85  	require.NoError(t, err)
    86  	var st account.State
    87  	rt.GetState(&st)
    88  	_, msgs := account.CheckStateInvariants(&st, testAddress)
    89  	assert.True(t, msgs.IsEmpty(), strings.Join(msgs.Messages(), "\n"))
    90  }