fleet/server/kolide/import_config_test.go
John Murphy 2945031a86 Fix bug in Osquery import and updated import docs (#1478)
This PR contains a fix for a bug that turned up when I was testing configimporter. If the platform field is not specified, its supposed to default to all per the osquery configuration spec. The default was not properly implemented, and if the platform value was missing from the imported configuration it failed. The PR also added instructions to the api documentation describing how to import an osquery configuration.
2017-04-23 19:41:27 -05:00

181 lines
4.0 KiB
Go

package kolide
import (
"bytes"
"encoding/json"
"fmt"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestConfigUnmarshalling(t *testing.T) {
contents := `
{
"options":null,
"schedule":null,
"packs":{
"internal_stuff":{
"discovery":["select pid from processes where name = 'ldap';"],
"platform":"linux",
"queries":{
"active_directory":{
"description":"Check each user's active directory cached settings.",
"interval":"1200",
"query":"select * from ad_config;"
}
},
"version":"1.5.2"
},
"testing":{
"queries":{
"suid_bins":{
"interval":"3600",
"query":"select * from suid_bins;"
}
},
"shard":"10"
}
},
"file_paths":null,
"yara":null,
"prometheus_targets":null,
"decorators":null
}
`
conf := ImportConfig{
Packs: make(PackNameMap),
ExternalPacks: make(PackNameToPackDetails),
}
err := json.Unmarshal([]byte(contents), &conf)
assert.Nil(t, err)
require.NotNil(t, conf.Packs["testing"])
// platform is not defined in the testing pack, so, per osquery docs
// we default to 'all' platforms
details, ok := conf.Packs["testing"].(PackDetails)
require.True(t, ok)
assert.Equal(t, "", details.Platform)
}
func TestIntervalUnmarshal(t *testing.T) {
scenarios := []struct {
name string
testVal interface{}
errExpected bool
expectedResult OsQueryConfigInt
}{
{"string to uint", "100", false, 100},
{"float to uint", float64(123), false, 123},
{"nil to zero value int", nil, false, 0},
{"invalid string", "hi there", true, 0},
}
for _, scenario := range scenarios {
t.Run(fmt.Sprintf(": %s", scenario.name), func(tt *testing.T) {
v, e := unmarshalInteger(scenario.testVal)
if scenario.errExpected {
assert.NotNil(t, e)
} else {
require.Nil(t, e)
assert.Equal(t, scenario.expectedResult, v)
}
})
}
}
type importIntTest struct {
Val OsQueryConfigInt `json:"val"`
}
func TestConfigImportInt(t *testing.T) {
buff := bytes.NewBufferString(`{"val":"23"}`)
var ts importIntTest
err := json.NewDecoder(buff).Decode(&ts)
assert.Nil(t, err)
assert.Equal(t, 23, int(ts.Val))
buff = bytes.NewBufferString(`{"val":456}`)
err = json.NewDecoder(buff).Decode(&ts)
assert.Nil(t, err)
assert.Equal(t, 456, int(ts.Val))
buff = bytes.NewBufferString(`{"val":"hi 456"}`)
err = json.NewDecoder(buff).Decode(&ts)
assert.NotNil(t, err)
}
func TestPackNameMapUnmarshal(t *testing.T) {
s2p := func(s string) *string { return &s }
u2p := func(ui uint) *OsQueryConfigInt { ci := OsQueryConfigInt(ui); return &ci }
pnm := PackNameMap{
"path": "/this/is/a/path",
"details": PackDetails{
Queries: QueryNameToQueryDetailsMap{
"q1": QueryDetails{
Query: "select from foo",
Interval: 100,
Removed: new(bool),
Platform: s2p("linux"),
Shard: new(OsQueryConfigInt),
Snapshot: new(bool),
},
},
Discovery: []string{
"select from something",
},
},
}
b, _ := json.Marshal(pnm)
actual := make(PackNameMap)
err := json.Unmarshal(b, &actual)
require.Nil(t, err)
assert.Len(t, actual, 2)
pnm = PackNameMap{
"path": "/this/is/a/path",
"details": PackDetails{
Queries: QueryNameToQueryDetailsMap{
"q1": QueryDetails{
Query: "select from foo",
Interval: 100,
Removed: new(bool),
Platform: s2p("linux"),
Shard: new(OsQueryConfigInt),
Snapshot: new(bool),
},
},
Shard: u2p(10),
Version: s2p("1.0"),
Platform: "linux",
Discovery: []string{
"select from something",
},
},
"details2": PackDetails{
Queries: QueryNameToQueryDetailsMap{
"q1": QueryDetails{
Query: "select from bar",
Interval: 100,
Removed: new(bool),
Platform: s2p("linux"),
Shard: new(OsQueryConfigInt),
Snapshot: new(bool),
},
},
Shard: u2p(10),
Version: s2p("1.0"),
Platform: "linux",
},
}
b, _ = json.Marshal(pnm)
actual = make(PackNameMap)
err = json.Unmarshal(b, &actual)
require.Nil(t, err)
assert.Len(t, actual, 3)
}