| extern crate pkg_config; |
| #[macro_use] |
| extern crate lazy_static; |
| |
| use pkg_config::Error; |
| use std::env; |
| use std::path::PathBuf; |
| use std::sync::Mutex; |
| |
| lazy_static! { |
| static ref LOCK: Mutex<()> = Mutex::new(()); |
| } |
| |
| fn reset() { |
| for (k, _) in env::vars() { |
| if k.contains("DYNAMIC") |
| || k.contains("STATIC") |
| || k.contains("PKG_CONFIG_ALLOW_CROSS") |
| || k.contains("PKG_CONFIG_SYSROOT_DIR") |
| || k.contains("FOO_NO_PKG_CONFIG") |
| { |
| env::remove_var(&k); |
| } |
| } |
| env::remove_var("TARGET"); |
| env::remove_var("HOST"); |
| env::set_var( |
| "PKG_CONFIG_PATH", |
| &env::current_dir().unwrap().join("tests"), |
| ); |
| } |
| |
| fn find(name: &str) -> Result<pkg_config::Library, Error> { |
| pkg_config::probe_library(name) |
| } |
| |
| #[test] |
| fn cross_disabled() { |
| let _g = LOCK.lock(); |
| reset(); |
| env::set_var("TARGET", "foo"); |
| env::set_var("HOST", "bar"); |
| match find("foo") { |
| Err(Error::CrossCompilation) => {} |
| x => panic!("Error::CrossCompilation expected, found `{:?}`", x), |
| } |
| } |
| |
| #[test] |
| fn cross_enabled() { |
| let _g = LOCK.lock(); |
| reset(); |
| env::set_var("TARGET", "foo"); |
| env::set_var("HOST", "bar"); |
| env::set_var("PKG_CONFIG_ALLOW_CROSS", "1"); |
| find("foo").unwrap(); |
| } |
| |
| #[test] |
| fn cross_enabled_if_customized() { |
| let _g = LOCK.lock(); |
| reset(); |
| env::set_var("TARGET", "foo"); |
| env::set_var("HOST", "bar"); |
| env::set_var("PKG_CONFIG_SYSROOT_DIR", "/tmp/cross-test"); |
| find("foo").unwrap(); |
| } |
| |
| #[test] |
| fn cross_disabled_if_customized() { |
| let _g = LOCK.lock(); |
| reset(); |
| env::set_var("TARGET", "foo"); |
| env::set_var("HOST", "bar"); |
| env::set_var("PKG_CONFIG_ALLOW_CROSS", "0"); |
| env::set_var("PKG_CONFIG_SYSROOT_DIR", "/tmp/cross-test"); |
| match find("foo") { |
| Err(Error::CrossCompilation) => {} |
| _ => panic!("expected CrossCompilation failure"), |
| } |
| } |
| |
| #[test] |
| fn package_disabled() { |
| let _g = LOCK.lock(); |
| reset(); |
| env::set_var("FOO_NO_PKG_CONFIG", "1"); |
| match find("foo") { |
| Err(Error::EnvNoPkgConfig(name)) => assert_eq!(name, "FOO_NO_PKG_CONFIG"), |
| x => panic!("Error::EnvNoPkgConfig expected, found `{:?}`", x), |
| } |
| } |
| |
| #[test] |
| fn output_ok() { |
| let _g = LOCK.lock(); |
| reset(); |
| let lib = find("foo").unwrap(); |
| assert!(lib.libs.contains(&"gcc".to_string())); |
| assert!(lib.libs.contains(&"coregrind-amd64-linux".to_string())); |
| assert!(lib.link_paths.contains(&PathBuf::from("/usr/lib/valgrind"))); |
| assert!(lib |
| .include_paths |
| .contains(&PathBuf::from("/usr/include/valgrind"))); |
| assert!(lib.include_paths.contains(&PathBuf::from("/usr/foo"))); |
| } |
| |
| #[test] |
| fn escapes() { |
| let _g = LOCK.lock(); |
| reset(); |
| let lib = find("escape").unwrap(); |
| assert!(lib |
| .include_paths |
| .contains(&PathBuf::from("include path with spaces"))); |
| assert!(lib |
| .link_paths |
| .contains(&PathBuf::from("link path with spaces"))); |
| assert_eq!( |
| lib.defines.get("A"), |
| Some(&Some("\"escaped string' literal\"".to_owned())) |
| ); |
| assert_eq!( |
| lib.defines.get("B"), |
| Some(&Some("ESCAPED IDENTIFIER".to_owned())) |
| ); |
| assert_eq!(lib.defines.get("FOX"), Some(&Some("🦊".to_owned()))); |
| } |
| |
| #[test] |
| fn framework() { |
| let _g = LOCK.lock(); |
| reset(); |
| let lib = find("framework").unwrap(); |
| assert!(lib.frameworks.contains(&"foo".to_string())); |
| assert!(lib.frameworks.contains(&"bar".to_string())); |
| assert!(lib.frameworks.contains(&"baz".to_string())); |
| assert!(lib.frameworks.contains(&"foobar".to_string())); |
| assert!(lib.frameworks.contains(&"foobaz".to_string())); |
| assert!(lib.framework_paths.contains(&PathBuf::from("/usr/lib"))); |
| } |
| |
| #[test] |
| fn get_variable() { |
| let _g = LOCK.lock(); |
| reset(); |
| let prefix = pkg_config::get_variable("foo", "prefix").unwrap(); |
| assert_eq!(prefix, "/usr"); |
| } |
| |
| #[test] |
| fn version() { |
| let _g = LOCK.lock(); |
| reset(); |
| assert_eq!(&find("foo").unwrap().version[..], "3.10.0.SVN"); |
| } |
| |
| #[test] |
| fn atleast_version_ok() { |
| let _g = LOCK.lock(); |
| reset(); |
| pkg_config::Config::new() |
| .atleast_version("3.10") |
| .probe("foo") |
| .unwrap(); |
| } |
| |
| #[test] |
| #[should_panic] |
| fn atleast_version_ng() { |
| let _g = LOCK.lock(); |
| reset(); |
| pkg_config::Config::new() |
| .atleast_version("3.11") |
| .probe("foo") |
| .unwrap(); |
| } |
| |
| #[test] |
| fn exactly_version_ok() { |
| let _g = LOCK.lock(); |
| reset(); |
| pkg_config::Config::new() |
| .exactly_version("3.10.0.SVN") |
| .probe("foo") |
| .unwrap(); |
| } |
| |
| #[test] |
| #[should_panic] |
| fn exactly_version_ng() { |
| let _g = LOCK.lock(); |
| reset(); |
| pkg_config::Config::new() |
| .exactly_version("3.10.0") |
| .probe("foo") |
| .unwrap(); |
| } |
| |
| #[test] |
| fn range_version_range_ok() { |
| let _g = LOCK.lock(); |
| reset(); |
| pkg_config::Config::new() |
| .range_version("4.2.0".."4.4.0") |
| .probe("escape") |
| .unwrap(); |
| } |
| |
| #[test] |
| #[should_panic] |
| fn range_version_range_ng() { |
| let _g = LOCK.lock(); |
| reset(); |
| pkg_config::Config::new() |
| .range_version("4.0.0".."4.2.0") |
| .probe("escape") |
| .unwrap(); |
| } |
| |
| #[test] |
| fn range_version_range_inclusive_ok() { |
| let _g = LOCK.lock(); |
| reset(); |
| pkg_config::Config::new() |
| .range_version("4.0.0"..="4.2.0") |
| .probe("escape") |
| .unwrap(); |
| } |
| |
| #[test] |
| #[should_panic] |
| fn range_version_range_inclusive_ng() { |
| let _g = LOCK.lock(); |
| reset(); |
| pkg_config::Config::new() |
| .range_version("3.8.0"..="4.0.0") |
| .probe("escape") |
| .unwrap(); |
| } |
| |
| #[test] |
| fn range_version_range_from_ok() { |
| let _g = LOCK.lock(); |
| reset(); |
| pkg_config::Config::new() |
| .range_version("4.0.0"..) |
| .probe("escape") |
| .unwrap(); |
| } |
| |
| #[test] |
| #[should_panic] |
| fn range_version_range_from_ng() { |
| let _g = LOCK.lock(); |
| reset(); |
| pkg_config::Config::new() |
| .range_version("4.4.0"..) |
| .probe("escape") |
| .unwrap(); |
| } |
| |
| #[test] |
| fn range_version_range_to_ok() { |
| let _g = LOCK.lock(); |
| reset(); |
| pkg_config::Config::new() |
| .range_version(.."4.4.0") |
| .probe("escape") |
| .unwrap(); |
| } |
| |
| #[test] |
| #[should_panic] |
| fn range_version_range_to_ng() { |
| let _g = LOCK.lock(); |
| reset(); |
| pkg_config::Config::new() |
| .range_version(.."4.2.0") |
| .probe("escape") |
| .unwrap(); |
| } |
| |
| #[test] |
| fn range_version_range_to_inclusive_ok() { |
| let _g = LOCK.lock(); |
| reset(); |
| pkg_config::Config::new() |
| .range_version(..="4.2.0") |
| .probe("escape") |
| .unwrap(); |
| } |
| |
| #[test] |
| #[should_panic] |
| fn range_version_range_to_inclusive_ng() { |
| let _g = LOCK.lock(); |
| reset(); |
| pkg_config::Config::new() |
| .range_version(..="4.0.0") |
| .probe("escape") |
| .unwrap(); |
| } |
| |
| #[test] |
| fn range_version_full() { |
| let _g = LOCK.lock(); |
| reset(); |
| pkg_config::Config::new() |
| .range_version(..) |
| .probe("escape") |
| .unwrap(); |
| } |
| |
| #[test] |
| fn rpath() { |
| let _g = LOCK.lock(); |
| reset(); |
| let lib = find("rpath").unwrap(); |
| assert!(lib |
| .ld_args |
| .contains(&vec!["-rpath".to_string(), "/usr/local/lib".to_string(),])); |
| } |