aboutsummaryrefslogtreecommitdiff
path: root/third_party
diff options
context:
space:
mode:
authorAlexander Dorokhine <adorokhine@google.com>2017-02-03 23:22:19 -0800
committerGitHub <noreply@github.com>2017-02-03 23:22:19 -0800
commit98a2346c2cf8e55b1e29a1a566f2656ac1fac910 (patch)
tree303bb007d2136fe904a2aa9a6222a24fe587fa2b /third_party
parent03478b839c4dbef91869c617eba6410e3fba2ecc (diff)
downloadmobly-snippet-lib-98a2346c2cf8e55b1e29a1a566f2656ac1fac910.tar.gz
Fix exception handling in snippets. (#32)
* Don't try to call methods on snippet classes that couldn't be constructed * Don't obscure the cause of exceptions * Propagate the entire stack trace to the python side * Decorate the stacktrace
Diffstat (limited to 'third_party')
-rw-r--r--third_party/sl4a/src/main/java/com/google/android/mobly/snippet/manager/SnippetManager.java24
-rw-r--r--third_party/sl4a/src/main/java/com/google/android/mobly/snippet/rpc/JsonRpcResult.java10
-rw-r--r--third_party/sl4a/src/main/java/com/google/android/mobly/snippet/rpc/MethodDescriptor.java12
3 files changed, 22 insertions, 24 deletions
diff --git a/third_party/sl4a/src/main/java/com/google/android/mobly/snippet/manager/SnippetManager.java b/third_party/sl4a/src/main/java/com/google/android/mobly/snippet/manager/SnippetManager.java
index edb872b..e27c473 100644
--- a/third_party/sl4a/src/main/java/com/google/android/mobly/snippet/manager/SnippetManager.java
+++ b/third_party/sl4a/src/main/java/com/google/android/mobly/snippet/manager/SnippetManager.java
@@ -19,6 +19,7 @@ package com.google.android.mobly.snippet.manager;
import android.os.Build;
import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.HashMap;
@@ -63,7 +64,7 @@ public class SnippetManager {
}
public Object invoke(Class<? extends Snippet> clazz, Method method, Object[] args)
- throws Exception {
+ throws Throwable {
if (method.isAnnotationPresent(RpcMinSdk.class)) {
int requiredSdkLevel = method.getAnnotation(RpcMinSdk.class).value();
if (Build.VERSION.SDK_INT < requiredSdkLevel) {
@@ -72,8 +73,12 @@ public class SnippetManager {
method.getName(), requiredSdkLevel, Build.VERSION.SDK_INT));
}
}
- Snippet object = get(clazz);
- return method.invoke(object, args);
+ try {
+ Snippet object = get(clazz);
+ return method.invoke(object, args);
+ } catch (InvocationTargetException e) {
+ throw e.getCause();
+ }
}
public void shutdown() {
@@ -88,21 +93,16 @@ public class SnippetManager {
}
}
- private Snippet get(Class<? extends Snippet> clazz) {
+ private Snippet get(Class<? extends Snippet> clazz) throws Exception {
Snippet object = mReceivers.get(clazz);
if (object != null) {
return object;
}
Constructor<? extends Snippet> constructor;
- try {
- constructor = clazz.getConstructor();
- object = constructor.newInstance();
- mReceivers.put(clazz, object);
- } catch (Exception e) {
- Log.e(e);
- }
-
+ constructor = clazz.getConstructor();
+ object = constructor.newInstance();
+ mReceivers.put(clazz, object);
return object;
}
}
diff --git a/third_party/sl4a/src/main/java/com/google/android/mobly/snippet/rpc/JsonRpcResult.java b/third_party/sl4a/src/main/java/com/google/android/mobly/snippet/rpc/JsonRpcResult.java
index 0c1d0f2..ce02344 100644
--- a/third_party/sl4a/src/main/java/com/google/android/mobly/snippet/rpc/JsonRpcResult.java
+++ b/third_party/sl4a/src/main/java/com/google/android/mobly/snippet/rpc/JsonRpcResult.java
@@ -16,6 +16,8 @@
package com.google.android.mobly.snippet.rpc;
+import java.io.PrintWriter;
+import java.io.StringWriter;
import org.json.JSONException;
import org.json.JSONObject;
@@ -48,10 +50,16 @@ public class JsonRpcResult {
}
public static JSONObject error(int id, Throwable t) throws JSONException {
+ StringWriter stackTraceWriter = new StringWriter();
+ stackTraceWriter.write("\n-------------- Java Stacktrace ---------------\n");
+ t.printStackTrace(new PrintWriter(stackTraceWriter));
+ stackTraceWriter.write("----------------------------------------------");
+ String stackTrace = stackTraceWriter.toString();
+
JSONObject json = new JSONObject();
json.put("id", id);
json.put("result", JSONObject.NULL);
- json.put("error", t.toString());
+ json.put("error", stackTrace);
return json;
}
}
diff --git a/third_party/sl4a/src/main/java/com/google/android/mobly/snippet/rpc/MethodDescriptor.java b/third_party/sl4a/src/main/java/com/google/android/mobly/snippet/rpc/MethodDescriptor.java
index 8d18582..862278e 100644
--- a/third_party/sl4a/src/main/java/com/google/android/mobly/snippet/rpc/MethodDescriptor.java
+++ b/third_party/sl4a/src/main/java/com/google/android/mobly/snippet/rpc/MethodDescriptor.java
@@ -88,17 +88,7 @@ public final class MethodDescriptor {
}
}
- return invoke(manager, args);
- }
-
- private Object invoke(SnippetManager manager, Object[] args) throws Throwable {
- Object result;
- try {
- result = manager.invoke(mClass, mMethod, args);
- } catch (Throwable t) {
- throw t.getCause();
- }
- return result;
+ return manager.invoke(mClass, mMethod, args);
}
/**