Files
scroll/tests/integration-test/integration_test.go
2023-09-02 15:42:01 +08:00

166 lines
4.9 KiB
Go

package integration_test
import (
"context"
"log"
"math/big"
"testing"
"time"
"github.com/scroll-tech/go-ethereum/common"
gethTypes "github.com/scroll-tech/go-ethereum/core/types"
"github.com/stretchr/testify/assert"
"scroll-tech/integration-test/orm"
rapp "scroll-tech/prover/cmd/app"
"scroll-tech/database/migrate"
capp "scroll-tech/coordinator/cmd/app"
"scroll-tech/common/database"
"scroll-tech/common/docker"
"scroll-tech/common/types"
"scroll-tech/common/utils"
"scroll-tech/common/version"
bcmd "scroll-tech/rollup/cmd"
)
var (
base *docker.App
rollupApp *bcmd.MockApp
)
func TestMain(m *testing.M) {
base = docker.NewDockerApp()
rollupApp = bcmd.NewRollupApp(base, "../../rollup/conf/config.json")
m.Run()
rollupApp.Free()
base.Free()
}
func TestCoordinatorProverInteraction(t *testing.T) {
// Start postgres docker containers
base.RunL2Geth(t)
base.RunDBImage(t)
// Init data
dbCfg := &database.Config{
DSN: base.DBConfig.DSN,
DriverName: base.DBConfig.DriverName,
MaxOpenNum: base.DBConfig.MaxOpenNum,
MaxIdleNum: base.DBConfig.MaxIdleNum,
}
db, err := database.InitDB(dbCfg)
assert.NoError(t, err)
sqlDB, err := db.DB()
assert.NoError(t, err)
assert.NoError(t, migrate.ResetDB(sqlDB))
batchOrm := orm.NewBatch(db)
chunkOrm := orm.NewChunk(db)
l2BlockOrm := orm.NewL2Block(db)
// Connect to l2geth client
l2Client, err := base.L2Client()
if err != nil {
log.Fatalf("Failed to connect to the l2geth client: %v", err)
}
var header *gethTypes.Header
success := utils.TryTimes(10, func() bool {
header, err = l2Client.HeaderByNumber(context.Background(), big.NewInt(1))
if err != nil {
log.Printf("Failed to retrieve L2 genesis header: %v. Retrying...", err)
return false
}
return true
})
if !success {
log.Fatalf("Failed to retrieve L2 genesis header after multiple attempts: %v", err)
}
wrappedBlock := &types.WrappedBlock{
Header: header,
Transactions: nil,
WithdrawRoot: common.Hash{},
RowConsumption: &gethTypes.RowConsumption{},
}
chunk := &types.Chunk{Blocks: []*types.WrappedBlock{wrappedBlock}}
err = l2BlockOrm.InsertL2Blocks(context.Background(), []*types.WrappedBlock{wrappedBlock})
assert.NoError(t, err)
dbChunk, err := chunkOrm.InsertChunk(context.Background(), chunk)
assert.NoError(t, err)
err = l2BlockOrm.UpdateChunkHashInRange(context.Background(), 0, 100, dbChunk.Hash)
assert.NoError(t, err)
batch, err := batchOrm.InsertBatch(context.Background(), 0, 0, dbChunk.Hash, dbChunk.Hash, []*types.Chunk{chunk})
assert.NoError(t, err)
err = chunkOrm.UpdateBatchHashInRange(context.Background(), 0, 0, batch.Hash)
assert.NoError(t, err)
t.Log(version.Version)
base.Timestamp = time.Now().Nanosecond()
coordinatorApp := capp.NewCoordinatorApp(base, "../../coordinator/conf/config.json")
chunkProverApp := rapp.NewProverApp(base, utils.ChunkProverApp, "../../prover/config.json", coordinatorApp.HTTPEndpoint())
batchProverApp := rapp.NewProverApp(base, utils.BatchProverApp, "../../prover/config.json", coordinatorApp.HTTPEndpoint())
defer coordinatorApp.Free()
defer chunkProverApp.Free()
defer batchProverApp.Free()
// Run coordinator app.
coordinatorApp.RunApp(t)
// Run prover app.
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, 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()
batchProverApp.WaitExit()
coordinatorApp.WaitExit()
}
func TestProverReLogin(t *testing.T) {
// Start postgres docker containers.
base.RunL2Geth(t)
base.RunDBImage(t)
assert.NoError(t, migrate.ResetDB(base.DBClient(t)))
base.Timestamp = time.Now().Nanosecond()
coordinatorApp := capp.NewCoordinatorApp(base, "../../coordinator/conf/config.json")
chunkProverApp := rapp.NewProverApp(base, utils.ChunkProverApp, "../../prover/config.json", coordinatorApp.HTTPEndpoint())
batchProverApp := rapp.NewProverApp(base, utils.BatchProverApp, "../../prover/config.json", coordinatorApp.HTTPEndpoint())
defer coordinatorApp.Free()
defer chunkProverApp.Free()
defer batchProverApp.Free()
// Run coordinator app.
coordinatorApp.RunApp(t) // login timeout: 1 sec
// Run prover app.
chunkProverApp.ExpectWithTimeout(t, true, time.Second*40, "re-login success") // chunk prover login.
batchProverApp.ExpectWithTimeout(t, true, time.Second*40, "re-login success") // batch prover login.
chunkProverApp.RunApp(t)
batchProverApp.RunApp(t)
// Free apps.
chunkProverApp.WaitExit()
batchProverApp.WaitExit()
coordinatorApp.WaitExit()
}