storj/integration/ui/uitest/run.go

93 lines
2.3 KiB
Go
Raw Normal View History

// Copyright (C) 2021 Storj Labs, Inc.
// See LICENSE for copying information.
package uitest
import (
"fmt"
"os"
"testing"
"time"
"github.com/go-rod/rod"
"github.com/go-rod/rod/lib/launcher"
"github.com/go-rod/rod/lib/utils"
"github.com/stretchr/testify/require"
"go.uber.org/zap"
"go.uber.org/zap/zaptest"
"storj.io/common/testcontext"
"storj.io/storj/private/testplanet"
"storj.io/storj/satellite"
)
// Test defines common services for uitests.
type Test func(t *testing.T, ctx *testcontext.Context, planet *testplanet.Planet, browser *rod.Browser)
type zapWriter struct {
*zap.Logger
}
func (log zapWriter) Write(data []byte) (int, error) {
log.Logger.Info(string(data))
return len(data), nil
}
// Run starts a new UI test.
func Run(t *testing.T, test Test) {
if os.Getenv("STORJ_TEST_SATELLITE_WEB") == "" {
t.Skip("Enable UI tests by setting STORJ_TEST_SATELLITE_WEB to built npm")
}
if os.Getenv("STORJ_TEST_SATELLITE_WEB") == "omit" {
return
}
testplanet.Run(t, testplanet.Config{
SatelliteCount: 1, StorageNodeCount: 4, UplinkCount: 1,
Reconfigure: testplanet.Reconfigure{
Satellite: func(log *zap.Logger, index int, config *satellite.Config) {
config.Console.StaticDir = os.Getenv("STORJ_TEST_SATELLITE_WEB")
},
},
NonParallel: true,
}, func(t *testing.T, ctx *testcontext.Context, planet *testplanet.Planet) {
showBrowser := os.Getenv("STORJ_TEST_SHOW_BROWSER") != ""
logLauncher := zaptest.NewLogger(t).Named("launcher")
launch := launcher.New().
Headless(!showBrowser).
Leakless(false).
Devtools(false).
NoSandbox(true).
UserDataDir(ctx.Dir("browser")).
Logger(zapWriter{Logger: logLauncher})
if browserBin := os.Getenv("STORJ_TEST_BROWSER"); browserBin != "" {
launch = launch.Bin(browserBin)
}
defer launch.Cleanup()
url, err := launch.Launch()
require.NoError(t, err)
logBrowser := zaptest.NewLogger(t).Named("rod")
browser := rod.New().
Timeout(time.Minute).
ControlURL(url).
SlowMotion(300 * time.Millisecond).
Logger(utils.Log(func(msg ...interface{}) {
logBrowser.Info(fmt.Sprintln(msg...))
})).
Context(ctx).
WithPanic(func(v interface{}) { require.Fail(t, "check failed", v) })
defer ctx.Check(browser.Close)
require.NoError(t, browser.Connect())
test(t, ctx, planet, browser)
})
}