mirror of
https://github.com/octoleo/syncthing.git
synced 2024-11-09 14:50:56 +00:00
Fix folder check tests
This commit is contained in:
parent
aece6e8b6c
commit
33a4fb5a1a
@ -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"))
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user