From dd84b9d64fb98746a230cd24233ff50a562c39c9 Mon Sep 17 00:00:00 2001 From: 简律纯 Date: Fri, 28 Apr 2023 01:36:44 +0800 Subject: --- cli/internal/filewatcher/cookie_test.go | 130 ++++++++++++++++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 cli/internal/filewatcher/cookie_test.go (limited to 'cli/internal/filewatcher/cookie_test.go') diff --git a/cli/internal/filewatcher/cookie_test.go b/cli/internal/filewatcher/cookie_test.go new file mode 100644 index 0000000..96241b4 --- /dev/null +++ b/cli/internal/filewatcher/cookie_test.go @@ -0,0 +1,130 @@ +package filewatcher + +import ( + "testing" + "time" + + "github.com/hashicorp/go-hclog" + "github.com/pkg/errors" + "github.com/vercel/turbo/cli/internal/fs" + "gotest.tools/v3/assert" +) + +func TestWaitForCookie(t *testing.T) { + logger := hclog.Default() + cookieDir := fs.AbsoluteSystemPathFromUpstream(t.TempDir()) + repoRoot := fs.AbsoluteSystemPathFromUpstream(t.TempDir()) + + jar, err := NewCookieJar(cookieDir, 5*time.Second) + assert.NilError(t, err, "NewCookieJar") + + watcher, err := GetPlatformSpecificBackend(logger) + assert.NilError(t, err, "NewWatcher") + fw := New(logger, repoRoot, watcher) + err = fw.Start() + assert.NilError(t, err, "Start") + fw.AddClient(jar) + err = fw.AddRoot(cookieDir) + assert.NilError(t, err, "Add") + + err = jar.WaitForCookie() + assert.NilError(t, err, "failed to roundtrip cookie") +} + +func TestWaitForCookieAfterClose(t *testing.T) { + logger := hclog.Default() + cookieDir := fs.AbsoluteSystemPathFromUpstream(t.TempDir()) + repoRoot := fs.AbsoluteSystemPathFromUpstream(t.TempDir()) + + jar, err := NewCookieJar(cookieDir, 5*time.Second) + assert.NilError(t, err, "NewCookieJar") + + watcher, err := GetPlatformSpecificBackend(logger) + assert.NilError(t, err, "NewWatcher") + fw := New(logger, repoRoot, watcher) + err = fw.Start() + assert.NilError(t, err, "Start") + fw.AddClient(jar) + err = fw.AddRoot(cookieDir) + assert.NilError(t, err, "Add") + + err = fw.Close() + assert.NilError(t, err, "Close") + err = jar.WaitForCookie() + assert.ErrorIs(t, err, ErrCookieWatchingClosed) +} + +func TestWaitForCookieTimeout(t *testing.T) { + logger := hclog.Default() + cookieDir := fs.AbsoluteSystemPathFromUpstream(t.TempDir()) + repoRoot := fs.AbsoluteSystemPathFromUpstream(t.TempDir()) + + jar, err := NewCookieJar(cookieDir, 10*time.Millisecond) + assert.NilError(t, err, "NewCookieJar") + + watcher, err := GetPlatformSpecificBackend(logger) + assert.NilError(t, err, "NewWatcher") + fw := New(logger, repoRoot, watcher) + err = fw.Start() + assert.NilError(t, err, "Start") + fw.AddClient(jar) + + // NOTE: don't call fw.Add here so that no file event gets delivered + + err = jar.WaitForCookie() + assert.ErrorIs(t, err, ErrCookieTimeout) +} + +func TestWaitForCookieWithError(t *testing.T) { + logger := hclog.Default() + cookieDir := fs.AbsoluteSystemPathFromUpstream(t.TempDir()) + repoRoot := fs.AbsoluteSystemPathFromUpstream(t.TempDir()) + + jar, err := NewCookieJar(cookieDir, 10*time.Second) + assert.NilError(t, err, "NewCookieJar") + + watcher, err := GetPlatformSpecificBackend(logger) + assert.NilError(t, err, "NewWatcher") + fw := New(logger, repoRoot, watcher) + err = fw.Start() + assert.NilError(t, err, "Start") + fw.AddClient(jar) + + // NOTE: don't call fw.Add here so that no file event gets delivered + myErr := errors.New("an error") + ch := make(chan error) + go func() { + if err := jar.WaitForCookie(); err != nil { + ch <- err + } + close(ch) + }() + // wait for the cookie to be registered in the jar + for { + found := false + jar.mu.Lock() + if len(jar.cookies) == 1 { + found = true + } + jar.mu.Unlock() + if found { + break + } + <-time.After(10 * time.Millisecond) + } + jar.OnFileWatchError(myErr) + + err, ok := <-ch + if !ok { + t.Error("expected to get an error from cookie watching") + } + assert.ErrorIs(t, err, myErr) + + // ensure waiting for a new cookie still works. + // Add the filewatch to allow cookies work normally + err = fw.AddRoot(cookieDir) + assert.NilError(t, err, "Add") + + err = jar.WaitForCookie() + assert.NilError(t, err, "WaitForCookie") +} -- cgit v1.2.3-70-g09d2