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