blob: bc8169ee2fe0c848cf221abf611255d628d3908d [file] [log] [blame]
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +00001// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "media/midi/midi_manager.h"
6
7#include "base/logging.h"
8#include "base/memory/scoped_ptr.h"
toyoshim@chromium.orgc1e05fb2014-05-06 16:39:20 +00009#include "base/run_loop.h"
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +000010#include "testing/gtest/include/gtest/gtest.h"
11
12namespace media {
13
14namespace {
15
16class FakeMidiManager : public MidiManager {
17 public:
toyoshim@chromium.orgc1e05fb2014-05-06 16:39:20 +000018 FakeMidiManager() : start_initialization_is_called_(false) {}
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +000019 virtual ~FakeMidiManager() {}
20
21 // MidiManager implementation.
22 virtual void StartInitialization() OVERRIDE {
23 start_initialization_is_called_ = true;
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +000024 }
25
26 virtual void DispatchSendMidiData(MidiManagerClient* client,
27 uint32 port_index,
28 const std::vector<uint8>& data,
29 double timestamp) OVERRIDE {}
30
31 // Utility functions for testing.
32 void CallCompleteInitialization(MidiResult result) {
33 CompleteInitialization(result);
34 }
35
toyoshim@chromium.orgc1e05fb2014-05-06 16:39:20 +000036 size_t GetClientCount() const {
37 return get_clients_size_for_testing();
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +000038 }
39
toyoshim@chromium.orgc1e05fb2014-05-06 16:39:20 +000040 size_t GetPendingClientCount() const {
41 return get_pending_clients_size_for_testing();
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +000042 }
43
44 bool start_initialization_is_called_;
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +000045
46 private:
47 DISALLOW_COPY_AND_ASSIGN(FakeMidiManager);
48};
49
50class FakeMidiManagerClient : public MidiManagerClient {
51 public:
toyoshim@chromium.orgc1e05fb2014-05-06 16:39:20 +000052 explicit FakeMidiManagerClient(int client_id)
53 : client_id_(client_id),
54 result_(MIDI_NOT_SUPPORTED),
55 wait_for_result_(true) {}
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +000056 virtual ~FakeMidiManagerClient() {}
57
58 // MidiManagerClient implementation.
59 virtual void CompleteStartSession(int client_id, MidiResult result) OVERRIDE {
toyoshim@chromium.orgc1e05fb2014-05-06 16:39:20 +000060 CHECK_EQ(client_id_, client_id);
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +000061 result_ = result;
toyoshim@chromium.orgc1e05fb2014-05-06 16:39:20 +000062 wait_for_result_ = false;
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +000063 }
64
65 virtual void ReceiveMidiData(uint32 port_index, const uint8* data,
66 size_t size, double timestamp) OVERRIDE {}
67 virtual void AccumulateMidiBytesSent(size_t size) OVERRIDE {}
68
toyoshim@chromium.orgc1e05fb2014-05-06 16:39:20 +000069 int get_client_id() const { return client_id_; }
70 MidiResult get_result() const { return result_; }
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +000071
toyoshim@chromium.orgc1e05fb2014-05-06 16:39:20 +000072 MidiResult WaitForResult() {
73 base::RunLoop run_loop;
74 // CompleteStartSession() is called inside the message loop on the same
75 // thread. Protection for |wait_for_result_| is not needed.
76 while (wait_for_result_)
77 run_loop.RunUntilIdle();
78 return get_result();
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +000079 }
80
81 private:
82 int client_id_;
83 MidiResult result_;
toyoshim@chromium.orgc1e05fb2014-05-06 16:39:20 +000084 bool wait_for_result_;
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +000085
86 DISALLOW_COPY_AND_ASSIGN(FakeMidiManagerClient);
87};
88
89class MidiManagerTest : public ::testing::Test {
90 public:
toyoshim@chromium.orgc1e05fb2014-05-06 16:39:20 +000091 MidiManagerTest()
92 : message_loop_(new base::MessageLoop), manager_(new FakeMidiManager) {}
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +000093 virtual ~MidiManagerTest() {}
94
95 protected:
toyoshim@chromium.orgc1e05fb2014-05-06 16:39:20 +000096 void StartTheFirstSession(FakeMidiManagerClient* client) {
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +000097 EXPECT_FALSE(manager_->start_initialization_is_called_);
98 EXPECT_EQ(0U, manager_->GetClientCount());
99 EXPECT_EQ(0U, manager_->GetPendingClientCount());
toyoshim@chromium.orgc1e05fb2014-05-06 16:39:20 +0000100 manager_->StartSession(client, client->get_client_id());
101 EXPECT_EQ(0U, manager_->GetClientCount());
102 EXPECT_EQ(1U, manager_->GetPendingClientCount());
103 EXPECT_TRUE(manager_->start_initialization_is_called_);
104 EXPECT_EQ(0U, manager_->GetClientCount());
105 EXPECT_EQ(1U, manager_->GetPendingClientCount());
106 EXPECT_TRUE(manager_->start_initialization_is_called_);
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000107 }
108
109 void StartTheSecondSession(FakeMidiManagerClient* client) {
110 EXPECT_TRUE(manager_->start_initialization_is_called_);
111 EXPECT_EQ(0U, manager_->GetClientCount());
112 EXPECT_EQ(1U, manager_->GetPendingClientCount());
113
114 // StartInitialization() should not be called for the second session.
115 manager_->start_initialization_is_called_ = false;
toyoshim@chromium.orgc1e05fb2014-05-06 16:39:20 +0000116 manager_->StartSession(client, client->get_client_id());
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000117 EXPECT_FALSE(manager_->start_initialization_is_called_);
118 }
119
120 void EndSession(FakeMidiManagerClient* client, size_t before, size_t after) {
121 EXPECT_EQ(before, manager_->GetClientCount());
122 manager_->EndSession(client);
123 EXPECT_EQ(after, manager_->GetClientCount());
124 }
125
126 void CompleteInitialization(MidiResult result) {
127 manager_->CallCompleteInitialization(result);
128 }
129
130 private:
toyoshim@chromium.orgc1e05fb2014-05-06 16:39:20 +0000131 scoped_ptr<base::MessageLoop> message_loop_;
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000132 scoped_ptr<FakeMidiManager> manager_;
133
134 DISALLOW_COPY_AND_ASSIGN(MidiManagerTest);
135};
136
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000137TEST_F(MidiManagerTest, StartAndEndSession) {
138 scoped_ptr<FakeMidiManagerClient> client;
139 client.reset(new FakeMidiManagerClient(0));
140
toyoshim@chromium.orgc1e05fb2014-05-06 16:39:20 +0000141 StartTheFirstSession(client.get());
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000142 CompleteInitialization(MIDI_OK);
toyoshim@chromium.orgc1e05fb2014-05-06 16:39:20 +0000143 EXPECT_EQ(MIDI_OK, client->WaitForResult());
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000144 EndSession(client.get(), 1U, 0U);
145}
146
147TEST_F(MidiManagerTest, StartAndEndSessionWithError) {
148 scoped_ptr<FakeMidiManagerClient> client;
149 client.reset(new FakeMidiManagerClient(1));
150
toyoshim@chromium.orgc1e05fb2014-05-06 16:39:20 +0000151 StartTheFirstSession(client.get());
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000152 CompleteInitialization(MIDI_INITIALIZATION_ERROR);
toyoshim@chromium.orgc1e05fb2014-05-06 16:39:20 +0000153 EXPECT_EQ(MIDI_INITIALIZATION_ERROR, client->WaitForResult());
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000154 EndSession(client.get(), 0U, 0U);
155}
156
157TEST_F(MidiManagerTest, StartMultipleSessions) {
158 scoped_ptr<FakeMidiManagerClient> client1;
159 scoped_ptr<FakeMidiManagerClient> client2;
160 client1.reset(new FakeMidiManagerClient(0));
161 client2.reset(new FakeMidiManagerClient(1));
162
toyoshim@chromium.orgc1e05fb2014-05-06 16:39:20 +0000163 StartTheFirstSession(client1.get());
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000164 StartTheSecondSession(client2.get());
165 CompleteInitialization(MIDI_OK);
toyoshim@chromium.orgc1e05fb2014-05-06 16:39:20 +0000166 EXPECT_EQ(MIDI_OK, client1->WaitForResult());
167 EXPECT_EQ(MIDI_OK, client2->WaitForResult());
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000168 EndSession(client1.get(), 2U, 1U);
169 EndSession(client2.get(), 1U, 0U);
170}
171
toyoshim@chromium.orgc1e05fb2014-05-06 16:39:20 +0000172TEST_F(MidiManagerTest, CreateMidiManager) {
173 scoped_ptr<FakeMidiManagerClient> client;
174 client.reset(new FakeMidiManagerClient(0));
175
176 scoped_ptr<MidiManager> manager(MidiManager::Create());
177 manager->StartSession(client.get(), client->get_client_id());
dnicoara@chromium.orgc404df62014-05-06 22:56:00 +0000178 // This #ifdef needs to be identical to the one in media/midi/midi_manager.cc
179#if !defined(OS_MACOSX) && !defined(OS_WIN) && !defined(USE_ALSA) && \
180 !defined(OS_ANDROID) && !defined(OS_CHROMEOS)
181 EXPECT_EQ(MIDI_NOT_SUPPORTED, client->WaitForResult());
182#else
toyoshim@chromium.orgc1e05fb2014-05-06 16:39:20 +0000183 EXPECT_EQ(MIDI_OK, client->WaitForResult());
dnicoara@chromium.orgc404df62014-05-06 22:56:00 +0000184#endif
toyoshim@chromium.orgc1e05fb2014-05-06 16:39:20 +0000185}
186
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000187} // namespace
188
189} // namespace media