From a79dc96affd9b6fb263070f2cf5d646d6b475c43 Mon Sep 17 00:00:00 2001 From: UebelAndre Date: Thu, 16 Dec 2021 06:03:24 -0800 Subject: [PATCH] Added unit tests for rustdoc rules --- test/unit/rustdoc/BUILD.bazel | 5 + test/unit/rustdoc/rustdoc.cc | 0 test/unit/rustdoc/rustdoc.h | 0 test/unit/rustdoc/rustdoc_bin.rs | 1 + test/unit/rustdoc/rustdoc_lib.rs | 25 +++ test/unit/rustdoc/rustdoc_proc_macro.rs | 14 ++ test/unit/rustdoc/rustdoc_unit_test.bzl | 197 ++++++++++++++++++++++++ 7 files changed, 242 insertions(+) create mode 100644 test/unit/rustdoc/BUILD.bazel create mode 100644 test/unit/rustdoc/rustdoc.cc create mode 100644 test/unit/rustdoc/rustdoc.h create mode 100644 test/unit/rustdoc/rustdoc_bin.rs create mode 100644 test/unit/rustdoc/rustdoc_lib.rs create mode 100644 test/unit/rustdoc/rustdoc_proc_macro.rs create mode 100644 test/unit/rustdoc/rustdoc_unit_test.bzl diff --git a/test/unit/rustdoc/BUILD.bazel b/test/unit/rustdoc/BUILD.bazel new file mode 100644 index 0000000000..f4375c3426 --- /dev/null +++ b/test/unit/rustdoc/BUILD.bazel @@ -0,0 +1,5 @@ +load(":rustdoc_unit_test.bzl", "rustdoc_test_suite") + +rustdoc_test_suite( + name = "rustdoc_test_suite", +) diff --git a/test/unit/rustdoc/rustdoc.cc b/test/unit/rustdoc/rustdoc.cc new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/unit/rustdoc/rustdoc.h b/test/unit/rustdoc/rustdoc.h new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/unit/rustdoc/rustdoc_bin.rs b/test/unit/rustdoc/rustdoc_bin.rs new file mode 100644 index 0000000000..f328e4d9d0 --- /dev/null +++ b/test/unit/rustdoc/rustdoc_bin.rs @@ -0,0 +1 @@ +fn main() {} diff --git a/test/unit/rustdoc/rustdoc_lib.rs b/test/unit/rustdoc/rustdoc_lib.rs new file mode 100644 index 0000000000..f7b46525d9 --- /dev/null +++ b/test/unit/rustdoc/rustdoc_lib.rs @@ -0,0 +1,25 @@ +#[cfg(feature = "with_proc_macro")] +use rustdoc_proc_macro::make_answer; + +#[cfg(feature = "with_proc_macro")] +make_answer!(); + +/// The answer to the ultimate question +/// ``` +/// fn answer() -> u32 { 42 } +/// assert_eq!(answer(), 42); +/// ``` +#[cfg(not(feature = "with_proc_macro"))] +pub fn answer() -> u32 { + 42 +} + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn test_answer() { + assert_eq!(answer(), 42); + } +} diff --git a/test/unit/rustdoc/rustdoc_proc_macro.rs b/test/unit/rustdoc/rustdoc_proc_macro.rs new file mode 100644 index 0000000000..ccc9fb9987 --- /dev/null +++ b/test/unit/rustdoc/rustdoc_proc_macro.rs @@ -0,0 +1,14 @@ +use proc_macro::TokenStream; + +#[proc_macro] +pub fn make_answer(_item: TokenStream) -> TokenStream { + "\ +/// A procedural macro example: +/// ``` +/// fn answer() -> u32 { 42 } +/// assert_eq!(answer(), 42); +/// ``` +pub fn answer() -> u32 { 42 }" + .parse() + .unwrap() +} diff --git a/test/unit/rustdoc/rustdoc_unit_test.bzl b/test/unit/rustdoc/rustdoc_unit_test.bzl new file mode 100644 index 0000000000..6d7a6edb37 --- /dev/null +++ b/test/unit/rustdoc/rustdoc_unit_test.bzl @@ -0,0 +1,197 @@ +"""Unittest to verify properties of rustdoc rules""" + +load("@bazel_skylib//lib:unittest.bzl", "analysistest") +load("@rules_cc//cc:defs.bzl", "cc_library") +load("//rust:defs.bzl", "rust_binary", "rust_doc", "rust_doc_test", "rust_library", "rust_proc_macro", "rust_test") +load( + "//test/unit:common.bzl", + "assert_action_mnemonic", + "assert_argv_contains_prefix_not", +) + +def _common_rustdoc_checks(env, tut): + actions = tut.actions + action = actions[0] + assert_action_mnemonic(env, action, "Rustdoc") + + # These flags, while required for `Rustc` actions, should be omitted for + # `Rustdoc` actions + assert_argv_contains_prefix_not(env, action, "--remap-path-prefix") + assert_argv_contains_prefix_not(env, action, "--emit") + +def _rustdoc_for_lib_test_impl(ctx): + env = analysistest.begin(ctx) + tut = analysistest.target_under_test(env) + + _common_rustdoc_checks(env, tut) + + return analysistest.end(env) + +def _rustdoc_for_bin_test_impl(ctx): + env = analysistest.begin(ctx) + tut = analysistest.target_under_test(env) + + _common_rustdoc_checks(env, tut) + + return analysistest.end(env) + +def _rustdoc_for_proc_macro_test_impl(ctx): + env = analysistest.begin(ctx) + tut = analysistest.target_under_test(env) + + _common_rustdoc_checks(env, tut) + + return analysistest.end(env) + +def _rustdoc_for_lib_with_proc_macro_test_impl(ctx): + env = analysistest.begin(ctx) + tut = analysistest.target_under_test(env) + + _common_rustdoc_checks(env, tut) + + return analysistest.end(env) + +def _rustdoc_for_bin_with_transitive_proc_macro_test_impl(ctx): + env = analysistest.begin(ctx) + tut = analysistest.target_under_test(env) + + _common_rustdoc_checks(env, tut) + + return analysistest.end(env) + +def _rustdoc_for_lib_with_cc_lib_test_impl(ctx): + env = analysistest.begin(ctx) + tut = analysistest.target_under_test(env) + + _common_rustdoc_checks(env, tut) + + return analysistest.end(env) + +rustdoc_for_lib_test = analysistest.make(_rustdoc_for_lib_test_impl) +rustdoc_for_bin_test = analysistest.make(_rustdoc_for_bin_test_impl) +rustdoc_for_proc_macro_test = analysistest.make(_rustdoc_for_proc_macro_test_impl) +rustdoc_for_lib_with_proc_macro_test = analysistest.make(_rustdoc_for_lib_with_proc_macro_test_impl) +rustdoc_for_bin_with_transitive_proc_macro_test = analysistest.make(_rustdoc_for_bin_with_transitive_proc_macro_test_impl) +rustdoc_for_lib_with_cc_lib_test = analysistest.make(_rustdoc_for_lib_with_cc_lib_test_impl) + +def _target_maker(rule_fn, name, **kwargs): + rule_fn( + name = name, + **kwargs + ) + + rust_test( + name = "{}_test".format(name), + crate = ":{}".format(name), + ) + + rust_doc( + name = "{}_doc".format(name), + crate = ":{}".format(name), + ) + + rust_doc_test( + name = "{}_doctest".format(name), + crate = ":{}".format(name), + ) + +def _define_targets(): + _target_maker( + rust_binary, + name = "bin", + srcs = ["rustdoc_bin.rs"], + ) + + _target_maker( + rust_library, + name = "lib", + srcs = ["rustdoc_lib.rs"], + ) + + _target_maker( + rust_proc_macro, + name = "rustdoc_proc_macro", + srcs = ["rustdoc_proc_macro.rs"], + edition = "2018", + ) + + _target_maker( + rust_library, + name = "lib_with_proc_macro", + srcs = ["rustdoc_lib.rs"], + proc_macro_deps = [":rustdoc_proc_macro"], + crate_features = ["with_proc_macro"], + ) + + _target_maker( + rust_binary, + name = "bin_with_transitive_proc_macro", + srcs = ["rustdoc_bin.rs"], + deps = [":lib_with_proc_macro"], + proc_macro_deps = [":rustdoc_proc_macro"], + crate_features = ["with_proc_macro"], + ) + + cc_library( + name = "cc_lib", + hdrs = ["rustdoc.h"], + srcs = ["rustdoc.cc"], + ) + + _target_maker( + rust_library, + name = "lib_with_cc", + srcs = ["rustdoc_lib.rs"], + crate_features = ["with_cc"], + deps = [":cc_lib"], + ) + +def rustdoc_test_suite(name): + """Entry-point macro called from the BUILD file. + + Args: + name (str): Name of the macro. + """ + + _define_targets() + + rustdoc_for_lib_test( + name = "rustdoc_for_lib_test", + target_under_test = ":lib_doc", + ) + + rustdoc_for_bin_test( + name = "rustdoc_for_bin_test", + target_under_test = ":bin_doc", + ) + + rustdoc_for_proc_macro_test( + name = "rustdoc_for_proc_macro_test", + target_under_test = ":rustdoc_proc_macro_doc", + ) + + rustdoc_for_lib_with_proc_macro_test( + name = "rustdoc_for_lib_with_proc_macro_test", + target_under_test = ":lib_with_proc_macro_doc", + ) + + rustdoc_for_bin_with_transitive_proc_macro_test( + name = "rustdoc_for_bin_with_transitive_proc_macro_test", + target_under_test = ":bin_with_transitive_proc_macro_doc", + ) + + rustdoc_for_lib_with_cc_lib_test( + name = "rustdoc_for_lib_with_cc_lib_test", + target_under_test = ":lib_with_cc_doc", + ) + + native.test_suite( + name = name, + tests = [ + ":rustdoc_for_lib_test", + ":rustdoc_for_bin_test", + ":rustdoc_for_proc_macro_test", + ":rustdoc_for_lib_with_proc_macro_test", + ":rustdoc_for_lib_with_cc_lib_test", + ], + )