From d34ed226e1ef69f9590cf63d7ae00345d4bd937f Mon Sep 17 00:00:00 2001 From: Dmitry Lomov Date: Fri, 4 Nov 2016 12:28:50 +0000 Subject: Use main_class as specified in java_test even if use_testrunner is true. -- MOS_MIGRATED_REVID=138180229 --- .../lib/bazel/rules/java/BazelJavaRuleClasses.java | 12 +++-- .../lib/bazel/rules/java/BazelJavaSemantics.java | 19 ++++++-- .../lib/bazel/rules/java/BazelJavaTestRule.java | 4 -- src/test/shell/bazel/bazel_java_test.sh | 51 ++++++++++++++++++++++ 4 files changed, 74 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaRuleClasses.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaRuleClasses.java index 2dd4172ab2..857e83a362 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaRuleClasses.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaRuleClasses.java @@ -299,12 +299,14 @@ public class BazelJavaRuleClasses { */ .add(attr("jvm_flags", STRING_LIST)) /* - Use the - com.google.testing.junit.runner.BazelTestRunner class as the - main entry point for a Java program. + Use the test runner (by default + com.google.testing.junit.runner.BazelTestRunner) class as the + main entry point for a Java program, and provide the test class + to the test runner as a value of bazel.test_suite + system property. You can use this to override the default - behavior, which is to use BazelTestRunner for + behavior, which is to use test runner for java_test rules, and not use it for java_binary rules. It is unlikely you will want to do this. One use is for AllTest @@ -312,6 +314,8 @@ public class BazelJavaRuleClasses { before running the tests, for example). The AllTest rule must be declared as a java_binary, but should still use the test runner as its main entry point. + + The name of a test runner class can be overriden with main_class attribute. */ .add(attr("use_testrunner", BOOLEAN).value(false)) /* diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaSemantics.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaSemantics.java index 9fe7b81d71..0d7217f1a0 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaSemantics.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaSemantics.java @@ -95,16 +95,27 @@ public class BazelJavaSemantics implements JavaSemantics { public void checkForProtoLibraryAndJavaProtoLibraryOnSameProto( RuleContext ruleContext, JavaCommon javaCommon) {} + private static final String JUNIT4_RUNNER = "org.junit.runner.JUnitCore"; + private String getMainClassInternal(RuleContext ruleContext, ImmutableList sources) { if (!ruleContext.attributes().get("create_executable", Type.BOOLEAN)) { return null; } - if (ruleContext.attributes().get("use_testrunner", Type.BOOLEAN) - && !useLegacyJavaTest(ruleContext)) { - return "com.google.testing.junit.runner.BazelTestRunner"; - } String mainClass = ruleContext.attributes().get("main_class", Type.STRING); + + // Legacy behavior for java_test rules: main_class defaulted to JUnit4 runner. + // TODO(dmarting): remove once we drop the legacy bazel java_test behavior. + if (mainClass.isEmpty() + && useLegacyJavaTest(ruleContext) + && "java_test".equals(ruleContext.getRule().getRuleClass())) { + mainClass = JUNIT4_RUNNER; + } + if (mainClass.isEmpty()) { + if (ruleContext.attributes().get("use_testrunner", Type.BOOLEAN) + && !useLegacyJavaTest(ruleContext)) { + return "com.google.testing.junit.runner.BazelTestRunner"; + } mainClass = JavaCommon.determinePrimaryClass(ruleContext, sources); } return mainClass; diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaTestRule.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaTestRule.java index 0de34ae90c..fb990f448f 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaTestRule.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaTestRule.java @@ -39,8 +39,6 @@ import com.google.devtools.build.lib.rules.java.Jvm; */ public final class BazelJavaTestRule implements RuleDefinition { - private static final String JUNIT4_RUNNER = "org.junit.runner.JUnitCore"; - @Override public RuleClass build(Builder builder, RuleDefinitionEnvironment env) { /* @@ -60,8 +58,6 @@ public final class BazelJavaTestRule implements RuleDefinition { .override(attr("stamp", TRISTATE).value(TriState.NO)) .override(attr("use_testrunner", BOOLEAN).value(true)) .override(attr(":java_launcher", LABEL).value(JavaSemantics.JAVA_LAUNCHER)) - // TODO(dmarting): remove once we drop the legacy bazel java_test behavior. - .override(attr("main_class", STRING).value(JUNIT4_RUNNER)) /* The Java class to be loaded by the test runner.

diff --git a/src/test/shell/bazel/bazel_java_test.sh b/src/test/shell/bazel/bazel_java_test.sh index d2d1346a16..99611c94ee 100755 --- a/src/test/shell/bazel/bazel_java_test.sh +++ b/src/test/shell/bazel/bazel_java_test.sh @@ -108,4 +108,55 @@ EOF expect_not_log "error: \[ArrayEquals\] Reference equality used to compare arrays" } +function test_java_test_main_class() { + mkdir -p java/testrunners || fail "mkdir failed" + cat > java/testrunners/TestRunner.java < java/testrunners/Tests.java < java/testrunners/BUILD < "$TEST_log" + expect_log "Custom test runner was run" + expect_log "testTest was run" +} + + run_suite "Java integration tests" -- cgit v1.2.3