Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor to k6 lookupEnv and abstract env. var. lookup #918

Merged
merged 28 commits into from
Jun 6, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
0d39d40
Rename RootModule.once to initOnce for clarity
inancgumus Jun 1, 2023
42fc913
Move RootModule init to a function
inancgumus Jun 2, 2023
cd861d7
Move debug server to NewModuleInstance
inancgumus Jun 2, 2023
cd85bb2
Fix abort if remote registry fails to register
inancgumus Jun 2, 2023
27c97e2
Add empty LookupEnv field to module test
inancgumus Jun 2, 2023
97d5c3a
Add LookupEnv to k6test.NewVU
inancgumus Jun 1, 2023
63bc0ec
Refactor NewBrowserType slightly
inancgumus Jun 2, 2023
bdb8727
Use k6 lookup in BrowserType and RootModule.init
inancgumus Jun 2, 2023
6d8dd09
Add withLookupFunc to testBrowser
inancgumus Jun 2, 2023
2049cad
Use env.LookupEnv in RootModule.initialize
inancgumus Jun 2, 2023
8871fbd
Remove SetEnvLookupper from BrowserType
inancgumus Jun 2, 2023
bb78b8a
Remove testBrowser.withBrowserOptions
inancgumus Jun 2, 2023
c784100
Remove testBrowser.setupEnvLookupper
inancgumus Jun 2, 2023
11f39a9
Remove browserOptions from tests
inancgumus Jun 2, 2023
34d2c16
Add testingT helper to test for failing tests
inancgumus Jun 2, 2023
6259634
Add TestTestBrowserWithLookupFunc
inancgumus Jun 2, 2023
30161e6
Use TMPDIR from k6 LookupEnv in BrowserType
inancgumus Jun 1, 2023
cb6572f
Use LookupEnv for USERPROFILE in ExecutablePath
inancgumus Jun 1, 2023
ad4ec6f
Use LookupEnv in makeLogger
inancgumus Jun 1, 2023
73b0199
Refactor TestIsRemoteBrowser
inancgumus Jun 1, 2023
a46ed22
Remove the old relic SKIP_FLAKKY
inancgumus Jun 1, 2023
ad81e72
Remove setenv from TestIsRemoteBrowser
inancgumus Jun 1, 2023
6825710
Refactor env.var. names to constants
inancgumus Jun 1, 2023
d2cc3c9
Add environment lookup func helpers
inancgumus Jun 1, 2023
e5fbe42
Remove unnecessary withLookup types
inancgumus Jun 1, 2023
1207e02
Update Dockerfile to use K6_BROWSER_HEADLESS
inancgumus Jun 2, 2023
6ffa156
Update workflows to use K6_BROWSER_HEADLESS
inancgumus Jun 2, 2023
3edd61b
Remove default env lookup from test browser
inancgumus Jun 6, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
8 changes: 4 additions & 4 deletions browser/module_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import (
"github.com/dop251/goja"
"github.com/stretchr/testify/require"

"github.com/grafana/xk6-browser/env"

k6common "go.k6.io/k6/js/common"
k6modulestest "go.k6.io/k6/js/modulestest"
k6lib "go.k6.io/k6/lib"
Expand All @@ -23,10 +25,8 @@ func TestModuleNew(t *testing.T) {
RuntimeField: goja.New(),
InitEnvField: &k6common.InitEnvironment{
TestPreInitState: &k6lib.TestPreInitState{
Registry: k6metrics.NewRegistry(),
LookupEnv: func(key string) (string, bool) {
return "", false
},
Registry: k6metrics.NewRegistry(),
LookupEnv: env.EmptyLookup,
},
},
CtxField: context.Background(),
Expand Down
90 changes: 18 additions & 72 deletions common/browser_options_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,6 @@ func TestBrowserOptionsParse(t *testing.T) { //nolint:gocognit
Timeout: DefaultTimeout,
}

noopEnvLookuper := func(string) (string, bool) {
return "", false
}

for name, tt := range map[string]struct {
opts map[string]any
envLookupper env.LookupFunc
Expand All @@ -36,7 +32,7 @@ func TestBrowserOptionsParse(t *testing.T) { //nolint:gocognit
opts: map[string]any{
"type": "chromium",
},
envLookupper: noopEnvLookuper,
envLookupper: env.EmptyLookup,
assert: func(tb testing.TB, lo *BrowserOptions) {
tb.Helper()
assert.Equal(t, defaultOptions, lo)
Expand All @@ -46,7 +42,7 @@ func TestBrowserOptionsParse(t *testing.T) { //nolint:gocognit
opts: map[string]any{
"type": "chromium",
},
envLookupper: noopEnvLookuper,
envLookupper: env.EmptyLookup,
assert: func(tb testing.TB, lo *BrowserOptions) {
tb.Helper()
assert.Equal(t, defaultOptions, lo)
Expand Down Expand Up @@ -113,12 +109,7 @@ func TestBrowserOptionsParse(t *testing.T) { //nolint:gocognit
opts: map[string]any{
"type": "chromium",
},
envLookupper: func(k string) (string, bool) {
if k == env.BrowserArguments {
return "browser-arg1='value1,browser-arg2=value2,browser-flag", true
}
return "", false
},
envLookupper: env.ConstLookup(env.BrowserArguments, "browser-arg1='value1,browser-arg2=value2,browser-flag"),
assert: func(tb testing.TB, lo *BrowserOptions) {
tb.Helper()
require.Len(tb, lo.Args, 3)
Expand All @@ -131,12 +122,7 @@ func TestBrowserOptionsParse(t *testing.T) { //nolint:gocognit
opts: map[string]any{
"type": "chromium",
},
envLookupper: func(k string) (string, bool) {
if k == env.BrowserEnableDebugging {
return "true", true
}
return "", false
},
envLookupper: env.ConstLookup(env.BrowserEnableDebugging, "true"),
assert: func(tb testing.TB, lo *BrowserOptions) {
tb.Helper()
assert.True(t, lo.Debug)
Expand All @@ -146,24 +132,14 @@ func TestBrowserOptionsParse(t *testing.T) { //nolint:gocognit
opts: map[string]any{
"type": "chromium",
},
envLookupper: func(k string) (string, bool) {
if k == env.BrowserEnableDebugging {
return "non-boolean", true
}
return "", false
},
err: "K6_BROWSER_DEBUG should be a boolean",
envLookupper: env.ConstLookup(env.BrowserEnableDebugging, "non-boolean"),
err: "K6_BROWSER_DEBUG should be a boolean",
},
"executablePath": {
opts: map[string]any{
"type": "chromium",
},
envLookupper: func(k string) (string, bool) {
if k == env.BrowserExecutablePath {
return "cmd/somewhere", true
}
return "", false
},
envLookupper: env.ConstLookup(env.BrowserExecutablePath, "cmd/somewhere"),
assert: func(tb testing.TB, lo *BrowserOptions) {
tb.Helper()
assert.Equal(t, "cmd/somewhere", lo.ExecutablePath)
Expand All @@ -173,12 +149,7 @@ func TestBrowserOptionsParse(t *testing.T) { //nolint:gocognit
opts: map[string]any{
"type": "chromium",
},
envLookupper: func(k string) (string, bool) {
if k == env.BrowserHeadless {
return "false", true
}
return "", false
},
envLookupper: env.ConstLookup(env.BrowserHeadless, "false"),
assert: func(tb testing.TB, lo *BrowserOptions) {
tb.Helper()
assert.False(t, lo.Headless)
Expand All @@ -188,24 +159,14 @@ func TestBrowserOptionsParse(t *testing.T) { //nolint:gocognit
opts: map[string]any{
"type": "chromium",
},
envLookupper: func(k string) (string, bool) {
if k == env.BrowserHeadless {
return "non-boolean", true
}
return "", false
},
err: "K6_BROWSER_HEADLESS should be a boolean",
envLookupper: env.ConstLookup(env.BrowserHeadless, "non-boolean"),
err: "K6_BROWSER_HEADLESS should be a boolean",
},
"ignoreDefaultArgs": {
opts: map[string]any{
"type": "chromium",
},
envLookupper: func(k string) (string, bool) {
if k == env.BrowserIgnoreDefaultArgs {
return "--hide-scrollbars,--hide-something", true
}
return "", false
},
envLookupper: env.ConstLookup(env.BrowserIgnoreDefaultArgs, "--hide-scrollbars,--hide-something"),
assert: func(tb testing.TB, lo *BrowserOptions) {
tb.Helper()
assert.Len(t, lo.IgnoreDefaultArgs, 2)
Expand All @@ -217,12 +178,7 @@ func TestBrowserOptionsParse(t *testing.T) { //nolint:gocognit
opts: map[string]any{
"type": "chromium",
},
envLookupper: func(k string) (string, bool) {
if k == env.LogCategoryFilter {
return "**", true
}
return "", false
},
envLookupper: env.ConstLookup(env.LogCategoryFilter, "**"),
assert: func(tb testing.TB, lo *BrowserOptions) {
tb.Helper()
assert.Equal(t, "**", lo.LogCategoryFilter)
Expand All @@ -232,12 +188,7 @@ func TestBrowserOptionsParse(t *testing.T) { //nolint:gocognit
opts: map[string]any{
"type": "chromium",
},
envLookupper: func(k string) (string, bool) {
if k == env.BrowserGlobalTimeout {
return "10s", true
}
return "", false
},
envLookupper: env.ConstLookup(env.BrowserGlobalTimeout, "10s"),
assert: func(tb testing.TB, lo *BrowserOptions) {
tb.Helper()
assert.Equal(t, 10*time.Second, lo.Timeout)
Expand All @@ -247,19 +198,14 @@ func TestBrowserOptionsParse(t *testing.T) { //nolint:gocognit
opts: map[string]any{
"type": "chromium",
},
envLookupper: func(k string) (string, bool) {
if k == env.BrowserGlobalTimeout {
return "ABC", true
}
return "", false
},
err: "K6_BROWSER_TIMEOUT should be a time duration value",
envLookupper: env.ConstLookup(env.BrowserGlobalTimeout, "ABC"),
err: "K6_BROWSER_TIMEOUT should be a time duration value",
},
"browser_type": {
opts: map[string]any{
"type": "chromium",
},
envLookupper: noopEnvLookuper,
envLookupper: env.EmptyLookup,
assert: func(tb testing.TB, lo *BrowserOptions) {
tb.Helper()
// Noop, just expect no error
Expand All @@ -269,11 +215,11 @@ func TestBrowserOptionsParse(t *testing.T) { //nolint:gocognit
opts: map[string]any{
"type": "mybrowsertype",
},
envLookupper: noopEnvLookuper,
envLookupper: env.EmptyLookup,
err: "unsupported browser type: mybrowsertype",
},
"browser_type_unset_err": {
envLookupper: noopEnvLookuper,
envLookupper: env.EmptyLookup,
err: "browser type option must be set",
},
} {
Expand Down
20 changes: 20 additions & 0 deletions env/env.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
// Package env provides types to interact with environment setup.
package env

import "os"

// Execution specific.
const (
// InstanceScenarios is an environment variable that can be used to
Expand Down Expand Up @@ -62,3 +64,21 @@ const (

// LookupFunc defines a function to look up a key from the environment.
type LookupFunc func(key string) (string, bool)

// EmptyLookup is a LookupFunc that always returns "" and false.
func EmptyLookup(key string) (string, bool) { return "", false }

// Lookup is a LookupFunc that uses os.LookupEnv.
func Lookup(key string) (string, bool) { return os.LookupEnv(key) }
ka3de marked this conversation as resolved.
Show resolved Hide resolved

// ConstLookup is a LookupFunc that always returns the given value and true
// if the key matches the given key. Otherwise it returns EmptyLookup
// behaviour. Useful for testing.
func ConstLookup(k, v string) LookupFunc {
return func(key string) (string, bool) {
if key == k {
return v, true
}
return EmptyLookup(key)
}
}
4 changes: 1 addition & 3 deletions k6ext/k6test/vu.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,9 +66,7 @@ func NewVU(tb testing.TB, opts ...any) *VU {

var (
samples = make(chan k6metrics.SampleContainer, 1000)
lookupFunc = func(_ string) (string, bool) {
return "", false
}
lookupFunc = env.EmptyLookup
)
for _, opt := range opts {
switch opt := opt.(type) {
Expand Down
19 changes: 5 additions & 14 deletions tests/browser_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,15 +43,9 @@ func TestBrowserNewPage(t *testing.T) {
func TestTmpDirCleanup(t *testing.T) {
t.Parallel()

tmpDirPath := "./"

b := newTestBrowser(t, withSkipClose(), withLookupFunc(func(k string) (string, bool) {
if k == "TMPDIR" {
return tmpDirPath, true
}
return "", false
}))
const tmpDirPath = "./"

b := newTestBrowser(t, withSkipClose(), withLookupFunc(env.ConstLookup("TMPDIR", tmpDirPath)))
p := b.NewPage(nil)
err := p.Close(nil)
require.NoError(t, err)
Expand Down Expand Up @@ -146,12 +140,9 @@ func TestBrowserUserAgent(t *testing.T) {

func TestBrowserCrashErr(t *testing.T) {
// create a new VU in an environment that requires a bad remote-debugging-port.
vu := k6test.NewVU(t, k6test.WithLookupFunc(func(key string) (string, bool) {
if key == env.BrowserArguments {
return "remote-debugging-port=99999", true
}
return "", false
}))
vu := k6test.NewVU(t, k6test.WithLookupFunc(
env.ConstLookup(env.BrowserArguments, "remote-debugging-port=99999"),
))

mod := browser.New().NewModuleInstance(vu)
jsMod, ok := mod.Exports().Default.(*browser.JSModule)
Expand Down
9 changes: 3 additions & 6 deletions tests/browser_type_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,12 +32,9 @@ func TestBrowserTypeLaunchToConnect(t *testing.T) {

// Export WS URL env var
// pointing to test browser proxy
vu := k6test.NewVU(t, k6test.WithLookupFunc(func(key string) (string, bool) {
if key == env.WebSocketURLs {
return bp.wsURL(), true
}
return "", false
}))
vu := k6test.NewVU(t, k6test.WithLookupFunc(
env.ConstLookup(env.WebSocketURLs, bp.wsURL())),
)

// We have to call launch method through JS API in Goja
// to take mapping layer into account, instead of calling
Expand Down
12 changes: 4 additions & 8 deletions tests/frame_test.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package tests

import (
"os"
"strconv"
"testing"

Expand Down Expand Up @@ -70,7 +69,7 @@ func TestFrameDismissDialogBox(t *testing.T) {
func TestFrameNoPanicWithEmbeddedIFrame(t *testing.T) {
t.Parallel()

if s, ok := os.LookupEnv(env.BrowserHeadless); ok {
if s, ok := env.Lookup(env.BrowserHeadless); ok {
if v, err := strconv.ParseBool(s); err == nil && v {
// We're skipping this when running in headless
// environments since the bug that the test fixes
Expand All @@ -82,12 +81,9 @@ func TestFrameNoPanicWithEmbeddedIFrame(t *testing.T) {
}

// run the browser in headfull mode.
tb := newTestBrowser(t, withFileServer(), withLookupFunc(func(key string) (string, bool) {
if key == env.BrowserHeadless {
return "0", true
}
return "", false
}))
tb := newTestBrowser(t, withFileServer(), withLookupFunc(
env.ConstLookup(env.BrowserHeadless, "0"),
))

p := tb.NewPage(nil)
_, err := p.Goto(
Expand Down
7 changes: 4 additions & 3 deletions tests/test_browser.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (
"github.com/grafana/xk6-browser/api"
"github.com/grafana/xk6-browser/chromium"
"github.com/grafana/xk6-browser/common"
"github.com/grafana/xk6-browser/env"
"github.com/grafana/xk6-browser/k6ext"
"github.com/grafana/xk6-browser/k6ext/k6test"

Expand Down Expand Up @@ -57,9 +58,9 @@ func newTestBrowser(tb testing.TB, opts ...any) *testBrowser {
enableLogCache = false
skipClose = false
samples = make(chan k6metrics.SampleContainer, 1000)
// default lookup function is os.LookupEnv so that we can
// default lookup function is env.Lookup so that we can
// pass the environment variables while testing, i.e.: K6_BROWSER_LOG.
lookupFunc = os.LookupEnv
lookupFunc = env.Lookup
)
for _, opt := range opts {
switch opt := opt.(type) {
Expand All @@ -82,7 +83,7 @@ func newTestBrowser(tb testing.TB, opts ...any) *testBrowser {
}
// return from the real environment lookup function
// so that we can debug (or other things) when we want it.
return os.LookupEnv(key)
return env.Lookup(key)
}
}
}
Expand Down
8 changes: 1 addition & 7 deletions tests/test_browser_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,15 +37,9 @@ func (t *testingT) Fatalf(format string, args ...any) {

func TestTestBrowserWithLookupFunc(t *testing.T) {
tt := &testingT{TB: t}

// this lookup is expected to fail because the remote debugging port is
// invalid, practically testing that the InitEnv.LookupEnv is used.
lookup := func(key string) (string, bool) {
if key == env.BrowserArguments {
return "remote-debugging-port=99999", true
}
return "", false
}
lookup := env.ConstLookup(env.BrowserArguments, "remote-debugging-port=99999")
_ = newTestBrowser(tt, withLookupFunc(lookup))
require.True(t, tt.fatalfCalled)
}