* allow a acquisition_dir in crowdsec's config + change the behaviour of config loading so that it's working with a list instead. keep backward compat with acquisition_path * remove the default behaviour of 'guessing' acquis path if param isn't present, and error
139 lines
3.5 KiB
Go
139 lines
3.5 KiB
Go
package acquisition
|
|
|
|
import (
|
|
"fmt"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
"github.com/crowdsecurity/crowdsec/pkg/csconfig"
|
|
"github.com/crowdsecurity/crowdsec/pkg/types"
|
|
log "github.com/sirupsen/logrus"
|
|
tomb "gopkg.in/tomb.v2"
|
|
)
|
|
|
|
func TestConfigLoading(t *testing.T) {
|
|
//bad filename
|
|
cfg := csconfig.CrowdsecServiceCfg{
|
|
AcquisitionFiles: []string{"./tests/xxx.yaml"},
|
|
}
|
|
_, err := LoadAcquisitionFromFile(&cfg)
|
|
assert.Contains(t, fmt.Sprintf("%s", err), "can't open ./tests/xxx.yaml: open ./tests/xxx.yaml: no such file or directory")
|
|
//bad config file
|
|
cfg = csconfig.CrowdsecServiceCfg{
|
|
AcquisitionFiles: []string{"./tests/test.log"},
|
|
}
|
|
_, err = LoadAcquisitionFromFile(&cfg)
|
|
assert.Contains(t, fmt.Sprintf("%s", err), "failed to yaml decode ./tests/test.log: yaml: unmarshal errors")
|
|
//correct config file
|
|
cfg = csconfig.CrowdsecServiceCfg{
|
|
AcquisitionFiles: []string{"./tests/acquis_test.yaml"},
|
|
}
|
|
srcs, err := LoadAcquisitionFromFile(&cfg)
|
|
if err != nil {
|
|
t.Fatalf("unexpected error : %s", err)
|
|
}
|
|
assert.Equal(t, len(srcs), 1)
|
|
}
|
|
|
|
func TestDataSourceConfigure(t *testing.T) {
|
|
tests := []struct {
|
|
cfg DataSourceCfg
|
|
//tombState
|
|
config_error string
|
|
read_error string
|
|
tomb_error string
|
|
lines int
|
|
}{
|
|
{ //missing filename(s)
|
|
cfg: DataSourceCfg{
|
|
Mode: CAT_MODE,
|
|
},
|
|
config_error: "empty filename(s) and journalctl filter, malformed datasource",
|
|
},
|
|
{ //missing filename(s)
|
|
cfg: DataSourceCfg{
|
|
Mode: TAIL_MODE,
|
|
},
|
|
config_error: "empty filename(s) and journalctl filter, malformed datasource",
|
|
},
|
|
{ //bad mode(s)
|
|
cfg: DataSourceCfg{
|
|
Filename: "./tests/test.log",
|
|
Mode: "ratata",
|
|
},
|
|
config_error: "configuring file datasource: unknown mode ratata for file acquisition",
|
|
},
|
|
{ //ok test
|
|
cfg: DataSourceCfg{
|
|
Mode: CAT_MODE,
|
|
Filename: "./tests/test.log",
|
|
},
|
|
},
|
|
{ //missing mode, default to CAT_MODE
|
|
cfg: DataSourceCfg{
|
|
Filename: "./tests/test.log",
|
|
},
|
|
},
|
|
{ //ok test for journalctl
|
|
cfg: DataSourceCfg{
|
|
Mode: CAT_MODE,
|
|
JournalctlFilters: []string{"-test.run=TestSimJournalctlCatOneLine", "--"},
|
|
},
|
|
},
|
|
}
|
|
|
|
for tidx, test := range tests {
|
|
|
|
srcs, err := DataSourceConfigure(test.cfg)
|
|
if test.config_error != "" {
|
|
assert.Contains(t, fmt.Sprintf("%s", err), test.config_error)
|
|
log.Infof("expected config error ok : %s", test.config_error)
|
|
continue
|
|
} else {
|
|
if err != nil {
|
|
t.Fatalf("%d/%d unexpected config error %s", tidx, len(tests), err)
|
|
}
|
|
}
|
|
|
|
//check we got the expected mode
|
|
if tests[tidx].cfg.Mode == "" {
|
|
tests[tidx].cfg.Mode = TAIL_MODE
|
|
}
|
|
assert.Equal(t, srcs.Mode(), tests[tidx].cfg.Mode)
|
|
|
|
out := make(chan types.Event)
|
|
tomb := tomb.Tomb{}
|
|
|
|
go func() {
|
|
err = StartAcquisition([]DataSource{srcs}, out, &tomb)
|
|
if test.read_error != "" {
|
|
assert.Contains(t, fmt.Sprintf("%s", err), test.read_error)
|
|
log.Infof("expected read error ok : %s", test.read_error)
|
|
} else {
|
|
if err != nil {
|
|
log.Fatalf("%d/%d unexpected read error %s", tidx, len(tests), err)
|
|
}
|
|
}
|
|
}()
|
|
|
|
log.Printf("kill iiittt")
|
|
//we're actually not interested in the result :)
|
|
tomb.Kill(nil)
|
|
time.Sleep(1 * time.Second)
|
|
|
|
if test.tomb_error != "" {
|
|
assert.Contains(t, fmt.Sprintf("%s", tomb.Err()), test.tomb_error)
|
|
log.Infof("expected tomb error ok : %s", test.read_error)
|
|
continue
|
|
} else {
|
|
if tomb.Err() != nil {
|
|
t.Fatalf("%d/%d unexpected tomb error %s", tidx, len(tests), tomb.Err())
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
}
|