github.com/arieschain/arieschain@v0.0.0-20191023063405-37c074544356/accounts/abi/bind/util_test.go (about)

     1  package bind_test
     2  
     3  import (
     4  	"context"
     5  	"math/big"
     6  	"testing"
     7  	"time"
     8  
     9  	"github.com/quickchainproject/quickchain/accounts/abi/bind"
    10  	"github.com/quickchainproject/quickchain/accounts/abi/bind/backends"
    11  	"github.com/quickchainproject/quickchain/common"
    12  	"github.com/quickchainproject/quickchain/core"
    13  	"github.com/quickchainproject/quickchain/core/types"
    14  	"github.com/quickchainproject/quickchain/crypto"
    15  )
    16  
    17  var testKey, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291")
    18  
    19  var waitDeployedTests = map[string]struct {
    20  	code        string
    21  	gas         uint64
    22  	wantAddress common.Address
    23  	wantErr     error
    24  }{
    25  	"successful deploy": {
    26  		code:        `6060604052600a8060106000396000f360606040526008565b00`,
    27  		gas:         3000000,
    28  		wantAddress: common.HexToAddress("0x3a220f351252089d385b29beca14e27f204c296a"),
    29  	},
    30  	"empty code": {
    31  		code:        ``,
    32  		gas:         300000,
    33  		wantErr:     bind.ErrNoCodeAfterDeploy,
    34  		wantAddress: common.HexToAddress("0x3a220f351252089d385b29beca14e27f204c296a"),
    35  	},
    36  }
    37  
    38  func TestWaitDeployed(t *testing.T) {
    39  	for name, test := range waitDeployedTests {
    40  		backend := backends.NewSimulatedBackend(core.GenesisAlloc{
    41  			crypto.PubkeyToAddress(testKey.PublicKey): {Balance: big.NewInt(10000000000)},
    42  		})
    43  
    44  		// Create the transaction.
    45  		tx := types.NewContractCreation(0, big.NewInt(0), test.gas, big.NewInt(1), common.FromHex(test.code))
    46  		tx, _ = types.SignTx(tx, types.HomesteadSigner{}, testKey)
    47  
    48  		// Wait for it to get mined in the background.
    49  		var (
    50  			err     error
    51  			address common.Address
    52  			mined   = make(chan struct{})
    53  			ctx     = context.Background()
    54  		)
    55  		go func() {
    56  			address, err = bind.WaitDeployed(ctx, backend, tx)
    57  			close(mined)
    58  		}()
    59  
    60  		// Send and mine the transaction.
    61  		backend.SendTransaction(ctx, tx)
    62  		backend.Commit()
    63  
    64  		select {
    65  		case <-mined:
    66  			if err != test.wantErr {
    67  				t.Errorf("test %q: error mismatch: got %q, want %q", name, err, test.wantErr)
    68  			}
    69  			if address != test.wantAddress {
    70  				t.Errorf("test %q: unexpected contract address %s", name, address.Hex())
    71  			}
    72  		case <-time.After(2 * time.Second):
    73  			t.Errorf("test %q: timeout", name)
    74  		}
    75  	}
    76  }