Fix warning "Ignored return value"
Bug: 263456849
Test: atest compatibility-common-util-tests
Change-Id: Ibf40753622af771abac40e918aacbd011cd74edc
diff --git a/libraries/compatibility-common-util/Android.bp b/libraries/compatibility-common-util/Android.bp
index 892f5af..6095f31 100644
--- a/libraries/compatibility-common-util/Android.bp
+++ b/libraries/compatibility-common-util/Android.bp
@@ -24,6 +24,7 @@
srcs: ["src/**/*.java"],
static_libs: [
+ "error_prone_annotations",
"guava",
"junit",
],
@@ -39,6 +40,7 @@
srcs: ["src/**/*.java"],
host_supported: true,
libs: [
+ "error_prone_annotations",
"junit",
"guava",
"json-prebuilt",
diff --git a/libraries/compatibility-common-util/src/com/android/compatibility/common/util/BackupUtils.java b/libraries/compatibility-common-util/src/com/android/compatibility/common/util/BackupUtils.java
index c636427..9648e47 100644
--- a/libraries/compatibility-common-util/src/com/android/compatibility/common/util/BackupUtils.java
+++ b/libraries/compatibility-common-util/src/com/android/compatibility/common/util/BackupUtils.java
@@ -20,6 +20,8 @@
import static org.junit.Assert.fail;
import com.google.common.annotations.VisibleForTesting;
+import com.google.common.io.Closeables;
+import com.google.errorprone.annotations.CanIgnoreReturnValue;
import java.io.BufferedReader;
import java.io.IOException;
@@ -55,8 +57,9 @@
/**
* Kicks off adb shell {@param command} and return an {@link InputStream} with the command
- * output stream.
+ * output stream. The return value can be ignored and there might no need to close it.
*/
+ @CanIgnoreReturnValue
protected abstract InputStream executeShellCommand(String command) throws IOException;
public void executeShellCommandSync(String command) throws IOException {
@@ -64,7 +67,10 @@
}
public String getShellCommandOutput(String command) throws IOException {
- return StreamUtil.readInputStream(executeShellCommand(command));
+ InputStream inputStream = executeShellCommand(command);
+ String result = StreamUtil.readInputStream(inputStream);
+ Closeables.closeQuietly(inputStream);
+ return result;
}
/** Executes shell command "bmgr backupnow <package>" and assert success. */
@@ -268,6 +274,7 @@
while ((str = br.readLine()) != null) {
out.append(str).append("\n");
}
+ Closeables.closeQuietly(in);
return out.toString();
}
@@ -282,7 +289,7 @@
throw new RuntimeException("non-parsable output setting bmgr enabled: " + output);
}
- executeShellCommand("bmgr enable " + enable);
+ Closeables.closeQuietly(executeShellCommand("bmgr enable " + enable));
return previouslyEnabled;
}
@@ -291,7 +298,7 @@
*/
public boolean enableBackupForUser(boolean enable, int userId) throws IOException {
boolean previouslyEnabled = isBackupEnabledForUser(userId);
- executeShellCommand(String.format("bmgr --user %d enable %b", userId, enable));
+ executeShellCommandSync(String.format("bmgr --user %d enable %b", userId, enable));
return previouslyEnabled;
}
diff --git a/libraries/compatibility-common-util/src/com/android/compatibility/common/util/BusinessLogicExecutor.java b/libraries/compatibility-common-util/src/com/android/compatibility/common/util/BusinessLogicExecutor.java
index 8905fce..d72785e 100644
--- a/libraries/compatibility-common-util/src/com/android/compatibility/common/util/BusinessLogicExecutor.java
+++ b/libraries/compatibility-common-util/src/com/android/compatibility/common/util/BusinessLogicExecutor.java
@@ -16,6 +16,10 @@
package com.android.compatibility.common.util;
+import com.google.errorprone.annotations.CanIgnoreReturnValue;
+
+import org.junit.AssumptionViolatedException;
+
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
@@ -24,8 +28,6 @@
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-import org.junit.AssumptionViolatedException;
-
/**
* Resolves methods provided by the BusinessLogicService and invokes them
*/
@@ -120,15 +122,17 @@
/**
* Execute a business logic method.
+ *
* @param method the name of the method to invoke. Must include fully qualified name of the
- * enclosing class, followed by '.', followed by the name of the method
+ * enclosing class, followed by '.', followed by the name of the method
* @param args the string arguments to supply to the method
* @return the return value of the method invoked (type Boolean if method is a condition)
* @throws RuntimeException when failing to resolve or invoke the method
*/
- protected Object invokeMethod(String method, String... args) throws ClassNotFoundException,
- IllegalAccessException, InstantiationException, InvocationTargetException,
- NoSuchMethodException {
+ @CanIgnoreReturnValue
+ protected Object invokeMethod(String method, String... args)
+ throws ClassNotFoundException, IllegalAccessException, InstantiationException,
+ InvocationTargetException, NoSuchMethodException {
// Method names served by the BusinessLogic service should assume format
// classname.methodName, but also handle format classname#methodName since test names use
// this format
diff --git a/libraries/compatibility-common-util/src/com/android/compatibility/common/util/CrashUtils.java b/libraries/compatibility-common-util/src/com/android/compatibility/common/util/CrashUtils.java
index 5e0d127..49fdf6a 100644
--- a/libraries/compatibility-common-util/src/com/android/compatibility/common/util/CrashUtils.java
+++ b/libraries/compatibility-common-util/src/com/android/compatibility/common/util/CrashUtils.java
@@ -16,7 +16,14 @@
package com.android.compatibility.common.util;
+import com.google.errorprone.annotations.CanIgnoreReturnValue;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
import java.io.File;
+import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
@@ -27,10 +34,6 @@
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;
-import java.math.BigInteger;
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
/** Contains helper functions and shared constants for crash parsing. */
public class CrashUtils {
@@ -368,72 +371,99 @@
backtraceExcludes = new ArrayList();
}
+ /** Sets the min address. */
+ @CanIgnoreReturnValue
public Config setMinAddress(BigInteger minCrashAddress) {
this.minCrashAddress = minCrashAddress;
return this;
}
+ /** Check the min address. */
+ @CanIgnoreReturnValue
public Config checkMinAddress(boolean checkMinAddress) {
this.checkMinAddress = checkMinAddress;
return this;
}
+ /** Set the signals. */
+ @CanIgnoreReturnValue
public Config setSignals(String... signals) {
this.signals = new ArrayList(Arrays.asList(signals));
return this;
}
+ /** Appends signals. */
+ @CanIgnoreReturnValue
public Config appendSignals(String... signals) {
Collections.addAll(this.signals, signals);
return this;
}
+ /** Set the abort message includes. */
+ @CanIgnoreReturnValue
public Config setAbortMessageIncludes(String... abortMessages) {
this.abortMessageIncludes = new ArrayList<>(toPatterns(abortMessages));
return this;
}
+ /** Set the abort message includes. */
+ @CanIgnoreReturnValue
public Config setAbortMessageIncludes(Pattern... abortMessages) {
this.abortMessageIncludes = new ArrayList<>(Arrays.asList(abortMessages));
return this;
}
+ /** Appends the abort message includes. */
+ @CanIgnoreReturnValue
public Config appendAbortMessageIncludes(String... abortMessages) {
this.abortMessageIncludes.addAll(toPatterns(abortMessages));
return this;
}
+ /** Appends the abort message includes. */
+ @CanIgnoreReturnValue
public Config appendAbortMessageIncludes(Pattern... abortMessages) {
Collections.addAll(this.abortMessageIncludes, abortMessages);
return this;
}
+ /** Sets the abort message excludes. */
+ @CanIgnoreReturnValue
public Config setAbortMessageExcludes(String... abortMessages) {
this.abortMessageExcludes = new ArrayList<>(toPatterns(abortMessages));
return this;
}
+ /** Sets the abort message excludes. */
+ @CanIgnoreReturnValue
public Config setAbortMessageExcludes(Pattern... abortMessages) {
this.abortMessageExcludes = new ArrayList<>(Arrays.asList(abortMessages));
return this;
}
+ /** Appends the process patterns. */
+ @CanIgnoreReturnValue
public Config appendAbortMessageExcludes(String... abortMessages) {
this.abortMessageExcludes.addAll(toPatterns(abortMessages));
return this;
}
+ /** Appends the abort message excludes. */
+ @CanIgnoreReturnValue
public Config appendAbortMessageExcludes(Pattern... abortMessages) {
Collections.addAll(this.abortMessageExcludes, abortMessages);
return this;
}
-
+ /** Sets the process patterns. */
+ @CanIgnoreReturnValue
public Config setProcessPatterns(String... processPatternStrings) {
this.processPatterns = new ArrayList<>(toPatterns(processPatternStrings));
return this;
}
+ /** Sets the process patterns. */
+ @CanIgnoreReturnValue
public Config setProcessPatterns(Pattern... processPatterns) {
this.processPatterns = new ArrayList(Arrays.asList(processPatterns));
return this;
@@ -443,16 +473,22 @@
return Collections.unmodifiableList(processPatterns);
}
+ /** Appends the process patterns. */
+ @CanIgnoreReturnValue
public Config appendProcessPatterns(String... processPatternStrings) {
this.processPatterns.addAll(toPatterns(processPatternStrings));
return this;
}
+ /** Appends the process patterns. */
+ @CanIgnoreReturnValue
public Config appendProcessPatterns(Pattern... processPatterns) {
Collections.addAll(this.processPatterns, processPatterns);
return this;
}
+ /** Sets which backtraces should be included. */
+ @CanIgnoreReturnValue
public Config setBacktraceIncludes(BacktraceFilterPattern... patterns) {
this.backtraceIncludes = new ArrayList<>(Arrays.asList(patterns));
return this;
@@ -462,11 +498,15 @@
return Collections.unmodifiableList(this.backtraceIncludes);
}
+ /** Append which backtraces should be included. */
+ @CanIgnoreReturnValue
public Config appendBacktraceIncludes(BacktraceFilterPattern... patterns) {
Collections.addAll(this.backtraceIncludes, patterns);
return this;
}
+ /** Sets which backtraces should be excluded. */
+ @CanIgnoreReturnValue
public Config setBacktraceExcludes(BacktraceFilterPattern... patterns) {
this.backtraceExcludes = new ArrayList<>(Arrays.asList(patterns));
return this;
@@ -476,6 +516,8 @@
return Collections.unmodifiableList(this.backtraceExcludes);
}
+ /** Appends which backtraces should be excluded. */
+ @CanIgnoreReturnValue
public Config appendBacktraceExcludes(BacktraceFilterPattern... patterns) {
Collections.addAll(this.backtraceExcludes, patterns);
return this;
diff --git a/libraries/compatibility-common-util/src/com/android/compatibility/common/util/LogcatInspector.java b/libraries/compatibility-common-util/src/com/android/compatibility/common/util/LogcatInspector.java
index 4614f18..bd7b00c 100644
--- a/libraries/compatibility-common-util/src/com/android/compatibility/common/util/LogcatInspector.java
+++ b/libraries/compatibility-common-util/src/com/android/compatibility/common/util/LogcatInspector.java
@@ -32,7 +32,7 @@
*/
public String mark(String tag) throws IOException {
String uniqueString = ":::" + UUID.randomUUID().toString();
- executeShellCommand("log -t " + tag + " " + uniqueString);
+ Closeables.closeQuietly(executeShellCommand("log -t " + tag + " " + uniqueString));
// This is to guarantee that we only return after the string has been logged, otherwise
// in practice the case where calling Log.?(<message1>) right after clearAndMark() resulted
// in <message1> appearing before the unique identifier. It's not guaranteed per the docs
diff --git a/libraries/compatibility-common-util/src/com/android/compatibility/common/util/MultipartForm.java b/libraries/compatibility-common-util/src/com/android/compatibility/common/util/MultipartForm.java
index c311492..11e2c58 100644
--- a/libraries/compatibility-common-util/src/com/android/compatibility/common/util/MultipartForm.java
+++ b/libraries/compatibility-common-util/src/com/android/compatibility/common/util/MultipartForm.java
@@ -16,6 +16,8 @@
package com.android.compatibility.common.util;
+import com.google.errorprone.annotations.CanIgnoreReturnValue;
+
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
@@ -52,6 +54,7 @@
* @param value the attribute's value.
* @return the {@link MultipartForm} for easy chaining.
*/
+ @CanIgnoreReturnValue
public MultipartForm addFormValue(String name, String value) {
mFormValues.put(name, value);
return this;
@@ -65,6 +68,7 @@
* @param data The file's data
* @return the {@link MultipartForm} for easy chaining.
*/
+ @CanIgnoreReturnValue
public MultipartForm addFormFile(String name, String fileName, byte[] data) {
mName = name;
mFileName = fileName;
diff --git a/libraries/compatibility-common-util/src/com/android/compatibility/common/util/ReadElf.java b/libraries/compatibility-common-util/src/com/android/compatibility/common/util/ReadElf.java
index 2bd401d..138100f 100644
--- a/libraries/compatibility-common-util/src/com/android/compatibility/common/util/ReadElf.java
+++ b/libraries/compatibility-common-util/src/com/android/compatibility/common/util/ReadElf.java
@@ -16,6 +16,8 @@
package com.android.compatibility.common.util;
+import com.google.errorprone.annotations.CanIgnoreReturnValue;
+
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
@@ -1208,6 +1210,8 @@
return mFile.read() & 0xff;
}
+ /** Gets the symbol by name. */
+ @CanIgnoreReturnValue
public Symbol getSymbol(String name) {
if (mSymbols == null) {
try {
@@ -1227,6 +1231,8 @@
return mSymbols.get(name);
}
+ /** Gets a dynamic symbol by name. */
+ @CanIgnoreReturnValue
public Symbol getDynamicSymbol(String name) throws IOException {
if (mDynamicSymbols == null) {
try {
diff --git a/libraries/compatibility-common-util/src/com/android/compatibility/common/util/ResultHandler.java b/libraries/compatibility-common-util/src/com/android/compatibility/common/util/ResultHandler.java
index 2ed9a32..580cdf9 100644
--- a/libraries/compatibility-common-util/src/com/android/compatibility/common/util/ResultHandler.java
+++ b/libraries/compatibility-common-util/src/com/android/compatibility/common/util/ResultHandler.java
@@ -51,6 +51,7 @@
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
+
/**
* Handles conversion of results to/from files.
*
@@ -597,7 +598,7 @@
switch (retryStatus) {
case NotRetry: case RetryWithChecksum:
// Do not disrupt the process if there is a problem generating checksum.
- ChecksumReporter.tryCreateChecksum(resultDir, invocationResult);
+ boolean unused = ChecksumReporter.tryCreateChecksum(resultDir, invocationResult);
break;
case RetryWithoutChecksum:
// If the previous run has an invalid checksum file,