You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
75 lines
2.2 KiB
75 lines
2.2 KiB
package systemtime
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
type settingsNTPFake struct {
|
|
fakeNTPApplier
|
|
fail error
|
|
}
|
|
|
|
func (a *settingsNTPFake) ConfigureNTP(context.Context, bool, []string) error { return a.fail }
|
|
|
|
func TestConfigureTimeDoesNotRewriteClockAndRollsBackOnFailure(t *testing.T) {
|
|
applier := &fakeApplier{}
|
|
ntp := &settingsNTPFake{}
|
|
controller := NewTransactionalController(applier, ntp)
|
|
settings := Settings{Timezone: "Asia/Seoul", NTPEnabled: true, Servers: []string{"time.example"}}
|
|
if err := controller.Configure(context.Background(), settings); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if !applier.appliedTime.IsZero() || applier.timezone != "Asia/Seoul" {
|
|
t.Fatal("unexpected clock mutation")
|
|
}
|
|
ntp.fail = errors.New("daemon failed")
|
|
if err := controller.Configure(context.Background(), settings); err == nil || !applier.rollbackCalled {
|
|
t.Fatal("failure not rolled back")
|
|
}
|
|
}
|
|
|
|
type settingsRunner struct {
|
|
running bool
|
|
calls []string
|
|
}
|
|
|
|
func (r *settingsRunner) Run(_ context.Context, _ string, args ...string) error {
|
|
r.calls = append(r.calls, strings.Join(args, " "))
|
|
r.running = args[0] == "start"
|
|
return nil
|
|
}
|
|
|
|
func TestConfigureNTPWorksOfflineAndDisabledIsIdempotent(t *testing.T) {
|
|
root := t.TempDir()
|
|
a, err := NewOSNTPApplier(filepath.Join(root, "ntp.conf"), filepath.Join(root, "S49ntp"), filepath.Join(root, "ntpd"))
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
runner := &settingsRunner{}
|
|
a.runner = runner
|
|
a.running = func() (bool, error) { return runner.running, nil }
|
|
if err := a.ConfigureNTP(context.Background(), true, []string{"internal.example"}); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
content, _ := os.ReadFile(a.configPath)
|
|
if !strings.Contains(string(content), "server internal.example iburst") || !runner.running {
|
|
t.Fatal("configuration not applied")
|
|
}
|
|
if len(runner.calls) != 1 || runner.calls[0] != "start" {
|
|
t.Fatal("unexpected one-shot sync", runner.calls)
|
|
}
|
|
if err := a.ConfigureNTP(context.Background(), false, nil); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := a.ConfigureNTP(context.Background(), false, nil); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if runner.running || len(runner.calls) != 2 {
|
|
t.Fatal("disable not idempotent")
|
|
}
|
|
}
|
|
|