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