github.com/nafhul/migrate/v4@v4.14.3/source/file/file_test.go (about) 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/nafhul/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 // write files that meet driver test requirements 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) // absolute path 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 // rescue working dir after we are done 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 // dir: foo 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 // dir: ./foo 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", "") // 1 up 158 mustWriteFile(t, tmpDir, "1_bar.up.sql", "") // 1 up 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 }