cache_test.go 1.87 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13
package prestates

import (
	"context"
	"errors"
	"testing"

	"github.com/ethereum-optimism/optimism/op-challenger/game/fault/types"
	"github.com/ethereum/go-ethereum/common"
	"github.com/stretchr/testify/require"
)

func TestPrestateProviderCache_CreateAndCache(t *testing.T) {
14
	cache := NewPrestateProviderCache(nil, "", func(_ context.Context, prestateHash common.Hash) (types.PrestateProvider, error) {
15 16 17 18 19
		return &stubPrestateProvider{commitment: prestateHash}, nil
	})

	hash1 := common.Hash{0xaa}
	hash2 := common.Hash{0xbb}
20
	provider1a, err := cache.GetOrCreate(context.Background(), hash1)
21 22 23 24 25
	require.NoError(t, err)
	commitment, err := provider1a.AbsolutePreStateCommitment(context.Background())
	require.NoError(t, err)
	require.Equal(t, hash1, commitment)

26
	provider1b, err := cache.GetOrCreate(context.Background(), hash1)
27 28 29 30 31 32
	require.NoError(t, err)
	require.Same(t, provider1a, provider1b)
	commitment, err = provider1b.AbsolutePreStateCommitment(context.Background())
	require.NoError(t, err)
	require.Equal(t, hash1, commitment)

33
	provider2, err := cache.GetOrCreate(context.Background(), hash2)
34 35 36 37 38 39 40 41 42 43
	require.NoError(t, err)
	require.NotSame(t, provider1a, provider2)
	commitment, err = provider2.AbsolutePreStateCommitment(context.Background())
	require.NoError(t, err)
	require.Equal(t, hash2, commitment)
}

func TestPrestateProviderCache_CreateFails(t *testing.T) {
	hash1 := common.Hash{0xaa}
	expectedErr := errors.New("boom")
44
	cache := NewPrestateProviderCache(nil, "", func(_ context.Context, prestateHash common.Hash) (types.PrestateProvider, error) {
45 46
		return nil, expectedErr
	})
47
	provider, err := cache.GetOrCreate(context.Background(), hash1)
48 49 50 51 52 53 54 55 56 57 58
	require.ErrorIs(t, err, expectedErr)
	require.Nil(t, provider)
}

type stubPrestateProvider struct {
	commitment common.Hash
}

func (s *stubPrestateProvider) AbsolutePreStateCommitment(_ context.Context) (common.Hash, error) {
	return s.commitment, nil
}