| Index: gpu/command_buffer/tests/gl_gpu_memory_buffer_unittests.cc | 
| diff --git a/gpu/command_buffer/tests/gl_gpu_memory_buffer_unittests.cc b/gpu/command_buffer/tests/gl_gpu_memory_buffer_unittests.cc | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..5b5f156572b6cf3aa650101aef4464a751e44922 | 
| --- /dev/null | 
| +++ b/gpu/command_buffer/tests/gl_gpu_memory_buffer_unittests.cc | 
| @@ -0,0 +1,137 @@ | 
| +// Copyright (c) 2013 The Chromium Authors. All rights reserved. | 
| +// Use of this source code is governed by a BSD-style license that can be | 
| +// found in the LICENSE file. | 
| + | 
| +#include <GLES2/gl2.h> | 
| +#include <GLES2/gl2chromium.h> | 
| +#include <GLES2/gl2ext.h> | 
| +#include <GLES2/gl2extchromium.h> | 
| + | 
| +#include "base/bind.h" | 
| +#include "base/memory/ref_counted.h" | 
| +#include "gpu/command_buffer/client/gles2_implementation.h" | 
| +#include "gpu/command_buffer/client/gpu_memory_buffer_factory.h" | 
| +#include "gpu/command_buffer/client/gpu_memory_buffer_mock.h" | 
| +#include "gpu/command_buffer/client/image_factory_mock.h" | 
| +#include "gpu/command_buffer/service/image_manager.h" | 
| +#include "gpu/command_buffer/tests/gl_manager.h" | 
| +#include "gpu/command_buffer/tests/gl_test_utils.h" | 
| +#include "testing/gmock/include/gmock/gmock.h" | 
| +#include "testing/gtest/include/gtest/gtest.h" | 
| +#include "ui/gfx/native_widget_types.h" | 
| +#include "ui/gl/gl_image.h" | 
| +#include "ui/gl/gl_image_mock.h" | 
| + | 
| +using testing::_; | 
| +using testing::Return; | 
| +using testing::SetArgPointee; | 
| +using testing::StrictMock; | 
| + | 
| +namespace gpu { | 
| +namespace gles2 { | 
| + | 
| +static const int kImageWidth = 256; | 
| +static const int kImageHeight = 256; | 
| +static const int kImageBytesPerPixel = 4; | 
| + | 
| +class GLGpuMemoryBufferTest : public testing::Test { | 
| + protected: | 
| +  virtual void SetUp() { | 
| +    GLManager::Options options; | 
| +    image_manager_ = new ImageManager; | 
| +    image_factory_.reset( | 
| +        new StrictMock<ImageFactoryMock>(image_manager_)); | 
| +    options.image_manager = image_manager_; | 
| +    options.image_factory = image_factory_.get(); | 
| + | 
| +    gl_.Initialize(options); | 
| +    gl_.MakeCurrent(); | 
| +  } | 
| + | 
| +  virtual void TearDown() { | 
| +    gl_.Destroy(); | 
| +  } | 
| + | 
| +  scoped_ptr<StrictMock<ImageFactoryMock> > image_factory_; | 
| +  scoped_refptr<ImageManager> image_manager_; | 
| +  GLManager gl_; | 
| +}; | 
| + | 
| +// An end to end test that tests the whole GpuMemoryBuffer lifecycle. | 
| +TEST_F(GLGpuMemoryBufferTest, Lifecycle) { | 
| +  // Create a client texture id. | 
| +  GLuint texture_id; | 
| +  glGenTextures(1, &texture_id); | 
| + | 
| +  // Buffer is owned and freed by GpuMemoryBufferTracker. | 
| +  StrictMock<GpuMemoryBufferMock>* gpu_memory_buffer = | 
| +      new StrictMock<GpuMemoryBufferMock>(kImageWidth, kImageHeight); | 
| + | 
| +  EXPECT_CALL(*image_factory_.get(), CreateGpuMemoryBufferMock( | 
| +      kImageWidth, kImageHeight, GL_RGBA8_OES, _)) | 
| +      .Times(1) | 
| +      .WillOnce(DoAll(SetArgPointee<3>(345u), | 
| +                      Return(gpu_memory_buffer))) | 
| +      .RetiresOnSaturation(); | 
| + | 
| +  // Create the GLImage and insert it into the ImageManager, which | 
| +  // would be done within CreateGpuMemoryBufferMock if it weren't a mock. | 
| +  GLuint image_id = glCreateImageCHROMIUM( | 
| +      kImageWidth, kImageHeight, GL_RGBA8_OES); | 
| +  gfx::Size size(kImageWidth, kImageHeight); | 
| + | 
| +  scoped_refptr<gfx::GLImageMock> gl_image( | 
| +      new gfx::GLImageMock(gpu_memory_buffer, size)); | 
| +  image_manager_->AddImage(gl_image.get(), image_id); | 
| + | 
| +  EXPECT_CALL(*gpu_memory_buffer, IsMapped()) | 
| +      .WillOnce(Return(false))  // before Map() | 
| +      .WillOnce(Return(true))   // after Map() and before Unmap() | 
| +      .RetiresOnSaturation(); | 
| + | 
| +  scoped_ptr<uint8[]> buffer_pixels(new uint8[ | 
| +      kImageWidth * kImageHeight * kImageBytesPerPixel]); | 
| + | 
| +  EXPECT_CALL(*gpu_memory_buffer, Map(_, _)) | 
| +      .Times(1) | 
| +      .WillOnce(SetArgPointee<1>(buffer_pixels.get())) | 
| +      .RetiresOnSaturation(); | 
| +  void* mapped_buffer = | 
| +      glMapImageCHROMIUM(image_id, GL_WRITE_ONLY); | 
| +  EXPECT_EQ(buffer_pixels.get(), mapped_buffer); | 
| + | 
| +  // Unmap the image. | 
| +  EXPECT_CALL(*gpu_memory_buffer, Unmap()) | 
| +      .Times(1) | 
| +      .RetiresOnSaturation(); | 
| +  glUnmapImageCHROMIUM(image_id); | 
| + | 
| +  // Bind the texture and the image. | 
| +  glBindTexture(GL_TEXTURE_2D, texture_id); | 
| +  EXPECT_CALL(*gl_image, BindTexImage()) | 
| +      .Times(1) | 
| +      .WillOnce(Return(true)) | 
| +      .RetiresOnSaturation(); | 
| +  EXPECT_CALL(*gl_image, GetSize()) | 
| +      .Times(1) | 
| +      .WillOnce(Return(size)) | 
| +      .RetiresOnSaturation(); | 
| +  glBindTexImage2DCHROMIUM(GL_TEXTURE_2D, image_id); | 
| + | 
| +  // Destroy the image. | 
| +  EXPECT_CALL(*gpu_memory_buffer, Die()) | 
| +      .Times(1) | 
| +      .RetiresOnSaturation(); | 
| + | 
| +  EXPECT_CALL(*image_factory_.get(), DeleteGpuMemoryBuffer(image_id)) | 
| +      .Times(1) | 
| +      .RetiresOnSaturation(); | 
| + | 
| +  glDestroyImageCHROMIUM(image_id); | 
| + | 
| +  // Delete the texture. | 
| +  glDeleteTextures(1, &texture_id); | 
| +} | 
| + | 
| +}  // namespace gles2 | 
| +}  // namespace gpu | 
|  |