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