blob: 1fb499ab78ae0f279013855e5333747bfa3ce3e1 [file] [log] [blame]
// Copyright 2018 The Goma Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package fswatch
import (
"context"
"fmt"
"io/ioutil"
"os"
"path/filepath"
"reflect"
"testing"
"time"
"github.com/fsnotify/fsnotify"
)
func TestNext(t *testing.T) {
dir, err := ioutil.TempDir("", "fswatch.TestNext.")
if err != nil {
t.Fatal(err)
}
defer os.RemoveAll(dir)
ctx := context.Background()
fmt.Println("new")
w, err := New(ctx, dir)
if err != nil {
t.Fatalf("New(ctx, dir)=_, %v; want nil-err", err)
}
defer w.Close()
timeout := 100 * time.Millisecond
{
t.Logf("no event in %s", timeout)
ctx, cancel := context.WithTimeout(ctx, timeout)
defer cancel()
_, err := w.Next(ctx)
if err != context.DeadlineExceeded {
t.Fatalf("w.Next(ctx)=_, %v; want DeadlineExceeded", err)
}
}
fname := filepath.Join(dir, "foo")
{
t.Logf("add new file")
err = ioutil.WriteFile(fname, []byte("1"), 0644)
if err != nil {
t.Fatalf("WriteFile(%q)=%v; want=nil error", fname, err)
}
ctx, cancel := context.WithTimeout(ctx, timeout)
defer cancel()
ev, err := w.Next(ctx)
want := fsnotify.Event{Name: fname, Op: fsnotify.Create}
if err != nil || !reflect.DeepEqual(ev, want) {
t.Fatalf("w.Next(ctx)=%v, %v; want=%v, nil", ev, err, want)
}
ev, err = w.Next(ctx)
want = fsnotify.Event{Name: fname, Op: fsnotify.Write}
if err != nil || !reflect.DeepEqual(ev, want) {
t.Fatalf("w.Next(ctx)=%v, %v; want=%v, nil", ev, err, want)
}
_, err = w.Next(ctx)
if err != context.DeadlineExceeded {
t.Fatalf("w.Next(ctx)=_, %v; want DeadlineExceeded", err)
}
}
{
t.Logf("update file")
err = ioutil.WriteFile(fname, []byte("2"), 0644)
if err != nil {
t.Fatalf("WriteFile(%q)=%v; want=nil error", fname, err)
}
ctx, cancel := context.WithTimeout(ctx, timeout)
defer cancel()
ev, err := w.Next(ctx)
want := fsnotify.Event{Name: fname, Op: fsnotify.Write}
if err != nil || !reflect.DeepEqual(ev, want) {
t.Fatalf("w.Next(ctx)=%v, %v; want=%v, nil", ev, err, want)
}
for {
ev, err = w.Next(ctx)
if err == context.DeadlineExceeded {
break
}
// may receive several Write.
t.Logf("w.Next(ctx)=%v, %v", ev, err)
}
}
{
t.Logf("remove file")
err = os.Remove(fname)
if err != nil {
t.Fatalf("Remove(%q)=%v; want=nil error", fname, err)
}
ctx, cancel := context.WithTimeout(ctx, timeout)
defer cancel()
ev, err := w.Next(ctx)
want := fsnotify.Event{Name: fname, Op: fsnotify.Remove}
if err != nil || !reflect.DeepEqual(ev, want) {
t.Fatalf("w.Next(ctx)=%v, %v; want=%v, nil", ev, err, want)
}
_, err = w.Next(ctx)
if err != context.DeadlineExceeded {
t.Fatalf("w.Next(ctx)=_, %v; want DeadlineExceeded", err)
}
}
}