github.com/filecoin-project/specs-actors/v4@v4.0.2/support/mock/builder.go (about) 1 package mock 2 3 import ( 4 "context" 5 "testing" 6 7 addr "github.com/filecoin-project/go-address" 8 "github.com/filecoin-project/go-state-types/abi" 9 "github.com/filecoin-project/go-state-types/network" 10 "github.com/ipfs/go-cid" 11 "github.com/minio/blake2b-simd" 12 ) 13 14 // Build for fluent initialization of a mock runtime. 15 type RuntimeBuilder struct { 16 options []func(rt *Runtime) 17 } 18 19 // Initializes a new builder with a receiving actor address. 20 func NewBuilder(receiver addr.Address) RuntimeBuilder { 21 var b RuntimeBuilder 22 b.add(func(rt *Runtime) { 23 rt.receiver = receiver 24 }) 25 return b 26 } 27 28 // Builds a new runtime object with the configured values. 29 func (b RuntimeBuilder) Build(t testing.TB) *Runtime { 30 ctx, cancel := context.WithCancel(context.Background()) 31 t.Cleanup(cancel) 32 33 m := &Runtime{ 34 ctx: ctx, 35 epoch: 0, 36 networkVersion: network.VersionMax, 37 caller: addr.Address{}, 38 callerType: cid.Undef, 39 miner: addr.Address{}, 40 idAddresses: make(map[addr.Address]addr.Address), 41 circulatingSupply: abi.NewTokenAmount(0), 42 43 state: cid.Undef, 44 store: make(map[cid.Cid][]byte), 45 hashfunc: blake2b.Sum256, 46 47 balance: abi.NewTokenAmount(0), 48 valueReceived: abi.NewTokenAmount(0), 49 50 actorCodeCIDs: make(map[addr.Address]cid.Cid), 51 newActorAddr: addr.Undef, 52 53 t: t, 54 expectValidateCallerAny: false, 55 expectValidateCallerAddr: nil, 56 expectValidateCallerType: nil, 57 expectCreateActor: nil, 58 59 expectSends: make([]*expectedMessage, 0), 60 expectVerifySigs: make([]*expectVerifySig, 0), 61 } 62 for _, opt := range b.options { 63 opt(m) 64 } 65 return m 66 } 67 68 func (b *RuntimeBuilder) add(cb func(*Runtime)) { 69 b.options = append(b.options, cb) 70 } 71 72 func (b RuntimeBuilder) WithEpoch(epoch abi.ChainEpoch) RuntimeBuilder { 73 b.add(func(rt *Runtime) { 74 rt.epoch = epoch 75 }) 76 return b 77 } 78 79 func (b RuntimeBuilder) WithCaller(address addr.Address, code cid.Cid) RuntimeBuilder { 80 b.add(func(rt *Runtime) { 81 rt.caller = address 82 rt.callerType = code 83 }) 84 return b 85 } 86 87 func (b RuntimeBuilder) WithMiner(miner addr.Address) RuntimeBuilder { 88 b.add(func(rt *Runtime) { 89 rt.miner = miner 90 }) 91 return b 92 } 93 94 func (b RuntimeBuilder) WithBalance(balance, received abi.TokenAmount) RuntimeBuilder { 95 b.add(func(rt *Runtime) { 96 rt.balance = balance 97 rt.valueReceived = received 98 }) 99 return b 100 } 101 102 func (b RuntimeBuilder) WithNetworkVersion(version network.Version) RuntimeBuilder { 103 b.add(func(rt *Runtime) { 104 rt.networkVersion = version 105 }) 106 return b 107 } 108 109 func (b RuntimeBuilder) WithActorType(addr addr.Address, code cid.Cid) RuntimeBuilder { 110 b.add(func(rt *Runtime) { 111 rt.actorCodeCIDs[addr] = code 112 }) 113 return b 114 } 115 116 func (b RuntimeBuilder) WithHasher(f func(data []byte) [32]byte) RuntimeBuilder { 117 b.add(func(rt *Runtime) { 118 rt.hashfunc = f 119 }) 120 return b 121 }