aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorKaren Arutyunov <karen@codesynthesis.com>2019-02-14 15:20:36 +0300
committerKaren Arutyunov <karen@codesynthesis.com>2019-02-15 13:28:46 +0300
commit3c3b18efe6b9fc6f51d16c9569ca1e150adeaf76 (patch)
treeda5a01f5084ce8511f722fb08c3c57bf5ec9b5e3 /tests
parentaf98c733afe67e10ca87801b9bd05a2dfa1d3950 (diff)
Fix directory symlinks support on Windows
Diffstat (limited to 'tests')
-rw-r--r--tests/dir-iterator/testscript18
-rw-r--r--tests/link/driver.cxx34
2 files changed, 50 insertions, 2 deletions
diff --git a/tests/dir-iterator/testscript b/tests/dir-iterator/testscript
index 5169e9b..956eacb 100644
--- a/tests/dir-iterator/testscript
+++ b/tests/dir-iterator/testscript
@@ -15,6 +15,9 @@ $* a >"reg b"
mkdir -p a/b;
$* a >"dir b"
+# Note that on Windows only directory symlinks are currently supported (see
+# mksymlink() for details).
+#
: dangling-link
:
if ($cxx.target.class != 'windows')
@@ -29,3 +32,18 @@ if ($cxx.target.class != 'windows')
$* ../a >! 2>! != 0 : keep
$* -i ../a >'reg c' : skip
}
+else
+{
+ +mkdir a
+ +mkdir --no-cleanup a/b
+ +ln -s a/b a/l
+ +rmdir a/b
+
+ +touch a/c
+
+ # On Wine dangling symlinks are not visible (see mksymlink() for details).
+ #
+ #$* ../a >! 2>! != 0 : keep
+
+ $* -i ../a >'reg c' : skip
+}
diff --git a/tests/link/driver.cxx b/tests/link/driver.cxx
index 7aebeae..76cdbfc 100644
--- a/tests/link/driver.cxx
+++ b/tests/link/driver.cxx
@@ -177,9 +177,39 @@ main ()
// Create the directory symlink using an absolute path.
//
dir_path ld (td / dir_path ("dslink"));
- assert (link_dir (dp, ld, false, true));
+ assert (link_dir (dp, ld, false /* hard */, true /* check_content */));
- try_rmsymlink (ld);
+ {
+ pair<bool, entry_stat> pe (path_entry (ld / "f"));
+ assert (pe.first && pe.second.type == entry_type::regular);
+ }
+
+ {
+ pair<bool, entry_stat> pe (path_entry (ld));
+ assert (pe.first && pe.second.type == entry_type::symlink);
+ }
+
+ {
+ pair<bool, entry_stat> pe (path_entry (ld, true /* follow_symlinks */));
+ assert (pe.first && pe.second.type == entry_type::directory);
+ }
+
+ for (const dir_entry& de: dir_iterator (td, false /* ignore_dangling */))
+ {
+ assert (de.path () != path ("dslink") ||
+ (de.type () == entry_type::directory &&
+ de.ltype () == entry_type::symlink));
+ }
+
+ // Remove the directory symlink and make sure the target's content still
+ // exists.
+ //
+ assert (try_rmsymlink (ld) == rmfile_status::success);
+
+ {
+ pair<bool, entry_stat> pe (path_entry (dp / "f"));
+ assert (pe.first && pe.second.type == entry_type::regular);
+ }
#ifndef _WIN32
// Create the directory symlink using an unexistent directory path.