diff options
author | elenairina <elenairina@google.com> | 2017-12-01 05:51:04 -0800 |
---|---|---|
committer | Copybara-Service <copybara-piper@google.com> | 2017-12-01 05:53:06 -0800 |
commit | 49008a3c90e65bc4abf5292af823a931b8f4e096 (patch) | |
tree | 0896c007b16fe2ad6fc8d9bdfde11c73e997b34d | |
parent | 9c97bf96f794e2bea6fcb7fe240a64b3e605e292 (diff) |
Avoid NPEs when providers are not found in JavaInfo.
Fixes #4173.
RELNOTES: None.
PiperOrigin-RevId: 177582228
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/java/JavaInfo.java | 44 | ||||
-rw-r--r-- | src/test/java/com/google/devtools/build/lib/rules/java/JavaInfoTest.java | 53 |
2 files changed, 79 insertions, 18 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfo.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfo.java index d93f4ba52c..7a6815c2fc 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfo.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfo.java @@ -49,6 +49,8 @@ public final class JavaInfo extends NativeInfo { public static final NativeProvider<JavaInfo> PROVIDER = new NativeProvider<JavaInfo>(JavaInfo.class, "JavaInfo") {}; + public static final JavaInfo EMPTY = JavaInfo.Builder.create().build(); + private static final ImmutableSet<Class<? extends TransitiveInfoProvider>> ALLOWED_PROVIDERS = ImmutableSet.of( JavaCompilationArgsProvider.class, @@ -207,10 +209,11 @@ public final class JavaInfo extends NativeInfo { structField = true ) public SkylarkNestedSet getTransitiveRuntimeJars() { - return SkylarkNestedSet.of( - Artifact.class, - providers.getProvider(JavaCompilationArgsProvider.class) - .getRecursiveJavaCompilationArgs().getRuntimeJars()); + JavaCompilationArgsProvider provider = getProvider(JavaCompilationArgsProvider.class); + NestedSet<Artifact> runtimeJars = provider == null + ? NestedSetBuilder.<Artifact>stableOrder().build() + : provider.getRecursiveJavaCompilationArgs().getRuntimeJars(); + return SkylarkNestedSet.of(Artifact.class, runtimeJars); } @SkylarkCallable( @@ -220,10 +223,11 @@ public final class JavaInfo extends NativeInfo { structField = true ) public SkylarkNestedSet getTransitiveCompileTimeJars() { - return SkylarkNestedSet.of( - Artifact.class, - providers.getProvider(JavaCompilationArgsProvider.class) - .getRecursiveJavaCompilationArgs().getCompileTimeJars()); + JavaCompilationArgsProvider provider = getProvider(JavaCompilationArgsProvider.class); + NestedSet<Artifact> compileTimeJars = provider == null + ? NestedSetBuilder.<Artifact>stableOrder().build() + : provider.getRecursiveJavaCompilationArgs().getCompileTimeJars(); + return SkylarkNestedSet.of(Artifact.class, compileTimeJars); } @SkylarkCallable( @@ -238,10 +242,11 @@ public final class JavaInfo extends NativeInfo { structField = true ) public SkylarkNestedSet getCompileTimeJars() { - return SkylarkNestedSet.of( - Artifact.class, - providers.getProvider(JavaCompilationArgsProvider.class) - .getJavaCompilationArgs().getCompileTimeJars()); + JavaCompilationArgsProvider provider = getProvider(JavaCompilationArgsProvider.class); + NestedSet<Artifact> compileTimeJars = provider == null + ? NestedSetBuilder.<Artifact>stableOrder().build() + : provider.getJavaCompilationArgs().getCompileTimeJars(); + return SkylarkNestedSet.of(Artifact.class, compileTimeJars); } @SkylarkCallable( @@ -255,10 +260,11 @@ public final class JavaInfo extends NativeInfo { structField = true ) public SkylarkNestedSet getFullCompileTimeJars() { - return SkylarkNestedSet.of( - Artifact.class, - providers.getProvider(JavaCompilationArgsProvider.class) - .getJavaCompilationArgs().getFullCompileTimeJars()); + JavaCompilationArgsProvider provider = getProvider(JavaCompilationArgsProvider.class); + NestedSet<Artifact> fullCompileTimeJars = provider == null + ? NestedSetBuilder.<Artifact>stableOrder().build() + : provider.getJavaCompilationArgs().getFullCompileTimeJars(); + return SkylarkNestedSet.of(Artifact.class, fullCompileTimeJars); } @SkylarkCallable( @@ -269,8 +275,10 @@ public final class JavaInfo extends NativeInfo { structField = true ) public SkylarkList<Artifact> getSourceJars() { - return SkylarkList.createImmutable( - providers.getProvider(JavaSourceJarsProvider.class).getSourceJars()); + JavaSourceJarsProvider provider = providers.getProvider(JavaSourceJarsProvider.class); + ImmutableList<Artifact> sourceJars = + provider == null ? ImmutableList.of() : provider.getSourceJars(); + return SkylarkList.createImmutable(sourceJars); } @SkylarkCallable( diff --git a/src/test/java/com/google/devtools/build/lib/rules/java/JavaInfoTest.java b/src/test/java/com/google/devtools/build/lib/rules/java/JavaInfoTest.java new file mode 100644 index 0000000000..6d2c5b471b --- /dev/null +++ b/src/test/java/com/google/devtools/build/lib/rules/java/JavaInfoTest.java @@ -0,0 +1,53 @@ +// Copyright 2017 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. + +package com.google.devtools.build.lib.rules.java; + +import static com.google.common.truth.Truth.assertThat; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +/** + * Unit tests for {@link JavaInfo}. + */ +@RunWith(JUnit4.class) +public class JavaInfoTest { + + @Test + public void getTransitiveRuntimeJars_noJavaCompilationArgsProvider() { + assertThat(JavaInfo.EMPTY.getTransitiveRuntimeJars().isEmpty()).isTrue(); + } + + @Test + public void getTransitiveCompileTimeJarsJars_noJavaCompilationArgsProvider() { + assertThat(JavaInfo.EMPTY.getTransitiveCompileTimeJars().isEmpty()).isTrue(); + } + + @Test + public void getCompileTimeJarsJars_noJavaCompilationArgsProvider() { + assertThat(JavaInfo.EMPTY.getCompileTimeJars().isEmpty()).isTrue(); + } + + @Test + public void getFullCompileTimeJarsJars_noJavaCompilationArgsProvider() { + assertThat(JavaInfo.EMPTY.getFullCompileTimeJars().isEmpty()).isTrue(); + } + + @Test + public void getSourceJars_noJavaSourceJarsProvider() { + assertThat(JavaInfo.EMPTY.getSourceJars()).isEmpty(); + } +} |