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

     1  package exported
     2  
     3  import (
     4  	"reflect"
     5  	goruntime "runtime"
     6  	"strings"
     7  	"testing"
     8  
     9  	"github.com/filecoin-project/go-state-types/abi"
    10  	"github.com/filecoin-project/specs-actors/v4/actors/builtin"
    11  	"github.com/filecoin-project/specs-actors/v4/actors/builtin/account"
    12  	"github.com/filecoin-project/specs-actors/v4/actors/builtin/cron"
    13  	init_ "github.com/filecoin-project/specs-actors/v4/actors/builtin/init"
    14  	"github.com/filecoin-project/specs-actors/v4/actors/builtin/market"
    15  	"github.com/filecoin-project/specs-actors/v4/actors/builtin/miner"
    16  	"github.com/filecoin-project/specs-actors/v4/actors/builtin/multisig"
    17  	"github.com/filecoin-project/specs-actors/v4/actors/builtin/paych"
    18  	"github.com/filecoin-project/specs-actors/v4/actors/builtin/power"
    19  	"github.com/filecoin-project/specs-actors/v4/actors/builtin/reward"
    20  	"github.com/filecoin-project/specs-actors/v4/actors/builtin/system"
    21  	"github.com/filecoin-project/specs-actors/v4/actors/builtin/verifreg"
    22  	"github.com/filecoin-project/specs-actors/v4/actors/runtime"
    23  	"github.com/ipfs/go-cid"
    24  
    25  	"github.com/stretchr/testify/require"
    26  )
    27  
    28  func TestKnownActors(t *testing.T) {
    29  	// Test all known actors. This ensures we:
    30  	// * Export all the right actors.
    31  	// * Don't get any method mismatches.
    32  
    33  	// We can't test this in the builtin package due to cyclic imports, so
    34  	// we test it here.
    35  	builtins := BuiltinActors()
    36  	actorInfos := []struct {
    37  		actor   runtime.VMActor
    38  		code    cid.Cid
    39  		methods interface{}
    40  	}{
    41  		{account.Actor{}, builtin.AccountActorCodeID, builtin.MethodsAccount},
    42  		{cron.Actor{}, builtin.CronActorCodeID, builtin.MethodsCron},
    43  		{init_.Actor{}, builtin.InitActorCodeID, builtin.MethodsInit},
    44  		{market.Actor{}, builtin.StorageMarketActorCodeID, builtin.MethodsMarket},
    45  		{miner.Actor{}, builtin.StorageMinerActorCodeID, builtin.MethodsMiner},
    46  		{multisig.Actor{}, builtin.MultisigActorCodeID, builtin.MethodsMultisig},
    47  		{paych.Actor{}, builtin.PaymentChannelActorCodeID, builtin.MethodsPaych},
    48  		{power.Actor{}, builtin.StoragePowerActorCodeID, builtin.MethodsPower},
    49  		{reward.Actor{}, builtin.RewardActorCodeID, builtin.MethodsReward},
    50  		{system.Actor{}, builtin.SystemActorCodeID, nil},
    51  		{verifreg.Actor{}, builtin.VerifiedRegistryActorCodeID, builtin.MethodsVerifiedRegistry},
    52  	}
    53  	require.Equal(t, len(builtins), len(actorInfos))
    54  	for i, info := range actorInfos {
    55  		// check exported actors.
    56  		require.Equal(t, info.actor, builtins[i])
    57  
    58  		// check codes.
    59  		require.Equal(t, info.code, info.actor.Code())
    60  
    61  		// check methods.
    62  		exports := info.actor.Exports()
    63  		if info.methods == nil {
    64  			continue
    65  		}
    66  		methodsVal := reflect.ValueOf(info.methods)
    67  		methodsTyp := methodsVal.Type()
    68  		require.Equal(t, len(exports)-1, methodsVal.NumField())
    69  		require.Nil(t, exports[0]) // send.
    70  		for i, m := range exports {
    71  			if i == 0 {
    72  				// send
    73  				require.Nil(t, m)
    74  				continue
    75  			}
    76  			expectedVal := methodsVal.Field(i - 1)
    77  			expectedName := methodsTyp.Field(i - 1).Name
    78  
    79  			require.Equal(t, expectedVal.Interface().(abi.MethodNum), abi.MethodNum(i))
    80  
    81  			if m == nil {
    82  				// not send, must be deprecated.
    83  				require.True(t, strings.HasPrefix(expectedName, "Deprecated"))
    84  				continue
    85  			}
    86  
    87  			name := goruntime.FuncForPC(reflect.ValueOf(m).Pointer()).Name()
    88  			name = strings.TrimSuffix(name, "-fm")
    89  			lastDot := strings.LastIndexByte(name, '.')
    90  			name = name[lastDot+1:]
    91  			require.Equal(t, expectedName, name)
    92  		}
    93  	}
    94  }