aboutsummaryrefslogtreecommitdiff
path: root/tests/unittest_tests.bzl
diff options
context:
space:
mode:
Diffstat (limited to 'tests/unittest_tests.bzl')
-rw-r--r--tests/unittest_tests.bzl282
1 files changed, 282 insertions, 0 deletions
diff --git a/tests/unittest_tests.bzl b/tests/unittest_tests.bzl
new file mode 100644
index 0000000..3d5a198
--- /dev/null
+++ b/tests/unittest_tests.bzl
@@ -0,0 +1,282 @@
+# Copyright 2019 The Bazel Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Unit tests for unittest.bzl."""
+
+load("//lib:unittest.bzl", "analysistest", "asserts", "unittest")
+
+###################################
+####### fail_basic_test ###########
+###################################
+def _basic_failing_test(ctx):
+ """Unit tests for a basic library verification test that fails."""
+ env = unittest.begin(ctx)
+
+ asserts.equals(env, 1, 2)
+
+ return unittest.end(env)
+
+basic_failing_test = unittest.make(_basic_failing_test)
+
+###################################
+####### basic_passing_test ########
+###################################
+def _basic_passing_test(ctx):
+ """Unit tests for a basic library verification test."""
+ env = unittest.begin(ctx)
+
+ asserts.equals(env, 1, 1)
+
+ return unittest.end(env)
+
+basic_passing_test = unittest.make(_basic_passing_test)
+
+###################################
+####### change_setting_test #######
+###################################
+def _change_setting_test(ctx):
+ """Test to verify that an analysis test may change configuration."""
+ env = analysistest.begin(ctx)
+
+ dep_min_os_version = analysistest.target_under_test(env)[_ChangeSettingInfo].min_os_version
+ asserts.equals(env, "1234.5678", dep_min_os_version)
+
+ return analysistest.end(env)
+
+_ChangeSettingInfo = provider()
+
+def _change_setting_fake_rule(ctx):
+ return [_ChangeSettingInfo(min_os_version = ctx.fragments.cpp.minimum_os_version())]
+
+change_setting_fake_rule = rule(
+ implementation = _change_setting_fake_rule,
+ fragments = ["cpp"],
+)
+
+change_setting_test = analysistest.make(
+ _change_setting_test,
+ config_settings = {
+ "//command_line_option:minimum_os_version": "1234.5678",
+ },
+)
+
+####################################
+####### failure_testing_test #######
+####################################
+def _failure_testing_test(ctx):
+ """Test to verify that an analysis test may verify a rule fails with fail()."""
+ env = analysistest.begin(ctx)
+
+ asserts.expect_failure(env, "This rule should never work")
+
+ return analysistest.end(env)
+
+def _failure_testing_fake_rule(ctx):
+ ignore = [ctx]
+ fail("This rule should never work")
+
+failure_testing_fake_rule = rule(
+ implementation = _failure_testing_fake_rule,
+)
+
+failure_testing_test = analysistest.make(
+ _failure_testing_test,
+ expect_failure = True,
+)
+
+############################################
+####### fail_unexpected_passing_test #######
+############################################
+def _fail_unexpected_passing_test(ctx):
+ """Test that fails by expecting an error that never occurs."""
+ env = analysistest.begin(ctx)
+
+ asserts.expect_failure(env, "Oh no, going to fail")
+
+ return analysistest.end(env)
+
+def _fail_unexpected_passing_fake_rule(ctx):
+ _ignore = [ctx]
+ return []
+
+fail_unexpected_passing_fake_rule = rule(
+ implementation = _fail_unexpected_passing_fake_rule,
+)
+
+fail_unexpected_passing_test = analysistest.make(
+ _fail_unexpected_passing_test,
+ expect_failure = True,
+)
+
+################################################
+####### change_setting_with_failure_test #######
+################################################
+def _change_setting_with_failure_test(ctx):
+ """Test verifying failure while changing configuration."""
+ env = analysistest.begin(ctx)
+
+ asserts.expect_failure(env, "unexpected minimum_os_version!!!")
+
+ return analysistest.end(env)
+
+def _change_setting_with_failure_fake_rule(ctx):
+ if ctx.fragments.cpp.minimum_os_version() == "error_error":
+ fail("unexpected minimum_os_version!!!")
+ return []
+
+change_setting_with_failure_fake_rule = rule(
+ implementation = _change_setting_with_failure_fake_rule,
+ fragments = ["cpp"],
+)
+
+change_setting_with_failure_test = analysistest.make(
+ _change_setting_with_failure_test,
+ expect_failure = True,
+ config_settings = {
+ "//command_line_option:minimum_os_version": "error_error",
+ },
+)
+
+####################################
+####### inspect_actions_test #######
+####################################
+def _inspect_actions_test(ctx):
+ """Test verifying actions registered by a target."""
+ env = analysistest.begin(ctx)
+
+ actions = analysistest.target_actions(env)
+ asserts.equals(env, 1, len(actions))
+ action_output = actions[0].outputs.to_list()[0]
+ asserts.equals(env, "out.txt", action_output.basename)
+ return analysistest.end(env)
+
+def _inspect_actions_fake_rule(ctx):
+ out_file = ctx.actions.declare_file("out.txt")
+ ctx.actions.run_shell(
+ command = "echo 'hello' > %s" % out_file.basename,
+ outputs = [out_file],
+ )
+ return [DefaultInfo(files = depset([out_file]))]
+
+inspect_actions_fake_rule = rule(
+ implementation = _inspect_actions_fake_rule,
+)
+
+inspect_actions_test = analysistest.make(
+ _inspect_actions_test,
+)
+
+########################################
+####### inspect_output_dirs_test #######
+########################################
+_OutputDirInfo = provider(fields = ["bin_path"])
+
+def _inspect_output_dirs_test(ctx):
+ """Test verifying output directories used by a test."""
+ env = analysistest.begin(ctx)
+
+ # Assert that the output bin dir observed by the aspect added by analysistest
+ # is the same as those observed by the rule directly, even when that's
+ # under a config transition and therefore not the same as the bin dir
+ # used by the test rule.
+ bin_path = analysistest.target_bin_dir_path(env)
+ target_under_test = analysistest.target_under_test(env)
+ asserts.false(env, not bin_path, "bin dir path not found.")
+ asserts.false(
+ env,
+ bin_path == ctx.bin_dir.path,
+ "test bin dir (%s) expected to differ with target_under_test bin dir (%s)." % (bin_path, ctx.bin_dir.path),
+ )
+ asserts.equals(env, bin_path, target_under_test[_OutputDirInfo].bin_path)
+ return analysistest.end(env)
+
+def _inspect_output_dirs_fake_rule(ctx):
+ return [
+ _OutputDirInfo(
+ bin_path = ctx.bin_dir.path,
+ ),
+ ]
+
+inspect_output_dirs_fake_rule = rule(
+ implementation = _inspect_output_dirs_fake_rule,
+)
+
+inspect_output_dirs_test = analysistest.make(
+ _inspect_output_dirs_test,
+ # The output directories differ between the test and target under test when
+ # the target under test is under a config transition.
+ config_settings = {
+ "//command_line_option:minimum_os_version": "1234.5678",
+ },
+)
+
+#########################################
+
+# buildifier: disable=unnamed-macro
+def unittest_passing_tests_suite():
+ """Creates the test targets and test suite for passing unittest.bzl tests.
+
+ Not all tests are included. Some unittest.bzl tests verify a test fails
+ when assertions are not met. Such tests must be run in an e2e shell test.
+ This suite only includes tests which verify success tests.
+ """
+ unittest.suite(
+ "unittest_tests",
+ basic_passing_test,
+ )
+
+ change_setting_test(
+ name = "change_setting_test",
+ target_under_test = ":change_setting_fake_target",
+ )
+ change_setting_fake_rule(
+ name = "change_setting_fake_target",
+ tags = ["manual"],
+ )
+
+ failure_testing_test(
+ name = "failure_testing_test",
+ target_under_test = ":failure_testing_fake_target",
+ )
+ failure_testing_fake_rule(
+ name = "failure_testing_fake_target",
+ tags = ["manual"],
+ )
+
+ change_setting_with_failure_test(
+ name = "change_setting_with_failure_test",
+ target_under_test = ":change_setting_with_failure_fake_target",
+ )
+ change_setting_with_failure_fake_rule(
+ name = "change_setting_with_failure_fake_target",
+ tags = ["manual"],
+ )
+
+ inspect_actions_test(
+ name = "inspect_actions_test",
+ target_under_test = ":inspect_actions_fake_target",
+ )
+ inspect_actions_fake_rule(
+ name = "inspect_actions_fake_target",
+ tags = ["manual"],
+ )
+
+ inspect_output_dirs_test(
+ name = "inspect_output_dirs_test",
+ target_under_test = ":inspect_output_dirs_fake_target",
+ )
+ inspect_output_dirs_fake_rule(
+ name = "inspect_output_dirs_fake_target",
+ tags = ["manual"],
+ )