| Index: gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc
 | 
| diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc
 | 
| index 905a390b4f922c324a0f74eb89dbc4b9b5545554..e07a8eef5d3a6efa42e0413422fb435e0958f426 100644
 | 
| --- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc
 | 
| +++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc
 | 
| @@ -265,6 +265,115 @@ TEST_P(GLES2DecoderTest, IsTexture) {
 | 
|    EXPECT_FALSE(DoIsTexture(client_texture_id_));
 | 
|  }
 | 
|  
 | 
| +TEST_P(GLES2DecoderTest, ClientWaitSyncValid) {
 | 
| +  typedef cmds::ClientWaitSync::Result Result;
 | 
| +  Result* result = static_cast<Result*>(shared_memory_address_);
 | 
| +  cmds::ClientWaitSync cmd;
 | 
| +  uint32_t v32_0 = 0, v32_1 = 0;
 | 
| +  GLES2Util::MapUint64ToTwoUint32(0, &v32_0, &v32_1);
 | 
| +  cmd.Init(client_sync_id_, GL_SYNC_FLUSH_COMMANDS_BIT, v32_0, v32_1,
 | 
| +           shared_memory_id_, shared_memory_offset_);
 | 
| +  EXPECT_CALL(*gl_,
 | 
| +              ClientWaitSync(reinterpret_cast<GLsync>(kServiceSyncId),
 | 
| +                             GL_SYNC_FLUSH_COMMANDS_BIT, 0))
 | 
| +      .WillOnce(Return(GL_CONDITION_SATISFIED))
 | 
| +      .RetiresOnSaturation();
 | 
| +  *result = GL_WAIT_FAILED;
 | 
| +  decoder_->set_unsafe_es3_apis_enabled(true);
 | 
| +  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
 | 
| +  EXPECT_EQ(static_cast<GLenum>(GL_CONDITION_SATISFIED), *result);
 | 
| +  EXPECT_EQ(GL_NO_ERROR, GetGLError());
 | 
| +  decoder_->set_unsafe_es3_apis_enabled(false);
 | 
| +  EXPECT_EQ(error::kUnknownCommand, ExecuteCmd(cmd));
 | 
| +}
 | 
| +
 | 
| +TEST_P(GLES2DecoderTest, ClientWaitSyncNonZeroTimeoutValid) {
 | 
| +  typedef cmds::ClientWaitSync::Result Result;
 | 
| +  Result* result = static_cast<Result*>(shared_memory_address_);
 | 
| +  cmds::ClientWaitSync cmd;
 | 
| +  const GLuint64 kTimeout = 0xABCDEF0123456789;
 | 
| +  uint32_t v32_0 = 0, v32_1 = 0;
 | 
| +  GLES2Util::MapUint64ToTwoUint32(kTimeout, &v32_0, &v32_1);
 | 
| +  cmd.Init(client_sync_id_, GL_SYNC_FLUSH_COMMANDS_BIT, v32_0, v32_1,
 | 
| +           shared_memory_id_, shared_memory_offset_);
 | 
| +  EXPECT_CALL(*gl_,
 | 
| +              ClientWaitSync(reinterpret_cast<GLsync>(kServiceSyncId),
 | 
| +                             GL_SYNC_FLUSH_COMMANDS_BIT, kTimeout))
 | 
| +      .WillOnce(Return(GL_CONDITION_SATISFIED))
 | 
| +      .RetiresOnSaturation();
 | 
| +  *result = GL_WAIT_FAILED;
 | 
| +  decoder_->set_unsafe_es3_apis_enabled(true);
 | 
| +  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
 | 
| +  EXPECT_EQ(static_cast<GLenum>(GL_CONDITION_SATISFIED), *result);
 | 
| +  EXPECT_EQ(GL_NO_ERROR, GetGLError());
 | 
| +  decoder_->set_unsafe_es3_apis_enabled(false);
 | 
| +  EXPECT_EQ(error::kUnknownCommand, ExecuteCmd(cmd));
 | 
| +}
 | 
| +
 | 
| +TEST_P(GLES2DecoderTest, ClientWaitSyncInvalidSyncFails) {
 | 
| +  typedef cmds::ClientWaitSync::Result Result;
 | 
| +  Result* result = static_cast<Result*>(shared_memory_address_);
 | 
| +  cmds::ClientWaitSync cmd;
 | 
| +  uint32_t v32_0 = 0, v32_1 = 0;
 | 
| +  GLES2Util::MapUint64ToTwoUint32(0, &v32_0, &v32_1);
 | 
| +  decoder_->set_unsafe_es3_apis_enabled(true);
 | 
| +  cmd.Init(kInvalidClientId, GL_SYNC_FLUSH_COMMANDS_BIT, v32_0, v32_1,
 | 
| +           shared_memory_id_, shared_memory_offset_);
 | 
| +  *result = GL_WAIT_FAILED;
 | 
| +  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
 | 
| +  EXPECT_EQ(static_cast<GLenum>(GL_WAIT_FAILED), *result);
 | 
| +  EXPECT_EQ(GL_INVALID_VALUE, GetGLError());
 | 
| +}
 | 
| +
 | 
| +TEST_P(GLES2DecoderTest, ClientWaitSyncResultNotInitFails) {
 | 
| +  typedef cmds::ClientWaitSync::Result Result;
 | 
| +  Result* result = static_cast<Result*>(shared_memory_address_);
 | 
| +  cmds::ClientWaitSync cmd;
 | 
| +  uint32_t v32_0 = 0, v32_1 = 0;
 | 
| +  GLES2Util::MapUint64ToTwoUint32(0, &v32_0, &v32_1);
 | 
| +  decoder_->set_unsafe_es3_apis_enabled(true);
 | 
| +  cmd.Init(client_sync_id_, GL_SYNC_FLUSH_COMMANDS_BIT, v32_0, v32_1,
 | 
| +           shared_memory_id_, shared_memory_offset_);
 | 
| +  *result = 1;  // Any value other than GL_WAIT_FAILED
 | 
| +  EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
 | 
| +}
 | 
| +
 | 
| +TEST_P(GLES2DecoderTest, ClientWaitSyncBadSharedMemoryFails) {
 | 
| +  typedef cmds::ClientWaitSync::Result Result;
 | 
| +  Result* result = static_cast<Result*>(shared_memory_address_);
 | 
| +  cmds::ClientWaitSync cmd;
 | 
| +  uint32_t v32_0 = 0, v32_1 = 0;
 | 
| +  GLES2Util::MapUint64ToTwoUint32(0, &v32_0, &v32_1);
 | 
| +  decoder_->set_unsafe_es3_apis_enabled(true);
 | 
| +  *result = GL_WAIT_FAILED;
 | 
| +  cmd.Init(client_sync_id_, GL_SYNC_FLUSH_COMMANDS_BIT, v32_0, v32_1,
 | 
| +           kInvalidSharedMemoryId, shared_memory_offset_);
 | 
| +  EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
 | 
| +
 | 
| +  *result = GL_WAIT_FAILED;
 | 
| +  cmd.Init(client_sync_id_, GL_SYNC_FLUSH_COMMANDS_BIT, v32_0, v32_1,
 | 
| +           shared_memory_id_, kInvalidSharedMemoryOffset);
 | 
| +  EXPECT_NE(error::kNoError, ExecuteCmd(cmd));
 | 
| +}
 | 
| +
 | 
| +TEST_P(GLES2DecoderTest, WaitSyncValidArgs) {
 | 
| +  const GLuint64 kTimeout = GL_TIMEOUT_IGNORED;
 | 
| +  EXPECT_CALL(*gl_, WaitSync(reinterpret_cast<GLsync>(kServiceSyncId),
 | 
| +                             0, kTimeout))
 | 
| +      .Times(1)
 | 
| +      .RetiresOnSaturation();
 | 
| +
 | 
| +  uint32_t v32_0 = 0, v32_1 = 0;
 | 
| +  GLES2Util::MapUint64ToTwoUint32(kTimeout, &v32_0, &v32_1);
 | 
| +  cmds::WaitSync cmd;
 | 
| +  cmd.Init(client_sync_id_, 0, v32_0, v32_1);
 | 
| +  decoder_->set_unsafe_es3_apis_enabled(true);
 | 
| +  EXPECT_EQ(error::kNoError, ExecuteCmd(cmd));
 | 
| +  EXPECT_EQ(GL_NO_ERROR, GetGLError());
 | 
| +  decoder_->set_unsafe_es3_apis_enabled(false);
 | 
| +  EXPECT_EQ(error::kUnknownCommand, ExecuteCmd(cmd));
 | 
| +}
 | 
| +
 | 
|  TEST_P(GLES2DecoderManualInitTest, BindGeneratesResourceFalse) {
 | 
|    InitState init;
 | 
|    InitDecoder(init);
 | 
| 
 |