diff --git a/.github/workflows/integration.yaml b/.github/workflows/integration.yaml index e45d830d9..d05919f07 100644 --- a/.github/workflows/integration.yaml +++ b/.github/workflows/integration.yaml @@ -16,8 +16,7 @@ on: jobs: tests: - # if: github.event.pull_request.draft == false - if: false + if: github.event.pull_request.draft == false runs-on: ubuntu-latest steps: - name: Install Go diff --git a/common/utils/simulation.go b/common/utils/simulation.go index 39d95c27b..320cdafc0 100644 --- a/common/utils/simulation.go +++ b/common/utils/simulation.go @@ -20,12 +20,17 @@ var ( MessageRelayerApp MockAppName = "message-relayer-test" // RollupRelayerApp the name of mock rollup-relayer app. RollupRelayerApp MockAppName = "rollup-relayer-test" - // CoordinatorApp the name of mock coordinator app. - CoordinatorApp MockAppName = "coordinator-test" + // DBCliApp the name of mock database app. DBCliApp MockAppName = "db_cli-test" - // ProverApp the name of mock prover app. - ProverApp MockAppName = "prover-test" + + // CoordinatorApp the name of mock coordinator app. + CoordinatorApp MockAppName = "coordinator-test" + + // ChunkProverApp the name of mock chunk prover app. + ChunkProverApp MockAppName = "chunkProver-test" + // BatchProverApp the name of mock batch prover app. + BatchProverApp MockAppName = "batchProver-test" ) // RegisterSimulation register initializer function for integration-test. diff --git a/common/version/version.go b/common/version/version.go index 7595f32a6..fac365b93 100644 --- a/common/version/version.go +++ b/common/version/version.go @@ -20,11 +20,13 @@ var commit = func() string { } } } - return "" + // Set default value for integration test. + return "000000" }() -// ZkVersion is commit-id of common/libzkp/impl/cargo.lock/scroll-prover and halo2, concated by a "-" -var ZkVersion string +// ZkVersion is commit-id of common/libzkp/impl/cargo.lock/scroll-prover and halo2, contacted by a "-" +// The default `000000-000000` is set for integration test, and will be overwritten by coordinator's & prover's actual compilations (see their Makefiles). +var ZkVersion = "000000-000000" // Version denote the version of scroll protocol, including the l2geth, relayer, coordinator, prover, contracts and etc. var Version = fmt.Sprintf("%s-%s-%s", tag, commit, ZkVersion) diff --git a/coordinator/internal/logic/provertask/batch_prover_task.go b/coordinator/internal/logic/provertask/batch_prover_task.go index 83bf4fa2a..7f420cb93 100644 --- a/coordinator/internal/logic/provertask/batch_prover_task.go +++ b/coordinator/internal/logic/provertask/batch_prover_task.go @@ -56,7 +56,7 @@ func (bp *BatchProverTask) Assign(ctx *gin.Context, getTaskParameter *coordinato return nil, fmt.Errorf("get prover version from context failed") } if !version.CheckScrollProverVersion(proverVersion.(string)) { - return nil, fmt.Errorf("incompatible prover version. please upgrade your prover") + return nil, fmt.Errorf("incompatible prover version. please upgrade your prover, expect version: %s, actual version: %s", proverVersion.(string), version.Version) } batchTasks, err := bp.batchOrm.UpdateUnassignedBatchReturning(ctx, 1) diff --git a/coordinator/internal/logic/provertask/chunk_prover_task.go b/coordinator/internal/logic/provertask/chunk_prover_task.go index 4088bad46..379583974 100644 --- a/coordinator/internal/logic/provertask/chunk_prover_task.go +++ b/coordinator/internal/logic/provertask/chunk_prover_task.go @@ -56,7 +56,7 @@ func (cp *ChunkProverTask) Assign(ctx *gin.Context, getTaskParameter *coordinato return nil, fmt.Errorf("get prover version from context failed") } if !version.CheckScrollProverVersion(proverVersion.(string)) { - return nil, fmt.Errorf("incompatible prover version. please upgrade your prover") + return nil, fmt.Errorf("incompatible prover version. please upgrade your prover, expect version: %s, actual version: %s", version.Version, proverVersion.(string)) } // load and send chunk tasks diff --git a/prover/cmd/app/app.go b/prover/cmd/app/app.go index db2c1edd5..216c8ca1e 100644 --- a/prover/cmd/app/app.go +++ b/prover/cmd/app/app.go @@ -31,7 +31,8 @@ func init() { } // Register `prover-test` app for integration-test. - utils.RegisterSimulation(app, utils.ProverApp) + utils.RegisterSimulation(app, utils.ChunkProverApp) + utils.RegisterSimulation(app, utils.BatchProverApp) } func action(ctx *cli.Context) error { diff --git a/prover/cmd/app/app_test.go b/prover/cmd/app/app_test.go index c7e4d3e11..42f2e27c6 100644 --- a/prover/cmd/app/app_test.go +++ b/prover/cmd/app/app_test.go @@ -6,11 +6,21 @@ import ( "time" "scroll-tech/common/cmd" + "scroll-tech/common/utils" "scroll-tech/common/version" ) -func TestRunProver(t *testing.T) { - prover := cmd.NewCmd("prover-test", "--version") +func TestRunChunkProver(t *testing.T) { + prover := cmd.NewCmd(string(utils.ChunkProverApp), "--version") + defer prover.WaitExit() + + // wait result + prover.ExpectWithTimeout(t, true, time.Second*3, fmt.Sprintf("prover version %s", version.Version)) + prover.RunApp(nil) +} + +func TestRunBatchProver(t *testing.T) { + prover := cmd.NewCmd(string(utils.BatchProverApp), "--version") defer prover.WaitExit() // wait result diff --git a/prover/cmd/app/mock_app.go b/prover/cmd/app/mock_app.go index 5b11d1747..298e08d85 100644 --- a/prover/cmd/app/mock_app.go +++ b/prover/cmd/app/mock_app.go @@ -4,15 +4,12 @@ import ( "encoding/json" "fmt" "os" - "sync" "testing" "time" - "github.com/google/uuid" "github.com/scroll-tech/go-ethereum/rpc" - "golang.org/x/sync/errgroup" - proverConfig "scroll-tech/prover/config" + "scroll-tech/prover/config" "scroll-tech/common/cmd" "scroll-tech/common/docker" @@ -31,7 +28,7 @@ func getIndex() int { // ProverApp prover-test client manager. type ProverApp struct { - Config *proverConfig.Config + Config *config.Config base *docker.App @@ -41,23 +38,30 @@ type ProverApp struct { index int name string - args []string docker.AppAPI } // NewProverApp return a new proverApp manager. -func NewProverApp(base *docker.App, file string, httpURL string, proofType message.ProofType) *ProverApp { - uuid := uuid.New().String() - - proverFile := fmt.Sprintf("/tmp/%s_%d_prover-config.json", uuid, base.Timestamp) +func NewProverApp(base *docker.App, mockName utils.MockAppName, file string, httpURL string) *ProverApp { + var proofType message.ProofType + switch mockName { + case utils.ChunkProverApp: + proofType = message.ProofTypeChunk + case utils.BatchProverApp: + proofType = message.ProofTypeBatch + default: + return nil + } + name := string(mockName) + proverFile := fmt.Sprintf("/tmp/%d_%s-config.json", base.Timestamp, name) proverApp := &ProverApp{ base: base, originFile: file, proverFile: proverFile, - bboltDB: fmt.Sprintf("/tmp/%s_%d_bbolt_db", uuid, base.Timestamp), + bboltDB: fmt.Sprintf("/tmp/%d_%s_bbolt_db", base.Timestamp, name), index: getIndex(), - name: string(utils.ProverApp), - args: []string{"--log.debug", "--config", proverFile}, + name: name, + AppAPI: cmd.NewCmd(name, []string{"--log.debug", "--config", proverFile}...), } if err := proverApp.MockConfig(true, httpURL, proofType); err != nil { panic(err) @@ -66,18 +70,10 @@ func NewProverApp(base *docker.App, file string, httpURL string, proofType messa } // RunApp run prover-test child process by multi parameters. -func (r *ProverApp) RunApp(t *testing.T, args ...string) { - r.AppAPI = cmd.NewCmd(r.name, append(r.args, args...)...) +func (r *ProverApp) RunApp(t *testing.T) { r.AppAPI.RunApp(func() bool { return r.AppAPI.WaitResult(t, time.Second*40, "prover start successfully") }) } -// RunAppWithExpectedResult runs the prover-test child process with multiple parameters, -// and checks for a specific expected result in the output. -func (r *ProverApp) RunAppWithExpectedResult(t *testing.T, expectedResult string, args ...string) { - r.AppAPI = cmd.NewCmd(r.name, append(r.args, args...)...) - r.AppAPI.RunApp(func() bool { return r.AppAPI.WaitResult(t, time.Second*40, expectedResult) }) -} - // Free stop and release prover-test. func (r *ProverApp) Free() { if !utils.IsNil(r.AppAPI) { @@ -90,7 +86,7 @@ func (r *ProverApp) Free() { // MockConfig creates a new prover config. func (r *ProverApp) MockConfig(store bool, httpURL string, proofType message.ProofType) error { - cfg, err := proverConfig.NewConfig(r.originFile) + cfg, err := config.NewConfig(r.originFile) if err != nil { return err } @@ -123,47 +119,3 @@ func (r *ProverApp) MockConfig(store bool, httpURL string, proofType message.Pro } return os.WriteFile(r.proverFile, data, 0600) } - -// ProverApps proverApp list. -type ProverApps []*ProverApp - -// RunApps starts all the proverApps. -func (r ProverApps) RunApps(t *testing.T, args ...string) { - var eg errgroup.Group - for i := range r { - i := i - eg.Go(func() error { - r[i].RunApp(t, args...) - return nil - }) - } - _ = eg.Wait() -} - -// Free releases proverApps. -func (r ProverApps) Free() { - var wg sync.WaitGroup - wg.Add(len(r)) - for i := range r { - i := i - go func() { - r[i].Free() - wg.Done() - }() - } - wg.Wait() -} - -// WaitExit wait proverApps stopped. -func (r ProverApps) WaitExit() { - var wg sync.WaitGroup - wg.Add(len(r)) - for i := range r { - i := i - go func() { - r[i].WaitExit() - wg.Done() - }() - } - wg.Wait() -} diff --git a/prover/go.mod b/prover/go.mod index 83769aaf0..b8e73d46d 100644 --- a/prover/go.mod +++ b/prover/go.mod @@ -4,12 +4,10 @@ go 1.19 require ( github.com/go-resty/resty/v2 v2.7.0 - github.com/google/uuid v1.3.0 github.com/scroll-tech/go-ethereum v1.10.14-0.20230804022247-26eeb40ea3ca github.com/stretchr/testify v1.8.3 github.com/urfave/cli/v2 v2.25.7 go.etcd.io/bbolt v1.3.7 - golang.org/x/sync v0.3.0 ) require ( @@ -21,6 +19,7 @@ require ( github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-stack/stack v1.8.1 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect + github.com/google/uuid v1.3.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/holiman/uint256 v1.2.3 // indirect github.com/huin/goupnp v1.0.3 // indirect @@ -45,6 +44,7 @@ require ( github.com/yusufpapurcu/wmi v1.2.2 // indirect golang.org/x/crypto v0.11.0 // indirect golang.org/x/net v0.12.0 // indirect + golang.org/x/sync v0.3.0 // indirect golang.org/x/sys v0.10.0 // indirect golang.org/x/time v0.3.0 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect diff --git a/tests/integration-test/integration_test.go b/tests/integration-test/integration_test.go index b4e77eef6..5e2f4977e 100644 --- a/tests/integration-test/integration_test.go +++ b/tests/integration-test/integration_test.go @@ -22,7 +22,6 @@ import ( "scroll-tech/common/database" "scroll-tech/common/docker" "scroll-tech/common/types" - "scroll-tech/common/types/message" "scroll-tech/common/utils" "scroll-tech/common/version" @@ -38,13 +37,11 @@ var ( ) func TestMain(m *testing.M) { - version.Version = "v1.2.3-aaa-bbb-ccc" - base = docker.NewDockerApp() bridgeApp = bcmd.NewBridgeApp(base, "../../bridge/conf/config.json") coordinatorApp = capp.NewCoordinatorApp(base, "../../coordinator/conf/config.json") - chunkProverApp = rapp.NewProverApp(base, "../../prover/config.json", coordinatorApp.HTTPEndpoint(), message.ProofTypeChunk) - batchProverApp = rapp.NewProverApp(base, "../../prover/config.json", coordinatorApp.HTTPEndpoint(), message.ProofTypeBatch) + chunkProverApp = rapp.NewProverApp(base, utils.ChunkProverApp, "../../prover/config.json", coordinatorApp.HTTPEndpoint()) + batchProverApp = rapp.NewProverApp(base, utils.BatchProverApp, "../../prover/config.json", coordinatorApp.HTTPEndpoint()) m.Run() bridgeApp.Free() coordinatorApp.Free() @@ -115,17 +112,21 @@ func TestCoordinatorProverInteraction(t *testing.T) { assert.NoError(t, err) err = chunkOrm.UpdateBatchHashInRange(context.Background(), 0, 0, batch.Hash) assert.NoError(t, err) + t.Log(version.Version) // Run coordinator app. coordinatorApp.RunApp(t) // Run prover app. - chunkProverApp.RunAppWithExpectedResult(t, "proof submitted successfully") // chunk prover login -> get task -> submit proof. - batchProverApp.RunAppWithExpectedResult(t, "proof submitted successfully") // batch prover login -> get task -> submit proof. + chunkProverApp.ExpectWithTimeout(t, true, time.Second*40, "proof submitted successfully") // chunk prover login -> get task -> submit proof. + batchProverApp.ExpectWithTimeout(t, true, time.Second*40, "proof submitted successfully") // batch prover login -> get task -> submit proof. // All task has been proven, coordinator would not return any task. - chunkProverApp.ExpectWithTimeout(t, false, 60*time.Second, "get empty prover task") - batchProverApp.ExpectWithTimeout(t, false, 60*time.Second, "get empty prover task") + chunkProverApp.ExpectWithTimeout(t, true, 60*time.Second, "get empty prover task") + batchProverApp.ExpectWithTimeout(t, true, 60*time.Second, "get empty prover task") + + chunkProverApp.RunApp(t) + batchProverApp.RunApp(t) // Free apps. chunkProverApp.WaitExit() @@ -142,10 +143,12 @@ func TestProverReLogin(t *testing.T) { // Run coordinator app. coordinatorApp.RunApp(t) // login timeout: 1 sec + chunkProverApp.RunApp(t) + batchProverApp.RunApp(t) // Run prover app. - chunkProverApp.RunAppWithExpectedResult(t, "re-login success") // chunk prover login. - batchProverApp.RunAppWithExpectedResult(t, "re-login success") // batch prover login. + chunkProverApp.WaitResult(t, time.Second*40, "re-login success") // chunk prover login. + batchProverApp.WaitResult(t, time.Second*40, "re-login success") // batch prover login. // Free apps. chunkProverApp.WaitExit()