Skip to content

Commit

Permalink
Refactor execution.Scheduler tests to prevent import loops
Browse files Browse the repository at this point in the history
  • Loading branch information
na-- committed Dec 7, 2022
1 parent ef18b38 commit e00507e
Show file tree
Hide file tree
Showing 3 changed files with 110 additions and 93 deletions.
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package execution
package execution_test

import (
"encoding/json"
Expand Down
110 changes: 18 additions & 92 deletions execution/scheduler_test.go → execution/scheduler_ext_test.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package execution
package execution_test

import (
"context"
Expand All @@ -19,6 +19,7 @@ import (
"github.com/stretchr/testify/require"
"gopkg.in/guregu/null.v3"

"go.k6.io/k6/execution"
"go.k6.io/k6/js"
"go.k6.io/k6/lib"
"go.k6.io/k6/lib/executor"
Expand Down Expand Up @@ -58,7 +59,7 @@ func getTestRunState(

func newTestScheduler(
t *testing.T, runner lib.Runner, logger *logrus.Logger, opts lib.Options,
) (ctx context.Context, cancel func(), execScheduler *Scheduler, samples chan metrics.SampleContainer) {
) (ctx context.Context, cancel func(), execScheduler *execution.Scheduler, samples chan metrics.SampleContainer) {
if runner == nil {
runner = &minirunner.MiniRunner{}
}
Expand All @@ -73,7 +74,7 @@ func newTestScheduler(
testRunState.Logger = logger
}

execScheduler, err = NewScheduler(testRunState)
execScheduler, err = execution.NewScheduler(testRunState)
require.NoError(t, err)

samples = make(chan metrics.SampleContainer, newOpts.MetricSamplesBufferSize.Int64)
Expand Down Expand Up @@ -136,7 +137,7 @@ func TestSchedulerRunNonDefault(t *testing.T) {

testRunState := getTestRunState(t, piState, runner.GetOptions(), runner)

execScheduler, err := NewScheduler(testRunState)
execScheduler, err := execution.NewScheduler(testRunState)
require.NoError(t, err)

ctx, cancel := context.WithCancel(context.Background())
Expand Down Expand Up @@ -253,7 +254,7 @@ func TestSchedulerRunEnv(t *testing.T) {
require.NoError(t, err)

testRunState := getTestRunState(t, piState, runner.GetOptions(), runner)
execScheduler, err := NewScheduler(testRunState)
execScheduler, err := execution.NewScheduler(testRunState)
require.NoError(t, err)

ctx, cancel := context.WithCancel(context.Background())
Expand Down Expand Up @@ -322,7 +323,7 @@ func TestSchedulerSystemTags(t *testing.T) {
})))

testRunState := getTestRunState(t, piState, runner.GetOptions(), runner)
execScheduler, err := NewScheduler(testRunState)
execScheduler, err := execution.NewScheduler(testRunState)
require.NoError(t, err)

ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
Expand Down Expand Up @@ -453,7 +454,7 @@ func TestSchedulerRunCustomTags(t *testing.T) {
require.NoError(t, err)

testRunState := getTestRunState(t, piState, runner.GetOptions(), runner)
execScheduler, err := NewScheduler(testRunState)
execScheduler, err := execution.NewScheduler(testRunState)
require.NoError(t, err)

ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
Expand Down Expand Up @@ -617,7 +618,7 @@ func TestSchedulerRunCustomConfigNoCrossover(t *testing.T) {
require.NoError(t, err)

testRunState := getTestRunState(t, piState, runner.GetOptions(), runner)
execScheduler, err := NewScheduler(testRunState)
execScheduler, err := execution.NewScheduler(testRunState)
require.NoError(t, err)

ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
Expand Down Expand Up @@ -954,7 +955,7 @@ func TestSchedulerEndIterations(t *testing.T) {
defer cancel()

testRunState := getTestRunState(t, getTestPreInitState(t), runner.GetOptions(), runner)
execScheduler, err := NewScheduler(testRunState)
execScheduler, err := execution.NewScheduler(testRunState)
require.NoError(t, err)

samples := make(chan metrics.SampleContainer, 300)
Expand Down Expand Up @@ -1160,7 +1161,7 @@ func TestRealTimeAndSetupTeardownMetrics(t *testing.T) {
require.NoError(t, err)

testRunState := getTestRunState(t, piState, options, runner)
execScheduler, err := NewScheduler(testRunState)
execScheduler, err := execution.NewScheduler(testRunState)
require.NoError(t, err)

ctx, cancel := context.WithCancel(context.Background())
Expand Down Expand Up @@ -1280,85 +1281,6 @@ func TestRealTimeAndSetupTeardownMetrics(t *testing.T) {
}
}

// Just a lib.PausableExecutor implementation that can return an error
type pausableExecutor struct {
lib.Executor
err error
}

func (p pausableExecutor) SetPaused(bool) error {
return p.err
}

func TestSetPaused(t *testing.T) {
t.Parallel()
t.Run("second pause is an error", func(t *testing.T) {
t.Parallel()
testRunState := getTestRunState(t, getTestPreInitState(t), lib.Options{}, &minirunner.MiniRunner{})
sched, err := NewScheduler(testRunState)
require.NoError(t, err)
sched.executors = []lib.Executor{pausableExecutor{err: nil}}

require.NoError(t, sched.SetPaused(true))
err = sched.SetPaused(true)
require.Error(t, err)
require.Contains(t, err.Error(), "execution is already paused")
})

t.Run("unpause at the start is an error", func(t *testing.T) {
t.Parallel()
testRunState := getTestRunState(t, getTestPreInitState(t), lib.Options{}, &minirunner.MiniRunner{})
sched, err := NewScheduler(testRunState)
require.NoError(t, err)
sched.executors = []lib.Executor{pausableExecutor{err: nil}}
err = sched.SetPaused(false)
require.Error(t, err)
require.Contains(t, err.Error(), "execution wasn't paused")
})

t.Run("second unpause is an error", func(t *testing.T) {
t.Parallel()
testRunState := getTestRunState(t, getTestPreInitState(t), lib.Options{}, &minirunner.MiniRunner{})
sched, err := NewScheduler(testRunState)
require.NoError(t, err)
sched.executors = []lib.Executor{pausableExecutor{err: nil}}
require.NoError(t, sched.SetPaused(true))
require.NoError(t, sched.SetPaused(false))
err = sched.SetPaused(false)
require.Error(t, err)
require.Contains(t, err.Error(), "execution wasn't paused")
})

t.Run("an error on pausing is propagated", func(t *testing.T) {
t.Parallel()
testRunState := getTestRunState(t, getTestPreInitState(t), lib.Options{}, &minirunner.MiniRunner{})
sched, err := NewScheduler(testRunState)
require.NoError(t, err)
expectedErr := errors.New("testing pausable executor error")
sched.executors = []lib.Executor{pausableExecutor{err: expectedErr}}
err = sched.SetPaused(true)
require.Error(t, err)
require.Equal(t, err, expectedErr)
})

t.Run("can't pause unpausable executor", func(t *testing.T) {
t.Parallel()
runner := &minirunner.MiniRunner{}
options, err := executor.DeriveScenariosFromShortcuts(lib.Options{
Iterations: null.IntFrom(2),
VUs: null.IntFrom(1),
}.Apply(runner.GetOptions()), nil)
require.NoError(t, err)

testRunState := getTestRunState(t, getTestPreInitState(t), options, runner)
sched, err := NewScheduler(testRunState)
require.NoError(t, err)
err = sched.SetPaused(true)
require.Error(t, err)
require.Contains(t, err.Error(), "doesn't support pause and resume operations after its start")
})
}

func TestNewSchedulerHasWork(t *testing.T) {
t.Parallel()
script := []byte(`
Expand Down Expand Up @@ -1406,9 +1328,13 @@ func TestNewSchedulerHasWork(t *testing.T) {
require.NoError(t, err)

testRunState := getTestRunState(t, piState, runner.GetOptions(), runner)
execScheduler, err := NewScheduler(testRunState)
execScheduler, err := execution.NewScheduler(testRunState)
require.NoError(t, err)

assert.Len(t, execScheduler.executors, 2)
assert.Len(t, execScheduler.executorConfigs, 3)
assert.Len(t, execScheduler.GetExecutors(), 2)
assert.Len(t, execScheduler.GetExecutorConfigs(), 3)

err = execScheduler.SetPaused(true)
require.Error(t, err)
require.Contains(t, err.Error(), "doesn't support pause and resume operations after its start")
}
91 changes: 91 additions & 0 deletions execution/scheduler_int_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
package execution

import (
"errors"
"testing"

"github.com/stretchr/testify/require"
"go.k6.io/k6/lib"
"go.k6.io/k6/lib/testutils"
"go.k6.io/k6/lib/testutils/minirunner"
"go.k6.io/k6/metrics"
)

func getBogusTestRunState(tb testing.TB) *lib.TestRunState {
reg := metrics.NewRegistry()
piState := &lib.TestPreInitState{
Logger: testutils.NewLogger(tb),
RuntimeOptions: lib.RuntimeOptions{},
Registry: reg,
BuiltinMetrics: metrics.RegisterBuiltinMetrics(reg),
}

return &lib.TestRunState{
TestPreInitState: piState,
Options: lib.Options{},
Runner: &minirunner.MiniRunner{},
RunTags: piState.Registry.RootTagSet().WithTagsFromMap(nil),
}
}

// Just a lib.PausableExecutor implementation that can return an error
type pausableExecutor struct {
lib.Executor
err error
}

func (p pausableExecutor) SetPaused(bool) error {
return p.err
}

func TestSetPaused(t *testing.T) {
t.Parallel()
t.Run("second pause is an error", func(t *testing.T) {
t.Parallel()
testRunState := getBogusTestRunState(t)
sched, err := NewScheduler(testRunState)
require.NoError(t, err)
sched.executors = []lib.Executor{pausableExecutor{err: nil}}

require.NoError(t, sched.SetPaused(true))
err = sched.SetPaused(true)
require.Error(t, err)
require.Contains(t, err.Error(), "execution is already paused")
})

t.Run("unpause at the start is an error", func(t *testing.T) {
t.Parallel()
testRunState := getBogusTestRunState(t)
sched, err := NewScheduler(testRunState)
require.NoError(t, err)
sched.executors = []lib.Executor{pausableExecutor{err: nil}}
err = sched.SetPaused(false)
require.Error(t, err)
require.Contains(t, err.Error(), "execution wasn't paused")
})

t.Run("second unpause is an error", func(t *testing.T) {
t.Parallel()
testRunState := getBogusTestRunState(t)
sched, err := NewScheduler(testRunState)
require.NoError(t, err)
sched.executors = []lib.Executor{pausableExecutor{err: nil}}
require.NoError(t, sched.SetPaused(true))
require.NoError(t, sched.SetPaused(false))
err = sched.SetPaused(false)
require.Error(t, err)
require.Contains(t, err.Error(), "execution wasn't paused")
})

t.Run("an error on pausing is propagated", func(t *testing.T) {
t.Parallel()
testRunState := getBogusTestRunState(t)
sched, err := NewScheduler(testRunState)
require.NoError(t, err)
expectedErr := errors.New("testing pausable executor error")
sched.executors = []lib.Executor{pausableExecutor{err: expectedErr}}
err = sched.SetPaused(true)
require.Error(t, err)
require.Equal(t, err, expectedErr)
})
}

0 comments on commit e00507e

Please sign in to comment.