| 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 | 
|---|