Files
troubleshoot/pkg/collect/host_sysctl_test.go
João Antunes 77c9968ff6 feat(host_sysctl): add host sysctl collector (#1676)
* feat(host_sysctl): add host sysctl collector

* chore: add examples

* Update pkg/collect/host_sysctl.go

Co-authored-by: Evans Mungai <evans@replicated.com>

* chore: use sysctl package vs exec calls

* chore: make linter happy

* chore: make schemas

* chore: go back to sysctl exec

* chore: make linter happy

---------

Co-authored-by: Evans Mungai <evans@replicated.com>
2024-11-07 18:18:11 +00:00

174 lines
4.1 KiB
Go

package collect
import (
"encoding/json"
"os/exec"
"testing"
troubleshootv1beta2 "github.com/replicatedhq/troubleshoot/pkg/apis/troubleshoot/v1beta2"
"github.com/replicatedhq/troubleshoot/pkg/multitype"
"github.com/stretchr/testify/require"
)
type execStub struct {
cmd *exec.Cmd
name string
args []string
}
func (s *execStub) testExecCommand(name string, args ...string) *exec.Cmd {
s.name = name
s.args = args
return s.cmd
}
func setExecStub(c *exec.Cmd) {
e := &execStub{
cmd: c,
}
execCommand = e.testExecCommand
}
func TestCollectHostSysctl_Error(t *testing.T) {
req := require.New(t)
setExecStub(exec.Command("sh", "-c", "exit 1"))
tmpDir := t.TempDir()
c := &CollectHostSysctl{
BundlePath: tmpDir,
}
_, err := c.Collect(nil)
req.ErrorContains(err, "failed to run sysctl exit-code=1")
}
func TestCollectHostSysctl_(t *testing.T) {
tests := []struct {
name string
cmdOut string
expected map[string]string
}{
{
name: "linux",
cmdOut: `
net.ipv4.conf.all.arp_evict_nocarrier = 1
net.ipv4.conf.all.arp_filter = 0
net.ipv4.conf.all.arp_ignore = 0
`,
expected: map[string]string{
"net.ipv4.conf.all.arp_evict_nocarrier": "1",
"net.ipv4.conf.all.arp_filter": "0",
"net.ipv4.conf.all.arp_ignore": "0",
},
},
{
name: "darwin",
cmdOut: `
kern.prng.pool_31.max_sample_count: 16420665
kern.crypto.sha1: SHA1_VNG_ARM
kern.crypto.sha512: SHA512_VNG_ARM_HW
kern.crypto.aes.ecb.encrypt: AES_ECB_ARM
kern.monotonicclock: 4726514
kern.monotonicclock_usecs: 4726514658233 13321990885027
`,
expected: map[string]string{
"kern.prng.pool_31.max_sample_count": "16420665",
"kern.crypto.sha1": "SHA1_VNG_ARM",
"kern.crypto.sha512": "SHA512_VNG_ARM_HW",
"kern.crypto.aes.ecb.encrypt": "AES_ECB_ARM",
"kern.monotonicclock": "4726514",
"kern.monotonicclock_usecs": "4726514658233 13321990885027",
},
},
{
name: "skip non valid entries and keep empty values",
cmdOut: `
net.ipv4.conf.all.arp_ignore =
kern.prng.pool_31.max_sample_count:
not-valid
net.ipv4.conf.all.arp_filter = 0
`,
expected: map[string]string{
"net.ipv4.conf.all.arp_ignore": "",
"kern.prng.pool_31.max_sample_count": "",
"net.ipv4.conf.all.arp_filter": "0",
},
},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
req := require.New(t)
setExecStub(exec.Command("echo", "-n", test.cmdOut)) // #nosec G204
tmpDir := t.TempDir()
c := &CollectHostSysctl{
BundlePath: tmpDir,
}
out, err := c.Collect(nil)
req.NoError(err)
res := CollectorResult(out)
reader, err := res.GetReader(tmpDir, HostSysctlPath)
req.NoError(err)
parameters := map[string]string{}
err = json.NewDecoder(reader).Decode(&parameters)
req.NoError(err)
req.Equal(test.expected, parameters)
})
}
}
func TestCollectHostSysctl_Title(t *testing.T) {
req := require.New(t)
// Default title is set
c := &CollectHostSysctl{
hostCollector: &troubleshootv1beta2.HostSysctl{
HostCollectorMeta: troubleshootv1beta2.HostCollectorMeta{},
},
}
req.Equal("Sysctl", c.Title())
// Configured title is set
c = &CollectHostSysctl{
hostCollector: &troubleshootv1beta2.HostSysctl{
HostCollectorMeta: troubleshootv1beta2.HostCollectorMeta{
CollectorName: "foobar",
},
},
}
req.Equal("foobar", c.Title())
}
func TestCollectHostSysctl_IsExcluded(t *testing.T) {
req := require.New(t)
// Exclude is true
c := &CollectHostSysctl{
hostCollector: &troubleshootv1beta2.HostSysctl{
HostCollectorMeta: troubleshootv1beta2.HostCollectorMeta{
Exclude: multitype.FromBool(true),
},
},
}
isExcluded, err := c.IsExcluded()
req.NoError(err)
req.Equal(true, isExcluded)
// Exclude is false
c = &CollectHostSysctl{
hostCollector: &troubleshootv1beta2.HostSysctl{
HostCollectorMeta: troubleshootv1beta2.HostCollectorMeta{
Exclude: multitype.FromBool(false),
},
},
}
isExcluded, err = c.IsExcluded()
req.NoError(err)
req.Equal(false, isExcluded)
}