From e374b0a9270b3d6b8b55fb69c30600acb19ab4b2 Mon Sep 17 00:00:00 2001 From: Marcin Owsiany Date: Fri, 25 Nov 2016 13:20:43 +0100 Subject: [PATCH] Fix a data race in TestFileWatcher (#24). Use a channel to report events to the test, rather than a variable without synchronization. --- core/pkg/watch/file_watcher_test.go | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/core/pkg/watch/file_watcher_test.go b/core/pkg/watch/file_watcher_test.go index 31833f74f..57b5c2c1c 100644 --- a/core/pkg/watch/file_watcher_test.go +++ b/core/pkg/watch/file_watcher_test.go @@ -18,28 +18,50 @@ package watch import ( "io/ioutil" + "os" "testing" + "time" ) +func prepareTimeout() chan bool { + timeoutChan := make(chan bool, 1) + go func() { + time.Sleep(1 * time.Second) + timeoutChan <- true + }() + return timeoutChan +} + func TestFileWatcher(t *testing.T) { file, err := ioutil.TempFile("", "fw") if err != nil { t.Fatalf("unexpected error: %v", err) } defer file.Close() + defer os.Remove(file.Name()) count := 0 + events := make(chan bool, 10) fw, err := NewFileWatcher(file.Name(), func() { count++ if count != 1 { t.Fatalf("expected 1 but returned %v", count) } + events <- true }) if err != nil { t.Fatalf("unexpected error: %v", err) } defer fw.Close() - if count != 0 { - t.Fatalf("expected 0 but returned %v", count) + timeoutChan := prepareTimeout() + select { + case <-events: + t.Fatalf("expected no events before writing a file") + case <-timeoutChan: } ioutil.WriteFile(file.Name(), []byte{}, 0644) + select { + case <-events: + case <-timeoutChan: + t.Fatalf("expected an event shortly after writing a file") + } }