OLD | NEW |
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 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
47 } | 47 } |
48 | 48 |
49 bool start_initialization_is_called_; | 49 bool start_initialization_is_called_; |
50 | 50 |
51 private: | 51 private: |
52 DISALLOW_COPY_AND_ASSIGN(FakeMidiManager); | 52 DISALLOW_COPY_AND_ASSIGN(FakeMidiManager); |
53 }; | 53 }; |
54 | 54 |
55 class FakeMidiManagerClient : public MidiManagerClient { | 55 class FakeMidiManagerClient : public MidiManagerClient { |
56 public: | 56 public: |
57 explicit FakeMidiManagerClient(int client_id) | 57 FakeMidiManagerClient() |
58 : client_id_(client_id), | 58 : result_(MIDI_NOT_SUPPORTED), |
59 result_(MIDI_NOT_SUPPORTED), | |
60 wait_for_result_(true) {} | 59 wait_for_result_(true) {} |
61 virtual ~FakeMidiManagerClient() {} | 60 virtual ~FakeMidiManagerClient() {} |
62 | 61 |
63 // MidiManagerClient implementation. | 62 // MidiManagerClient implementation. |
64 virtual void CompleteStartSession(int client_id, MidiResult result) override { | 63 virtual void CompleteStartSession(MidiResult result) override { |
65 EXPECT_TRUE(wait_for_result_); | 64 EXPECT_TRUE(wait_for_result_); |
66 CHECK_EQ(client_id_, client_id); | |
67 result_ = result; | 65 result_ = result; |
68 wait_for_result_ = false; | 66 wait_for_result_ = false; |
69 } | 67 } |
70 | 68 |
71 virtual void ReceiveMidiData(uint32 port_index, const uint8* data, | 69 virtual void ReceiveMidiData(uint32 port_index, const uint8* data, |
72 size_t size, double timestamp) override {} | 70 size_t size, double timestamp) override {} |
73 virtual void AccumulateMidiBytesSent(size_t size) override {} | 71 virtual void AccumulateMidiBytesSent(size_t size) override {} |
74 | 72 |
75 int client_id() const { return client_id_; } | |
76 MidiResult result() const { return result_; } | 73 MidiResult result() const { return result_; } |
77 | 74 |
78 MidiResult WaitForResult() { | 75 MidiResult WaitForResult() { |
79 while (wait_for_result_) { | 76 while (wait_for_result_) { |
80 base::RunLoop run_loop; | 77 base::RunLoop run_loop; |
81 run_loop.RunUntilIdle(); | 78 run_loop.RunUntilIdle(); |
82 } | 79 } |
83 return result(); | 80 return result(); |
84 } | 81 } |
85 | 82 |
86 private: | 83 private: |
87 int client_id_; | |
88 MidiResult result_; | 84 MidiResult result_; |
89 bool wait_for_result_; | 85 bool wait_for_result_; |
90 | 86 |
91 DISALLOW_COPY_AND_ASSIGN(FakeMidiManagerClient); | 87 DISALLOW_COPY_AND_ASSIGN(FakeMidiManagerClient); |
92 }; | 88 }; |
93 | 89 |
94 class MidiManagerTest : public ::testing::Test { | 90 class MidiManagerTest : public ::testing::Test { |
95 public: | 91 public: |
96 MidiManagerTest() | 92 MidiManagerTest() |
97 : manager_(new FakeMidiManager), | 93 : manager_(new FakeMidiManager), |
98 message_loop_(new base::MessageLoop) {} | 94 message_loop_(new base::MessageLoop) {} |
99 virtual ~MidiManagerTest() {} | 95 virtual ~MidiManagerTest() {} |
100 | 96 |
101 protected: | 97 protected: |
102 void StartTheFirstSession(FakeMidiManagerClient* client) { | 98 void StartTheFirstSession(FakeMidiManagerClient* client) { |
103 EXPECT_FALSE(manager_->start_initialization_is_called_); | 99 EXPECT_FALSE(manager_->start_initialization_is_called_); |
104 EXPECT_EQ(0U, manager_->GetClientCount()); | 100 EXPECT_EQ(0U, manager_->GetClientCount()); |
105 EXPECT_EQ(0U, manager_->GetPendingClientCount()); | 101 EXPECT_EQ(0U, manager_->GetPendingClientCount()); |
106 manager_->StartSession(client, client->client_id()); | 102 manager_->StartSession(client); |
107 EXPECT_EQ(0U, manager_->GetClientCount()); | 103 EXPECT_EQ(0U, manager_->GetClientCount()); |
108 EXPECT_EQ(1U, manager_->GetPendingClientCount()); | 104 EXPECT_EQ(1U, manager_->GetPendingClientCount()); |
109 EXPECT_TRUE(manager_->start_initialization_is_called_); | 105 EXPECT_TRUE(manager_->start_initialization_is_called_); |
110 EXPECT_EQ(0U, manager_->GetClientCount()); | 106 EXPECT_EQ(0U, manager_->GetClientCount()); |
111 EXPECT_EQ(1U, manager_->GetPendingClientCount()); | 107 EXPECT_EQ(1U, manager_->GetPendingClientCount()); |
112 EXPECT_TRUE(manager_->start_initialization_is_called_); | 108 EXPECT_TRUE(manager_->start_initialization_is_called_); |
113 } | 109 } |
114 | 110 |
115 void StartTheNthSession(FakeMidiManagerClient* client, size_t nth) { | 111 void StartTheNthSession(FakeMidiManagerClient* client, size_t nth) { |
116 EXPECT_EQ(nth != 1, manager_->start_initialization_is_called_); | 112 EXPECT_EQ(nth != 1, manager_->start_initialization_is_called_); |
117 EXPECT_EQ(0U, manager_->GetClientCount()); | 113 EXPECT_EQ(0U, manager_->GetClientCount()); |
118 EXPECT_EQ(nth - 1, manager_->GetPendingClientCount()); | 114 EXPECT_EQ(nth - 1, manager_->GetPendingClientCount()); |
119 | 115 |
120 // StartInitialization() should not be called for the second and later | 116 // StartInitialization() should not be called for the second and later |
121 // sessions. | 117 // sessions. |
122 manager_->start_initialization_is_called_ = false; | 118 manager_->start_initialization_is_called_ = false; |
123 manager_->StartSession(client, client->client_id()); | 119 manager_->StartSession(client); |
124 EXPECT_EQ(nth == 1, manager_->start_initialization_is_called_); | 120 EXPECT_EQ(nth == 1, manager_->start_initialization_is_called_); |
125 manager_->start_initialization_is_called_ = true; | 121 manager_->start_initialization_is_called_ = true; |
126 } | 122 } |
127 | 123 |
128 void EndSession(FakeMidiManagerClient* client, size_t before, size_t after) { | 124 void EndSession(FakeMidiManagerClient* client, size_t before, size_t after) { |
129 EXPECT_EQ(before, manager_->GetClientCount()); | 125 EXPECT_EQ(before, manager_->GetClientCount()); |
130 manager_->EndSession(client); | 126 manager_->EndSession(client); |
131 EXPECT_EQ(after, manager_->GetClientCount()); | 127 EXPECT_EQ(after, manager_->GetClientCount()); |
132 } | 128 } |
133 | 129 |
(...skipping 10 matching lines...) Expand all Loading... |
144 scoped_ptr<FakeMidiManager> manager_; | 140 scoped_ptr<FakeMidiManager> manager_; |
145 | 141 |
146 private: | 142 private: |
147 scoped_ptr<base::MessageLoop> message_loop_; | 143 scoped_ptr<base::MessageLoop> message_loop_; |
148 | 144 |
149 DISALLOW_COPY_AND_ASSIGN(MidiManagerTest); | 145 DISALLOW_COPY_AND_ASSIGN(MidiManagerTest); |
150 }; | 146 }; |
151 | 147 |
152 TEST_F(MidiManagerTest, StartAndEndSession) { | 148 TEST_F(MidiManagerTest, StartAndEndSession) { |
153 scoped_ptr<FakeMidiManagerClient> client; | 149 scoped_ptr<FakeMidiManagerClient> client; |
154 client.reset(new FakeMidiManagerClient(0)); | 150 client.reset(new FakeMidiManagerClient); |
155 | 151 |
156 StartTheFirstSession(client.get()); | 152 StartTheFirstSession(client.get()); |
157 CompleteInitialization(MIDI_OK); | 153 CompleteInitialization(MIDI_OK); |
158 EXPECT_EQ(MIDI_OK, client->WaitForResult()); | 154 EXPECT_EQ(MIDI_OK, client->WaitForResult()); |
159 EndSession(client.get(), 1U, 0U); | 155 EndSession(client.get(), 1U, 0U); |
160 } | 156 } |
161 | 157 |
162 TEST_F(MidiManagerTest, StartAndEndSessionWithError) { | 158 TEST_F(MidiManagerTest, StartAndEndSessionWithError) { |
163 scoped_ptr<FakeMidiManagerClient> client; | 159 scoped_ptr<FakeMidiManagerClient> client; |
164 client.reset(new FakeMidiManagerClient(1)); | 160 client.reset(new FakeMidiManagerClient); |
165 | 161 |
166 StartTheFirstSession(client.get()); | 162 StartTheFirstSession(client.get()); |
167 CompleteInitialization(MIDI_INITIALIZATION_ERROR); | 163 CompleteInitialization(MIDI_INITIALIZATION_ERROR); |
168 EXPECT_EQ(MIDI_INITIALIZATION_ERROR, client->WaitForResult()); | 164 EXPECT_EQ(MIDI_INITIALIZATION_ERROR, client->WaitForResult()); |
169 EndSession(client.get(), 0U, 0U); | 165 EndSession(client.get(), 0U, 0U); |
170 } | 166 } |
171 | 167 |
172 TEST_F(MidiManagerTest, StartMultipleSessions) { | 168 TEST_F(MidiManagerTest, StartMultipleSessions) { |
173 scoped_ptr<FakeMidiManagerClient> client1; | 169 scoped_ptr<FakeMidiManagerClient> client1; |
174 scoped_ptr<FakeMidiManagerClient> client2; | 170 scoped_ptr<FakeMidiManagerClient> client2; |
175 scoped_ptr<FakeMidiManagerClient> client3; | 171 scoped_ptr<FakeMidiManagerClient> client3; |
176 client1.reset(new FakeMidiManagerClient(0)); | 172 client1.reset(new FakeMidiManagerClient); |
177 client2.reset(new FakeMidiManagerClient(1)); | 173 client2.reset(new FakeMidiManagerClient); |
178 client3.reset(new FakeMidiManagerClient(1)); | 174 client3.reset(new FakeMidiManagerClient); |
179 | 175 |
180 StartTheFirstSession(client1.get()); | 176 StartTheFirstSession(client1.get()); |
181 StartTheNthSession(client2.get(), 2); | 177 StartTheNthSession(client2.get(), 2); |
182 StartTheNthSession(client3.get(), 3); | 178 StartTheNthSession(client3.get(), 3); |
183 CompleteInitialization(MIDI_OK); | 179 CompleteInitialization(MIDI_OK); |
184 EXPECT_EQ(MIDI_OK, client1->WaitForResult()); | 180 EXPECT_EQ(MIDI_OK, client1->WaitForResult()); |
185 EXPECT_EQ(MIDI_OK, client2->WaitForResult()); | 181 EXPECT_EQ(MIDI_OK, client2->WaitForResult()); |
186 EXPECT_EQ(MIDI_OK, client3->WaitForResult()); | 182 EXPECT_EQ(MIDI_OK, client3->WaitForResult()); |
187 EndSession(client1.get(), 3U, 2U); | 183 EndSession(client1.get(), 3U, 2U); |
188 EndSession(client2.get(), 2U, 1U); | 184 EndSession(client2.get(), 2U, 1U); |
189 EndSession(client3.get(), 1U, 0U); | 185 EndSession(client3.get(), 1U, 0U); |
190 } | 186 } |
191 | 187 |
192 // TODO(toyoshim): Add a test for a MidiManagerClient that has multiple | 188 // TODO(toyoshim): Add a test for a MidiManagerClient that has multiple |
193 // sessions with multiple client_id. | 189 // sessions with multiple client_id. |
194 | 190 |
195 TEST_F(MidiManagerTest, TooManyPendingSessions) { | 191 TEST_F(MidiManagerTest, TooManyPendingSessions) { |
196 // Push as many client requests for starting session as possible. | 192 // Push as many client requests for starting session as possible. |
197 ScopedVector<FakeMidiManagerClient> many_existing_clients; | 193 ScopedVector<FakeMidiManagerClient> many_existing_clients; |
198 many_existing_clients.resize(MidiManager::kMaxPendingClientCount); | 194 many_existing_clients.resize(MidiManager::kMaxPendingClientCount); |
199 for (size_t i = 0; i < MidiManager::kMaxPendingClientCount; ++i) { | 195 for (size_t i = 0; i < MidiManager::kMaxPendingClientCount; ++i) { |
200 many_existing_clients[i] = new FakeMidiManagerClient(i); | 196 many_existing_clients[i] = new FakeMidiManagerClient; |
201 StartTheNthSession(many_existing_clients[i], i + 1); | 197 StartTheNthSession(many_existing_clients[i], i + 1); |
202 } | 198 } |
203 | 199 |
204 // Push the last client that should be rejected for too many pending requests. | 200 // Push the last client that should be rejected for too many pending requests. |
205 scoped_ptr<FakeMidiManagerClient> additional_client( | 201 scoped_ptr<FakeMidiManagerClient> additional_client( |
206 new FakeMidiManagerClient(MidiManager::kMaxPendingClientCount)); | 202 new FakeMidiManagerClient); |
207 manager_->start_initialization_is_called_ = false; | 203 manager_->start_initialization_is_called_ = false; |
208 manager_->StartSession(additional_client.get(), | 204 manager_->StartSession(additional_client.get()); |
209 additional_client->client_id()); | |
210 EXPECT_FALSE(manager_->start_initialization_is_called_); | 205 EXPECT_FALSE(manager_->start_initialization_is_called_); |
211 EXPECT_EQ(MIDI_INITIALIZATION_ERROR, additional_client->result()); | 206 EXPECT_EQ(MIDI_INITIALIZATION_ERROR, additional_client->result()); |
212 | 207 |
213 // Other clients still should not receive a result. | 208 // Other clients still should not receive a result. |
214 RunLoopUntilIdle(); | 209 RunLoopUntilIdle(); |
215 for (size_t i = 0; i < many_existing_clients.size(); ++i) | 210 for (size_t i = 0; i < many_existing_clients.size(); ++i) |
216 EXPECT_EQ(MIDI_NOT_SUPPORTED, many_existing_clients[i]->result()); | 211 EXPECT_EQ(MIDI_NOT_SUPPORTED, many_existing_clients[i]->result()); |
217 | 212 |
218 // The result MIDI_OK should be distributed to other clients. | 213 // The result MIDI_OK should be distributed to other clients. |
219 CompleteInitialization(MIDI_OK); | 214 CompleteInitialization(MIDI_OK); |
220 for (size_t i = 0; i < many_existing_clients.size(); ++i) | 215 for (size_t i = 0; i < many_existing_clients.size(); ++i) |
221 EXPECT_EQ(MIDI_OK, many_existing_clients[i]->WaitForResult()); | 216 EXPECT_EQ(MIDI_OK, many_existing_clients[i]->WaitForResult()); |
222 | 217 |
223 // Close all successful sessions in FIFO order. | 218 // Close all successful sessions in FIFO order. |
224 size_t sessions = many_existing_clients.size(); | 219 size_t sessions = many_existing_clients.size(); |
225 for (size_t i = 0; i < many_existing_clients.size(); ++i, --sessions) | 220 for (size_t i = 0; i < many_existing_clients.size(); ++i, --sessions) |
226 EndSession(many_existing_clients[i], sessions, sessions - 1); | 221 EndSession(many_existing_clients[i], sessions, sessions - 1); |
227 } | 222 } |
228 | 223 |
229 TEST_F(MidiManagerTest, AbortSession) { | 224 TEST_F(MidiManagerTest, AbortSession) { |
230 // A client starting a session can be destructed while an asynchronous | 225 // A client starting a session can be destructed while an asynchronous |
231 // initialization is performed. | 226 // initialization is performed. |
232 scoped_ptr<FakeMidiManagerClient> client; | 227 scoped_ptr<FakeMidiManagerClient> client; |
233 client.reset(new FakeMidiManagerClient(0)); | 228 client.reset(new FakeMidiManagerClient); |
234 | 229 |
235 StartTheFirstSession(client.get()); | 230 StartTheFirstSession(client.get()); |
236 EndSession(client.get(), 0, 0); | 231 EndSession(client.get(), 0, 0); |
237 client.reset(); | 232 client.reset(); |
238 | 233 |
239 // Following function should not call the destructed |client| function. | 234 // Following function should not call the destructed |client| function. |
240 CompleteInitialization(MIDI_OK); | 235 CompleteInitialization(MIDI_OK); |
241 base::RunLoop run_loop; | 236 base::RunLoop run_loop; |
242 run_loop.RunUntilIdle(); | 237 run_loop.RunUntilIdle(); |
243 } | 238 } |
244 | 239 |
245 TEST_F(MidiManagerTest, CreateMidiManager) { | 240 TEST_F(MidiManagerTest, CreateMidiManager) { |
246 scoped_ptr<FakeMidiManagerClient> client; | 241 scoped_ptr<FakeMidiManagerClient> client; |
247 client.reset(new FakeMidiManagerClient(0)); | 242 client.reset(new FakeMidiManagerClient); |
248 | 243 |
249 scoped_ptr<MidiManager> manager(MidiManager::Create()); | 244 scoped_ptr<MidiManager> manager(MidiManager::Create()); |
250 manager->StartSession(client.get(), client->client_id()); | 245 manager->StartSession(client.get()); |
251 | 246 |
252 MidiResult result = client->WaitForResult(); | 247 MidiResult result = client->WaitForResult(); |
253 // This #ifdef needs to be identical to the one in media/midi/midi_manager.cc. | 248 // This #ifdef needs to be identical to the one in media/midi/midi_manager.cc. |
254 // Do not change the condition for disabling this test. | 249 // Do not change the condition for disabling this test. |
255 #if !defined(OS_MACOSX) && !defined(OS_WIN) && !defined(USE_ALSA) && \ | 250 #if !defined(OS_MACOSX) && !defined(OS_WIN) && !defined(USE_ALSA) && \ |
256 !defined(OS_ANDROID) && !defined(OS_CHROMEOS) | 251 !defined(OS_ANDROID) && !defined(OS_CHROMEOS) |
257 EXPECT_EQ(MIDI_NOT_SUPPORTED, result); | 252 EXPECT_EQ(MIDI_NOT_SUPPORTED, result); |
258 #elif defined(USE_ALSA) | 253 #elif defined(USE_ALSA) |
259 // Temporary until http://crbug.com/371230 is resolved. | 254 // Temporary until http://crbug.com/371230 is resolved. |
260 EXPECT_TRUE((result == MIDI_OK) || (result == MIDI_INITIALIZATION_ERROR)); | 255 EXPECT_TRUE((result == MIDI_OK) || (result == MIDI_INITIALIZATION_ERROR)); |
261 #else | 256 #else |
262 EXPECT_EQ(MIDI_OK, result); | 257 EXPECT_EQ(MIDI_OK, result); |
263 #endif | 258 #endif |
264 } | 259 } |
265 | 260 |
266 } // namespace | 261 } // namespace |
267 | 262 |
268 } // namespace media | 263 } // namespace media |
OLD | NEW |