diff --git a/cmd/crowdsec-cli/console.go b/cmd/crowdsec-cli/console.go index 0af3d1188..439a8143b 100644 --- a/cmd/crowdsec-cli/console.go +++ b/cmd/crowdsec-cli/console.go @@ -229,6 +229,24 @@ Disable given information push to the central API.`, return cmdConsole } +func dumpConsoleConfig(c *csconfig.LocalApiServerCfg) error { + out, err := yaml.Marshal(c.ConsoleConfig) + if err != nil { + return fmt.Errorf("while marshaling ConsoleConfig (for %s): %w", c.ConsoleConfigPath, err) + } + + if c.ConsoleConfigPath == "" { + c.ConsoleConfigPath = csconfig.DefaultConsoleConfigFilePath + log.Debugf("Empty console_path, defaulting to %s", c.ConsoleConfigPath) + } + + if err := os.WriteFile(c.ConsoleConfigPath, out, 0600); err != nil { + return fmt.Errorf("while dumping console config to %s: %w", c.ConsoleConfigPath, err) + } + + return nil +} + func SetConsoleOpts(args []string, wanted bool) error { for _, arg := range args { switch arg { @@ -326,7 +344,7 @@ func SetConsoleOpts(args []string, wanted bool) error { } } - if err := csConfig.API.Server.DumpConsoleConfig(); err != nil { + if err := dumpConsoleConfig(csConfig.API.Server); err != nil { return fmt.Errorf("failed writing console config: %s", err) } diff --git a/pkg/csconfig/api.go b/pkg/csconfig/api.go index e4de6696d..bbe2e1622 100644 --- a/pkg/csconfig/api.go +++ b/pkg/csconfig/api.go @@ -58,7 +58,6 @@ type CTICfg struct { } func (a *CTICfg) Load() error { - if a.Key == nil { *a.Enabled = false } diff --git a/pkg/csconfig/api_test.go b/pkg/csconfig/api_test.go index cde6368d5..4338de9c1 100644 --- a/pkg/csconfig/api_test.go +++ b/pkg/csconfig/api_test.go @@ -1,7 +1,6 @@ package csconfig import ( - "fmt" "net" "os" "path/filepath" @@ -10,6 +9,7 @@ import ( log "github.com/sirupsen/logrus" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "gopkg.in/yaml.v2" "github.com/crowdsecurity/go-cs-lib/cstest" @@ -26,7 +26,7 @@ func TestLoadLocalApiClientCfg(t *testing.T) { { name: "basic valid configuration", input: &LocalApiClientCfg{ - CredentialsFilePath: "./tests/lapi-secrets.yaml", + CredentialsFilePath: "./testdata/lapi-secrets.yaml", }, expected: &ApiCredentialsCfg{ URL: "http://localhost:8080/", @@ -37,7 +37,7 @@ func TestLoadLocalApiClientCfg(t *testing.T) { { name: "invalid configuration", input: &LocalApiClientCfg{ - CredentialsFilePath: "./tests/bad_lapi-secrets.yaml", + CredentialsFilePath: "./testdata/bad_lapi-secrets.yaml", }, expected: &ApiCredentialsCfg{}, expectedErr: "field unknown_key not found in type csconfig.ApiCredentialsCfg", @@ -45,15 +45,15 @@ func TestLoadLocalApiClientCfg(t *testing.T) { { name: "invalid configuration filepath", input: &LocalApiClientCfg{ - CredentialsFilePath: "./tests/nonexist_lapi-secrets.yaml", + CredentialsFilePath: "./testdata/nonexist_lapi-secrets.yaml", }, expected: nil, - expectedErr: "open ./tests/nonexist_lapi-secrets.yaml: " + cstest.FileNotFoundMessage, + expectedErr: "open ./testdata/nonexist_lapi-secrets.yaml: " + cstest.FileNotFoundMessage, }, { name: "valid configuration with insecure skip verify", input: &LocalApiClientCfg{ - CredentialsFilePath: "./tests/lapi-secrets.yaml", + CredentialsFilePath: "./testdata/lapi-secrets.yaml", InsecureSkipVerify: ptr.Of(false), }, expected: &ApiCredentialsCfg{ @@ -88,7 +88,7 @@ func TestLoadOnlineApiClientCfg(t *testing.T) { { name: "basic valid configuration", input: &OnlineApiClientCfg{ - CredentialsFilePath: "./tests/online-api-secrets.yaml", + CredentialsFilePath: "./testdata/online-api-secrets.yaml", }, expected: &ApiCredentialsCfg{ URL: "http://crowdsec.api", @@ -99,7 +99,7 @@ func TestLoadOnlineApiClientCfg(t *testing.T) { { name: "invalid configuration", input: &OnlineApiClientCfg{ - CredentialsFilePath: "./tests/bad_lapi-secrets.yaml", + CredentialsFilePath: "./testdata/bad_lapi-secrets.yaml", }, expected: &ApiCredentialsCfg{}, expectedErr: "failed unmarshaling api server credentials", @@ -107,14 +107,14 @@ func TestLoadOnlineApiClientCfg(t *testing.T) { { name: "missing field configuration", input: &OnlineApiClientCfg{ - CredentialsFilePath: "./tests/bad_online-api-secrets.yaml", + CredentialsFilePath: "./testdata/bad_online-api-secrets.yaml", }, expected: nil, }, { name: "invalid configuration filepath", input: &OnlineApiClientCfg{ - CredentialsFilePath: "./tests/nonexist_online-api-secrets.yaml", + CredentialsFilePath: "./testdata/nonexist_online-api-secrets.yaml", }, expected: &ApiCredentialsCfg{}, expectedErr: "failed to read api server credentials", @@ -137,27 +137,23 @@ func TestLoadOnlineApiClientCfg(t *testing.T) { func TestLoadAPIServer(t *testing.T) { tmpLAPI := &LocalApiServerCfg{ - ProfilesPath: "./tests/profiles.yaml", - } - if err := tmpLAPI.LoadProfiles(); err != nil { - t.Fatalf("loading tmp profiles: %+v", err) + ProfilesPath: "./testdata/profiles.yaml", } + err := tmpLAPI.LoadProfiles() + require.NoError(t, err) + + LogDirFullPath, err := filepath.Abs("./testdata") + require.NoError(t, err) - LogDirFullPath, err := filepath.Abs("./tests") - if err != nil { - t.Fatal(err) - } logLevel := log.InfoLevel config := &Config{} - fcontent, err := os.ReadFile("./tests/config.yaml") - if err != nil { - t.Fatal(err) - } + fcontent, err := os.ReadFile("./testdata/config.yaml") + require.NoError(t, err) + configData := os.ExpandEnv(string(fcontent)) err = yaml.UnmarshalStrict([]byte(configData), &config) - if err != nil { - t.Fatal(err) - } + require.NoError(t, err) + tests := []struct { name string input *Config @@ -172,18 +168,18 @@ func TestLoadAPIServer(t *testing.T) { Server: &LocalApiServerCfg{ ListenURI: "http://crowdsec.api", OnlineClient: &OnlineApiClientCfg{ - CredentialsFilePath: "./tests/online-api-secrets.yaml", + CredentialsFilePath: "./testdata/online-api-secrets.yaml", }, - ProfilesPath: "./tests/profiles.yaml", + ProfilesPath: "./testdata/profiles.yaml", PapiLogLevel: &logLevel, }, }, DbConfig: &DatabaseCfg{ Type: "sqlite", - DbPath: "./tests/test.db", + DbPath: "./testdata/test.db", }, Common: &CommonCfg{ - LogDir: "./tests/", + LogDir: "./testdata/", LogMedia: "stdout", }, DisableAPI: false, @@ -193,9 +189,10 @@ func TestLoadAPIServer(t *testing.T) { ListenURI: "http://crowdsec.api", TLS: nil, DbConfig: &DatabaseCfg{ - DbPath: "./tests/test.db", - Type: "sqlite", - MaxOpenConns: ptr.Of(DEFAULT_MAX_OPEN_CONNS), + DbPath: "./testdata/test.db", + Type: "sqlite", + MaxOpenConns: ptr.Of(DEFAULT_MAX_OPEN_CONNS), + DecisionBulkSize: defaultDecisionBulkSize, }, ConsoleConfigPath: DefaultConfigPath("console.yaml"), ConsoleConfig: &ConsoleConfig{ @@ -208,7 +205,7 @@ func TestLoadAPIServer(t *testing.T) { LogDir: LogDirFullPath, LogMedia: "stdout", OnlineClient: &OnlineApiClientCfg{ - CredentialsFilePath: "./tests/online-api-secrets.yaml", + CredentialsFilePath: "./testdata/online-api-secrets.yaml", Credentials: &ApiCredentialsCfg{ URL: "http://crowdsec.api", Login: "test", @@ -216,7 +213,7 @@ func TestLoadAPIServer(t *testing.T) { }, }, Profiles: tmpLAPI.Profiles, - ProfilesPath: "./tests/profiles.yaml", + ProfilesPath: "./testdata/profiles.yaml", UseForwardedForHeaders: false, PapiLogLevel: &logLevel, }, @@ -229,7 +226,7 @@ func TestLoadAPIServer(t *testing.T) { Server: &LocalApiServerCfg{}, }, Common: &CommonCfg{ - LogDir: "./tests/", + LogDir: "./testdata/", LogMedia: "stdout", }, DisableAPI: false, @@ -242,30 +239,23 @@ func TestLoadAPIServer(t *testing.T) { }, } - for idx, test := range tests { - err := test.input.LoadAPIServer() - if err == nil && test.expectedErr != "" { - fmt.Printf("TEST '%s': NOK\n", test.name) - t.Fatalf("Test number %d/%d expected error, didn't get it", idx+1, len(tests)) - } else if test.expectedErr != "" { - fmt.Printf("ERR: %+v\n", err) - if !strings.HasPrefix(fmt.Sprintf("%s", err), test.expectedErr) { - fmt.Printf("TEST '%s': NOK\n", test.name) - t.Fatalf("%d/%d expected '%s' got '%s'", idx, len(tests), - test.expectedErr, - fmt.Sprintf("%s", err)) + for _, tc := range tests { + tc := tc + t.Run(tc.name, func(t *testing.T) { + err := tc.input.LoadAPIServer() + cstest.RequireErrorContains(t, err, tc.expectedErr) + if tc.expectedErr != "" { + return } - assert.Equal(t, test.expected, test.input.API.Server) - } + assert.Equal(t, tc.expected, tc.input.API.Server) + }) } } -func mustParseCIDRNet(s string) *net.IPNet { +func mustParseCIDRNet(t *testing.T, s string) *net.IPNet { _, ipNet, err := net.ParseCIDR(s) - if err != nil { - panic(fmt.Sprintf("MustParseCIDR: parsing %q: %v", s, err)) - } + require.NoError(t, err) return ipNet } @@ -306,7 +296,7 @@ func TestParseCapiWhitelists(t *testing.T) { input: `{"cidrs": ["1.2.3.0/24"]}`, expected: &CapiWhitelist{ Ips: []net.IP{}, - Cidrs: []*net.IPNet{mustParseCIDRNet("1.2.3.0/24")}, + Cidrs: []*net.IPNet{mustParseCIDRNet(t, "1.2.3.0/24")}, }, }, } diff --git a/pkg/csconfig/common_test.go b/pkg/csconfig/common_test.go index 5666f2d74..2c5f798a6 100644 --- a/pkg/csconfig/common_test.go +++ b/pkg/csconfig/common_test.go @@ -1,44 +1,41 @@ package csconfig import ( - "fmt" "path/filepath" - "strings" "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/crowdsecurity/go-cs-lib/cstest" ) func TestLoadCommon(t *testing.T) { - pidDirPath := "./tests" - LogDirFullPath, err := filepath.Abs("./tests/log/") - if err != nil { - t.Fatal(err) - } + pidDirPath := "./testdata" + LogDirFullPath, err := filepath.Abs("./testdata/log/") + require.NoError(t, err) - WorkingDirFullPath, err := filepath.Abs("./tests") - if err != nil { - t.Fatal(err) - } + WorkingDirFullPath, err := filepath.Abs("./testdata") + require.NoError(t, err) tests := []struct { - name string - Input *Config - expectedResult *CommonCfg - err string + name string + input *Config + expected *CommonCfg + expectedErr string }{ { name: "basic valid configuration", - Input: &Config{ + input: &Config{ Common: &CommonCfg{ Daemonize: true, - PidDir: "./tests", + PidDir: "./testdata", LogMedia: "file", - LogDir: "./tests/log/", - WorkingDir: "./tests/", + LogDir: "./testdata/log/", + WorkingDir: "./testdata/", }, }, - expectedResult: &CommonCfg{ + expected: &CommonCfg{ Daemonize: true, PidDir: pidDirPath, LogMedia: "file", @@ -48,15 +45,15 @@ func TestLoadCommon(t *testing.T) { }, { name: "empty working dir", - Input: &Config{ + input: &Config{ Common: &CommonCfg{ Daemonize: true, - PidDir: "./tests", + PidDir: "./testdata", LogMedia: "file", - LogDir: "./tests/log/", + LogDir: "./testdata/log/", }, }, - expectedResult: &CommonCfg{ + expected: &CommonCfg{ Daemonize: true, PidDir: pidDirPath, LogMedia: "file", @@ -64,31 +61,23 @@ func TestLoadCommon(t *testing.T) { }, }, { - name: "no common", - Input: &Config{}, - expectedResult: nil, + name: "no common", + input: &Config{}, + expected: nil, + expectedErr: "no common block provided in configuration file", }, } - for idx, test := range tests { - err := test.Input.LoadCommon() - if err == nil && test.err != "" { - fmt.Printf("TEST '%s': NOK\n", test.name) - t.Fatalf("%d/%d expected error, didn't get it", idx, len(tests)) - } else if test.err != "" { - if !strings.HasPrefix(fmt.Sprintf("%s", err), test.err) { - fmt.Printf("TEST '%s': NOK\n", test.name) - t.Fatalf("%d/%d expected '%s' got '%s'", idx, len(tests), - test.err, - fmt.Sprintf("%s", err)) + for _, tc := range tests { + tc := tc + t.Run(tc.name, func(t *testing.T) { + err := tc.input.LoadCommon() + cstest.RequireErrorContains(t, err, tc.expectedErr) + if tc.expectedErr != "" { + return } - } - isOk := assert.Equal(t, test.expectedResult, test.Input.Common) - if !isOk { - t.Fatalf("TEST '%s': NOK", test.name) - } else { - fmt.Printf("TEST '%s': OK\n", test.name) - } + assert.Equal(t, tc.expected, tc.input.Common) + }) } } diff --git a/pkg/csconfig/config.go b/pkg/csconfig/config.go index 2aa7f4144..0fa0e1d2d 100644 --- a/pkg/csconfig/config.go +++ b/pkg/csconfig/config.go @@ -1,3 +1,5 @@ +// Package csconfig contains the configuration structures for crowdsec and cscli. + package csconfig import ( @@ -37,15 +39,6 @@ type Config struct { Hub *Hub `yaml:"-"` } -func (c *Config) Dump() error { - out, err := yaml.Marshal(c) - if err != nil { - return fmt.Errorf("failed marshaling config: %w", err) - } - fmt.Printf("%s", string(out)) - return nil -} - func NewConfig(configFile string, disableAgent bool, disableAPI bool, quiet bool) (*Config, string, error) { patcher := yamlpatch.NewPatcher(configFile, ".local") patcher.SetQuiet(quiet) diff --git a/pkg/csconfig/config_test.go b/pkg/csconfig/config_test.go index 53f570ab6..9bdf2da6d 100644 --- a/pkg/csconfig/config_test.go +++ b/pkg/csconfig/config_test.go @@ -5,42 +5,43 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "gopkg.in/yaml.v2" "github.com/crowdsecurity/go-cs-lib/cstest" ) func TestNormalLoad(t *testing.T) { - _, _, err := NewConfig("./tests/config.yaml", false, false, false) + _, _, err := NewConfig("./testdata/config.yaml", false, false, false) require.NoError(t, err) - _, _, err = NewConfig("./tests/xxx.yaml", false, false, false) - assert.EqualError(t, err, "while reading yaml file: open ./tests/xxx.yaml: "+cstest.FileNotFoundMessage) + _, _, err = NewConfig("./testdata/xxx.yaml", false, false, false) + assert.EqualError(t, err, "while reading yaml file: open ./testdata/xxx.yaml: "+cstest.FileNotFoundMessage) - _, _, err = NewConfig("./tests/simulation.yaml", false, false, false) - assert.EqualError(t, err, "./tests/simulation.yaml: yaml: unmarshal errors:\n line 1: field simulation not found in type csconfig.Config") + _, _, err = NewConfig("./testdata/simulation.yaml", false, false, false) + assert.EqualError(t, err, "./testdata/simulation.yaml: yaml: unmarshal errors:\n line 1: field simulation not found in type csconfig.Config") } func TestNewCrowdSecConfig(t *testing.T) { tests := []struct { - name string - expectedResult *Config + name string + expected *Config }{ { - name: "new configuration: basic", - expectedResult: &Config{}, + name: "new configuration: basic", + expected: &Config{}, }, } for _, tc := range tests { tc := tc t.Run(tc.name, func(t *testing.T) { result := &Config{} - assert.Equal(t, tc.expectedResult, result) + assert.Equal(t, tc.expected, result) }) } } func TestDefaultConfig(t *testing.T) { x := NewDefaultConfig() - err := x.Dump() - require.NoError(t, err) + _, err := yaml.Marshal(x) + require.NoError(t, err, "failed marshaling config: %s", err) } diff --git a/pkg/csconfig/console.go b/pkg/csconfig/console.go index d1326ddb4..32c4cff88 100644 --- a/pkg/csconfig/console.go +++ b/pkg/csconfig/console.go @@ -82,23 +82,3 @@ func (c *LocalApiServerCfg) LoadConsoleConfig() error { return nil } - -func (c *LocalApiServerCfg) DumpConsoleConfig() error { - var out []byte - var err error - - if out, err = yaml.Marshal(c.ConsoleConfig); err != nil { - return fmt.Errorf("while marshaling ConsoleConfig (for %s): %w", c.ConsoleConfigPath, err) - } - if c.ConsoleConfigPath == "" { - c.ConsoleConfigPath = DefaultConsoleConfigFilePath - log.Debugf("Empty console_path, defaulting to %s", c.ConsoleConfigPath) - - } - - if err := os.WriteFile(c.ConsoleConfigPath, out, 0600); err != nil { - return fmt.Errorf("while dumping console config to %s: %w", c.ConsoleConfigPath, err) - } - - return nil -} diff --git a/pkg/csconfig/crowdsec_service_test.go b/pkg/csconfig/crowdsec_service_test.go index ded6956e5..aa1d341f5 100644 --- a/pkg/csconfig/crowdsec_service_test.go +++ b/pkg/csconfig/crowdsec_service_test.go @@ -1,24 +1,23 @@ package csconfig import ( - "fmt" "path/filepath" "testing" + "github.com/stretchr/testify/require" + "github.com/crowdsecurity/go-cs-lib/cstest" "github.com/crowdsecurity/go-cs-lib/ptr" - - "github.com/stretchr/testify/require" ) func TestLoadCrowdsec(t *testing.T) { - acquisFullPath, err := filepath.Abs("./tests/acquis.yaml") + acquisFullPath, err := filepath.Abs("./testdata/acquis.yaml") require.NoError(t, err) - acquisInDirFullPath, err := filepath.Abs("./tests/acquis/acquis.yaml") + acquisInDirFullPath, err := filepath.Abs("./testdata/acquis/acquis.yaml") require.NoError(t, err) - acquisDirFullPath, err := filepath.Abs("./tests/acquis") + acquisDirFullPath, err := filepath.Abs("./testdata/acquis") require.NoError(t, err) hubFullPath, err := filepath.Abs("./hub") @@ -27,42 +26,42 @@ func TestLoadCrowdsec(t *testing.T) { dataFullPath, err := filepath.Abs("./data") require.NoError(t, err) - configDirFullPath, err := filepath.Abs("./tests") + configDirFullPath, err := filepath.Abs("./testdata") require.NoError(t, err) hubIndexFileFullPath, err := filepath.Abs("./hub/.index.json") require.NoError(t, err) - contextFileFullPath, err := filepath.Abs("./tests/context.yaml") + contextFileFullPath, err := filepath.Abs("./testdata/context.yaml") require.NoError(t, err) tests := []struct { - name string - input *Config - expectedResult *CrowdsecServiceCfg - expectedErr string + name string + input *Config + expected *CrowdsecServiceCfg + expectedErr string }{ { name: "basic valid configuration", input: &Config{ ConfigPaths: &ConfigurationPaths{ - ConfigDir: "./tests", + ConfigDir: "./testdata", DataDir: "./data", HubDir: "./hub", }, API: &APICfg{ Client: &LocalApiClientCfg{ - CredentialsFilePath: "./tests/lapi-secrets.yaml", + CredentialsFilePath: "./testdata/lapi-secrets.yaml", }, }, Crowdsec: &CrowdsecServiceCfg{ - AcquisitionFilePath: "./tests/acquis.yaml", - SimulationFilePath: "./tests/simulation.yaml", - ConsoleContextPath: "./tests/context.yaml", + AcquisitionFilePath: "./testdata/acquis.yaml", + SimulationFilePath: "./testdata/simulation.yaml", + ConsoleContextPath: "./testdata/context.yaml", ConsoleContextValueLength: 2500, }, }, - expectedResult: &CrowdsecServiceCfg{ + expected: &CrowdsecServiceCfg{ Enable: ptr.Of(true), AcquisitionDirPath: "", ConsoleContextPath: contextFileFullPath, @@ -76,7 +75,7 @@ func TestLoadCrowdsec(t *testing.T) { OutputRoutinesCount: 1, ConsoleContextValueLength: 2500, AcquisitionFiles: []string{acquisFullPath}, - SimulationFilePath: "./tests/simulation.yaml", + SimulationFilePath: "./testdata/simulation.yaml", ContextToSend: map[string][]string{ "source_ip": {"evt.Parsed.source_ip"}, }, @@ -89,23 +88,23 @@ func TestLoadCrowdsec(t *testing.T) { name: "basic valid configuration with acquisition dir", input: &Config{ ConfigPaths: &ConfigurationPaths{ - ConfigDir: "./tests", + ConfigDir: "./testdata", DataDir: "./data", HubDir: "./hub", }, API: &APICfg{ Client: &LocalApiClientCfg{ - CredentialsFilePath: "./tests/lapi-secrets.yaml", + CredentialsFilePath: "./testdata/lapi-secrets.yaml", }, }, Crowdsec: &CrowdsecServiceCfg{ - AcquisitionFilePath: "./tests/acquis.yaml", - AcquisitionDirPath: "./tests/acquis/", - SimulationFilePath: "./tests/simulation.yaml", - ConsoleContextPath: "./tests/context.yaml", + AcquisitionFilePath: "./testdata/acquis.yaml", + AcquisitionDirPath: "./testdata/acquis/", + SimulationFilePath: "./testdata/simulation.yaml", + ConsoleContextPath: "./testdata/context.yaml", }, }, - expectedResult: &CrowdsecServiceCfg{ + expected: &CrowdsecServiceCfg{ Enable: ptr.Of(true), AcquisitionDirPath: acquisDirFullPath, AcquisitionFilePath: acquisFullPath, @@ -122,7 +121,7 @@ func TestLoadCrowdsec(t *testing.T) { ContextToSend: map[string][]string{ "source_ip": {"evt.Parsed.source_ip"}, }, - SimulationFilePath: "./tests/simulation.yaml", + SimulationFilePath: "./testdata/simulation.yaml", SimulationConfig: &SimulationConfig{ Simulation: ptr.Of(false), }, @@ -132,13 +131,13 @@ func TestLoadCrowdsec(t *testing.T) { name: "no acquisition file and dir", input: &Config{ ConfigPaths: &ConfigurationPaths{ - ConfigDir: "./tests", + ConfigDir: "./testdata", DataDir: "./data", HubDir: "./hub", }, API: &APICfg{ Client: &LocalApiClientCfg{ - CredentialsFilePath: "./tests/lapi-secrets.yaml", + CredentialsFilePath: "./testdata/lapi-secrets.yaml", }, }, Crowdsec: &CrowdsecServiceCfg{ @@ -146,7 +145,7 @@ func TestLoadCrowdsec(t *testing.T) { ConsoleContextValueLength: 10, }, }, - expectedResult: &CrowdsecServiceCfg{ + expected: &CrowdsecServiceCfg{ Enable: ptr.Of(true), AcquisitionDirPath: "", AcquisitionFilePath: "", @@ -173,18 +172,18 @@ func TestLoadCrowdsec(t *testing.T) { name: "non existing acquisition file", input: &Config{ ConfigPaths: &ConfigurationPaths{ - ConfigDir: "./tests", + ConfigDir: "./testdata", DataDir: "./data", HubDir: "./hub", }, API: &APICfg{ Client: &LocalApiClientCfg{ - CredentialsFilePath: "./tests/lapi-secrets.yaml", + CredentialsFilePath: "./testdata/lapi-secrets.yaml", }, }, Crowdsec: &CrowdsecServiceCfg{ ConsoleContextPath: "", - AcquisitionFilePath: "./tests/acquis_not_exist.yaml", + AcquisitionFilePath: "./testdata/acquis_not_exist.yaml", }, }, expectedErr: cstest.FileNotFoundMessage, @@ -193,26 +192,25 @@ func TestLoadCrowdsec(t *testing.T) { name: "agent disabled", input: &Config{ ConfigPaths: &ConfigurationPaths{ - ConfigDir: "./tests", + ConfigDir: "./testdata", DataDir: "./data", HubDir: "./hub", }, }, - expectedResult: nil, + expected: nil, }, } for _, tc := range tests { tc := tc t.Run(tc.name, func(t *testing.T) { - fmt.Printf("TEST '%s'\n", tc.name) err := tc.input.LoadCrowdsec() cstest.RequireErrorContains(t, err, tc.expectedErr) if tc.expectedErr != "" { return } - require.Equal(t, tc.expectedResult, tc.input.Crowdsec) + require.Equal(t, tc.expected, tc.input.Crowdsec) }) } } diff --git a/pkg/csconfig/cscli_test.go b/pkg/csconfig/cscli_test.go index 1f432f6e3..b3d0abc6b 100644 --- a/pkg/csconfig/cscli_test.go +++ b/pkg/csconfig/cscli_test.go @@ -1,52 +1,45 @@ package csconfig import ( - "fmt" "path/filepath" - "strings" "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/crowdsecurity/go-cs-lib/cstest" ) func TestLoadCSCLI(t *testing.T) { hubFullPath, err := filepath.Abs("./hub") - if err != nil { - t.Fatal(err) - } + require.NoError(t, err) dataFullPath, err := filepath.Abs("./data") - if err != nil { - t.Fatal(err) - } + require.NoError(t, err) - configDirFullPath, err := filepath.Abs("./tests") - if err != nil { - t.Fatal(err) - } + configDirFullPath, err := filepath.Abs("./testdata") + require.NoError(t, err) hubIndexFileFullPath, err := filepath.Abs("./hub/.index.json") - if err != nil { - t.Fatal(err) - } + require.NoError(t, err) tests := []struct { - name string - Input *Config - expectedResult *CscliCfg - err string + name string + input *Config + expected *CscliCfg + expectedErr string }{ { name: "basic valid configuration", - Input: &Config{ + input: &Config{ ConfigPaths: &ConfigurationPaths{ - ConfigDir: "./tests", + ConfigDir: "./testdata", DataDir: "./data", HubDir: "./hub", HubIndexFile: "./hub/.index.json", }, }, - expectedResult: &CscliCfg{ + expected: &CscliCfg{ ConfigDir: configDirFullPath, DataDir: dataFullPath, HubDir: hubFullPath, @@ -54,31 +47,23 @@ func TestLoadCSCLI(t *testing.T) { }, }, { - name: "no configuration path", - Input: &Config{}, - expectedResult: &CscliCfg{}, + name: "no configuration path", + input: &Config{}, + expected: &CscliCfg{}, + expectedErr: "no configuration paths provided", }, } - for idx, test := range tests { - err := test.Input.LoadCSCLI() - if err == nil && test.err != "" { - fmt.Printf("TEST '%s': NOK\n", test.name) - t.Fatalf("%d/%d expected error, didn't get it", idx, len(tests)) - } else if test.err != "" { - if !strings.HasPrefix(fmt.Sprintf("%s", err), test.err) { - fmt.Printf("TEST '%s': NOK\n", test.name) - t.Fatalf("%d/%d expected '%s' got '%s'", idx, len(tests), - test.err, - fmt.Sprintf("%s", err)) + for _, tc := range tests { + tc := tc + t.Run(tc.name, func(t *testing.T) { + err := tc.input.LoadCSCLI() + cstest.RequireErrorContains(t, err, tc.expectedErr) + if tc.expectedErr != "" { + return } - } - isOk := assert.Equal(t, test.expectedResult, test.Input.Cscli) - if !isOk { - t.Fatalf("TEST '%s': NOK", test.name) - } else { - fmt.Printf("TEST '%s': OK\n", test.name) - } + assert.Equal(t, tc.expected, tc.input.Cscli) + }) } } diff --git a/pkg/csconfig/database.go b/pkg/csconfig/database.go index 61e5fccb4..4d041c312 100644 --- a/pkg/csconfig/database.go +++ b/pkg/csconfig/database.go @@ -10,13 +10,12 @@ import ( "github.com/crowdsecurity/go-cs-lib/ptr" ) -var DEFAULT_MAX_OPEN_CONNS = 100 - const ( + DEFAULT_MAX_OPEN_CONNS = 100 defaultDecisionBulkSize = 1000 // we need an upper bound due to the sqlite limit of 32k variables in a query // we have 15 variables per decision, so 32768/15 = 2184.5333 - maxDecisionBulkSize = 2000 + maxDecisionBulkSize = 2000 ) type DatabaseCfg struct { diff --git a/pkg/csconfig/database_test.go b/pkg/csconfig/database_test.go index 29aee2640..631e63ae2 100644 --- a/pkg/csconfig/database_test.go +++ b/pkg/csconfig/database_test.go @@ -1,28 +1,27 @@ package csconfig import ( - "fmt" - "strings" "testing" "github.com/stretchr/testify/assert" + "github.com/crowdsecurity/go-cs-lib/cstest" "github.com/crowdsecurity/go-cs-lib/ptr" ) func TestLoadDBConfig(t *testing.T) { tests := []struct { - name string - Input *Config - expectedResult *DatabaseCfg - err string + name string + input *Config + expected *DatabaseCfg + expectedErr string }{ { name: "basic valid configuration", - Input: &Config{ + input: &Config{ DbConfig: &DatabaseCfg{ Type: "sqlite", - DbPath: "./tests/test.db", + DbPath: "./testdata/test.db", MaxOpenConns: ptr.Of(10), }, Cscli: &CscliCfg{}, @@ -30,38 +29,31 @@ func TestLoadDBConfig(t *testing.T) { Server: &LocalApiServerCfg{}, }, }, - expectedResult: &DatabaseCfg{ - Type: "sqlite", - DbPath: "./tests/test.db", - MaxOpenConns: ptr.Of(10), + expected: &DatabaseCfg{ + Type: "sqlite", + DbPath: "./testdata/test.db", + MaxOpenConns: ptr.Of(10), DecisionBulkSize: defaultDecisionBulkSize, }, }, { - name: "no configuration path", - Input: &Config{}, - expectedResult: nil, + name: "no configuration path", + input: &Config{}, + expected: nil, + expectedErr: "no database configuration provided", }, } - for idx, test := range tests { - err := test.Input.LoadDBConfig() - if err == nil && test.err != "" { - fmt.Printf("TEST '%s': NOK\n", test.name) - t.Fatalf("%d/%d expected error, didn't get it", idx, len(tests)) - } else if test.err != "" { - if !strings.HasPrefix(fmt.Sprintf("%s", err), test.err) { - fmt.Printf("TEST '%s': NOK\n", test.name) - t.Fatalf("%d/%d expected '%s' got '%s'", idx, len(tests), - test.err, - fmt.Sprintf("%s", err)) + for _, tc := range tests { + tc := tc + t.Run(tc.name, func(t *testing.T) { + err := tc.input.LoadDBConfig() + cstest.RequireErrorContains(t, err, tc.expectedErr) + if tc.expectedErr != "" { + return } - } - isOk := assert.Equal(t, test.expectedResult, test.Input.DbConfig) - if !isOk { - t.Fatalf("TEST '%s': NOK", test.name) - } else { - fmt.Printf("TEST '%s': OK\n", test.name) - } + + assert.Equal(t, tc.expected, tc.input.DbConfig) + }) } } diff --git a/pkg/csconfig/fflag.go b/pkg/csconfig/fflag.go index e9110649d..444585fb8 100644 --- a/pkg/csconfig/fflag.go +++ b/pkg/csconfig/fflag.go @@ -10,7 +10,6 @@ import ( "github.com/crowdsecurity/crowdsec/pkg/fflag" ) - // LoadFeatureFlagsEnv parses the environment variables to enable feature flags. func LoadFeatureFlagsEnv(logger *log.Logger) error { if err := fflag.Crowdsec.SetFromEnv(logger); err != nil { @@ -19,7 +18,6 @@ func LoadFeatureFlagsEnv(logger *log.Logger) error { return nil } - // LoadFeatureFlags parses feature.yaml to enable feature flags. // The file is in the same directory as config.yaml, which is provided // as the fist parameter. This can be different than ConfigPaths.ConfigDir @@ -33,7 +31,6 @@ func LoadFeatureFlagsFile(configPath string, logger *log.Logger) error { return nil } - // ListFeatureFlags returns a list of the enabled feature flags. func ListFeatureFlags() string { enabledFeatures := fflag.Crowdsec.GetEnabledFeatures() diff --git a/pkg/csconfig/hub_test.go b/pkg/csconfig/hub_test.go index 136790d5f..230f0a2eb 100644 --- a/pkg/csconfig/hub_test.go +++ b/pkg/csconfig/hub_test.go @@ -1,52 +1,45 @@ package csconfig import ( - "fmt" "path/filepath" - "strings" "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/crowdsecurity/go-cs-lib/cstest" ) func TestLoadHub(t *testing.T) { hubFullPath, err := filepath.Abs("./hub") - if err != nil { - t.Fatal(err) - } + require.NoError(t, err) dataFullPath, err := filepath.Abs("./data") - if err != nil { - t.Fatal(err) - } + require.NoError(t, err) - configDirFullPath, err := filepath.Abs("./tests") - if err != nil { - t.Fatal(err) - } + configDirFullPath, err := filepath.Abs("./testdata") + require.NoError(t, err) hubIndexFileFullPath, err := filepath.Abs("./hub/.index.json") - if err != nil { - t.Fatal(err) - } + require.NoError(t, err) tests := []struct { - name string - Input *Config - expectedResult *Hub - err string + name string + input *Config + expected *Hub + expectedErr string }{ { name: "basic valid configuration", - Input: &Config{ + input: &Config{ ConfigPaths: &ConfigurationPaths{ - ConfigDir: "./tests", + ConfigDir: "./testdata", DataDir: "./data", HubDir: "./hub", HubIndexFile: "./hub/.index.json", }, }, - expectedResult: &Hub{ + expected: &Hub{ ConfigDir: configDirFullPath, DataDir: dataFullPath, HubDir: hubFullPath, @@ -55,40 +48,32 @@ func TestLoadHub(t *testing.T) { }, { name: "no data dir", - Input: &Config{ + input: &Config{ ConfigPaths: &ConfigurationPaths{ - ConfigDir: "./tests", + ConfigDir: "./testdata", HubDir: "./hub", HubIndexFile: "./hub/.index.json", }, }, - expectedResult: nil, + expectedErr: "please provide a data directory with the 'data_dir' directive in the 'config_paths' section", }, { - name: "no configuration path", - Input: &Config{}, - expectedResult: nil, + name: "no configuration path", + input: &Config{}, + expectedErr: "no configuration paths provided", }, } - for idx, test := range tests { - err := test.Input.LoadHub() - if err == nil && test.err != "" { - fmt.Printf("TEST '%s': NOK\n", test.name) - t.Fatalf("%d/%d expected error, didn't get it", idx, len(tests)) - } else if test.err != "" { - if !strings.HasPrefix(fmt.Sprintf("%s", err), test.err) { - fmt.Printf("TEST '%s': NOK\n", test.name) - t.Fatalf("%d/%d expected '%s' got '%s'", idx, len(tests), - test.err, - fmt.Sprintf("%s", err)) + for _, tc := range tests { + tc := tc + t.Run(tc.name, func(t *testing.T) { + err := tc.input.LoadHub() + cstest.RequireErrorContains(t, err, tc.expectedErr) + if tc.expectedErr != "" { + return } - } - isOk := assert.Equal(t, test.expectedResult, test.Input.Hub) - if !isOk { - t.Fatalf("TEST '%s': NOK", test.name) - } else { - fmt.Printf("TEST '%s': OK\n", test.name) - } + + assert.Equal(t, tc.expected, tc.input.Hub) + }) } } diff --git a/pkg/csconfig/profiles.go b/pkg/csconfig/profiles.go index 7071b28cd..ad3779ed1 100644 --- a/pkg/csconfig/profiles.go +++ b/pkg/csconfig/profiles.go @@ -6,10 +6,11 @@ import ( "fmt" "io" + "gopkg.in/yaml.v2" + "github.com/crowdsecurity/go-cs-lib/yamlpatch" "github.com/crowdsecurity/crowdsec/pkg/models" - "gopkg.in/yaml.v2" ) // var OnErrorDefault = OnErrorIgnore @@ -43,7 +44,6 @@ func (c *LocalApiServerCfg) LoadProfiles() error { } reader := bytes.NewReader(fcontent) - //process the yaml dec := yaml.NewDecoder(reader) dec.SetStrict(true) for { diff --git a/pkg/csconfig/prometheus_test.go b/pkg/csconfig/prometheus_test.go index 9f14d1149..79c9ec58f 100644 --- a/pkg/csconfig/prometheus_test.go +++ b/pkg/csconfig/prometheus_test.go @@ -3,21 +3,21 @@ package csconfig import ( "testing" - "github.com/crowdsecurity/go-cs-lib/cstest" - "github.com/stretchr/testify/require" + + "github.com/crowdsecurity/go-cs-lib/cstest" ) func TestLoadPrometheus(t *testing.T) { tests := []struct { name string - Input *Config + input *Config expectedURL string expectedErr string }{ { name: "basic valid configuration", - Input: &Config{ + input: &Config{ Prometheus: &PrometheusCfg{ Enabled: true, Level: "full", @@ -33,10 +33,10 @@ func TestLoadPrometheus(t *testing.T) { for _, tc := range tests { tc := tc t.Run(tc.name, func(t *testing.T) { - err := tc.Input.LoadPrometheus() + err := tc.input.LoadPrometheus() cstest.RequireErrorContains(t, err, tc.expectedErr) - require.Equal(t, tc.expectedURL, tc.Input.Cscli.PrometheusUrl) + require.Equal(t, tc.expectedURL, tc.input.Cscli.PrometheusUrl) }) } } diff --git a/pkg/csconfig/simulation.go b/pkg/csconfig/simulation.go index 93c823924..184708f0d 100644 --- a/pkg/csconfig/simulation.go +++ b/pkg/csconfig/simulation.go @@ -4,8 +4,9 @@ import ( "fmt" "path/filepath" - "github.com/crowdsecurity/go-cs-lib/yamlpatch" "gopkg.in/yaml.v2" + + "github.com/crowdsecurity/go-cs-lib/yamlpatch" ) type SimulationConfig struct { diff --git a/pkg/csconfig/simulation_test.go b/pkg/csconfig/simulation_test.go index 3e9a42847..44b8909a2 100644 --- a/pkg/csconfig/simulation_test.go +++ b/pkg/csconfig/simulation_test.go @@ -12,46 +12,46 @@ import ( ) func TestSimulationLoading(t *testing.T) { - testXXFullPath, err := filepath.Abs("./tests/xxx.yaml") + testXXFullPath, err := filepath.Abs("./testdata/xxx.yaml") require.NoError(t, err) - badYamlFullPath, err := filepath.Abs("./tests/config.yaml") + badYamlFullPath, err := filepath.Abs("./testdata/config.yaml") require.NoError(t, err) tests := []struct { - name string - Input *Config - expectedResult *SimulationConfig - expectedErr string + name string + input *Config + expected *SimulationConfig + expectedErr string }{ { name: "basic valid simulation", - Input: &Config{ + input: &Config{ ConfigPaths: &ConfigurationPaths{ - SimulationFilePath: "./tests/simulation.yaml", + SimulationFilePath: "./testdata/simulation.yaml", DataDir: "./data", }, Crowdsec: &CrowdsecServiceCfg{}, Cscli: &CscliCfg{}, }, - expectedResult: &SimulationConfig{Simulation: new(bool)}, + expected: &SimulationConfig{Simulation: new(bool)}, }, { name: "basic nil config", - Input: &Config{ + input: &Config{ ConfigPaths: &ConfigurationPaths{ SimulationFilePath: "", DataDir: "./data", }, Crowdsec: &CrowdsecServiceCfg{}, }, - expectedErr: "simulation.yaml: "+cstest.FileNotFoundMessage, + expectedErr: "simulation.yaml: " + cstest.FileNotFoundMessage, }, { name: "basic bad file name", - Input: &Config{ + input: &Config{ ConfigPaths: &ConfigurationPaths{ - SimulationFilePath: "./tests/xxx.yaml", + SimulationFilePath: "./testdata/xxx.yaml", DataDir: "./data", }, Crowdsec: &CrowdsecServiceCfg{}, @@ -60,9 +60,9 @@ func TestSimulationLoading(t *testing.T) { }, { name: "basic bad file content", - Input: &Config{ + input: &Config{ ConfigPaths: &ConfigurationPaths{ - SimulationFilePath: "./tests/config.yaml", + SimulationFilePath: "./testdata/config.yaml", DataDir: "./data", }, Crowdsec: &CrowdsecServiceCfg{}, @@ -71,9 +71,9 @@ func TestSimulationLoading(t *testing.T) { }, { name: "basic bad file content", - Input: &Config{ + input: &Config{ ConfigPaths: &ConfigurationPaths{ - SimulationFilePath: "./tests/config.yaml", + SimulationFilePath: "./testdata/config.yaml", DataDir: "./data", }, Crowdsec: &CrowdsecServiceCfg{}, @@ -85,10 +85,10 @@ func TestSimulationLoading(t *testing.T) { for _, tc := range tests { tc := tc t.Run(tc.name, func(t *testing.T) { - err := tc.Input.LoadSimulation() + err := tc.input.LoadSimulation() cstest.RequireErrorContains(t, err, tc.expectedErr) - assert.Equal(t, tc.expectedResult, tc.Input.Crowdsec.SimulationConfig) + assert.Equal(t, tc.expected, tc.input.Crowdsec.SimulationConfig) }) } } @@ -109,32 +109,32 @@ func TestIsSimulated(t *testing.T) { name string SimulationConfig *SimulationConfig Input string - expectedResult bool + expected bool }{ { name: "No simulation except (in exclusion)", SimulationConfig: simCfgOff, Input: "test", - expectedResult: true, + expected: true, }, { name: "All simulation (not in exclusion)", SimulationConfig: simCfgOn, Input: "toto", - expectedResult: true, + expected: true, }, { name: "All simulation (in exclusion)", SimulationConfig: simCfgOn, Input: "test", - expectedResult: false, + expected: false, }, } for _, tc := range tests { tc := tc t.Run(tc.name, func(t *testing.T) { - IsSimulated := tc.SimulationConfig.IsSimulated(tc.Input) - require.Equal(t, tc.expectedResult, IsSimulated) + isSimulated := tc.SimulationConfig.IsSimulated(tc.Input) + require.Equal(t, tc.expected, isSimulated) }) } } diff --git a/pkg/csconfig/tests/acquis.yaml b/pkg/csconfig/testdata/acquis.yaml similarity index 100% rename from pkg/csconfig/tests/acquis.yaml rename to pkg/csconfig/testdata/acquis.yaml diff --git a/pkg/csconfig/tests/acquis/acquis.yaml b/pkg/csconfig/testdata/acquis/acquis.yaml similarity index 100% rename from pkg/csconfig/tests/acquis/acquis.yaml rename to pkg/csconfig/testdata/acquis/acquis.yaml diff --git a/pkg/csconfig/tests/bad_lapi-secrets.yaml b/pkg/csconfig/testdata/bad_lapi-secrets.yaml similarity index 100% rename from pkg/csconfig/tests/bad_lapi-secrets.yaml rename to pkg/csconfig/testdata/bad_lapi-secrets.yaml diff --git a/pkg/csconfig/tests/bad_online-api-secrets.yaml b/pkg/csconfig/testdata/bad_online-api-secrets.yaml similarity index 100% rename from pkg/csconfig/tests/bad_online-api-secrets.yaml rename to pkg/csconfig/testdata/bad_online-api-secrets.yaml diff --git a/pkg/csconfig/tests/config.yaml b/pkg/csconfig/testdata/config.yaml similarity index 55% rename from pkg/csconfig/tests/config.yaml rename to pkg/csconfig/testdata/config.yaml index 3148659e3..288c09b84 100644 --- a/pkg/csconfig/tests/config.yaml +++ b/pkg/csconfig/testdata/config.yaml @@ -7,7 +7,7 @@ prometheus: enabled: true level: full crowdsec_service: - acquisition_path: ./tests/acquis.yaml + acquisition_path: ./testdata/acquis.yaml parser_routines: 1 cscli: output: human @@ -21,17 +21,17 @@ db_config: type: sqlite api: client: - credentials_path: ./tests/lapi-secrets.yaml + credentials_path: ./testdata/lapi-secrets.yaml server: - profiles_path: ./tests/profiles.yaml + profiles_path: ./testdata/profiles.yaml listen_uri: 127.0.0.1:8080 tls: null online_client: - credentials_path: ./tests/online-api-secrets.yaml + credentials_path: ./testdata/online-api-secrets.yaml config_paths: - config_dir: ./tests + config_dir: ./testdata data_dir: . - simulation_path: ./tests/simulation.yaml - index_path: ./tests/hub/.index.json - hub_dir: ./tests/hub + simulation_path: ./testdata/simulation.yaml + index_path: ./testdata/hub/.index.json + hub_dir: ./testdata/hub diff --git a/pkg/csconfig/tests/context.yaml b/pkg/csconfig/testdata/context.yaml similarity index 100% rename from pkg/csconfig/tests/context.yaml rename to pkg/csconfig/testdata/context.yaml diff --git a/pkg/csconfig/tests/lapi-secrets.yaml b/pkg/csconfig/testdata/lapi-secrets.yaml similarity index 100% rename from pkg/csconfig/tests/lapi-secrets.yaml rename to pkg/csconfig/testdata/lapi-secrets.yaml diff --git a/pkg/csconfig/tests/online-api-secrets.yaml b/pkg/csconfig/testdata/online-api-secrets.yaml similarity index 100% rename from pkg/csconfig/tests/online-api-secrets.yaml rename to pkg/csconfig/testdata/online-api-secrets.yaml diff --git a/pkg/csconfig/tests/profiles.yaml b/pkg/csconfig/testdata/profiles.yaml similarity index 100% rename from pkg/csconfig/tests/profiles.yaml rename to pkg/csconfig/testdata/profiles.yaml diff --git a/pkg/csconfig/tests/simulation.yaml b/pkg/csconfig/testdata/simulation.yaml similarity index 100% rename from pkg/csconfig/tests/simulation.yaml rename to pkg/csconfig/testdata/simulation.yaml