2020-07-10 15:59:25 +00:00
|
|
|
use super::*;
|
|
|
|
|
|
|
|
#[test]
|
2020-11-03 18:26:31 +00:00
|
|
|
fn test_parse_next_component() {
|
2020-07-10 15:59:25 +00:00
|
|
|
assert_eq!(
|
2020-11-03 18:26:31 +00:00
|
|
|
parse_next_component(OsStr::new(r"server\share"), true),
|
|
|
|
(OsStr::new(r"server"), OsStr::new(r"share"))
|
2020-07-10 15:59:25 +00:00
|
|
|
);
|
|
|
|
|
|
|
|
assert_eq!(
|
2020-11-03 18:26:31 +00:00
|
|
|
parse_next_component(OsStr::new(r"server/share"), true),
|
|
|
|
(OsStr::new(r"server/share"), OsStr::new(r""))
|
2020-07-10 15:59:25 +00:00
|
|
|
);
|
|
|
|
|
|
|
|
assert_eq!(
|
2020-11-03 18:26:31 +00:00
|
|
|
parse_next_component(OsStr::new(r"server/share"), false),
|
|
|
|
(OsStr::new(r"server"), OsStr::new(r"share"))
|
2020-07-10 15:59:25 +00:00
|
|
|
);
|
|
|
|
|
2020-11-03 18:26:31 +00:00
|
|
|
assert_eq!(
|
|
|
|
parse_next_component(OsStr::new(r"server\"), false),
|
|
|
|
(OsStr::new(r"server"), OsStr::new(r""))
|
|
|
|
);
|
|
|
|
|
|
|
|
assert_eq!(
|
|
|
|
parse_next_component(OsStr::new(r"\server\"), false),
|
|
|
|
(OsStr::new(r""), OsStr::new(r"server\"))
|
|
|
|
);
|
|
|
|
|
|
|
|
assert_eq!(
|
|
|
|
parse_next_component(OsStr::new(r"servershare"), false),
|
|
|
|
(OsStr::new(r"servershare"), OsStr::new(""))
|
|
|
|
);
|
2020-07-10 15:59:25 +00:00
|
|
|
}
|
2021-09-22 13:11:40 +00:00
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn verbatim() {
|
|
|
|
use crate::path::Path;
|
|
|
|
fn check(path: &str, expected: &str) {
|
|
|
|
let verbatim = maybe_verbatim(Path::new(path)).unwrap();
|
|
|
|
let verbatim = String::from_utf16_lossy(verbatim.strip_suffix(&[0]).unwrap());
|
|
|
|
assert_eq!(&verbatim, expected, "{}", path);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Ensure long paths are correctly prefixed.
|
|
|
|
check(
|
|
|
|
r"C:\Program Files\Rust\aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\foo.txt",
|
|
|
|
r"\\?\C:\Program Files\Rust\aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\foo.txt",
|
|
|
|
);
|
|
|
|
check(
|
|
|
|
r"\\server\share\aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\foo.txt",
|
|
|
|
r"\\?\UNC\server\share\aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\foo.txt",
|
|
|
|
);
|
|
|
|
check(
|
|
|
|
r"\\.\PIPE\aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\foo.txt",
|
|
|
|
r"\\?\PIPE\aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\foo.txt",
|
|
|
|
);
|
|
|
|
// `\\?\` prefixed paths are left unchanged...
|
|
|
|
check(
|
|
|
|
r"\\?\verbatim.\aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\foo.txt",
|
|
|
|
r"\\?\verbatim.\aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\foo.txt",
|
|
|
|
);
|
|
|
|
// But `//?/` is not a verbatim prefix so it will be normalized.
|
|
|
|
check(
|
|
|
|
r"//?/E:/verbatim.\aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\foo.txt",
|
|
|
|
r"\\?\E:\verbatim\aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\foo.txt",
|
|
|
|
);
|
|
|
|
|
|
|
|
// For performance, short absolute paths are left unchanged.
|
|
|
|
check(r"C:\Program Files\Rust", r"C:\Program Files\Rust");
|
|
|
|
check(r"\\server\share", r"\\server\share");
|
|
|
|
check(r"\\.\COM1", r"\\.\COM1");
|
|
|
|
|
2021-10-23 18:34:09 +00:00
|
|
|
// Check that paths of length 247 are converted to verbatim.
|
|
|
|
// This is necessary for `CreateDirectory`.
|
|
|
|
check(
|
|
|
|
r"C:\aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
|
|
|
r"\\?\C:\aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
|
|
|
);
|
|
|
|
|
2021-09-22 13:11:40 +00:00
|
|
|
// Make sure opening a drive will work.
|
|
|
|
check("Z:", "Z:");
|
|
|
|
|
2021-11-16 05:36:20 +00:00
|
|
|
// A path that contains null is not a valid path.
|
2021-09-22 13:11:40 +00:00
|
|
|
assert!(maybe_verbatim(Path::new("\0")).is_err());
|
|
|
|
}
|
2022-03-19 14:30:34 +00:00
|
|
|
|
|
|
|
fn parse_prefix(path: &str) -> Option<Prefix<'_>> {
|
|
|
|
super::parse_prefix(OsStr::new(path))
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_parse_prefix_verbatim() {
|
|
|
|
let prefix = Some(Prefix::VerbatimDisk(b'C'));
|
|
|
|
assert_eq!(prefix, parse_prefix(r"\\?\C:/windows/system32/notepad.exe"));
|
|
|
|
assert_eq!(prefix, parse_prefix(r"\\?\C:\windows\system32\notepad.exe"));
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_parse_prefix_verbatim_device() {
|
|
|
|
let prefix = Some(Prefix::UNC(OsStr::new("?"), OsStr::new("C:")));
|
|
|
|
assert_eq!(prefix, parse_prefix(r"//?/C:/windows/system32/notepad.exe"));
|
|
|
|
assert_eq!(prefix, parse_prefix(r"//?/C:\windows\system32\notepad.exe"));
|
|
|
|
assert_eq!(prefix, parse_prefix(r"/\?\C:\windows\system32\notepad.exe"));
|
|
|
|
assert_eq!(prefix, parse_prefix(r"\\?/C:\windows\system32\notepad.exe"));
|
|
|
|
}
|
2022-03-19 14:05:56 +00:00
|
|
|
|
2022-08-18 02:13:37 +00:00
|
|
|
// See #93586 for more information.
|
2022-03-19 14:05:56 +00:00
|
|
|
#[test]
|
|
|
|
fn test_windows_prefix_components() {
|
|
|
|
use crate::path::Path;
|
|
|
|
|
|
|
|
let path = Path::new("C:");
|
|
|
|
let mut components = path.components();
|
|
|
|
let drive = components.next().expect("drive is expected here");
|
|
|
|
assert_eq!(drive.as_os_str(), OsStr::new("C:"));
|
|
|
|
assert_eq!(components.as_path(), Path::new(""));
|
|
|
|
}
|
2022-09-03 06:15:08 +00:00
|
|
|
|
|
|
|
/// See #101358.
|
|
|
|
///
|
|
|
|
/// Note that the exact behaviour here may change in the future.
|
|
|
|
/// In which case this test will need to adjusted.
|
|
|
|
#[test]
|
|
|
|
fn broken_unc_path() {
|
|
|
|
use crate::path::Component;
|
|
|
|
|
|
|
|
let mut components = Path::new(r"\\foo\\bar\\").components();
|
|
|
|
assert_eq!(components.next(), Some(Component::RootDir));
|
|
|
|
assert_eq!(components.next(), Some(Component::Normal("foo".as_ref())));
|
|
|
|
assert_eq!(components.next(), Some(Component::Normal("bar".as_ref())));
|
|
|
|
|
|
|
|
let mut components = Path::new("//foo//bar//").components();
|
|
|
|
assert_eq!(components.next(), Some(Component::RootDir));
|
|
|
|
assert_eq!(components.next(), Some(Component::Normal("foo".as_ref())));
|
|
|
|
assert_eq!(components.next(), Some(Component::Normal("bar".as_ref())));
|
|
|
|
}
|