From 30c26d21cb162304695fa95c8a195e2f6049ace1 Mon Sep 17 00:00:00 2001 From: Ivan <2103732+codebien@users.noreply.github.com> Date: Fri, 31 Jan 2025 15:13:17 +0100 Subject: [PATCH] Unit tests for config file operations (#4298) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Added some tests for reading and writing operations of the configuration file. --------- Co-authored-by: İnanç Gümüş --- internal/cmd/config_test.go | 203 ++++++++++++++++++++++++++++++++++++ 1 file changed, 203 insertions(+) diff --git a/internal/cmd/config_test.go b/internal/cmd/config_test.go index eeb35f5beb9..9c03d320598 100644 --- a/internal/cmd/config_test.go +++ b/internal/cmd/config_test.go @@ -1,17 +1,22 @@ package cmd import ( + "encoding/json" + "io/fs" "testing" "time" "github.com/mstoykov/envconfig" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "gopkg.in/guregu/null.v3" + "go.k6.io/k6/cmd/state" "go.k6.io/k6/errext" "go.k6.io/k6/errext/exitcodes" "go.k6.io/k6/lib" "go.k6.io/k6/lib/executor" + "go.k6.io/k6/lib/fsext" "go.k6.io/k6/lib/types" ) @@ -202,3 +207,201 @@ func TestDeriveAndValidateConfig(t *testing.T) { }) } } + +func TestReadDiskConfigWithDefaultFlags(t *testing.T) { + t.Parallel() + memfs := fsext.NewMemMapFs() + + conf := []byte(`{"iterations":1028,"cloud":{"field1":"testvalue"}}`) + defaultConfigPath := ".config/loadimpact/k6/config.json" + require.NoError(t, fsext.WriteFile(memfs, defaultConfigPath, conf, 0o644)) + + defaultFlags := state.GetDefaultFlags(".config") + gs := &state.GlobalState{ + FS: memfs, + Flags: defaultFlags, + DefaultFlags: defaultFlags, + } + c, err := readDiskConfig(gs) + require.NoError(t, err) + + assert.Equal(t, c.Iterations.Int64, int64(1028)) + assert.JSONEq(t, `{"field1":"testvalue"}`, string(c.Cloud)) +} + +func TestReadDiskConfigCustomFilePath(t *testing.T) { + t.Parallel() + memfs := fsext.NewMemMapFs() + + conf := []byte(`{"iterations":1028,"cloud":{"field1":"testvalue"}}`) + require.NoError(t, fsext.WriteFile(memfs, "custom-path/config.json", conf, 0o644)) + + defaultFlags := state.GetDefaultFlags(".config") + gs := &state.GlobalState{ + FS: memfs, + Flags: defaultFlags, + DefaultFlags: defaultFlags, + } + gs.Flags.ConfigFilePath = "custom-path/config.json" + + c, err := readDiskConfig(gs) + require.NoError(t, err) + + assert.Equal(t, c.Iterations.Int64, int64(1028)) + assert.JSONEq(t, `{"field1":"testvalue"}`, string(c.Cloud)) +} + +func TestReadDiskConfigNotFoundSilenced(t *testing.T) { + t.Parallel() + memfs := fsext.NewMemMapFs() + + // Put the file into a different and unexpected directory + conf := []byte(`{"iterations":1028,"cloud":{"field1":"testvalue"}}`) + defaultConfigPath := ".config/unknown-folder/k6/config.json" + require.NoError(t, fsext.WriteFile(memfs, defaultConfigPath, conf, 0o644)) + + defaultFlags := state.GetDefaultFlags(".config") + gs := &state.GlobalState{ + FS: memfs, + Flags: defaultFlags, + DefaultFlags: defaultFlags, + } + c, err := readDiskConfig(gs) + assert.NoError(t, err) + assert.Empty(t, c) +} + +func TestReadDiskConfigNotJSONExtension(t *testing.T) { + t.Parallel() + memfs := fsext.NewMemMapFs() + + conf := []byte(`{"iterations":1028,"cloud":{"field1":"testvalue"}}`) + require.NoError(t, fsext.WriteFile(memfs, "custom-path/config.txt", conf, 0o644)) + + defaultFlags := state.GetDefaultFlags(".config") + gs := &state.GlobalState{ + FS: memfs, + DefaultFlags: defaultFlags, + Flags: defaultFlags, + } + gs.Flags.ConfigFilePath = "custom-path/config.txt" + + c, err := readDiskConfig(gs) + require.NoError(t, err) + + assert.Equal(t, c.Iterations.Int64, int64(1028)) + assert.JSONEq(t, `{"field1":"testvalue"}`, string(c.Cloud)) +} + +func TestReadDiskConfigNotJSONContentError(t *testing.T) { + t.Parallel() + memfs := fsext.NewMemMapFs() + + conf := []byte(`bad json format`) + defaultConfigPath := ".config/loadimpact/k6/config.json" + require.NoError(t, fsext.WriteFile(memfs, defaultConfigPath, conf, 0o644)) + + gs := &state.GlobalState{ + FS: memfs, + Flags: state.GetDefaultFlags(".config"), + } + _, err := readDiskConfig(gs) + var serr *json.SyntaxError + assert.ErrorAs(t, err, &serr) +} + +func TestReadDiskConfigNotFoundErrorWithCustomPath(t *testing.T) { + t.Parallel() + memfs := fsext.NewMemMapFs() + + defaultFlags := state.GetDefaultFlags(".config") + gs := &state.GlobalState{ + FS: memfs, + Flags: defaultFlags, + DefaultFlags: defaultFlags, + } + gs.Flags.ConfigFilePath = ".config/my-custom-path/k6/config.json" + + c, err := readDiskConfig(gs) + assert.ErrorIs(t, err, fs.ErrNotExist) + assert.Empty(t, c) +} + +func TestWriteDiskConfigWithDefaultFlags(t *testing.T) { + t.Parallel() + memfs := fsext.NewMemMapFs() + + defaultFlags := state.GetDefaultFlags(".config") + gs := &state.GlobalState{ + FS: memfs, + Flags: defaultFlags, + DefaultFlags: defaultFlags, + } + + c := Config{WebDashboard: null.BoolFrom(true)} + err := writeDiskConfig(gs, c) + require.NoError(t, err) + + finfo, err := memfs.Stat(".config/loadimpact/k6/config.json") + require.NoError(t, err) + assert.NotEmpty(t, finfo.Size()) +} + +func TestWriteDiskConfigOverwrite(t *testing.T) { + t.Parallel() + memfs := fsext.NewMemMapFs() + + conf := []byte(`{"iterations":1028,"cloud":{"field1":"testvalue"}}`) + defaultConfigPath := ".config/loadimpact/k6/config.json" + require.NoError(t, fsext.WriteFile(memfs, defaultConfigPath, conf, 0o644)) + + defaultFlags := state.GetDefaultFlags(".config") + gs := &state.GlobalState{ + FS: memfs, + Flags: defaultFlags, + DefaultFlags: defaultFlags, + } + + c := Config{WebDashboard: null.BoolFrom(true)} + err := writeDiskConfig(gs, c) + require.NoError(t, err) +} + +func TestWriteDiskConfigCustomPath(t *testing.T) { + t.Parallel() + memfs := fsext.NewMemMapFs() + + defaultFlags := state.GetDefaultFlags(".config") + gs := &state.GlobalState{ + FS: memfs, + Flags: defaultFlags, + DefaultFlags: defaultFlags, + } + gs.Flags.ConfigFilePath = "my-custom-path/config.json" + + c := Config{WebDashboard: null.BoolFrom(true)} + err := writeDiskConfig(gs, c) + require.NoError(t, err) +} + +func TestWriteDiskConfigNoJSONContentError(t *testing.T) { + t.Parallel() + memfs := fsext.NewMemMapFs() + + defaultFlags := state.GetDefaultFlags(".config") + gs := &state.GlobalState{ + FS: memfs, + Flags: defaultFlags, + DefaultFlags: defaultFlags, + } + + c := Config{ + WebDashboard: null.BoolFrom(true), + Options: lib.Options{ + Cloud: []byte(`invalid-json`), + }, + } + err := writeDiskConfig(gs, c) + var serr *json.SyntaxError + assert.ErrorAs(t, err, &serr) +}