fix(integration test): fix TestCoordinatorProverInteraction (#765)

Co-authored-by: HAOYUatHZ <37070449+HAOYUatHZ@users.noreply.github.com>
Co-authored-by: Péter Garamvölgyi <peter@scroll.io>
This commit is contained in:
maskpp
2023-08-10 17:20:25 +08:00
committed by GitHub
parent 244e5e915a
commit 49ec0b8fa8
10 changed files with 66 additions and 94 deletions

View File

@@ -16,8 +16,7 @@ on:
jobs: jobs:
tests: tests:
# if: github.event.pull_request.draft == false if: github.event.pull_request.draft == false
if: false
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Install Go - name: Install Go

View File

@@ -20,12 +20,17 @@ var (
MessageRelayerApp MockAppName = "message-relayer-test" MessageRelayerApp MockAppName = "message-relayer-test"
// RollupRelayerApp the name of mock rollup-relayer app. // RollupRelayerApp the name of mock rollup-relayer app.
RollupRelayerApp MockAppName = "rollup-relayer-test" RollupRelayerApp MockAppName = "rollup-relayer-test"
// CoordinatorApp the name of mock coordinator app.
CoordinatorApp MockAppName = "coordinator-test"
// DBCliApp the name of mock database app. // DBCliApp the name of mock database app.
DBCliApp MockAppName = "db_cli-test" 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. // RegisterSimulation register initializer function for integration-test.

View File

@@ -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 "-" // ZkVersion is commit-id of common/libzkp/impl/cargo.lock/scroll-prover and halo2, contacted by a "-"
var ZkVersion string // 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. // 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) var Version = fmt.Sprintf("%s-%s-%s", tag, commit, ZkVersion)

View File

@@ -56,7 +56,7 @@ func (bp *BatchProverTask) Assign(ctx *gin.Context, getTaskParameter *coordinato
return nil, fmt.Errorf("get prover version from context failed") return nil, fmt.Errorf("get prover version from context failed")
} }
if !version.CheckScrollProverVersion(proverVersion.(string)) { 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) batchTasks, err := bp.batchOrm.UpdateUnassignedBatchReturning(ctx, 1)

View File

@@ -56,7 +56,7 @@ func (cp *ChunkProverTask) Assign(ctx *gin.Context, getTaskParameter *coordinato
return nil, fmt.Errorf("get prover version from context failed") return nil, fmt.Errorf("get prover version from context failed")
} }
if !version.CheckScrollProverVersion(proverVersion.(string)) { 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 // load and send chunk tasks

View File

@@ -31,7 +31,8 @@ func init() {
} }
// Register `prover-test` app for integration-test. // 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 { func action(ctx *cli.Context) error {

View File

@@ -6,11 +6,21 @@ import (
"time" "time"
"scroll-tech/common/cmd" "scroll-tech/common/cmd"
"scroll-tech/common/utils"
"scroll-tech/common/version" "scroll-tech/common/version"
) )
func TestRunProver(t *testing.T) { func TestRunChunkProver(t *testing.T) {
prover := cmd.NewCmd("prover-test", "--version") 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() defer prover.WaitExit()
// wait result // wait result

View File

@@ -4,15 +4,12 @@ import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"os" "os"
"sync"
"testing" "testing"
"time" "time"
"github.com/google/uuid"
"github.com/scroll-tech/go-ethereum/rpc" "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/cmd"
"scroll-tech/common/docker" "scroll-tech/common/docker"
@@ -31,7 +28,7 @@ func getIndex() int {
// ProverApp prover-test client manager. // ProverApp prover-test client manager.
type ProverApp struct { type ProverApp struct {
Config *proverConfig.Config Config *config.Config
base *docker.App base *docker.App
@@ -41,23 +38,30 @@ type ProverApp struct {
index int index int
name string name string
args []string
docker.AppAPI docker.AppAPI
} }
// NewProverApp return a new proverApp manager. // NewProverApp return a new proverApp manager.
func NewProverApp(base *docker.App, file string, httpURL string, proofType message.ProofType) *ProverApp { func NewProverApp(base *docker.App, mockName utils.MockAppName, file string, httpURL string) *ProverApp {
uuid := uuid.New().String() var proofType message.ProofType
switch mockName {
proverFile := fmt.Sprintf("/tmp/%s_%d_prover-config.json", uuid, base.Timestamp) 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{ proverApp := &ProverApp{
base: base, base: base,
originFile: file, originFile: file,
proverFile: proverFile, 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(), index: getIndex(),
name: string(utils.ProverApp), name: name,
args: []string{"--log.debug", "--config", proverFile}, AppAPI: cmd.NewCmd(name, []string{"--log.debug", "--config", proverFile}...),
} }
if err := proverApp.MockConfig(true, httpURL, proofType); err != nil { if err := proverApp.MockConfig(true, httpURL, proofType); err != nil {
panic(err) 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. // RunApp run prover-test child process by multi parameters.
func (r *ProverApp) RunApp(t *testing.T, args ...string) { func (r *ProverApp) RunApp(t *testing.T) {
r.AppAPI = cmd.NewCmd(r.name, append(r.args, args...)...)
r.AppAPI.RunApp(func() bool { return r.AppAPI.WaitResult(t, time.Second*40, "prover start successfully") }) 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. // Free stop and release prover-test.
func (r *ProverApp) Free() { func (r *ProverApp) Free() {
if !utils.IsNil(r.AppAPI) { if !utils.IsNil(r.AppAPI) {
@@ -90,7 +86,7 @@ func (r *ProverApp) Free() {
// MockConfig creates a new prover config. // MockConfig creates a new prover config.
func (r *ProverApp) MockConfig(store bool, httpURL string, proofType message.ProofType) error { 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 { if err != nil {
return err return err
} }
@@ -123,47 +119,3 @@ func (r *ProverApp) MockConfig(store bool, httpURL string, proofType message.Pro
} }
return os.WriteFile(r.proverFile, data, 0600) 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()
}

View File

@@ -4,12 +4,10 @@ go 1.19
require ( require (
github.com/go-resty/resty/v2 v2.7.0 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/scroll-tech/go-ethereum v1.10.14-0.20230804022247-26eeb40ea3ca
github.com/stretchr/testify v1.8.3 github.com/stretchr/testify v1.8.3
github.com/urfave/cli/v2 v2.25.7 github.com/urfave/cli/v2 v2.25.7
go.etcd.io/bbolt v1.3.7 go.etcd.io/bbolt v1.3.7
golang.org/x/sync v0.3.0
) )
require ( require (
@@ -21,6 +19,7 @@ require (
github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-ole/go-ole v1.2.6 // indirect
github.com/go-stack/stack v1.8.1 // indirect github.com/go-stack/stack v1.8.1 // indirect
github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // 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/gorilla/websocket v1.5.0 // indirect
github.com/holiman/uint256 v1.2.3 // indirect github.com/holiman/uint256 v1.2.3 // indirect
github.com/huin/goupnp v1.0.3 // indirect github.com/huin/goupnp v1.0.3 // indirect
@@ -45,6 +44,7 @@ require (
github.com/yusufpapurcu/wmi v1.2.2 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect
golang.org/x/crypto v0.11.0 // indirect golang.org/x/crypto v0.11.0 // indirect
golang.org/x/net v0.12.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/sys v0.10.0 // indirect
golang.org/x/time v0.3.0 // indirect golang.org/x/time v0.3.0 // indirect
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect

View File

@@ -22,7 +22,6 @@ import (
"scroll-tech/common/database" "scroll-tech/common/database"
"scroll-tech/common/docker" "scroll-tech/common/docker"
"scroll-tech/common/types" "scroll-tech/common/types"
"scroll-tech/common/types/message"
"scroll-tech/common/utils" "scroll-tech/common/utils"
"scroll-tech/common/version" "scroll-tech/common/version"
@@ -38,13 +37,11 @@ var (
) )
func TestMain(m *testing.M) { func TestMain(m *testing.M) {
version.Version = "v1.2.3-aaa-bbb-ccc"
base = docker.NewDockerApp() base = docker.NewDockerApp()
bridgeApp = bcmd.NewBridgeApp(base, "../../bridge/conf/config.json") bridgeApp = bcmd.NewBridgeApp(base, "../../bridge/conf/config.json")
coordinatorApp = capp.NewCoordinatorApp(base, "../../coordinator/conf/config.json") coordinatorApp = capp.NewCoordinatorApp(base, "../../coordinator/conf/config.json")
chunkProverApp = rapp.NewProverApp(base, "../../prover/config.json", coordinatorApp.HTTPEndpoint(), message.ProofTypeChunk) chunkProverApp = rapp.NewProverApp(base, utils.ChunkProverApp, "../../prover/config.json", coordinatorApp.HTTPEndpoint())
batchProverApp = rapp.NewProverApp(base, "../../prover/config.json", coordinatorApp.HTTPEndpoint(), message.ProofTypeBatch) batchProverApp = rapp.NewProverApp(base, utils.BatchProverApp, "../../prover/config.json", coordinatorApp.HTTPEndpoint())
m.Run() m.Run()
bridgeApp.Free() bridgeApp.Free()
coordinatorApp.Free() coordinatorApp.Free()
@@ -115,17 +112,21 @@ func TestCoordinatorProverInteraction(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
err = chunkOrm.UpdateBatchHashInRange(context.Background(), 0, 0, batch.Hash) err = chunkOrm.UpdateBatchHashInRange(context.Background(), 0, 0, batch.Hash)
assert.NoError(t, err) assert.NoError(t, err)
t.Log(version.Version)
// Run coordinator app. // Run coordinator app.
coordinatorApp.RunApp(t) coordinatorApp.RunApp(t)
// Run prover app. // Run prover app.
chunkProverApp.RunAppWithExpectedResult(t, "proof submitted successfully") // chunk prover login -> get task -> submit proof. chunkProverApp.ExpectWithTimeout(t, true, time.Second*40, "proof submitted successfully") // chunk prover login -> get task -> submit proof.
batchProverApp.RunAppWithExpectedResult(t, "proof submitted successfully") // batch 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. // All task has been proven, coordinator would not return any task.
chunkProverApp.ExpectWithTimeout(t, false, 60*time.Second, "get empty prover task") chunkProverApp.ExpectWithTimeout(t, true, 60*time.Second, "get empty prover task")
batchProverApp.ExpectWithTimeout(t, false, 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. // Free apps.
chunkProverApp.WaitExit() chunkProverApp.WaitExit()
@@ -142,10 +143,12 @@ func TestProverReLogin(t *testing.T) {
// Run coordinator app. // Run coordinator app.
coordinatorApp.RunApp(t) // login timeout: 1 sec coordinatorApp.RunApp(t) // login timeout: 1 sec
chunkProverApp.RunApp(t)
batchProverApp.RunApp(t)
// Run prover app. // Run prover app.
chunkProverApp.RunAppWithExpectedResult(t, "re-login success") // chunk prover login. chunkProverApp.WaitResult(t, time.Second*40, "re-login success") // chunk prover login.
batchProverApp.RunAppWithExpectedResult(t, "re-login success") // batch prover login. batchProverApp.WaitResult(t, time.Second*40, "re-login success") // batch prover login.
// Free apps. // Free apps.
chunkProverApp.WaitExit() chunkProverApp.WaitExit()