reset_test.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  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 https://mozilla.org/MPL/2.0/.
  6. //go:build integration
  7. // +build integration
  8. package integration
  9. import (
  10. "bytes"
  11. "fmt"
  12. "io"
  13. "io/ioutil"
  14. "log"
  15. "os"
  16. "path/filepath"
  17. "testing"
  18. "time"
  19. )
  20. func TestReset(t *testing.T) {
  21. // Clean and start a syncthing instance
  22. log.Println("Cleaning...")
  23. err := removeAll("s1", "h1/index*")
  24. if err != nil {
  25. t.Fatal(err)
  26. }
  27. if err := os.Mkdir("s1", 0755); err != nil {
  28. t.Fatal(err)
  29. }
  30. log.Println("Creating files...")
  31. size := createFiles(t)
  32. p := startInstance(t, 1)
  33. defer p.Stop() // Not checkedStop, because Syncthing will exit on its own
  34. m, err := p.Model("default")
  35. if err != nil {
  36. t.Fatal(err)
  37. }
  38. expected := size
  39. if m.LocalFiles != expected {
  40. t.Fatalf("Incorrect number of files after initial scan, %d != %d", m.LocalFiles, expected)
  41. }
  42. // Clear all files but restore the folder marker
  43. log.Println("Cleaning...")
  44. err = removeAll("s1")
  45. if err != nil {
  46. t.Fatal(err)
  47. }
  48. if err := os.Mkdir("s1", 0755); err != nil {
  49. t.Fatal(err)
  50. }
  51. if fd, err := os.Create("s1/.stfolder"); err != nil {
  52. t.Fatal(err)
  53. } else {
  54. fd.Close()
  55. }
  56. // Reset indexes of an invalid folder
  57. log.Println("Reset invalid folder")
  58. _, err = p.Post("/rest/system/reset?folder=invalid", nil)
  59. if err == nil {
  60. t.Fatalf("Cannot reset indexes of an invalid folder")
  61. }
  62. // Reset indexes of the default folder
  63. log.Println("Reset indexes of default folder")
  64. bs, err := p.Post("/rest/system/reset?folder=default", nil)
  65. if err != nil && err != io.ErrUnexpectedEOF {
  66. t.Fatalf("Failed to reset indexes (default): %v (%s)", err, bytes.TrimSpace(bs))
  67. }
  68. // ---- Syncthing exits here ----
  69. select {
  70. case <-p.Stopped():
  71. case <-time.After(20 * time.Second):
  72. t.Fatal("timed out before Syncthing stopped")
  73. }
  74. p = startInstance(t, 1)
  75. defer p.Stop() // Not checkedStop, because Syncthing will exit on its own
  76. m, err = p.Model("default")
  77. if err != nil {
  78. t.Fatal(err)
  79. }
  80. expected = 0
  81. if m.LocalFiles != expected {
  82. t.Fatalf("Incorrect number of files after initial scan, %d != %d", m.LocalFiles, expected)
  83. }
  84. // Recreate the files and scan
  85. log.Println("Creating files...")
  86. size = createFiles(t)
  87. if err := p.Rescan("default"); err != nil {
  88. t.Fatal(err)
  89. }
  90. // Verify that we see them
  91. m, err = p.Model("default")
  92. if err != nil {
  93. t.Fatal(err)
  94. }
  95. expected = size
  96. if m.LocalFiles != expected {
  97. t.Fatalf("Incorrect number of files after second creation phase, %d != %d", m.LocalFiles, expected)
  98. }
  99. // Reset all indexes
  100. log.Println("Reset DB...")
  101. bs, err = p.Post("/rest/system/reset", nil)
  102. if err != nil && err != io.ErrUnexpectedEOF {
  103. t.Fatalf("Failed to reset indexes (all): %v (%s)", err, bytes.TrimSpace(bs))
  104. }
  105. // ---- Syncthing exits here ----
  106. select {
  107. case <-p.Stopped():
  108. case <-time.After(20 * time.Second):
  109. t.Fatal("timed out before Syncthing stopped")
  110. }
  111. p = startInstance(t, 1)
  112. defer checkedStop(t, p)
  113. m, err = p.Model("default")
  114. if err != nil {
  115. t.Fatal(err)
  116. }
  117. expected = size
  118. if m.LocalFiles != expected {
  119. t.Fatalf("Incorrect number of files after initial scan, %d != %d", m.LocalFiles, expected)
  120. }
  121. }
  122. func createFiles(t *testing.T) int {
  123. // Create a few files
  124. const n = 8
  125. for i := 0; i < n; i++ {
  126. file := fmt.Sprintf("f%d", i)
  127. if err := ioutil.WriteFile(filepath.Join("s1", file), []byte("data"), 0644); err != nil {
  128. t.Fatal(err)
  129. }
  130. }
  131. return n
  132. }