Improve structure setting tests for RS.

This change also adds a custom RSErrorHandler for tracking exceptional cases
from the driver.

Change-Id: I5cfc67aa880a4091583fbc2dd0330fc5df80d16b
diff --git a/tests/src/android/renderscript/cts/struct_pad.rs b/tests/src/android/renderscript/cts/struct_pad.rs
index 0c013a3..6556eb1 100644
--- a/tests/src/android/renderscript/cts/struct_pad.rs
+++ b/tests/src/android/renderscript/cts/struct_pad.rs
@@ -6,3 +6,18 @@
     int j;
 } s;
 
+void verify() {
+    bool failed = false;
+    _RS_ASSERT(s.i == 7);
+    _RS_ASSERT(s.f4.x == 1.0f);
+    _RS_ASSERT(s.f4.y == 2.0f);
+    _RS_ASSERT(s.f4.z == 3.0f);
+    _RS_ASSERT(s.f4.w == 4.0f);
+    _RS_ASSERT(s.j == 9);
+
+    if (failed) {
+        rsSendToClientBlocking(RS_MSG_TEST_FAILED);
+    } else {
+        rsSendToClientBlocking(RS_MSG_TEST_PASSED);
+    }
+}
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/RSBase.java b/tests/tests/renderscript/src/android/renderscript/cts/RSBase.java
index 56838e1..c51cfb8 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/RSBase.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/RSBase.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011 The Android Open Source Project
+ * Copyright (C) 2011-2012 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,8 +18,11 @@
 
 import android.content.Context;
 import android.content.res.Resources;
+import android.renderscript.RenderScript.RSErrorHandler;
 import android.renderscript.RenderScript.RSMessageHandler;
+import android.renderscript.RSRuntimeException;
 import android.test.AndroidTestCase;
+import android.util.Log;
 
 /**
  * Base RenderScript test class. This class provides a message handler and a
@@ -59,6 +62,16 @@
         }
     }
 
+    protected boolean FoundError = false;
+    protected RSErrorHandler mRsError = new RSErrorHandler() {
+        public void run() {
+            FoundError = true;
+            Log.e("RenderscriptCTS", mErrorMessage);
+            throw new RSRuntimeException("Received error " + mErrorNum +
+                                         " message " + mErrorMessage);
+        }
+    };
+
     @Override
     protected void setUp() throws Exception {
         super.setUp();
diff --git a/tests/tests/renderscript/src/android/renderscript/cts/StructPadTest.java b/tests/tests/renderscript/src/android/renderscript/cts/StructPadTest.java
index 884a0dc..58d6936 100644
--- a/tests/tests/renderscript/src/android/renderscript/cts/StructPadTest.java
+++ b/tests/tests/renderscript/src/android/renderscript/cts/StructPadTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011 The Android Open Source Project
+ * Copyright (C) 2011-2012 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -17,12 +17,17 @@
 package android.renderscript.cts;
 
 import android.renderscript.Float4;
+import com.android.cts.stub.R;
 
 public class StructPadTest extends RSBaseCompute {
     /**
      * Test for appropriate alignment/padding of structures.
      */
     public void testStructPadding() {
+        mRS.setErrorHandler(mRsError);
+        ScriptC_struct_pad pad = new ScriptC_struct_pad(mRS,
+                                                        mRes,
+                                                        R.raw.struct_pad);
         ScriptField_PadMe S = new ScriptField_PadMe(mRS, 1);
         Float4 F4 = new Float4(1.0f, 2.0f, 3.0f, 4.0f);
 
@@ -30,6 +35,16 @@
         S.set_f4(0, F4, true);
         S.set_j(0, 9, true);
 
+        ScriptField_PadMe.Item I = new ScriptField_PadMe.Item();
+        I.i = S.get_i(0);
+        I.f4 = S.get_f4(0);
+        I.j = S.get_j(0);
+
         S.set(new ScriptField_PadMe.Item(), 0, true);
+
+        pad.set_s(I);
+        pad.invoke_verify();
+        waitForMessage();
+        assertFalse(FoundError);
     }
 }