/tests/test_cargo_compile_plugins.rs

https://gitlab.com/alx741/cargo · Rust · 269 lines · 251 code · 17 blank · 1 comment · 2 complexity · e04760cc83a35d1c72183ada5d92c4f7 MD5 · raw file

  1. use std::fs;
  2. use std::env;
  3. use support::{project, execs};
  4. use hamcrest::assert_that;
  5. fn setup() {
  6. }
  7. test!(plugin_to_the_max {
  8. if !::is_nightly() { return }
  9. let foo = project("foo")
  10. .file("Cargo.toml", r#"
  11. [package]
  12. name = "foo"
  13. version = "0.0.1"
  14. authors = []
  15. [lib]
  16. name = "foo_lib"
  17. [dependencies.bar]
  18. path = "../bar"
  19. "#)
  20. .file("src/main.rs", r#"
  21. #![feature(plugin)]
  22. #![plugin(bar)]
  23. extern crate foo_lib;
  24. fn main() { foo_lib::foo(); }
  25. "#)
  26. .file("src/foo_lib.rs", r#"
  27. #![feature(plugin)]
  28. #![plugin(bar)]
  29. pub fn foo() {}
  30. "#);
  31. let bar = project("bar")
  32. .file("Cargo.toml", r#"
  33. [package]
  34. name = "bar"
  35. version = "0.0.1"
  36. authors = []
  37. [lib]
  38. name = "bar"
  39. plugin = true
  40. [dependencies.baz]
  41. path = "../baz"
  42. "#)
  43. .file("src/lib.rs", r#"
  44. #![feature(plugin_registrar, rustc_private)]
  45. extern crate rustc_plugin;
  46. extern crate baz;
  47. use rustc_plugin::Registry;
  48. #[plugin_registrar]
  49. pub fn foo(_reg: &mut Registry) {
  50. println!("{}", baz::baz());
  51. }
  52. "#);
  53. let baz = project("baz")
  54. .file("Cargo.toml", r#"
  55. [package]
  56. name = "baz"
  57. version = "0.0.1"
  58. authors = []
  59. [lib]
  60. name = "baz"
  61. crate_type = ["dylib"]
  62. "#)
  63. .file("src/lib.rs", "pub fn baz() -> i32 { 1 }");
  64. bar.build();
  65. baz.build();
  66. assert_that(foo.cargo_process("build"),
  67. execs().with_status(0));
  68. assert_that(foo.cargo("doc"),
  69. execs().with_status(0));
  70. });
  71. test!(plugin_with_dynamic_native_dependency {
  72. if !::is_nightly() { return }
  73. let build = project("builder")
  74. .file("Cargo.toml", r#"
  75. [package]
  76. name = "builder"
  77. version = "0.0.1"
  78. authors = []
  79. [lib]
  80. name = "builder"
  81. crate-type = ["dylib"]
  82. "#)
  83. .file("src/lib.rs", r#"
  84. #[no_mangle]
  85. pub extern fn foo() {}
  86. "#);
  87. assert_that(build.cargo_process("build"),
  88. execs().with_status(0));
  89. let src = build.root().join("target/debug");
  90. let lib = fs::read_dir(&src).unwrap().map(|s| s.unwrap().path()).find(|lib| {
  91. let lib = lib.file_name().unwrap().to_str().unwrap();
  92. lib.starts_with(env::consts::DLL_PREFIX) &&
  93. lib.ends_with(env::consts::DLL_SUFFIX)
  94. }).unwrap();
  95. let foo = project("foo")
  96. .file("Cargo.toml", r#"
  97. [package]
  98. name = "foo"
  99. version = "0.0.1"
  100. authors = []
  101. [dependencies.bar]
  102. path = "bar"
  103. "#)
  104. .file("src/main.rs", r#"
  105. #![feature(plugin)]
  106. #![plugin(bar)]
  107. fn main() {}
  108. "#)
  109. .file("bar/Cargo.toml", r#"
  110. [package]
  111. name = "bar"
  112. version = "0.0.1"
  113. authors = []
  114. build = 'build.rs'
  115. [lib]
  116. name = "bar"
  117. plugin = true
  118. "#)
  119. .file("bar/build.rs", r#"
  120. use std::path::PathBuf;
  121. use std::env;
  122. fn main() {
  123. let src = PathBuf::from(env::var("SRC").unwrap());
  124. println!("cargo:rustc-flags=-L {}", src.parent().unwrap()
  125. .display());
  126. }
  127. "#)
  128. .file("bar/src/lib.rs", r#"
  129. #![feature(plugin_registrar, rustc_private)]
  130. extern crate rustc_plugin;
  131. use rustc_plugin::Registry;
  132. #[cfg_attr(not(target_env = "msvc"), link(name = "builder"))]
  133. #[cfg_attr(target_env = "msvc", link(name = "builder.dll"))]
  134. extern { fn foo(); }
  135. #[plugin_registrar]
  136. pub fn bar(_reg: &mut Registry) {
  137. unsafe { foo() }
  138. }
  139. "#);
  140. assert_that(foo.cargo_process("build").env("SRC", &lib).arg("-v"),
  141. execs().with_status(0));
  142. });
  143. test!(plugin_integration {
  144. let p = project("foo")
  145. .file("Cargo.toml", r#"
  146. [package]
  147. name = "foo"
  148. version = "0.0.1"
  149. authors = []
  150. build = "build.rs"
  151. [lib]
  152. name = "foo"
  153. plugin = true
  154. doctest = false
  155. "#)
  156. .file("build.rs", "fn main() {}")
  157. .file("src/lib.rs", "")
  158. .file("tests/it_works.rs", "");
  159. assert_that(p.cargo_process("test").arg("-v"),
  160. execs().with_status(0));
  161. });
  162. test!(doctest_a_plugin {
  163. let p = project("foo")
  164. .file("Cargo.toml", r#"
  165. [package]
  166. name = "foo"
  167. version = "0.0.1"
  168. authors = []
  169. [dependencies]
  170. bar = { path = "bar" }
  171. "#)
  172. .file("src/lib.rs", r#"
  173. #[macro_use]
  174. extern crate bar;
  175. "#)
  176. .file("bar/Cargo.toml", r#"
  177. [package]
  178. name = "bar"
  179. version = "0.0.1"
  180. authors = []
  181. [lib]
  182. name = "bar"
  183. plugin = true
  184. "#)
  185. .file("bar/src/lib.rs", r#"
  186. pub fn bar() {}
  187. "#);
  188. assert_that(p.cargo_process("test").arg("-v"),
  189. execs().with_status(0));
  190. });
  191. // See #1515
  192. test!(native_plugin_dependency_with_custom_ar_linker {
  193. let target = ::rustc_host();
  194. let foo = project("foo")
  195. .file("Cargo.toml", r#"
  196. [package]
  197. name = "foo"
  198. version = "0.0.1"
  199. authors = []
  200. [lib]
  201. name = "foo"
  202. plugin = true
  203. "#)
  204. .file("src/lib.rs", "");
  205. let bar = project("bar")
  206. .file("Cargo.toml", r#"
  207. [package]
  208. name = "bar"
  209. version = "0.0.1"
  210. authors = []
  211. [lib]
  212. name = "bar"
  213. [dependencies.foo]
  214. path = "../foo"
  215. "#)
  216. .file("src/lib", "")
  217. .file(".cargo/config", &format!(r#"
  218. [target.{}]
  219. ar = "nonexistent-ar"
  220. linker = "nonexistent-linker"
  221. "#, target));
  222. foo.build();
  223. assert_that(bar.cargo_process("build").arg("--verbose"),
  224. execs().with_stdout("\
  225. [COMPILING] foo v0.0.1 ([..])
  226. [RUNNING] `rustc [..] -C ar=nonexistent-ar -C linker=nonexistent-linker [..]`
  227. "));
  228. });