15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file.
45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/midi/midi_manager_usb.h"
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <string>
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/message_loop/message_loop.h"
10010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/run_loop.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/strings/stringprintf.h"
125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/time/time.h"
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/midi/usb_midi_device.h"
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace media {
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace {
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template<typename T, size_t N>
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)std::vector<T> ToVector(const T (&array)[N]) {
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return std::vector<T>(array, array + N);
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class Logger {
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Logger() {}
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ~Logger() {}
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void AddLog(const std::string& message) { log_ += message; }
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string TakeLog() {
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    std::string result;
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    result.swap(log_);
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return result;
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string log_;
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(Logger);
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class FakeUsbMidiDevice : public UsbMidiDevice {
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  explicit FakeUsbMidiDevice(Logger* logger) : logger_(logger) {}
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual ~FakeUsbMidiDevice() {}
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual std::vector<uint8> GetDescriptor() OVERRIDE {
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    logger_->AddLog("UsbMidiDevice::GetDescriptor\n");
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return descriptor_;
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void Send(int endpoint_number,
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                    const std::vector<uint8>& data) OVERRIDE {
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    logger_->AddLog("UsbMidiDevice::Send ");
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    logger_->AddLog(base::StringPrintf("endpoint = %d data =",
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                       endpoint_number));
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    for (size_t i = 0; i < data.size(); ++i)
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      logger_->AddLog(base::StringPrintf(" 0x%02x", data[i]));
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    logger_->AddLog("\n");
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void SetDescriptor(const std::vector<uint8> descriptor) {
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    descriptor_ = descriptor;
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::vector<uint8> descriptor_;
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Logger* logger_;
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(FakeUsbMidiDevice);
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class FakeMidiManagerClient : public MidiManagerClient {
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
76010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  explicit FakeMidiManagerClient(Logger* logger)
77010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      : complete_start_session_(false),
78010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        result_(MIDI_NOT_SUPPORTED),
79010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        logger_(logger) {}
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual ~FakeMidiManagerClient() {}
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
82a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  virtual void CompleteStartSession(int client_id, MidiResult result) OVERRIDE {
83010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    complete_start_session_ = true;
84010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    result_ = result;
85a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
86a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void ReceiveMidiData(uint32 port_index,
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                               const uint8* data,
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                               size_t size,
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                               double timestamp) OVERRIDE {
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    logger_->AddLog("MidiManagerClient::ReceiveMidiData ");
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    logger_->AddLog(base::StringPrintf("port_index = %d data =", port_index));
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    for (size_t i = 0; i < size; ++i)
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      logger_->AddLog(base::StringPrintf(" 0x%02x", data[i]));
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    logger_->AddLog("\n");
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void AccumulateMidiBytesSent(size_t size) OVERRIDE {
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    logger_->AddLog("MidiManagerClient::AccumulateMidiBytesSent ");
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Windows has no "%zu".
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    logger_->AddLog(base::StringPrintf("size = %u\n",
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                       static_cast<unsigned>(size)));
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
105010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool complete_start_session_;
106010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  MidiResult result_;
107010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Logger* logger_;
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(FakeMidiManagerClient);
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class TestUsbMidiDeviceFactory : public UsbMidiDevice::Factory {
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TestUsbMidiDeviceFactory() {}
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual ~TestUsbMidiDeviceFactory() {}
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void EnumerateDevices(UsbMidiDeviceDelegate* device,
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                Callback callback) OVERRIDE {
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    callback_ = callback;
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Callback callback_;
1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestUsbMidiDeviceFactory);
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
129010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class MidiManagerUsbForTesting : public MidiManagerUsb {
130010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) public:
131010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  explicit MidiManagerUsbForTesting(
132010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      scoped_ptr<UsbMidiDevice::Factory> device_factory)
133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      : MidiManagerUsb(device_factory.PassAs<UsbMidiDevice::Factory>()) {}
134010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual ~MidiManagerUsbForTesting() {}
135010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
136010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void CallCompleteInitialization(MidiResult result) {
137010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    CompleteInitialization(result);
138010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    base::RunLoop run_loop;
139010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    run_loop.RunUntilIdle();
140010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
141010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
142010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) private:
143010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MidiManagerUsbForTesting);
144010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)};
145010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class MidiManagerUsbTest : public ::testing::Test {
1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
148010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  MidiManagerUsbTest() : message_loop_(new base::MessageLoop) {
1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_ptr<TestUsbMidiDeviceFactory> factory(new TestUsbMidiDeviceFactory);
1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    factory_ = factory.get();
1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    manager_.reset(
152010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        new MidiManagerUsbForTesting(factory.PassAs<UsbMidiDevice::Factory>()));
1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual ~MidiManagerUsbTest() {
1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    std::string leftover_logs = logger_.TakeLog();
1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (!leftover_logs.empty()) {
1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ADD_FAILURE() << "Log should be empty: " << leftover_logs;
1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) protected:
1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void Initialize() {
163010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    client_.reset(new FakeMidiManagerClient(&logger_));
164010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    manager_->StartSession(client_.get(), 0);
1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
167010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void Finalize() {
168010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    manager_->EndSession(client_.get());
1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
171010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool IsInitializationCallbackInvoked() {
172010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return client_->complete_start_session_;
173010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
174010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
175010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  MidiResult GetInitializationResult() {
176010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return client_->result_;
177010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
179010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void RunCallbackUntilCallbackInvoked(
180010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      bool result, UsbMidiDevice::Devices* devices) {
181010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    factory_->callback_.Run(result, devices);
182010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    base::RunLoop run_loop;
183010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    while (!client_->complete_start_session_)
184010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      run_loop.RunUntilIdle();
185010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
186010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
187010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  scoped_ptr<MidiManagerUsbForTesting> manager_;
188010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  scoped_ptr<FakeMidiManagerClient> client_;
1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Owned by manager_.
1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TestUsbMidiDeviceFactory* factory_;
1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Logger logger_;
1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
194010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  scoped_ptr<base::MessageLoop> message_loop_;
195010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MidiManagerUsbTest);
1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(MidiManagerUsbTest, Initialize) {
2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<FakeUsbMidiDevice> device(new FakeUsbMidiDevice(&logger_));
2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  uint8 descriptor[] = {
2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    0x12, 0x01, 0x10, 0x01, 0x00, 0x00, 0x00, 0x08, 0x86, 0x1a,
2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    0x2d, 0x75, 0x54, 0x02, 0x00, 0x02, 0x00, 0x01, 0x09, 0x02,
2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    0x75, 0x00, 0x02, 0x01, 0x00, 0x80, 0x30, 0x09, 0x04, 0x00,
2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x09, 0x24, 0x01, 0x00,
2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    0x01, 0x09, 0x00, 0x01, 0x01, 0x09, 0x04, 0x01, 0x00, 0x02,
2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    0x01, 0x03, 0x00, 0x00, 0x07, 0x24, 0x01, 0x00, 0x01, 0x51,
2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    0x00, 0x06, 0x24, 0x02, 0x01, 0x02, 0x00, 0x06, 0x24, 0x02,
2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    0x01, 0x03, 0x00, 0x06, 0x24, 0x02, 0x02, 0x06, 0x00, 0x09,
2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    0x24, 0x03, 0x01, 0x07, 0x01, 0x06, 0x01, 0x00, 0x09, 0x24,
2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    0x03, 0x02, 0x04, 0x01, 0x02, 0x01, 0x00, 0x09, 0x24, 0x03,
2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    0x02, 0x05, 0x01, 0x03, 0x01, 0x00, 0x09, 0x05, 0x02, 0x02,
2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    0x20, 0x00, 0x00, 0x00, 0x00, 0x06, 0x25, 0x01, 0x02, 0x02,
2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    0x03, 0x09, 0x05, 0x82, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00,
2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    0x05, 0x25, 0x01, 0x01, 0x07,
2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  };
2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  device->SetDescriptor(ToVector(descriptor));
2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Initialize();
2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ScopedVector<UsbMidiDevice> devices;
2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  devices.push_back(device.release());
223010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FALSE(IsInitializationCallbackInvoked());
224010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  RunCallbackUntilCallbackInvoked(true, &devices);
225010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(MIDI_OK, GetInitializationResult());
2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(1u, manager_->input_ports().size());
2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(2u, manager_->output_ports().size());
2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(manager_->input_stream());
2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::vector<UsbMidiInputStream::JackUniqueKey> keys =
2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      manager_->input_stream()->RegisteredJackKeysForTesting();
2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(2u, manager_->output_streams().size());
2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(2u, manager_->output_streams()[0]->jack().jack_id);
2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(3u, manager_->output_streams()[1]->jack().jack_id);
2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(1u, keys.size());
2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(2, keys[0].endpoint_number);
2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ("UsbMidiDevice::GetDescriptor\n", logger_.TakeLog());
2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(MidiManagerUsbTest, InitializeFail) {
2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Initialize();
2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
244010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FALSE(IsInitializationCallbackInvoked());
245010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  RunCallbackUntilCallbackInvoked(false, NULL);
246010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(MIDI_INITIALIZATION_ERROR, GetInitializationResult());
2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(MidiManagerUsbTest, InitializeFailBecauseOfInvalidDescriptor) {
2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<FakeUsbMidiDevice> device(new FakeUsbMidiDevice(&logger_));
2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  uint8 descriptor[] = {0x04};
2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  device->SetDescriptor(ToVector(descriptor));
2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Initialize();
2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ScopedVector<UsbMidiDevice> devices;
2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  devices.push_back(device.release());
257010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FALSE(IsInitializationCallbackInvoked());
258010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  RunCallbackUntilCallbackInvoked(true, &devices);
259010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(MIDI_INITIALIZATION_ERROR, GetInitializationResult());
2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ("UsbMidiDevice::GetDescriptor\n", logger_.TakeLog());
2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(MidiManagerUsbTest, Send) {
2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<FakeUsbMidiDevice> device(new FakeUsbMidiDevice(&logger_));
2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FakeMidiManagerClient client(&logger_);
2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  uint8 descriptor[] = {
2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    0x12, 0x01, 0x10, 0x01, 0x00, 0x00, 0x00, 0x08, 0x86, 0x1a,
2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    0x2d, 0x75, 0x54, 0x02, 0x00, 0x02, 0x00, 0x01, 0x09, 0x02,
2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    0x75, 0x00, 0x02, 0x01, 0x00, 0x80, 0x30, 0x09, 0x04, 0x00,
2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x09, 0x24, 0x01, 0x00,
2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    0x01, 0x09, 0x00, 0x01, 0x01, 0x09, 0x04, 0x01, 0x00, 0x02,
2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    0x01, 0x03, 0x00, 0x00, 0x07, 0x24, 0x01, 0x00, 0x01, 0x51,
2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    0x00, 0x06, 0x24, 0x02, 0x01, 0x02, 0x00, 0x06, 0x24, 0x02,
2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    0x01, 0x03, 0x00, 0x06, 0x24, 0x02, 0x02, 0x06, 0x00, 0x09,
2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    0x24, 0x03, 0x01, 0x07, 0x01, 0x06, 0x01, 0x00, 0x09, 0x24,
2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    0x03, 0x02, 0x04, 0x01, 0x02, 0x01, 0x00, 0x09, 0x24, 0x03,
2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    0x02, 0x05, 0x01, 0x03, 0x01, 0x00, 0x09, 0x05, 0x02, 0x02,
2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    0x20, 0x00, 0x00, 0x00, 0x00, 0x06, 0x25, 0x01, 0x02, 0x02,
2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    0x03, 0x09, 0x05, 0x82, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00,
2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    0x05, 0x25, 0x01, 0x01, 0x07,
2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  };
2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  device->SetDescriptor(ToVector(descriptor));
2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  uint8 data[] = {
2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    0x90, 0x45, 0x7f,
2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    0xf0, 0x00, 0x01, 0xf7,
2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  };
2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Initialize();
2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ScopedVector<UsbMidiDevice> devices;
2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  devices.push_back(device.release());
292010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FALSE(IsInitializationCallbackInvoked());
293010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  RunCallbackUntilCallbackInvoked(true, &devices);
294010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(MIDI_OK, GetInitializationResult());
2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(2u, manager_->output_streams().size());
2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  manager_->DispatchSendMidiData(&client, 1, ToVector(data), 0);
2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ("UsbMidiDevice::GetDescriptor\n"
2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            "UsbMidiDevice::Send endpoint = 2 data = "
3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            "0x19 0x90 0x45 0x7f "
3015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            "0x14 0xf0 0x00 0x01 "
3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            "0x15 0xf7 0x00 0x00\n"
3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            "MidiManagerClient::AccumulateMidiBytesSent size = 7\n",
3045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            logger_.TakeLog());
3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(MidiManagerUsbTest, Receive) {
3085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<FakeUsbMidiDevice> device(new FakeUsbMidiDevice(&logger_));
3095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  uint8 descriptor[] = {
3105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    0x12, 0x01, 0x10, 0x01, 0x00, 0x00, 0x00, 0x08, 0x86, 0x1a,
3115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    0x2d, 0x75, 0x54, 0x02, 0x00, 0x02, 0x00, 0x01, 0x09, 0x02,
3125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    0x75, 0x00, 0x02, 0x01, 0x00, 0x80, 0x30, 0x09, 0x04, 0x00,
3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x09, 0x24, 0x01, 0x00,
3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    0x01, 0x09, 0x00, 0x01, 0x01, 0x09, 0x04, 0x01, 0x00, 0x02,
3155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    0x01, 0x03, 0x00, 0x00, 0x07, 0x24, 0x01, 0x00, 0x01, 0x51,
3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    0x00, 0x06, 0x24, 0x02, 0x01, 0x02, 0x00, 0x06, 0x24, 0x02,
3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    0x01, 0x03, 0x00, 0x06, 0x24, 0x02, 0x02, 0x06, 0x00, 0x09,
3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    0x24, 0x03, 0x01, 0x07, 0x01, 0x06, 0x01, 0x00, 0x09, 0x24,
3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    0x03, 0x02, 0x04, 0x01, 0x02, 0x01, 0x00, 0x09, 0x24, 0x03,
3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    0x02, 0x05, 0x01, 0x03, 0x01, 0x00, 0x09, 0x05, 0x02, 0x02,
3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    0x20, 0x00, 0x00, 0x00, 0x00, 0x06, 0x25, 0x01, 0x02, 0x02,
3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    0x03, 0x09, 0x05, 0x82, 0x02, 0x20, 0x00, 0x00, 0x00, 0x00,
3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    0x05, 0x25, 0x01, 0x01, 0x07,
3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  };
3255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  device->SetDescriptor(ToVector(descriptor));
3275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  uint8 data[] = {
3285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    0x09, 0x90, 0x45, 0x7f,
3295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    0x04, 0xf0, 0x00, 0x01,
3305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    0x49, 0x90, 0x88, 0x99,  // This data should be ignored (CN = 4).
3315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    0x05, 0xf7, 0x00, 0x00,
3325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  };
3335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Initialize();
3355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ScopedVector<UsbMidiDevice> devices;
3365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UsbMidiDevice* device_raw = device.get();
3375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  devices.push_back(device.release());
338010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_FALSE(IsInitializationCallbackInvoked());
339010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  RunCallbackUntilCallbackInvoked(true, &devices);
340010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(MIDI_OK, GetInitializationResult());
3415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  manager_->ReceiveUsbMidiData(device_raw, 2, data, arraysize(data),
3435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                               base::TimeTicks());
344010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  Finalize();
3455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ("UsbMidiDevice::GetDescriptor\n"
3475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            "MidiManagerClient::ReceiveMidiData port_index = 0 "
3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            "data = 0x90 0x45 0x7f\n"
3495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            "MidiManagerClient::ReceiveMidiData port_index = 0 "
3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            "data = 0xf0 0x00 0x01\n"
3515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            "MidiManagerClient::ReceiveMidiData port_index = 0 data = 0xf7\n",
3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            logger_.TakeLog());
3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace
3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace media
358