github.com/0xPolygon/supernets2-node@v0.0.0-20230711153321-2fe574524eaa/state/genesis_test.go (about) 1 package state_test 2 3 import ( 4 "context" 5 "encoding/hex" 6 "encoding/json" 7 "fmt" 8 "math/big" 9 "os" 10 "path" 11 "runtime" 12 "testing" 13 14 "github.com/0xPolygon/supernets2-node/state" 15 "github.com/0xPolygon/supernets2-node/test/dbutils" 16 "github.com/0xPolygon/supernets2-node/tools/genesis/genesisparser" 17 "github.com/stretchr/testify/assert" 18 "github.com/stretchr/testify/require" 19 ) 20 21 // genesisAccountReader struct 22 type genesisAccountReader struct { 23 Balance string `json:"balance"` 24 Nonce string `json:"nonce"` 25 Address string `json:"address"` 26 Bytecode string `json:"bytecode"` 27 Storage map[string]string `json:"storage"` 28 } 29 30 // genesisTestVectorReader struct 31 type genesisTestVectorReader struct { 32 Root string `json:"expectedRoot"` 33 Accounts []genesisAccountReader `json:"addresses"` 34 } 35 36 func (gr genesisTestVectorReader) GenesisAccountTest() []genesisparser.GenesisAccountTest { 37 accs := []genesisparser.GenesisAccountTest{} 38 for i := 0; i < len(gr.Accounts); i++ { 39 accs = append(accs, genesisparser.GenesisAccountTest{ 40 Balance: gr.Accounts[i].Balance, 41 Nonce: gr.Accounts[i].Nonce, 42 Address: gr.Accounts[i].Address, 43 Bytecode: gr.Accounts[i].Bytecode, 44 Storage: gr.Accounts[i].Storage, 45 }) 46 } 47 return accs 48 } 49 50 func init() { 51 // Change dir to project root 52 // This is important because we have relative paths to files containing test vectors 53 _, filename, _, _ := runtime.Caller(0) 54 dir := path.Join(path.Dir(filename), "../") 55 err := os.Chdir(dir) 56 if err != nil { 57 panic(err) 58 } 59 } 60 61 func TestGenesisVectors(t *testing.T) { 62 // Load test vectors 63 var testVectors []genesisTestVectorReader 64 files := []string{ 65 "test/vectors/src/merkle-tree/smt-full-genesis.json", 66 "test/vectors/src/merkle-tree/smt-genesis.json", 67 } 68 for _, f := range files { 69 var tv []genesisTestVectorReader 70 data, err := os.ReadFile(f) 71 require.NoError(t, err) 72 err = json.Unmarshal(data, &tv) 73 require.NoError(t, err) 74 testVectors = append(testVectors, tv...) 75 } 76 // Run vectors 77 for ti, testVector := range testVectors { 78 t.Run(fmt.Sprintf("Test vector %d", ti), func(t *testing.T) { 79 genesisCase(t, testVector) 80 }) 81 } 82 } 83 84 func genesisCase(t *testing.T, tv genesisTestVectorReader) { 85 // Init database instance 86 err := dbutils.InitOrResetState(stateDBCfg) 87 require.NoError(t, err) 88 actions := genesisparser.GenesisTest2Actions(tv.GenesisAccountTest()) 89 genesis := state.Genesis{ 90 GenesisActions: actions, 91 } 92 ctx := context.Background() 93 dbTx, err := testState.BeginStateTransaction(ctx) 94 require.NoError(t, err) 95 root, err := testState.SetGenesis(ctx, state.Block{}, genesis, dbTx) 96 require.NoError(t, err) 97 err = dbTx.Commit(ctx) 98 require.NoError(t, err) 99 expectedRoot, _ := big.NewInt(0).SetString(tv.Root, 10) 100 actualRoot, _ := big.NewInt(0).SetString(hex.EncodeToString(root), 16) 101 assert.Equal(t, expectedRoot, actualRoot) 102 }