lib/model: Run more tests in tmp dir (#5527)

This commit is contained in:
Simon Frei
2019-02-12 16:04:04 +01:00
committed by Jakob Borg
parent 4299af1c63
commit 5fd2cab102
4 changed files with 187 additions and 177 deletions

View File

@@ -11,6 +11,7 @@ import (
"context"
"encoding/json"
"fmt"
"io"
"io/ioutil"
"math/rand"
"net"
@@ -123,12 +124,8 @@ func TestMain(m *testing.M) {
}
}
tmpName := fs.TempName("file")
if err := osutil.Copy(defaultFs, "tmpfile", tmpName); err != nil {
panic(err)
}
future := time.Now().Add(time.Hour)
if err := os.Chtimes(filepath.Join("testdata", tmpName), future, future); err != nil {
tmpName, err := prepareTmpFile(defaultFs)
if err != nil {
panic(err)
}
@@ -142,6 +139,28 @@ func TestMain(m *testing.M) {
os.Exit(exitCode)
}
func prepareTmpFile(to fs.Filesystem) (string, error) {
tmpName := fs.TempName("file")
in, err := defaultFs.Open("tmpfile")
if err != nil {
return "", err
}
defer in.Close()
out, err := to.Create(tmpName)
if err != nil {
return "", err
}
defer out.Close()
if _, err = io.Copy(out, in); err != nil {
return "", err
}
future := time.Now().Add(time.Hour)
if err := os.Chtimes(filepath.Join("testdata", tmpName), future, future); err != nil {
return "", err
}
return tmpName, nil
}
func createTmpWrapper(cfg config.Configuration) *config.Wrapper {
tmpFile, err := ioutil.TempFile(tmpLocation, "syncthing-testConfig-")
if err != nil {
@@ -2879,15 +2898,13 @@ func TestIssue2571(t *testing.T) {
t.Skip("Scanning symlinks isn't supported on windows")
}
err := defaultFs.MkdirAll("replaceDir", 0755)
if err != nil {
t.Fatal(err)
}
w, tmpDir := tmpDefaultWrapper()
defer func() {
defaultFs.RemoveAll("replaceDir")
os.RemoveAll(tmpDir)
os.Remove(w.ConfigPath())
}()
testFs := fs.NewFilesystem(fs.FilesystemTypeBasic, filepath.Join(defaultFs.URI(), "replaceDir"))
testFs := fs.NewFilesystem(fs.FilesystemTypeBasic, tmpDir)
for _, dir := range []string{"toLink", "linkTarget"} {
err := testFs.MkdirAll(dir, 0775)
@@ -2901,9 +2918,9 @@ func TestIssue2571(t *testing.T) {
fd.Close()
}
m := setupModel(defaultCfgWrapper)
m := setupModel(w)
if err = testFs.RemoveAll("toLink"); err != nil {
if err := testFs.RemoveAll("toLink"); err != nil {
t.Fatal(err)
}
@@ -2913,12 +2930,12 @@ func TestIssue2571(t *testing.T) {
m.ScanFolder("default")
if dir, ok := m.CurrentFolderFile("default", filepath.Join("replaceDir", "toLink")); !ok {
if dir, ok := m.CurrentFolderFile("default", "toLink"); !ok {
t.Fatalf("Dir missing in db")
} else if !dir.IsSymlink() {
t.Errorf("Dir wasn't changed to symlink")
}
if file, ok := m.CurrentFolderFile("default", filepath.Join("replaceDir", "toLink", "a")); !ok {
if file, ok := m.CurrentFolderFile("default", filepath.Join("toLink", "a")); !ok {
t.Fatalf("File missing in db")
} else if !file.Deleted {
t.Errorf("File below symlink has not been marked as deleted")
@@ -2931,25 +2948,30 @@ func TestIssue4573(t *testing.T) {
t.Skip("Can't make the dir inaccessible on windows")
}
err := defaultFs.MkdirAll("inaccessible", 0755)
w, tmpDir := tmpDefaultWrapper()
defer func() {
os.RemoveAll(tmpDir)
os.Remove(w.ConfigPath())
}()
testFs := fs.NewFilesystem(fs.FilesystemTypeBasic, tmpDir)
err := testFs.MkdirAll("inaccessible", 0755)
if err != nil {
t.Fatal(err)
}
defer func() {
defaultFs.Chmod("inaccessible", 0777)
defaultFs.RemoveAll("inaccessible")
}()
defer testFs.Chmod("inaccessible", 0777)
file := filepath.Join("inaccessible", "a")
fd, err := defaultFs.Create(file)
fd, err := testFs.Create(file)
if err != nil {
t.Fatal(err)
}
fd.Close()
m := setupModel(defaultCfgWrapper)
m := setupModel(w)
err = defaultFs.Chmod("inaccessible", 0000)
err = testFs.Chmod("inaccessible", 0000)
if err != nil {
t.Fatal(err)
}
@@ -2966,15 +2988,13 @@ func TestIssue4573(t *testing.T) {
// TestInternalScan checks whether various fs operations are correctly represented
// in the db after scanning.
func TestInternalScan(t *testing.T) {
err := defaultFs.MkdirAll("internalScan", 0755)
if err != nil {
t.Fatal(err)
}
w, tmpDir := tmpDefaultWrapper()
defer func() {
defaultFs.RemoveAll("internalScan")
os.RemoveAll(tmpDir)
os.Remove(w.ConfigPath())
}()
testFs := fs.NewFilesystem(fs.FilesystemTypeBasic, filepath.Join(defaultFs.URI(), "internalScan"))
testFs := fs.NewFilesystem(fs.FilesystemTypeBasic, tmpDir)
testCases := map[string]func(protocol.FileInfo) bool{
"removeDir": func(f protocol.FileInfo) bool {
@@ -3010,10 +3030,10 @@ func TestInternalScan(t *testing.T) {
}
}
m := setupModel(defaultCfgWrapper)
m := setupModel(w)
for _, dir := range baseDirs {
if err = testFs.RemoveAll(dir); err != nil {
if err := testFs.RemoveAll(dir); err != nil {
t.Fatal(err)
}
}
@@ -3027,7 +3047,7 @@ func TestInternalScan(t *testing.T) {
m.ScanFolder("default")
for path, cond := range testCases {
if f, ok := m.CurrentFolderFile("default", filepath.Join("internalScan", path)); !ok {
if f, ok := m.CurrentFolderFile("default", path); !ok {
t.Fatalf("%v missing in db", path)
} else if cond(f) {
t.Errorf("Incorrect db entry for %v", path)
@@ -3166,31 +3186,32 @@ func TestRemoveDirWithContent(t *testing.T) {
}
func TestIssue4475(t *testing.T) {
m, conn, tmpDir, w := setupModelWithConnection()
defer func() {
defaultFs.RemoveAll("delDir")
m.Stop()
os.RemoveAll(tmpDir)
os.Remove(w.ConfigPath())
}()
err := defaultFs.MkdirAll("delDir", 0755)
if err != nil {
t.Fatal(err)
}
m := setupModel(defaultCfgWrapper)
defer m.Stop()
testFs := fs.NewFilesystem(fs.FilesystemTypeBasic, tmpDir)
// Scenario: Dir is deleted locally and before syncing/index exchange
// happens, a file is create in that dir on the remote.
// This should result in the directory being recreated and added to the
// db locally.
if err = defaultFs.RemoveAll("delDir"); err != nil {
err := testFs.MkdirAll("delDir", 0755)
if err != nil {
t.Fatal(err)
}
m.ScanFolder("default")
conn := addFakeConn(m, device1)
conn.folder = "default"
if err = testFs.RemoveAll("delDir"); err != nil {
t.Fatal(err)
}
m.ScanFolder("default")
if fcfg, ok := m.cfg.Folder("default"); !ok || !fcfg.SharedWith(device1) {
t.Fatal("not shared with device1")