| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Tests for the command parser. | 5 // Tests for the command parser. |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <memory> |
| 10 |
| 9 #include "base/logging.h" | 11 #include "base/logging.h" |
| 10 #include "base/memory/scoped_ptr.h" | |
| 11 #include "gpu/command_buffer/service/cmd_parser.h" | 12 #include "gpu/command_buffer/service/cmd_parser.h" |
| 12 #include "gpu/command_buffer/service/mocks.h" | 13 #include "gpu/command_buffer/service/mocks.h" |
| 13 #include "testing/gtest/include/gtest/gtest.h" | 14 #include "testing/gtest/include/gtest/gtest.h" |
| 14 | 15 |
| 15 namespace gpu { | 16 namespace gpu { |
| 16 | 17 |
| 17 using testing::_; | 18 using testing::_; |
| 18 using testing::Invoke; | 19 using testing::Invoke; |
| 19 using testing::Mock; | 20 using testing::Mock; |
| 20 using testing::Return; | 21 using testing::Return; |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 54 | 55 |
| 55 parser->SetBuffer(buffer(), shm_size, 0, command_buffer_size); | 56 parser->SetBuffer(buffer(), shm_size, 0, command_buffer_size); |
| 56 return parser; | 57 return parser; |
| 57 } | 58 } |
| 58 | 59 |
| 59 unsigned int buffer_entry_count() { return 20; } | 60 unsigned int buffer_entry_count() { return 20; } |
| 60 AsyncAPIMock *api_mock() { return api_mock_.get(); } | 61 AsyncAPIMock *api_mock() { return api_mock_.get(); } |
| 61 CommandBufferEntry *buffer() { return buffer_.get(); } | 62 CommandBufferEntry *buffer() { return buffer_.get(); } |
| 62 private: | 63 private: |
| 63 unsigned int buffer_entry_count_; | 64 unsigned int buffer_entry_count_; |
| 64 scoped_ptr<AsyncAPIMock> api_mock_; | 65 std::unique_ptr<AsyncAPIMock> api_mock_; |
| 65 scoped_ptr<CommandBufferEntry[]> buffer_; | 66 std::unique_ptr<CommandBufferEntry[]> buffer_; |
| 66 Sequence sequence_; | 67 Sequence sequence_; |
| 67 }; | 68 }; |
| 68 | 69 |
| 69 // Tests initialization conditions. | 70 // Tests initialization conditions. |
| 70 TEST_F(CommandParserTest, TestInit) { | 71 TEST_F(CommandParserTest, TestInit) { |
| 71 scoped_ptr<CommandParser> parser(MakeParser(10)); | 72 std::unique_ptr<CommandParser> parser(MakeParser(10)); |
| 72 EXPECT_EQ(0, parser->get()); | 73 EXPECT_EQ(0, parser->get()); |
| 73 EXPECT_EQ(0, parser->put()); | 74 EXPECT_EQ(0, parser->put()); |
| 74 EXPECT_TRUE(parser->IsEmpty()); | 75 EXPECT_TRUE(parser->IsEmpty()); |
| 75 } | 76 } |
| 76 | 77 |
| 77 // Tests simple commands. | 78 // Tests simple commands. |
| 78 TEST_F(CommandParserTest, TestSimple) { | 79 TEST_F(CommandParserTest, TestSimple) { |
| 79 scoped_ptr<CommandParser> parser(MakeParser(10)); | 80 std::unique_ptr<CommandParser> parser(MakeParser(10)); |
| 80 CommandBufferOffset put = parser->put(); | 81 CommandBufferOffset put = parser->put(); |
| 81 CommandHeader header; | 82 CommandHeader header; |
| 82 | 83 |
| 83 // add a single command, no args | 84 // add a single command, no args |
| 84 header.size = 1; | 85 header.size = 1; |
| 85 header.command = 123; | 86 header.command = 123; |
| 86 buffer()[put++].value_header = header; | 87 buffer()[put++].value_header = header; |
| 87 parser->set_put(put); | 88 parser->set_put(put); |
| 88 EXPECT_EQ(put, parser->put()); | 89 EXPECT_EQ(put, parser->put()); |
| 89 | 90 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 102 EXPECT_EQ(put, parser->put()); | 103 EXPECT_EQ(put, parser->put()); |
| 103 | 104 |
| 104 AddDoCommandsExpect(error::kNoError, 1, 3, 3); | 105 AddDoCommandsExpect(error::kNoError, 1, 3, 3); |
| 105 EXPECT_EQ(error::kNoError, parser->ProcessCommands(1)); | 106 EXPECT_EQ(error::kNoError, parser->ProcessCommands(1)); |
| 106 EXPECT_EQ(put, parser->get()); | 107 EXPECT_EQ(put, parser->get()); |
| 107 Mock::VerifyAndClearExpectations(api_mock()); | 108 Mock::VerifyAndClearExpectations(api_mock()); |
| 108 } | 109 } |
| 109 | 110 |
| 110 // Tests having multiple commands in the buffer. | 111 // Tests having multiple commands in the buffer. |
| 111 TEST_F(CommandParserTest, TestMultipleCommands) { | 112 TEST_F(CommandParserTest, TestMultipleCommands) { |
| 112 scoped_ptr<CommandParser> parser(MakeParser(10)); | 113 std::unique_ptr<CommandParser> parser(MakeParser(10)); |
| 113 CommandBufferOffset put = parser->put(); | 114 CommandBufferOffset put = parser->put(); |
| 114 CommandHeader header; | 115 CommandHeader header; |
| 115 | 116 |
| 116 // add 2 commands, test with single ProcessCommands() | 117 // add 2 commands, test with single ProcessCommands() |
| 117 header.size = 2; | 118 header.size = 2; |
| 118 header.command = 789; | 119 header.command = 789; |
| 119 buffer()[put++].value_header = header; | 120 buffer()[put++].value_header = header; |
| 120 buffer()[put++].value_int32 = 5151; | 121 buffer()[put++].value_int32 = 5151; |
| 121 | 122 |
| 122 CommandBufferOffset put_cmd2 = put; | 123 CommandBufferOffset put_cmd2 = put; |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 154 // 4 entries remaining. | 155 // 4 entries remaining. |
| 155 AddDoCommandsExpect( | 156 AddDoCommandsExpect( |
| 156 error::kNoError, CommandParser::kParseCommandsSlice, 4, 4); | 157 error::kNoError, CommandParser::kParseCommandsSlice, 4, 4); |
| 157 EXPECT_EQ(error::kNoError, parser->ProcessAllCommands()); | 158 EXPECT_EQ(error::kNoError, parser->ProcessAllCommands()); |
| 158 EXPECT_EQ(put, parser->get()); | 159 EXPECT_EQ(put, parser->get()); |
| 159 Mock::VerifyAndClearExpectations(api_mock()); | 160 Mock::VerifyAndClearExpectations(api_mock()); |
| 160 } | 161 } |
| 161 | 162 |
| 162 // Tests that the parser will wrap correctly at the end of the buffer. | 163 // Tests that the parser will wrap correctly at the end of the buffer. |
| 163 TEST_F(CommandParserTest, TestWrap) { | 164 TEST_F(CommandParserTest, TestWrap) { |
| 164 scoped_ptr<CommandParser> parser(MakeParser(5)); | 165 std::unique_ptr<CommandParser> parser(MakeParser(5)); |
| 165 CommandBufferOffset put = parser->put(); | 166 CommandBufferOffset put = parser->put(); |
| 166 CommandHeader header; | 167 CommandHeader header; |
| 167 | 168 |
| 168 // add 3 commands with no args (1 word each) | 169 // add 3 commands with no args (1 word each) |
| 169 for (unsigned int i = 0; i < 3; ++i) { | 170 for (unsigned int i = 0; i < 3; ++i) { |
| 170 header.size = 1; | 171 header.size = 1; |
| 171 header.command = i; | 172 header.command = i; |
| 172 buffer()[put++].value_header = header; | 173 buffer()[put++].value_header = header; |
| 173 } | 174 } |
| 174 parser->set_put(put); | 175 parser->set_put(put); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 206 EXPECT_EQ(put, parser->put()); | 207 EXPECT_EQ(put, parser->put()); |
| 207 | 208 |
| 208 EXPECT_EQ(error::kNoError, parser->ProcessAllCommands()); | 209 EXPECT_EQ(error::kNoError, parser->ProcessAllCommands()); |
| 209 EXPECT_EQ(put, parser->get()); | 210 EXPECT_EQ(put, parser->get()); |
| 210 Mock::VerifyAndClearExpectations(api_mock()); | 211 Mock::VerifyAndClearExpectations(api_mock()); |
| 211 } | 212 } |
| 212 | 213 |
| 213 // Tests error conditions. | 214 // Tests error conditions. |
| 214 TEST_F(CommandParserTest, TestError) { | 215 TEST_F(CommandParserTest, TestError) { |
| 215 const unsigned int kNumEntries = 5; | 216 const unsigned int kNumEntries = 5; |
| 216 scoped_ptr<CommandParser> parser(MakeParser(kNumEntries)); | 217 std::unique_ptr<CommandParser> parser(MakeParser(kNumEntries)); |
| 217 CommandBufferOffset put = parser->put(); | 218 CommandBufferOffset put = parser->put(); |
| 218 CommandHeader header; | 219 CommandHeader header; |
| 219 | 220 |
| 220 EXPECT_FALSE(parser->set_get(-1)); | 221 EXPECT_FALSE(parser->set_get(-1)); |
| 221 EXPECT_FALSE(parser->set_get(kNumEntries)); | 222 EXPECT_FALSE(parser->set_get(kNumEntries)); |
| 222 | 223 |
| 223 // Generate a command with size 0. | 224 // Generate a command with size 0. |
| 224 header.size = 0; | 225 header.size = 0; |
| 225 header.command = 3; | 226 header.command = 3; |
| 226 buffer()[put++].value_header = header; | 227 buffer()[put++].value_header = header; |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 278 Mock::VerifyAndClearExpectations(api_mock()); | 279 Mock::VerifyAndClearExpectations(api_mock()); |
| 279 // make the second one succeed, and check that the parser recovered fine. | 280 // make the second one succeed, and check that the parser recovered fine. |
| 280 AddDoCommandsExpect( | 281 AddDoCommandsExpect( |
| 281 error::kNoError, CommandParser::kParseCommandsSlice, 1, 1); | 282 error::kNoError, CommandParser::kParseCommandsSlice, 1, 1); |
| 282 EXPECT_EQ(error::kNoError, parser->ProcessAllCommands()); | 283 EXPECT_EQ(error::kNoError, parser->ProcessAllCommands()); |
| 283 EXPECT_EQ(put, parser->get()); | 284 EXPECT_EQ(put, parser->get()); |
| 284 Mock::VerifyAndClearExpectations(api_mock()); | 285 Mock::VerifyAndClearExpectations(api_mock()); |
| 285 } | 286 } |
| 286 | 287 |
| 287 TEST_F(CommandParserTest, SetBuffer) { | 288 TEST_F(CommandParserTest, SetBuffer) { |
| 288 scoped_ptr<CommandParser> parser(MakeParser(3)); | 289 std::unique_ptr<CommandParser> parser(MakeParser(3)); |
| 289 CommandBufferOffset put = parser->put(); | 290 CommandBufferOffset put = parser->put(); |
| 290 CommandHeader header; | 291 CommandHeader header; |
| 291 | 292 |
| 292 // add a single command, no args | 293 // add a single command, no args |
| 293 header.size = 2; | 294 header.size = 2; |
| 294 header.command = 123; | 295 header.command = 123; |
| 295 buffer()[put++].value_header = header; | 296 buffer()[put++].value_header = header; |
| 296 buffer()[put++].value_int32 = 456; | 297 buffer()[put++].value_int32 = 456; |
| 297 parser->set_put(put); | 298 parser->set_put(put); |
| 298 | 299 |
| 299 AddDoCommandsExpect( | 300 AddDoCommandsExpect( |
| 300 error::kNoError, CommandParser::kParseCommandsSlice, 2, 2); | 301 error::kNoError, CommandParser::kParseCommandsSlice, 2, 2); |
| 301 EXPECT_EQ(error::kNoError, parser->ProcessAllCommands()); | 302 EXPECT_EQ(error::kNoError, parser->ProcessAllCommands()); |
| 302 // We should have advanced 2 entries | 303 // We should have advanced 2 entries |
| 303 EXPECT_EQ(2, parser->get()); | 304 EXPECT_EQ(2, parser->get()); |
| 304 Mock::VerifyAndClearExpectations(api_mock()); | 305 Mock::VerifyAndClearExpectations(api_mock()); |
| 305 | 306 |
| 306 scoped_ptr<CommandBufferEntry[]> buffer2(new CommandBufferEntry[2]); | 307 std::unique_ptr<CommandBufferEntry[]> buffer2(new CommandBufferEntry[2]); |
| 307 parser->SetBuffer( | 308 parser->SetBuffer( |
| 308 buffer2.get(), sizeof(CommandBufferEntry) * 2, 0, | 309 buffer2.get(), sizeof(CommandBufferEntry) * 2, 0, |
| 309 sizeof(CommandBufferEntry) * 2); | 310 sizeof(CommandBufferEntry) * 2); |
| 310 // The put and get should have reset to 0. | 311 // The put and get should have reset to 0. |
| 311 EXPECT_EQ(0, parser->get()); | 312 EXPECT_EQ(0, parser->get()); |
| 312 EXPECT_EQ(0, parser->put()); | 313 EXPECT_EQ(0, parser->put()); |
| 313 } | 314 } |
| 314 | 315 |
| 315 } // namespace gpu | 316 } // namespace gpu |
| OLD | NEW |