driver_test.go 2.6 KB
Newer Older
1 2 3 4 5 6 7
package driver

import (
	"errors"
	"testing"

	"github.com/stretchr/testify/require"
8 9 10

	"github.com/ethereum/go-ethereum/log"

11
	"github.com/ethereum-optimism/optimism/op-node/rollup/event"
12
	"github.com/ethereum-optimism/optimism/op-service/testlog"
13 14
)

15 16 17
type fakeEnd struct {
	closing bool
	result  error
18 19
}

20 21
func (d *fakeEnd) Closing() bool {
	return d.closing
22 23
}

24 25
func (d *fakeEnd) Result() error {
	return d.result
26 27
}

28
func TestDriver(t *testing.T) {
29
	newTestDriver := func(t *testing.T, onEvent func(d *Driver, end *fakeEnd, ev event.Event)) *Driver {
30 31 32 33 34 35
		logger := testlog.Logger(t, log.LevelInfo)
		end := &fakeEnd{}
		d := &Driver{
			logger: logger,
			end:    end,
		}
36
		d.deriver = event.DeriverFunc(func(ev event.Event) bool {
37
			onEvent(d, end, ev)
38
			return true
39 40 41
		})
		return d
	}
42

43
	t.Run("insta complete", func(t *testing.T) {
44
		d := newTestDriver(t, func(d *Driver, end *fakeEnd, ev event.Event) {
45 46 47
			end.closing = true
		})
		require.NoError(t, d.RunComplete())
48 49
	})

50 51
	t.Run("insta error", func(t *testing.T) {
		mockErr := errors.New("mock error")
52
		d := newTestDriver(t, func(d *Driver, end *fakeEnd, ev event.Event) {
53 54 55 56
			end.closing = true
			end.result = mockErr
		})
		require.ErrorIs(t, mockErr, d.RunComplete())
57 58
	})

59 60
	t.Run("success after a few events", func(t *testing.T) {
		count := 0
61
		d := newTestDriver(t, func(d *Driver, end *fakeEnd, ev event.Event) {
62 63 64 65 66 67 68 69
			if count > 3 {
				end.closing = true
				return
			}
			count += 1
			d.Emit(TestEvent{})
		})
		require.NoError(t, d.RunComplete())
70
	})
71

72 73 74
	t.Run("error after a few events", func(t *testing.T) {
		count := 0
		mockErr := errors.New("mock error")
75
		d := newTestDriver(t, func(d *Driver, end *fakeEnd, ev event.Event) {
76 77 78 79 80 81 82 83 84 85
			if count > 3 {
				end.closing = true
				end.result = mockErr
				return
			}
			count += 1
			d.Emit(TestEvent{})
		})
		require.ErrorIs(t, mockErr, d.RunComplete())
	})
86

87 88
	t.Run("exhaust events", func(t *testing.T) {
		count := 0
89
		d := newTestDriver(t, func(d *Driver, end *fakeEnd, ev event.Event) {
90 91 92 93 94
			if count < 3 { // stop generating events after a while, without changing end condition
				d.Emit(TestEvent{})
			}
			count += 1
		})
95 96
		// No further processing to be done so evaluate if the claims output root is correct.
		require.NoError(t, d.RunComplete())
97
	})
98

99 100
	t.Run("queued events", func(t *testing.T) {
		count := 0
101
		d := newTestDriver(t, func(d *Driver, end *fakeEnd, ev event.Event) {
102 103 104 105 106 107
			if count < 3 {
				d.Emit(TestEvent{})
				d.Emit(TestEvent{})
			}
			count += 1
		})
108
		require.NoError(t, d.RunComplete())
109 110 111
		// add 1 for initial event that RunComplete fires
		require.Equal(t, 1+3*2, count, "must have queued up 2 events 3 times")
	})
112
}