github.com/ghosta3/migrate/v4@v4.15.10/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/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  	// 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  }