1
16
17 package main
18
19 import (
20 "os"
21 "path/filepath"
22 "testing"
23
24 "github.com/blang/semver/v4"
25 )
26
27 var (
28 latestVersion = semver.MustParse("3.1.12")
29 )
30
31 func TestExistingDataDirWithVersionFile(t *testing.T) {
32 d, err := OpenOrCreateDataDirectory("testdata/datadir_with_version")
33 if err != nil {
34 t.Fatalf("Failed to open data dir: %v", err)
35 }
36 isEmpty, err := d.IsEmpty()
37 if err != nil {
38 t.Fatalf("Failed to check if data dir is empty: %v", err)
39 }
40 if isEmpty {
41 t.Errorf("Expected non-empty data directory to exist")
42 }
43 exists, err := d.versionFile.Exists()
44 if err != nil {
45 t.Fatal(err)
46 }
47 if !exists {
48 t.Fatalf("Expected version file %s to exist", d.versionFile.path)
49 }
50 vp, err := d.versionFile.Read()
51 if err != nil {
52 t.Fatalf("Failed to read version file %s: %v", d.versionFile.path, err)
53 }
54 expectedVersion := &EtcdVersionPair{&EtcdVersion{latestVersion}, storageEtcd3}
55 if !vp.Equals(expectedVersion) {
56 t.Errorf("Expected version file to contain %s, but got %s", expectedVersion, vp)
57 }
58 }
59
60 func TestExistingDataDirWithoutVersionFile(t *testing.T) {
61 targetVersion := &EtcdVersionPair{&EtcdVersion{latestVersion}, storageEtcd3}
62
63 d, err := OpenOrCreateDataDirectory("testdata/datadir_without_version")
64 if err != nil {
65 t.Fatalf("Failed to open data dir: %v", err)
66 }
67 exists, err := d.versionFile.Exists()
68 if err != nil {
69 t.Fatal(err)
70 }
71 if exists {
72 t.Errorf("Expected version file %s not to exist", d.versionFile.path)
73 }
74 err = d.Initialize(targetVersion)
75 if err != nil {
76 t.Fatalf("Failed initialize data directory %s: %v", d.path, err)
77 }
78 exists, err = d.versionFile.Exists()
79 if err != nil {
80 t.Fatal(err)
81 }
82 if exists {
83 t.Fatalf("Expected version file %s not to exist after initializing non-empty data-dir", d.versionFile.path)
84 }
85 }
86
87 func TestNonexistingDataDir(t *testing.T) {
88 targetVersion := &EtcdVersionPair{&EtcdVersion{latestVersion}, storageEtcd3}
89 path := newTestPath(t)
90 defer os.RemoveAll(path)
91 d, err := OpenOrCreateDataDirectory(filepath.Join(path, "data-dir"))
92 if err != nil {
93 t.Fatalf("Failed to open data dir: %v", err)
94 }
95 isEmpty, err := d.IsEmpty()
96 if err != nil {
97 t.Fatalf("Failed to check if data dir is empty: %v", err)
98 }
99 if !isEmpty {
100 t.Errorf("Expected empty data directory to exist")
101 }
102 err = d.Initialize(targetVersion)
103 if err != nil {
104 t.Fatalf("Failed initialize data directory %s: %v", d.path, err)
105 }
106 exists, err := d.versionFile.Exists()
107 if err != nil {
108 t.Fatal(err)
109 }
110 if !exists {
111 t.Fatalf("Expected version file %s to exist", d.versionFile.path)
112 }
113 isEmpty, err = d.IsEmpty()
114 if err != nil {
115 t.Fatalf("Failed to check if data dir is empty: %v", err)
116 }
117 if isEmpty {
118 t.Errorf("Expected non-empty data directory to exist after Initialize()")
119 }
120 vp, err := d.versionFile.Read()
121 if err != nil {
122 t.Fatalf("Failed to read version file %s: %v", d.versionFile.path, err)
123 }
124 if !vp.Equals(targetVersion) {
125 t.Errorf("Expected version file to contain %s, but got %s", targetVersion, vp)
126 }
127 }
128
129 func TestBackup(t *testing.T) {
130 path := newTestPath(t)
131 defer os.RemoveAll(path)
132 d, err := OpenOrCreateDataDirectory(filepath.Join(path, "data-dir"))
133 if err != nil {
134 t.Fatalf("Failed to open data dir: %v", err)
135 }
136 _, err = os.Create(filepath.Join(path, "data-dir", "empty.txt"))
137 if err != nil {
138 t.Fatal(err)
139 }
140 err = d.Backup()
141 if err != nil {
142 t.Fatalf("Failed to backup data directory %s: %v", d.path, err)
143 }
144 bak, err := OpenOrCreateDataDirectory(filepath.Join(path, "data-dir.bak"))
145 if err != nil {
146 t.Fatalf("Failed to open backup data dir: %v", err)
147 }
148 isEmpty, err := bak.IsEmpty()
149 if err != nil {
150 t.Fatal(err)
151 }
152 if isEmpty {
153 t.Errorf("Expected non-empty backup directory to exist after Backup()")
154 }
155 }
156
157 func newTestPath(t *testing.T) string {
158 path, err := os.MkdirTemp("", "etcd-migrate-test-")
159 if err != nil {
160 t.Fatalf("Failed to create tmp dir for test: %v", err)
161 }
162 err = os.Chmod(path, 0777)
163 if err != nil {
164 t.Fatalf("Failed to granting permission to tmp dir for test: %v", err)
165 }
166 return path
167 }
168
View as plain text