| 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 <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | |
| 10 #include <string> | 9 #include <string> |
| 10 #include <utility> |
| 11 | 11 |
| 12 #include "base/macros.h" | 12 #include "base/macros.h" |
| 13 #include "base/message_loop/message_loop.h" | 13 #include "base/message_loop/message_loop.h" |
| 14 #include "base/run_loop.h" | 14 #include "base/run_loop.h" |
| 15 #include "base/strings/stringprintf.h" | 15 #include "base/strings/stringprintf.h" |
| 16 #include "base/time/time.h" | 16 #include "base/time/time.h" |
| 17 #include "media/midi/usb_midi_device.h" | 17 #include "media/midi/usb_midi_device.h" |
| 18 #include "testing/gtest/include/gtest/gtest.h" | 18 #include "testing/gtest/include/gtest/gtest.h" |
| 19 | 19 |
| 20 namespace media { | 20 namespace media { |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 160 Callback callback_; | 160 Callback callback_; |
| 161 | 161 |
| 162 private: | 162 private: |
| 163 DISALLOW_COPY_AND_ASSIGN(TestUsbMidiDeviceFactory); | 163 DISALLOW_COPY_AND_ASSIGN(TestUsbMidiDeviceFactory); |
| 164 }; | 164 }; |
| 165 | 165 |
| 166 class MidiManagerUsbForTesting : public MidiManagerUsb { | 166 class MidiManagerUsbForTesting : public MidiManagerUsb { |
| 167 public: | 167 public: |
| 168 explicit MidiManagerUsbForTesting( | 168 explicit MidiManagerUsbForTesting( |
| 169 scoped_ptr<UsbMidiDevice::Factory> device_factory) | 169 scoped_ptr<UsbMidiDevice::Factory> device_factory) |
| 170 : MidiManagerUsb(device_factory.Pass()) {} | 170 : MidiManagerUsb(std::move(device_factory)) {} |
| 171 ~MidiManagerUsbForTesting() override {} | 171 ~MidiManagerUsbForTesting() override {} |
| 172 | 172 |
| 173 void CallCompleteInitialization(Result result) { | 173 void CallCompleteInitialization(Result result) { |
| 174 CompleteInitialization(result); | 174 CompleteInitialization(result); |
| 175 base::RunLoop run_loop; | 175 base::RunLoop run_loop; |
| 176 run_loop.RunUntilIdle(); | 176 run_loop.RunUntilIdle(); |
| 177 } | 177 } |
| 178 | 178 |
| 179 private: | 179 private: |
| 180 DISALLOW_COPY_AND_ASSIGN(MidiManagerUsbForTesting); | 180 DISALLOW_COPY_AND_ASSIGN(MidiManagerUsbForTesting); |
| 181 }; | 181 }; |
| 182 | 182 |
| 183 class MidiManagerUsbTest : public ::testing::Test { | 183 class MidiManagerUsbTest : public ::testing::Test { |
| 184 public: | 184 public: |
| 185 MidiManagerUsbTest() : message_loop_(new base::MessageLoop) { | 185 MidiManagerUsbTest() : message_loop_(new base::MessageLoop) { |
| 186 scoped_ptr<TestUsbMidiDeviceFactory> factory(new TestUsbMidiDeviceFactory); | 186 scoped_ptr<TestUsbMidiDeviceFactory> factory(new TestUsbMidiDeviceFactory); |
| 187 factory_ = factory.get(); | 187 factory_ = factory.get(); |
| 188 manager_.reset(new MidiManagerUsbForTesting(factory.Pass())); | 188 manager_.reset(new MidiManagerUsbForTesting(std::move(factory))); |
| 189 } | 189 } |
| 190 ~MidiManagerUsbTest() override { | 190 ~MidiManagerUsbTest() override { |
| 191 manager_->Shutdown(); | 191 manager_->Shutdown(); |
| 192 base::RunLoop run_loop; | 192 base::RunLoop run_loop; |
| 193 run_loop.RunUntilIdle(); | 193 run_loop.RunUntilIdle(); |
| 194 | 194 |
| 195 std::string leftover_logs = logger_.TakeLog(); | 195 std::string leftover_logs = logger_.TakeLog(); |
| 196 if (!leftover_logs.empty()) { | 196 if (!leftover_logs.empty()) { |
| 197 ADD_FAILURE() << "Log should be empty: " << leftover_logs; | 197 ADD_FAILURE() << "Log should be empty: " << leftover_logs; |
| 198 } | 198 } |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 255 0x03, 0x09, 0x05, 0x82, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x05, 0x25, | 255 0x03, 0x09, 0x05, 0x82, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x05, 0x25, |
| 256 0x01, 0x01, 0x07, | 256 0x01, 0x01, 0x07, |
| 257 }; | 257 }; |
| 258 device->SetDescriptors(ToVector(descriptors)); | 258 device->SetDescriptors(ToVector(descriptors)); |
| 259 device->SetManufacturer("vendor1"); | 259 device->SetManufacturer("vendor1"); |
| 260 device->SetProductName("device1"); | 260 device->SetProductName("device1"); |
| 261 device->SetDeviceVersion("1.02"); | 261 device->SetDeviceVersion("1.02"); |
| 262 | 262 |
| 263 Initialize(); | 263 Initialize(); |
| 264 ScopedVector<UsbMidiDevice> devices; | 264 ScopedVector<UsbMidiDevice> devices; |
| 265 devices.push_back(device.Pass()); | 265 devices.push_back(std::move(device)); |
| 266 EXPECT_FALSE(IsInitializationCallbackInvoked()); | 266 EXPECT_FALSE(IsInitializationCallbackInvoked()); |
| 267 RunCallbackUntilCallbackInvoked(true, &devices); | 267 RunCallbackUntilCallbackInvoked(true, &devices); |
| 268 EXPECT_EQ(Result::OK, GetInitializationResult()); | 268 EXPECT_EQ(Result::OK, GetInitializationResult()); |
| 269 | 269 |
| 270 ASSERT_EQ(1u, input_ports().size()); | 270 ASSERT_EQ(1u, input_ports().size()); |
| 271 EXPECT_EQ("usb:port-0-2", input_ports()[0].id); | 271 EXPECT_EQ("usb:port-0-2", input_ports()[0].id); |
| 272 EXPECT_EQ("vendor1", input_ports()[0].manufacturer); | 272 EXPECT_EQ("vendor1", input_ports()[0].manufacturer); |
| 273 EXPECT_EQ("device1", input_ports()[0].name); | 273 EXPECT_EQ("device1", input_ports()[0].name); |
| 274 EXPECT_EQ("1.02", input_ports()[0].version); | 274 EXPECT_EQ("1.02", input_ports()[0].version); |
| 275 | 275 |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 315 device1->SetManufacturer("vendor1"); | 315 device1->SetManufacturer("vendor1"); |
| 316 device1->SetProductName("device1"); | 316 device1->SetProductName("device1"); |
| 317 device1->SetDeviceVersion("1.02"); | 317 device1->SetDeviceVersion("1.02"); |
| 318 device2->SetDescriptors(ToVector(descriptors)); | 318 device2->SetDescriptors(ToVector(descriptors)); |
| 319 device2->SetManufacturer("vendor2"); | 319 device2->SetManufacturer("vendor2"); |
| 320 device2->SetProductName("device2"); | 320 device2->SetProductName("device2"); |
| 321 device2->SetDeviceVersion("98.76"); | 321 device2->SetDeviceVersion("98.76"); |
| 322 | 322 |
| 323 Initialize(); | 323 Initialize(); |
| 324 ScopedVector<UsbMidiDevice> devices; | 324 ScopedVector<UsbMidiDevice> devices; |
| 325 devices.push_back(device1.Pass()); | 325 devices.push_back(std::move(device1)); |
| 326 devices.push_back(device2.Pass()); | 326 devices.push_back(std::move(device2)); |
| 327 EXPECT_FALSE(IsInitializationCallbackInvoked()); | 327 EXPECT_FALSE(IsInitializationCallbackInvoked()); |
| 328 RunCallbackUntilCallbackInvoked(true, &devices); | 328 RunCallbackUntilCallbackInvoked(true, &devices); |
| 329 EXPECT_EQ(Result::OK, GetInitializationResult()); | 329 EXPECT_EQ(Result::OK, GetInitializationResult()); |
| 330 | 330 |
| 331 ASSERT_EQ(2u, input_ports().size()); | 331 ASSERT_EQ(2u, input_ports().size()); |
| 332 EXPECT_EQ("usb:port-0-2", input_ports()[0].id); | 332 EXPECT_EQ("usb:port-0-2", input_ports()[0].id); |
| 333 EXPECT_EQ("vendor1", input_ports()[0].manufacturer); | 333 EXPECT_EQ("vendor1", input_ports()[0].manufacturer); |
| 334 EXPECT_EQ("device1", input_ports()[0].name); | 334 EXPECT_EQ("device1", input_ports()[0].name); |
| 335 EXPECT_EQ("1.02", input_ports()[0].version); | 335 EXPECT_EQ("1.02", input_ports()[0].version); |
| 336 EXPECT_EQ("usb:port-1-2", input_ports()[1].id); | 336 EXPECT_EQ("usb:port-1-2", input_ports()[1].id); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 378 EXPECT_EQ(Result::INITIALIZATION_ERROR, GetInitializationResult()); | 378 EXPECT_EQ(Result::INITIALIZATION_ERROR, GetInitializationResult()); |
| 379 } | 379 } |
| 380 | 380 |
| 381 TEST_F(MidiManagerUsbTest, InitializeFailBecauseOfInvalidDescriptors) { | 381 TEST_F(MidiManagerUsbTest, InitializeFailBecauseOfInvalidDescriptors) { |
| 382 scoped_ptr<FakeUsbMidiDevice> device(new FakeUsbMidiDevice(&logger_)); | 382 scoped_ptr<FakeUsbMidiDevice> device(new FakeUsbMidiDevice(&logger_)); |
| 383 uint8_t descriptors[] = {0x04}; | 383 uint8_t descriptors[] = {0x04}; |
| 384 device->SetDescriptors(ToVector(descriptors)); | 384 device->SetDescriptors(ToVector(descriptors)); |
| 385 | 385 |
| 386 Initialize(); | 386 Initialize(); |
| 387 ScopedVector<UsbMidiDevice> devices; | 387 ScopedVector<UsbMidiDevice> devices; |
| 388 devices.push_back(device.Pass()); | 388 devices.push_back(std::move(device)); |
| 389 EXPECT_FALSE(IsInitializationCallbackInvoked()); | 389 EXPECT_FALSE(IsInitializationCallbackInvoked()); |
| 390 RunCallbackUntilCallbackInvoked(true, &devices); | 390 RunCallbackUntilCallbackInvoked(true, &devices); |
| 391 EXPECT_EQ(Result::INITIALIZATION_ERROR, GetInitializationResult()); | 391 EXPECT_EQ(Result::INITIALIZATION_ERROR, GetInitializationResult()); |
| 392 EXPECT_EQ("UsbMidiDevice::GetDescriptors\n", logger_.TakeLog()); | 392 EXPECT_EQ("UsbMidiDevice::GetDescriptors\n", logger_.TakeLog()); |
| 393 } | 393 } |
| 394 | 394 |
| 395 TEST_F(MidiManagerUsbTest, Send) { | 395 TEST_F(MidiManagerUsbTest, Send) { |
| 396 Initialize(); | 396 Initialize(); |
| 397 scoped_ptr<FakeUsbMidiDevice> device(new FakeUsbMidiDevice(&logger_)); | 397 scoped_ptr<FakeUsbMidiDevice> device(new FakeUsbMidiDevice(&logger_)); |
| 398 uint8_t descriptors[] = { | 398 uint8_t descriptors[] = { |
| (...skipping 10 matching lines...) Expand all Loading... |
| 409 0x03, 0x09, 0x05, 0x82, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x05, 0x25, | 409 0x03, 0x09, 0x05, 0x82, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00, 0x05, 0x25, |
| 410 0x01, 0x01, 0x07, | 410 0x01, 0x01, 0x07, |
| 411 }; | 411 }; |
| 412 | 412 |
| 413 device->SetDescriptors(ToVector(descriptors)); | 413 device->SetDescriptors(ToVector(descriptors)); |
| 414 uint8_t data[] = { | 414 uint8_t data[] = { |
| 415 0x90, 0x45, 0x7f, 0xf0, 0x00, 0x01, 0xf7, | 415 0x90, 0x45, 0x7f, 0xf0, 0x00, 0x01, 0xf7, |
| 416 }; | 416 }; |
| 417 | 417 |
| 418 ScopedVector<UsbMidiDevice> devices; | 418 ScopedVector<UsbMidiDevice> devices; |
| 419 devices.push_back(device.Pass()); | 419 devices.push_back(std::move(device)); |
| 420 EXPECT_FALSE(IsInitializationCallbackInvoked()); | 420 EXPECT_FALSE(IsInitializationCallbackInvoked()); |
| 421 RunCallbackUntilCallbackInvoked(true, &devices); | 421 RunCallbackUntilCallbackInvoked(true, &devices); |
| 422 EXPECT_EQ(Result::OK, GetInitializationResult()); | 422 EXPECT_EQ(Result::OK, GetInitializationResult()); |
| 423 ASSERT_EQ(2u, manager_->output_streams().size()); | 423 ASSERT_EQ(2u, manager_->output_streams().size()); |
| 424 | 424 |
| 425 manager_->DispatchSendMidiData(client_.get(), 1, ToVector(data), 0); | 425 manager_->DispatchSendMidiData(client_.get(), 1, ToVector(data), 0); |
| 426 // Since UsbMidiDevice::Send is posted as a task, RunLoop should run to | 426 // Since UsbMidiDevice::Send is posted as a task, RunLoop should run to |
| 427 // invoke the task. | 427 // invoke the task. |
| 428 base::RunLoop run_loop; | 428 base::RunLoop run_loop; |
| 429 run_loop.RunUntilIdle(); | 429 run_loop.RunUntilIdle(); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 453 0x01, 0x01, 0x07, | 453 0x01, 0x01, 0x07, |
| 454 }; | 454 }; |
| 455 | 455 |
| 456 device->SetDescriptors(ToVector(descriptors)); | 456 device->SetDescriptors(ToVector(descriptors)); |
| 457 uint8_t data[] = { | 457 uint8_t data[] = { |
| 458 0x90, 0x45, 0x7f, 0xf0, 0x00, 0x01, 0xf7, | 458 0x90, 0x45, 0x7f, 0xf0, 0x00, 0x01, 0xf7, |
| 459 }; | 459 }; |
| 460 | 460 |
| 461 Initialize(); | 461 Initialize(); |
| 462 ScopedVector<UsbMidiDevice> devices; | 462 ScopedVector<UsbMidiDevice> devices; |
| 463 devices.push_back(device.Pass()); | 463 devices.push_back(std::move(device)); |
| 464 EXPECT_FALSE(IsInitializationCallbackInvoked()); | 464 EXPECT_FALSE(IsInitializationCallbackInvoked()); |
| 465 RunCallbackUntilCallbackInvoked(true, &devices); | 465 RunCallbackUntilCallbackInvoked(true, &devices); |
| 466 EXPECT_EQ(Result::OK, GetInitializationResult()); | 466 EXPECT_EQ(Result::OK, GetInitializationResult()); |
| 467 ASSERT_EQ(2u, manager_->output_streams().size()); | 467 ASSERT_EQ(2u, manager_->output_streams().size()); |
| 468 EXPECT_EQ("UsbMidiDevice::GetDescriptors\n", logger_.TakeLog()); | 468 EXPECT_EQ("UsbMidiDevice::GetDescriptors\n", logger_.TakeLog()); |
| 469 | 469 |
| 470 // The specified port index is invalid. The manager must ignore the request. | 470 // The specified port index is invalid. The manager must ignore the request. |
| 471 manager_->DispatchSendMidiData(client_.get(), 99, ToVector(data), 0); | 471 manager_->DispatchSendMidiData(client_.get(), 99, ToVector(data), 0); |
| 472 EXPECT_EQ("", logger_.TakeLog()); | 472 EXPECT_EQ("", logger_.TakeLog()); |
| 473 | 473 |
| (...skipping 22 matching lines...) Expand all Loading... |
| 496 device->SetDescriptors(ToVector(descriptors)); | 496 device->SetDescriptors(ToVector(descriptors)); |
| 497 uint8_t data[] = { | 497 uint8_t data[] = { |
| 498 0x09, 0x90, 0x45, 0x7f, 0x04, 0xf0, 0x00, | 498 0x09, 0x90, 0x45, 0x7f, 0x04, 0xf0, 0x00, |
| 499 0x01, 0x49, 0x90, 0x88, 0x99, // This data should be ignored (CN = 4). | 499 0x01, 0x49, 0x90, 0x88, 0x99, // This data should be ignored (CN = 4). |
| 500 0x05, 0xf7, 0x00, 0x00, | 500 0x05, 0xf7, 0x00, 0x00, |
| 501 }; | 501 }; |
| 502 | 502 |
| 503 Initialize(); | 503 Initialize(); |
| 504 ScopedVector<UsbMidiDevice> devices; | 504 ScopedVector<UsbMidiDevice> devices; |
| 505 UsbMidiDevice* device_raw = device.get(); | 505 UsbMidiDevice* device_raw = device.get(); |
| 506 devices.push_back(device.Pass()); | 506 devices.push_back(std::move(device)); |
| 507 EXPECT_FALSE(IsInitializationCallbackInvoked()); | 507 EXPECT_FALSE(IsInitializationCallbackInvoked()); |
| 508 RunCallbackUntilCallbackInvoked(true, &devices); | 508 RunCallbackUntilCallbackInvoked(true, &devices); |
| 509 EXPECT_EQ(Result::OK, GetInitializationResult()); | 509 EXPECT_EQ(Result::OK, GetInitializationResult()); |
| 510 | 510 |
| 511 manager_->ReceiveUsbMidiData(device_raw, 2, data, arraysize(data), | 511 manager_->ReceiveUsbMidiData(device_raw, 2, data, arraysize(data), |
| 512 base::TimeTicks()); | 512 base::TimeTicks()); |
| 513 Finalize(); | 513 Finalize(); |
| 514 | 514 |
| 515 EXPECT_EQ( | 515 EXPECT_EQ( |
| 516 "UsbMidiDevice::GetDescriptors\n" | 516 "UsbMidiDevice::GetDescriptors\n" |
| (...skipping 30 matching lines...) Expand all Loading... |
| 547 ASSERT_EQ(0u, input_ports().size()); | 547 ASSERT_EQ(0u, input_ports().size()); |
| 548 ASSERT_EQ(0u, output_ports().size()); | 548 ASSERT_EQ(0u, output_ports().size()); |
| 549 ASSERT_TRUE(manager_->input_stream()); | 549 ASSERT_TRUE(manager_->input_stream()); |
| 550 std::vector<UsbMidiJack> jacks = manager_->input_stream()->jacks(); | 550 std::vector<UsbMidiJack> jacks = manager_->input_stream()->jacks(); |
| 551 ASSERT_EQ(0u, manager_->output_streams().size()); | 551 ASSERT_EQ(0u, manager_->output_streams().size()); |
| 552 ASSERT_EQ(0u, jacks.size()); | 552 ASSERT_EQ(0u, jacks.size()); |
| 553 EXPECT_EQ("", logger_.TakeLog()); | 553 EXPECT_EQ("", logger_.TakeLog()); |
| 554 | 554 |
| 555 scoped_ptr<FakeUsbMidiDevice> new_device(new FakeUsbMidiDevice(&logger_)); | 555 scoped_ptr<FakeUsbMidiDevice> new_device(new FakeUsbMidiDevice(&logger_)); |
| 556 new_device->SetDescriptors(ToVector(descriptors)); | 556 new_device->SetDescriptors(ToVector(descriptors)); |
| 557 manager_->OnDeviceAttached(new_device.Pass()); | 557 manager_->OnDeviceAttached(std::move(new_device)); |
| 558 | 558 |
| 559 ASSERT_EQ(1u, input_ports().size()); | 559 ASSERT_EQ(1u, input_ports().size()); |
| 560 ASSERT_EQ(2u, output_ports().size()); | 560 ASSERT_EQ(2u, output_ports().size()); |
| 561 ASSERT_TRUE(manager_->input_stream()); | 561 ASSERT_TRUE(manager_->input_stream()); |
| 562 jacks = manager_->input_stream()->jacks(); | 562 jacks = manager_->input_stream()->jacks(); |
| 563 ASSERT_EQ(2u, manager_->output_streams().size()); | 563 ASSERT_EQ(2u, manager_->output_streams().size()); |
| 564 EXPECT_EQ(2u, manager_->output_streams()[0]->jack().jack_id); | 564 EXPECT_EQ(2u, manager_->output_streams()[0]->jack().jack_id); |
| 565 EXPECT_EQ(3u, manager_->output_streams()[1]->jack().jack_id); | 565 EXPECT_EQ(3u, manager_->output_streams()[1]->jack().jack_id); |
| 566 ASSERT_EQ(1u, jacks.size()); | 566 ASSERT_EQ(1u, jacks.size()); |
| 567 EXPECT_EQ(2, jacks[0].endpoint_number()); | 567 EXPECT_EQ(2, jacks[0].endpoint_number()); |
| 568 EXPECT_EQ("UsbMidiDevice::GetDescriptors\n", logger_.TakeLog()); | 568 EXPECT_EQ("UsbMidiDevice::GetDescriptors\n", logger_.TakeLog()); |
| 569 } | 569 } |
| 570 | 570 |
| 571 } // namespace | 571 } // namespace |
| 572 | 572 |
| 573 } // namespace midi | 573 } // namespace midi |
| 574 } // namespace media | 574 } // namespace media |
| OLD | NEW |