diff --git a/config/config.go b/config/config.go index 98e27af5..03f7e133 100644 --- a/config/config.go +++ b/config/config.go @@ -1,6 +1,7 @@ package config import ( + "errors" "github.com/TwinProduction/gatus/core" "gopkg.in/yaml.v2" "io/ioutil" @@ -11,7 +12,10 @@ type Config struct { Services []*core.Service `yaml:"services"` } -var config *Config +var ( + ErrNoServiceInConfig = errors.New("configuration file should contain at least 1 service") + config *Config +) func Get() *Config { if config == nil { @@ -24,23 +28,26 @@ func Get() *Config { return config } -func readConfigurationFile(fileName string) (*Config, error) { - if bytes, err := ioutil.ReadFile(fileName); err == nil { +func readConfigurationFile(fileName string) (config *Config, err error) { + var bytes []byte + if bytes, err = ioutil.ReadFile(fileName); err == nil { // file exists, so we'll parse it and return it - return parseConfigBytes(bytes) - } else { - return nil, err + return parseAndValidateConfigBytes(bytes) } + return } -func parseConfigBytes(yamlBytes []byte) (config *Config, err error) { +func parseAndValidateConfigBytes(yamlBytes []byte) (config *Config, err error) { err = yaml.Unmarshal(yamlBytes, &config) - if err != nil { - return - } - for _, service := range config.Services { - if service.Interval == 0 { - service.Interval = 10 * time.Second + // Check if the configuration file at least has services. + if config == nil || len(config.Services) == 0 { + err = ErrNoServiceInConfig + } else { + // Set the default values if they aren't set + for _, service := range config.Services { + if service.Interval == 0 { + service.Interval = 10 * time.Second + } } } return diff --git a/config/config_test.go b/config/config_test.go index 2e222f86..481948aa 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -6,8 +6,8 @@ import ( "time" ) -func TestParseConfigBytes(t *testing.T) { - config := parseConfigBytes([]byte(` +func TestParseAndValidateConfigBytes(t *testing.T) { + config, err := parseAndValidateConfigBytes([]byte(` services: - name: twinnation url: https://twinnation.org/actuator/health @@ -20,6 +20,9 @@ services: - "$STATUS != 400" - "$STATUS != 500" `)) + if err != nil { + t.Error("No error should've been returned") + } if len(config.Services) != 2 { t.Error("Should have returned two services") } @@ -44,14 +47,17 @@ services: } } -func TestParseConfigBytesDefault(t *testing.T) { - config := parseConfigBytes([]byte(` +func TestParseAndValidateConfigBytesDefault(t *testing.T) { + config, err := parseAndValidateConfigBytes([]byte(` services: - name: twinnation url: https://twinnation.org/actuator/health conditions: - "$STATUS == 200" `)) + if err != nil { + t.Error("No error should've been returned") + } if config.Services[0].Url != "https://twinnation.org/actuator/health" { t.Errorf("URL should have been %s", "https://twinnation.org/actuator/health") } @@ -59,3 +65,19 @@ services: t.Errorf("Interval should have been %s, because it is the default value", 10*time.Second) } } + +func TestParseAndValidateBadConfigBytes(t *testing.T) { + _, err := parseAndValidateConfigBytes([]byte(` +badconfig: + - asdsa: w0w + usadasdrl: asdxzczxc + asdas: + - soup +`)) + if err == nil { + t.Error("An error should've been returned") + } + if err != ErrNoServiceInConfig { + t.Error("The error returned should have been of type ErrNoServiceInConfig") + } +}