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  }