package main import ( "io/ioutil" "os" "path/filepath" "reflect" "regexp" "testing" "github.com/alcortesm/tgz" ) func TestMain(m *testing.M) { setUp() rval := m.Run() tearDown() os.Exit(rval) } func setUp() { var err error repo, err = tgz.Extract("../../storage/filesystem/internal/dotgit/fixtures/spinnaker-gc.tgz") if err != nil { panic(err) } } var repo string func tearDown() { err := os.RemoveAll(repo) if err != nil { panic(err) } } func TestJoin(t *testing.T) { fs := NewCustomFS("") for i, test := range [...]struct { input []string expected string }{ { input: []string{}, expected: "", }, { input: []string{"a"}, expected: "a", }, { input: []string{"a", "b"}, expected: "a--b", }, { input: []string{"a", "b", "c"}, expected: "a--b--c", }, } { obtained := fs.Join(test.input...) if obtained != test.expected { t.Fatalf("test %d:\n\tinput = %v\n\tobtained = %v\n\texpected = %v\n", i, test.input, obtained, test.expected) } } } func TestStat(t *testing.T) { fs := NewCustomFS(filepath.Join(repo, ".git/")) for i, path := range [...]string{ "index", "info--refs", "objects--pack--pack-584416f86235cac0d54bfabbdc399fb2b09a5269.pack", } { real, err := os.Open(fs.ToReal(path)) if err != nil { t.Fatalf("test %d: openning real: %s", err) } expected, err := real.Stat() if err != nil { t.Fatalf("test %d: stat on real: %s", err) } obtained, err := fs.Stat(path) if err != nil { t.Fatalf("test %d: fs.Stat unexpected error: %s", i, err) } if !reflect.DeepEqual(obtained, expected) { t.Fatalf("test %d:\n\tinput = %s\n\tobtained = %v\n\texpected = %v\n", i, path, obtained, expected) } err = real.Close() if err != nil { t.Fatalf("test %d: closing real: %s", i, err) } } } func TestStatErrors(t *testing.T) { fs := NewCustomFS(filepath.Join(repo, ".git/")) for i, test := range [...]struct { input string errRegExp string }{ { input: "bla", errRegExp: ".*bla: no such file or directory", }, { input: "bla--foo", errRegExp: ".*bla/foo: no such file or directory", }, } { expected := regexp.MustCompile(test.errRegExp) _, err := fs.Stat(test.input) if err == nil { t.Fatalf("test %d: no error returned", i) } if !expected.MatchString(err.Error()) { t.Fatalf("test %d: error missmatch\n\tobtained = %q\n\texpected regexp = %q\n", i, err.Error(), test.errRegExp) } } } func TestOpen(t *testing.T) { fs := NewCustomFS(filepath.Join(repo, ".git/")) for i, path := range [...]string{ "index", "info--refs", "objects--pack--pack-584416f86235cac0d54bfabbdc399fb2b09a5269.pack", } { real, err := os.Open(fs.ToReal(path)) if err != nil { t.Fatalf("test %d: openning real: %s", err) } realData, err := ioutil.ReadAll(real) if err != nil { t.Fatal("test %d: ioutil.ReadAll on real: %s", err) } err = real.Close() if err != nil { t.Fatal("test %d: closing real: %s", err) } obtained, err := fs.Open(path) if err != nil { t.Fatalf("test %d: fs.Open unexpected error: %s", i, err) } obtainedData, err := ioutil.ReadAll(obtained) if err != nil { t.Fatal("test %d: ioutil.ReadAll on obtained: %s", err) } err = obtained.Close() if err != nil { t.Fatal("test %d: closing obtained: %s", err) } if !reflect.DeepEqual(obtainedData, realData) { t.Fatalf("test %d:\n\tinput = %s\n\tobtained = %v\n\texpected = %v\n", i, path, obtainedData, realData) } } } func TestReadDir(t *testing.T) { fs := NewCustomFS(filepath.Join(repo, ".git/")) for i, path := range [...]string{ "info", ".", "", "objects", "objects--pack", } { expected, err := ioutil.ReadDir(fs.ToReal(path)) if err != nil { t.Fatalf("test %d: real ReadDir: %s", err) } obtained, err := fs.ReadDir(path) if err != nil { t.Fatalf("test %d: fs.ReadDir unexpected error: %s", i, err) } if !reflect.DeepEqual(obtained, expected) { t.Fatalf("test %d:\n\tinput = %s\n\tobtained = %v\n\texpected = %v\n", i, path, obtained, expected) } } }