Skip to content

Commit

Permalink
Unit tests for config file operations (#4298)
Browse files Browse the repository at this point in the history
Added some tests for reading and writing operations of the configuration file.

---------

Co-authored-by: İnanç Gümüş <[email protected]>
  • Loading branch information
codebien and inancgumus authored Jan 31, 2025
1 parent 204f0c1 commit 30c26d2
Showing 1 changed file with 203 additions and 0 deletions.
203 changes: 203 additions & 0 deletions internal/cmd/config_test.go
Original file line number Diff line number Diff line change
@@ -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"
)

Expand Down Expand Up @@ -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)
}

0 comments on commit 30c26d2

Please sign in to comment.