Skip to content

Commit 8ea3629

Browse files
authored
Re-enable animalsniffer, fixing violations
In 61f19d7 I swapped the signatures to use the version catalog. But I failed to preserve the `@signature` extension and it all seemed to work... But in fact all the animalsniffer tasks were completing as SKIPPED as they lacked signatures. The build.gradle changes in this commit are to fix that while still using version catalog. But while it was broken violations crept in. Most violations weren't too important and we're not surprised went unnoticed. For example, Netty with TLS has long required the Java 8 API `setEndpointIdentificationAlgorithm()`, so using `Optional` in the same code path didn't harm anything in particular. I still swapped it to Guava's `Optional` to avoid overuse of `@IgnoreJRERequirement`. One important violation has not been fixed and instead I've disabled the android signature in api/build.gradle for the moment. The violation is in StatusException using the `fillInStackTrace` overload of Exception. This problem [had been noticed][PR11066], but we couldn't figure out what was going on. AnimalSniffer is now noticing this and agreeing with the internal linter. There is still a question of why our interop tests failed to notice this, but given they are no longer running on pre-API level 24, that may forever be a mystery. [PR11066]: #11066
1 parent f8f6139 commit 8ea3629

File tree

58 files changed

+329
-105
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

58 files changed

+329
-105
lines changed

alts/build.gradle

+5-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,11 @@ dependencies {
4444
classifier = "linux-x86_64"
4545
}
4646
}
47-
signature libraries.signature.java
47+
signature (libraries.signature.java) {
48+
artifact {
49+
extension = "signature"
50+
}
51+
}
4852
}
4953

5054
configureProtoCompilation()

api/BUILD.bazel

+1
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,6 @@ java_library(
1313
artifact("com.google.errorprone:error_prone_annotations"),
1414
artifact("com.google.guava:failureaccess"), # future transitive dep of Guava. See #5214
1515
artifact("com.google.guava:guava"),
16+
artifact("org.codehaus.mojo:animal-sniffer-annotations"),
1617
],
1718
)

api/build.gradle

+13-2
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ tasks.named("jar").configure {
3636
dependencies {
3737
compileOnly sourceSets.context.output
3838
api libraries.jsr305,
39+
libraries.animalsniffer.annotations,
3940
libraries.errorprone.annotations
4041
implementation libraries.guava
4142

@@ -48,8 +49,18 @@ dependencies {
4849
testImplementation project(':grpc-testing')
4950
testImplementation libraries.guava.testlib
5051

51-
signature libraries.signature.java
52-
signature libraries.signature.android
52+
signature (libraries.signature.java) {
53+
artifact {
54+
extension = "signature"
55+
}
56+
}
57+
// TODO: Temporarily disabled until StatusException is fixed.
58+
// Context: https://github.com/grpc/grpc-java/pull/11066
59+
//signature (libraries.signature.android) {
60+
// artifact {
61+
// extension = "signature"
62+
// }
63+
//}
5364
}
5465

5566
tasks.named("javadoc").configure {

api/src/main/java/io/grpc/TimeUtils.java

+2
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,12 @@
1717
package io.grpc;
1818

1919
import java.time.Duration;
20+
import org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement;
2021

2122
final class TimeUtils {
2223
private TimeUtils() {}
2324

25+
@IgnoreJRERequirement
2426
static long convertToNanos(Duration duration) {
2527
try {
2628
return duration.toNanos();

api/src/test/java/io/grpc/CallOptionsTest.java

+2
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import io.grpc.internal.SerializingExecutor;
3535
import java.time.Duration;
3636
import java.util.concurrent.Executor;
37+
import org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement;
3738
import org.junit.Test;
3839
import org.junit.runner.RunWith;
3940
import org.junit.runners.JUnit4;
@@ -152,6 +153,7 @@ public void withDeadlineAfter() {
152153
}
153154

154155
@Test
156+
@IgnoreJRERequirement
155157
public void withDeadlineAfterDuration() {
156158
Deadline actual = CallOptions.DEFAULT.withDeadlineAfter(Duration.ofMinutes(1L)).getDeadline();
157159
Deadline expected = Deadline.after(1, MINUTES);

api/src/test/java/io/grpc/SynchronizationContextTest.java

+4-1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import java.util.concurrent.TimeUnit;
3737
import java.util.concurrent.atomic.AtomicBoolean;
3838
import java.util.concurrent.atomic.AtomicReference;
39+
import org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement;
3940
import org.junit.After;
4041
import org.junit.Rule;
4142
import org.junit.Test;
@@ -248,6 +249,7 @@ public void schedule() {
248249
}
249250

250251
@Test
252+
@IgnoreJRERequirement
251253
public void scheduleDuration() {
252254
MockScheduledExecutorService executorService = new MockScheduledExecutorService();
253255
ScheduledHandle handle =
@@ -265,6 +267,7 @@ public void scheduleDuration() {
265267
}
266268

267269
@Test
270+
@IgnoreJRERequirement
268271
public void scheduleWithFixedDelayDuration() {
269272
MockScheduledExecutorService executorService = new MockScheduledExecutorService();
270273
ScheduledHandle handle =
@@ -402,4 +405,4 @@ static class MockScheduledExecutorService extends ForwardingScheduledExecutorSer
402405
return future = super.scheduleWithFixedDelay(command, intialDelay, delay, unit);
403406
}
404407
}
405-
}
408+
}

api/src/test/java/io/grpc/TimeUtilsTest.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,14 @@
1919
import static org.junit.Assert.assertEquals;
2020

2121
import java.time.Duration;
22+
import org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement;
2223
import org.junit.Test;
2324
import org.junit.runner.RunWith;
2425
import org.junit.runners.JUnit4;
2526

2627
/** Unit tests for {@link TimeUtils}. */
2728
@RunWith(JUnit4.class)
29+
@IgnoreJRERequirement
2830
public class TimeUtilsTest {
2931

3032
@Test
@@ -56,4 +58,4 @@ public void testConvertTooLargeNegativeDuration() {
5658

5759
assertEquals(Long.MIN_VALUE, TimeUtils.convertToNanos(duration));
5860
}
59-
}
61+
}

auth/build.gradle

+10-2
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,14 @@ dependencies {
2222
project(':grpc-core'),
2323
project(":grpc-context"), // Override google-auth dependency with our newer version
2424
libraries.google.auth.oauth2Http
25-
signature libraries.signature.java
26-
signature libraries.signature.android
25+
signature (libraries.signature.java) {
26+
artifact {
27+
extension = "signature"
28+
}
29+
}
30+
signature (libraries.signature.android) {
31+
artifact {
32+
extension = "signature"
33+
}
34+
}
2735
}

authz/build.gradle

+5-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,11 @@ dependencies {
2626
shadow configurations.implementation.getDependencies().minus([xdsDependency])
2727
shadow project(path: ':grpc-xds', configuration: 'shadow')
2828

29-
signature libraries.signature.java
29+
signature (libraries.signature.java) {
30+
artifact {
31+
extension = "signature"
32+
}
33+
}
3034
}
3135

3236
tasks.named("jar").configure {

benchmarks/build.gradle

+5-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,11 @@ dependencies {
4343
testImplementation libraries.junit,
4444
libraries.mockito.core
4545

46-
signature libraries.signature.java
46+
signature (libraries.signature.java) {
47+
artifact {
48+
extension = "signature"
49+
}
50+
}
4751
}
4852

4953
import net.ltgt.gradle.errorprone.CheckSeverity

census/build.gradle

+10-2
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,16 @@ dependencies {
2727
project(':grpc-testing'),
2828
libraries.opencensus.impl
2929

30-
signature libraries.signature.java
31-
signature libraries.signature.android
30+
signature (libraries.signature.java) {
31+
artifact {
32+
extension = "signature"
33+
}
34+
}
35+
signature (libraries.signature.android) {
36+
artifact {
37+
extension = "signature"
38+
}
39+
}
3240
}
3341

3442
tasks.named("javadoc").configure {

contextstorage/build.gradle

+10-2
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,16 @@ dependencies {
1616
libraries.assertj.core
1717
testImplementation 'junit:junit:4.13.1'// opentelemetry.sdk.testing uses compileOnly for assertj
1818

19-
signature libraries.signature.java
20-
signature libraries.signature.android
19+
signature (libraries.signature.java) {
20+
artifact {
21+
extension = "signature"
22+
}
23+
}
24+
signature (libraries.signature.android) {
25+
artifact {
26+
extension = "signature"
27+
}
28+
}
2129
}
2230

2331
tasks.named("jar").configure {

core/build.gradle

+10-2
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,16 @@ dependencies {
3939

4040
jmh project(':grpc-testing')
4141

42-
signature libraries.signature.java
43-
signature libraries.signature.android
42+
signature (libraries.signature.java) {
43+
artifact {
44+
extension = "signature"
45+
}
46+
}
47+
signature (libraries.signature.android) {
48+
artifact {
49+
extension = "signature"
50+
}
51+
}
4452
}
4553

4654
tasks.named("javadoc").configure {

core/src/main/java/io/grpc/internal/SpiffeUtil.java

+4-5
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,12 @@
2323
import com.google.common.base.Splitter;
2424
import com.google.common.collect.ImmutableList;
2525
import com.google.common.collect.ImmutableMap;
26+
import com.google.common.io.Files;
2627
import java.io.ByteArrayInputStream;
28+
import java.io.File;
2729
import java.io.IOException;
2830
import java.io.InputStream;
2931
import java.nio.charset.StandardCharsets;
30-
import java.nio.file.Files;
31-
import java.nio.file.Path;
32-
import java.nio.file.Paths;
3332
import java.security.cert.Certificate;
3433
import java.security.cert.CertificateException;
3534
import java.security.cert.CertificateFactory;
@@ -188,8 +187,8 @@ public static SpiffeBundle loadTrustBundleFromFile(String trustBundleFile) throw
188187
}
189188

190189
private static Map<String, ?> readTrustDomainsFromFile(String filePath) throws IOException {
191-
Path path = Paths.get(checkNotNull(filePath, "trustBundleFile"));
192-
String json = new String(Files.readAllBytes(path), StandardCharsets.UTF_8);
190+
File file = new File(checkNotNull(filePath, "trustBundleFile"));
191+
String json = new String(Files.toByteArray(file), StandardCharsets.UTF_8);
193192
Object jsonObject = JsonParser.parse(json);
194193
if (!(jsonObject instanceof Map)) {
195194
throw new IllegalArgumentException(

core/src/test/java/io/grpc/internal/ConcurrentTimeProviderTest.java

+2-5
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818

1919
import static com.google.common.truth.Truth.assertThat;
2020

21-
import java.time.Instant;
2221
import java.util.concurrent.TimeUnit;
2322
import org.junit.Test;
2423
import org.junit.runner.RunWith;
@@ -36,10 +35,8 @@ public void testConcurrentCurrentTimeNanos() {
3635
// Get the current time from the ConcurrentTimeProvider
3736
long actualTimeNanos = concurrentTimeProvider.currentTimeNanos();
3837

39-
// Get the current time from Instant for comparison
40-
Instant instantNow = Instant.now();
41-
long expectedTimeNanos = TimeUnit.SECONDS.toNanos(instantNow.getEpochSecond())
42-
+ instantNow.getNano();
38+
// Get the current time from System for comparison
39+
long expectedTimeNanos = TimeUnit.MILLISECONDS.toNanos(System.currentTimeMillis());
4340

4441
// Validate the time returned is close to the expected value within a tolerance
4542
// (i,e 10 millisecond tolerance in nanoseconds).

core/src/test/java/io/grpc/internal/InstantTimeProviderTest.java

+2
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
import java.time.Instant;
2222
import java.util.concurrent.TimeUnit;
23+
import org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement;
2324
import org.junit.Test;
2425
import org.junit.runner.RunWith;
2526
import org.junit.runners.JUnit4;
@@ -28,6 +29,7 @@
2829
* Unit tests for {@link InstantTimeProvider}.
2930
*/
3031
@RunWith(JUnit4.class)
32+
@IgnoreJRERequirement
3133
public class InstantTimeProviderTest {
3234
@Test
3335
public void testInstantCurrentTimeNanos() throws Exception {

core/src/test/java/io/grpc/internal/ManagedChannelImplTest.java

+5-2
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
import com.google.common.base.Throwables;
5858
import com.google.common.collect.ImmutableList;
5959
import com.google.common.collect.ImmutableMap;
60+
import com.google.common.collect.Iterables;
6061
import com.google.common.util.concurrent.ListenableFuture;
6162
import com.google.common.util.concurrent.MoreExecutors;
6263
import com.google.common.util.concurrent.SettableFuture;
@@ -1199,8 +1200,10 @@ public void addressResolutionError_noPriorNameResolution_usesDefaultServiceConfi
11991200
// config simply gets ignored and not gets reassigned.
12001201
resolver.resolved();
12011202
timer.forwardNanos(1234);
1202-
assertThat(getStats(channel).channelTrace.events.stream().filter(
1203-
event -> event.description.equals("Service config changed")).count()).isEqualTo(0);
1203+
assertThat(Iterables.filter(
1204+
getStats(channel).channelTrace.events,
1205+
event -> event.description.equals("Service config changed")))
1206+
.isEmpty();
12041207
}
12051208

12061209
@Test

core/src/test/java/io/grpc/internal/SpiffeUtilTest.java

+16-11
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,16 @@
2222
import static org.junit.Assert.assertTrue;
2323

2424
import com.google.common.base.Optional;
25+
import com.google.common.io.ByteStreams;
2526
import io.grpc.internal.SpiffeUtil.SpiffeBundle;
2627
import io.grpc.internal.SpiffeUtil.SpiffeId;
2728
import io.grpc.testing.TlsTesting;
2829
import io.grpc.util.CertificateUtils;
30+
import java.io.File;
31+
import java.io.FileNotFoundException;
32+
import java.io.FileOutputStream;
2933
import java.io.InputStream;
30-
import java.nio.file.Files;
31-
import java.nio.file.NoSuchFileException;
32-
import java.nio.file.Path;
33-
import java.nio.file.StandardCopyOption;
34+
import java.io.OutputStream;
3435
import java.security.cert.X509Certificate;
3536
import java.util.Arrays;
3637
import java.util.Collection;
@@ -247,12 +248,14 @@ public void setUp() throws Exception {
247248
}
248249

249250
private String copyFileToTmp(String fileName) throws Exception {
250-
Path tempFilePath = tempFolder.newFile(fileName).toPath();
251+
File tempFile = tempFolder.newFile(fileName);
251252
try (InputStream resourceStream = SpiffeUtilTest.class.getClassLoader()
252-
.getResourceAsStream(TEST_DIRECTORY_PREFIX + fileName)) {
253-
Files.copy(resourceStream, tempFilePath, StandardCopyOption.REPLACE_EXISTING);
253+
.getResourceAsStream(TEST_DIRECTORY_PREFIX + fileName);
254+
OutputStream fileStream = new FileOutputStream(tempFile)) {
255+
ByteStreams.copy(resourceStream, fileStream);
256+
fileStream.flush();
254257
}
255-
return tempFilePath.toString();
258+
return tempFile.toString();
256259
}
257260

258261
@Test
@@ -358,9 +361,11 @@ public void loadTrustBundleFromFileParameterValidityTest() {
358361
NullPointerException npe = assertThrows(NullPointerException.class, () -> SpiffeUtil
359362
.loadTrustBundleFromFile(null));
360363
assertEquals("trustBundleFile", npe.getMessage());
361-
NoSuchFileException nsfe = assertThrows(NoSuchFileException.class, () -> SpiffeUtil
364+
FileNotFoundException nsfe = assertThrows(FileNotFoundException.class, () -> SpiffeUtil
362365
.loadTrustBundleFromFile("i_do_not_exist"));
363-
assertEquals("i_do_not_exist", nsfe.getMessage());
366+
assertTrue(
367+
"Did not contain expected substring: " + nsfe.getMessage(),
368+
nsfe.getMessage().contains("i_do_not_exist"));
364369
}
365370
}
366-
}
371+
}

gae-interop-testing/gae-jdk8/build.gradle

+5-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,11 @@ dependencies {
5353
implementation libraries.junit
5454
implementation libraries.protobuf.java
5555
runtimeOnly libraries.netty.tcnative, libraries.netty.tcnative.classes
56-
signature libraries.signature.java
56+
signature (libraries.signature.java) {
57+
artifact {
58+
extension = "signature"
59+
}
60+
}
5761
}
5862

5963
tasks.named("compileJava").configure {

gcp-csm-observability/build.gradle

+5-1
Original file line numberDiff line numberDiff line change
@@ -28,5 +28,9 @@ dependencies {
2828
libraries.opentelemetry.sdk.testing,
2929
libraries.assertj.core // opentelemetry.sdk.testing uses compileOnly for this dep
3030

31-
signature libraries.signature.java
31+
signature (libraries.signature.java) {
32+
artifact {
33+
extension = "signature"
34+
}
35+
}
3236
}

0 commit comments

Comments
 (0)