From 5e7e1f1374a830d5ffb25311be1a12577b735bf5 Mon Sep 17 00:00:00 2001 From: Makis Christou Date: Tue, 12 Dec 2023 14:10:29 +0200 Subject: [PATCH 1/7] Add raw.go test file --- block/raw_test.go | 147 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 147 insertions(+) create mode 100644 block/raw_test.go diff --git a/block/raw_test.go b/block/raw_test.go new file mode 100644 index 000000000..17a4bf455 --- /dev/null +++ b/block/raw_test.go @@ -0,0 +1,147 @@ +package block + +import ( + "log" + "math/rand" + "testing" + "time" + + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/rlp" + "github.com/vechain/thor/thor" + "github.com/vechain/thor/tx" +) + +var invalidData = []byte{0x1a, 0x2b, 0x3c, 0x4d, 0x5e, 0x6f, 0x70, 0x81, 0x92, 0xa3} + +func getMockHeader() Header { + // Create a mock valid header + var header Header + header.body.ParentID = thor.Bytes32{} + header.body.Timestamp = 1234567890 + header.body.GasLimit = 1000000 + + // Example address string + addressStr := "0x8eaD0E8FEc8319Fd62C8508c71a90296EfD4F042" + + // Convert the string to a thor.Address + address, err := thor.ParseAddress(addressStr) + if err != nil { + log.Fatalf("Error parsing address: %v", err) + } + + header.body.Beneficiary = address + header.body.GasUsed = 12345 + header.body.TotalScore = 1234 + header.body.TxsRootFeatures.Root = thor.Bytes32{} + header.body.TxsRootFeatures.Features = 1234 + header.body.StateRoot = thor.Bytes32{} + header.body.ReceiptsRoot = thor.Bytes32{} + + // Example signature (replace with real signature logic if needed) + var sig [65]byte + rand.Read(sig[:]) + header.body.Signature = sig[:] + + header.body.Extension.Alpha = []byte{0x01, 0x02, 0x03, 0x04, 0x05} + header.body.Extension.COM = true + + return header +} + +// TestDecodeHeader tests the decoding of a block header from RLP data. +func TestRawDecodeHeader(t *testing.T) { + + header := getMockHeader() + + // Wrap the header in a slice + headers := []*Header{&header} + + // Encode the slice of headers to a byte array + encodedBytes, err := rlp.EncodeToBytes(headers) + if err != nil { + t.Fatalf("Failed to encode header list: %v", err) + } + + // Output the encoded bytes for verification or further use + t.Logf("Encoded Header: %x", encodedBytes) + + raw := Raw(encodedBytes) + result, err := raw.DecodeHeader() + if err != nil { + t.Fatalf("DecodeHeader failed: %v", err) + } + + t.Logf("Result 0x%x", result) +} + +// TestDecodeHeaderWithError tests the DecodeHeader method with invalid data. +func TestRawDecodeHeaderWithError(t *testing.T) { + raw := Raw(invalidData) + _, err := raw.DecodeHeader() + if err == nil { + t.Fatal("DecodeHeader should have failed but it did not") + } +} + +// getMockBlock creates and returns a mock block for testing purposes. +func getMockBlock() *Block { + tx1 := new(tx.Builder).Clause(tx.NewClause(&thor.Address{})).Clause(tx.NewClause(&thor.Address{})).Build() + tx2 := new(tx.Builder).Clause(tx.NewClause(nil)).Build() + + privKey := string("dce1443bd2ef0c2631adc1c67e5c93f13dc23a41c18b536effbbdcbcdb96fb65") + + now := uint64(time.Now().UnixNano()) + + var ( + gasUsed uint64 = 1000 + gasLimit uint64 = 14000 + totalScore uint64 = 101 + emptyRoot thor.Bytes32 = thor.BytesToBytes32([]byte("0")) + beneficiary thor.Address = thor.BytesToAddress([]byte("abc")) + ) + + block := new(Builder). + GasUsed(gasUsed). + Transaction(tx1). + Transaction(tx2). + GasLimit(gasLimit). + TotalScore(totalScore). + StateRoot(emptyRoot). + ReceiptsRoot(emptyRoot). + Timestamp(now). + ParentID(emptyRoot). + Beneficiary(beneficiary). + Build() + + key, _ := crypto.HexToECDSA(privKey) + sig, _ := crypto.Sign(block.Header().SigningHash().Bytes(), key) + + return block.WithSignature(sig) +} + +// TestDecodeBody tests the decoding of a block body from RLP data. +func TestRawDecodeBody(t *testing.T) { + + block := getMockBlock() + + encodedBytes, err := rlp.EncodeToBytes(block) + if err != nil { + t.Fatal(err) + } + + raw := Raw(encodedBytes) + _, err = raw.DecodeBody() + if err != nil { + t.Fatalf("DecodeBody failed: %v", err) + } +} + +// TestDecodeBodyWithError tests the DecodeBody method with invalid data. +func TestRawDecodeBodyWithError(t *testing.T) { + raw := Raw(invalidData) + _, err := raw.DecodeBody() + if err == nil { + t.Fatal("DecodeBody should have failed but it did not") + } +} From 5a93bfdbc9cb2a64b897ce8eaed03d6d346c2850 Mon Sep 17 00:00:00 2001 From: Makis Christou Date: Tue, 2 Jan 2024 13:37:00 +0200 Subject: [PATCH 2/7] Add Txpool tests and refactor NewDevnet to take a timestamp --- Makefile | 2 +- api/accounts/accounts_test.go | 2 +- api/blocks/blocks_test.go | 2 +- api/debug/debug.go | 2 +- api/node/node_test.go | 2 +- api/transactions/transactions_test.go | 2 +- block/raw_test.go | 147 ------------------- builtin/native_calls_test.go | 8 +- chain/repository_test.go | 4 +- cmd/thor/main.go | 2 +- genesis/devnet.go | 3 +- packer/packer_test.go | 4 +- poa/seed_test.go | 2 +- runtime/resolved_tx_test.go | 2 +- runtime/runtime_test.go | 10 +- txpool/blocklist_test.go | 165 +++++++++++++++++++++ txpool/tx_object_map_test.go | 61 ++++++++ txpool/tx_object_test.go | 37 ++++- txpool/tx_pool_test.go | 199 ++++++++++++++++++++++++++ 19 files changed, 484 insertions(+), 172 deletions(-) delete mode 100644 block/raw_test.go create mode 100644 txpool/blocklist_test.go diff --git a/Makefile b/Makefile index 1b327143d..60e01cee8 100644 --- a/Makefile +++ b/Makefile @@ -49,4 +49,4 @@ test:| go_version_check test-coverage:| go_version_check @go test -race -coverprofile=coverage.out -covermode=atomic $(PACKAGES) - + @go tool cover -html=coverage.out diff --git a/api/accounts/accounts_test.go b/api/accounts/accounts_test.go index 98338c83d..e6a51a0b8 100644 --- a/api/accounts/accounts_test.go +++ b/api/accounts/accounts_test.go @@ -176,7 +176,7 @@ func getStorage(t *testing.T) { func initAccountServer(t *testing.T) { db := muxdb.NewMem() stater := state.NewStater(db) - gene := genesis.NewDevnet() + gene := genesis.NewDevnet(uint64(1526400000)) b, _, _, err := gene.Build(stater) if err != nil { diff --git a/api/blocks/blocks_test.go b/api/blocks/blocks_test.go index 941fbb1b6..8628c9217 100644 --- a/api/blocks/blocks_test.go +++ b/api/blocks/blocks_test.go @@ -76,7 +76,7 @@ func TestBlock(t *testing.T) { func initBlockServer(t *testing.T) { db := muxdb.NewMem() stater := state.NewStater(db) - gene := genesis.NewDevnet() + gene := genesis.NewDevnet(uint64(1526400000)) b, _, _, err := gene.Build(stater) if err != nil { diff --git a/api/debug/debug.go b/api/debug/debug.go index 073d94baf..304d13c50 100644 --- a/api/debug/debug.go +++ b/api/debug/debug.go @@ -33,7 +33,7 @@ import ( "github.com/vechain/thor/v2/xenv" ) -var devNetGenesisID = genesis.NewDevnet().ID() +var devNetGenesisID = genesis.NewDevnet(uint64(1526400000)).ID() type Debug struct { repo *chain.Repository diff --git a/api/node/node_test.go b/api/node/node_test.go index 59ecb0de5..ae5ec28df 100644 --- a/api/node/node_test.go +++ b/api/node/node_test.go @@ -38,7 +38,7 @@ func TestNode(t *testing.T) { func initCommServer(t *testing.T) { db := muxdb.NewMem() stater := state.NewStater(db) - gene := genesis.NewDevnet() + gene := genesis.NewDevnet(uint64(1526400000)) b, _, _, err := gene.Build(stater) if err != nil { diff --git a/api/transactions/transactions_test.go b/api/transactions/transactions_test.go index d727562c7..8d3350cb3 100644 --- a/api/transactions/transactions_test.go +++ b/api/transactions/transactions_test.go @@ -122,7 +122,7 @@ func httpPost(t *testing.T, url string, obj interface{}) []byte { func initTransactionServer(t *testing.T) { db := muxdb.NewMem() stater := state.NewStater(db) - gene := genesis.NewDevnet() + gene := genesis.NewDevnet(uint64(1526400000)) b, _, _, err := gene.Build(stater) if err != nil { diff --git a/block/raw_test.go b/block/raw_test.go deleted file mode 100644 index 17a4bf455..000000000 --- a/block/raw_test.go +++ /dev/null @@ -1,147 +0,0 @@ -package block - -import ( - "log" - "math/rand" - "testing" - "time" - - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/rlp" - "github.com/vechain/thor/thor" - "github.com/vechain/thor/tx" -) - -var invalidData = []byte{0x1a, 0x2b, 0x3c, 0x4d, 0x5e, 0x6f, 0x70, 0x81, 0x92, 0xa3} - -func getMockHeader() Header { - // Create a mock valid header - var header Header - header.body.ParentID = thor.Bytes32{} - header.body.Timestamp = 1234567890 - header.body.GasLimit = 1000000 - - // Example address string - addressStr := "0x8eaD0E8FEc8319Fd62C8508c71a90296EfD4F042" - - // Convert the string to a thor.Address - address, err := thor.ParseAddress(addressStr) - if err != nil { - log.Fatalf("Error parsing address: %v", err) - } - - header.body.Beneficiary = address - header.body.GasUsed = 12345 - header.body.TotalScore = 1234 - header.body.TxsRootFeatures.Root = thor.Bytes32{} - header.body.TxsRootFeatures.Features = 1234 - header.body.StateRoot = thor.Bytes32{} - header.body.ReceiptsRoot = thor.Bytes32{} - - // Example signature (replace with real signature logic if needed) - var sig [65]byte - rand.Read(sig[:]) - header.body.Signature = sig[:] - - header.body.Extension.Alpha = []byte{0x01, 0x02, 0x03, 0x04, 0x05} - header.body.Extension.COM = true - - return header -} - -// TestDecodeHeader tests the decoding of a block header from RLP data. -func TestRawDecodeHeader(t *testing.T) { - - header := getMockHeader() - - // Wrap the header in a slice - headers := []*Header{&header} - - // Encode the slice of headers to a byte array - encodedBytes, err := rlp.EncodeToBytes(headers) - if err != nil { - t.Fatalf("Failed to encode header list: %v", err) - } - - // Output the encoded bytes for verification or further use - t.Logf("Encoded Header: %x", encodedBytes) - - raw := Raw(encodedBytes) - result, err := raw.DecodeHeader() - if err != nil { - t.Fatalf("DecodeHeader failed: %v", err) - } - - t.Logf("Result 0x%x", result) -} - -// TestDecodeHeaderWithError tests the DecodeHeader method with invalid data. -func TestRawDecodeHeaderWithError(t *testing.T) { - raw := Raw(invalidData) - _, err := raw.DecodeHeader() - if err == nil { - t.Fatal("DecodeHeader should have failed but it did not") - } -} - -// getMockBlock creates and returns a mock block for testing purposes. -func getMockBlock() *Block { - tx1 := new(tx.Builder).Clause(tx.NewClause(&thor.Address{})).Clause(tx.NewClause(&thor.Address{})).Build() - tx2 := new(tx.Builder).Clause(tx.NewClause(nil)).Build() - - privKey := string("dce1443bd2ef0c2631adc1c67e5c93f13dc23a41c18b536effbbdcbcdb96fb65") - - now := uint64(time.Now().UnixNano()) - - var ( - gasUsed uint64 = 1000 - gasLimit uint64 = 14000 - totalScore uint64 = 101 - emptyRoot thor.Bytes32 = thor.BytesToBytes32([]byte("0")) - beneficiary thor.Address = thor.BytesToAddress([]byte("abc")) - ) - - block := new(Builder). - GasUsed(gasUsed). - Transaction(tx1). - Transaction(tx2). - GasLimit(gasLimit). - TotalScore(totalScore). - StateRoot(emptyRoot). - ReceiptsRoot(emptyRoot). - Timestamp(now). - ParentID(emptyRoot). - Beneficiary(beneficiary). - Build() - - key, _ := crypto.HexToECDSA(privKey) - sig, _ := crypto.Sign(block.Header().SigningHash().Bytes(), key) - - return block.WithSignature(sig) -} - -// TestDecodeBody tests the decoding of a block body from RLP data. -func TestRawDecodeBody(t *testing.T) { - - block := getMockBlock() - - encodedBytes, err := rlp.EncodeToBytes(block) - if err != nil { - t.Fatal(err) - } - - raw := Raw(encodedBytes) - _, err = raw.DecodeBody() - if err != nil { - t.Fatalf("DecodeBody failed: %v", err) - } -} - -// TestDecodeBodyWithError tests the DecodeBody method with invalid data. -func TestRawDecodeBodyWithError(t *testing.T) { - raw := Raw(invalidData) - _, err := raw.DecodeBody() - if err == nil { - t.Fatal("DecodeBody should have failed but it did not") - } -} diff --git a/builtin/native_calls_test.go b/builtin/native_calls_test.go index 48d53d3f4..d2a400f8e 100644 --- a/builtin/native_calls_test.go +++ b/builtin/native_calls_test.go @@ -492,7 +492,7 @@ func TestPrototypeNative(t *testing.T) { ) db := muxdb.NewMem() - gene := genesis.NewDevnet() + gene := genesis.NewDevnet(uint64(1526400000)) genesisBlock, _, _, _ := gene.Build(state.NewStater(db)) repo, _ := chain.NewRepository(db, genesisBlock) st := state.New(db, genesisBlock.Header().StateRoot(), 0, 0, 0) @@ -766,7 +766,7 @@ func TestPrototypeNativeWithLongerBlockNumber(t *testing.T) { rand.Read(sig[:]) db := muxdb.NewMem() - gene := genesis.NewDevnet() + gene := genesis.NewDevnet(uint64(1526400000)) genesisBlock, _, _, _ := gene.Build(state.NewStater(db)) st := state.New(db, genesisBlock.Header().StateRoot(), 0, 0, 0) repo, _ := chain.NewRepository(db, genesisBlock) @@ -836,7 +836,7 @@ func TestPrototypeNativeWithBlockNumber(t *testing.T) { rand.Read(sig[:]) db := muxdb.NewMem() - gene := genesis.NewDevnet() + gene := genesis.NewDevnet(uint64(1526400000)) genesisBlock, _, _, _ := gene.Build(state.NewStater(db)) st := state.New(db, genesisBlock.Header().StateRoot(), 0, 0, 0) repo, _ := chain.NewRepository(db, genesisBlock) @@ -899,7 +899,7 @@ func newBlock(parent *block.Block, score uint64, timestamp uint64, privateKey *e func TestExtensionNative(t *testing.T) { db := muxdb.NewMem() st := state.New(db, thor.Bytes32{}, 0, 0, 0) - gene := genesis.NewDevnet() + gene := genesis.NewDevnet(uint64(1526400000)) genesisBlock, _, _, _ := gene.Build(state.NewStater(db)) repo, _ := chain.NewRepository(db, genesisBlock) st.SetCode(builtin.Extension.Address, builtin.Extension.V2.RuntimeBytecodes()) diff --git a/chain/repository_test.go b/chain/repository_test.go index b83f0a7f1..5e719803e 100644 --- a/chain/repository_test.go +++ b/chain/repository_test.go @@ -25,7 +25,7 @@ func M(args ...interface{}) []interface{} { func newTestRepo() (*muxdb.MuxDB, *Repository) { db := muxdb.NewMem() - g := genesis.NewDevnet() + g := genesis.NewDevnet(uint64(1526400000)) b0, _, _, _ := g.Build(state.NewStater(db)) repo, err := NewRepository(db, b0) @@ -60,7 +60,7 @@ func newBlock(parent *block.Block, ts uint64, txs ...*tx.Transaction) *block.Blo func TestRepository(t *testing.T) { db := muxdb.NewMem() - g := genesis.NewDevnet() + g := genesis.NewDevnet(uint64(1526400000)) b0, _, _, _ := g.Build(state.NewStater(db)) repo1, err := NewRepository(db, b0) diff --git a/cmd/thor/main.go b/cmd/thor/main.go index f18150fc9..018c7d2ae 100644 --- a/cmd/thor/main.go +++ b/cmd/thor/main.go @@ -245,7 +245,7 @@ func soloAction(ctx *cli.Context) error { defer func() { log.Info("exited") }() initLogger(ctx) - gene := genesis.NewDevnet() + gene := genesis.NewDevnet(uint64(1526400000)) // Solo forks from the start forkConfig := thor.ForkConfig{} diff --git a/genesis/devnet.go b/genesis/devnet.go index 77798968e..1627321a9 100644 --- a/genesis/devnet.go +++ b/genesis/devnet.go @@ -57,8 +57,7 @@ func DevAccounts() []DevAccount { } // NewDevnet create genesis for solo mode. -func NewDevnet() *Genesis { - launchTime := uint64(1526400000) // 'Wed May 16 2018 00:00:00 GMT+0800 (CST)' +func NewDevnet(launchTime uint64) *Genesis { executor := DevAccounts()[0].Address soloBlockSigner := DevAccounts()[0] diff --git a/packer/packer_test.go b/packer/packer_test.go index dc3188d44..24b6663b9 100644 --- a/packer/packer_test.go +++ b/packer/packer_test.go @@ -67,7 +67,7 @@ func (ti *txIterator) OnProcessed(txID thor.Bytes32, err error) { func TestP(t *testing.T) { db := muxdb.NewMem() - g := genesis.NewDevnet() + g := genesis.NewDevnet(uint64(1526400000)) b0, _, _, _ := g.Build(state.NewStater(db)) repo, _ := chain.NewRepository(db, b0) @@ -183,7 +183,7 @@ func TestForkVIP191(t *testing.T) { func TestBlocklist(t *testing.T) { db := muxdb.NewMem() - g := genesis.NewDevnet() + g := genesis.NewDevnet(uint64(1526400000)) b0, _, _, _ := g.Build(state.NewStater(db)) repo, _ := chain.NewRepository(db, b0) diff --git a/poa/seed_test.go b/poa/seed_test.go index 2d5192173..2b0056c54 100644 --- a/poa/seed_test.go +++ b/poa/seed_test.go @@ -24,7 +24,7 @@ import ( func TestSeeder_Generate(t *testing.T) { mockEpochInterval(10) db := muxdb.NewMem() - g := genesis.NewDevnet() + g := genesis.NewDevnet(uint64(1526400000)) b0, _, _, _ := g.Build(state.NewStater(db)) repo, err := chain.NewRepository(db, b0) diff --git a/runtime/resolved_tx_test.go b/runtime/resolved_tx_test.go index 07c846b94..c62235ac0 100644 --- a/runtime/resolved_tx_test.go +++ b/runtime/resolved_tx_test.go @@ -45,7 +45,7 @@ type testResolvedTransaction struct { func newTestResolvedTransaction(t *testing.T) (*testResolvedTransaction, error) { db := muxdb.NewMem() - gen := genesis.NewDevnet() + gen := genesis.NewDevnet(uint64(1526400000)) stater := state.NewStater(db) parent, _, _, err := gen.Build(stater) diff --git a/runtime/runtime_test.go b/runtime/runtime_test.go index b00c8a889..e0a33bb7d 100644 --- a/runtime/runtime_test.go +++ b/runtime/runtime_test.go @@ -31,7 +31,7 @@ func M(a ...interface{}) []interface{} { func TestContractSuicide(t *testing.T) { db := muxdb.NewMem() - g := genesis.NewDevnet() + g := genesis.NewDevnet(uint64(1526400000)) stater := state.NewStater(db) b0, _, _, err := g.Build(stater) assert.Nil(t, err) @@ -106,7 +106,7 @@ func TestContractSuicide(t *testing.T) { func TestChainID(t *testing.T) { db := muxdb.NewMem() - g := genesis.NewDevnet() + g := genesis.NewDevnet(uint64(1526400000)) stater := state.NewStater(db) b0, _, _, err := g.Build(stater) @@ -158,7 +158,7 @@ func TestChainID(t *testing.T) { func TestSelfBalance(t *testing.T) { db := muxdb.NewMem() - g := genesis.NewDevnet() + g := genesis.NewDevnet(uint64(1526400000)) stater := state.NewStater(db) b0, _, _, err := g.Build(stater) @@ -212,7 +212,7 @@ func TestSelfBalance(t *testing.T) { func TestBlake2(t *testing.T) { db := muxdb.NewMem() - g := genesis.NewDevnet() + g := genesis.NewDevnet(uint64(1526400000)) stater := state.NewStater(db) b0, _, _, err := g.Build(stater) @@ -341,7 +341,7 @@ func TestBlake2(t *testing.T) { func TestCall(t *testing.T) { db := muxdb.NewMem() - g := genesis.NewDevnet() + g := genesis.NewDevnet(uint64(1526400000)) b0, _, _, err := g.Build(state.NewStater(db)) assert.Nil(t, err) diff --git a/txpool/blocklist_test.go b/txpool/blocklist_test.go new file mode 100644 index 000000000..c1333323c --- /dev/null +++ b/txpool/blocklist_test.go @@ -0,0 +1,165 @@ +package txpool + +import ( + "context" + "fmt" + "net/http" + "net/http/httptest" + "os" + "strings" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/vechain/thor/v2/thor" +) + +// SetupTempFile creates a temporary file with dummy data and returns the file path. +func SetupTempFile(t *testing.T, dummyData string) string { + tempFile, err := os.CreateTemp("", "test_blocklist_*.txt") + if err != nil { + t.Fatalf("Failed to create temp file: %s", err) + } + testFilePath := tempFile.Name() + + err = os.WriteFile(testFilePath, []byte(dummyData), 0644) + if err != nil { + t.Fatalf("Failed to write to temp file: %s", err) + } + + // Close the file and return its path. + tempFile.Close() + return testFilePath +} + +func TestLoad(t *testing.T) { + dummyData := "0x25Df024637d4e56c1aE9563987Bf3e92C9f534c0\n0x25Df024637d4e56c1aE9563987Bf3e92C9f534c1" + testFilePath := SetupTempFile(t, dummyData) + + var bl blocklist + err := bl.Load(testFilePath) + if err != nil { + t.Errorf("Load failed: %s", err) + } + + // Clean up: delete the temporary file. + os.Remove(testFilePath) +} + +func TestLoadWithError(t *testing.T) { + + dummyData := "0x25Df024637d4\n0x25Df024637d4e56c1aE956" + testFilePath := SetupTempFile(t, dummyData) + + var bl blocklist + err := bl.Load(testFilePath) + assert.Equal(t, err.Error(), "invalid length") + assert.False(t, IsBadTx(err)) + assert.False(t, IsTxRejected(err)) + + // Clean up: delete the test file. + os.Remove(testFilePath) +} + +func TestSave(t *testing.T) { + dummyData := "0x25Df024637d4e56c1aE9563987Bf3e92C9f534c0\n0x25Df024637d4e56c1aE9563987Bf3e92C9f534c1" + testFilePath := SetupTempFile(t, dummyData) + + var bl blocklist + err := bl.Load(testFilePath) + if err != nil { + t.Errorf("Load failed: %s", err) + } + + // Clean up: delete the test file. + os.Remove(testFilePath) + + // Test the Load function. + err = bl.Save(testFilePath) + if err != nil { + t.Errorf("Load failed: %s", err) + } + + fileContents, err := os.ReadFile(testFilePath) + str := string(fileContents) + assert.True(t, strings.Contains(str, "0x25df024637d4e56c1ae9563987bf3e92c9f534c0")) + assert.True(t, strings.Contains(str, "0x25df024637d4e56c1ae9563987bf3e92c9f534c1")) + + // Clean up: delete the test file. + os.Remove(testFilePath) +} + +func TestLen(t *testing.T) { + dummyData := "0x25Df024637d4e56c1aE9563987Bf3e92C9f534c0\n0x25Df024637d4e56c1aE9563987Bf3e92C9f534c1" + testFilePath := SetupTempFile(t, dummyData) + + var bl blocklist + err := bl.Load(testFilePath) + if err != nil { + t.Errorf("Load failed: %s", err) + } + + // Clean up: delete the test file. + os.Remove(testFilePath) + + listLength := bl.Len() + assert.Equal(t, listLength, 2) +} + +func TestFetch(t *testing.T) { + // Example data to be served by the mock server + data := "0x25Df024637d4e56c1aE9563987Bf3e92C9f534c0\n0x25Df024637d4e56c1aE9563987Bf3e92C9f534c1" + + expectedAddresses := []thor.Address{ + thor.MustParseAddress("0x25Df024637d4e56c1aE9563987Bf3e92C9f534c0"), + thor.MustParseAddress("0x25Df024637d4e56c1aE9563987Bf3e92C9f534c1"), + } + + // Create a mock server + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + // You can check headers, methods, etc. here + if r.Header.Get("if-none-match") == "some-etag" { + w.WriteHeader(http.StatusNotModified) + return + } + fmt.Fprint(w, data) + })) + defer server.Close() + + // Test scenarios + tests := []struct { + name string + etag *string + wantErr bool + }{ + {"Successful Fetch", nil, false}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + var bl blocklist + bl.list = make(map[thor.Address]bool) + + // Set up ETAG if needed + if tt.etag != nil { + *tt.etag = "some-etag" + } + + // Call the Fetch function + err := bl.Fetch(context.Background(), server.URL, tt.etag) + + // Check for errors + if (err != nil) != tt.wantErr { + t.Errorf("Fetch() error = %v, wantErr %v", err, tt.wantErr) + return + } + + // Check if the blocklist contains the expected addresses + for _, addr := range expectedAddresses { + if _, exists := bl.list[addr]; !exists { + t.Errorf("Fetch() missing address %s", addr) + } + } + + }) + } +} diff --git a/txpool/tx_object_map_test.go b/txpool/tx_object_map_test.go index 0a1f58525..ae5c7dafa 100644 --- a/txpool/tx_object_map_test.go +++ b/txpool/tx_object_map_test.go @@ -12,9 +12,70 @@ import ( "github.com/stretchr/testify/assert" "github.com/vechain/thor/v2/genesis" "github.com/vechain/thor/v2/muxdb" + "github.com/vechain/thor/v2/thor" "github.com/vechain/thor/v2/tx" ) +func TestGetByID(t *testing.T) { + db := muxdb.NewMem() + repo := newChainRepo(db) + + // Creating transactions + tx1 := newTx(repo.ChainTag(), nil, 21000, tx.BlockRef{}, 100, nil, tx.Features(0), genesis.DevAccounts()[0]) + tx2 := newTx(repo.ChainTag(), nil, 21000, tx.BlockRef{}, 100, nil, tx.Features(0), genesis.DevAccounts()[1]) + + // Resolving transactions into txObjects + txObj1, _ := resolveTx(tx1, false) + txObj2, _ := resolveTx(tx2, false) + + // Creating a new txObjectMap and adding transactions + m := newTxObjectMap() + assert.Nil(t, m.Add(txObj1, 1)) + assert.Nil(t, m.Add(txObj2, 1)) + + // Testing GetByID + retrievedTxObj1 := m.GetByID(txObj1.ID()) + assert.Equal(t, txObj1, retrievedTxObj1, "The retrieved transaction object should match the original for tx1") + + retrievedTxObj2 := m.GetByID(txObj2.ID()) + assert.Equal(t, txObj2, retrievedTxObj2, "The retrieved transaction object should match the original for tx2") + + // Testing retrieval of a non-existing transaction + nonExistingTxID := thor.Bytes32{} // An arbitrary non-existing ID + retrievedTxObj3 := m.GetByID(nonExistingTxID) + assert.Nil(t, retrievedTxObj3, "Retrieving a non-existing transaction should return nil") +} + +func TestFill(t *testing.T) { + db := muxdb.NewMem() + repo := newChainRepo(db) + + // Creating transactions + tx1 := newTx(repo.ChainTag(), nil, 21000, tx.BlockRef{}, 100, nil, tx.Features(0), genesis.DevAccounts()[0]) + tx2 := newTx(repo.ChainTag(), nil, 21000, tx.BlockRef{}, 100, nil, tx.Features(0), genesis.DevAccounts()[1]) + + // Resolving transactions into txObjects + txObj1, _ := resolveTx(tx1, false) + txObj2, _ := resolveTx(tx2, false) + + // Creating a new txObjectMap + m := newTxObjectMap() + + // Filling the map with transactions + m.Fill([]*txObject{txObj1, txObj2}) + + // Asserting the length of the map + assert.Equal(t, 2, m.Len(), "Map should contain only 2 unique transactions") + + // Asserting the transactions are correctly added + assert.True(t, m.ContainsHash(txObj1.Hash()), "Map should contain txObj1") + assert.True(t, m.ContainsHash(txObj2.Hash()), "Map should contain txObj2") + + // Asserting duplicate handling + assert.Equal(t, m.GetByID(txObj1.ID()), txObj1, "Duplicate tx1 should not be added again") + assert.Equal(t, m.GetByID(txObj2.ID()), txObj2, "txObj2 should be retrievable by ID") +} + func TestTxObjMap(t *testing.T) { db := muxdb.NewMem() repo := newChainRepo(db) diff --git a/txpool/tx_object_test.go b/txpool/tx_object_test.go index 7eeede1e4..5fa38b3c1 100644 --- a/txpool/tx_object_test.go +++ b/txpool/tx_object_test.go @@ -23,7 +23,7 @@ import ( ) func newChainRepo(db *muxdb.MuxDB) *chain.Repository { - gene := genesis.NewDevnet() + gene := genesis.NewDevnet(uint64(1526400000)) b0, _, _, _ := gene.Build(state.NewStater(db)) repo, _ := chain.NewRepository(db, b0) return repo @@ -73,6 +73,41 @@ func newDelegatedTx(chainTag byte, clauses []*tx.Clause, gas uint64, blockRef tx return tx.WithSignature(sig) } +func TestExecutableWithError(t *testing.T) { + acc := genesis.DevAccounts()[0] + + db := muxdb.NewMem() + repo := newChainRepo(db) + b0 := repo.GenesisBlock() + b1 := new(block.Builder).ParentID(b0.Header().ID()).GasLimit(10000000).TotalScore(100).Build() + repo.AddBlock(b1, nil, 0) + st := state.New(db, repo.GenesisBlock().Header().StateRoot(), 0, 0, 0) + + tests := []struct { + tx *tx.Transaction + expected bool + expectedErr string + }{ + {newTx(0, nil, 21000, tx.BlockRef{0}, 100, nil, tx.Features(0), acc), false, ""}, + } + + for _, tt := range tests { + txObj, err := resolveTx(tt.tx, false) + assert.Nil(t, err) + + // pass custom headID + chain := repo.NewChain(thor.Bytes32{0}) + + exe, err := txObj.Executable(chain, st, b1.Header()) + if tt.expectedErr != "" { + assert.Equal(t, tt.expectedErr, err.Error()) + } else { + assert.Equal(t, err.Error(), "leveldb: not found") + assert.Equal(t, tt.expected, exe) + } + } +} + func TestSort(t *testing.T) { objs := []*txObject{ {overallGasPrice: big.NewInt(10)}, diff --git a/txpool/tx_pool_test.go b/txpool/tx_pool_test.go index 031cdb18d..54c952a48 100644 --- a/txpool/tx_pool_test.go +++ b/txpool/tx_pool_test.go @@ -9,6 +9,8 @@ import ( "crypto/rand" "encoding/hex" "fmt" + "net/http" + "net/http/httptest" "testing" "time" @@ -16,6 +18,7 @@ import ( "github.com/inconshreveable/log15" "github.com/stretchr/testify/assert" "github.com/vechain/thor/v2/block" + "github.com/vechain/thor/v2/chain" "github.com/vechain/thor/v2/genesis" "github.com/vechain/thor/v2/muxdb" "github.com/vechain/thor/v2/state" @@ -40,6 +43,177 @@ func newPool(limit int, limitPerAccount int) *TxPool { MaxLifetime: time.Hour, }) } + +func newPoolWithParams(limit int, limitPerAccount int, BlocklistCacheFilePath string, BlocklistFetchURL string, timestamp uint64) *TxPool { + db := muxdb.NewMem() + gene := genesis.NewDevnet(timestamp) + b0, _, _, _ := gene.Build(state.NewStater(db)) + repo, _ := chain.NewRepository(db, b0) + return New(repo, state.NewStater(db), Options{ + Limit: limit, + LimitPerAccount: limitPerAccount, + MaxLifetime: time.Hour, + BlocklistCacheFilePath: BlocklistCacheFilePath, + BlocklistFetchURL: BlocklistFetchURL, + }) +} + +func newHttpServer() *httptest.Server { + // Example data to be served by the mock server + data := "0x25Df024637d4e56c1aE9563987Bf3e92C9f534c0\n0x25Df024637d4e56c1aE9563987Bf3e92C9f534c1" + + // Create a mock server + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + // You can check headers, methods, etc. here + if r.Header.Get("if-none-match") == "some-etag" { + w.WriteHeader(http.StatusNotModified) + return + } + fmt.Fprint(w, data) + })) + return server +} + +func TestNewCloseWithServer(t *testing.T) { + + server := newHttpServer() + defer server.Close() + + pool := newPoolWithParams(LIMIT, LIMIT_PER_ACCOUNT, "./", server.URL, uint64(time.Now().Unix())) + defer pool.Close() + + // Create a slice of transactions to be added to the pool. + txs := make(Tx.Transactions, 0, 15) + for i := 0; i < 15; i++ { + tx := newTx(pool.repo.ChainTag(), nil, 21000, tx.BlockRef{}, 100, nil, tx.Features(0), genesis.DevAccounts()[i%len(genesis.DevAccounts())]) + txs = append(txs, tx) + } + + // Call the Fill method + pool.Fill(txs) + + // Add a delay of 2 seconds + time.Sleep(2 * time.Second) +} + +func TestAddWithFullErrorUnsyncedChain(t *testing.T) { + pool := newPool(LIMIT, LIMIT_PER_ACCOUNT) + defer pool.Close() + + // Create a slice of transactions to be added to the pool. + txs := make(Tx.Transactions, 0, 15) + for i := 0; i < 12; i++ { + tx := newTx(pool.repo.ChainTag(), nil, 21000, tx.BlockRef{}, 100, nil, tx.Features(0), genesis.DevAccounts()[0]) + txs = append(txs, tx) + } + + // Call the Fill method + pool.Fill(txs) + + err := pool.Add(newTx(pool.repo.ChainTag(), nil, 21000, tx.NewBlockRef(10), 100, nil, Tx.Features(0), genesis.DevAccounts()[0])) + assert.Equal(t, err.Error(), "tx rejected: pool is full") + + // Add a delay of 2 seconds + time.Sleep(2 * time.Second) +} + +func TestAddWithFullErrorSyncedChain(t *testing.T) { + pool := newPoolWithParams(LIMIT, LIMIT_PER_ACCOUNT, "./", "", uint64(time.Now().Unix())) + defer pool.Close() + + // Create a slice of transactions to be added to the pool. + txs := make(Tx.Transactions, 0, 15) + for i := 0; i < 12; i++ { + tx := newTx(pool.repo.ChainTag(), nil, 21000, tx.BlockRef{}, 100, nil, tx.Features(0), genesis.DevAccounts()[0]) + txs = append(txs, tx) + } + + // Call the Fill method + pool.Fill(txs) + + err := pool.Add(newTx(pool.repo.ChainTag(), nil, 21000, tx.NewBlockRef(10), 100, nil, Tx.Features(0), genesis.DevAccounts()[0])) + assert.Equal(t, err.Error(), "tx rejected: pool is full") + + // Add a delay of 2 seconds + time.Sleep(2 * time.Second) +} + +func TestNewCloseWithError(t *testing.T) { + + pool := newPoolWithParams(LIMIT, LIMIT_PER_ACCOUNT, " ", " ", uint64(time.Now().Unix())+10000) + defer pool.Close() + + // Add a delay of 2 seconds + time.Sleep(2 * time.Second) +} + +func TestDump(t *testing.T) { + // Create a new transaction pool with specified limits + pool := newPool(LIMIT, LIMIT_PER_ACCOUNT) + defer pool.Close() + + // Create and add transactions to the pool + txsToAdd := make(tx.Transactions, 0, 5) + for i := 0; i < 5; i++ { + tx := newTx(pool.repo.ChainTag(), nil, 21000, tx.BlockRef{}, 100, nil, tx.Features(0), genesis.DevAccounts()[i%len(genesis.DevAccounts())]) + txsToAdd = append(txsToAdd, tx) + assert.Nil(t, pool.Add(tx)) + } + + // Use the Dump method to retrieve all transactions in the pool + dumpedTxs := pool.Dump() + + // Check if the dumped transactions match the ones added + assert.Equal(t, len(txsToAdd), len(dumpedTxs), "Number of dumped transactions should match the number added") + + // Further checks can be done to ensure that each transaction in `dumpedTxs` is also in `txsToAdd` + for _, dumpedTx := range dumpedTxs { + found := false + for _, addedTx := range txsToAdd { + if dumpedTx.ID() == addedTx.ID() { + found = true + break + } + } + assert.True(t, found, "Dumped transaction should match one of the added transactions") + } +} + +func TestRemove(t *testing.T) { + pool := newPool(LIMIT, LIMIT_PER_ACCOUNT) + defer pool.Close() + + // Create and add a transaction to the pool + tx := newTx(pool.repo.ChainTag(), nil, 21000, tx.BlockRef{}, 100, nil, tx.Features(0), genesis.DevAccounts()[0]) + assert.Nil(t, pool.Add(tx), "Adding transaction should not produce error") + + // Ensure the transaction is in the pool + assert.NotNil(t, pool.Get(tx.ID()), "Transaction should exist in the pool before removal") + + // Remove the transaction from the pool + removed := pool.Remove(tx.Hash(), tx.ID()) + assert.True(t, removed, "Transaction should be successfully removed") + + // Check that the transaction is no longer in the pool + assert.Nil(t, pool.Get(tx.ID()), "Transaction should not exist in the pool after removal") +} + +func TestRemoveWithError(t *testing.T) { + pool := newPool(LIMIT, LIMIT_PER_ACCOUNT) + defer pool.Close() + + // Create and add a transaction to the pool + tx := newTx(pool.repo.ChainTag(), nil, 21000, tx.BlockRef{}, 100, nil, tx.Features(0), genesis.DevAccounts()[0]) + // assert.Nil(t, pool.Add(tx), "Adding transaction should not produce error") + + // Ensure the transaction is in the pool + assert.Nil(t, pool.Get(tx.ID()), "Transaction should exist in the pool before removal") + + // Remove the transaction from the pool + removed := pool.Remove(tx.Hash(), tx.ID()) + assert.False(t, removed, "Transaction should not be successfully removed as it doesn't exist") +} + func TestNewClose(t *testing.T) { pool := newPool(LIMIT, LIMIT_PER_ACCOUNT) defer pool.Close() @@ -125,6 +299,31 @@ func TestWashTxs(t *testing.T) { assert.Equal(t, 1, removedCount) } +func TestFillPool(t *testing.T) { + pool := newPool(LIMIT, LIMIT_PER_ACCOUNT) + defer pool.Close() + + // Create a slice of transactions to be added to the pool. + txs := make(Tx.Transactions, 0, 5) + for i := 0; i < 5; i++ { + tx := newTx(pool.repo.ChainTag(), nil, 21000, tx.BlockRef{}, 100, nil, tx.Features(0), genesis.DevAccounts()[i%len(genesis.DevAccounts())]) + txs = append(txs, tx) + } + + // Call the Fill method + pool.Fill(txs) + + // Check if the transactions are correctly added. + // This might require accessing internal state of TxPool or using provided methods. + for _, tx := range txs { + assert.NotNil(t, pool.Get(tx.ID()), "Transaction should exist in the pool") + } + + // Further checks can be made based on the behavior of your TxPool implementation. + // For example, checking if the pool size has increased by the expected amount. + assert.Equal(t, len(txs), pool.all.Len(), "Number of transactions in the pool should match the number added") +} + func TestAdd(t *testing.T) { pool := newPool(LIMIT, LIMIT_PER_ACCOUNT) defer pool.Close() From 66347758d06b01b003dfd0c426236b8e83cc5dcb Mon Sep 17 00:00:00 2001 From: Makis Christou Date: Wed, 3 Jan 2024 12:09:57 +0200 Subject: [PATCH 3/7] Update txpool/tx_pool_test.go Co-authored-by: libotony --- txpool/tx_pool_test.go | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/txpool/tx_pool_test.go b/txpool/tx_pool_test.go index 54c952a48..654442c25 100644 --- a/txpool/tx_pool_test.go +++ b/txpool/tx_pool_test.go @@ -46,7 +46,17 @@ func newPool(limit int, limitPerAccount int) *TxPool { func newPoolWithParams(limit int, limitPerAccount int, BlocklistCacheFilePath string, BlocklistFetchURL string, timestamp uint64) *TxPool { db := muxdb.NewMem() - gene := genesis.NewDevnet(timestamp) + gene := new(genesis.Builder). + GasLimit(thor.InitialGasLimit). + Timestamp(timestamp). + State(func(state *state.State) error { + bal, _ := new(big.Int).SetString("1000000000000000000000000000", 10) + for _, acc := range genesis.DevAccounts() { + state.SetBalance(acc.Address, bal) + state.SetEnergy(acc.Address, bal, timestamp) + } + return nil + }) b0, _, _, _ := gene.Build(state.NewStater(db)) repo, _ := chain.NewRepository(db, b0) return New(repo, state.NewStater(db), Options{ From 0a970d316681f97b312bd6b048e11b8bc54ae59e Mon Sep 17 00:00:00 2001 From: Makis Christou Date: Wed, 3 Jan 2024 12:10:03 +0200 Subject: [PATCH 4/7] Update txpool/tx_pool_test.go Co-authored-by: libotony --- txpool/tx_pool_test.go | 1 - 1 file changed, 1 deletion(-) diff --git a/txpool/tx_pool_test.go b/txpool/tx_pool_test.go index 654442c25..85e563934 100644 --- a/txpool/tx_pool_test.go +++ b/txpool/tx_pool_test.go @@ -85,7 +85,6 @@ func newHttpServer() *httptest.Server { } func TestNewCloseWithServer(t *testing.T) { - server := newHttpServer() defer server.Close() From 933698ec3c7276a41234823d03def66fc36b3c61 Mon Sep 17 00:00:00 2001 From: Makis Christou Date: Wed, 3 Jan 2024 12:10:10 +0200 Subject: [PATCH 5/7] Update txpool/blocklist_test.go Co-authored-by: libotony --- txpool/blocklist_test.go | 1 - 1 file changed, 1 deletion(-) diff --git a/txpool/blocklist_test.go b/txpool/blocklist_test.go index c1333323c..0ae3ca705 100644 --- a/txpool/blocklist_test.go +++ b/txpool/blocklist_test.go @@ -46,7 +46,6 @@ func TestLoad(t *testing.T) { } func TestLoadWithError(t *testing.T) { - dummyData := "0x25Df024637d4\n0x25Df024637d4e56c1aE956" testFilePath := SetupTempFile(t, dummyData) From 06a5e732c52ccffc7f375be71288a52dd1fbcccd Mon Sep 17 00:00:00 2001 From: Makis Christou Date: Wed, 3 Jan 2024 13:08:06 +0200 Subject: [PATCH 6/7] Revert NewDevnet refactor --- api/accounts/accounts_test.go | 2 +- api/blocks/blocks_test.go | 2 +- api/debug/debug.go | 2 +- api/node/node_test.go | 2 +- api/transactions/transactions_test.go | 2 +- builtin/native_calls_test.go | 8 ++++---- chain/repository_test.go | 4 ++-- cmd/thor/main.go | 2 +- genesis/devnet.go | 3 ++- packer/packer_test.go | 4 ++-- poa/seed_test.go | 2 +- runtime/resolved_tx_test.go | 2 +- runtime/runtime_test.go | 10 +++++----- txpool/tx_object_test.go | 2 +- txpool/tx_pool_test.go | 1 + 15 files changed, 25 insertions(+), 23 deletions(-) diff --git a/api/accounts/accounts_test.go b/api/accounts/accounts_test.go index e6a51a0b8..98338c83d 100644 --- a/api/accounts/accounts_test.go +++ b/api/accounts/accounts_test.go @@ -176,7 +176,7 @@ func getStorage(t *testing.T) { func initAccountServer(t *testing.T) { db := muxdb.NewMem() stater := state.NewStater(db) - gene := genesis.NewDevnet(uint64(1526400000)) + gene := genesis.NewDevnet() b, _, _, err := gene.Build(stater) if err != nil { diff --git a/api/blocks/blocks_test.go b/api/blocks/blocks_test.go index 8628c9217..941fbb1b6 100644 --- a/api/blocks/blocks_test.go +++ b/api/blocks/blocks_test.go @@ -76,7 +76,7 @@ func TestBlock(t *testing.T) { func initBlockServer(t *testing.T) { db := muxdb.NewMem() stater := state.NewStater(db) - gene := genesis.NewDevnet(uint64(1526400000)) + gene := genesis.NewDevnet() b, _, _, err := gene.Build(stater) if err != nil { diff --git a/api/debug/debug.go b/api/debug/debug.go index 304d13c50..073d94baf 100644 --- a/api/debug/debug.go +++ b/api/debug/debug.go @@ -33,7 +33,7 @@ import ( "github.com/vechain/thor/v2/xenv" ) -var devNetGenesisID = genesis.NewDevnet(uint64(1526400000)).ID() +var devNetGenesisID = genesis.NewDevnet().ID() type Debug struct { repo *chain.Repository diff --git a/api/node/node_test.go b/api/node/node_test.go index ae5ec28df..59ecb0de5 100644 --- a/api/node/node_test.go +++ b/api/node/node_test.go @@ -38,7 +38,7 @@ func TestNode(t *testing.T) { func initCommServer(t *testing.T) { db := muxdb.NewMem() stater := state.NewStater(db) - gene := genesis.NewDevnet(uint64(1526400000)) + gene := genesis.NewDevnet() b, _, _, err := gene.Build(stater) if err != nil { diff --git a/api/transactions/transactions_test.go b/api/transactions/transactions_test.go index 8d3350cb3..d727562c7 100644 --- a/api/transactions/transactions_test.go +++ b/api/transactions/transactions_test.go @@ -122,7 +122,7 @@ func httpPost(t *testing.T, url string, obj interface{}) []byte { func initTransactionServer(t *testing.T) { db := muxdb.NewMem() stater := state.NewStater(db) - gene := genesis.NewDevnet(uint64(1526400000)) + gene := genesis.NewDevnet() b, _, _, err := gene.Build(stater) if err != nil { diff --git a/builtin/native_calls_test.go b/builtin/native_calls_test.go index d2a400f8e..48d53d3f4 100644 --- a/builtin/native_calls_test.go +++ b/builtin/native_calls_test.go @@ -492,7 +492,7 @@ func TestPrototypeNative(t *testing.T) { ) db := muxdb.NewMem() - gene := genesis.NewDevnet(uint64(1526400000)) + gene := genesis.NewDevnet() genesisBlock, _, _, _ := gene.Build(state.NewStater(db)) repo, _ := chain.NewRepository(db, genesisBlock) st := state.New(db, genesisBlock.Header().StateRoot(), 0, 0, 0) @@ -766,7 +766,7 @@ func TestPrototypeNativeWithLongerBlockNumber(t *testing.T) { rand.Read(sig[:]) db := muxdb.NewMem() - gene := genesis.NewDevnet(uint64(1526400000)) + gene := genesis.NewDevnet() genesisBlock, _, _, _ := gene.Build(state.NewStater(db)) st := state.New(db, genesisBlock.Header().StateRoot(), 0, 0, 0) repo, _ := chain.NewRepository(db, genesisBlock) @@ -836,7 +836,7 @@ func TestPrototypeNativeWithBlockNumber(t *testing.T) { rand.Read(sig[:]) db := muxdb.NewMem() - gene := genesis.NewDevnet(uint64(1526400000)) + gene := genesis.NewDevnet() genesisBlock, _, _, _ := gene.Build(state.NewStater(db)) st := state.New(db, genesisBlock.Header().StateRoot(), 0, 0, 0) repo, _ := chain.NewRepository(db, genesisBlock) @@ -899,7 +899,7 @@ func newBlock(parent *block.Block, score uint64, timestamp uint64, privateKey *e func TestExtensionNative(t *testing.T) { db := muxdb.NewMem() st := state.New(db, thor.Bytes32{}, 0, 0, 0) - gene := genesis.NewDevnet(uint64(1526400000)) + gene := genesis.NewDevnet() genesisBlock, _, _, _ := gene.Build(state.NewStater(db)) repo, _ := chain.NewRepository(db, genesisBlock) st.SetCode(builtin.Extension.Address, builtin.Extension.V2.RuntimeBytecodes()) diff --git a/chain/repository_test.go b/chain/repository_test.go index 5e719803e..b83f0a7f1 100644 --- a/chain/repository_test.go +++ b/chain/repository_test.go @@ -25,7 +25,7 @@ func M(args ...interface{}) []interface{} { func newTestRepo() (*muxdb.MuxDB, *Repository) { db := muxdb.NewMem() - g := genesis.NewDevnet(uint64(1526400000)) + g := genesis.NewDevnet() b0, _, _, _ := g.Build(state.NewStater(db)) repo, err := NewRepository(db, b0) @@ -60,7 +60,7 @@ func newBlock(parent *block.Block, ts uint64, txs ...*tx.Transaction) *block.Blo func TestRepository(t *testing.T) { db := muxdb.NewMem() - g := genesis.NewDevnet(uint64(1526400000)) + g := genesis.NewDevnet() b0, _, _, _ := g.Build(state.NewStater(db)) repo1, err := NewRepository(db, b0) diff --git a/cmd/thor/main.go b/cmd/thor/main.go index 018c7d2ae..f18150fc9 100644 --- a/cmd/thor/main.go +++ b/cmd/thor/main.go @@ -245,7 +245,7 @@ func soloAction(ctx *cli.Context) error { defer func() { log.Info("exited") }() initLogger(ctx) - gene := genesis.NewDevnet(uint64(1526400000)) + gene := genesis.NewDevnet() // Solo forks from the start forkConfig := thor.ForkConfig{} diff --git a/genesis/devnet.go b/genesis/devnet.go index 1627321a9..77798968e 100644 --- a/genesis/devnet.go +++ b/genesis/devnet.go @@ -57,7 +57,8 @@ func DevAccounts() []DevAccount { } // NewDevnet create genesis for solo mode. -func NewDevnet(launchTime uint64) *Genesis { +func NewDevnet() *Genesis { + launchTime := uint64(1526400000) // 'Wed May 16 2018 00:00:00 GMT+0800 (CST)' executor := DevAccounts()[0].Address soloBlockSigner := DevAccounts()[0] diff --git a/packer/packer_test.go b/packer/packer_test.go index 24b6663b9..dc3188d44 100644 --- a/packer/packer_test.go +++ b/packer/packer_test.go @@ -67,7 +67,7 @@ func (ti *txIterator) OnProcessed(txID thor.Bytes32, err error) { func TestP(t *testing.T) { db := muxdb.NewMem() - g := genesis.NewDevnet(uint64(1526400000)) + g := genesis.NewDevnet() b0, _, _, _ := g.Build(state.NewStater(db)) repo, _ := chain.NewRepository(db, b0) @@ -183,7 +183,7 @@ func TestForkVIP191(t *testing.T) { func TestBlocklist(t *testing.T) { db := muxdb.NewMem() - g := genesis.NewDevnet(uint64(1526400000)) + g := genesis.NewDevnet() b0, _, _, _ := g.Build(state.NewStater(db)) repo, _ := chain.NewRepository(db, b0) diff --git a/poa/seed_test.go b/poa/seed_test.go index 2b0056c54..2d5192173 100644 --- a/poa/seed_test.go +++ b/poa/seed_test.go @@ -24,7 +24,7 @@ import ( func TestSeeder_Generate(t *testing.T) { mockEpochInterval(10) db := muxdb.NewMem() - g := genesis.NewDevnet(uint64(1526400000)) + g := genesis.NewDevnet() b0, _, _, _ := g.Build(state.NewStater(db)) repo, err := chain.NewRepository(db, b0) diff --git a/runtime/resolved_tx_test.go b/runtime/resolved_tx_test.go index c62235ac0..07c846b94 100644 --- a/runtime/resolved_tx_test.go +++ b/runtime/resolved_tx_test.go @@ -45,7 +45,7 @@ type testResolvedTransaction struct { func newTestResolvedTransaction(t *testing.T) (*testResolvedTransaction, error) { db := muxdb.NewMem() - gen := genesis.NewDevnet(uint64(1526400000)) + gen := genesis.NewDevnet() stater := state.NewStater(db) parent, _, _, err := gen.Build(stater) diff --git a/runtime/runtime_test.go b/runtime/runtime_test.go index e0a33bb7d..b00c8a889 100644 --- a/runtime/runtime_test.go +++ b/runtime/runtime_test.go @@ -31,7 +31,7 @@ func M(a ...interface{}) []interface{} { func TestContractSuicide(t *testing.T) { db := muxdb.NewMem() - g := genesis.NewDevnet(uint64(1526400000)) + g := genesis.NewDevnet() stater := state.NewStater(db) b0, _, _, err := g.Build(stater) assert.Nil(t, err) @@ -106,7 +106,7 @@ func TestContractSuicide(t *testing.T) { func TestChainID(t *testing.T) { db := muxdb.NewMem() - g := genesis.NewDevnet(uint64(1526400000)) + g := genesis.NewDevnet() stater := state.NewStater(db) b0, _, _, err := g.Build(stater) @@ -158,7 +158,7 @@ func TestChainID(t *testing.T) { func TestSelfBalance(t *testing.T) { db := muxdb.NewMem() - g := genesis.NewDevnet(uint64(1526400000)) + g := genesis.NewDevnet() stater := state.NewStater(db) b0, _, _, err := g.Build(stater) @@ -212,7 +212,7 @@ func TestSelfBalance(t *testing.T) { func TestBlake2(t *testing.T) { db := muxdb.NewMem() - g := genesis.NewDevnet(uint64(1526400000)) + g := genesis.NewDevnet() stater := state.NewStater(db) b0, _, _, err := g.Build(stater) @@ -341,7 +341,7 @@ func TestBlake2(t *testing.T) { func TestCall(t *testing.T) { db := muxdb.NewMem() - g := genesis.NewDevnet(uint64(1526400000)) + g := genesis.NewDevnet() b0, _, _, err := g.Build(state.NewStater(db)) assert.Nil(t, err) diff --git a/txpool/tx_object_test.go b/txpool/tx_object_test.go index 5fa38b3c1..3e4ad5b07 100644 --- a/txpool/tx_object_test.go +++ b/txpool/tx_object_test.go @@ -23,7 +23,7 @@ import ( ) func newChainRepo(db *muxdb.MuxDB) *chain.Repository { - gene := genesis.NewDevnet(uint64(1526400000)) + gene := genesis.NewDevnet() b0, _, _, _ := gene.Build(state.NewStater(db)) repo, _ := chain.NewRepository(db, b0) return repo diff --git a/txpool/tx_pool_test.go b/txpool/tx_pool_test.go index 85e563934..a30aabbd4 100644 --- a/txpool/tx_pool_test.go +++ b/txpool/tx_pool_test.go @@ -9,6 +9,7 @@ import ( "crypto/rand" "encoding/hex" "fmt" + "math/big" "net/http" "net/http/httptest" "testing" From 1b2c195d8fb0c0725336eb0625006f6e0539c89f Mon Sep 17 00:00:00 2001 From: Makis Christou Date: Wed, 3 Jan 2024 15:14:55 +0200 Subject: [PATCH 7/7] Decrease duplicated code --- txpool/tx_object_test.go | 17 ++++++++--------- txpool/tx_pool_test.go | 27 +++++++++------------------ 2 files changed, 17 insertions(+), 27 deletions(-) diff --git a/txpool/tx_object_test.go b/txpool/tx_object_test.go index 3e4ad5b07..468e1a365 100644 --- a/txpool/tx_object_test.go +++ b/txpool/tx_object_test.go @@ -73,7 +73,7 @@ func newDelegatedTx(chainTag byte, clauses []*tx.Clause, gas uint64, blockRef tx return tx.WithSignature(sig) } -func TestExecutableWithError(t *testing.T) { +func SetupTest() (genesis.DevAccount, *chain.Repository, *block.Block, *state.State) { acc := genesis.DevAccounts()[0] db := muxdb.NewMem() @@ -83,6 +83,12 @@ func TestExecutableWithError(t *testing.T) { repo.AddBlock(b1, nil, 0) st := state.New(db, repo.GenesisBlock().Header().StateRoot(), 0, 0, 0) + return acc, repo, b1, st +} + +func TestExecutableWithError(t *testing.T) { + acc, repo, b1, st := SetupTest() + tests := []struct { tx *tx.Transaction expected bool @@ -134,14 +140,7 @@ func TestResolve(t *testing.T) { } func TestExecutable(t *testing.T) { - acc := genesis.DevAccounts()[0] - - db := muxdb.NewMem() - repo := newChainRepo(db) - b0 := repo.GenesisBlock() - b1 := new(block.Builder).ParentID(b0.Header().ID()).GasLimit(10000000).TotalScore(100).Build() - repo.AddBlock(b1, nil, 0) - st := state.New(db, repo.GenesisBlock().Header().StateRoot(), 0, 0, 0) + acc, repo, b1, st := SetupTest() tests := []struct { tx *tx.Transaction diff --git a/txpool/tx_pool_test.go b/txpool/tx_pool_test.go index a30aabbd4..8913c06d8 100644 --- a/txpool/tx_pool_test.go +++ b/txpool/tx_pool_test.go @@ -106,10 +106,7 @@ func TestNewCloseWithServer(t *testing.T) { time.Sleep(2 * time.Second) } -func TestAddWithFullErrorUnsyncedChain(t *testing.T) { - pool := newPool(LIMIT, LIMIT_PER_ACCOUNT) - defer pool.Close() - +func FillPoolWithTxs(pool *TxPool, t *testing.T) { // Create a slice of transactions to be added to the pool. txs := make(Tx.Transactions, 0, 15) for i := 0; i < 12; i++ { @@ -127,25 +124,19 @@ func TestAddWithFullErrorUnsyncedChain(t *testing.T) { time.Sleep(2 * time.Second) } -func TestAddWithFullErrorSyncedChain(t *testing.T) { - pool := newPoolWithParams(LIMIT, LIMIT_PER_ACCOUNT, "./", "", uint64(time.Now().Unix())) +func TestAddWithFullErrorUnsyncedChain(t *testing.T) { + pool := newPool(LIMIT, LIMIT_PER_ACCOUNT) defer pool.Close() - // Create a slice of transactions to be added to the pool. - txs := make(Tx.Transactions, 0, 15) - for i := 0; i < 12; i++ { - tx := newTx(pool.repo.ChainTag(), nil, 21000, tx.BlockRef{}, 100, nil, tx.Features(0), genesis.DevAccounts()[0]) - txs = append(txs, tx) - } + FillPoolWithTxs(pool, t) - // Call the Fill method - pool.Fill(txs) +} - err := pool.Add(newTx(pool.repo.ChainTag(), nil, 21000, tx.NewBlockRef(10), 100, nil, Tx.Features(0), genesis.DevAccounts()[0])) - assert.Equal(t, err.Error(), "tx rejected: pool is full") +func TestAddWithFullErrorSyncedChain(t *testing.T) { + pool := newPoolWithParams(LIMIT, LIMIT_PER_ACCOUNT, "./", "", uint64(time.Now().Unix())) + defer pool.Close() - // Add a delay of 2 seconds - time.Sleep(2 * time.Second) + FillPoolWithTxs(pool, t) } func TestNewCloseWithError(t *testing.T) {