snapshotter_test.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. package snap
  2. import (
  3. "fmt"
  4. "hash/crc32"
  5. "io/ioutil"
  6. "os"
  7. "path"
  8. "reflect"
  9. "testing"
  10. "github.com/coreos/etcd/raft/raftpb"
  11. )
  12. var testSnap = &raftpb.Snapshot{
  13. Data: []byte("some snapshot"),
  14. Nodes: []int64{1, 2, 3},
  15. Index: 1,
  16. Term: 1,
  17. }
  18. func TestSaveAndLoad(t *testing.T) {
  19. dir := path.Join(os.TempDir(), "snapshot")
  20. err := os.Mkdir(dir, 0700)
  21. if err != nil {
  22. t.Fatal(err)
  23. }
  24. defer os.RemoveAll(dir)
  25. ss := New(dir)
  26. err = ss.save(testSnap)
  27. if err != nil {
  28. t.Fatal(err)
  29. }
  30. g, err := ss.Load()
  31. if err != nil {
  32. t.Errorf("err = %v, want nil", err)
  33. }
  34. if !reflect.DeepEqual(g, testSnap) {
  35. t.Errorf("snap = %#v, want %#v", g, testSnap)
  36. }
  37. }
  38. func TestBadCRC(t *testing.T) {
  39. dir := path.Join(os.TempDir(), "snapshot")
  40. err := os.Mkdir(dir, 0700)
  41. if err != nil {
  42. t.Fatal(err)
  43. }
  44. defer os.RemoveAll(dir)
  45. ss := New(dir)
  46. err = ss.save(testSnap)
  47. if err != nil {
  48. t.Fatal(err)
  49. }
  50. defer func() { crcTable = crc32.MakeTable(crc32.Castagnoli) }()
  51. // switch to use another crc table
  52. // fake a crc mismatch
  53. crcTable = crc32.MakeTable(crc32.Koopman)
  54. _, err = ss.Load()
  55. if err == nil || err != ErrCRCMismatch {
  56. t.Errorf("err = %v, want %v", err, ErrCRCMismatch)
  57. }
  58. }
  59. func TestFailback(t *testing.T) {
  60. dir := path.Join(os.TempDir(), "snapshot")
  61. err := os.Mkdir(dir, 0700)
  62. if err != nil {
  63. t.Fatal(err)
  64. }
  65. defer os.RemoveAll(dir)
  66. large := fmt.Sprintf("%016x-%016x-%016x.snap", 0xFFFF, 0xFFFF, 0xFFFF)
  67. err = ioutil.WriteFile(path.Join(dir, large), []byte("bad data"), 0666)
  68. if err != nil {
  69. t.Fatal(err)
  70. }
  71. ss := New(dir)
  72. err = ss.save(testSnap)
  73. if err != nil {
  74. t.Fatal(err)
  75. }
  76. g, err := ss.Load()
  77. if err != nil {
  78. t.Errorf("err = %v, want nil", err)
  79. }
  80. if !reflect.DeepEqual(g, testSnap) {
  81. t.Errorf("snap = %#v, want %#v", g, testSnap)
  82. }
  83. if f, err := os.Open(path.Join(dir, large) + ".broken"); err != nil {
  84. t.Fatal("broken snapshot does not exist")
  85. } else {
  86. f.Close()
  87. }
  88. }
  89. func TestSnapNames(t *testing.T) {
  90. dir := path.Join(os.TempDir(), "snapshot")
  91. err := os.Mkdir(dir, 0700)
  92. if err != nil {
  93. t.Fatal(err)
  94. }
  95. defer os.RemoveAll(dir)
  96. for i := 1; i <= 5; i++ {
  97. if f, err := os.Create(path.Join(dir, fmt.Sprintf("%d.snap", i))); err != nil {
  98. t.Fatal(err)
  99. } else {
  100. f.Close()
  101. }
  102. }
  103. ss := New(dir)
  104. names, err := ss.snapNames()
  105. if err != nil {
  106. t.Errorf("err = %v, want nil", err)
  107. }
  108. if len(names) != 5 {
  109. t.Errorf("len = %d, want 10", len(names))
  110. }
  111. w := []string{"5.snap", "4.snap", "3.snap", "2.snap", "1.snap"}
  112. if !reflect.DeepEqual(names, w) {
  113. t.Errorf("names = %v, want %v", names, w)
  114. }
  115. }
  116. func TestLoadNewestSnap(t *testing.T) {
  117. dir := path.Join(os.TempDir(), "snapshot")
  118. err := os.Mkdir(dir, 0700)
  119. if err != nil {
  120. t.Fatal(err)
  121. }
  122. defer os.RemoveAll(dir)
  123. ss := New(dir)
  124. err = ss.save(testSnap)
  125. if err != nil {
  126. t.Fatal(err)
  127. }
  128. newSnap := *testSnap
  129. newSnap.Index = 5
  130. err = ss.save(&newSnap)
  131. if err != nil {
  132. t.Fatal(err)
  133. }
  134. g, err := ss.Load()
  135. if err != nil {
  136. t.Errorf("err = %v, want nil", err)
  137. }
  138. if !reflect.DeepEqual(g, &newSnap) {
  139. t.Errorf("snap = %#v, want %#v", g, &newSnap)
  140. }
  141. }
  142. func TestNoSnapshot(t *testing.T) {
  143. dir := path.Join(os.TempDir(), "snapshot")
  144. err := os.Mkdir(dir, 0700)
  145. if err != nil {
  146. t.Fatal(err)
  147. }
  148. defer os.RemoveAll(dir)
  149. ss := New(dir)
  150. _, err = ss.Load()
  151. if err == nil || err != ErrNoSnapshot {
  152. t.Errorf("err = %v, want %v", err, ErrNoSnapshot)
  153. }
  154. }