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 |