Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

lib/model: Fix test flakyness regression (ref #5592) #5718

Merged
merged 1 commit into from May 18, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
36 changes: 3 additions & 33 deletions lib/model/model_test.go
Expand Up @@ -1501,13 +1501,16 @@ func TestIgnores(t *testing.T) {
m.db.Close()
}()

m.RemoveFolder(defaultFolderConfig)
m.AddFolder(defaultFolderConfig)
// Reach in and update the ignore matcher to one that always does
// reloads when asked to, instead of checking file mtimes. This is
// because we will be changing the files on disk often enough that the
// mtimes will be unreliable to determine change status.
m.fmut.Lock()
m.folderIgnores["default"] = ignore.New(defaultFs, ignore.WithCache(true), ignore.WithChangeDetector(newAlwaysChanged()))
m.fmut.Unlock()
m.StartFolder("default")

// Make sure the initial scan has finished (ScanFolders is blocking)
m.ScanFolders()
Expand Down Expand Up @@ -3318,39 +3321,6 @@ func TestFolderRestartZombies(t *testing.T) {
}
}

type alwaysChangedKey struct {
fs fs.Filesystem
name string
}

// alwaysChanges is an ignore.ChangeDetector that always returns true on Changed()
type alwaysChanged struct {
seen map[alwaysChangedKey]struct{}
}

func newAlwaysChanged() *alwaysChanged {
return &alwaysChanged{
seen: make(map[alwaysChangedKey]struct{}),
}
}

func (c *alwaysChanged) Remember(fs fs.Filesystem, name string, _ time.Time) {
c.seen[alwaysChangedKey{fs, name}] = struct{}{}
}

func (c *alwaysChanged) Reset() {
c.seen = make(map[alwaysChangedKey]struct{})
}

func (c *alwaysChanged) Seen(fs fs.Filesystem, name string) bool {
_, ok := c.seen[alwaysChangedKey{fs, name}]
return ok
}

func (c *alwaysChanged) Changed() bool {
return true
}

func TestRequestLimit(t *testing.T) {
wrapper := createTmpWrapper(defaultCfg.Copy())
defer os.Remove(wrapper.ConfigPath())
Expand Down
17 changes: 11 additions & 6 deletions lib/model/requests_test.go
Expand Up @@ -306,28 +306,32 @@ func TestPullInvalidIgnoredSR(t *testing.T) {

// This test checks that (un-)ignored/invalid/deleted files are treated as expected.
func pullInvalidIgnored(t *testing.T, ft config.FolderType) {
t.Helper()

w := createTmpWrapper(defaultCfgWrapper.RawCopy())
fcfg := testFolderConfigTmp()
fss := fcfg.Filesystem()
fcfg.Type = ft
w.SetFolder(fcfg)
m, fc := setupModelWithConnectionFromWrapper(w)
m := setupModel(w)
defer func() {
m.Stop()
m.db.Close()
os.RemoveAll(fss.URI())
os.Remove(w.ConfigPath())
}()

m.RemoveFolder(fcfg)
m.AddFolder(fcfg)
// Reach in and update the ignore matcher to one that always does
// reloads when asked to, instead of checking file mtimes. This is
// because we might be changing the files on disk often enough that the
// mtimes will be unreliable to determine change status.
m.fmut.Lock()
m.folderIgnores["default"] = ignore.New(fss, ignore.WithChangeDetector(newAlwaysChanged()))
m.fmut.Unlock()
m.StartFolder(fcfg.ID)

fc := addFakeConn(m, device1)
fc.folder = "default"

if err := m.SetIgnores("default", []string{"*ignored*"}); err != nil {
panic(err)
Expand Down Expand Up @@ -366,7 +370,7 @@ func pullInvalidIgnored(t *testing.T, ft config.FolderType) {
for name := range expected {
t.Errorf("File %v wasn't added to index", name)
}
done <- struct{}{}
close(done)
}
fc.mut.Unlock()

Expand All @@ -377,12 +381,13 @@ func pullInvalidIgnored(t *testing.T, ft config.FolderType) {

select {
case ev := <-sub.C():
t.Fatalf("Errors while pulling: %v", ev)
t.Fatalf("Errors while scanning/pulling: %v", ev)
case <-time.After(5 * time.Second):
t.Fatalf("timed out before index was received")
case <-done:
}

done = make(chan struct{})
fc.mut.Lock()
fc.indexFn = func(folder string, fs []protocol.FileInfo) {
expected := map[string]struct{}{ign: {}, ignExisting: {}}
Expand Down Expand Up @@ -411,7 +416,7 @@ func pullInvalidIgnored(t *testing.T, ft config.FolderType) {
for name := range expected {
t.Errorf("File %v wasn't updated in index", name)
}
done <- struct{}{}
close(done)
}
// Make sure pulling doesn't interfere, as index updates are racy and
// thus we cannot distinguish between scan and pull results.
Expand Down
34 changes: 34 additions & 0 deletions lib/model/testutils_test.go
Expand Up @@ -8,6 +8,7 @@ package model

import (
"io/ioutil"
"time"

"github.com/syncthing/syncthing/lib/config"
"github.com/syncthing/syncthing/lib/db"
Expand Down Expand Up @@ -121,3 +122,36 @@ func createTmpDir() string {
}
return tmpDir
}

type alwaysChangedKey struct {
fs fs.Filesystem
name string
}

// alwaysChanges is an ignore.ChangeDetector that always returns true on Changed()
type alwaysChanged struct {
seen map[alwaysChangedKey]struct{}
}

func newAlwaysChanged() *alwaysChanged {
return &alwaysChanged{
seen: make(map[alwaysChangedKey]struct{}),
}
}

func (c *alwaysChanged) Remember(fs fs.Filesystem, name string, _ time.Time) {
c.seen[alwaysChangedKey{fs, name}] = struct{}{}
}

func (c *alwaysChanged) Reset() {
c.seen = make(map[alwaysChangedKey]struct{})
}

func (c *alwaysChanged) Seen(fs fs.Filesystem, name string) bool {
_, ok := c.seen[alwaysChangedKey{fs, name}]
return ok
}

func (c *alwaysChanged) Changed() bool {
return true
}