blob: 691d70cdce1098e0c1c360b25e5996399f2c4e46 [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
avi793390d2015-12-22 22:22:36 -08007#include <stddef.h>
8#include <stdint.h>
9
danakj75afea02016-04-25 20:36:04 -070010#include <memory>
toyoshim@chromium.orgfc2002e2014-05-07 08:10:34 +000011#include <vector>
12
toyoshimc9f52132014-10-15 05:50:07 -070013#include "base/bind.h"
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +000014#include "base/logging.h"
avi793390d2015-12-22 22:22:36 -080015#include "base/macros.h"
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +090016#include "base/memory/weak_ptr.h"
toyoshimc9f52132014-10-15 05:50:07 -070017#include "base/message_loop/message_loop.h"
toyoshim@chromium.orgc1e05fb2014-05-06 16:39:20 +000018#include "base/run_loop.h"
toyoshim71818732015-04-07 04:15:44 -070019#include "base/system_monitor/system_monitor.h"
avi793390d2015-12-22 22:22:36 -080020#include "build/build_config.h"
toyoshimf4d61522017-02-10 02:03:32 -080021#include "media/midi/midi_service.h"
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +000022#include "testing/gtest/include/gtest/gtest.h"
23
toyoshime147c5e2015-05-07 21:58:31 -070024namespace midi {
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +000025
26namespace {
27
toyoshimec2570a2016-10-21 02:15:27 -070028using mojom::PortState;
toyoshim2f3a48f2016-10-17 01:54:13 -070029using mojom::Result;
30
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +000031class FakeMidiManager : public MidiManager {
32 public:
Takashi Toyoshimaa88997d2017-09-07 08:30:18 +000033 explicit FakeMidiManager(MidiService* service)
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +090034 : MidiManager(service), weak_factory_(this) {}
35
36 ~FakeMidiManager() override { DCHECK_EQ(initialized_, finalized_); }
37
38 base::WeakPtr<FakeMidiManager> GetWeakPtr() {
39 return weak_factory_.GetWeakPtr();
40 }
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +000041
42 // MidiManager implementation.
dcheng63ccbc32014-10-21 05:23:27 -070043 void StartInitialization() override {
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +090044 DCHECK(!initialized_);
45 initialized_ = true;
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +000046 }
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +090047 void Finalize() override {
48 DCHECK(initialized_);
49 DCHECK(!finalized_);
50 finalized_ = true;
51 }
dcheng63ccbc32014-10-21 05:23:27 -070052 void DispatchSendMidiData(MidiManagerClient* client,
Avi Drissman3528fd02015-12-18 20:11:31 -050053 uint32_t port_index,
54 const std::vector<uint8_t>& data,
tzik925e2c62018-02-02 07:39:45 +000055 base::TimeTicks timestamp) override {}
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +000056
57 // Utility functions for testing.
toyoshimf1b88962015-07-09 14:14:51 -070058 void CallCompleteInitialization(Result result) {
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +000059 CompleteInitialization(result);
60 }
61
toyoshim@chromium.orgc1e05fb2014-05-06 16:39:20 +000062 size_t GetClientCount() const {
toyoshim@chromium.orga25e6832014-05-07 18:06:25 +000063 return clients_size_for_testing();
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +000064 }
65
toyoshim@chromium.orgc1e05fb2014-05-06 16:39:20 +000066 size_t GetPendingClientCount() const {
toyoshim@chromium.orga25e6832014-05-07 18:06:25 +000067 return pending_clients_size_for_testing();
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +000068 }
69
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +090070 bool IsInitialized() const { return initialized_; }
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +000071
72 private:
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +090073 bool initialized_ = false;
74 bool finalized_ = false;
75
76 base::WeakPtrFactory<FakeMidiManager> weak_factory_;
77
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +000078 DISALLOW_COPY_AND_ASSIGN(FakeMidiManager);
79};
80
Takashi Toyoshimaa88997d2017-09-07 08:30:18 +000081class FakeMidiManagerFactory : public MidiService::ManagerFactory {
82 public:
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +090083 FakeMidiManagerFactory() : weak_factory_(this) {}
Takashi Toyoshimaa88997d2017-09-07 08:30:18 +000084 ~FakeMidiManagerFactory() override = default;
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +090085
Takashi Toyoshimaa88997d2017-09-07 08:30:18 +000086 std::unique_ptr<MidiManager> Create(MidiService* service) override {
87 std::unique_ptr<FakeMidiManager> manager =
88 std::make_unique<FakeMidiManager>(service);
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +090089 manager_ = manager->GetWeakPtr();
Takashi Toyoshimaa88997d2017-09-07 08:30:18 +000090 return manager;
91 }
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +090092
93 base::WeakPtr<FakeMidiManagerFactory> GetWeakPtr() {
94 return weak_factory_.GetWeakPtr();
95 }
96
97 base::WeakPtr<FakeMidiManager> manager() {
98#if defined(OS_MACOSX)
99 // To avoid Core MIDI issues, MidiManager won't be destructed on macOS.
100 // See https://crbug.com/718140.
101 if (!manager_ ||
102 (!manager_->GetClientCount() && !manager_->GetPendingClientCount())) {
103 return nullptr;
104 }
105#endif
Takashi Toyoshimaa88997d2017-09-07 08:30:18 +0000106 return manager_;
107 }
108
109 private:
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900110 base::WeakPtr<FakeMidiManager> manager_ = nullptr;
111 base::WeakPtrFactory<FakeMidiManagerFactory> weak_factory_;
112
113 DISALLOW_COPY_AND_ASSIGN(FakeMidiManagerFactory);
Takashi Toyoshimaa88997d2017-09-07 08:30:18 +0000114};
115
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000116class FakeMidiManagerClient : public MidiManagerClient {
117 public:
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900118 FakeMidiManagerClient() = default;
Chris Watkinsc6cbcf62017-12-01 03:08:01 +0000119 ~FakeMidiManagerClient() override = default;
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000120
121 // MidiManagerClient implementation.
toyoshima62d6742014-10-23 09:05:03 -0700122 void AddInputPort(const MidiPortInfo& info) override {}
123 void AddOutputPort(const MidiPortInfo& info) override {}
toyoshimec2570a2016-10-21 02:15:27 -0700124 void SetInputPortState(uint32_t port_index, PortState state) override {}
125 void SetOutputPortState(uint32_t port_index, PortState state) override {}
toyoshimf1b88962015-07-09 14:14:51 -0700126 void CompleteStartSession(Result result) override {
toyoshim@chromium.orgfc2002e2014-05-07 08:10:34 +0000127 EXPECT_TRUE(wait_for_result_);
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000128 result_ = result;
toyoshim@chromium.orgc1e05fb2014-05-06 16:39:20 +0000129 wait_for_result_ = false;
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000130 }
Avi Drissman3528fd02015-12-18 20:11:31 -0500131 void ReceiveMidiData(uint32_t port_index,
132 const uint8_t* data,
dcheng63ccbc32014-10-21 05:23:27 -0700133 size_t size,
tzik925e2c62018-02-02 07:39:45 +0000134 base::TimeTicks timestamp) override {}
dcheng63ccbc32014-10-21 05:23:27 -0700135 void AccumulateMidiBytesSent(size_t size) override {}
toyoshim7a809662015-10-06 00:54:21 -0700136 void Detach() override {}
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000137
toyoshimf1b88962015-07-09 14:14:51 -0700138 Result result() const { return result_; }
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000139
toyoshimf1b88962015-07-09 14:14:51 -0700140 Result WaitForResult() {
toyoshim11f7d572014-10-20 02:37:10 -0700141 while (wait_for_result_) {
142 base::RunLoop run_loop;
143 run_loop.RunUntilIdle();
144 }
toyoshim@chromium.orga25e6832014-05-07 18:06:25 +0000145 return result();
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000146 }
147
148 private:
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900149 Result result_ = Result::NOT_SUPPORTED;
150 bool wait_for_result_ = true;
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000151
152 DISALLOW_COPY_AND_ASSIGN(FakeMidiManagerClient);
153};
154
155class MidiManagerTest : public ::testing::Test {
156 public:
Takashi Toyoshimaa88997d2017-09-07 08:30:18 +0000157 MidiManagerTest() : message_loop_(std::make_unique<base::MessageLoop>()) {
158 std::unique_ptr<FakeMidiManagerFactory> factory =
159 std::make_unique<FakeMidiManagerFactory>();
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900160 factory_ = factory->GetWeakPtr();
Takashi Toyoshimaa88997d2017-09-07 08:30:18 +0000161 service_ = std::make_unique<MidiService>(std::move(factory));
Takashi Toyoshimaa88997d2017-09-07 08:30:18 +0000162 }
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900163
toyoshim7a809662015-10-06 00:54:21 -0700164 ~MidiManagerTest() override {
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900165 service_->Shutdown();
toyoshim7a809662015-10-06 00:54:21 -0700166 base::RunLoop run_loop;
167 run_loop.RunUntilIdle();
toyoshim7a809662015-10-06 00:54:21 -0700168 }
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000169
170 protected:
toyoshim@chromium.orgc1e05fb2014-05-06 16:39:20 +0000171 void StartTheFirstSession(FakeMidiManagerClient* client) {
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900172 DCHECK(factory_);
173
174 EXPECT_FALSE(factory_->manager());
175 service_->StartSession(client);
176 ASSERT_TRUE(factory_->manager());
177 EXPECT_TRUE(factory_->manager()->IsInitialized());
178 EXPECT_EQ(0U, factory_->manager()->GetClientCount());
179 EXPECT_EQ(1U, factory_->manager()->GetPendingClientCount());
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000180 }
181
toyoshim@chromium.orgfc2002e2014-05-07 08:10:34 +0000182 void StartTheNthSession(FakeMidiManagerClient* client, size_t nth) {
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900183 DCHECK(factory_);
184 DCHECK_NE(1U, nth);
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000185
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900186 ASSERT_TRUE(factory_->manager());
187 EXPECT_TRUE(factory_->manager()->IsInitialized());
188 EXPECT_EQ(0U, factory_->manager()->GetClientCount());
189 EXPECT_EQ(nth - 1U, factory_->manager()->GetPendingClientCount());
190 service_->StartSession(client);
191 EXPECT_EQ(nth, factory_->manager()->GetPendingClientCount());
192 }
193
194 void StartSession(FakeMidiManagerClient* client) {
195 service_->StartSession(client);
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000196 }
197
198 void EndSession(FakeMidiManagerClient* client, size_t before, size_t after) {
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900199 DCHECK(factory_);
200
201 ASSERT_TRUE(factory_->manager());
202 EXPECT_EQ(before, factory_->manager()->GetClientCount());
203 EXPECT_TRUE(service_->EndSession(client));
204 if (after) {
205 ASSERT_TRUE(factory_->manager());
206 EXPECT_EQ(after, factory_->manager()->GetClientCount());
207 } else {
208 EXPECT_FALSE(factory_->manager());
209 }
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000210 }
211
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900212 bool CompleteInitialization(Result result) {
213 DCHECK(factory_);
214
215 if (!factory_->manager())
216 return false;
217
218 factory_->manager()->CallCompleteInitialization(result);
219 return true;
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000220 }
221
toyoshim@chromium.orgfc2002e2014-05-07 08:10:34 +0000222 void RunLoopUntilIdle() {
223 base::RunLoop run_loop;
224 run_loop.RunUntilIdle();
225 }
226
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900227 base::WeakPtr<FakeMidiManagerFactory> factory() { return factory_; }
toyoshim@chromium.orgfc2002e2014-05-07 08:10:34 +0000228
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000229 private:
danakj75afea02016-04-25 20:36:04 -0700230 std::unique_ptr<base::MessageLoop> message_loop_;
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900231 base::WeakPtr<FakeMidiManagerFactory> factory_;
232 std::unique_ptr<MidiService> service_;
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000233
234 DISALLOW_COPY_AND_ASSIGN(MidiManagerTest);
235};
236
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000237TEST_F(MidiManagerTest, StartAndEndSession) {
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900238 std::unique_ptr<FakeMidiManagerClient> client =
239 std::make_unique<FakeMidiManagerClient>();
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000240
toyoshim@chromium.orgc1e05fb2014-05-06 16:39:20 +0000241 StartTheFirstSession(client.get());
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900242 EXPECT_TRUE(CompleteInitialization(Result::OK));
toyoshimf1b88962015-07-09 14:14:51 -0700243 EXPECT_EQ(Result::OK, client->WaitForResult());
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000244 EndSession(client.get(), 1U, 0U);
245}
246
247TEST_F(MidiManagerTest, StartAndEndSessionWithError) {
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900248 std::unique_ptr<FakeMidiManagerClient> client =
249 std::make_unique<FakeMidiManagerClient>();
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000250
toyoshim@chromium.orgc1e05fb2014-05-06 16:39:20 +0000251 StartTheFirstSession(client.get());
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900252 EXPECT_TRUE(CompleteInitialization(Result::INITIALIZATION_ERROR));
toyoshimf1b88962015-07-09 14:14:51 -0700253 EXPECT_EQ(Result::INITIALIZATION_ERROR, client->WaitForResult());
Takashi Toyoshimaec05edf2017-11-28 11:21:20 +0000254 EndSession(client.get(), 1U, 0U);
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000255}
256
257TEST_F(MidiManagerTest, StartMultipleSessions) {
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900258 std::unique_ptr<FakeMidiManagerClient> client1 =
259 std::make_unique<FakeMidiManagerClient>();
260 std::unique_ptr<FakeMidiManagerClient> client2 =
261 std::make_unique<FakeMidiManagerClient>();
262 std::unique_ptr<FakeMidiManagerClient> client3 =
263 std::make_unique<FakeMidiManagerClient>();
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000264
toyoshim@chromium.orgc1e05fb2014-05-06 16:39:20 +0000265 StartTheFirstSession(client1.get());
toyoshim@chromium.orgfc2002e2014-05-07 08:10:34 +0000266 StartTheNthSession(client2.get(), 2);
toyoshim@chromium.org1fa678a2014-06-13 09:40:33 +0000267 StartTheNthSession(client3.get(), 3);
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900268 EXPECT_TRUE(CompleteInitialization(Result::OK));
toyoshimf1b88962015-07-09 14:14:51 -0700269 EXPECT_EQ(Result::OK, client1->WaitForResult());
270 EXPECT_EQ(Result::OK, client2->WaitForResult());
271 EXPECT_EQ(Result::OK, client3->WaitForResult());
toyoshim@chromium.org1fa678a2014-06-13 09:40:33 +0000272 EndSession(client1.get(), 3U, 2U);
273 EndSession(client2.get(), 2U, 1U);
274 EndSession(client3.get(), 1U, 0U);
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000275}
276
toyoshim@chromium.orgfc2002e2014-05-07 08:10:34 +0000277TEST_F(MidiManagerTest, TooManyPendingSessions) {
278 // Push as many client requests for starting session as possible.
xiaofeng.zhang06152d82017-05-21 04:39:34 -0700279 std::vector<std::unique_ptr<FakeMidiManagerClient>> many_existing_clients;
toyoshim@chromium.orgfc2002e2014-05-07 08:10:34 +0000280 many_existing_clients.resize(MidiManager::kMaxPendingClientCount);
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900281 many_existing_clients[0] = std::make_unique<FakeMidiManagerClient>();
282 StartTheFirstSession(many_existing_clients[0].get());
283 for (size_t i = 1; i < MidiManager::kMaxPendingClientCount; ++i) {
Takashi Toyoshimaa88997d2017-09-07 08:30:18 +0000284 many_existing_clients[i] = std::make_unique<FakeMidiManagerClient>();
xiaofeng.zhang06152d82017-05-21 04:39:34 -0700285 StartTheNthSession(many_existing_clients[i].get(), i + 1);
toyoshim@chromium.orgfc2002e2014-05-07 08:10:34 +0000286 }
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900287 ASSERT_TRUE(factory()->manager());
288 EXPECT_TRUE(factory()->manager()->IsInitialized());
toyoshim@chromium.orgfc2002e2014-05-07 08:10:34 +0000289
290 // Push the last client that should be rejected for too many pending requests.
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900291 std::unique_ptr<FakeMidiManagerClient> additional_client =
292 std::make_unique<FakeMidiManagerClient>();
293 StartSession(additional_client.get());
toyoshimf1b88962015-07-09 14:14:51 -0700294 EXPECT_EQ(Result::INITIALIZATION_ERROR, additional_client->result());
toyoshim@chromium.orgfc2002e2014-05-07 08:10:34 +0000295
296 // Other clients still should not receive a result.
297 RunLoopUntilIdle();
298 for (size_t i = 0; i < many_existing_clients.size(); ++i)
toyoshimf1b88962015-07-09 14:14:51 -0700299 EXPECT_EQ(Result::NOT_SUPPORTED, many_existing_clients[i]->result());
toyoshim@chromium.orgfc2002e2014-05-07 08:10:34 +0000300
toyoshimf1b88962015-07-09 14:14:51 -0700301 // The Result::OK should be distributed to other clients.
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900302 EXPECT_TRUE(CompleteInitialization(Result::OK));
toyoshim@chromium.orgfc2002e2014-05-07 08:10:34 +0000303 for (size_t i = 0; i < many_existing_clients.size(); ++i)
toyoshimf1b88962015-07-09 14:14:51 -0700304 EXPECT_EQ(Result::OK, many_existing_clients[i]->WaitForResult());
toyoshim@chromium.orgfc2002e2014-05-07 08:10:34 +0000305
306 // Close all successful sessions in FIFO order.
307 size_t sessions = many_existing_clients.size();
308 for (size_t i = 0; i < many_existing_clients.size(); ++i, --sessions)
xiaofeng.zhang06152d82017-05-21 04:39:34 -0700309 EndSession(many_existing_clients[i].get(), sessions, sessions - 1);
toyoshim@chromium.orgfc2002e2014-05-07 08:10:34 +0000310}
311
toyoshim@chromium.org1fa678a2014-06-13 09:40:33 +0000312TEST_F(MidiManagerTest, AbortSession) {
313 // A client starting a session can be destructed while an asynchronous
314 // initialization is performed.
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900315 std::unique_ptr<FakeMidiManagerClient> client =
316 std::make_unique<FakeMidiManagerClient>();
toyoshim@chromium.org1fa678a2014-06-13 09:40:33 +0000317
318 StartTheFirstSession(client.get());
319 EndSession(client.get(), 0, 0);
320 client.reset();
321
322 // Following function should not call the destructed |client| function.
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900323 EXPECT_FALSE(CompleteInitialization(Result::OK));
toyoshim@chromium.org1fa678a2014-06-13 09:40:33 +0000324 base::RunLoop run_loop;
325 run_loop.RunUntilIdle();
326}
327
Hans Wennborg3b620e72018-05-17 16:58:16 +0000328#if defined(OS_ANDROID)
329// The test sometimes fails on Android. https://crbug.com/844027
330#define MAYBE_CreatePlatformMidiManager DISABLED_CreatePlatformMidiManager
331#else
332#define MAYBE_CreatePlatformMidiManager CreatePlatformMidiManager
333#endif
334TEST_F(MidiManagerTest, MAYBE_CreatePlatformMidiManager) {
toyoshim71818732015-04-07 04:15:44 -0700335 // SystemMonitor is needed on Windows.
336 base::SystemMonitor system_monitor;
337
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900338 std::unique_ptr<FakeMidiManagerClient> client =
339 std::make_unique<FakeMidiManagerClient>();
toyoshim@chromium.orgc1e05fb2014-05-06 16:39:20 +0000340
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900341 // Use own MidiService instance to construct a real platform dependent
342 // MidiManager instance.
343 std::unique_ptr<MidiService> service = std::make_unique<MidiService>();
toyoshimf4d61522017-02-10 02:03:32 -0800344 service->StartSession(client.get());
toyoshim@chromium.orga25e6832014-05-07 18:06:25 +0000345
toyoshimf1b88962015-07-09 14:14:51 -0700346 Result result = client->WaitForResult();
toyoshim@chromium.orga25e6832014-05-07 18:06:25 +0000347 // This #ifdef needs to be identical to the one in media/midi/midi_manager.cc.
348 // Do not change the condition for disabling this test.
agoode7de413f2015-04-24 00:13:39 -0700349#if !defined(OS_MACOSX) && !defined(OS_WIN) && \
350 !(defined(USE_ALSA) && defined(USE_UDEV)) && !defined(OS_ANDROID)
toyoshimf1b88962015-07-09 14:14:51 -0700351 EXPECT_EQ(Result::NOT_SUPPORTED, result);
agoode@chromium.org25227512014-06-08 05:12:05 +0000352#elif defined(USE_ALSA)
353 // Temporary until http://crbug.com/371230 is resolved.
toyoshimf1b88962015-07-09 14:14:51 -0700354 EXPECT_TRUE(result == Result::OK || result == Result::INITIALIZATION_ERROR);
dnicoara@chromium.orgc404df62014-05-06 22:56:00 +0000355#else
toyoshimf1b88962015-07-09 14:14:51 -0700356 EXPECT_EQ(Result::OK, result);
dnicoara@chromium.orgc404df62014-05-06 22:56:00 +0000357#endif
toyoshim7a809662015-10-06 00:54:21 -0700358
toyoshimf4d61522017-02-10 02:03:32 -0800359 service->Shutdown();
toyoshim7a809662015-10-06 00:54:21 -0700360 base::RunLoop run_loop;
361 run_loop.RunUntilIdle();
toyoshim@chromium.orgc1e05fb2014-05-06 16:39:20 +0000362}
363
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000364} // namespace
365
toyoshime147c5e2015-05-07 21:58:31 -0700366} // namespace midi