1 package file
2
3 import (
4 "errors"
5 "fmt"
6 "io/ioutil"
7 "os"
8 "path"
9 "path/filepath"
10 "testing"
11
12 st "github.com/golang-migrate/migrate/v4/source/testing"
13 )
14
15 func Test(t *testing.T) {
16 tmpDir, err := ioutil.TempDir("", "")
17 if err != nil {
18 t.Fatal(err)
19 }
20 defer func() {
21 if err := os.RemoveAll(tmpDir); err != nil {
22 t.Error(err)
23 }
24 }()
25
26
27 mustWriteFile(t, tmpDir, "1_foobar.up.sql", "1 up")
28 mustWriteFile(t, tmpDir, "1_foobar.down.sql", "1 down")
29
30 mustWriteFile(t, tmpDir, "3_foobar.up.sql", "3 up")
31
32 mustWriteFile(t, tmpDir, "4_foobar.up.sql", "4 up")
33 mustWriteFile(t, tmpDir, "4_foobar.down.sql", "4 down")
34
35 mustWriteFile(t, tmpDir, "5_foobar.down.sql", "5 down")
36
37 mustWriteFile(t, tmpDir, "7_foobar.up.sql", "7 up")
38 mustWriteFile(t, tmpDir, "7_foobar.down.sql", "7 down")
39
40 f := &File{}
41 d, err := f.Open("file://" + tmpDir)
42 if err != nil {
43 t.Fatal(err)
44 }
45
46 st.Test(t, d)
47 }
48
49 func TestOpen(t *testing.T) {
50 tmpDir, err := ioutil.TempDir("", "TestOpen")
51 if err != nil {
52 t.Fatal(err)
53 }
54 defer func() {
55 if err := os.RemoveAll(tmpDir); err != nil {
56 t.Error(err)
57 }
58 }()
59
60 mustWriteFile(t, tmpDir, "1_foobar.up.sql", "")
61 mustWriteFile(t, tmpDir, "1_foobar.down.sql", "")
62
63 if !filepath.IsAbs(tmpDir) {
64 t.Fatal("expected tmpDir to be absolute path")
65 }
66
67 f := &File{}
68 _, err = f.Open("file://" + tmpDir)
69 if err != nil {
70 t.Fatal(err)
71 }
72 }
73
74 func TestOpenWithRelativePath(t *testing.T) {
75 tmpDir, err := ioutil.TempDir("", "TestOpen")
76 if err != nil {
77 t.Fatal(err)
78 }
79 defer func() {
80 if err := os.RemoveAll(tmpDir); err != nil {
81 t.Error(err)
82 }
83 }()
84
85 wd, err := os.Getwd()
86 if err != nil {
87 t.Fatal(err)
88 }
89 defer func() {
90
91 if err := os.Chdir(wd); err != nil {
92 t.Log(err)
93 }
94 }()
95
96 if err := os.Chdir(tmpDir); err != nil {
97 t.Fatal(err)
98 }
99
100 if err := os.Mkdir(filepath.Join(tmpDir, "foo"), os.ModePerm); err != nil {
101 t.Fatal(err)
102 }
103
104 mustWriteFile(t, filepath.Join(tmpDir, "foo"), "1_foobar.up.sql", "")
105
106 f := &File{}
107
108
109 d, err := f.Open("file://foo")
110 if err != nil {
111 t.Fatal(err)
112 }
113 _, err = d.First()
114 if err != nil {
115 t.Fatalf("expected first file in working dir %v for foo", tmpDir)
116 }
117
118
119 d, err = f.Open("file://./foo")
120 if err != nil {
121 t.Fatal(err)
122 }
123 _, err = d.First()
124 if err != nil {
125 t.Fatalf("expected first file in working dir %v for ./foo", tmpDir)
126 }
127 }
128
129 func TestOpenDefaultsToCurrentDirectory(t *testing.T) {
130 wd, err := os.Getwd()
131 if err != nil {
132 t.Fatal(err)
133 }
134
135 f := &File{}
136 d, err := f.Open("file://")
137 if err != nil {
138 t.Fatal(err)
139 }
140
141 if d.(*File).path != wd {
142 t.Fatal("expected driver to default to current directory")
143 }
144 }
145
146 func TestOpenWithDuplicateVersion(t *testing.T) {
147 tmpDir, err := ioutil.TempDir("", "TestOpenWithDuplicateVersion")
148 if err != nil {
149 t.Fatal(err)
150 }
151 defer func() {
152 if err := os.RemoveAll(tmpDir); err != nil {
153 t.Error(err)
154 }
155 }()
156
157 mustWriteFile(t, tmpDir, "1_foo.up.sql", "")
158 mustWriteFile(t, tmpDir, "1_bar.up.sql", "")
159
160 f := &File{}
161 _, err = f.Open("file://" + tmpDir)
162 if err == nil {
163 t.Fatal("expected err")
164 }
165 }
166
167 func TestClose(t *testing.T) {
168 tmpDir, err := ioutil.TempDir("", "TestOpen")
169 if err != nil {
170 t.Fatal(err)
171 }
172 defer func() {
173 if err := os.RemoveAll(tmpDir); err != nil {
174 t.Error(err)
175 }
176 }()
177
178 f := &File{}
179 d, err := f.Open("file://" + tmpDir)
180 if err != nil {
181 t.Fatal(err)
182 }
183
184 if d.Close() != nil {
185 t.Fatal("expected nil")
186 }
187 }
188
189 func mustWriteFile(t testing.TB, dir, file string, body string) {
190 if err := ioutil.WriteFile(path.Join(dir, file), []byte(body), 06444); err != nil {
191 t.Fatal(err)
192 }
193 }
194
195 func mustCreateBenchmarkDir(t *testing.B) (dir string) {
196 tmpDir, err := ioutil.TempDir("", "Benchmark")
197 if err != nil {
198 t.Fatal(err)
199 }
200
201 for i := 0; i < 1000; i++ {
202 mustWriteFile(t, tmpDir, fmt.Sprintf("%v_foobar.up.sql", i), "")
203 mustWriteFile(t, tmpDir, fmt.Sprintf("%v_foobar.down.sql", i), "")
204 }
205
206 return tmpDir
207 }
208
209 func BenchmarkOpen(b *testing.B) {
210 dir := mustCreateBenchmarkDir(b)
211 defer func() {
212 if err := os.RemoveAll(dir); err != nil {
213 b.Error(err)
214 }
215 }()
216 b.ResetTimer()
217 for n := 0; n < b.N; n++ {
218 f := &File{}
219 _, err := f.Open("file://" + dir)
220 if err != nil {
221 b.Error(err)
222 }
223 }
224 b.StopTimer()
225 }
226
227 func BenchmarkNext(b *testing.B) {
228 dir := mustCreateBenchmarkDir(b)
229 defer func() {
230 if err := os.RemoveAll(dir); err != nil {
231 b.Error(err)
232 }
233 }()
234 f := &File{}
235 d, _ := f.Open("file://" + dir)
236 b.ResetTimer()
237 v, err := d.First()
238 for n := 0; n < b.N; n++ {
239 for !errors.Is(err, os.ErrNotExist) {
240 v, err = d.Next(v)
241 }
242 }
243 b.StopTimer()
244 }
245
View as plain text