From 2640d608fa7704cacfac5537243b7e1bcf1362ae Mon Sep 17 00:00:00 2001 From: fatelei Date: Mon, 25 Jul 2022 17:23:43 +0800 Subject: [PATCH 01/12] fix: fix ws not support throw option --- js/modules/k6/ws/ws.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/js/modules/k6/ws/ws.go b/js/modules/k6/ws/ws.go index 03ba3afc915..c06cb098667 100644 --- a/js/modules/k6/ws/ws.go +++ b/js/modules/k6/ws/ws.go @@ -286,8 +286,12 @@ func (mi *WS) Connect(url string, args ...goja.Value) (*WSHTTPResponse, error) { if connErr != nil { // Pass the error to the user script before exiting immediately socket.handleEvent("error", rt.ToValue(connErr)) - - return nil, connErr + if state.Options.Throw.Bool { + return nil, connErr + } else { + state.Logger.WithField("error", connErr).Warn("Ws Connection Failed") + return nil, nil + } } // Run the user-provided set up function From 8ed8a1c08e6b3df6649dcef274a588ccf8f9bd39 Mon Sep 17 00:00:00 2001 From: fatelei Date: Mon, 25 Jul 2022 18:19:12 +0800 Subject: [PATCH 02/12] chore: add unit test for throw option is false --- js/modules/k6/ws/ws.go | 4 +++- js/modules/k6/ws/ws_test.go | 38 +++++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/js/modules/k6/ws/ws.go b/js/modules/k6/ws/ws.go index c06cb098667..87666f1ea92 100644 --- a/js/modules/k6/ws/ws.go +++ b/js/modules/k6/ws/ws.go @@ -289,7 +289,9 @@ func (mi *WS) Connect(url string, args ...goja.Value) (*WSHTTPResponse, error) { if state.Options.Throw.Bool { return nil, connErr } else { - state.Logger.WithField("error", connErr).Warn("Ws Connection Failed") + if state.Logger != nil { + state.Logger.WithField("error", connErr).Warn("Ws Connection Failed") + } return nil, nil } } diff --git a/js/modules/k6/ws/ws_test.go b/js/modules/k6/ws/ws_test.go index 98b3dbcd049..c744649367f 100644 --- a/js/modules/k6/ws/ws_test.go +++ b/js/modules/k6/ws/ws_test.go @@ -655,6 +655,7 @@ func TestErrors(t *testing.T) { Dialer: tb.Dialer, Options: lib.Options{ SystemTags: &metrics.DefaultSystemTagSet, + Throw: null.BoolFrom(true), }, Samples: samples, BuiltinMetrics: metrics.RegisterBuiltinMetrics(metrics.NewRegistry()), @@ -1288,3 +1289,40 @@ func TestCookieJar(t *testing.T) { assertSessionMetricsEmitted(t, metrics.GetBufferedSamples(ts.samples), "", sr("WSBIN_URL/ws-echo-someheader"), statusProtocolSwitch, "") } + +func TestWithoutThrowError(t *testing.T) { + tb := httpmultibin.NewHTTPMultiBin(t) + root, err := lib.NewGroup("", nil) + require.NoError(t, err) + + rt := goja.New() + rt.SetFieldNameMapper(common.FieldNameMapper{}) + samples := make(chan metrics.SampleContainer, 1000) + state := &lib.State{ + Group: root, + Dialer: tb.Dialer, + Options: lib.Options{ + SystemTags: &metrics.DefaultSystemTagSet, + Throw: null.BoolFrom(false), + }, + Samples: samples, + BuiltinMetrics: metrics.RegisterBuiltinMetrics(metrics.NewRegistry()), + Tags: lib.NewTagMap(nil), + } + + m := New().NewModuleInstance(&modulestest.VU{ + CtxField: context.Background(), + InitEnvField: &common.InitEnvironment{}, + RuntimeField: rt, + StateField: state, + }) + require.NoError(t, rt.Set("ws", m.Exports().Default)) + _, err = rt.RunString(` + var res = ws.connect("INVALID", function(socket){ + socket.on("open", function() { + socket.close(); + }); + }); + `) + assert.NoError(t, err) +} From c8061fe381bbe2f3479e9e3851b5517da0f373a2 Mon Sep 17 00:00:00 2001 From: fatelei Date: Mon, 25 Jul 2022 18:31:01 +0800 Subject: [PATCH 03/12] chore: fix lint error --- js/modules/k6/ws/ws.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/modules/k6/ws/ws.go b/js/modules/k6/ws/ws.go index 87666f1ea92..1515bae8b6e 100644 --- a/js/modules/k6/ws/ws.go +++ b/js/modules/k6/ws/ws.go @@ -292,7 +292,7 @@ func (mi *WS) Connect(url string, args ...goja.Value) (*WSHTTPResponse, error) { if state.Logger != nil { state.Logger.WithField("error", connErr).Warn("Ws Connection Failed") } - return nil, nil + return &WSHTTPResponse{}, nil } } From f3491f59551e998bf989ff893eb48213c2c15fe0 Mon Sep 17 00:00:00 2001 From: fatelei Date: Mon, 25 Jul 2022 23:36:47 +0800 Subject: [PATCH 04/12] chore: enhance tests --- js/modules/k6/ws/ws.go | 11 ++++++----- js/modules/k6/ws/ws_test.go | 26 ++++++++++++++++++++++---- 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/js/modules/k6/ws/ws.go b/js/modules/k6/ws/ws.go index 1515bae8b6e..f5b5488cadc 100644 --- a/js/modules/k6/ws/ws.go +++ b/js/modules/k6/ws/ws.go @@ -288,12 +288,13 @@ func (mi *WS) Connect(url string, args ...goja.Value) (*WSHTTPResponse, error) { socket.handleEvent("error", rt.ToValue(connErr)) if state.Options.Throw.Bool { return nil, connErr - } else { - if state.Logger != nil { - state.Logger.WithField("error", connErr).Warn("Ws Connection Failed") - } - return &WSHTTPResponse{}, nil } + if state.Logger != nil { + state.Logger.WithField("error", connErr).Warn("Ws Connection Failed") + } + return &WSHTTPResponse{ + Error: connErr.Error(), + }, nil } // Run the user-provided set up function diff --git a/js/modules/k6/ws/ws_test.go b/js/modules/k6/ws/ws_test.go index c744649367f..9623d2d1242 100644 --- a/js/modules/k6/ws/ws_test.go +++ b/js/modules/k6/ws/ws_test.go @@ -1290,7 +1290,7 @@ func TestCookieJar(t *testing.T) { assertSessionMetricsEmitted(t, metrics.GetBufferedSamples(ts.samples), "", sr("WSBIN_URL/ws-echo-someheader"), statusProtocolSwitch, "") } -func TestWithoutThrowError(t *testing.T) { +func TestWsWithThrowOptionError(t *testing.T) { tb := httpmultibin.NewHTTPMultiBin(t) root, err := lib.NewGroup("", nil) require.NoError(t, err) @@ -1303,7 +1303,6 @@ func TestWithoutThrowError(t *testing.T) { Dialer: tb.Dialer, Options: lib.Options{ SystemTags: &metrics.DefaultSystemTagSet, - Throw: null.BoolFrom(false), }, Samples: samples, BuiltinMetrics: metrics.RegisterBuiltinMetrics(metrics.NewRegistry()), @@ -1317,12 +1316,31 @@ func TestWithoutThrowError(t *testing.T) { StateField: state, }) require.NoError(t, rt.Set("ws", m.Exports().Default)) - _, err = rt.RunString(` + + t.Run("enable_throw_error", func(t *testing.T) { + state.Options.Throw = null.BoolFrom(true) + _, err = rt.RunString(` var res = ws.connect("INVALID", function(socket){ socket.on("open", function() { socket.close(); }); }); `) - assert.NoError(t, err) + assert.Error(t, err) + }) + + t.Run("disable_throw_error", func(t *testing.T) { + state.Options.Throw = null.BoolFrom(false) + _, err = rt.RunString(` + var res = ws.connect("INVALID", function(socket){ + socket.on("open", function() { + socket.close(); + }); + }); + if (res && res.error) { + throw new Error(res.error); + } + `) + assert.Error(t, err) + }) } From 0bb64939611468717206c97eaadd72f8779ad73d Mon Sep 17 00:00:00 2001 From: fatelei Date: Tue, 26 Jul 2022 17:32:00 +0800 Subject: [PATCH 05/12] chore: resolve pr comment --- js/modules/k6/ws/ws.go | 4 +--- js/modules/k6/ws/ws_test.go | 22 +++++++++++++++------- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/js/modules/k6/ws/ws.go b/js/modules/k6/ws/ws.go index f5b5488cadc..3d63af44a5e 100644 --- a/js/modules/k6/ws/ws.go +++ b/js/modules/k6/ws/ws.go @@ -289,9 +289,7 @@ func (mi *WS) Connect(url string, args ...goja.Value) (*WSHTTPResponse, error) { if state.Options.Throw.Bool { return nil, connErr } - if state.Logger != nil { - state.Logger.WithField("error", connErr).Warn("Ws Connection Failed") - } + state.Logger.WithField("error", connErr).Warn("Ws Connection Failed") return &WSHTTPResponse{ Error: connErr.Error(), }, nil diff --git a/js/modules/k6/ws/ws_test.go b/js/modules/k6/ws/ws_test.go index 9623d2d1242..9148ecba37b 100644 --- a/js/modules/k6/ws/ws_test.go +++ b/js/modules/k6/ws/ws_test.go @@ -34,6 +34,7 @@ import ( "github.com/dop251/goja" "github.com/gorilla/websocket" + "github.com/sirupsen/logrus" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "gopkg.in/guregu/null.v3" @@ -42,6 +43,7 @@ import ( httpModule "go.k6.io/k6/js/modules/k6/http" "go.k6.io/k6/js/modulestest" "go.k6.io/k6/lib" + "go.k6.io/k6/lib/testutils" "go.k6.io/k6/lib/testutils/httpmultibin" "go.k6.io/k6/metrics" ) @@ -1290,11 +1292,16 @@ func TestCookieJar(t *testing.T) { assertSessionMetricsEmitted(t, metrics.GetBufferedSamples(ts.samples), "", sr("WSBIN_URL/ws-echo-someheader"), statusProtocolSwitch, "") } -func TestWsWithThrowOptionError(t *testing.T) { +func TestWSConnectWithThrowErrorOption(t *testing.T) { tb := httpmultibin.NewHTTPMultiBin(t) root, err := lib.NewGroup("", nil) require.NoError(t, err) + logHook := &testutils.SimpleLogrusHook{HookedLevels: []logrus.Level{logrus.WarnLevel}} + testLog := logrus.New() + testLog.AddHook(logHook) + testLog.SetOutput(io.Discard) + rt := goja.New() rt.SetFieldNameMapper(common.FieldNameMapper{}) samples := make(chan metrics.SampleContainer, 1000) @@ -1307,6 +1314,7 @@ func TestWsWithThrowOptionError(t *testing.T) { Samples: samples, BuiltinMetrics: metrics.RegisterBuiltinMetrics(metrics.NewRegistry()), Tags: lib.NewTagMap(nil), + Logger: testLog, } m := New().NewModuleInstance(&modulestest.VU{ @@ -1317,7 +1325,7 @@ func TestWsWithThrowOptionError(t *testing.T) { }) require.NoError(t, rt.Set("ws", m.Exports().Default)) - t.Run("enable_throw_error", func(t *testing.T) { + t.Run("ThrowEnabled", func(t *testing.T) { state.Options.Throw = null.BoolFrom(true) _, err = rt.RunString(` var res = ws.connect("INVALID", function(socket){ @@ -1329,7 +1337,7 @@ func TestWsWithThrowOptionError(t *testing.T) { assert.Error(t, err) }) - t.Run("disable_throw_error", func(t *testing.T) { + t.Run("ThrowDisabled", func(t *testing.T) { state.Options.Throw = null.BoolFrom(false) _, err = rt.RunString(` var res = ws.connect("INVALID", function(socket){ @@ -1337,10 +1345,10 @@ func TestWsWithThrowOptionError(t *testing.T) { socket.close(); }); }); - if (res && res.error) { - throw new Error(res.error); - } `) - assert.Error(t, err) + entries := logHook.Drain() + require.Len(t, entries, 1) + assert.Contains(t, entries[0].Message, "Ws Connection Failed") + assert.NoError(t, err) }) } From a50ad47c2975f3cecb71abd9190de52db8d4ebe8 Mon Sep 17 00:00:00 2001 From: fatelei Date: Tue, 26 Jul 2022 17:59:35 +0800 Subject: [PATCH 06/12] chore: enhance log message --- js/modules/k6/ws/ws.go | 2 +- js/modules/k6/ws/ws_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/modules/k6/ws/ws.go b/js/modules/k6/ws/ws.go index 3d63af44a5e..fb1aa23d23a 100644 --- a/js/modules/k6/ws/ws.go +++ b/js/modules/k6/ws/ws.go @@ -289,7 +289,7 @@ func (mi *WS) Connect(url string, args ...goja.Value) (*WSHTTPResponse, error) { if state.Options.Throw.Bool { return nil, connErr } - state.Logger.WithField("error", connErr).Warn("Ws Connection Failed") + state.Logger.WithError(connErr).Warn("Attempt to establish a WebSocket connection failed") return &WSHTTPResponse{ Error: connErr.Error(), }, nil diff --git a/js/modules/k6/ws/ws_test.go b/js/modules/k6/ws/ws_test.go index 9148ecba37b..926d2a753dd 100644 --- a/js/modules/k6/ws/ws_test.go +++ b/js/modules/k6/ws/ws_test.go @@ -1348,7 +1348,7 @@ func TestWSConnectWithThrowErrorOption(t *testing.T) { `) entries := logHook.Drain() require.Len(t, entries, 1) - assert.Contains(t, entries[0].Message, "Ws Connection Failed") + assert.Contains(t, entries[0].Message, "Attempt to establish a WebSocket connection failed") assert.NoError(t, err) }) } From 920a06dcceb29151a37122b16969696c59fc0732 Mon Sep 17 00:00:00 2001 From: fatelei Date: Tue, 26 Jul 2022 18:01:24 +0800 Subject: [PATCH 07/12] chore: adjust check order --- js/modules/k6/ws/ws_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/modules/k6/ws/ws_test.go b/js/modules/k6/ws/ws_test.go index 926d2a753dd..53c51cfac4d 100644 --- a/js/modules/k6/ws/ws_test.go +++ b/js/modules/k6/ws/ws_test.go @@ -1346,9 +1346,9 @@ func TestWSConnectWithThrowErrorOption(t *testing.T) { }); }); `) + require.NoError(t, err) entries := logHook.Drain() require.Len(t, entries, 1) assert.Contains(t, entries[0].Message, "Attempt to establish a WebSocket connection failed") - assert.NoError(t, err) }) } From cd59cb296adc1e58626155184fabd26f32f18215 Mon Sep 17 00:00:00 2001 From: fatelei Date: Tue, 26 Jul 2022 18:08:55 +0800 Subject: [PATCH 08/12] chore: add res.error check --- js/modules/k6/ws/ws_test.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/js/modules/k6/ws/ws_test.go b/js/modules/k6/ws/ws_test.go index 53c51cfac4d..74bac29a24e 100644 --- a/js/modules/k6/ws/ws_test.go +++ b/js/modules/k6/ws/ws_test.go @@ -1345,8 +1345,11 @@ func TestWSConnectWithThrowErrorOption(t *testing.T) { socket.close(); }); }); + if (res == null && res.error == null) { + throw new Error("res.error is expected to be not null"); + } `) - require.NoError(t, err) + assert.NoError(t, err) entries := logHook.Drain() require.Len(t, entries, 1) assert.Contains(t, entries[0].Message, "Attempt to establish a WebSocket connection failed") From 78544f2775aee2c1db58a836a34561ee2be417dd Mon Sep 17 00:00:00 2001 From: fatelei Date: Tue, 26 Jul 2022 18:22:14 +0800 Subject: [PATCH 09/12] fix: fix ci lint --- js/modules/k6/ws/ws_test.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/js/modules/k6/ws/ws_test.go b/js/modules/k6/ws/ws_test.go index 74bac29a24e..2cbc2ef223c 100644 --- a/js/modules/k6/ws/ws_test.go +++ b/js/modules/k6/ws/ws_test.go @@ -1293,6 +1293,7 @@ func TestCookieJar(t *testing.T) { } func TestWSConnectWithThrowErrorOption(t *testing.T) { + t.Parallel() tb := httpmultibin.NewHTTPMultiBin(t) root, err := lib.NewGroup("", nil) require.NoError(t, err) @@ -1326,6 +1327,7 @@ func TestWSConnectWithThrowErrorOption(t *testing.T) { require.NoError(t, rt.Set("ws", m.Exports().Default)) t.Run("ThrowEnabled", func(t *testing.T) { + t.Parallel() state.Options.Throw = null.BoolFrom(true) _, err = rt.RunString(` var res = ws.connect("INVALID", function(socket){ @@ -1338,6 +1340,7 @@ func TestWSConnectWithThrowErrorOption(t *testing.T) { }) t.Run("ThrowDisabled", func(t *testing.T) { + t.Parallel() state.Options.Throw = null.BoolFrom(false) _, err = rt.RunString(` var res = ws.connect("INVALID", function(socket){ From 3142896cb14216efa0346c8302589d915a8b6513 Mon Sep 17 00:00:00 2001 From: fatelei Date: Tue, 26 Jul 2022 23:22:18 +0800 Subject: [PATCH 10/12] chore: using newTestState to avoid race condition --- js/modules/k6/ws/ws_test.go | 38 ++++++++----------------------------- 1 file changed, 8 insertions(+), 30 deletions(-) diff --git a/js/modules/k6/ws/ws_test.go b/js/modules/k6/ws/ws_test.go index 2cbc2ef223c..e8591eed69d 100644 --- a/js/modules/k6/ws/ws_test.go +++ b/js/modules/k6/ws/ws_test.go @@ -1294,42 +1294,18 @@ func TestCookieJar(t *testing.T) { func TestWSConnectWithThrowErrorOption(t *testing.T) { t.Parallel() - tb := httpmultibin.NewHTTPMultiBin(t) - root, err := lib.NewGroup("", nil) - require.NoError(t, err) logHook := &testutils.SimpleLogrusHook{HookedLevels: []logrus.Level{logrus.WarnLevel}} testLog := logrus.New() testLog.AddHook(logHook) testLog.SetOutput(io.Discard) - rt := goja.New() - rt.SetFieldNameMapper(common.FieldNameMapper{}) - samples := make(chan metrics.SampleContainer, 1000) - state := &lib.State{ - Group: root, - Dialer: tb.Dialer, - Options: lib.Options{ - SystemTags: &metrics.DefaultSystemTagSet, - }, - Samples: samples, - BuiltinMetrics: metrics.RegisterBuiltinMetrics(metrics.NewRegistry()), - Tags: lib.NewTagMap(nil), - Logger: testLog, - } - - m := New().NewModuleInstance(&modulestest.VU{ - CtxField: context.Background(), - InitEnvField: &common.InitEnvironment{}, - RuntimeField: rt, - StateField: state, - }) - require.NoError(t, rt.Set("ws", m.Exports().Default)) - t.Run("ThrowEnabled", func(t *testing.T) { t.Parallel() - state.Options.Throw = null.BoolFrom(true) - _, err = rt.RunString(` + ts := newTestState(t) + ts.state.Logger = testLog + ts.state.Options.Throw = null.BoolFrom(true) + _, err := ts.rt.RunString(` var res = ws.connect("INVALID", function(socket){ socket.on("open", function() { socket.close(); @@ -1341,8 +1317,10 @@ func TestWSConnectWithThrowErrorOption(t *testing.T) { t.Run("ThrowDisabled", func(t *testing.T) { t.Parallel() - state.Options.Throw = null.BoolFrom(false) - _, err = rt.RunString(` + ts := newTestState(t) + ts.state.Logger = testLog + ts.state.Options.Throw = null.BoolFrom(false) + _, err := ts.rt.RunString(` var res = ws.connect("INVALID", function(socket){ socket.on("open", function() { socket.close(); From 8e879f4a1987174e02ecbac9a117fac15107d96f Mon Sep 17 00:00:00 2001 From: fatelei Date: Wed, 27 Jul 2022 17:38:02 +0800 Subject: [PATCH 11/12] chore: enhance test --- js/modules/k6/ws/ws_test.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/js/modules/k6/ws/ws_test.go b/js/modules/k6/ws/ws_test.go index e8591eed69d..910cae8c41b 100644 --- a/js/modules/k6/ws/ws_test.go +++ b/js/modules/k6/ws/ws_test.go @@ -125,6 +125,7 @@ func newTestState(t testing.TB) testState { metrics.TagSubproto, ), UserAgent: null.StringFrom("TestUserAgent"), + Throw: null.BoolFrom(true), }, Samples: samples, TLSConfig: tb.TLSClientConfig, @@ -1303,8 +1304,6 @@ func TestWSConnectWithThrowErrorOption(t *testing.T) { t.Run("ThrowEnabled", func(t *testing.T) { t.Parallel() ts := newTestState(t) - ts.state.Logger = testLog - ts.state.Options.Throw = null.BoolFrom(true) _, err := ts.rt.RunString(` var res = ws.connect("INVALID", function(socket){ socket.on("open", function() { From 8535b00e3dc2f5433d9ebdb3b31cce0dcb234bc1 Mon Sep 17 00:00:00 2001 From: fatelei Date: Wed, 27 Jul 2022 23:25:20 +0800 Subject: [PATCH 12/12] chore: split ws throw error option tests --- js/modules/k6/ws/ws_test.go | 43 ++++++++++++++++++++----------------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/js/modules/k6/ws/ws_test.go b/js/modules/k6/ws/ws_test.go index 910cae8c41b..1b2b29a4c95 100644 --- a/js/modules/k6/ws/ws_test.go +++ b/js/modules/k6/ws/ws_test.go @@ -1293,33 +1293,37 @@ func TestCookieJar(t *testing.T) { assertSessionMetricsEmitted(t, metrics.GetBufferedSamples(ts.samples), "", sr("WSBIN_URL/ws-echo-someheader"), statusProtocolSwitch, "") } -func TestWSConnectWithThrowErrorOption(t *testing.T) { +func TestWSConnectEnableThrowErrorOption(t *testing.T) { t.Parallel() - logHook := &testutils.SimpleLogrusHook{HookedLevels: []logrus.Level{logrus.WarnLevel}} testLog := logrus.New() testLog.AddHook(logHook) testLog.SetOutput(io.Discard) - - t.Run("ThrowEnabled", func(t *testing.T) { - t.Parallel() - ts := newTestState(t) - _, err := ts.rt.RunString(` + ts := newTestState(t) + ts.state.Logger = testLog + _, err := ts.rt.RunString(` var res = ws.connect("INVALID", function(socket){ socket.on("open", function() { socket.close(); }); }); `) - assert.Error(t, err) - }) + entries := logHook.Drain() + require.Len(t, entries, 0) + assert.Error(t, err) +} - t.Run("ThrowDisabled", func(t *testing.T) { - t.Parallel() - ts := newTestState(t) - ts.state.Logger = testLog - ts.state.Options.Throw = null.BoolFrom(false) - _, err := ts.rt.RunString(` +func TestWSConnectDisableThrowErrorOption(t *testing.T) { + t.Parallel() + logHook := &testutils.SimpleLogrusHook{HookedLevels: []logrus.Level{logrus.WarnLevel}} + testLog := logrus.New() + testLog.AddHook(logHook) + testLog.SetOutput(io.Discard) + + ts := newTestState(t) + ts.state.Logger = testLog + ts.state.Options.Throw = null.BoolFrom(false) + _, err := ts.rt.RunString(` var res = ws.connect("INVALID", function(socket){ socket.on("open", function() { socket.close(); @@ -1329,9 +1333,8 @@ func TestWSConnectWithThrowErrorOption(t *testing.T) { throw new Error("res.error is expected to be not null"); } `) - assert.NoError(t, err) - entries := logHook.Drain() - require.Len(t, entries, 1) - assert.Contains(t, entries[0].Message, "Attempt to establish a WebSocket connection failed") - }) + assert.NoError(t, err) + entries := logHook.Drain() + require.Len(t, entries, 1) + assert.Contains(t, entries[0].Message, "Attempt to establish a WebSocket connection failed") }