diff --git a/.github/workflows/espresso-devnet-tests.yaml b/.github/workflows/espresso-devnet-tests.yaml index ef0aa4996835f..71b9506ec9d14 100644 --- a/.github/workflows/espresso-devnet-tests.yaml +++ b/.github/workflows/espresso-devnet-tests.yaml @@ -38,7 +38,7 @@ jobs: - name: Compile contracts run: just compile-contracts - - name: Build Devnet + - name: Build Devnet without TEE run: | cd op-deployer just @@ -48,8 +48,8 @@ jobs: docker compose build docker compose pull l1-validator espresso-dev-node l1-data-init - - name: Run Smoke test - run: go test -timeout 30m -p 1 -count 1 -run 'TestSmoke' -v ./espresso/devnet-tests/... + - name: Run Smoke test without TEE + run: go test -timeout 30m -p 1 -count 1 -run 'TestSmokeWithoutTEE' -v ./espresso/devnet-tests/... - name: Run Challenge Game test run: go test -timeout 30m -p 1 -count 1 -run 'TestChallengeGame' -v ./espresso/devnet-tests/... @@ -66,6 +66,14 @@ jobs: - name: Run Change Batch Inbox Owner test run: go test -timeout 30m -p 1 -count 1 -run 'TestChangeBatchInboxOwner' -v ./espresso/devnet-tests/... + - name: Build Devnet with TEE + run: | + cd espresso + COMPOSE_PROFILES=tee docker compose build + + - name: Run Smoke test with TEE + run: go test -timeout 30m -p 1 -count 1 -run 'TestSmokeWithTEE' -v ./espresso/devnet-tests/... + - name: Save Nix cache uses: nix-community/cache-nix-action/save@v6 if: always() && steps.cache-nix-restore.outputs.hit-primary-key != 'true' diff --git a/espresso/devnet-tests/batcher_restart_test.go b/espresso/devnet-tests/batcher_restart_test.go index 2088f317e880a..900dce74663c6 100644 --- a/espresso/devnet-tests/batcher_restart_test.go +++ b/espresso/devnet-tests/batcher_restart_test.go @@ -13,7 +13,7 @@ func TestBatcherRestart(t *testing.T) { defer cancel() d := NewDevnet(ctx, t) - require.NoError(t, d.Up()) + require.NoError(t, d.Up(NON_TEE)) defer func() { require.NoError(t, d.Down()) }() diff --git a/espresso/devnet-tests/challenge_test.go b/espresso/devnet-tests/challenge_test.go index 179fc57c608ef..f8dfa4b537db0 100644 --- a/espresso/devnet-tests/challenge_test.go +++ b/espresso/devnet-tests/challenge_test.go @@ -15,7 +15,7 @@ func TestChallengeGame(t *testing.T) { defer cancel() d := NewDevnet(ctx, t) - require.NoError(t, d.Up()) + require.NoError(t, d.Up(NON_TEE)) defer func() { require.NoError(t, d.Down()) }() diff --git a/espresso/devnet-tests/devnet_tools.go b/espresso/devnet-tests/devnet_tools.go index 3f23cb2204c3d..adce98af2b9fc 100644 --- a/espresso/devnet-tests/devnet_tools.go +++ b/espresso/devnet-tests/devnet_tools.go @@ -111,7 +111,15 @@ func (d *Devnet) isRunning() bool { return len(out) > 0 } -func (d *Devnet) Up() (err error) { +// The setting for `COMPOES_PROFILES` when running the Docker Compose. +type ComposeProfile string + +const ( + TEE ComposeProfile = "tee" + NON_TEE ComposeProfile = "default" +) + +func (d *Devnet) Up(profile ComposeProfile) (err error) { if d.isRunning() { if err := d.Down(); err != nil { return err @@ -125,10 +133,10 @@ func (d *Devnet) Up() (err error) { d.ctx, "docker", "compose", "up", "-d", ) + cmd.Env = append(os.Environ(), "COMPOSE_PROFILES="+string(profile)) cmd.Env = append( os.Environ(), fmt.Sprintf("OP_BATCHER_PRIVATE_KEY=%s", hex.EncodeToString(crypto.FromECDSA(d.secrets.Batcher))), - "COMPOSE_PROFILES=default", ) buf := new(bytes.Buffer) cmd.Stderr = buf @@ -448,7 +456,37 @@ func (d *Devnet) Down() error { d.ctx, "docker", "compose", "down", "-v", "--remove-orphans", "--timeout", "10", ) - return cmd.Run() + if err := cmd.Run(); err != nil { + return fmt.Errorf("failed to shut down docker: %w", err) + } + + outBatcher, _ := exec.Command("docker", "ps", "-q", "--filter", "ancestor=op-batcher-tee:espresso").Output() + batcherContainers := strings.Fields(string(outBatcher)) + if len(batcherContainers) > 0 { + cmd = exec.Command("docker", append([]string{"stop"}, batcherContainers...)...) + if err := cmd.Run(); err != nil { + return fmt.Errorf("failed to stop the batcher container: %w", err) + } + cmd = exec.Command("docker", append([]string{"rm"}, batcherContainers...)...) + if err := cmd.Run(); err != nil { + return fmt.Errorf("failed to remove the batcher container: %w", err) + } + } + + outEnclave, _ := exec.Command("docker", "ps", "-aq", "--filter", "name=batcher-enclaver-").Output() + enclaveContainers := strings.Fields(string(outEnclave)) + if len(enclaveContainers) > 0 { + cmd = exec.Command("docker", append([]string{"stop"}, enclaveContainers...)...) + if err := cmd.Run(); err != nil { + return fmt.Errorf("failed to stop the enclave container: %w", err) + } + cmd = exec.Command("docker", append([]string{"rm"}, enclaveContainers...)...) + if err := cmd.Run(); err != nil { + return fmt.Errorf("failed to remove the enclave container: %w", err) + } + } + + return nil } type TaggedWriter struct { diff --git a/espresso/devnet-tests/key_rotation_test.go b/espresso/devnet-tests/key_rotation_test.go index cf9a39fd67fd0..d82188acfd57e 100644 --- a/espresso/devnet-tests/key_rotation_test.go +++ b/espresso/devnet-tests/key_rotation_test.go @@ -24,7 +24,7 @@ func TestRotateBatcherKey(t *testing.T) { // We're going to change batcher key to Bob's, verify that it won't be a no-op require.NotEqual(t, d.secrets.Batcher, d.secrets.Bob) - require.NoError(t, d.Up()) + require.NoError(t, d.Up(NON_TEE)) defer func() { require.NoError(t, d.Down()) }() @@ -66,7 +66,7 @@ func TestChangeBatchInboxOwner(t *testing.T) { d := NewDevnet(ctx, t) - require.NoError(t, d.Up()) + require.NoError(t, d.Up(NON_TEE)) defer func() { require.NoError(t, d.Down()) }() diff --git a/espresso/devnet-tests/smoke_test.go b/espresso/devnet-tests/smoke_test.go index 1e562d18f35bc..297792eb8196b 100644 --- a/espresso/devnet-tests/smoke_test.go +++ b/espresso/devnet-tests/smoke_test.go @@ -8,12 +8,26 @@ import ( "github.com/stretchr/testify/require" ) -func TestSmoke(t *testing.T) { +func TestSmokeWithoutTEE(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), 20*time.Minute) defer cancel() d := NewDevnet(ctx, t) - require.NoError(t, d.Up()) + require.NoError(t, d.Up(NON_TEE)) + defer func() { + require.NoError(t, d.Down()) + }() + + // Send a transaction just to check that everything has started up ok. + require.NoError(t, d.RunSimpleL2Burn()) +} + +func TestSmokeWithTEE(t *testing.T) { + ctx, cancel := context.WithTimeout(context.Background(), 20*time.Minute) + defer cancel() + + d := NewDevnet(ctx, t) + require.NoError(t, d.Up(TEE)) defer func() { require.NoError(t, d.Down()) }() diff --git a/espresso/devnet-tests/withdraw_test.go b/espresso/devnet-tests/withdraw_test.go index be84938036e46..4e82589fa823e 100644 --- a/espresso/devnet-tests/withdraw_test.go +++ b/espresso/devnet-tests/withdraw_test.go @@ -298,7 +298,7 @@ func TestWithdrawal(t *testing.T) { defer cancel() d := NewDevnet(ctx, t) - require.NoError(t, d.Up()) + require.NoError(t, d.Up(NON_TEE)) defer func() { require.NoError(t, d.Down()) }() diff --git a/justfile b/justfile index 53f20fc02eb01..8c8272e884c64 100644 --- a/justfile +++ b/justfile @@ -12,8 +12,8 @@ fast-tests: devnet-tests: build-devnet U_ID={{uid}} GID={{gid}} go test -timeout 30m -p 1 -count 1 -v ./espresso/devnet-tests/... -devnet-smoke-test: build-devnet - U_ID={{uid}} GID={{gid}} go test -timeout 30m -p 1 -count 1 -run 'TestSmoke' -v ./espresso/devnet-tests/... +devnet-smoke-test-without-tee: build-devnet + U_ID={{uid}} GID={{gid}} go test -timeout 30m -p 1 -count 1 -run 'TestSmokeWithoutTEE' -v ./espresso/devnet-tests/... devnet-withdrawal-test: build-devnet U_ID={{uid}} GID={{gid}} go test -timeout 30m -p 1 -count 1 -v -run TestWithdraw ./espresso/devnet-tests/...