普通文本  |  179行  |  4.86 KB

// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "media/midi/usb_midi_input_stream.h"

#include <string>
#include <vector>

#include "base/memory/scoped_ptr.h"
#include "base/strings/stringprintf.h"
#include "base/time/time.h"
#include "media/midi/usb_midi_device.h"
#include "testing/gtest/include/gtest/gtest.h"

using base::TimeTicks;

namespace media {

namespace {

class TestUsbMidiDevice : public UsbMidiDevice {
 public:
  TestUsbMidiDevice() {}
  virtual ~TestUsbMidiDevice() {}
  virtual std::vector<uint8> GetDescriptor() OVERRIDE {
    return std::vector<uint8>();
  }
  virtual void Send(int endpoint_number,
                    const std::vector<uint8>& data) OVERRIDE {}

 private:
  DISALLOW_COPY_AND_ASSIGN(TestUsbMidiDevice);
};

class MockDelegate : public UsbMidiInputStream::Delegate {
 public:
  MockDelegate() {}
  virtual ~MockDelegate() {}
  virtual void OnReceivedData(size_t jack_index,
                              const uint8* data,
                              size_t size,
                              base::TimeTicks time) OVERRIDE {
    for (size_t i = 0; i < size; ++i)
      received_data_ += base::StringPrintf("0x%02x ", data[i]);
    received_data_ += "\n";
  }

  const std::string& received_data() const { return received_data_; }

 private:
  std::string received_data_;
  DISALLOW_COPY_AND_ASSIGN(MockDelegate);
};

class UsbMidiInputStreamTest : public ::testing::Test {
 protected:
  UsbMidiInputStreamTest() {
    std::vector<UsbMidiJack> jacks;

    jacks.push_back(UsbMidiJack(&device1_,
                                84,  // jack_id
                                4,  // cable_number
                                135));  // endpoint_address
    jacks.push_back(UsbMidiJack(&device2_,
                                85,
                                5,
                                137));
    jacks.push_back(UsbMidiJack(&device2_,
                                84,
                                4,
                                135));
    jacks.push_back(UsbMidiJack(&device1_,
                                85,
                                5,
                                135));

    stream_.reset(new UsbMidiInputStream(jacks, &delegate_));
  }

  TestUsbMidiDevice device1_;
  TestUsbMidiDevice device2_;
  MockDelegate delegate_;
  scoped_ptr<UsbMidiInputStream> stream_;

 private:
  DISALLOW_COPY_AND_ASSIGN(UsbMidiInputStreamTest);
};

TEST_F(UsbMidiInputStreamTest, UnknownMessage) {
  uint8 data[] = {
    0x40, 0xff, 0xff, 0xff,
    0x41, 0xff, 0xff, 0xff,
  };

  stream_->OnReceivedData(&device1_, 7, data, arraysize(data), TimeTicks());
  EXPECT_EQ("", delegate_.received_data());
}

TEST_F(UsbMidiInputStreamTest, SystemCommonMessage) {
  uint8 data[] = {
    0x45, 0xf8, 0x00, 0x00,
    0x42, 0xf3, 0x22, 0x00,
    0x43, 0xf2, 0x33, 0x44,
  };

  stream_->OnReceivedData(&device1_, 7, data, arraysize(data), TimeTicks());
  EXPECT_EQ("0xf8 \n"
            "0xf3 0x22 \n"
            "0xf2 0x33 0x44 \n", delegate_.received_data());
}

TEST_F(UsbMidiInputStreamTest, SystemExclusiveMessage) {
  uint8 data[] = {
    0x44, 0xf0, 0x11, 0x22,
    0x45, 0xf7, 0x00, 0x00,
    0x46, 0xf0, 0xf7, 0x00,
    0x47, 0xf0, 0x33, 0xf7,
  };

  stream_->OnReceivedData(&device1_, 7, data, arraysize(data), TimeTicks());
  EXPECT_EQ("0xf0 0x11 0x22 \n"
            "0xf7 \n"
            "0xf0 0xf7 \n"
            "0xf0 0x33 0xf7 \n", delegate_.received_data());
}

TEST_F(UsbMidiInputStreamTest, ChannelMessage) {
  uint8 data[] = {
    0x48, 0x80, 0x11, 0x22,
    0x49, 0x90, 0x33, 0x44,
    0x4a, 0xa0, 0x55, 0x66,
    0x4b, 0xb0, 0x77, 0x88,
    0x4c, 0xc0, 0x99, 0x00,
    0x4d, 0xd0, 0xaa, 0x00,
    0x4e, 0xe0, 0xbb, 0xcc,
  };

  stream_->OnReceivedData(&device1_, 7, data, arraysize(data), TimeTicks());
  EXPECT_EQ("0x80 0x11 0x22 \n"
            "0x90 0x33 0x44 \n"
            "0xa0 0x55 0x66 \n"
            "0xb0 0x77 0x88 \n"
            "0xc0 0x99 \n"
            "0xd0 0xaa \n"
            "0xe0 0xbb 0xcc \n", delegate_.received_data());
}

TEST_F(UsbMidiInputStreamTest, SingleByteMessage) {
  uint8 data[] = {
    0x4f, 0xf8, 0x00, 0x00,
  };

  stream_->OnReceivedData(&device1_, 7, data, arraysize(data), TimeTicks());
  EXPECT_EQ("0xf8 \n", delegate_.received_data());
}

TEST_F(UsbMidiInputStreamTest, DispatchForMultipleCables) {
  uint8 data[] = {
    0x4f, 0xf8, 0x00, 0x00,
    0x5f, 0xfa, 0x00, 0x00,
    0x6f, 0xfb, 0x00, 0x00,
  };

  stream_->OnReceivedData(&device1_, 7, data, arraysize(data), TimeTicks());
  EXPECT_EQ("0xf8 \n0xfa \n", delegate_.received_data());
}

TEST_F(UsbMidiInputStreamTest, DispatchForDevice2) {
  uint8 data[] = { 0x4f, 0xf8, 0x00, 0x00 };

  stream_->OnReceivedData(&device2_, 7, data, arraysize(data), TimeTicks());
  EXPECT_EQ("0xf8 \n", delegate_.received_data());
}

}  // namespace

}  // namespace media