Skip to content

Commit

Permalink
Avoid NPEs when providers are not found in JavaInfo.
Browse files Browse the repository at this point in the history
Fixes #4173.

RELNOTES: None.
PiperOrigin-RevId: 177582228
  • Loading branch information
iirina authored and Copybara-Service committed Dec 1, 2017
1 parent 9c97bf9 commit 49008a3
Show file tree
Hide file tree
Showing 2 changed files with 79 additions and 18 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -207,10 +209,11 @@ private JavaInfo(TransitiveInfoProviderMap providers) {
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(
Expand All @@ -220,10 +223,11 @@ public SkylarkNestedSet getTransitiveRuntimeJars() {
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(
Expand All @@ -238,10 +242,11 @@ public SkylarkNestedSet getTransitiveCompileTimeJars() {
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(
Expand All @@ -255,10 +260,11 @@ public SkylarkNestedSet getCompileTimeJars() {
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(
Expand All @@ -269,8 +275,10 @@ public SkylarkNestedSet getFullCompileTimeJars() {
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(
Expand Down
Original file line number Diff line number Diff line change
@@ -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();
}
}

0 comments on commit 49008a3

Please sign in to comment.