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  }