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