Add tests for pack buffer corner cases.

BUG=angle:511

Change-Id: I72ff4f8fa83d9dda4d186d727035085ecc39a9dc
Reviewed-on: https://chromium-review.googlesource.com/197703
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Tested-by: Jamie Madill <jmadill@chromium.org>
diff --git a/tests/angle_tests/ReadPixelsTest.cpp b/tests/angle_tests/ReadPixelsTest.cpp
index d90122f..3559add 100644
--- a/tests/angle_tests/ReadPixelsTest.cpp
+++ b/tests/angle_tests/ReadPixelsTest.cpp
@@ -5,6 +5,7 @@
 protected:
     ReadPixelsTest()
     {
+        setClientVersion(3);
         setWindowWidth(32);
         setWindowHeight(32);
         setConfigRedBits(8);
@@ -12,6 +13,75 @@
         setConfigBlueBits(8);
         setConfigAlphaBits(8);
     }
+
+    virtual void SetUp()
+    {
+        ANGLETest::SetUp();
+
+        glGenBuffers(1, &mPBO);
+        glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
+        glBufferData(GL_PIXEL_PACK_BUFFER, 4 * getWindowWidth() * getWindowHeight(), NULL, GL_STATIC_DRAW);
+        glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
+
+        const char *vertexShaderSrc = SHADER_SOURCE
+        (
+            attribute vec4 aTest;
+            attribute vec2 aPosition;
+            varying vec4 vTest;
+
+            void main()
+            {
+                vTest = aTest;
+                gl_Position = vec4(aPosition, 0.0, 1.0);
+                gl_PointSize = 1.0;
+            }
+        );
+
+        const char *fragmentShaderSrc = SHADER_SOURCE
+        (
+            precision mediump float;
+            varying vec4 vTest;
+
+            void main()
+            {
+                gl_FragColor = vTest;
+            }
+        );
+
+        mProgram = compileProgram(vertexShaderSrc, fragmentShaderSrc);
+
+        glGenTextures(1, &mTexture);
+        glBindTexture(GL_TEXTURE_2D, mTexture);
+        glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, 4, 1);
+
+        glGenFramebuffers(1, &mFBO);
+        glBindFramebuffer(GL_FRAMEBUFFER, mFBO);
+        glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTexture, 0);
+        glBindFramebuffer(GL_FRAMEBUFFER, 0);
+
+        glGenBuffers(1, &mPositionVBO);
+        glBindBuffer(GL_ARRAY_BUFFER, mPositionVBO);
+        glBufferData(GL_ARRAY_BUFFER, 128, NULL, GL_DYNAMIC_DRAW);
+        glBindBuffer(GL_ARRAY_BUFFER, 0);
+
+        ASSERT_GL_NO_ERROR();
+    }
+
+    virtual void TearDown()
+    {
+        ANGLETest::TearDown();
+
+        glDeleteBuffers(1, &mPBO);
+        glDeleteProgram(mProgram);
+        glDeleteTextures(1, &mTexture);
+        glDeleteFramebuffers(1, &mFBO);
+    }
+
+    GLuint mPBO;
+    GLuint mProgram;
+    GLuint mTexture;
+    GLuint mFBO;
+    GLuint mPositionVBO;
 };
 
 TEST_F(ReadPixelsTest, out_of_bounds)
@@ -46,3 +116,28 @@
         }
     }
 }
+
+TEST_F(ReadPixelsTest, pbo_with_other_target)
+{
+    glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
+    glClear(GL_COLOR_BUFFER_BIT);
+    EXPECT_GL_NO_ERROR();
+
+    glBindBuffer(GL_PIXEL_PACK_BUFFER, mPBO);
+    glReadPixels(0, 0, 16, 16, GL_RGBA, GL_UNSIGNED_BYTE, 0);
+
+    glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
+    glBindBuffer(GL_ARRAY_BUFFER, mPBO);
+
+    GLvoid *mappedPtr = glMapBufferRange(GL_ARRAY_BUFFER, 0, 32, GL_MAP_READ_BIT);
+    unsigned char *dataPtr = static_cast<unsigned char *>(mappedPtr);
+    EXPECT_GL_NO_ERROR();
+
+    EXPECT_EQ(255, dataPtr[0]);
+    EXPECT_EQ(0,   dataPtr[1]);
+    EXPECT_EQ(0,   dataPtr[2]);
+    EXPECT_EQ(255, dataPtr[3]);
+
+    glUnmapBuffer(GL_ARRAY_BUFFER);
+    EXPECT_GL_NO_ERROR();
+}