Close the completed roadmap documents
This commit is contained in:
@@ -205,6 +205,32 @@ func TestPromoteDirectoryRejectsSourceRootReplacementBeforeOpen(t *testing.T) {
|
||||
assertNoMatchingTempDirectories(t, root, ".destination.tmp-")
|
||||
}
|
||||
|
||||
func TestPromoteDirectoryRejectsIdentityPreservingSourceRootSymlinkReplacement(t *testing.T) {
|
||||
root := t.TempDir()
|
||||
src := filepath.Join(root, "source")
|
||||
preserved := filepath.Join(root, "source-preserved")
|
||||
dst := filepath.Join(root, "destination")
|
||||
mustWriteFile(t, filepath.Join(src, "value.txt"), []byte("original"), 0o644)
|
||||
|
||||
err := promoteDirectoryWithHooks(src, dst, renameDirectoryNoReplace, sourceTraversalHooks{
|
||||
afterRootInspect: func() {
|
||||
if err := os.Rename(src, preserved); err != nil {
|
||||
t.Fatalf("Rename(inspected source) error = %v", err)
|
||||
}
|
||||
if err := os.Symlink(filepath.Base(preserved), src); err != nil {
|
||||
t.Skipf("Symlink() unavailable: %v", err)
|
||||
}
|
||||
},
|
||||
})
|
||||
if err == nil {
|
||||
t.Fatal("promoteDirectoryWithHooks() error = nil, want source-root symlink replacement failure")
|
||||
}
|
||||
assertFileBytes(t, filepath.Join(preserved, "value.txt"), []byte("original"))
|
||||
assertPathIsSymlink(t, src)
|
||||
assertPathMissing(t, dst)
|
||||
assertNoMatchingTempDirectories(t, root, ".destination.tmp-")
|
||||
}
|
||||
|
||||
func TestPromoteDirectoryRejectsInspectedDirectorySymlinkReplacement(t *testing.T) {
|
||||
root := t.TempDir()
|
||||
src := filepath.Join(root, "source")
|
||||
@@ -274,6 +300,38 @@ func TestPromoteDirectoryRejectsInspectedFileIdentityMismatch(t *testing.T) {
|
||||
assertNoMatchingTempDirectories(t, root, ".destination.tmp-")
|
||||
}
|
||||
|
||||
func TestPromoteDirectoryRejectsIdentityPreservingFileSymlinkReplacement(t *testing.T) {
|
||||
root := t.TempDir()
|
||||
src := filepath.Join(root, "source")
|
||||
file := filepath.Join(src, "value.txt")
|
||||
preserved := filepath.Join(src, "value-preserved.txt")
|
||||
dst := filepath.Join(root, "destination")
|
||||
mustWriteFile(t, file, []byte("original"), 0o644)
|
||||
|
||||
replaced := false
|
||||
err := promoteDirectoryWithHooks(src, dst, renameDirectoryNoReplace, sourceTraversalHooks{
|
||||
afterEntryInspect: func(path string) {
|
||||
if replaced || path != file {
|
||||
return
|
||||
}
|
||||
replaced = true
|
||||
if err := os.Rename(file, preserved); err != nil {
|
||||
t.Fatalf("Rename(inspected file) error = %v", err)
|
||||
}
|
||||
if err := os.Symlink(filepath.Base(preserved), file); err != nil {
|
||||
t.Skipf("Symlink() unavailable: %v", err)
|
||||
}
|
||||
},
|
||||
})
|
||||
if err == nil {
|
||||
t.Fatal("promoteDirectoryWithHooks() error = nil, want file symlink replacement failure")
|
||||
}
|
||||
assertFileBytes(t, preserved, []byte("original"))
|
||||
assertPathIsSymlink(t, file)
|
||||
assertPathMissing(t, dst)
|
||||
assertNoMatchingTempDirectories(t, root, ".destination.tmp-")
|
||||
}
|
||||
|
||||
func TestPromoteDirectoryRejectsInspectedDirectoryIdentityMismatch(t *testing.T) {
|
||||
root := t.TempDir()
|
||||
src := filepath.Join(root, "source")
|
||||
@@ -304,6 +362,38 @@ func TestPromoteDirectoryRejectsInspectedDirectoryIdentityMismatch(t *testing.T)
|
||||
assertNoMatchingTempDirectories(t, root, ".destination.tmp-")
|
||||
}
|
||||
|
||||
func TestPromoteDirectoryRejectsIdentityPreservingDirectorySymlinkReplacement(t *testing.T) {
|
||||
root := t.TempDir()
|
||||
src := filepath.Join(root, "source")
|
||||
child := filepath.Join(src, "child")
|
||||
preserved := filepath.Join(src, "child-preserved")
|
||||
dst := filepath.Join(root, "destination")
|
||||
mustWriteFile(t, filepath.Join(child, "value.txt"), []byte("original"), 0o644)
|
||||
|
||||
replaced := false
|
||||
err := promoteDirectoryWithHooks(src, dst, renameDirectoryNoReplace, sourceTraversalHooks{
|
||||
afterEntryInspect: func(path string) {
|
||||
if replaced || path != child {
|
||||
return
|
||||
}
|
||||
replaced = true
|
||||
if err := os.Rename(child, preserved); err != nil {
|
||||
t.Fatalf("Rename(inspected directory) error = %v", err)
|
||||
}
|
||||
if err := os.Symlink(filepath.Base(preserved), child); err != nil {
|
||||
t.Skipf("Symlink() unavailable: %v", err)
|
||||
}
|
||||
},
|
||||
})
|
||||
if err == nil {
|
||||
t.Fatal("promoteDirectoryWithHooks() error = nil, want directory symlink replacement failure")
|
||||
}
|
||||
assertFileBytes(t, filepath.Join(preserved, "value.txt"), []byte("original"))
|
||||
assertPathIsSymlink(t, child)
|
||||
assertPathMissing(t, dst)
|
||||
assertNoMatchingTempDirectories(t, root, ".destination.tmp-")
|
||||
}
|
||||
|
||||
func TestPromoteDirectoryDoesNotReplaceDestinationCreatedBeforeInstall(t *testing.T) {
|
||||
root := t.TempDir()
|
||||
src := filepath.Join(root, "source")
|
||||
@@ -369,6 +459,14 @@ func assertPathMissing(t *testing.T, path string) {
|
||||
}
|
||||
}
|
||||
|
||||
func assertPathIsSymlink(t *testing.T, path string) {
|
||||
t.Helper()
|
||||
info, err := os.Lstat(path)
|
||||
if err != nil || info.Mode()&os.ModeSymlink == 0 {
|
||||
t.Fatalf("Lstat(%q) info = %v, error = %v, want symlink", path, info, err)
|
||||
}
|
||||
}
|
||||
|
||||
func treeLayout(t *testing.T, root string) []string {
|
||||
t.Helper()
|
||||
var layout []string
|
||||
|
||||
Reference in New Issue
Block a user