main_test.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. // Copyright (C) 2014 The Syncthing Authors.
  2. //
  3. // This Source Code Form is subject to the terms of the Mozilla Public
  4. // License, v. 2.0. If a copy of the MPL was not distributed with this file,
  5. // You can obtain one at http://mozilla.org/MPL/2.0/.
  6. package main
  7. import (
  8. "os"
  9. "testing"
  10. "github.com/syncthing/syncthing/lib/config"
  11. "github.com/syncthing/syncthing/lib/db"
  12. "github.com/syncthing/syncthing/lib/model"
  13. "github.com/syncthing/syncthing/lib/protocol"
  14. "github.com/syndtr/goleveldb/leveldb"
  15. "github.com/syndtr/goleveldb/leveldb/storage"
  16. )
  17. func TestFolderErrors(t *testing.T) {
  18. // This test intentionally avoids starting the folders. If they are
  19. // started, they will perform an initial scan, which will create missing
  20. // folder markers and race with the stuff we do in the test.
  21. fcfg := config.FolderConfiguration{
  22. ID: "folder",
  23. RawPath: "testdata/testfolder",
  24. }
  25. cfg := config.Wrap("/tmp/test", config.Configuration{
  26. Folders: []config.FolderConfiguration{fcfg},
  27. })
  28. for _, file := range []string{".stfolder", "testfolder/.stfolder", "testfolder"} {
  29. if err := os.Remove("testdata/" + file); err != nil && !os.IsNotExist(err) {
  30. t.Fatal(err)
  31. }
  32. }
  33. ldb, _ := leveldb.Open(storage.NewMemStorage(), nil)
  34. // Case 1 - new folder, directory and marker created
  35. m := model.NewModel(cfg, protocol.LocalDeviceID, "device", "syncthing", "dev", ldb)
  36. m.AddFolder(fcfg)
  37. if err := m.CheckFolderHealth("folder"); err != nil {
  38. t.Error("Unexpected error", cfg.Folders()["folder"].Invalid)
  39. }
  40. s, err := os.Stat("testdata/testfolder")
  41. if err != nil || !s.IsDir() {
  42. t.Error(err)
  43. }
  44. _, err = os.Stat("testdata/testfolder/.stfolder")
  45. if err != nil {
  46. t.Error(err)
  47. }
  48. if err := os.Remove("testdata/testfolder/.stfolder"); err != nil {
  49. t.Fatal(err)
  50. }
  51. if err := os.Remove("testdata/testfolder/"); err != nil {
  52. t.Fatal(err)
  53. }
  54. // Case 2 - new folder, marker created
  55. fcfg.RawPath = "testdata/"
  56. cfg = config.Wrap("/tmp/test", config.Configuration{
  57. Folders: []config.FolderConfiguration{fcfg},
  58. })
  59. m = model.NewModel(cfg, protocol.LocalDeviceID, "device", "syncthing", "dev", ldb)
  60. m.AddFolder(fcfg)
  61. if err := m.CheckFolderHealth("folder"); err != nil {
  62. t.Error("Unexpected error", cfg.Folders()["folder"].Invalid)
  63. }
  64. _, err = os.Stat("testdata/.stfolder")
  65. if err != nil {
  66. t.Error(err)
  67. }
  68. if err := os.Remove("testdata/.stfolder"); err != nil {
  69. t.Fatal(err)
  70. }
  71. // Case 3 - Folder marker missing
  72. set := db.NewFileSet("folder", ldb)
  73. set.Update(protocol.LocalDeviceID, []protocol.FileInfo{
  74. {Name: "dummyfile"},
  75. })
  76. m = model.NewModel(cfg, protocol.LocalDeviceID, "device", "syncthing", "dev", ldb)
  77. m.AddFolder(fcfg)
  78. if err := m.CheckFolderHealth("folder"); err == nil || err.Error() != "folder marker missing" {
  79. t.Error("Incorrect error: Folder marker missing !=", m.CheckFolderHealth("folder"))
  80. }
  81. // Case 3.1 - recover after folder marker missing
  82. if err = fcfg.CreateMarker(); err != nil {
  83. t.Error(err)
  84. }
  85. if err := m.CheckFolderHealth("folder"); err != nil {
  86. t.Error("Unexpected error", cfg.Folders()["folder"].Invalid)
  87. }
  88. // Case 4 - Folder path missing
  89. if err := os.Remove("testdata/testfolder/.stfolder"); err != nil && !os.IsNotExist(err) {
  90. t.Fatal(err)
  91. }
  92. if err := os.Remove("testdata/testfolder"); err != nil && !os.IsNotExist(err) {
  93. t.Fatal(err)
  94. }
  95. fcfg.RawPath = "testdata/testfolder"
  96. cfg = config.Wrap("testdata/subfolder", config.Configuration{
  97. Folders: []config.FolderConfiguration{fcfg},
  98. })
  99. m = model.NewModel(cfg, protocol.LocalDeviceID, "device", "syncthing", "dev", ldb)
  100. m.AddFolder(fcfg)
  101. if err := m.CheckFolderHealth("folder"); err == nil || err.Error() != "folder path missing" {
  102. t.Error("Incorrect error: Folder path missing !=", m.CheckFolderHealth("folder"))
  103. }
  104. // Case 4.1 - recover after folder path missing
  105. if err := os.Mkdir("testdata/testfolder", 0700); err != nil {
  106. t.Fatal(err)
  107. }
  108. if err := m.CheckFolderHealth("folder"); err == nil || err.Error() != "folder marker missing" {
  109. t.Error("Incorrect error: Folder marker missing !=", m.CheckFolderHealth("folder"))
  110. }
  111. // Case 4.2 - recover after missing marker
  112. if err = fcfg.CreateMarker(); err != nil {
  113. t.Error(err)
  114. }
  115. if err := m.CheckFolderHealth("folder"); err != nil {
  116. t.Error("Unexpected error", cfg.Folders()["folder"].Invalid)
  117. }
  118. }
  119. func TestShortIDCheck(t *testing.T) {
  120. cfg := config.Wrap("/tmp/test", config.Configuration{
  121. Devices: []config.DeviceConfiguration{
  122. {DeviceID: protocol.DeviceID{8, 16, 24, 32, 40, 48, 56, 0, 0}},
  123. {DeviceID: protocol.DeviceID{8, 16, 24, 32, 40, 48, 56, 1, 1}}, // first 56 bits same, differ in the first 64 bits
  124. },
  125. })
  126. if err := checkShortIDs(cfg); err != nil {
  127. t.Error("Unexpected error:", err)
  128. }
  129. cfg = config.Wrap("/tmp/test", config.Configuration{
  130. Devices: []config.DeviceConfiguration{
  131. {DeviceID: protocol.DeviceID{8, 16, 24, 32, 40, 48, 56, 64, 0}},
  132. {DeviceID: protocol.DeviceID{8, 16, 24, 32, 40, 48, 56, 64, 1}}, // first 64 bits same
  133. },
  134. })
  135. if err := checkShortIDs(cfg); err == nil {
  136. t.Error("Should have gotten an error")
  137. }
  138. }