Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(389)

Side by Side Diff: media/midi/midi_manager_unittest.cc

Issue 1217853007: Web MIDI: add a new UMA entry for the final result code (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: review #16 Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 #include "media/midi/midi_manager.h" 5 #include "media/midi/midi_manager.h"
6 6
7 #include <vector> 7 #include <vector>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 18 matching lines...) Expand all
29 void StartInitialization() override { 29 void StartInitialization() override {
30 start_initialization_is_called_ = true; 30 start_initialization_is_called_ = true;
31 } 31 }
32 32
33 void DispatchSendMidiData(MidiManagerClient* client, 33 void DispatchSendMidiData(MidiManagerClient* client,
34 uint32 port_index, 34 uint32 port_index,
35 const std::vector<uint8>& data, 35 const std::vector<uint8>& data,
36 double timestamp) override {} 36 double timestamp) override {}
37 37
38 // Utility functions for testing. 38 // Utility functions for testing.
39 void CallCompleteInitialization(MidiResult result) { 39 void CallCompleteInitialization(Result result) {
40 CompleteInitialization(result); 40 CompleteInitialization(result);
41 } 41 }
42 42
43 size_t GetClientCount() const { 43 size_t GetClientCount() const {
44 return clients_size_for_testing(); 44 return clients_size_for_testing();
45 } 45 }
46 46
47 size_t GetPendingClientCount() const { 47 size_t GetPendingClientCount() const {
48 return pending_clients_size_for_testing(); 48 return pending_clients_size_for_testing();
49 } 49 }
50 50
51 bool start_initialization_is_called_; 51 bool start_initialization_is_called_;
52 52
53 private: 53 private:
54 DISALLOW_COPY_AND_ASSIGN(FakeMidiManager); 54 DISALLOW_COPY_AND_ASSIGN(FakeMidiManager);
55 }; 55 };
56 56
57 class FakeMidiManagerClient : public MidiManagerClient { 57 class FakeMidiManagerClient : public MidiManagerClient {
58 public: 58 public:
59 FakeMidiManagerClient() 59 FakeMidiManagerClient()
60 : result_(MIDI_NOT_SUPPORTED), 60 : result_(Result::NOT_SUPPORTED), wait_for_result_(true) {}
61 wait_for_result_(true) {}
62 ~FakeMidiManagerClient() override {} 61 ~FakeMidiManagerClient() override {}
63 62
64 // MidiManagerClient implementation. 63 // MidiManagerClient implementation.
65 void AddInputPort(const MidiPortInfo& info) override {} 64 void AddInputPort(const MidiPortInfo& info) override {}
66 void AddOutputPort(const MidiPortInfo& info) override {} 65 void AddOutputPort(const MidiPortInfo& info) override {}
67 void SetInputPortState(uint32 port_index, MidiPortState state) override {} 66 void SetInputPortState(uint32 port_index, MidiPortState state) override {}
68 void SetOutputPortState(uint32 port_index, MidiPortState state) override {} 67 void SetOutputPortState(uint32 port_index, MidiPortState state) override {}
69 68
70 void CompleteStartSession(MidiResult result) override { 69 void CompleteStartSession(Result result) override {
71 EXPECT_TRUE(wait_for_result_); 70 EXPECT_TRUE(wait_for_result_);
72 result_ = result; 71 result_ = result;
73 wait_for_result_ = false; 72 wait_for_result_ = false;
74 } 73 }
75 74
76 void ReceiveMidiData(uint32 port_index, 75 void ReceiveMidiData(uint32 port_index,
77 const uint8* data, 76 const uint8* data,
78 size_t size, 77 size_t size,
79 double timestamp) override {} 78 double timestamp) override {}
80 void AccumulateMidiBytesSent(size_t size) override {} 79 void AccumulateMidiBytesSent(size_t size) override {}
81 80
82 MidiResult result() const { return result_; } 81 Result result() const { return result_; }
83 82
84 MidiResult WaitForResult() { 83 Result WaitForResult() {
85 while (wait_for_result_) { 84 while (wait_for_result_) {
86 base::RunLoop run_loop; 85 base::RunLoop run_loop;
87 run_loop.RunUntilIdle(); 86 run_loop.RunUntilIdle();
88 } 87 }
89 return result(); 88 return result();
90 } 89 }
91 90
92 private: 91 private:
93 MidiResult result_; 92 Result result_;
94 bool wait_for_result_; 93 bool wait_for_result_;
95 94
96 DISALLOW_COPY_AND_ASSIGN(FakeMidiManagerClient); 95 DISALLOW_COPY_AND_ASSIGN(FakeMidiManagerClient);
97 }; 96 };
98 97
99 class MidiManagerTest : public ::testing::Test { 98 class MidiManagerTest : public ::testing::Test {
100 public: 99 public:
101 MidiManagerTest() 100 MidiManagerTest()
102 : manager_(new FakeMidiManager), 101 : manager_(new FakeMidiManager),
103 message_loop_(new base::MessageLoop) {} 102 message_loop_(new base::MessageLoop) {}
(...skipping 25 matching lines...) Expand all
129 EXPECT_EQ(nth == 1, manager_->start_initialization_is_called_); 128 EXPECT_EQ(nth == 1, manager_->start_initialization_is_called_);
130 manager_->start_initialization_is_called_ = true; 129 manager_->start_initialization_is_called_ = true;
131 } 130 }
132 131
133 void EndSession(FakeMidiManagerClient* client, size_t before, size_t after) { 132 void EndSession(FakeMidiManagerClient* client, size_t before, size_t after) {
134 EXPECT_EQ(before, manager_->GetClientCount()); 133 EXPECT_EQ(before, manager_->GetClientCount());
135 manager_->EndSession(client); 134 manager_->EndSession(client);
136 EXPECT_EQ(after, manager_->GetClientCount()); 135 EXPECT_EQ(after, manager_->GetClientCount());
137 } 136 }
138 137
139 void CompleteInitialization(MidiResult result) { 138 void CompleteInitialization(Result result) {
140 manager_->CallCompleteInitialization(result); 139 manager_->CallCompleteInitialization(result);
141 } 140 }
142 141
143 void RunLoopUntilIdle() { 142 void RunLoopUntilIdle() {
144 base::RunLoop run_loop; 143 base::RunLoop run_loop;
145 run_loop.RunUntilIdle(); 144 run_loop.RunUntilIdle();
146 } 145 }
147 146
148 protected: 147 protected:
149 scoped_ptr<FakeMidiManager> manager_; 148 scoped_ptr<FakeMidiManager> manager_;
150 149
151 private: 150 private:
152 scoped_ptr<base::MessageLoop> message_loop_; 151 scoped_ptr<base::MessageLoop> message_loop_;
153 152
154 DISALLOW_COPY_AND_ASSIGN(MidiManagerTest); 153 DISALLOW_COPY_AND_ASSIGN(MidiManagerTest);
155 }; 154 };
156 155
157 TEST_F(MidiManagerTest, StartAndEndSession) { 156 TEST_F(MidiManagerTest, StartAndEndSession) {
158 scoped_ptr<FakeMidiManagerClient> client; 157 scoped_ptr<FakeMidiManagerClient> client;
159 client.reset(new FakeMidiManagerClient); 158 client.reset(new FakeMidiManagerClient);
160 159
161 StartTheFirstSession(client.get()); 160 StartTheFirstSession(client.get());
162 CompleteInitialization(MIDI_OK); 161 CompleteInitialization(Result::OK);
163 EXPECT_EQ(MIDI_OK, client->WaitForResult()); 162 EXPECT_EQ(Result::OK, client->WaitForResult());
164 EndSession(client.get(), 1U, 0U); 163 EndSession(client.get(), 1U, 0U);
165 } 164 }
166 165
167 TEST_F(MidiManagerTest, StartAndEndSessionWithError) { 166 TEST_F(MidiManagerTest, StartAndEndSessionWithError) {
168 scoped_ptr<FakeMidiManagerClient> client; 167 scoped_ptr<FakeMidiManagerClient> client;
169 client.reset(new FakeMidiManagerClient); 168 client.reset(new FakeMidiManagerClient);
170 169
171 StartTheFirstSession(client.get()); 170 StartTheFirstSession(client.get());
172 CompleteInitialization(MIDI_INITIALIZATION_ERROR); 171 CompleteInitialization(Result::INITIALIZATION_ERROR);
173 EXPECT_EQ(MIDI_INITIALIZATION_ERROR, client->WaitForResult()); 172 EXPECT_EQ(Result::INITIALIZATION_ERROR, client->WaitForResult());
174 EndSession(client.get(), 0U, 0U); 173 EndSession(client.get(), 0U, 0U);
175 } 174 }
176 175
177 TEST_F(MidiManagerTest, StartMultipleSessions) { 176 TEST_F(MidiManagerTest, StartMultipleSessions) {
178 scoped_ptr<FakeMidiManagerClient> client1; 177 scoped_ptr<FakeMidiManagerClient> client1;
179 scoped_ptr<FakeMidiManagerClient> client2; 178 scoped_ptr<FakeMidiManagerClient> client2;
180 scoped_ptr<FakeMidiManagerClient> client3; 179 scoped_ptr<FakeMidiManagerClient> client3;
181 client1.reset(new FakeMidiManagerClient); 180 client1.reset(new FakeMidiManagerClient);
182 client2.reset(new FakeMidiManagerClient); 181 client2.reset(new FakeMidiManagerClient);
183 client3.reset(new FakeMidiManagerClient); 182 client3.reset(new FakeMidiManagerClient);
184 183
185 StartTheFirstSession(client1.get()); 184 StartTheFirstSession(client1.get());
186 StartTheNthSession(client2.get(), 2); 185 StartTheNthSession(client2.get(), 2);
187 StartTheNthSession(client3.get(), 3); 186 StartTheNthSession(client3.get(), 3);
188 CompleteInitialization(MIDI_OK); 187 CompleteInitialization(Result::OK);
189 EXPECT_EQ(MIDI_OK, client1->WaitForResult()); 188 EXPECT_EQ(Result::OK, client1->WaitForResult());
190 EXPECT_EQ(MIDI_OK, client2->WaitForResult()); 189 EXPECT_EQ(Result::OK, client2->WaitForResult());
191 EXPECT_EQ(MIDI_OK, client3->WaitForResult()); 190 EXPECT_EQ(Result::OK, client3->WaitForResult());
192 EndSession(client1.get(), 3U, 2U); 191 EndSession(client1.get(), 3U, 2U);
193 EndSession(client2.get(), 2U, 1U); 192 EndSession(client2.get(), 2U, 1U);
194 EndSession(client3.get(), 1U, 0U); 193 EndSession(client3.get(), 1U, 0U);
195 } 194 }
196 195
197 // TODO(toyoshim): Add a test for a MidiManagerClient that has multiple 196 // TODO(toyoshim): Add a test for a MidiManagerClient that has multiple
198 // sessions with multiple client_id. 197 // sessions with multiple client_id.
199 198
200 TEST_F(MidiManagerTest, TooManyPendingSessions) { 199 TEST_F(MidiManagerTest, TooManyPendingSessions) {
201 // Push as many client requests for starting session as possible. 200 // Push as many client requests for starting session as possible.
202 ScopedVector<FakeMidiManagerClient> many_existing_clients; 201 ScopedVector<FakeMidiManagerClient> many_existing_clients;
203 many_existing_clients.resize(MidiManager::kMaxPendingClientCount); 202 many_existing_clients.resize(MidiManager::kMaxPendingClientCount);
204 for (size_t i = 0; i < MidiManager::kMaxPendingClientCount; ++i) { 203 for (size_t i = 0; i < MidiManager::kMaxPendingClientCount; ++i) {
205 many_existing_clients[i] = new FakeMidiManagerClient; 204 many_existing_clients[i] = new FakeMidiManagerClient;
206 StartTheNthSession(many_existing_clients[i], i + 1); 205 StartTheNthSession(many_existing_clients[i], i + 1);
207 } 206 }
208 207
209 // Push the last client that should be rejected for too many pending requests. 208 // Push the last client that should be rejected for too many pending requests.
210 scoped_ptr<FakeMidiManagerClient> additional_client( 209 scoped_ptr<FakeMidiManagerClient> additional_client(
211 new FakeMidiManagerClient); 210 new FakeMidiManagerClient);
212 manager_->start_initialization_is_called_ = false; 211 manager_->start_initialization_is_called_ = false;
213 manager_->StartSession(additional_client.get()); 212 manager_->StartSession(additional_client.get());
214 EXPECT_FALSE(manager_->start_initialization_is_called_); 213 EXPECT_FALSE(manager_->start_initialization_is_called_);
215 EXPECT_EQ(MIDI_INITIALIZATION_ERROR, additional_client->result()); 214 EXPECT_EQ(Result::INITIALIZATION_ERROR, additional_client->result());
216 215
217 // Other clients still should not receive a result. 216 // Other clients still should not receive a result.
218 RunLoopUntilIdle(); 217 RunLoopUntilIdle();
219 for (size_t i = 0; i < many_existing_clients.size(); ++i) 218 for (size_t i = 0; i < many_existing_clients.size(); ++i)
220 EXPECT_EQ(MIDI_NOT_SUPPORTED, many_existing_clients[i]->result()); 219 EXPECT_EQ(Result::NOT_SUPPORTED, many_existing_clients[i]->result());
221 220
222 // The result MIDI_OK should be distributed to other clients. 221 // The Result::OK should be distributed to other clients.
223 CompleteInitialization(MIDI_OK); 222 CompleteInitialization(Result::OK);
224 for (size_t i = 0; i < many_existing_clients.size(); ++i) 223 for (size_t i = 0; i < many_existing_clients.size(); ++i)
225 EXPECT_EQ(MIDI_OK, many_existing_clients[i]->WaitForResult()); 224 EXPECT_EQ(Result::OK, many_existing_clients[i]->WaitForResult());
226 225
227 // Close all successful sessions in FIFO order. 226 // Close all successful sessions in FIFO order.
228 size_t sessions = many_existing_clients.size(); 227 size_t sessions = many_existing_clients.size();
229 for (size_t i = 0; i < many_existing_clients.size(); ++i, --sessions) 228 for (size_t i = 0; i < many_existing_clients.size(); ++i, --sessions)
230 EndSession(many_existing_clients[i], sessions, sessions - 1); 229 EndSession(many_existing_clients[i], sessions, sessions - 1);
231 } 230 }
232 231
233 TEST_F(MidiManagerTest, AbortSession) { 232 TEST_F(MidiManagerTest, AbortSession) {
234 // A client starting a session can be destructed while an asynchronous 233 // A client starting a session can be destructed while an asynchronous
235 // initialization is performed. 234 // initialization is performed.
236 scoped_ptr<FakeMidiManagerClient> client; 235 scoped_ptr<FakeMidiManagerClient> client;
237 client.reset(new FakeMidiManagerClient); 236 client.reset(new FakeMidiManagerClient);
238 237
239 StartTheFirstSession(client.get()); 238 StartTheFirstSession(client.get());
240 EndSession(client.get(), 0, 0); 239 EndSession(client.get(), 0, 0);
241 client.reset(); 240 client.reset();
242 241
243 // Following function should not call the destructed |client| function. 242 // Following function should not call the destructed |client| function.
244 CompleteInitialization(MIDI_OK); 243 CompleteInitialization(Result::OK);
245 base::RunLoop run_loop; 244 base::RunLoop run_loop;
246 run_loop.RunUntilIdle(); 245 run_loop.RunUntilIdle();
247 } 246 }
248 247
249 TEST_F(MidiManagerTest, CreateMidiManager) { 248 TEST_F(MidiManagerTest, CreateMidiManager) {
250 // SystemMonitor is needed on Windows. 249 // SystemMonitor is needed on Windows.
251 base::SystemMonitor system_monitor; 250 base::SystemMonitor system_monitor;
252 251
253 scoped_ptr<FakeMidiManagerClient> client; 252 scoped_ptr<FakeMidiManagerClient> client;
254 client.reset(new FakeMidiManagerClient); 253 client.reset(new FakeMidiManagerClient);
255 254
256 scoped_ptr<MidiManager> manager(MidiManager::Create()); 255 scoped_ptr<MidiManager> manager(MidiManager::Create());
257 manager->StartSession(client.get()); 256 manager->StartSession(client.get());
258 257
259 MidiResult result = client->WaitForResult(); 258 Result result = client->WaitForResult();
260 // This #ifdef needs to be identical to the one in media/midi/midi_manager.cc. 259 // This #ifdef needs to be identical to the one in media/midi/midi_manager.cc.
261 // Do not change the condition for disabling this test. 260 // Do not change the condition for disabling this test.
262 #if !defined(OS_MACOSX) && !defined(OS_WIN) && \ 261 #if !defined(OS_MACOSX) && !defined(OS_WIN) && \
263 !(defined(USE_ALSA) && defined(USE_UDEV)) && !defined(OS_ANDROID) 262 !(defined(USE_ALSA) && defined(USE_UDEV)) && !defined(OS_ANDROID)
264 EXPECT_EQ(MIDI_NOT_SUPPORTED, result); 263 EXPECT_EQ(Result::NOT_SUPPORTED, result);
265 #elif defined(USE_ALSA) 264 #elif defined(USE_ALSA)
266 // Temporary until http://crbug.com/371230 is resolved. 265 // Temporary until http://crbug.com/371230 is resolved.
267 EXPECT_TRUE((result == MIDI_OK) || (result == MIDI_INITIALIZATION_ERROR)); 266 EXPECT_TRUE(result == Result::OK || result == Result::INITIALIZATION_ERROR);
268 #else 267 #else
269 EXPECT_EQ(MIDI_OK, result); 268 EXPECT_EQ(Result::OK, result);
270 #endif 269 #endif
271 } 270 }
272 271
273 } // namespace 272 } // namespace
274 273
275 } // namespace midi 274 } // namespace midi
276 } // namespace media 275 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698