diff --git a/op-acceptance-tests/tests/interop/message/init_test.go b/op-acceptance-tests/tests/interop/message/init_test.go index a1b67e9e6dbb0..246c6f1d892fd 100644 --- a/op-acceptance-tests/tests/interop/message/init_test.go +++ b/op-acceptance-tests/tests/interop/message/init_test.go @@ -6,9 +6,6 @@ import ( "github.com/ethereum-optimism/optimism/op-devstack/presets" ) -var SimpleInterop presets.TestSetup[*presets.SimpleInterop] - func TestMain(m *testing.M) { - SimpleInterop = presets.NewSimpleInterop - presets.DoMain(m, presets.ConfigureSimpleInterop()) + presets.DoMain(m, presets.WithSimpleInterop()) } diff --git a/op-acceptance-tests/tests/interop/message/interop_msg_test.go b/op-acceptance-tests/tests/interop/message/interop_msg_test.go index c0a67b2e60e78..21f6cab0a65dc 100644 --- a/op-acceptance-tests/tests/interop/message/interop_msg_test.go +++ b/op-acceptance-tests/tests/interop/message/interop_msg_test.go @@ -6,13 +6,14 @@ import ( "github.com/ethereum-optimism/optimism/op-acceptance-tests/tests/interop" "github.com/ethereum-optimism/optimism/op-devstack/devtest" + "github.com/ethereum-optimism/optimism/op-devstack/presets" "github.com/ethereum-optimism/optimism/op-service/eth" ) // TestInitExecMsg tests basic interop messaging func TestInitExecMsg(gt *testing.T) { t := devtest.SerialT(gt) - sys := SimpleInterop(t) + sys := presets.NewSimpleInterop(t) rng := rand.New(rand.NewSource(1234)) alice := sys.FunderA.NewFundedEOA(eth.ThousandEther) bob := sys.FunderB.NewFundedEOA(eth.ThousandEther) diff --git a/op-acceptance-tests/tests/interop/reorgs/init_exec_msg_test.go b/op-acceptance-tests/tests/interop/reorgs/init_exec_msg_test.go index 0bdeec32e8c96..a7db3d0de9f68 100644 --- a/op-acceptance-tests/tests/interop/reorgs/init_exec_msg_test.go +++ b/op-acceptance-tests/tests/interop/reorgs/init_exec_msg_test.go @@ -12,6 +12,7 @@ import ( "github.com/ethereum-optimism/optimism/op-acceptance-tests/tests/interop" "github.com/ethereum-optimism/optimism/op-devstack/devtest" "github.com/ethereum-optimism/optimism/op-devstack/dsl" + "github.com/ethereum-optimism/optimism/op-devstack/presets" "github.com/ethereum-optimism/optimism/op-devstack/stack/match" "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait" "github.com/ethereum-optimism/optimism/op-service/eth" @@ -29,7 +30,7 @@ func TestReorgInitExecMsg(gt *testing.T) { t := devtest.SerialT(gt) ctx := t.Ctx() - sys := SimpleInterop(t) + sys := presets.NewSimpleInterop(t) l := sys.Log ia := sys.Sequencer.Escape().IndividualAPI(sys.L2ChainA.ChainID()) diff --git a/op-acceptance-tests/tests/interop/reorgs/init_test.go b/op-acceptance-tests/tests/interop/reorgs/init_test.go index 678f33cd93ee2..df1ce435a198a 100644 --- a/op-acceptance-tests/tests/interop/reorgs/init_test.go +++ b/op-acceptance-tests/tests/interop/reorgs/init_test.go @@ -6,11 +6,8 @@ import ( "github.com/ethereum-optimism/optimism/op-devstack/presets" ) -var SimpleInterop presets.TestSetup[*presets.SimpleInterop] - // TestMain creates the test-setups against the shared backend func TestMain(m *testing.M) { - SimpleInterop = presets.NewSimpleInterop // Other setups may be added here, hydrated from the same orchestrator - presets.DoMain(m, presets.ConfigureSimpleInterop()) + presets.DoMain(m, presets.WithSimpleInterop()) } diff --git a/op-acceptance-tests/tests/interop/reorgs/unsafe_head_test.go b/op-acceptance-tests/tests/interop/reorgs/unsafe_head_test.go index 834b23bdfeba9..4ccc4c9f8bd31 100644 --- a/op-acceptance-tests/tests/interop/reorgs/unsafe_head_test.go +++ b/op-acceptance-tests/tests/interop/reorgs/unsafe_head_test.go @@ -6,6 +6,7 @@ import ( "time" "github.com/ethereum-optimism/optimism/op-devstack/devtest" + "github.com/ethereum-optimism/optimism/op-devstack/presets" "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait" "github.com/ethereum-optimism/optimism/op-service/eth" "github.com/ethereum-optimism/optimism/op-service/retry" @@ -19,7 +20,7 @@ func TestReorgUnsafeHead(gt *testing.T) { t := devtest.SerialT(gt) ctx := t.Ctx() - sys := SimpleInterop(t) + sys := presets.NewSimpleInterop(t) l := sys.Log ia := sys.Sequencer.Escape().IndividualAPI(sys.L2ChainA.ChainID()) diff --git a/op-acceptance-tests/tests/interop/sync/init_test.go b/op-acceptance-tests/tests/interop/sync/init_test.go index 6f7f728ac3aa6..72d1350b9ebc4 100644 --- a/op-acceptance-tests/tests/interop/sync/init_test.go +++ b/op-acceptance-tests/tests/interop/sync/init_test.go @@ -6,9 +6,6 @@ import ( "github.com/ethereum-optimism/optimism/op-devstack/presets" ) -var SimpleInterop presets.TestSetup[*presets.SimpleInterop] - func TestMain(m *testing.M) { - SimpleInterop = presets.NewSimpleInterop - presets.DoMain(m, presets.ConfigureSimpleInterop()) + presets.DoMain(m, presets.WithSimpleInterop()) } diff --git a/op-acceptance-tests/tests/interop/sync/interop_sync_test.go b/op-acceptance-tests/tests/interop/sync/interop_sync_test.go index 947b44cee2d25..7e81b6a845695 100644 --- a/op-acceptance-tests/tests/interop/sync/interop_sync_test.go +++ b/op-acceptance-tests/tests/interop/sync/interop_sync_test.go @@ -5,6 +5,7 @@ import ( "github.com/ethereum-optimism/optimism/op-devstack/devtest" "github.com/ethereum-optimism/optimism/op-devstack/dsl" + "github.com/ethereum-optimism/optimism/op-devstack/presets" "github.com/ethereum-optimism/optimism/op-service/eth" ) @@ -12,7 +13,7 @@ import ( // Resync is only possible when supervisor and L2CL reconnects. func TestL2CLResync(gt *testing.T) { t := devtest.SerialT(gt) - sys := SimpleInterop(t) + sys := presets.NewSimpleInterop(t) logger := sys.Log.With("Test", "TestL2CLResync") logger.Info("check unsafe chains are advancing") diff --git a/op-acceptance-tests/tests/interop/upgrade/init_test.go b/op-acceptance-tests/tests/interop/upgrade/init_test.go index dedf973187aaf..02f971a226f4f 100644 --- a/op-acceptance-tests/tests/interop/upgrade/init_test.go +++ b/op-acceptance-tests/tests/interop/upgrade/init_test.go @@ -6,12 +6,9 @@ import ( "github.com/ethereum-optimism/optimism/op-devstack/presets" ) -var SimpleInterop presets.TestSetup[*presets.SimpleInterop] - func TestMain(m *testing.M) { - SimpleInterop = presets.NewSimpleInterop presets.DoMain(m, - presets.ConfigureSimpleInterop(), + presets.WithSimpleInterop(), presets.WithSuggestedInteropActivationOffset(30), presets.WithInteropNotAtGenesis()) } diff --git a/op-acceptance-tests/tests/interop/upgrade/post_test.go b/op-acceptance-tests/tests/interop/upgrade/post_test.go index d8ef5662f05a3..3c81fb0d5fc15 100644 --- a/op-acceptance-tests/tests/interop/upgrade/post_test.go +++ b/op-acceptance-tests/tests/interop/upgrade/post_test.go @@ -8,13 +8,14 @@ import ( "github.com/ethereum-optimism/optimism/op-chain-ops/genesis" "github.com/ethereum-optimism/optimism/op-devstack/devtest" "github.com/ethereum-optimism/optimism/op-devstack/dsl" + "github.com/ethereum-optimism/optimism/op-devstack/presets" "github.com/ethereum-optimism/optimism/op-devstack/stack/match" "github.com/ethereum-optimism/optimism/op-service/predeploys" ) func TestPostInbox(gt *testing.T) { t := devtest.ParallelT(gt) - sys := SimpleInterop(t) + sys := presets.NewSimpleInterop(t) devtest.RunParallel(t, sys.L2Networks(), func(t devtest.T, net *dsl.L2Network) { require := t.Require() activationBlock := net.AwaitActivation(t, net.Escape().ChainConfig().InteropTime) diff --git a/op-acceptance-tests/tests/interop/upgrade/pre_test.go b/op-acceptance-tests/tests/interop/upgrade/pre_test.go index 2704cf80a73bb..7be783522f4e2 100644 --- a/op-acceptance-tests/tests/interop/upgrade/pre_test.go +++ b/op-acceptance-tests/tests/interop/upgrade/pre_test.go @@ -8,13 +8,14 @@ import ( "github.com/ethereum-optimism/optimism/op-chain-ops/genesis" "github.com/ethereum-optimism/optimism/op-devstack/devtest" "github.com/ethereum-optimism/optimism/op-devstack/dsl" + "github.com/ethereum-optimism/optimism/op-devstack/presets" "github.com/ethereum-optimism/optimism/op-devstack/stack/match" "github.com/ethereum-optimism/optimism/op-service/predeploys" ) func TestPreNoInbox(gt *testing.T) { t := devtest.ParallelT(gt) - sys := SimpleInterop(t) + sys := presets.NewSimpleInterop(t) require := t.Require() t.Logger().Info("Starting") diff --git a/op-devstack/example/example_test.go b/op-devstack/example/example_test.go index a933669902da5..ac01479bf7ea3 100644 --- a/op-devstack/example/example_test.go +++ b/op-devstack/example/example_test.go @@ -9,12 +9,13 @@ import ( "github.com/ethereum-optimism/optimism/op-devstack/devtest" "github.com/ethereum-optimism/optimism/op-devstack/dsl" + "github.com/ethereum-optimism/optimism/op-devstack/presets" ) // TestExample1 starts an interop chain and verifies that the local unsafe head advances. func TestExample1(gt *testing.T) { t := devtest.ParallelT(gt) - sys := SimpleInterop(t) + sys := presets.NewSimpleInterop(t) t.Require().NotEqual(sys.L2ChainA.ChainID(), sys.L2ChainB.ChainID(), "sanity-check we have two different chains") sys.Supervisor.VerifySyncStatus(dsl.WithAllLocalUnsafeHeadsAdvancedBy(10)) @@ -22,7 +23,7 @@ func TestExample1(gt *testing.T) { func TestExample2(gt *testing.T) { t := devtest.ParallelT(gt) - sys := SimpleInterop(t) + sys := presets.NewSimpleInterop(t) sys.Supervisor.VerifySyncStatus(dsl.WithAllLocalUnsafeHeadsAdvancedBy(4)) } @@ -35,7 +36,7 @@ func TestExampleTxsTracing(gt *testing.T) { logger := t.Logger() ctx, acquiring := tracer.Start(ctx, "acquiring interop sys") - sys := SimpleInterop(t) + sys := presets.NewSimpleInterop(t) acquiring.End() ctx, funded := tracer.Start(ctx, "acquiring funded eoa") diff --git a/op-devstack/example/init_test.go b/op-devstack/example/init_test.go index bb7e8b7342fcc..2b9382e54601f 100644 --- a/op-devstack/example/init_test.go +++ b/op-devstack/example/init_test.go @@ -6,11 +6,7 @@ import ( "github.com/ethereum-optimism/optimism/op-devstack/presets" ) -var SimpleInterop presets.TestSetup[*presets.SimpleInterop] - // TestMain creates the test-setups against the shared backend func TestMain(m *testing.M) { - // Other setups may be added here, hydrated from the same orchestrator - SimpleInterop = presets.NewSimpleInterop - presets.DoMain(m, presets.ConfigureSimpleInterop()) + presets.DoMain(m, presets.WithSimpleInterop()) } diff --git a/op-devstack/presets/backend.go b/op-devstack/presets/backend.go deleted file mode 100644 index c9e1b1a24c15a..0000000000000 --- a/op-devstack/presets/backend.go +++ /dev/null @@ -1,36 +0,0 @@ -package presets - -import ( - "fmt" - "os" - - "github.com/ethereum-optimism/optimism/op-devstack/devtest" -) - -type Backend string - -const ( - SysGo Backend = "sysgo" - SysExt Backend = "sysext" -) - -var globalBackend Backend = SysGo - -func detectBackend(logger devtest.Logger) { - kind, ok := os.LookupEnv("DEVSTACK_ORCHESTRATOR") - if !ok { - logger.Warn("Selecting sysgo as default backend") - globalBackend = SysGo - return - } - backend := Backend(kind) - switch backend { - case SysGo: - globalBackend = SysGo - case SysExt: - globalBackend = SysExt - default: - panic(fmt.Sprintf("Unknown backend: %s", backend)) - } - logger.Info("Detected", "backend", backend) -} diff --git a/op-devstack/presets/interop.go b/op-devstack/presets/interop.go index 23b90b6b39c02..cce6601b907f8 100644 --- a/op-devstack/presets/interop.go +++ b/op-devstack/presets/interop.go @@ -50,17 +50,9 @@ func (s *SimpleInterop) L2Networks() []*dsl.L2Network { } } -// startInProcessSimpleInterop starts a new system that meets the simple interop criteria -func startInProcessSimpleInterop() stack.Option[*sysgo.Orchestrator] { - var ids sysgo.DefaultInteropSystemIDs - return sysgo.DefaultInteropSystem(&ids) -} - -func ConfigureSimpleInterop() stack.CommonOption { - if globalBackend == SysGo { - return stack.MakeCommon(startInProcessSimpleInterop()) - } - return nil +// WithSimpleInterop specifies a system that meets the SimpleInterop criteria. +func WithSimpleInterop() stack.CommonOption { + return stack.MakeCommon(sysgo.DefaultInteropSystem(&sysgo.DefaultInteropSystemIDs{})) } func NewSimpleInterop(t devtest.T) *SimpleInterop { diff --git a/op-devstack/presets/orchestrator.go b/op-devstack/presets/orchestrator.go index 02c69cb1bd867..000c94e936a33 100644 --- a/op-devstack/presets/orchestrator.go +++ b/op-devstack/presets/orchestrator.go @@ -26,6 +26,13 @@ import ( // unless explicitly told otherwise using a WithOrchestrator option. var lockedOrchestrator locks.RWValue[stack.Orchestrator] +type backendKind string + +const ( + backendKindSysGo backendKind = "sysgo" + backendKindSysExt backendKind = "sysext" +) + // DoMain runs M with the pre- and post-processing of tests, // to setup the default global orchestrator and global logger. // This will os.Exit(code) and not return. @@ -81,7 +88,6 @@ func DoMain(m *testing.M, opts ...stack.CommonOption) { // TODO(#15139): set log-level filter, reduce noise //log.SetDefault(t.Log.New("logger", "global")) - detectBackend(p.Logger()) initOrchestrator(ctx, p, stack.Combine(opts...)) errCode = m.Run() @@ -100,15 +106,21 @@ func initOrchestrator(ctx context.Context, p devtest.P, opt stack.CommonOption) if lockedOrchestrator.Value != nil { return } - p.Logger().WithContext(ctx).Info("initializing orchestrator", "backend", globalBackend) - switch globalBackend { - case SysGo: + + backend := backendKindSysGo + if override, ok := os.LookupEnv("DEVSTACK_ORCHESTRATOR"); ok { + backend = backendKind(override) + } + switch backend { + case backendKindSysGo: lockedOrchestrator.Value = sysgo.NewOrchestrator(p) - case SysExt: + case backendKindSysExt: lockedOrchestrator.Value = sysext.NewOrchestrator(p) default: - panic(fmt.Sprintf("Unknown backend for initializing orchestrator: %s", globalBackend)) + panic(fmt.Sprintf("Unknown backend for initializing orchestrator: %s", backend)) } + + p.Logger().WithContext(ctx).Info("initializing orchestrator", "backend", backend) stack.ApplyOptionLifecycle(opt, lockedOrchestrator.Value) } diff --git a/op-devstack/presets/setup.go b/op-devstack/presets/setup.go deleted file mode 100644 index eb3cc77664335..0000000000000 --- a/op-devstack/presets/setup.go +++ /dev/null @@ -1,6 +0,0 @@ -package presets - -import "github.com/ethereum-optimism/optimism/op-devstack/devtest" - -// TestSetup is a function that initializes a desired presentation of the system -type TestSetup[V any] func(t devtest.T) V