diff --git a/tests/cppbasic/compute.cpp b/tests/cppbasic/compute.cpp
index 471b10a..d1647c4 100644
--- a/tests/cppbasic/compute.cpp
+++ b/tests/cppbasic/compute.cpp
@@ -35,15 +35,62 @@
     sp<ScriptC_mono> sc = new ScriptC_mono(rs, NULL, 0);
     printf("new script\n");
 
+    // We read back the status from the script-side via a "failed" allocation.
+    sp<const Element> failed_e = Element::BOOLEAN(rs);
+    Type::Builder failed_tb(rs, failed_e);
+    failed_tb.setX(1);
+    sp<const Type> failed_t = failed_tb.create();
+    sp<Allocation> failed_alloc = Allocation::createTyped(rs, failed_t);
+    bool failed = false;
+    failed_alloc->copy1DRangeFrom(0, failed_t->getCount(), &failed);
+    sc->bind_failed(failed_alloc);
+
     uint32_t *buf = new uint32_t[t->getCount()];
     for (uint32_t ct=0; ct < t->getCount(); ct++) {
         buf[ct] = ct | (ct << 16);
     }
     ain->copy1DRangeFrom(0, t->getCount(), buf);
+    delete [] buf;
 
     sc->forEach_root(ain, aout);
+
+    sc->invoke_foo(99, 3.1f);
+    sc->set_g_f(39.9f);
+    sc->set_g_i(-14);
+    sc->invoke_foo(99, 3.1f);
     printf("for each done\n");
 
+    sc->invoke_bar(47, -3, 'c', -7, 14, -8);
+
+    // Verify a simple kernel.
+    {
+        sp<const Element> e = Element::I32(rs);
+        Type::Builder tb(rs, e);
+        tb.setX(5);
+        tb.setY(5);
+        sp<const Type> t = tb.create();
+        sp<Allocation> kern1_in = Allocation::createTyped(rs, t);
+        sp<Allocation> kern1_out = Allocation::createTyped(rs, t);
+
+        int *buf = new int[t->getCount()];
+        for (uint32_t ct=0; ct < t->getCount(); ct++) {
+            buf[ct] = 0;
+        }
+        kern1_in->copy1DFrom(buf);
+        delete [] buf;
+
+        sc->forEach_kern1(kern1_in, kern1_out);
+        sc->forEach_verify_kern1(kern1_out);
+
+        rs->finish();
+        failed_alloc->copy1DTo(&failed);
+
+        e.clear();
+        t.clear();
+        kern1_in.clear();
+        kern1_out.clear();
+    }
+
     printf("Deleting stuff\n");
     sc.clear();
     t.clear();
@@ -53,4 +100,12 @@
     aout.clear();
     //    delete rs;
     printf("Delete OK\n");
+
+    if (failed) {
+        printf("TEST FAILED!\n");
+    } else {
+        printf("TEST PASSED!\n");
+    }
+
+    return failed;
 }
diff --git a/tests/cppbasic/mono.rs b/tests/cppbasic/mono.rs
index c420cac..d49d0f7 100644
--- a/tests/cppbasic/mono.rs
+++ b/tests/cppbasic/mono.rs
@@ -18,8 +18,30 @@
 #pragma rs java_package_name(com.android.rs.image)
 #pragma rs_fp_relaxed
 
+int g_i = 4;
+
+float g_f = 5.9;
+
 const static float3 gMonoMult = {0.299f, 0.587f, 0.114f};
 
+bool *failed;
+
+#define _RS_ASSERT(b) \
+do { \
+    if (!(b)) { \
+        *failed = true; \
+        rsDebug(#b " FAILED", 0); \
+    } \
+\
+} while (0)
+
+struct myStruct {
+    int i;
+    int j;
+    float f;
+    char c[3];
+};
+
 void root(const uchar4 *v_in, uchar4 *v_out) {
     float4 f4 = rsUnpackColor8888(*v_in);
 
@@ -27,4 +49,28 @@
     *v_out = rsPackColorTo8888(mono);
 }
 
+void foo(int i, float f) {
+    rsDebug("g_i", g_i);
+    rsDebug("g_f", g_f);
+    rsDebug("i", i);
+    rsDebug("f", f);
+}
+
+void bar(int i, int j, char k, int l, int m, int n) {
+    _RS_ASSERT(i == 47);
+    _RS_ASSERT(j == -3);
+    _RS_ASSERT(k == 'c');
+    _RS_ASSERT(l == -7);
+    _RS_ASSERT(m == 14);
+    _RS_ASSERT(n == -8);
+}
+
+int __attribute__((kernel)) kern1(int i, uint32_t x, uint32_t y) {
+    return i + 10 * x + 100 *y;
+}
+
+void __attribute__((kernel)) verify_kern1(int i, uint32_t x, uint32_t y) {
+    _RS_ASSERT(i == (10 * x + 100 * y));
+    rsDebug("i ", i);
+}
 
