github.com/arkanjoms/migrate@v3.5.4+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/golang-migrate/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  }