fix flaky opengl test

- add CountDownLatch to make sure that chekc is done after action is done
- change error check to check if error or not rather than checking
  specific error code
- change  test_glAttachShaders_programobject_attach_fragshaderobject to be
  expecting NO_ERROR as the operations are valid

Change-Id: Ia4c54b03a1b3312728ed348891fb031550b29b05
diff --git a/tests/expectations/knownfailures.txt b/tests/expectations/knownfailures.txt
index 6430cd1..9cfaf73 100644
--- a/tests/expectations/knownfailures.txt
+++ b/tests/expectations/knownfailures.txt
@@ -25,10 +25,6 @@
     bug: 6404341
   },
   {
-    name: "android.opengl.cts.AttachShaderTest#test_glAttachShaders_programobject_attach_fragshaderobject",
-    bug: 6292666
-  },
-  {
     name: "android.openglperf.cts.GlVboPerfTest#testVboWithVaryingIndexBufferNumbers",
     bug: 5898262
   },
diff --git a/tests/tests/opengl/src/android/opengl/cts/AttachShaderTest.java b/tests/tests/opengl/src/android/opengl/cts/AttachShaderTest.java
index 034a77a..21efd6f 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(OpenGLES20NativeActivity.EXTRA_VIEW_TYPE, viewType);
         intent.putExtra(OpenGLES20NativeActivity.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 {
diff --git a/tests/tests/opengl/src/android/opengl/cts/NativeAttachShaderTest.java b/tests/tests/opengl/src/android/opengl/cts/NativeAttachShaderTest.java
index 1a51b6e..dbe3ea6 100755
--- a/tests/tests/opengl/src/android/opengl/cts/NativeAttachShaderTest.java
+++ b/tests/tests/opengl/src/android/opengl/cts/NativeAttachShaderTest.java
@@ -37,7 +37,9 @@
         intent.putExtra(OpenGLES20NativeActivity.EXTRA_VIEW_TYPE, viewType);
         intent.putExtra(OpenGLES20NativeActivity.EXTRA_VIEW_INDEX, viewIndex);
         setActivityIntent(intent);
-        return getActivity();
+        OpenGLES20NativeActivity activity = getActivity();
+        assertTrue(activity.waitForFrameDrawn());
+        return activity;
     }
 
     /**
@@ -66,7 +68,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);
     }
 
     /**
@@ -80,7 +82,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);
     }
 
     /**
@@ -103,7 +105,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/OpenGLES20ActivityOne.java b/tests/tests/opengl/src/android/opengl/cts/OpenGLES20ActivityOne.java
index 4a4e4ca..a8388c2 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,18 +46,28 @@
         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();
@@ -64,43 +79,43 @@
     @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 (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 {
                     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/OpenGLES20NativeActivity.java b/tests/tests/opengl/src/android/opengl/cts/OpenGLES20NativeActivity.java
index 4579ebf..36f986b 100755
--- a/tests/tests/opengl/src/android/opengl/cts/OpenGLES20NativeActivity.java
+++ b/tests/tests/opengl/src/android/opengl/cts/OpenGLES20NativeActivity.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;
+
 import javax.microedition.khronos.egl.EGLConfig;
 import javax.microedition.khronos.opengles.GL10;
 
@@ -37,6 +41,8 @@
     GL2Renderer mRenderer;
     int mRendererType;
 
+    private CountDownLatch mLatch = new CountDownLatch(1);
+
     /**
      * Called when the activity is first created.
      */
@@ -50,10 +56,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();
@@ -69,10 +85,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);
         }
 
@@ -93,9 +109,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) {
@@ -113,5 +132,6 @@
         Log.i(TAG,"error:" + mAttachShaderError);
         this.mShaderCount = GL2JniLibOne.getAttachedShaderCount();
         Log.i(TAG,"ShaderCount:" + mShaderCount);
+        mLatch.countDown();
     }
 }
diff --git a/tests/tests/opengl/src/android/opengl/cts/RendererBase.java b/tests/tests/opengl/src/android/opengl/cts/RendererBase.java
index b64f47a..d015fcd 100644
--- a/tests/tests/opengl/src/android/opengl/cts/RendererBase.java
+++ b/tests/tests/opengl/src/android/opengl/cts/RendererBase.java
@@ -23,15 +23,25 @@
 import android.opengl.GLSurfaceView;
 import android.opengl.GLSurfaceView.Renderer;
 
+import java.util.concurrent.CountDownLatch;
+
 public abstract class RendererBase implements GLSurfaceView.Renderer {
 
     FloatBuffer floatBuffer;
     int mProgram;
     int maPositionHandle;
 
-    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,17 @@
         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/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/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/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(){