Fix folder check tests

This commit is contained in:
Jakob Borg 2015-04-25 15:27:45 +09:00
parent aece6e8b6c
commit 33a4fb5a1a
3 changed files with 41 additions and 18 deletions

View File

@ -20,6 +20,10 @@ import (
) )
func TestFolderErrors(t *testing.T) { func TestFolderErrors(t *testing.T) {
// This test intentionally avoids starting the folders. If they are
// started, they will perform an initial scan, which will create missing
// folder markers and race with the stuff we do in the test.
fcfg := config.FolderConfiguration{ fcfg := config.FolderConfiguration{
ID: "folder", ID: "folder",
RawPath: "testdata/testfolder", RawPath: "testdata/testfolder",
@ -29,10 +33,8 @@ func TestFolderErrors(t *testing.T) {
}) })
for _, file := range []string{".stfolder", "testfolder/.stfolder", "testfolder"} { for _, file := range []string{".stfolder", "testfolder/.stfolder", "testfolder"} {
os.Remove("testdata/" + file) if err := os.Remove("testdata/" + file); err != nil && !os.IsNotExist(err) {
_, err := os.Stat("testdata/" + file) t.Fatal(err)
if err == nil {
t.Error("Found unexpected file")
} }
} }
@ -42,7 +44,6 @@ func TestFolderErrors(t *testing.T) {
m := model.NewModel(cfg, protocol.LocalDeviceID, "device", "syncthing", "dev", ldb) m := model.NewModel(cfg, protocol.LocalDeviceID, "device", "syncthing", "dev", ldb)
m.AddFolder(fcfg) m.AddFolder(fcfg)
m.StartFolderRW("folder")
if err := m.CheckFolderHealth("folder"); err != nil { if err := m.CheckFolderHealth("folder"); err != nil {
t.Error("Unexpected error", cfg.Folders()["folder"].Invalid) t.Error("Unexpected error", cfg.Folders()["folder"].Invalid)
@ -58,8 +59,12 @@ func TestFolderErrors(t *testing.T) {
t.Error(err) t.Error(err)
} }
os.Remove("testdata/testfolder/.stfolder") if err := os.Remove("testdata/testfolder/.stfolder"); err != nil {
os.Remove("testdata/testfolder/") t.Fatal(err)
}
if err := os.Remove("testdata/testfolder/"); err != nil {
t.Fatal(err)
}
// Case 2 - new folder, marker created // Case 2 - new folder, marker created
@ -70,7 +75,6 @@ func TestFolderErrors(t *testing.T) {
m = model.NewModel(cfg, protocol.LocalDeviceID, "device", "syncthing", "dev", ldb) m = model.NewModel(cfg, protocol.LocalDeviceID, "device", "syncthing", "dev", ldb)
m.AddFolder(fcfg) m.AddFolder(fcfg)
m.StartFolderRW("folder")
if err := m.CheckFolderHealth("folder"); err != nil { if err := m.CheckFolderHealth("folder"); err != nil {
t.Error("Unexpected error", cfg.Folders()["folder"].Invalid) t.Error("Unexpected error", cfg.Folders()["folder"].Invalid)
@ -81,7 +85,9 @@ func TestFolderErrors(t *testing.T) {
t.Error(err) t.Error(err)
} }
os.Remove("testdata/.stfolder") if err := os.Remove("testdata/.stfolder"); err != nil {
t.Fatal(err)
}
// Case 3 - Folder marker missing // Case 3 - Folder marker missing
@ -92,7 +98,6 @@ func TestFolderErrors(t *testing.T) {
m = model.NewModel(cfg, protocol.LocalDeviceID, "device", "syncthing", "dev", ldb) m = model.NewModel(cfg, protocol.LocalDeviceID, "device", "syncthing", "dev", ldb)
m.AddFolder(fcfg) m.AddFolder(fcfg)
m.StartFolderRW("folder")
if err := m.CheckFolderHealth("folder"); err == nil || err.Error() != "folder marker missing" { if err := m.CheckFolderHealth("folder"); err == nil || err.Error() != "folder marker missing" {
t.Error("Incorrect error: Folder marker missing !=", m.CheckFolderHealth("folder")) t.Error("Incorrect error: Folder marker missing !=", m.CheckFolderHealth("folder"))
@ -110,8 +115,12 @@ func TestFolderErrors(t *testing.T) {
// Case 4 - Folder path missing // Case 4 - Folder path missing
os.Remove("testdata/testfolder/.stfolder") if err := os.Remove("testdata/testfolder/.stfolder"); err != nil && !os.IsNotExist(err) {
os.Remove("testdata/testfolder/") t.Fatal(err)
}
if err := os.Remove("testdata/testfolder"); err != nil && !os.IsNotExist(err) {
t.Fatal(err)
}
fcfg.RawPath = "testdata/testfolder" fcfg.RawPath = "testdata/testfolder"
cfg = config.Wrap("testdata/subfolder", config.Configuration{ cfg = config.Wrap("testdata/subfolder", config.Configuration{
@ -120,7 +129,6 @@ func TestFolderErrors(t *testing.T) {
m = model.NewModel(cfg, protocol.LocalDeviceID, "device", "syncthing", "dev", ldb) m = model.NewModel(cfg, protocol.LocalDeviceID, "device", "syncthing", "dev", ldb)
m.AddFolder(fcfg) m.AddFolder(fcfg)
m.StartFolderRW("folder")
if err := m.CheckFolderHealth("folder"); err == nil || err.Error() != "folder path missing" { if err := m.CheckFolderHealth("folder"); err == nil || err.Error() != "folder path missing" {
t.Error("Incorrect error: Folder path missing !=", m.CheckFolderHealth("folder")) t.Error("Incorrect error: Folder path missing !=", m.CheckFolderHealth("folder"))
@ -128,7 +136,9 @@ func TestFolderErrors(t *testing.T) {
// Case 4.1 - recover after folder path missing // Case 4.1 - recover after folder path missing
os.Mkdir("testdata/testfolder", 0700) if err := os.Mkdir("testdata/testfolder", 0700); err != nil {
t.Fatal(err)
}
if err := m.CheckFolderHealth("folder"); err == nil || err.Error() != "folder marker missing" { if err := m.CheckFolderHealth("folder"); err == nil || err.Error() != "folder marker missing" {
t.Error("Incorrect error: Folder marker missing !=", m.CheckFolderHealth("folder")) t.Error("Incorrect error: Folder marker missing !=", m.CheckFolderHealth("folder"))

View File

@ -1565,9 +1565,13 @@ func (m *Model) CheckFolderHealth(id string) error {
} }
m.fmut.RLock() m.fmut.RLock()
runner := m.folderRunners[folder.ID] runner, runnerExists := m.folderRunners[folder.ID]
m.fmut.RUnlock() m.fmut.RUnlock()
_, _, oldErr := runner.getState()
var oldErr error
if runnerExists {
_, _, oldErr = runner.getState()
}
if err != nil { if err != nil {
if oldErr != nil && oldErr.Error() != err.Error() { if oldErr != nil && oldErr.Error() != err.Error() {
@ -1575,11 +1579,15 @@ func (m *Model) CheckFolderHealth(id string) error {
} else if oldErr == nil { } else if oldErr == nil {
l.Warnf("Stopping folder %q - %v", folder.ID, err) l.Warnf("Stopping folder %q - %v", folder.ID, err)
} }
if runnerExists {
runner.setError(err) runner.setError(err)
}
} else if oldErr != nil { } else if oldErr != nil {
l.Infof("Folder %q error is cleared, restarting", folder.ID) l.Infof("Folder %q error is cleared, restarting", folder.ID)
if runnerExists {
runner.setState(FolderIdle) runner.setState(FolderIdle)
} }
}
return err return err
} }

View File

@ -121,6 +121,11 @@ func (p *rwFolder) Serve() {
var prevIgnoreHash string var prevIgnoreHash string
rescheduleScan := func() { rescheduleScan := func() {
if p.scanIntv == 0 {
// We should not run scans, so it should not be rescheduled.
return
}
// Sleep a random time between 3/4 and 5/4 of the configured interval. // Sleep a random time between 3/4 and 5/4 of the configured interval.
sleepNanos := (p.scanIntv.Nanoseconds()*3 + rand.Int63n(2*p.scanIntv.Nanoseconds())) / 4 sleepNanos := (p.scanIntv.Nanoseconds()*3 + rand.Int63n(2*p.scanIntv.Nanoseconds())) / 4
intv := time.Duration(sleepNanos) * time.Nanosecond intv := time.Duration(sleepNanos) * time.Nanosecond