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") } }