Improve JniAbort (and JNI tests).

This has been on my to-do list for a while, but it actually bit people
in the ass yesterday. This change enables us to write a lot more (and
better) tests, but for now I've just improved the tests that already
existed.

Change-Id: I04a18656de60b47e5a6b5777204c144209d1448e
diff --git a/src/jni_internal_test.cc b/src/jni_internal_test.cc
index 2ca2b3c..9383db3 100644
--- a/src/jni_internal_test.cc
+++ b/src/jni_internal_test.cc
@@ -547,28 +547,33 @@
   EXPECT_CLASS_FOUND("java/lang/String");
   // ...for arrays too, where you must include "L;".
   EXPECT_CLASS_FOUND("[Ljava/lang/String;");
+  // Primitive arrays are okay too, if the primitive type is valid.
+  EXPECT_CLASS_FOUND("[C");
 
   {
-    CheckJniAbortCatcher check_jni_abort_catcher;
-
     // We support . as well as / for compatibility, if -Xcheck:jni is off.
+    CheckJniAbortCatcher check_jni_abort_catcher;
     EXPECT_CLASS_FOUND("java.lang.String");
+    check_jni_abort_catcher.Check("JNI ERROR: app bug found: illegal class name 'java.lang.String'");
     EXPECT_CLASS_NOT_FOUND("Ljava.lang.String;");
+    check_jni_abort_catcher.Check("JNI ERROR: app bug found: illegal class name 'Ljava.lang.String;'");
     EXPECT_CLASS_FOUND("[Ljava.lang.String;");
+    check_jni_abort_catcher.Check("JNI ERROR: app bug found: illegal class name '[Ljava.lang.String;'");
     EXPECT_CLASS_NOT_FOUND("[java.lang.String");
+    check_jni_abort_catcher.Check("JNI ERROR: app bug found: illegal class name '[java.lang.String'");
 
     // You can't include the "L;" in a JNI class descriptor.
     EXPECT_CLASS_NOT_FOUND("Ljava/lang/String;");
+    check_jni_abort_catcher.Check("JNI ERROR: app bug found: illegal class name 'Ljava/lang/String;'");
+
     // But you must include it for an array of any reference type.
     EXPECT_CLASS_NOT_FOUND("[java/lang/String");
+    check_jni_abort_catcher.Check("JNI ERROR: app bug found: illegal class name '[java/lang/String'");
+
+    EXPECT_CLASS_NOT_FOUND("[K");
+    check_jni_abort_catcher.Check("JNI ERROR: app bug found: illegal class name '[K'");
   }
 
-  // Primitive arrays are okay (if the primitive type is valid)...
-  EXPECT_CLASS_FOUND("[C");
-  {
-    CheckJniAbortCatcher check_jni_abort_catcher;
-    EXPECT_CLASS_NOT_FOUND("[K");
-  }
   // But primitive types aren't allowed...
   EXPECT_CLASS_NOT_FOUND("C");
   EXPECT_CLASS_NOT_FOUND("K");
@@ -1022,10 +1027,11 @@
 }
 
 TEST_F(JniInternalTest, GetStringUTFChars_ReleaseStringUTFChars) {
+  // Passing in a NULL jstring is ignored normally, but caught by -Xcheck:jni.
   {
-    // Passing in a NULL jstring is ignored normally, but caught by -Xcheck:jni.
     CheckJniAbortCatcher check_jni_abort_catcher;
     EXPECT_TRUE(env_->GetStringUTFChars(NULL, NULL) == NULL);
+    check_jni_abort_catcher.Check("JNI ERROR: app bug found: GetStringUTFChars received null jstring");
   }
 
   jstring s = env_->NewStringUTF("hello");
@@ -1217,10 +1223,11 @@
   ASSERT_TRUE(s != NULL);
   env_->DeleteLocalRef(s);
 
+  // Currently, deleting an already-deleted reference is just a CheckJNI warning.
   {
-    // Currently, deleting an already-deleted reference is just a CheckJNI warning.
     CheckJniAbortCatcher check_jni_abort_catcher;
     env_->DeleteLocalRef(s);
+    check_jni_abort_catcher.Check("JNI ERROR: app bug found: native code passing in reference to invalid local reference: 0x200001");
   }
 
   s = env_->NewStringUTF("");
@@ -1296,10 +1303,11 @@
   ASSERT_TRUE(o != NULL);
   env_->DeleteGlobalRef(o);
 
+  // Currently, deleting an already-deleted reference is just a CheckJNI warning.
   {
-    // Currently, deleting an already-deleted reference is just a CheckJNI warning.
     CheckJniAbortCatcher check_jni_abort_catcher;
     env_->DeleteGlobalRef(o);
+    check_jni_abort_catcher.Check("JNI ERROR: app bug found: native code passing in reference to invalid global reference: 0x10000e");
   }
 
   jobject o1 = env_->NewGlobalRef(s);
@@ -1337,10 +1345,11 @@
   ASSERT_TRUE(o != NULL);
   env_->DeleteWeakGlobalRef(o);
 
+  // Currently, deleting an already-deleted reference is just a CheckJNI warning.
   {
-    // Currently, deleting an already-deleted reference is just a CheckJNI warning.
     CheckJniAbortCatcher check_jni_abort_catcher;
     env_->DeleteWeakGlobalRef(o);
+    check_jni_abort_catcher.Check("JNI ERROR: app bug found: native code passing in reference to invalid weak global reference: 0x100003");
   }
 
   jobject o1 = env_->NewWeakGlobalRef(s);
@@ -1566,10 +1575,7 @@
     CheckJniAbortCatcher check_jni_abort_catcher;
     env_->MonitorEnter(NULL);
     check_jni_abort_catcher.Check("in call to MonitorEnter");
-  }
 
-  {
-    CheckJniAbortCatcher check_jni_abort_catcher;
     env_->MonitorExit(NULL);
     check_jni_abort_catcher.Check("in call to MonitorExit");
   }