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::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(),])); }