diff options
Diffstat (limited to 'les/handler_test.go')
-rw-r--r-- | les/handler_test.go | 47 |
1 files changed, 29 insertions, 18 deletions
diff --git a/les/handler_test.go b/les/handler_test.go index a094cdc84..9e63e15a6 100644 --- a/les/handler_test.go +++ b/les/handler_test.go @@ -20,8 +20,8 @@ import ( "bytes" "math/big" "math/rand" - "runtime" "testing" + "time" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" @@ -423,7 +423,7 @@ func TestTransactionStatusLes2(t *testing.T) { var reqID uint64 - test := func(tx *types.Transaction, send bool, expStatus core.TxStatusData) { + test := func(tx *types.Transaction, send bool, expStatus txStatus) { reqID++ if send { cost := peer.GetRequestCost(SendTxV2Msg, 1) @@ -432,7 +432,7 @@ func TestTransactionStatusLes2(t *testing.T) { cost := peer.GetRequestCost(GetTxStatusMsg, 1) sendRequest(peer.app, GetTxStatusMsg, reqID, cost, []common.Hash{tx.Hash()}) } - if err := expectResponse(peer.app, TxStatusMsg, reqID, testBufLimit, []core.TxStatusData{expStatus}); err != nil { + if err := expectResponse(peer.app, TxStatusMsg, reqID, testBufLimit, []txStatus{expStatus}); err != nil { t.Errorf("transaction status mismatch") } } @@ -441,20 +441,20 @@ func TestTransactionStatusLes2(t *testing.T) { // test error status by sending an underpriced transaction tx0, _ := types.SignTx(types.NewTransaction(0, acc1Addr, big.NewInt(10000), bigTxGas, nil, nil), signer, testBankKey) - test(tx0, true, core.TxStatusData{Status: core.TxStatusError, Data: []byte("transaction underpriced")}) + test(tx0, true, txStatus{Status: core.TxStatusUnknown, Error: core.ErrUnderpriced}) tx1, _ := types.SignTx(types.NewTransaction(0, acc1Addr, big.NewInt(10000), bigTxGas, big.NewInt(100000000000), nil), signer, testBankKey) - test(tx1, false, core.TxStatusData{Status: core.TxStatusUnknown}) // query before sending, should be unknown - test(tx1, true, core.TxStatusData{Status: core.TxStatusPending}) // send valid processable tx, should return pending - test(tx1, true, core.TxStatusData{Status: core.TxStatusPending}) // adding it again should not return an error + test(tx1, false, txStatus{Status: core.TxStatusUnknown}) // query before sending, should be unknown + test(tx1, true, txStatus{Status: core.TxStatusPending}) // send valid processable tx, should return pending + test(tx1, true, txStatus{Status: core.TxStatusPending}) // adding it again should not return an error tx2, _ := types.SignTx(types.NewTransaction(1, acc1Addr, big.NewInt(10000), bigTxGas, big.NewInt(100000000000), nil), signer, testBankKey) tx3, _ := types.SignTx(types.NewTransaction(2, acc1Addr, big.NewInt(10000), bigTxGas, big.NewInt(100000000000), nil), signer, testBankKey) // send transactions in the wrong order, tx3 should be queued - test(tx3, true, core.TxStatusData{Status: core.TxStatusQueued}) - test(tx2, true, core.TxStatusData{Status: core.TxStatusPending}) + test(tx3, true, txStatus{Status: core.TxStatusQueued}) + test(tx2, true, txStatus{Status: core.TxStatusPending}) // query again, now tx3 should be pending too - test(tx3, false, core.TxStatusData{Status: core.TxStatusPending}) + test(tx3, false, txStatus{Status: core.TxStatusPending}) // generate and add a block with tx1 and tx2 included gchain, _ := core.GenerateChain(params.TestChainConfig, chain.GetBlockByNumber(0), db, 1, func(i int, block *core.BlockGen) { @@ -464,13 +464,21 @@ func TestTransactionStatusLes2(t *testing.T) { if _, err := chain.InsertChain(gchain); err != nil { panic(err) } + // wait until TxPool processes the inserted block + for i := 0; i < 10; i++ { + if pending, _ := txpool.Stats(); pending == 1 { + break + } + time.Sleep(100 * time.Millisecond) + } + if pending, _ := txpool.Stats(); pending != 1 { + t.Fatalf("pending count mismatch: have %d, want 1", pending) + } // check if their status is included now block1hash := core.GetCanonicalHash(db, 1) - tx1pos, _ := rlp.EncodeToBytes(core.TxLookupEntry{BlockHash: block1hash, BlockIndex: 1, Index: 0}) - tx2pos, _ := rlp.EncodeToBytes(core.TxLookupEntry{BlockHash: block1hash, BlockIndex: 1, Index: 1}) - test(tx1, false, core.TxStatusData{Status: core.TxStatusIncluded, Data: tx1pos}) - test(tx2, false, core.TxStatusData{Status: core.TxStatusIncluded, Data: tx2pos}) + test(tx1, false, txStatus{Status: core.TxStatusIncluded, Lookup: &core.TxLookupEntry{BlockHash: block1hash, BlockIndex: 1, Index: 0}}) + test(tx2, false, txStatus{Status: core.TxStatusIncluded, Lookup: &core.TxLookupEntry{BlockHash: block1hash, BlockIndex: 1, Index: 1}}) // create a reorg that rolls them back gchain, _ = core.GenerateChain(params.TestChainConfig, chain.GetBlockByNumber(0), db, 2, func(i int, block *core.BlockGen) {}) @@ -478,13 +486,16 @@ func TestTransactionStatusLes2(t *testing.T) { panic(err) } // wait until TxPool processes the reorg - for { + for i := 0; i < 10; i++ { if pending, _ := txpool.Stats(); pending == 3 { break } - runtime.Gosched() + time.Sleep(100 * time.Millisecond) + } + if pending, _ := txpool.Stats(); pending != 3 { + t.Fatalf("pending count mismatch: have %d, want 3", pending) } // check if their status is pending again - test(tx1, false, core.TxStatusData{Status: core.TxStatusPending}) - test(tx2, false, core.TxStatusData{Status: core.TxStatusPending}) + test(tx1, false, txStatus{Status: core.TxStatusPending}) + test(tx2, false, txStatus{Status: core.TxStatusPending}) } |