blob: 6e3dc2d9dada2c69d41253c5609e4b352fda2449 [file] [log] [blame]
package config
import (
"encoding/json"
"io/ioutil"
"os"
"path/filepath"
"testing"
"time"
expect "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"go.skia.org/infra/go/deepequal/assertdeep"
"go.skia.org/infra/go/testutils"
"go.skia.org/infra/go/testutils/unittest"
)
type TestInnerConfig struct {
Name string
Frequency Duration
}
type TestConfig struct {
Delay Duration
Count int
Percent float64
Allow bool
Sources []string
Primary TestInnerConfig
Items []*TestInnerConfig
Params map[string]string
}
func TestDuration(t *testing.T) {
unittest.SmallTest(t)
type dummy struct {
Dur Duration
}
orig := dummy{
Dur: Duration{5 * time.Second},
}
enc, err := json.Marshal(&orig)
require.NoError(t, err)
expect.Equal(t, `{"Dur":"5s"}`, string(enc))
parsed := dummy{}
require.NoError(t, json.Unmarshal(enc, &parsed))
assertdeep.Equal(t, orig, parsed)
}
func TestParseConfigFile(t *testing.T) {
unittest.MediumTest(t)
dir, err := testutils.TestDataDir()
require.NoError(t, err)
configFile := filepath.Join(dir, "TestParseConfigFile.json5")
parsed := TestConfig{}
require.NoError(t, ParseConfigFile(configFile, "", &parsed))
expected := TestConfig{
Delay: Duration{17 * time.Minute},
Count: 2400,
Percent: 0.25,
Allow: true,
Sources: []string{"internet", "local", "random"},
Primary: TestInnerConfig{
Name: "run-tests",
Frequency: Duration{10 * time.Minute},
},
Items: []*TestInnerConfig{
{
Name: "cleanup",
Frequency: Duration{24 * time.Hour},
},
nil,
{},
{
Name: "refresh",
Frequency: Duration{100 * time.Millisecond},
},
},
Params: map[string]string{
"os": "Linux",
"arch": "amd64",
},
}
assertdeep.Equal(t, expected, parsed)
}
func TestParseConfigFileDoesntExist(t *testing.T) {
unittest.MediumTest(t)
dir, cleanup := testutils.TempDir(t)
defer cleanup()
configFile := filepath.Join(dir, "nonexistent-file.json5")
parsed := TestConfig{}
err := ParseConfigFile(configFile, "--main-config", &parsed)
require.Regexp(t, `Unable to read --main-config file ".*/nonexistent-file.json5":.* no such file or directory`, err.Error())
}
func TestParseConfigFileInvalid(t *testing.T) {
unittest.MediumTest(t)
dir, cleanup := testutils.TempDir(t)
defer cleanup()
configFile := filepath.Join(dir, "invalid.json5")
require.NoError(t, ioutil.WriteFile(configFile, []byte("Hi Mom!"), os.ModePerm))
parsed := TestConfig{}
err := ParseConfigFile(configFile, "", &parsed)
require.Regexp(t, `Unable to parse file ".*/invalid.json5": invalid character 'H' looking for beginning of value`, err.Error())
}