fleet/orbit/pkg/update/flag_runner_test.go
Lucas Manuel Rodriguez fee0744a66
Perform early restart before starting sub-systems and minor refactor of orbit sub-systems (#20610)
#20397

Am calling these things that orbit run "sub-systems".

- [X] Changes file added for user-visible changes in `changes/`,
`orbit/changes/` or `ee/fleetd-chrome/changes`.
See [Changes
files](https://fleetdm.com/docs/contributing/committing-changes#changes-files)
for more information.
- [X] Manual QA for all new/changed functionality
- For Orbit and Fleet Desktop changes:
- [X] Orbit runs on macOS, Linux and Windows. Check if the orbit
feature/bugfix should only apply to one platform (`runtime.GOOS`).
- [X] Manual QA must be performed in the three main OSs, macOS, Windows
and Linux.
- [X] Auto-update manual QA, from released version of component to new
version (see [tools/tuf/test](../tools/tuf/test/README.md)).
2024-07-19 12:44:43 -03:00

121 lines
3 KiB
Go

package update
import (
"encoding/json"
"os"
"path/filepath"
"reflect"
"testing"
"github.com/fleetdm/fleet/v4/server/fleet"
"github.com/stretchr/testify/require"
)
var rawJSONFlags = json.RawMessage(`{"verbose":true, "num":5, "hello":"world", "largeNum":1234567890}`)
func TestGetFlagsFromJson(t *testing.T) {
flagsJson, err := getFlagsFromJSON(rawJSONFlags)
require.NoError(t, err)
require.NotEmpty(t, flagsJson)
value, ok := flagsJson["--verbose"]
if !ok {
t.Errorf(`key ""--verbose" expected but not found`)
}
if value != "true" {
t.Errorf(`expected "true", got %s`, value)
}
value, ok = flagsJson["--num"]
if !ok {
t.Errorf(`key "--num" expected but not found`)
}
if value != "5" {
t.Errorf(`expected "5", got %s`, value)
}
value, ok = flagsJson["--hello"]
if !ok {
t.Errorf(`key "--hello" expected but not found`)
}
if value != "world" {
t.Errorf(`expected "world", got %s`, value)
}
value, ok = flagsJson["--largeNum"]
if !ok {
t.Errorf(`key "--largeNum" expected but not found`)
}
if value != "1234567890" {
t.Errorf(`expected "1234567890", got %s`, value)
}
}
func TestWriteFlagFile(t *testing.T) {
flags, err := getFlagsFromJSON(rawJSONFlags)
require.NoError(t, err)
tempDir := t.TempDir()
err = writeFlagFile(tempDir, flags)
require.NoError(t, err)
diskFlags, err := readFlagFile(tempDir)
require.NoError(t, err)
require.NotEmpty(t, diskFlags)
if !reflect.DeepEqual(flags, diskFlags) {
t.Errorf("expected flags to be equal: %v, %v", flags, diskFlags)
}
}
func touchFile(t *testing.T, name string) {
t.Helper()
file, err := os.OpenFile(name, os.O_RDONLY|os.O_CREATE, 0o644)
require.NoError(t, err)
require.NoError(t, file.Close())
}
// TestDoFlagsUpdateWithEmptyFlags tests the scenario of Fleet flag `command_line_flags`
// being set to an empty JSON document `{}` and Orbit osquery.flags file being
// an empty file. Such scenario should trigger no update of flags.
func TestDoFlagsUpdateWithEmptyFlags(t *testing.T) {
rootDir := t.TempDir()
osqueryFlagsFile := filepath.Join(rootDir, "osquery.flags")
touchFile(t, osqueryFlagsFile)
testConfig := &fleet.OrbitConfig{
Flags: json.RawMessage("{}"),
}
var restartQueued bool
queueOrbitRestart := func(string) { restartQueued = true }
fr := NewFlagReceiver(queueOrbitRestart, FlagUpdateOptions{
RootDir: rootDir,
})
err := fr.Run(testConfig)
require.NoError(t, err)
require.False(t, restartQueued)
// Non-empty fleet flags and osquery.flags has empty flags.
testConfig = &fleet.OrbitConfig{
Flags: json.RawMessage(`{"--verbose": true}`),
}
err = fr.Run(testConfig)
require.NoError(t, err)
require.True(t, restartQueued)
// Empty Fleet flags and osquery.flags has non-empty flags.
restartQueued = false
testConfig = &fleet.OrbitConfig{
Flags: json.RawMessage("{}"),
}
err = os.WriteFile(osqueryFlagsFile, []byte("--verbose=true\n"), 0o644)
require.NoError(t, err)
err = fr.Run(testConfig)
require.NoError(t, err)
require.True(t, restartQueued)
}