l1_etl_test.go 2.91 KB
Newer Older
1 2 3 4
package etl

import (
	"math/big"
5
	"testing"
6 7 8 9

	"github.com/stretchr/testify/mock"
	"github.com/stretchr/testify/require"

10 11 12 13
	"github.com/ethereum/go-ethereum/common"
	"github.com/ethereum/go-ethereum/core/types"
	"github.com/ethereum/go-ethereum/log"

Hamdi Allam's avatar
Hamdi Allam committed
14
	"github.com/ethereum-optimism/optimism/indexer/bigint"
15 16 17
	"github.com/ethereum-optimism/optimism/indexer/config"
	"github.com/ethereum-optimism/optimism/indexer/database"
	"github.com/ethereum-optimism/optimism/indexer/node"
18 19
	"github.com/ethereum-optimism/optimism/op-service/metrics"
	"github.com/ethereum-optimism/optimism/op-service/testlog"
20 21
)

Hamdi Allam's avatar
Hamdi Allam committed
22
func TestL1ETLConstruction(t *testing.T) {
Hamdi Allam's avatar
Hamdi Allam committed
23
	etlMetrics := NewMetrics(metrics.NewRegistry(), "l1")
Hamdi Allam's avatar
Hamdi Allam committed
24

25 26 27 28 29 30 31
	type testSuite struct {
		db        *database.MockDB
		client    *node.MockEthClient
		start     *big.Int
		contracts config.L1Contracts
	}

32 33
	var tests = []struct {
		name         string
34
		construction func() *testSuite
35 36 37 38
		assertion    func(*L1ETL, error)
	}{
		{
			name: "Start from L1 config height",
39
			construction: func() *testSuite {
40 41 42 43 44 45 46
				client := new(node.MockEthClient)
				db := database.NewMockDB()

				testStart := big.NewInt(100)
				db.MockBlocks.On("L1LatestBlockHeader").Return(nil, nil)

				client.On("BlockHeaderByNumber", mock.MatchedBy(
Hamdi Allam's avatar
Hamdi Allam committed
47
					bigint.Matcher(100))).Return(
48 49 50 51 52 53
					&types.Header{
						ParentHash: common.HexToHash("0x69"),
					}, nil)

				client.On("GethEthClient").Return(nil)

54
				return &testSuite{
Hamdi Allam's avatar
Hamdi Allam committed
55 56 57 58 59 60
					db:     db,
					client: client,
					start:  testStart,

					// utilize sample l1 contract configuration (optimism)
					contracts: config.Presets[10].ChainConfig.L1Contracts,
61 62 63 64 65 66 67 68 69
				}
			},
			assertion: func(etl *L1ETL, err error) {
				require.NoError(t, err)
				require.Equal(t, etl.headerTraversal.LastHeader().ParentHash, common.HexToHash("0x69"))
			},
		},
		{
			name: "Start from recent height stored in DB",
70
			construction: func() *testSuite {
71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
				client := new(node.MockEthClient)
				db := database.NewMockDB()

				testStart := big.NewInt(100)

				db.MockBlocks.On("L1LatestBlockHeader").Return(
					&database.L1BlockHeader{
						BlockHeader: database.BlockHeader{
							RLPHeader: &database.RLPHeader{
								Number: big.NewInt(69),
							},
						}}, nil)

				client.On("GethEthClient").Return(nil)

86
				return &testSuite{
87 88 89 90 91 92
					db:     db,
					client: client,
					start:  testStart,

					// utilize sample l1 contract configuration (optimism)
					contracts: config.Presets[10].ChainConfig.L1Contracts,
93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
				}
			},
			assertion: func(etl *L1ETL, err error) {
				require.NoError(t, err)
				header := etl.headerTraversal.LastHeader()

				require.True(t, header.Number.Cmp(big.NewInt(69)) == 0)
			},
		},
	}

	for _, test := range tests {
		t.Run(test.name, func(t *testing.T) {
			ts := test.construction()

108
			logger := testlog.Logger(t, log.LvlInfo)
Hamdi Allam's avatar
Hamdi Allam committed
109
			cfg := Config{StartHeight: ts.start}
110

Hamdi Allam's avatar
Hamdi Allam committed
111
			etl, err := NewL1ETL(cfg, logger, ts.db.DB, etlMetrics, ts.client, ts.contracts)
112 113 114 115
			test.assertion(etl, err)
		})
	}
}