| 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_usb.h" | 5 #include "media/midi/midi_manager_usb.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/message_loop/message_loop.h" |
| 10 #include "base/run_loop.h" |
| 9 #include "base/strings/stringprintf.h" | 11 #include "base/strings/stringprintf.h" |
| 10 #include "base/time/time.h" | 12 #include "base/time/time.h" |
| 11 #include "media/midi/usb_midi_device.h" | 13 #include "media/midi/usb_midi_device.h" |
| 12 #include "testing/gtest/include/gtest/gtest.h" | 14 #include "testing/gtest/include/gtest/gtest.h" |
| 13 | 15 |
| 14 namespace media { | 16 namespace media { |
| 15 | 17 |
| 16 namespace { | 18 namespace { |
| 17 | 19 |
| 18 template<typename T, size_t N> | 20 template<typename T, size_t N> |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 126 | 128 |
| 127 class MidiManagerUsbForTesting : public MidiManagerUsb { | 129 class MidiManagerUsbForTesting : public MidiManagerUsb { |
| 128 public: | 130 public: |
| 129 explicit MidiManagerUsbForTesting( | 131 explicit MidiManagerUsbForTesting( |
| 130 scoped_ptr<UsbMidiDevice::Factory> device_factory) | 132 scoped_ptr<UsbMidiDevice::Factory> device_factory) |
| 131 : MidiManagerUsb(device_factory.PassAs<UsbMidiDevice::Factory>()) {} | 133 : MidiManagerUsb(device_factory.PassAs<UsbMidiDevice::Factory>()) {} |
| 132 virtual ~MidiManagerUsbForTesting() {} | 134 virtual ~MidiManagerUsbForTesting() {} |
| 133 | 135 |
| 134 void CallCompleteInitialization(MidiResult result) { | 136 void CallCompleteInitialization(MidiResult result) { |
| 135 CompleteInitialization(result); | 137 CompleteInitialization(result); |
| 138 base::RunLoop run_loop; |
| 139 run_loop.RunUntilIdle(); |
| 136 } | 140 } |
| 137 | 141 |
| 138 private: | 142 private: |
| 139 DISALLOW_COPY_AND_ASSIGN(MidiManagerUsbForTesting); | 143 DISALLOW_COPY_AND_ASSIGN(MidiManagerUsbForTesting); |
| 140 }; | 144 }; |
| 141 | 145 |
| 142 class MidiManagerUsbTest : public ::testing::Test { | 146 class MidiManagerUsbTest : public ::testing::Test { |
| 143 public: | 147 public: |
| 144 MidiManagerUsbTest() { | 148 MidiManagerUsbTest() : message_loop_(new base::MessageLoop) { |
| 145 scoped_ptr<TestUsbMidiDeviceFactory> factory(new TestUsbMidiDeviceFactory); | 149 scoped_ptr<TestUsbMidiDeviceFactory> factory(new TestUsbMidiDeviceFactory); |
| 146 factory_ = factory.get(); | 150 factory_ = factory.get(); |
| 147 manager_.reset( | 151 manager_.reset( |
| 148 new MidiManagerUsbForTesting(factory.PassAs<UsbMidiDevice::Factory>())); | 152 new MidiManagerUsbForTesting(factory.PassAs<UsbMidiDevice::Factory>())); |
| 149 } | 153 } |
| 150 virtual ~MidiManagerUsbTest() { | 154 virtual ~MidiManagerUsbTest() { |
| 151 std::string leftover_logs = logger_.TakeLog(); | 155 std::string leftover_logs = logger_.TakeLog(); |
| 152 if (!leftover_logs.empty()) { | 156 if (!leftover_logs.empty()) { |
| 153 ADD_FAILURE() << "Log should be empty: " << leftover_logs; | 157 ADD_FAILURE() << "Log should be empty: " << leftover_logs; |
| 154 } | 158 } |
| (...skipping 10 matching lines...) Expand all Loading... |
| 165 } | 169 } |
| 166 | 170 |
| 167 bool IsInitializationCallbackInvoked() { | 171 bool IsInitializationCallbackInvoked() { |
| 168 return client_->complete_start_session_; | 172 return client_->complete_start_session_; |
| 169 } | 173 } |
| 170 | 174 |
| 171 MidiResult GetInitializationResult() { | 175 MidiResult GetInitializationResult() { |
| 172 return client_->result_; | 176 return client_->result_; |
| 173 } | 177 } |
| 174 | 178 |
| 179 void RunCallbackUntilCallbackInvoked( |
| 180 bool result, UsbMidiDevice::Devices* devices) { |
| 181 factory_->callback_.Run(result, devices); |
| 182 base::RunLoop run_loop; |
| 183 while (!client_->complete_start_session_) |
| 184 run_loop.RunUntilIdle(); |
| 185 } |
| 186 |
| 175 scoped_ptr<MidiManagerUsbForTesting> manager_; | 187 scoped_ptr<MidiManagerUsbForTesting> manager_; |
| 176 scoped_ptr<FakeMidiManagerClient> client_; | 188 scoped_ptr<FakeMidiManagerClient> client_; |
| 177 // Owned by manager_. | 189 // Owned by manager_. |
| 178 TestUsbMidiDeviceFactory* factory_; | 190 TestUsbMidiDeviceFactory* factory_; |
| 179 Logger logger_; | 191 Logger logger_; |
| 180 | 192 |
| 181 private: | 193 private: |
| 194 scoped_ptr<base::MessageLoop> message_loop_; |
| 195 |
| 182 DISALLOW_COPY_AND_ASSIGN(MidiManagerUsbTest); | 196 DISALLOW_COPY_AND_ASSIGN(MidiManagerUsbTest); |
| 183 }; | 197 }; |
| 184 | 198 |
| 185 | 199 |
| 186 TEST_F(MidiManagerUsbTest, Initialize) { | 200 TEST_F(MidiManagerUsbTest, Initialize) { |
| 187 scoped_ptr<FakeUsbMidiDevice> device(new FakeUsbMidiDevice(&logger_)); | 201 scoped_ptr<FakeUsbMidiDevice> device(new FakeUsbMidiDevice(&logger_)); |
| 188 uint8 descriptor[] = { | 202 uint8 descriptor[] = { |
| 189 0x12, 0x01, 0x10, 0x01, 0x00, 0x00, 0x00, 0x08, 0x86, 0x1a, | 203 0x12, 0x01, 0x10, 0x01, 0x00, 0x00, 0x00, 0x08, 0x86, 0x1a, |
| 190 0x2d, 0x75, 0x54, 0x02, 0x00, 0x02, 0x00, 0x01, 0x09, 0x02, | 204 0x2d, 0x75, 0x54, 0x02, 0x00, 0x02, 0x00, 0x01, 0x09, 0x02, |
| 191 0x75, 0x00, 0x02, 0x01, 0x00, 0x80, 0x30, 0x09, 0x04, 0x00, | 205 0x75, 0x00, 0x02, 0x01, 0x00, 0x80, 0x30, 0x09, 0x04, 0x00, |
| 192 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x09, 0x24, 0x01, 0x00, | 206 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x09, 0x24, 0x01, 0x00, |
| 193 0x01, 0x09, 0x00, 0x01, 0x01, 0x09, 0x04, 0x01, 0x00, 0x02, | 207 0x01, 0x09, 0x00, 0x01, 0x01, 0x09, 0x04, 0x01, 0x00, 0x02, |
| 194 0x01, 0x03, 0x00, 0x00, 0x07, 0x24, 0x01, 0x00, 0x01, 0x51, | 208 0x01, 0x03, 0x00, 0x00, 0x07, 0x24, 0x01, 0x00, 0x01, 0x51, |
| 195 0x00, 0x06, 0x24, 0x02, 0x01, 0x02, 0x00, 0x06, 0x24, 0x02, | 209 0x00, 0x06, 0x24, 0x02, 0x01, 0x02, 0x00, 0x06, 0x24, 0x02, |
| 196 0x01, 0x03, 0x00, 0x06, 0x24, 0x02, 0x02, 0x06, 0x00, 0x09, | 210 0x01, 0x03, 0x00, 0x06, 0x24, 0x02, 0x02, 0x06, 0x00, 0x09, |
| 197 0x24, 0x03, 0x01, 0x07, 0x01, 0x06, 0x01, 0x00, 0x09, 0x24, | 211 0x24, 0x03, 0x01, 0x07, 0x01, 0x06, 0x01, 0x00, 0x09, 0x24, |
| 198 0x03, 0x02, 0x04, 0x01, 0x02, 0x01, 0x00, 0x09, 0x24, 0x03, | 212 0x03, 0x02, 0x04, 0x01, 0x02, 0x01, 0x00, 0x09, 0x24, 0x03, |
| 199 0x02, 0x05, 0x01, 0x03, 0x01, 0x00, 0x09, 0x05, 0x02, 0x02, | 213 0x02, 0x05, 0x01, 0x03, 0x01, 0x00, 0x09, 0x05, 0x02, 0x02, |
| 200 0x20, 0x00, 0x00, 0x00, 0x00, 0x06, 0x25, 0x01, 0x02, 0x02, | 214 0x20, 0x00, 0x00, 0x00, 0x00, 0x06, 0x25, 0x01, 0x02, 0x02, |
| 201 0x03, 0x09, 0x05, 0x82, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, | 215 0x03, 0x09, 0x05, 0x82, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, |
| 202 0x05, 0x25, 0x01, 0x01, 0x07, | 216 0x05, 0x25, 0x01, 0x01, 0x07, |
| 203 }; | 217 }; |
| 204 device->SetDescriptor(ToVector(descriptor)); | 218 device->SetDescriptor(ToVector(descriptor)); |
| 205 | 219 |
| 206 Initialize(); | 220 Initialize(); |
| 207 ScopedVector<UsbMidiDevice> devices; | 221 ScopedVector<UsbMidiDevice> devices; |
| 208 devices.push_back(device.release()); | 222 devices.push_back(device.release()); |
| 209 EXPECT_FALSE(IsInitializationCallbackInvoked()); | 223 EXPECT_FALSE(IsInitializationCallbackInvoked()); |
| 210 factory_->callback_.Run(true, &devices); | 224 RunCallbackUntilCallbackInvoked(true, &devices); |
| 211 EXPECT_TRUE(IsInitializationCallbackInvoked()); | |
| 212 EXPECT_EQ(MIDI_OK, GetInitializationResult()); | 225 EXPECT_EQ(MIDI_OK, GetInitializationResult()); |
| 213 | 226 |
| 214 ASSERT_EQ(1u, manager_->input_ports().size()); | 227 ASSERT_EQ(1u, manager_->input_ports().size()); |
| 215 ASSERT_EQ(2u, manager_->output_ports().size()); | 228 ASSERT_EQ(2u, manager_->output_ports().size()); |
| 216 ASSERT_TRUE(manager_->input_stream()); | 229 ASSERT_TRUE(manager_->input_stream()); |
| 217 std::vector<UsbMidiInputStream::JackUniqueKey> keys = | 230 std::vector<UsbMidiInputStream::JackUniqueKey> keys = |
| 218 manager_->input_stream()->RegisteredJackKeysForTesting(); | 231 manager_->input_stream()->RegisteredJackKeysForTesting(); |
| 219 ASSERT_EQ(2u, manager_->output_streams().size()); | 232 ASSERT_EQ(2u, manager_->output_streams().size()); |
| 220 EXPECT_EQ(2u, manager_->output_streams()[0]->jack().jack_id); | 233 EXPECT_EQ(2u, manager_->output_streams()[0]->jack().jack_id); |
| 221 EXPECT_EQ(3u, manager_->output_streams()[1]->jack().jack_id); | 234 EXPECT_EQ(3u, manager_->output_streams()[1]->jack().jack_id); |
| 222 ASSERT_EQ(1u, keys.size()); | 235 ASSERT_EQ(1u, keys.size()); |
| 223 EXPECT_EQ(2, keys[0].endpoint_number); | 236 EXPECT_EQ(2, keys[0].endpoint_number); |
| 224 | 237 |
| 225 EXPECT_EQ("UsbMidiDevice::GetDescriptor\n", logger_.TakeLog()); | 238 EXPECT_EQ("UsbMidiDevice::GetDescriptor\n", logger_.TakeLog()); |
| 226 } | 239 } |
| 227 | 240 |
| 228 TEST_F(MidiManagerUsbTest, InitializeFail) { | 241 TEST_F(MidiManagerUsbTest, InitializeFail) { |
| 229 Initialize(); | 242 Initialize(); |
| 230 | 243 |
| 231 EXPECT_FALSE(IsInitializationCallbackInvoked()); | 244 EXPECT_FALSE(IsInitializationCallbackInvoked()); |
| 232 factory_->callback_.Run(false, NULL); | 245 RunCallbackUntilCallbackInvoked(false, NULL); |
| 233 EXPECT_TRUE(IsInitializationCallbackInvoked()); | |
| 234 EXPECT_EQ(MIDI_INITIALIZATION_ERROR, GetInitializationResult()); | 246 EXPECT_EQ(MIDI_INITIALIZATION_ERROR, GetInitializationResult()); |
| 235 } | 247 } |
| 236 | 248 |
| 237 TEST_F(MidiManagerUsbTest, InitializeFailBecauseOfInvalidDescriptor) { | 249 TEST_F(MidiManagerUsbTest, InitializeFailBecauseOfInvalidDescriptor) { |
| 238 scoped_ptr<FakeUsbMidiDevice> device(new FakeUsbMidiDevice(&logger_)); | 250 scoped_ptr<FakeUsbMidiDevice> device(new FakeUsbMidiDevice(&logger_)); |
| 239 uint8 descriptor[] = {0x04}; | 251 uint8 descriptor[] = {0x04}; |
| 240 device->SetDescriptor(ToVector(descriptor)); | 252 device->SetDescriptor(ToVector(descriptor)); |
| 241 | 253 |
| 242 Initialize(); | 254 Initialize(); |
| 243 ScopedVector<UsbMidiDevice> devices; | 255 ScopedVector<UsbMidiDevice> devices; |
| 244 devices.push_back(device.release()); | 256 devices.push_back(device.release()); |
| 245 EXPECT_FALSE(IsInitializationCallbackInvoked()); | 257 EXPECT_FALSE(IsInitializationCallbackInvoked()); |
| 246 factory_->callback_.Run(true, &devices); | 258 RunCallbackUntilCallbackInvoked(true, &devices); |
| 247 EXPECT_TRUE(IsInitializationCallbackInvoked()); | |
| 248 EXPECT_EQ(MIDI_INITIALIZATION_ERROR, GetInitializationResult()); | 259 EXPECT_EQ(MIDI_INITIALIZATION_ERROR, GetInitializationResult()); |
| 249 EXPECT_EQ("UsbMidiDevice::GetDescriptor\n", logger_.TakeLog()); | 260 EXPECT_EQ("UsbMidiDevice::GetDescriptor\n", logger_.TakeLog()); |
| 250 } | 261 } |
| 251 | 262 |
| 252 TEST_F(MidiManagerUsbTest, Send) { | 263 TEST_F(MidiManagerUsbTest, Send) { |
| 253 scoped_ptr<FakeUsbMidiDevice> device(new FakeUsbMidiDevice(&logger_)); | 264 scoped_ptr<FakeUsbMidiDevice> device(new FakeUsbMidiDevice(&logger_)); |
| 254 FakeMidiManagerClient client(&logger_); | 265 FakeMidiManagerClient client(&logger_); |
| 255 uint8 descriptor[] = { | 266 uint8 descriptor[] = { |
| 256 0x12, 0x01, 0x10, 0x01, 0x00, 0x00, 0x00, 0x08, 0x86, 0x1a, | 267 0x12, 0x01, 0x10, 0x01, 0x00, 0x00, 0x00, 0x08, 0x86, 0x1a, |
| 257 0x2d, 0x75, 0x54, 0x02, 0x00, 0x02, 0x00, 0x01, 0x09, 0x02, | 268 0x2d, 0x75, 0x54, 0x02, 0x00, 0x02, 0x00, 0x01, 0x09, 0x02, |
| (...skipping 14 matching lines...) Expand all Loading... |
| 272 device->SetDescriptor(ToVector(descriptor)); | 283 device->SetDescriptor(ToVector(descriptor)); |
| 273 uint8 data[] = { | 284 uint8 data[] = { |
| 274 0x90, 0x45, 0x7f, | 285 0x90, 0x45, 0x7f, |
| 275 0xf0, 0x00, 0x01, 0xf7, | 286 0xf0, 0x00, 0x01, 0xf7, |
| 276 }; | 287 }; |
| 277 | 288 |
| 278 Initialize(); | 289 Initialize(); |
| 279 ScopedVector<UsbMidiDevice> devices; | 290 ScopedVector<UsbMidiDevice> devices; |
| 280 devices.push_back(device.release()); | 291 devices.push_back(device.release()); |
| 281 EXPECT_FALSE(IsInitializationCallbackInvoked()); | 292 EXPECT_FALSE(IsInitializationCallbackInvoked()); |
| 282 factory_->callback_.Run(true, &devices); | 293 RunCallbackUntilCallbackInvoked(true, &devices); |
| 283 EXPECT_TRUE(IsInitializationCallbackInvoked()); | |
| 284 EXPECT_EQ(MIDI_OK, GetInitializationResult()); | 294 EXPECT_EQ(MIDI_OK, GetInitializationResult()); |
| 285 ASSERT_EQ(2u, manager_->output_streams().size()); | 295 ASSERT_EQ(2u, manager_->output_streams().size()); |
| 286 | 296 |
| 287 manager_->DispatchSendMidiData(&client, 1, ToVector(data), 0); | 297 manager_->DispatchSendMidiData(&client, 1, ToVector(data), 0); |
| 288 EXPECT_EQ("UsbMidiDevice::GetDescriptor\n" | 298 EXPECT_EQ("UsbMidiDevice::GetDescriptor\n" |
| 289 "UsbMidiDevice::Send endpoint = 2 data = " | 299 "UsbMidiDevice::Send endpoint = 2 data = " |
| 290 "0x19 0x90 0x45 0x7f " | 300 "0x19 0x90 0x45 0x7f " |
| 291 "0x14 0xf0 0x00 0x01 " | 301 "0x14 0xf0 0x00 0x01 " |
| 292 "0x15 0xf7 0x00 0x00\n" | 302 "0x15 0xf7 0x00 0x00\n" |
| 293 "MidiManagerClient::AccumulateMidiBytesSent size = 7\n", | 303 "MidiManagerClient::AccumulateMidiBytesSent size = 7\n", |
| (...skipping 25 matching lines...) Expand all Loading... |
| 319 0x04, 0xf0, 0x00, 0x01, | 329 0x04, 0xf0, 0x00, 0x01, |
| 320 0x49, 0x90, 0x88, 0x99, // This data should be ignored (CN = 4). | 330 0x49, 0x90, 0x88, 0x99, // This data should be ignored (CN = 4). |
| 321 0x05, 0xf7, 0x00, 0x00, | 331 0x05, 0xf7, 0x00, 0x00, |
| 322 }; | 332 }; |
| 323 | 333 |
| 324 Initialize(); | 334 Initialize(); |
| 325 ScopedVector<UsbMidiDevice> devices; | 335 ScopedVector<UsbMidiDevice> devices; |
| 326 UsbMidiDevice* device_raw = device.get(); | 336 UsbMidiDevice* device_raw = device.get(); |
| 327 devices.push_back(device.release()); | 337 devices.push_back(device.release()); |
| 328 EXPECT_FALSE(IsInitializationCallbackInvoked()); | 338 EXPECT_FALSE(IsInitializationCallbackInvoked()); |
| 329 factory_->callback_.Run(true, &devices); | 339 RunCallbackUntilCallbackInvoked(true, &devices); |
| 330 EXPECT_TRUE(IsInitializationCallbackInvoked()); | |
| 331 EXPECT_EQ(MIDI_OK, GetInitializationResult()); | 340 EXPECT_EQ(MIDI_OK, GetInitializationResult()); |
| 332 | 341 |
| 333 manager_->ReceiveUsbMidiData(device_raw, 2, data, arraysize(data), | 342 manager_->ReceiveUsbMidiData(device_raw, 2, data, arraysize(data), |
| 334 base::TimeTicks()); | 343 base::TimeTicks()); |
| 335 Finalize(); | 344 Finalize(); |
| 336 | 345 |
| 337 EXPECT_EQ("UsbMidiDevice::GetDescriptor\n" | 346 EXPECT_EQ("UsbMidiDevice::GetDescriptor\n" |
| 338 "MidiManagerClient::ReceiveMidiData port_index = 0 " | 347 "MidiManagerClient::ReceiveMidiData port_index = 0 " |
| 339 "data = 0x90 0x45 0x7f\n" | 348 "data = 0x90 0x45 0x7f\n" |
| 340 "MidiManagerClient::ReceiveMidiData port_index = 0 " | 349 "MidiManagerClient::ReceiveMidiData port_index = 0 " |
| 341 "data = 0xf0 0x00 0x01\n" | 350 "data = 0xf0 0x00 0x01\n" |
| 342 "MidiManagerClient::ReceiveMidiData port_index = 0 data = 0xf7\n", | 351 "MidiManagerClient::ReceiveMidiData port_index = 0 data = 0xf7\n", |
| 343 logger_.TakeLog()); | 352 logger_.TakeLog()); |
| 344 } | 353 } |
| 345 | 354 |
| 346 } // namespace | 355 } // namespace |
| 347 | 356 |
| 348 } // namespace media | 357 } // namespace media |
| OLD | NEW |