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 }