mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-05-18 22:09:26 +00:00
accounts/abi/bind: fix data race in TestWaitDeployedCornerCases (#32740)
Fixes race in WaitDeploy test where the backend is closed before goroutine using it wraps up. --------- Co-authored-by: lightclient <lightclient@protonmail.com>
This commit is contained in:
parent
1c706d1571
commit
7611f351c1
1 changed files with 42 additions and 19 deletions
|
|
@ -100,22 +100,29 @@ func TestWaitDeployed(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestWaitDeployedCornerCases(t *testing.T) {
|
func TestWaitDeployedCornerCases(t *testing.T) {
|
||||||
backend := simulated.NewBackend(
|
var (
|
||||||
types.GenesisAlloc{
|
backend = simulated.NewBackend(
|
||||||
crypto.PubkeyToAddress(testKey.PublicKey): {Balance: big.NewInt(10000000000000000)},
|
types.GenesisAlloc{
|
||||||
},
|
crypto.PubkeyToAddress(testKey.PublicKey): {Balance: big.NewInt(10000000000000000)},
|
||||||
|
},
|
||||||
|
)
|
||||||
|
head, _ = backend.Client().HeaderByNumber(t.Context(), nil) // Should be child's, good enough
|
||||||
|
gasPrice = new(big.Int).Add(head.BaseFee, big.NewInt(1))
|
||||||
|
signer = types.LatestSigner(params.AllDevChainProtocolChanges)
|
||||||
|
code = common.FromHex("6060604052600a8060106000396000f360606040526008565b00")
|
||||||
|
ctx, cancel = context.WithCancel(t.Context())
|
||||||
)
|
)
|
||||||
defer backend.Close()
|
defer backend.Close()
|
||||||
|
|
||||||
head, _ := backend.Client().HeaderByNumber(context.Background(), nil) // Should be child's, good enough
|
// 1. WaitDeploy on a transaction that does not deploy a contract, verify it
|
||||||
gasPrice := new(big.Int).Add(head.BaseFee, big.NewInt(1))
|
// returns an error.
|
||||||
|
tx := types.MustSignNewTx(testKey, signer, &types.LegacyTx{
|
||||||
// Create a transaction to an account.
|
Nonce: 0,
|
||||||
code := "6060604052600a8060106000396000f360606040526008565b00"
|
To: &common.Address{0x01},
|
||||||
tx := types.NewTransaction(0, common.HexToAddress("0x01"), big.NewInt(0), 3000000, gasPrice, common.FromHex(code))
|
Gas: 300000,
|
||||||
tx, _ = types.SignTx(tx, types.LatestSigner(params.AllDevChainProtocolChanges), testKey)
|
GasPrice: gasPrice,
|
||||||
ctx, cancel := context.WithCancel(context.Background())
|
Data: code,
|
||||||
defer cancel()
|
})
|
||||||
if err := backend.Client().SendTransaction(ctx, tx); err != nil {
|
if err := backend.Client().SendTransaction(ctx, tx); err != nil {
|
||||||
t.Errorf("failed to send transaction: %q", err)
|
t.Errorf("failed to send transaction: %q", err)
|
||||||
}
|
}
|
||||||
|
|
@ -124,14 +131,23 @@ func TestWaitDeployedCornerCases(t *testing.T) {
|
||||||
t.Errorf("error mismatch: want %q, got %q, ", bind.ErrNoAddressInReceipt, err)
|
t.Errorf("error mismatch: want %q, got %q, ", bind.ErrNoAddressInReceipt, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create a transaction that is not mined.
|
// 2. Create a contract, but cancel the WaitDeploy before it is mined.
|
||||||
tx = types.NewContractCreation(1, big.NewInt(0), 3000000, gasPrice, common.FromHex(code))
|
tx = types.MustSignNewTx(testKey, signer, &types.LegacyTx{
|
||||||
tx, _ = types.SignTx(tx, types.LatestSigner(params.AllDevChainProtocolChanges), testKey)
|
Nonce: 1,
|
||||||
|
Gas: 300000,
|
||||||
|
GasPrice: gasPrice,
|
||||||
|
Data: code,
|
||||||
|
})
|
||||||
|
|
||||||
|
// Wait in another thread so that we can quickly cancel it after submitting
|
||||||
|
// the transaction.
|
||||||
|
done := make(chan struct{})
|
||||||
go func() {
|
go func() {
|
||||||
contextCanceled := errors.New("context canceled")
|
defer close(done)
|
||||||
if _, err := bind.WaitDeployed(ctx, backend.Client(), tx.Hash()); err.Error() != contextCanceled.Error() {
|
want := errors.New("context canceled")
|
||||||
t.Errorf("error mismatch: want %q, got %q, ", contextCanceled, err)
|
_, err := bind.WaitDeployed(ctx, backend.Client(), tx.Hash())
|
||||||
|
if err == nil || errors.Is(want, err) {
|
||||||
|
t.Errorf("error mismatch: want %v, got %v", want, err)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
|
@ -139,4 +155,11 @@ func TestWaitDeployedCornerCases(t *testing.T) {
|
||||||
t.Errorf("failed to send transaction: %q", err)
|
t.Errorf("failed to send transaction: %q", err)
|
||||||
}
|
}
|
||||||
cancel()
|
cancel()
|
||||||
|
|
||||||
|
// Wait for goroutine to exit or for a timeout.
|
||||||
|
select {
|
||||||
|
case <-done:
|
||||||
|
case <-time.After(time.Second * 2):
|
||||||
|
t.Fatalf("failed to cancel wait deploy")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue