diff --git a/main_test.go b/main_test.go index 5c32646..9fa3df6 100644 --- a/main_test.go +++ b/main_test.go @@ -20,7 +20,6 @@ func TestMain(m *testing.M) { defer os.Remove(TheTestFilename) TheSettings = NewSettings(TheTestFilename, false) - return m.Run() }() os.Exit(exitCode) diff --git a/settings_test.go b/settings_test.go index a60de4b..fcc0bfd 100644 --- a/settings_test.go +++ b/settings_test.go @@ -121,6 +121,7 @@ func TestSettings(t *testing.T) { if updated := settings.SetFilename("fakefilename.txt"); !updated { t.Fatalf("failed to update filename to fake filename...\n") } + defer settings.SetFilename(TheTestFilename) log.SetOutput(defaultLogWriter) WarnIfFileNotFound = false if !strings.Contains(buffer.String(), "no such file or directory") { diff --git a/valuemonitor_test.go b/valuemonitor_test.go new file mode 100644 index 0000000..33dc428 --- /dev/null +++ b/valuemonitor_test.go @@ -0,0 +1,92 @@ +package settings + +import ( + "context" + "fmt" + "os" + "testing" + "time" +) + +func TestStringValueMonitor(t *testing.T) { + key, value := "my key to monitor", "first value" + monitor, err := NewValueMonitor(TheSettings, key, func(s string) (string, error) { return value, nil }) + if err != nil { + t.Fatalf("error opening new value monitor: %v\n", err) + } + if want, got := value, monitor.GetValue(); want != got { + t.Fatalf("error: wanted %q; got %q\n", want, got) + } + value = "second value" + TheSettings.SetKeyValue(key, value) +loop: + for range 5 { + select { + case <-t.Context().Done(): + t.Fatalf("error: %v\n", t.Context().Err()) + case <-time.After(time.Millisecond * 50): + if want, got := value, monitor.GetValue(); want == got { + break loop + } + } + } + if want, got := value, monitor.GetValue(); want != got { + t.Fatalf("error: wanted %q; got %q\n", want, got) + } + value = "third value" + f, err := os.OpenFile(TheSettings.GetFilename(), os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0664) + if err != nil { + t.Fatalf("error opening file writer to append settings: %v\n", err) + } + _, err = fmt.Fprintf(f, "\n%s=%s\n", key, value) + if err != nil { + t.Fatalf("error appending to file: %v\n", err) + } + err = f.Close() + if err != nil { + t.Fatalf("error closing %s: %v\n", TheSettings.GetFilename(), err) + } + err = TheSettings.Update() + if err != nil { + t.Fatalf("error updating the settings: %v\n", err) + } + for range 5 { + select { + case <-t.Context().Done(): + t.Fatalf("error: %v\n", t.Context().Err()) + case <-time.After(time.Millisecond * 50): + if want, got := value, monitor.GetValue(); want != got { + t.Fatalf("error: wanted %q; got %q\n", want, got) + } + } + } + if want, got := value, monitor.GetValue(); want != got { + t.Fatalf("error: wanted %q; got %q\n", want, got) + } +} + +func TestInsertOrTimeout(t *testing.T) { + ctx, cancel := context.WithCancel(t.Context()) + defer cancel() + channel := make(chan string, 1) + defer close(channel) + err := insertOrTimeout(ctx, channel, "first string") + if err != nil { + t.Fatalf("error: %v\n", err) + } + select { + case <-ctx.Done(): + t.Fatalf("error: %v\n", ctx.Err()) + case _, ok := <-channel: + if !ok { + t.Fatalf("error: channel closed earlier than expected...\n") + } + } + cancel() + <-ctx.Done() + err = insertOrTimeout(ctx, channel, "second string") + if err == nil { + t.Fatalf("error: inserted after ctx.Done\n") + } + +} diff --git a/valuemonitortest.go b/valuemonitortest.go deleted file mode 100644 index 643c06d..0000000 --- a/valuemonitortest.go +++ /dev/null @@ -1,39 +0,0 @@ -package settings - -import ( - "fmt" - "os" - "testing" -) - -func TestStringValueMonitor(t *testing.T) { - key, value := "my key to monitor", "first value" - monitor, err := NewValueMonitor(TheSettings, key, func(s string) (string, error) { return value, nil }) - if err != nil { - t.Fatalf("error opening new value monitor: %v\n", err) - } - if want, got := value, monitor.GetValue(); want != got { - t.Fatalf("error: wanted %q; got %q\n", want, got) - } - value = "second value" - TheSettings.SetKeyValue(key, value) - if want, got := value, monitor.GetValue(); want != got { - t.Fatalf("error: wanted %q; got %q\n", want, got) - } - value = "third value" - f, err := os.OpenFile(TheSettings.GetFilename(), os.O_APPEND|os.O_WRONLY, 0664) - if err != nil { - t.Fatalf("error opening file writer to append settings: %v\n", err) - } - _, err = f.WriteString(fmt.Sprintf("\n%s=%s\n", key, value)) - if err != nil { - t.Fatalf("error appending to file: %v\n", err) - } - err = TheSettings.Update() - if err != nil { - t.Fatalf("error updating the settings: %v\n", err) - } - if want, got := value, monitor.GetValue(); want != got { - t.Fatalf("error: wanted %q; got %q\n", want, got) - } -}