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