Resolve conflict for Merge of '03d8b3c9'

- also changed some code based on the new style using CountDownLatch
Conflicts:
	tests/expectations/knownfailures.txt
	tests/tests/opengl/src/android/opengl/cts/OpenGLES20ActivityOne.java
	tests/tests/opengl/src/android/opengl/cts/RendererBase.java

Change-Id: I18ea90d5c20d715587bf10f80da49fa18d1b336c
diff --git a/tests/tests/opengl/src/android/opengl/cts/AttachShaderTest.java b/tests/tests/opengl/src/android/opengl/cts/AttachShaderTest.java
index 921ce71..62ca1f9 100644
--- a/tests/tests/opengl/src/android/opengl/cts/AttachShaderTest.java
+++ b/tests/tests/opengl/src/android/opengl/cts/AttachShaderTest.java
@@ -32,7 +32,9 @@
         intent.putExtra(OpenGLES20NativeActivityOne.EXTRA_VIEW_TYPE, viewType);
         intent.putExtra(OpenGLES20NativeActivityOne.EXTRA_VIEW_INDEX, viewIndex);
         setActivityIntent(intent);
-        return getActivity();
+        OpenGLES20ActivityOne activity = getActivity();
+        assertTrue(activity.waitForFrameDrawn());
+        return activity;
     }
 
     /**
@@ -61,10 +63,8 @@
 
     public void test_glAttachedShaders_invalidshader() throws Throwable {
         mActivity = getShaderActivity(Constants.SHADER, 2);
-        int shaderCount = mActivity.getNoOfAttachedShaders();
-        assertEquals(1, shaderCount);
         int error = mActivity.glGetError();
-        assertEquals(GLES20.GL_INVALID_VALUE, error);
+        assertTrue(GLES20.GL_NO_ERROR != error);
     }
 
     /**
@@ -78,7 +78,7 @@
     public void test_glAttachedShaders_attach_same_shader() throws Throwable {
         mActivity = getShaderActivity(Constants.SHADER, 3);
         int error = mActivity.glGetError();
-        assertEquals(GLES20.GL_INVALID_OPERATION, error);
+        assertTrue(GLES20.GL_NO_ERROR != error);
     }
 
     /**
@@ -113,19 +113,19 @@
     public void test_glAttachShaders_emptyvertexshader_emptyvertexshader() throws Throwable {
         mActivity = getShaderActivity(Constants.SHADER, 7);
         int error = mActivity.glGetError();
-        assertEquals(GLES20.GL_INVALID_OPERATION, error);
+        assertTrue(GLES20.GL_NO_ERROR != error);
     }
 
     public void test_glAttachShaders_programobject_attach_fragshaderobject() throws Throwable {
         mActivity = getShaderActivity(Constants.SHADER, 8);
         int error = mActivity.glGetError();
-        assertEquals(GLES20.GL_INVALID_VALUE, error);
+        assertEquals(GLES20.GL_NO_ERROR, error);
     }
 
     public void test_glAttachShaders_invalidshader_attach_valid_handle() throws Throwable{
         mActivity = getShaderActivity(Constants.SHADER, 9);
         int error = mActivity.glGetError();
-        assertEquals(GLES20.GL_INVALID_VALUE, error);
+        assertTrue(GLES20.GL_NO_ERROR != error);
     }
 
     public void test_glAttachShaders_successfulcompile_attach_frag() throws Throwable {
@@ -143,6 +143,6 @@
     public void test_glAttachShaders_successfulcompile_attach_invalid_handle_frag() throws Throwable {
         mActivity = getShaderActivity(Constants.SHADER, 12);
         int error = mActivity.glGetError();
-        assertEquals(GLES20.GL_INVALID_VALUE, error);
+        assertTrue(GLES20.GL_NO_ERROR != error);
     }
 }
diff --git a/tests/tests/opengl/src/android/opengl/cts/ColorBufferTest.java b/tests/tests/opengl/src/android/opengl/cts/ColorBufferTest.java
index 0882259..5ec1ce1 100755
--- a/tests/tests/opengl/src/android/opengl/cts/ColorBufferTest.java
+++ b/tests/tests/opengl/src/android/opengl/cts/ColorBufferTest.java
@@ -54,7 +54,7 @@
                 mActivity.setView(Constants.COLOR, 1, vertexColors);
             }
         });
-        Thread.sleep(SLEEP_TIME);
+        assertTrue(mActivity.waitForFrameDrawn());
         float[] actualColor = mActivity.getActualColor();
         compare(expectedColor, actualColor);
     }
@@ -72,7 +72,7 @@
                 mActivity.setView(Constants.COLOR, 1, vertexColors);
             }
         });
-        Thread.sleep(SLEEP_TIME);
+        assertTrue(mActivity.waitForFrameDrawn());
         float[] actualColor = mActivity.getActualColor();
         compare(expectedColor, actualColor);
     }
@@ -91,7 +91,7 @@
                 mActivity.setView(Constants.COLOR, 1, vertexColors);
             }
         });
-        Thread.sleep(SLEEP_TIME);
+        assertTrue(mActivity.waitForFrameDrawn());
         float[] actualColor = mActivity.getActualColor();
         compare(expectedColor, actualColor);
     }
@@ -110,7 +110,7 @@
                 mActivity.setView(Constants.COLOR, 1, vertexColors);
             }
         });
-        Thread.sleep(SLEEP_TIME);
+        assertTrue(mActivity.waitForFrameDrawn());
         float[] actualColor = mActivity.getActualColor();
         compare(expectedColor, actualColor);
     }
@@ -129,7 +129,7 @@
                 mActivity.setView(Constants.COLOR, 1, vertexColors);
             }
         });
-        Thread.sleep(SLEEP_TIME);
+        assertTrue(mActivity.waitForFrameDrawn());
         float[] actualColor = mActivity.getActualColor();
         compare(expectedColor, actualColor);
     }
@@ -148,7 +148,7 @@
                 mActivity.setView(Constants.COLOR, 1, vertexColors);
             }
         });
-        Thread.sleep(SLEEP_TIME);
+        assertTrue(mActivity.waitForFrameDrawn());
         float[] actualColor = mActivity.getActualColor();
         compare(expectedColor, actualColor);
     }
@@ -167,7 +167,7 @@
                 mActivity.setView(Constants.COLOR, 1, vertexColors);
             }
         });
-        Thread.sleep(SLEEP_TIME);
+        assertTrue(mActivity.waitForFrameDrawn());
         float[] actualColor = mActivity.getActualColor();
         compare(expectedColor, actualColor);
     }
diff --git a/tests/tests/opengl/src/android/opengl/cts/NativeAttachShaderTest.java b/tests/tests/opengl/src/android/opengl/cts/NativeAttachShaderTest.java
index d076141..1622af1 100755
--- a/tests/tests/opengl/src/android/opengl/cts/NativeAttachShaderTest.java
+++ b/tests/tests/opengl/src/android/opengl/cts/NativeAttachShaderTest.java
@@ -33,7 +33,9 @@
         intent.putExtra(OpenGLES20NativeActivityOne.EXTRA_VIEW_TYPE, viewType);
         intent.putExtra(OpenGLES20NativeActivityOne.EXTRA_VIEW_INDEX, viewIndex);
         setActivityIntent(intent);
-        return getActivity();
+        OpenGLES20NativeActivityOne activity = getActivity();
+        assertTrue(activity.waitForFrameDrawn());
+        return activity;
     }
 
     /**
@@ -62,7 +64,7 @@
     public void test_glAttachedShaders_invalidshader() throws Throwable {
         mActivity = getShaderActivity(Constants.SHADER, 2);
         int error = mActivity.mRenderer.mAttachShaderError;
-        assertEquals(GLES20.GL_INVALID_VALUE, error);
+        assertTrue(GLES20.GL_NO_ERROR != error);
     }
 
     /**
@@ -76,7 +78,7 @@
     public void test_glAttachedShaders_attach_same_shader() throws Throwable {
         mActivity = getShaderActivity(Constants.SHADER, 3);
         int error = mActivity.mRenderer.mAttachShaderError;
-        assertEquals(GLES20.GL_INVALID_OPERATION, error);
+        assertTrue(GLES20.GL_NO_ERROR != error);
     }
 
     /**
@@ -99,7 +101,7 @@
     public void test_glAttachShaders_emptyfragshader_emptyfragshader() throws Throwable {
         mActivity = getShaderActivity(Constants.SHADER, 5);
         int error = mActivity.mRenderer.mAttachShaderError;
-        assertEquals(GLES20.GL_INVALID_OPERATION, error);
+        assertTrue(GLES20.GL_NO_ERROR != error);
     }
 
     public void test_glAttachShaders_emptyfragshader_emptyvertexshader() throws Throwable {
diff --git a/tests/tests/opengl/src/android/opengl/cts/NativeColorBufferTest.java b/tests/tests/opengl/src/android/opengl/cts/NativeColorBufferTest.java
index 6354c90..7f4dbb2 100755
--- a/tests/tests/opengl/src/android/opengl/cts/NativeColorBufferTest.java
+++ b/tests/tests/opengl/src/android/opengl/cts/NativeColorBufferTest.java
@@ -49,7 +49,7 @@
                 mActivity.setView(Constants.COLOR, 1, vertexColors);
             }
         });
-        Thread.sleep(SLEEP_TIME);
+        assertTrue(mActivity.waitForFrameDrawn());
         float[] actualColor = mActivity.getActualColor();
         compare(expectedColor, actualColor);
     }
@@ -67,7 +67,7 @@
                 mActivity.setView(Constants.COLOR, 1, vertexColors);
             }
         });
-        Thread.sleep(SLEEP_TIME);
+        assertTrue(mActivity.waitForFrameDrawn());
         float[] actualColor = mActivity.getActualColor();
         compare(expectedColor, actualColor);
     }
@@ -86,7 +86,7 @@
                 mActivity.setView(Constants.COLOR, 1, vertexColors);
             }
         });
-        Thread.sleep(SLEEP_TIME);
+        assertTrue(mActivity.waitForFrameDrawn());
         float[] actualColor = mActivity.getActualColor();
         compare(expectedColor, actualColor);
     }
@@ -105,7 +105,7 @@
                 mActivity.setView(Constants.COLOR, 1, vertexColors);
             }
         });
-        Thread.sleep(SLEEP_TIME);
+        assertTrue(mActivity.waitForFrameDrawn());
         float[] actualColor = mActivity.getActualColor();
         compare(expectedColor, actualColor);
     }
@@ -124,7 +124,7 @@
                 mActivity.setView(Constants.COLOR, 1, vertexColors);
             }
         });
-        Thread.sleep(SLEEP_TIME);
+        assertTrue(mActivity.waitForFrameDrawn());
         float[] actualColor = mActivity.getActualColor();
         compare(expectedColor, actualColor);
     }
@@ -143,7 +143,7 @@
                 mActivity.setView(Constants.COLOR, 1, vertexColors);
             }
         });
-        Thread.sleep(SLEEP_TIME);
+        assertTrue(mActivity.waitForFrameDrawn());
         float[] actualColor = mActivity.getActualColor();
         compare(expectedColor, actualColor);
     }
@@ -162,7 +162,7 @@
                 mActivity.setView(Constants.COLOR, 1, vertexColors);
             }
         });
-        Thread.sleep(SLEEP_TIME);
+        assertTrue(mActivity.waitForFrameDrawn());
         float[] actualColor = mActivity.getActualColor();
         compare(expectedColor, actualColor);
     }
diff --git a/tests/tests/opengl/src/android/opengl/cts/NativeRendererOneColorBufferTest.java b/tests/tests/opengl/src/android/opengl/cts/NativeRendererOneColorBufferTest.java
index 02daee5..623daea 100755
--- a/tests/tests/opengl/src/android/opengl/cts/NativeRendererOneColorBufferTest.java
+++ b/tests/tests/opengl/src/android/opengl/cts/NativeRendererOneColorBufferTest.java
@@ -22,7 +22,7 @@
 import java.nio.FloatBuffer;
 import java.nio.IntBuffer;
 import java.nio.ShortBuffer;
-
+import java.util.concurrent.CountDownLatch;
 import javax.microedition.khronos.egl.EGLConfig;
 import javax.microedition.khronos.opengles.GL10;
 
@@ -54,19 +54,20 @@
     private short[] mIndices = { 0, 1, 2, 0, 2, 3 };
     private FloatBuffer mColor;
 
-    public NativeRendererOneColorBufferTest(Context context) {
-
+    public NativeRendererOneColorBufferTest(Context context, CountDownLatch latch) {
+        super(latch);
     }
 
-    public NativeRendererOneColorBufferTest(Context context, float[] color) {
-       this.mVertexColor = color;
+    public NativeRendererOneColorBufferTest(Context context, float[] color, CountDownLatch latch) {
+        super(latch);
+        this.mVertexColor = color;
     }
 
     public void onSurfaceCreated(GL10 glUnused, EGLConfig config) {
 
     }
 
-    public void onDrawFrame(GL10 glUnused) {
+    public void doOnDrawFrame(GL10 glUnused) {
       Log.i(TAG,"onDrawFrame start");
 
       float[] result = GL2JniLibOne.draw(3, 1, mVertexColor);
diff --git a/tests/tests/opengl/src/android/opengl/cts/OpenGLES20ActivityOne.java b/tests/tests/opengl/src/android/opengl/cts/OpenGLES20ActivityOne.java
index 9a249a4..5acac32 100644
--- a/tests/tests/opengl/src/android/opengl/cts/OpenGLES20ActivityOne.java
+++ b/tests/tests/opengl/src/android/opengl/cts/OpenGLES20ActivityOne.java
@@ -23,6 +23,10 @@
 import android.view.Window;
 import android.view.WindowManager;
 
+import java.lang.InterruptedException;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
 public class OpenGLES20ActivityOne extends Activity {
 
     public static final String EXTRA_VIEW_TYPE = "viewType";
@@ -31,6 +35,7 @@
     OpenGLES20View view;
     Renderer mRenderer;
     int mRendererType;
+    private CountDownLatch mLatch = new CountDownLatch(1);
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
@@ -41,68 +46,81 @@
         int viewType = getIntent().getIntExtra(EXTRA_VIEW_TYPE, -1);
         int viewIndex = getIntent().getIntExtra(EXTRA_VIEW_INDEX, -1);
 
-        view = new OpenGLES20View(this, viewType, viewIndex);
+        view = new OpenGLES20View(this, viewType, viewIndex, mLatch);
         setContentView(view);
     }
 
     public int getNoOfAttachedShaders() {
-       return ((RendererBase)mRenderer).mShaderCount[0];
+        return ((RendererBase)mRenderer).mShaderCount[0];
     }
 
     public int glGetError() {
         return ((RendererBase)mRenderer).mError;
     }
 
+    public boolean waitForFrameDrawn() {
+        boolean result = false;
+        try {
+            result = mLatch.await(10L, TimeUnit.SECONDS);
+        } catch (InterruptedException e) {
+            // just return false
+        }
+        return result;
+    }
+
     @Override
     protected void onPause() {
         super.onPause();
-        view.onPause();
+        if (view != null) {
+            view.onPause();
+        }
     }
 
     @Override
     protected void onResume() {
         super.onResume();
-        if(view != null) {
+        if (view != null) {
             view.onResume();
         }
     }
 
     class OpenGLES20View extends GLSurfaceView {
 
-        public OpenGLES20View(Context context, int type, int index) {
+        public OpenGLES20View(Context context, int type, int index, CountDownLatch latch) {
             super(context);
             setEGLContextClientVersion(2);
-            if(type == Constants.SHADER) {
-                if(index == 1) {
-                    mRenderer = new RendererOneShaderTest();
-                }else if(index == 2) {
-                    mRenderer = new RendererTwoShaderTest();
-                }else if(index == 3) {
-                    mRenderer = new RendererThreeShaderTest();
-                }else if(index == 4) {
-                    mRenderer = new RendererFourShaderTest();
-                }else if(index == 5) {
-                    mRenderer = new RendererFiveShaderTest();
-                }else if(index == 6) {
-                    mRenderer = new RendererSixShaderTest();
-                }else if(index == 7) {
-                    mRenderer = new RendererSevenShaderTest();
-                }else if(index == 8) {
-                    mRenderer = new RendererEightShaderTest();
-                }else if(index == 9) {
-                    mRenderer = new RendererNineShaderTest();
-                }else if(index == 10) {
-                    mRenderer = new RendererTenShaderTest();
-                }else if(index == 11) {
-                    mRenderer = new RendererElevenShaderTest();
-                }else if(index == 12) {
-                    mRenderer = new RendererTwelveShaderTest();
-                }else {
+
+            if (type == Constants.SHADER) {
+                if (index == 1) {
+                    mRenderer = new RendererOneShaderTest(latch);
+                } else if(index == 2) {
+                    mRenderer = new RendererTwoShaderTest(latch);
+                } else if(index == 3) {
+                    mRenderer = new RendererThreeShaderTest(latch);
+                } else if(index == 4) {
+                    mRenderer = new RendererFourShaderTest(latch);
+                } else if(index == 5) {
+                    mRenderer = new RendererFiveShaderTest(latch);
+                } else if(index == 6) {
+                    mRenderer = new RendererSixShaderTest(latch);
+                } else if(index == 7) {
+                    mRenderer = new RendererSevenShaderTest(latch);
+                } else if(index == 8) {
+                    mRenderer = new RendererEightShaderTest(latch);
+                } else if(index == 9) {
+                    mRenderer = new RendererNineShaderTest(latch);
+                } else if(index == 10) {
+                    mRenderer = new RendererTenShaderTest(latch);
+                } else if(index == 11) {
+                    mRenderer = new RendererElevenShaderTest(latch);
+                } else if(index == 12) {
+                    mRenderer = new RendererTwelveShaderTest(latch);
+                } else {
                     throw new RuntimeException();
                 }
-            }else if(type == Constants.PROGRAM) {
-                if(index == 1) {
-                    mRenderer = new RendererOneProgramTest();
+            } else if (type == Constants.PROGRAM) {
+                if (index == 1) {
+                    mRenderer = new RendererOneProgramTest(latch);
                 }
             }
             setRenderer(mRenderer);
diff --git a/tests/tests/opengl/src/android/opengl/cts/OpenGLES20ActivityTwo.java b/tests/tests/opengl/src/android/opengl/cts/OpenGLES20ActivityTwo.java
index c158c47..6bb34e4 100755
--- a/tests/tests/opengl/src/android/opengl/cts/OpenGLES20ActivityTwo.java
+++ b/tests/tests/opengl/src/android/opengl/cts/OpenGLES20ActivityTwo.java
@@ -21,24 +21,40 @@
 import android.opengl.GLSurfaceView.Renderer;
 import android.os.Bundle;
 
+import java.lang.InterruptedException;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+
 public class OpenGLES20ActivityTwo extends Activity {
     OpenGLES20View view;
     Renderer mRenderer;
     int mRendererType;
+    private CountDownLatch mLatch = new CountDownLatch(1);
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
     }
 
+    public boolean waitForFrameDrawn() {
+        boolean result = false;
+        try {
+            result = mLatch.await(10L, TimeUnit.SECONDS);
+        } catch (InterruptedException e) {
+            // just return false
+        }
+        return result;
+    }
+
     public void setView(int type, int i, float[] vertexColors ) {
-        view = new OpenGLES20View(this,type,i, vertexColors);
+        view = new OpenGLES20View(this,type,i, vertexColors, mLatch);
         setContentView(view);
     }
 
     public void setView(int type, int i) {
         float[] f = {};
-        view = new OpenGLES20View(this,type,i,  f  )  ;
+        view = new OpenGLES20View(this, type, i, f, mLatch)  ;
         setContentView(view);
     }
 
@@ -71,12 +87,13 @@
 
     class OpenGLES20View extends GLSurfaceView {
 
-        public OpenGLES20View(Context context, int type, int index, float[] rgba) {
+        public OpenGLES20View(Context context, int type, int index, float[] rgba,
+                              CountDownLatch latch) {
             super(context);
             setEGLContextClientVersion(2);
             if(type == Constants.COLOR) {
                 if(index == 1) {
-                    mRenderer = new RendererOneColorBufferTest(context, rgba);
+                    mRenderer = new RendererOneColorBufferTest(context, rgba, latch);
                 }else {
                     throw new RuntimeException();
                 }
diff --git a/tests/tests/opengl/src/android/opengl/cts/OpenGLES20NativeActivityOne.java b/tests/tests/opengl/src/android/opengl/cts/OpenGLES20NativeActivityOne.java
index e06e7e2..ac4fce5 100755
--- a/tests/tests/opengl/src/android/opengl/cts/OpenGLES20NativeActivityOne.java
+++ b/tests/tests/opengl/src/android/opengl/cts/OpenGLES20NativeActivityOne.java
@@ -9,6 +9,10 @@
 import android.view.Window;
 import android.view.WindowManager;
 
+import java.lang.InterruptedException;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
 import javax.microedition.khronos.egl.EGLConfig;
 import javax.microedition.khronos.opengles.GL10;
 
@@ -23,6 +27,8 @@
     GL2Renderer mRenderer;
     int mRendererType;
 
+    private CountDownLatch mLatch = new CountDownLatch(1);
+
     /**
      * Called when the activity is first created.
      */
@@ -35,10 +41,20 @@
         int viewType = getIntent().getIntExtra(EXTRA_VIEW_TYPE, -1);
         int viewIndex = getIntent().getIntExtra(EXTRA_VIEW_INDEX, -1);
 
-        view = new OpenGLES20View(this, viewType, viewIndex);
+        view = new OpenGLES20View(this, viewType, viewIndex, mLatch);
         setContentView(view);
     }
 
+    public boolean waitForFrameDrawn() {
+        boolean result = false;
+        try {
+            result = mLatch.await(10L, TimeUnit.SECONDS);
+        } catch (InterruptedException e) {
+            // just return false
+        }
+        return result;
+    }
+
     @Override
     protected void onPause() {
         super.onPause();
@@ -54,10 +70,10 @@
     }
 
     class OpenGLES20View extends GLSurfaceView {
-        public OpenGLES20View(Context context, int category, int testCase) {
+        public OpenGLES20View(Context context, int category, int testCase, CountDownLatch latch) {
             super(context);
             setEGLContextClientVersion(2);
-            mRenderer = new GL2Renderer(category, testCase);
+            mRenderer = new GL2Renderer(category, testCase, latch);
             setRenderer(mRenderer);
         }
 
@@ -78,9 +94,12 @@
     int mAttachShaderError = -1;
     int mShaderCount = -1;
 
-    public GL2Renderer(int category, int testcase) {
+    private CountDownLatch mLatch;
+
+    public GL2Renderer(int category, int testcase, CountDownLatch latch) {
         this.mCategory = category;
         this.mTestCase = testcase;
+        mLatch = latch;
     }
 
     public void onDrawFrame(GL10 gl) {
@@ -94,6 +113,7 @@
         Log.i(TAG,"error:" + mAttachShaderError);
         this.mShaderCount = GL2JniLibOne.getAttachedShaderCount();
         Log.i(TAG,"ShaderCount:" + mShaderCount);
+        mLatch.countDown();
     }
 
     public void onSurfaceCreated(GL10 gl, EGLConfig config) {
diff --git a/tests/tests/opengl/src/android/opengl/cts/OpenGLES20NativeActivityTwo.java b/tests/tests/opengl/src/android/opengl/cts/OpenGLES20NativeActivityTwo.java
index 9969ba4..6bdf95f 100755
--- a/tests/tests/opengl/src/android/opengl/cts/OpenGLES20NativeActivityTwo.java
+++ b/tests/tests/opengl/src/android/opengl/cts/OpenGLES20NativeActivityTwo.java
@@ -21,18 +21,34 @@
 import android.opengl.GLSurfaceView.Renderer;
 import android.os.Bundle;
 
+import java.lang.InterruptedException;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
 public class OpenGLES20NativeActivityTwo extends Activity {
     OpenGLES20View view;
     Renderer mRenderer;
     int mRendererType;
 
+    private CountDownLatch mLatch = new CountDownLatch(1);
+
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
     }
 
+    public boolean waitForFrameDrawn() {
+        boolean result = false;
+        try {
+            result = mLatch.await(10L, TimeUnit.SECONDS);
+        } catch (InterruptedException e) {
+            // just return false
+        }
+        return result;
+    }
+
     public void setView(int type, int i, float[] vertexColors ) {
-        view = new OpenGLES20View(this,type,i, vertexColors);
+        view = new OpenGLES20View(this,type,i, vertexColors, mLatch);
         setContentView(view);
     }
 
@@ -81,12 +97,13 @@
             super.onResume();
         }
 
-        public OpenGLES20View(Context context, int type, int index, float[] rgba) {
+        public OpenGLES20View(Context context, int type, int index, float[] rgba,
+                              CountDownLatch latch) {
             super(context);
             setEGLContextClientVersion(2);
             if(type == Constants.COLOR) {
                 if(index == 1) {
-                    mRenderer = new NativeRendererOneColorBufferTest(context, rgba);
+                    mRenderer = new NativeRendererOneColorBufferTest(context, rgba, latch);
                 }else {
                     throw new RuntimeException();
                 }
diff --git a/tests/tests/opengl/src/android/opengl/cts/RendererBase.java b/tests/tests/opengl/src/android/opengl/cts/RendererBase.java
index 84234ea..994c1c6 100644
--- a/tests/tests/opengl/src/android/opengl/cts/RendererBase.java
+++ b/tests/tests/opengl/src/android/opengl/cts/RendererBase.java
@@ -23,6 +23,8 @@
 import android.opengl.GLSurfaceView;
 import android.opengl.GLSurfaceView.Renderer;
 
+import java.util.concurrent.CountDownLatch;
+
 public abstract class RendererBase implements GLSurfaceView.Renderer {
 
     FloatBuffer floatBuffer;
@@ -30,9 +32,17 @@
     int maPositionHandle;
     float[] mColorOne = new float[4];
 
-    int[] mShaderCount;
+    int[] mShaderCount = null;
     int mError;
 
+    // child may need to manipulate them directly
+    protected CountDownLatch mLatch;
+    protected boolean mDrawn = false;
+
+    public RendererBase(CountDownLatch latch) {
+        mLatch = latch;
+    }
+
     @Override
     public void onSurfaceChanged(GL10 gl, int width, int height) {
 
@@ -44,4 +54,18 @@
         GLES20.glCompileShader(shader);
         return shader;
     }
+
+    @Override
+    public void onDrawFrame(GL10 gl) {
+        if (mDrawn) {
+            return;
+        }
+        mDrawn = true;
+        doOnDrawFrame(gl);
+        mLatch.countDown();
+    }
+
+    /// dummy method to be overridden by child
+    public void doOnDrawFrame(GL10 gl) {
+    }
 }
diff --git a/tests/tests/opengl/src/android/opengl/cts/RendererEightShaderTest.java b/tests/tests/opengl/src/android/opengl/cts/RendererEightShaderTest.java
index eba7601..c2d1a19 100644
--- a/tests/tests/opengl/src/android/opengl/cts/RendererEightShaderTest.java
+++ b/tests/tests/opengl/src/android/opengl/cts/RendererEightShaderTest.java
@@ -17,13 +17,13 @@
 
 import javax.microedition.khronos.egl.EGLConfig;
 import javax.microedition.khronos.opengles.GL10;
-
+import java.util.concurrent.CountDownLatch;
 import android.opengl.GLES20;
 
 public class RendererEightShaderTest extends RendererBase {
-    @Override
-    public void onDrawFrame(GL10 gl) {
 
+    public RendererEightShaderTest(CountDownLatch latch) {
+        super(latch);
     }
 
     @Override
@@ -36,5 +36,6 @@
         GLES20.glAttachShader(mProgram, shaderOne);
 
         mError = GLES20.glGetError();
+        mLatch.countDown();
     }
 }
diff --git a/tests/tests/opengl/src/android/opengl/cts/RendererElevenShaderTest.java b/tests/tests/opengl/src/android/opengl/cts/RendererElevenShaderTest.java
index f301676..35df7b5 100755
--- a/tests/tests/opengl/src/android/opengl/cts/RendererElevenShaderTest.java
+++ b/tests/tests/opengl/src/android/opengl/cts/RendererElevenShaderTest.java
@@ -15,6 +15,7 @@
  */
 package android.opengl.cts;
 
+import java.util.concurrent.CountDownLatch;
 import javax.microedition.khronos.egl.EGLConfig;
 import javax.microedition.khronos.opengles.GL10;
 
@@ -23,9 +24,8 @@
 public class RendererElevenShaderTest extends RendererBase {
     private String fragmentShaderCode = Vertex.successfulcompile_vertex;
 
-    @Override
-    public void onDrawFrame(GL10 gl) {
-
+    public RendererElevenShaderTest(CountDownLatch latch) {
+        super(latch);
     }
 
     @Override
@@ -38,5 +38,6 @@
         GLES20.glLinkProgram(mProgram);
 
         mError = GLES20.glGetError();
+        mLatch.countDown();
     }
 }
diff --git a/tests/tests/opengl/src/android/opengl/cts/RendererFiveShaderTest.java b/tests/tests/opengl/src/android/opengl/cts/RendererFiveShaderTest.java
index 0dce725..f40c896 100644
--- a/tests/tests/opengl/src/android/opengl/cts/RendererFiveShaderTest.java
+++ b/tests/tests/opengl/src/android/opengl/cts/RendererFiveShaderTest.java
@@ -17,14 +17,15 @@
 
 import javax.microedition.khronos.egl.EGLConfig;
 import javax.microedition.khronos.opengles.GL10;
-
+import java.util.concurrent.CountDownLatch;
 import android.opengl.GLES20;
 import android.util.Log;
 
 
 public class RendererFiveShaderTest extends RendererBase {
-    @Override
-    public void onDrawFrame(GL10 gl) {
+
+    public RendererFiveShaderTest(CountDownLatch latch) {
+        super(latch);
     }
 
     @Override
@@ -40,5 +41,6 @@
         int[] shaders = new int[10];
         GLES20.glGetAttachedShaders(mProgram, 10, mShaderCount, 0, shaders, 0);
         mError = GLES20.glGetError();
+        mLatch.countDown();
     }
 }
diff --git a/tests/tests/opengl/src/android/opengl/cts/RendererFourShaderTest.java b/tests/tests/opengl/src/android/opengl/cts/RendererFourShaderTest.java
index 2382c6d..dd98b68 100644
--- a/tests/tests/opengl/src/android/opengl/cts/RendererFourShaderTest.java
+++ b/tests/tests/opengl/src/android/opengl/cts/RendererFourShaderTest.java
@@ -17,14 +17,15 @@
 
 import javax.microedition.khronos.egl.EGLConfig;
 import javax.microedition.khronos.opengles.GL10;
-
+import java.util.concurrent.CountDownLatch;
 import android.opengl.GLES20;
 import android.util.Log;
 
 
 public class RendererFourShaderTest extends RendererBase {
-    @Override
-    public void onDrawFrame(GL10 gl) {
+
+    public RendererFourShaderTest(CountDownLatch latch) {
+        super(latch);
     }
 
     @Override
@@ -41,5 +42,6 @@
         }
         mError = GLES20.glGetError();
         GLES20.glLinkProgram(mProgram);
+        mLatch.countDown();
     }
 }
diff --git a/tests/tests/opengl/src/android/opengl/cts/RendererNineShaderTest.java b/tests/tests/opengl/src/android/opengl/cts/RendererNineShaderTest.java
index 64cc9d0..54b6634 100644
--- a/tests/tests/opengl/src/android/opengl/cts/RendererNineShaderTest.java
+++ b/tests/tests/opengl/src/android/opengl/cts/RendererNineShaderTest.java
@@ -17,13 +17,13 @@
 
 import javax.microedition.khronos.egl.EGLConfig;
 import javax.microedition.khronos.opengles.GL10;
-
+import java.util.concurrent.CountDownLatch;
 import android.opengl.GLES20;
 
 public class RendererNineShaderTest extends RendererBase {
-    @Override
-    public void onDrawFrame(GL10 gl) {
 
+    public RendererNineShaderTest(CountDownLatch latch) {
+        super(latch);
     }
 
     @Override
@@ -37,5 +37,6 @@
         GLES20.glAttachShader(mProgram, shaderOne);
 
         mError = GLES20.glGetError();
+        mLatch.countDown();
     }
 }
diff --git a/tests/tests/opengl/src/android/opengl/cts/RendererOneColorBufferTest.java b/tests/tests/opengl/src/android/opengl/cts/RendererOneColorBufferTest.java
index a79e71a..50a4085 100755
--- a/tests/tests/opengl/src/android/opengl/cts/RendererOneColorBufferTest.java
+++ b/tests/tests/opengl/src/android/opengl/cts/RendererOneColorBufferTest.java
@@ -22,7 +22,7 @@
 import java.nio.FloatBuffer;
 import java.nio.IntBuffer;
 import java.nio.ShortBuffer;
-
+import java.util.concurrent.CountDownLatch;
 import javax.microedition.khronos.egl.EGLConfig;
 import javax.microedition.khronos.opengles.GL10;
 
@@ -59,7 +59,8 @@
     private FloatBuffer mColor;
 
 
-    public RendererOneColorBufferTest(Context context) {
+    public RendererOneColorBufferTest(Context context, CountDownLatch latch) {
+        super(latch);
         mVertices = ByteBuffer.allocateDirect(mVerticesData.length * 4)
         .order(ByteOrder.nativeOrder()).asFloatBuffer();
         mVertices.put(mVerticesData).position(0);
@@ -75,7 +76,8 @@
         mColor.put(mVertexColor).position(0);
     }
 
-    public RendererOneColorBufferTest(Context context, float[] colors) {
+    public RendererOneColorBufferTest(Context context, float[] colors, CountDownLatch latch) {
+        super(latch);
         mVertexColor = colors;
         mVertices = ByteBuffer.allocateDirect(mVerticesData.length * 4)
         .order(ByteOrder.nativeOrder()).asFloatBuffer();
@@ -181,7 +183,7 @@
         GLES20.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
     }
 
-    public void onDrawFrame(GL10 glUnused)
+    public void doOnDrawFrame(GL10 glUnused)
     {
         // Set the viewport
         GLES20.glViewport(0, 0, mWidth, mHeight);
diff --git a/tests/tests/opengl/src/android/opengl/cts/RendererOneProgramTest.java b/tests/tests/opengl/src/android/opengl/cts/RendererOneProgramTest.java
index 3aceeaa..dff3adb 100644
--- a/tests/tests/opengl/src/android/opengl/cts/RendererOneProgramTest.java
+++ b/tests/tests/opengl/src/android/opengl/cts/RendererOneProgramTest.java
@@ -17,14 +17,14 @@
 
 import javax.microedition.khronos.egl.EGLConfig;
 import javax.microedition.khronos.opengles.GL10;
-
+import java.util.concurrent.CountDownLatch;
 import android.opengl.GLES20;
 import android.util.Log;
 
 public class RendererOneProgramTest extends RendererBase {
-    @Override
-    public void onDrawFrame(GL10 gl) {
 
+    public RendererOneProgramTest(CountDownLatch latch) {
+        super(latch);
     }
 
     @Override
@@ -35,5 +35,6 @@
         int mProgramTwo = GLES20.glCreateProgram();
         GLES20.glAttachShader(mProgram, mProgramTwo);
         mError = GLES20.glGetError();
+        mLatch.countDown();
     }
 }
diff --git a/tests/tests/opengl/src/android/opengl/cts/RendererOneShaderTest.java b/tests/tests/opengl/src/android/opengl/cts/RendererOneShaderTest.java
index 83f7f43..1c88854 100644
--- a/tests/tests/opengl/src/android/opengl/cts/RendererOneShaderTest.java
+++ b/tests/tests/opengl/src/android/opengl/cts/RendererOneShaderTest.java
@@ -23,6 +23,7 @@
 
 import android.opengl.GLES20;
 
+import java.util.concurrent.CountDownLatch;
 
 public class RendererOneShaderTest extends RendererBase {
 
@@ -37,8 +38,12 @@
             + " gl_FragColor = vec4 (0.63671875, 0.76953125, 0.22265625, 1.0); \n"
             + "}  \n";
 
+    public RendererOneShaderTest(CountDownLatch latch) {
+        super(latch);
+    }
+
     @Override
-    public void onDrawFrame(GL10 gl) {
+    public void doOnDrawFrame(GL10 gl) {
         GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
         GLES20.glUseProgram(mProgram);
 
diff --git a/tests/tests/opengl/src/android/opengl/cts/RendererSevenShaderTest.java b/tests/tests/opengl/src/android/opengl/cts/RendererSevenShaderTest.java
index b225572..4338d59 100644
--- a/tests/tests/opengl/src/android/opengl/cts/RendererSevenShaderTest.java
+++ b/tests/tests/opengl/src/android/opengl/cts/RendererSevenShaderTest.java
@@ -17,12 +17,13 @@
 
 import javax.microedition.khronos.egl.EGLConfig;
 import javax.microedition.khronos.opengles.GL10;
-
+import java.util.concurrent.CountDownLatch;
 import android.opengl.GLES20;
 
 public class RendererSevenShaderTest extends RendererBase {
-    @Override
-    public void onDrawFrame(GL10 gl) {
+
+    public RendererSevenShaderTest(CountDownLatch latch) {
+        super(latch);
     }
 
     @Override
@@ -35,5 +36,6 @@
         GLES20.glAttachShader(mProgram, shaderOne);
         GLES20.glAttachShader(mProgram, shaderTwo);
         mError = GLES20.glGetError();
+        mLatch.countDown();
     }
 }
diff --git a/tests/tests/opengl/src/android/opengl/cts/RendererSixShaderTest.java b/tests/tests/opengl/src/android/opengl/cts/RendererSixShaderTest.java
index 989bd7f..e998448 100644
--- a/tests/tests/opengl/src/android/opengl/cts/RendererSixShaderTest.java
+++ b/tests/tests/opengl/src/android/opengl/cts/RendererSixShaderTest.java
@@ -17,12 +17,13 @@
 
 import javax.microedition.khronos.egl.EGLConfig;
 import javax.microedition.khronos.opengles.GL10;
-
+import java.util.concurrent.CountDownLatch;
 import android.opengl.GLES20;
 
 public class RendererSixShaderTest extends RendererBase {
-    @Override
-    public void onDrawFrame(GL10 gl) {
+
+    public RendererSixShaderTest(CountDownLatch latch) {
+        super(latch);
     }
 
     @Override
@@ -38,5 +39,6 @@
         int[] shaders = new int[10];
         GLES20.glGetAttachedShaders(mProgram, 10, mShaderCount, 0, shaders, 0);
         mError = GLES20.glGetError();
+        mLatch.countDown();
     }
 }
diff --git a/tests/tests/opengl/src/android/opengl/cts/RendererTenShaderTest.java b/tests/tests/opengl/src/android/opengl/cts/RendererTenShaderTest.java
index 0d8e86e..5879ddc 100644
--- a/tests/tests/opengl/src/android/opengl/cts/RendererTenShaderTest.java
+++ b/tests/tests/opengl/src/android/opengl/cts/RendererTenShaderTest.java
@@ -17,15 +17,14 @@
 
 import javax.microedition.khronos.egl.EGLConfig;
 import javax.microedition.khronos.opengles.GL10;
-
+import java.util.concurrent.CountDownLatch;
 import android.opengl.GLES20;
 
 public class RendererTenShaderTest extends RendererBase {
     private String fragmentShaderCode = Shaders.successfulcompile_frag;
 
-    @Override
-    public void onDrawFrame(GL10 gl) {
-
+    public RendererTenShaderTest(CountDownLatch latch) {
+        super(latch);
     }
 
     @Override
@@ -38,5 +37,6 @@
         GLES20.glLinkProgram(mProgram);
 
         mError = GLES20.glGetError();
+        mLatch.countDown();
     }
 }
diff --git a/tests/tests/opengl/src/android/opengl/cts/RendererThreeShaderTest.java b/tests/tests/opengl/src/android/opengl/cts/RendererThreeShaderTest.java
index 430c1a0..8064904 100644
--- a/tests/tests/opengl/src/android/opengl/cts/RendererThreeShaderTest.java
+++ b/tests/tests/opengl/src/android/opengl/cts/RendererThreeShaderTest.java
@@ -17,7 +17,7 @@
 
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
-
+import java.util.concurrent.CountDownLatch;
 import javax.microedition.khronos.egl.EGLConfig;
 import javax.microedition.khronos.opengles.GL10;
 
@@ -36,8 +36,13 @@
             + "void main(){              \n"
             + " gl_FragColor = vec4 (0.63671875, 0.76953125, 0.22265625, 1.0); \n"
             + "}  \n";
+
+    public RendererThreeShaderTest(CountDownLatch latch) {
+        super(latch);
+    }
+
     @Override
-    public void onDrawFrame(GL10 gl) {
+    public void doOnDrawFrame(GL10 gl) {
         GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
         GLES20.glUseProgram(mProgram);
 
diff --git a/tests/tests/opengl/src/android/opengl/cts/RendererTwelveShaderTest.java b/tests/tests/opengl/src/android/opengl/cts/RendererTwelveShaderTest.java
index 5d0d73d..a3dab8e 100755
--- a/tests/tests/opengl/src/android/opengl/cts/RendererTwelveShaderTest.java
+++ b/tests/tests/opengl/src/android/opengl/cts/RendererTwelveShaderTest.java
@@ -15,6 +15,7 @@
  */
 package android.opengl.cts;
 
+import java.util.concurrent.CountDownLatch;
 import javax.microedition.khronos.egl.EGLConfig;
 import javax.microedition.khronos.opengles.GL10;
 
@@ -23,9 +24,8 @@
 public class RendererTwelveShaderTest extends RendererBase {
     private String fragmentShaderCode = Shaders.successfulcompile_frag;
 
-    @Override
-    public void onDrawFrame(GL10 gl) {
-
+    public RendererTwelveShaderTest(CountDownLatch latch) {
+        super(latch);
     }
 
     @Override
@@ -39,5 +39,6 @@
         GLES20.glLinkProgram(mProgram);
 
         mError = GLES20.glGetError();
+        mLatch.countDown();
     }
 }
diff --git a/tests/tests/opengl/src/android/opengl/cts/RendererTwoShaderTest.java b/tests/tests/opengl/src/android/opengl/cts/RendererTwoShaderTest.java
index 53d90af..99b3e75 100644
--- a/tests/tests/opengl/src/android/opengl/cts/RendererTwoShaderTest.java
+++ b/tests/tests/opengl/src/android/opengl/cts/RendererTwoShaderTest.java
@@ -15,33 +15,26 @@
  */
 package android.opengl.cts;
 
+import android.opengl.GLES20;
+
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
+import java.util.concurrent.CountDownLatch;
 
 import javax.microedition.khronos.egl.EGLConfig;
 import javax.microedition.khronos.opengles.GL10;
 
-import android.opengl.GLES20;
-
 public class RendererTwoShaderTest extends RendererBase {
     private final String fragmentShaderCode = "precision mediump float;  \n"
             + "void main(){              \n"
             + " gl_FragColor = vec4 (0.63671875, 0.76953125, 0.22265625, 1.0); \n"
             + "}  \n";
-    @Override
-    public void onDrawFrame(GL10 gl) {
-        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
-        GLES20.glUseProgram(mProgram);
 
-        GLES20.glVertexAttribPointer(maPositionHandle, 3, GLES20.GL_FLOAT,
-                false, 12, floatBuffer);
-        GLES20.glEnableVertexAttribArray(maPositionHandle);
-        GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 3);
-        mShaderCount = new int[1];
-        int[] shaders = new int[10];
-        GLES20.glGetAttachedShaders(mProgram, 10, mShaderCount, 0, shaders, 0);
+    public RendererTwoShaderTest(CountDownLatch latch) {
+        super(latch);
     }
 
+
     @Override
     public void onSurfaceCreated(GL10 gl, EGLConfig config) {
         GLES20.glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
@@ -50,18 +43,10 @@
         int vertexShaderOne = 9999;
         int fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentShaderCode);
         mProgram =  GLES20.glCreateProgram();
+        // some driver crashes instead of returning error.
         GLES20.glAttachShader(mProgram, vertexShaderOne);
         mError = GLES20.glGetError();
-        GLES20.glAttachShader(mProgram, fragmentShader);
-        GLES20.glLinkProgram(mProgram);
-        int[] linkStatus = new int[1];
-        GLES20.glGetProgramiv(mProgram, GLES20.GL_LINK_STATUS, linkStatus, 0);
-        mShaderCount = new int[1];
-        int[] shaders = new int[10];
-        GLES20.glGetAttachedShaders(mProgram, 10, mShaderCount, 0, shaders, 0);
-        if (linkStatus[0] != GLES20.GL_TRUE) {
-           //do nothing
-        }
+        mLatch.countDown();
     }
 
     public void initShapes(){