#![cfg_attr(not(windows), allow(dead_code))]
#[macro_use]
extern crate pretty_assertions;
use std::path::Path;
use std::process::Command;
macro_rules! expect_err {
[$s:expr] => {{
let p = Path::new($s);
match p.canonicalize() {
Ok(p) => {
panic!("Got {:?} when canonicalizing {:?}, expected err", p, $s);
}
Err(err) => {
println!("EXPECTED ERR Canonicalizing {:?} => {}", $s, err);
}
}
}}
}
macro_rules! expect_path {
[$expect:expr, $s:expr] => {{
let expect = Path::new($expect);
let p = Path::new($s);
match p.canonicalize() {
Ok(p) => {
assert_eq!(expect, p);
println!("EXPECTED OK Canonicalizing {:?} => {:?}", $s, p);
}
Err(err) => {
panic!("Got {:?} when canonicalizing {:?}, expected {:?}", err, $s, $expect);
}
}
}}
}
fn share() -> String {
if cfg!(windows) {
let shared = Command::new("wmic")
.arg("share")
.arg("get")
.arg("caption,name,path")
.output()
.expect("could not `wmic share`")
.stdout;
let out = ::std::str::from_utf8(&shared).unwrap().trim().to_string();
println!("### SHARED:\n{}\n###", out);
out
} else {
"NONE SHARED".to_string()
}
}
fn hostname() -> String {
let hostname = Command::new("hostname")
.output()
.expect("could not get hostname")
.stdout;
let out = ::std::str::from_utf8(&hostname).unwrap().trim().to_string();
println!("HOSTNAME: {}", out);
out
}
#[cfg_attr(windows, test)]
fn canonicalize_verbatim_unc() {
let _ = share(); let p = format!(r"\\?\UNC\{}\C$", hostname());
expect_path!(&p, &p);
}
#[cfg_attr(windows, test)]
fn canonicalize_verbatim_disk() {
let with_root = r"\\?\C:\";
expect_path!(with_root, with_root);
expect_err!(r"\\?\C:")
}
#[cfg_attr(windows, test)]
fn canonicalize_unc() {
let h = hostname();
let unc = format!(r"\\{}\C$", h);
let verbatim = format!(r"\\?\UNC\{}\C$", h);
let result = Path::new(&unc).canonicalize().unwrap();
assert_eq!(Path::new(&verbatim), result);
}
#[cfg_attr(windows, test)]
fn canonicalize_disk() {
expect_path!(r"\\?\C:\", r"C:\")
}