diff --git a/internal/archiver/archiver_test.go b/internal/archiver/archiver_test.go index 2961d403c..aaaf02a22 100644 --- a/internal/archiver/archiver_test.go +++ b/internal/archiver/archiver_test.go @@ -4,6 +4,9 @@ import ( "bytes" "context" "io" + "io/ioutil" + "os" + "path/filepath" "testing" "time" @@ -312,3 +315,54 @@ func TestArchiveEmptySnapshot(t *testing.T) { t.Errorf("expected null snapshot for empty snapshot, got %v", sn) } } + +func chdir(t testing.TB, target string) (cleanup func()) { + curdir, err := os.Getwd() + if err != nil { + t.Fatal(err) + } + + t.Logf("chdir to %v", target) + err = os.Chdir(target) + if err != nil { + t.Fatal(err) + } + + return func() { + t.Logf("chdir back to %v", curdir) + err := os.Chdir(curdir) + if err != nil { + t.Fatal(err) + } + } +} + +func TestArchiveNameCollision(t *testing.T) { + repo, cleanup := repository.TestRepository(t) + defer cleanup() + + dir, cleanup := TempDir(t) + defer cleanup() + + root := filepath.Join(dir, "root") + OK(t, os.MkdirAll(root, 0755)) + + OK(t, ioutil.WriteFile(filepath.Join(dir, "testfile"), []byte("testfile1"), 0644)) + OK(t, ioutil.WriteFile(filepath.Join(dir, "root", "testfile"), []byte("testfile2"), 0644)) + + defer chdir(t, root)() + + arch := archiver.New(repo) + + sn, id, err := arch.Snapshot(context.TODO(), nil, []string{"testfile", filepath.Join("..", "testfile")}, nil, "localhost", nil) + OK(t, err) + + t.Logf("snapshot archived as %v", id) + + tree, err := repo.LoadTree(context.TODO(), *sn.Tree) + OK(t, err) + + if len(tree.Nodes) != 2 { + t.Fatalf("tree has %d nodes, wanted 2: %v", len(tree.Nodes), tree.Nodes) + } +}