Provide better diagnostics on CTS failures.

Intializes the arrays to a non-zero value to help diagnose what is causing
the 0 return bug, i.e. is a zero found in b/22556317 because the buffer is
not copied or because it is copied and all null?

Also reports all the failures instead of stopping after the first one.

See b/22556317

Change-Id: I5ad769616f120a847eebe1386c726daacb831fc7
diff --git a/api/GenerateTestFiles.cpp b/api/GenerateTestFiles.cpp
index 4c3cb40..ddb7c78 100644
--- a/api/GenerateTestFiles.cpp
+++ b/api/GenerateTestFiles.cpp
@@ -399,6 +399,8 @@
         }
     }
 
+    mJava->indent() << "StringBuilder message = new StringBuilder();\n";
+    mJava->indent() << "boolean errorFound = false;\n";
     mJava->indent() << "for (int i = 0; i < INPUTSIZE; i++)";
     mJava->startBlock();
 
@@ -458,8 +460,10 @@
 
     mJava->indent() << "if (!valid)";
     mJava->startBlock();
+    mJava->indent() << "if (!errorFound)";
+    mJava->startBlock();
+    mJava->indent() << "errorFound = true;\n";
 
-    mJava->indent() << "StringBuilder message = new StringBuilder();\n";
     for (auto p : mAllInputsAndOutputs) {
         if (p->isOutParameter) {
             writeJavaAppendOutputToMessage(*p, "", "[i * " + p->vectorWidth + " + j]",
@@ -471,15 +475,24 @@
     if (verifierValidates) {
         mJava->indent() << "message.append(errorMessage);\n";
     }
+    mJava->indent() << "message.append(\"Errors at\");\n";
+    mJava->endBlock();
 
-    mJava->indent() << "assertTrue(\"Incorrect output for " << mJavaCheckMethodName << "\" +\n";
+    mJava->indent() << "message.append(\" [\");\n";
+    mJava->indent() << "message.append(Integer.toString(i));\n";
+    mJava->indent() << "message.append(\", \");\n";
+    mJava->indent() << "message.append(Integer.toString(j));\n";
+    mJava->indent() << "message.append(\"]\");\n";
+
+    mJava->endBlock();
+    mJava->endBlock();
+    mJava->endBlock();
+
+    mJava->indent() << "assertFalse(\"Incorrect output for " << mJavaCheckMethodName << "\" +\n";
     mJava->indentPlus()
-                << "(relaxed ? \"_relaxed\" : \"\") + \":\\n\" + message.toString(), valid);\n";
+                << "(relaxed ? \"_relaxed\" : \"\") + \":\\n\" + message.toString(), errorFound);\n";
 
     mJava->endBlock();
-    mJava->endBlock();
-    mJava->endBlock();
-    mJava->endBlock();
     *mJava << "\n";
 }
 
@@ -490,6 +503,8 @@
     for (auto p : mAllInputsAndOutputs) {
         writeJavaArrayInitialization(*p);
     }
+    mJava->indent() << "StringBuilder message = new StringBuilder();\n";
+    mJava->indent() << "boolean errorFound = false;\n";
     mJava->indent() << "for (int i = 0; i < INPUTSIZE; i++)";
     mJava->startBlock();
 
@@ -538,8 +553,10 @@
 
     mJava->indent() << "if (!valid)";
     mJava->startBlock();
+    mJava->indent() << "if (!errorFound)";
+    mJava->startBlock();
+    mJava->indent() << "errorFound = true;\n";
 
-    mJava->indent() << "StringBuilder message = new StringBuilder();\n";
     for (auto p : mAllInputsAndOutputs) {
         if (p->isOutParameter) {
             writeJavaAppendVectorOutputToMessage(*p);
@@ -547,14 +564,21 @@
             writeJavaAppendVectorInputToMessage(*p);
         }
     }
+    mJava->indent() << "message.append(\"Errors at\");\n";
+    mJava->endBlock();
 
-    mJava->indent() << "assertTrue(\"Incorrect output for " << mJavaCheckMethodName << "\" +\n";
+    mJava->indent() << "message.append(\" [\");\n";
+    mJava->indent() << "message.append(Integer.toString(i));\n";
+    mJava->indent() << "message.append(\"]\");\n";
+
+    mJava->endBlock();
+    mJava->endBlock();
+
+    mJava->indent() << "assertFalse(\"Incorrect output for " << mJavaCheckMethodName << "\" +\n";
     mJava->indentPlus()
-                << "(relaxed ? \"_relaxed\" : \"\") + \":\\n\" + message.toString(), valid);\n";
+                << "(relaxed ? \"_relaxed\" : \"\") + \":\\n\" + message.toString(), errorFound);\n";
 
     mJava->endBlock();
-    mJava->endBlock();
-    mJava->endBlock();
     *mJava << "\n";
 }
 
@@ -569,6 +593,16 @@
 void PermutationWriter::writeJavaArrayInitialization(const ParameterDefinition& p) const {
     mJava->indent() << p.javaBaseType << "[] " << p.javaArrayName << " = new " << p.javaBaseType
                     << "[INPUTSIZE * " << p.vectorWidth << "];\n";
+
+    /* For basic types, populate the array with values, to help understand failures.  We have had
+     * bugs where the output buffer was all 0.  We were not sure if there was a failed copy or
+     * the GPU driver was copying zeroes.
+     */
+    if (p.typeIndex >= 0) {
+        mJava->indent() << "Arrays.fill(" << p.javaArrayName << ", (" << TYPES[p.typeIndex].javaType
+                        << ") 42);\n";
+    }
+
     mJava->indent() << p.javaAllocName << ".copyTo(" << p.javaArrayName << ");\n";
 }
 
@@ -870,6 +904,7 @@
     *file << "import android.renderscript.Allocation;\n";
     *file << "import android.renderscript.RSRuntimeException;\n";
     *file << "import android.renderscript.Element;\n\n";
+    *file << "import java.util.Arrays;\n\n";
 
     *file << "public class " << testName << " extends RSBaseCompute";
     file->startBlock();  // The corresponding endBlock() is in finishJavaFile()