From e551f0de710ad4bc3ff6805e51f4ef1594044061 Mon Sep 17 00:00:00 2001 From: cnsun Date: Fri, 27 Apr 2018 14:26:10 -0700 Subject: Add a silence mode to the deps checker. Now the checker can be used to dump jdeps proto without emitting any warning or error. RELNOTES: none. PiperOrigin-RevId: 194593178 --- .../com/google/devtools/build/importdeps/Main.java | 50 ++++++++++++++++++++-- .../com/google/devtools/build/importdeps/BUILD | 29 +++++++++---- .../build/importdeps/ImportDepsCheckerTest.java | 1 + .../google/devtools/build/importdeps/MainTest.java | 9 +++- .../com/google/devtools/build/importdeps/tests.bzl | 4 +- 5 files changed, 78 insertions(+), 15 deletions(-) (limited to 'src/java_tools') diff --git a/src/java_tools/import_deps_checker/java/com/google/devtools/build/importdeps/Main.java b/src/java_tools/import_deps_checker/java/com/google/devtools/build/importdeps/Main.java index 5df2eaa04d..3726caed30 100644 --- a/src/java_tools/import_deps_checker/java/com/google/devtools/build/importdeps/Main.java +++ b/src/java_tools/import_deps_checker/java/com/google/devtools/build/importdeps/Main.java @@ -21,6 +21,7 @@ import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.ImmutableList; import com.google.devtools.build.lib.view.proto.Deps.Dependencies; import com.google.devtools.common.options.Converter; +import com.google.devtools.common.options.EnumConverter; import com.google.devtools.common.options.Option; import com.google.devtools.common.options.OptionDocumentationCategory; import com.google.devtools.common.options.OptionEffectTag; @@ -116,14 +117,26 @@ public class Main { help = "The rule label of the current target under analysis.") public String ruleLabel; + // TODO (cnsun): remove this flag. @Option( name = "fail_on_errors", - defaultValue = "true", + defaultValue = "false", documentationCategory = OptionDocumentationCategory.UNDOCUMENTED, effectTags = {OptionEffectTag.UNKNOWN}, + deprecationWarning = "This will be replaced with --checking_mode.", help = "Fail on incomplete dependencies, otherwise emit warnings." ) public boolean failOnErrors; + + @Option( + name = "checking_mode", + defaultValue = "null", + documentationCategory = OptionDocumentationCategory.UNDOCUMENTED, + effectTags = {OptionEffectTag.UNKNOWN}, + converter = CheckingModeConverter.class, + help = "Controls the behavior of the checker." + ) + public CheckingMode checkingMode; } /** A randomly picked large exit code to avoid collision with other common exit codes. */ @@ -147,10 +160,10 @@ public class Main { ImmutableList.copyOf(options.bootclasspath), ImmutableList.copyOf(options.classpath), ImmutableList.copyOf(options.inputJars))) { - if (!checker.check()) { + if (!checker.check() && options.checkingMode != CheckingMode.SILENCE) { String result = checker.computeResultOutput(); checkState(!result.isEmpty(), "The result should NOT be empty."); - exitCode = options.failOnErrors ? DEPS_ERROR_EXIT_CODE : 0; + exitCode = options.checkingMode == CheckingMode.ERROR ? DEPS_ERROR_EXIT_CODE : 0; printErrorMessage(result, options); asCharSink(options.output, StandardCharsets.UTF_8).write(result); } @@ -166,7 +179,9 @@ public class Main { } private static void printErrorMessage(String detailedErrorMessage, Options options) { - System.err.print(options.failOnErrors ? "ERROR" : "WARNING"); + checkArgument( + options.checkingMode == CheckingMode.ERROR || options.checkingMode == CheckingMode.WARNING); + System.err.print(options.checkingMode == CheckingMode.ERROR ? "ERROR" : "WARNING"); System.err.printf( ": The dependencies for the following %d jar(s) are not complete.\n", options.inputJars.size()); @@ -194,6 +209,11 @@ public class Main { options.jdepsOutput == null || !Files.isDirectory(options.jdepsOutput), "Invalid value of --jdeps_output: '%s'", options.jdepsOutput); + if (options.checkingMode == null) { + // Convert --fail_on_errors to --checking_mode + options.checkingMode = options.failOnErrors ? CheckingMode.ERROR : CheckingMode.WARNING; + } + return options; } @@ -239,4 +259,26 @@ public class Main { super(true); } } + + /** Converter for {@link CheckingMode} */ + public static class CheckingModeConverter extends EnumConverter { + public CheckingModeConverter() { + super(CheckingMode.class, "The checking mode for the dependency checker."); + } + } + + /** + * The checking mode of the dependency checker. + */ + public enum CheckingMode { + /** Emit 'errors' on missing or incomplete dependencies. */ + ERROR, + /** Emit 'warnings' on missing or incomplete dependencies. */ + WARNING, + /** + * Emit 'nothing' on missing or incomplete dependencies. This is mainly used to dump jdeps + * protos. + */ + SILENCE + } } diff --git a/src/java_tools/import_deps_checker/javatests/com/google/devtools/build/importdeps/BUILD b/src/java_tools/import_deps_checker/javatests/com/google/devtools/build/importdeps/BUILD index a874588626..629647b143 100644 --- a/src/java_tools/import_deps_checker/javatests/com/google/devtools/build/importdeps/BUILD +++ b/src/java_tools/import_deps_checker/javatests/com/google/devtools/build/importdeps/BUILD @@ -131,8 +131,8 @@ create_golden_test( create_golden_test( name = "warn_on_bootclasspath_missing_golden_test", + checking_mode = "warning", expect_errors = False, - fail_on_errors = False, golden_output_file = "golden_bootclasspath_missing.txt", golden_stderr_file = "golden_bootclasspath_missing.stderr.warningtxt", has_bootclasspath = False, @@ -142,10 +142,23 @@ create_golden_test( testdata_pkg = "//src/java_tools/import_deps_checker/javatests/com/google/devtools/build/importdeps/testdata", ) +create_golden_test( + name = "silent_on_bootclasspath_missing_golden_test", + checking_mode = "silence", + expect_errors = False, + golden_output_file = "golden_complete_classpath.txt", + golden_stderr_file = "golden_complete_classpath.stderr.txt", + has_bootclasspath = False, + import_deps_checker = "//src/java_tools/import_deps_checker/java/com/google/devtools/build/importdeps:ImportDepsChecker", + missing_jar = None, + rt_jar = "@local_jdk//:jre/lib/rt.jar", + testdata_pkg = "//src/java_tools/import_deps_checker/javatests/com/google/devtools/build/importdeps/testdata", +) + create_golden_test( name = "library_exception_missing_golden_test", + checking_mode = "error", expect_errors = True, - fail_on_errors = True, golden_output_file = "golden_library_exception_missing.txt", golden_stderr_file = "golden_library_exception_missing.stderr.txt", has_bootclasspath = True, @@ -157,8 +170,8 @@ create_golden_test( create_golden_test( name = "library_annotation_missing_golden_test", + checking_mode = "error", expect_errors = True, - fail_on_errors = True, golden_output_file = "golden_library_annotation_missing.txt", golden_stderr_file = "golden_library_annotation_missing.stderr.txt", has_bootclasspath = True, @@ -170,8 +183,8 @@ create_golden_test( create_golden_test( name = "library_missing_golden_test", + checking_mode = "error", expect_errors = True, - fail_on_errors = True, golden_output_file = "golden_library_missing.txt", golden_stderr_file = "golden_library_missing.stderr.txt", has_bootclasspath = True, @@ -183,8 +196,8 @@ create_golden_test( create_golden_test( name = "library_interface_missing_golden_test", + checking_mode = "error", expect_errors = True, - fail_on_errors = True, golden_output_file = "golden_library_interface_missing.txt", golden_stderr_file = "golden_library_interface_missing.stderr.txt", has_bootclasspath = True, @@ -196,8 +209,8 @@ create_golden_test( create_golden_test( name = "library_members_missing_golden_test", + checking_mode = "error", expect_errors = True, - fail_on_errors = True, golden_output_file = "golden_library_members_missing.txt", golden_stderr_file = "golden_library_members_missing.stderr.txt", has_bootclasspath = True, @@ -210,8 +223,8 @@ create_golden_test( create_golden_test( name = "complete_classpath_golden_test", + checking_mode = "error", expect_errors = False, - fail_on_errors = True, golden_output_file = "golden_complete_classpath.txt", golden_stderr_file = "golden_complete_classpath.stderr.txt", has_bootclasspath = True, @@ -246,7 +259,7 @@ sh_test( "$(location golden_string_annotation_value_test.stderr.txt)", "199", "$(location //third_party/bazel/src/java_tools/import_deps_checker/java/com/google/devtools/build/importdeps:ImportDepsChecker)", - "--fail_on_errors", + "--checking_mode=error", "--bootclasspath_entry", "$(location :libempty.jar)", "--classpath_entry", diff --git a/src/java_tools/import_deps_checker/javatests/com/google/devtools/build/importdeps/ImportDepsCheckerTest.java b/src/java_tools/import_deps_checker/javatests/com/google/devtools/build/importdeps/ImportDepsCheckerTest.java index 8d92a8fe19..a42b860623 100644 --- a/src/java_tools/import_deps_checker/javatests/com/google/devtools/build/importdeps/ImportDepsCheckerTest.java +++ b/src/java_tools/import_deps_checker/javatests/com/google/devtools/build/importdeps/ImportDepsCheckerTest.java @@ -134,6 +134,7 @@ public class ImportDepsCheckerTest extends AbstractClassCacheTest { args.add("--output"); args.add(Files.createTempFile("temp_output", ".txt").toString()); + args.add("--checking_mode=silence"); Main.checkDeps(args.toArray(new String[0])); try (InputStream inputStream = Files.newInputStream(jdepsFile)) { diff --git a/src/java_tools/import_deps_checker/javatests/com/google/devtools/build/importdeps/MainTest.java b/src/java_tools/import_deps_checker/javatests/com/google/devtools/build/importdeps/MainTest.java index e5bcb446e1..2bd7dc5411 100644 --- a/src/java_tools/import_deps_checker/javatests/com/google/devtools/build/importdeps/MainTest.java +++ b/src/java_tools/import_deps_checker/javatests/com/google/devtools/build/importdeps/MainTest.java @@ -38,7 +38,14 @@ public final class MainTest { IllegalArgumentException.class, () -> Main.parseCommandLineOptions( - new String[] {"--classpath_entry", lib.toString(), "--input", in.toString()})); + new String[] { + "--bootclasspath_entry", + lib.toString(), + "--classpath_entry", + lib.toString(), + "--input", + in.toString() + })); assertThat(thrown).hasMessageThat().contains("--output"); } } diff --git a/src/java_tools/import_deps_checker/javatests/com/google/devtools/build/importdeps/tests.bzl b/src/java_tools/import_deps_checker/javatests/com/google/devtools/build/importdeps/tests.bzl index 1d045fc52a..a777bcfc66 100644 --- a/src/java_tools/import_deps_checker/javatests/com/google/devtools/build/importdeps/tests.bzl +++ b/src/java_tools/import_deps_checker/javatests/com/google/devtools/build/importdeps/tests.bzl @@ -13,7 +13,7 @@ # limitations under the License. '''Helpers to create golden tests, to minimize code duplication.''' -def create_golden_test(name, golden_output_file, golden_stderr_file, expect_errors, fail_on_errors, +def create_golden_test(name, golden_output_file, golden_stderr_file, expect_errors, checking_mode, has_bootclasspath, testdata_pkg, import_deps_checker, rt_jar, missing_jar = None, replacing_jar = None): '''Create a golden test for the dependency checker.''' @@ -40,7 +40,7 @@ def create_golden_test(name, golden_output_file, golden_stderr_file, expect_erro # The exit code 199 means the checker emits errors on dependency issues. "199" if expect_errors else "0", "$(location %s)" % import_deps_checker, - "--fail_on_errors" if fail_on_errors else "--nofail_on_errors" + "--checking_mode=%s" % checking_mode, ] args.append("--bootclasspath_entry") if has_bootclasspath: -- cgit v1.2.3