blob: d55ca6721c53c0af5dea6cd427090b1a5a7db6b7 [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
Takashi Toyoshimad4f37cd2018-10-01 07:43:39 +000062 size_t GetClientCount() { return GetClientCountForTesting(); }
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +000063
Takashi Toyoshimad4f37cd2018-10-01 07:43:39 +000064 size_t GetPendingClientCount() { return GetPendingClientCountForTesting(); }
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +000065
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +090066 bool IsInitialized() const { return initialized_; }
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +000067
68 private:
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +090069 bool initialized_ = false;
70 bool finalized_ = false;
71
72 base::WeakPtrFactory<FakeMidiManager> weak_factory_;
73
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +000074 DISALLOW_COPY_AND_ASSIGN(FakeMidiManager);
75};
76
Takashi Toyoshimaa88997d2017-09-07 08:30:18 +000077class FakeMidiManagerFactory : public MidiService::ManagerFactory {
78 public:
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +090079 FakeMidiManagerFactory() : weak_factory_(this) {}
Takashi Toyoshimaa88997d2017-09-07 08:30:18 +000080 ~FakeMidiManagerFactory() override = default;
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +090081
Takashi Toyoshimaa88997d2017-09-07 08:30:18 +000082 std::unique_ptr<MidiManager> Create(MidiService* service) override {
83 std::unique_ptr<FakeMidiManager> manager =
84 std::make_unique<FakeMidiManager>(service);
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +090085 manager_ = manager->GetWeakPtr();
Takashi Toyoshimaa88997d2017-09-07 08:30:18 +000086 return manager;
87 }
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +090088
89 base::WeakPtr<FakeMidiManagerFactory> GetWeakPtr() {
90 return weak_factory_.GetWeakPtr();
91 }
92
93 base::WeakPtr<FakeMidiManager> manager() {
94#if defined(OS_MACOSX)
95 // To avoid Core MIDI issues, MidiManager won't be destructed on macOS.
96 // See https://crbug.com/718140.
97 if (!manager_ ||
98 (!manager_->GetClientCount() && !manager_->GetPendingClientCount())) {
99 return nullptr;
100 }
101#endif
Takashi Toyoshimaa88997d2017-09-07 08:30:18 +0000102 return manager_;
103 }
104
105 private:
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900106 base::WeakPtr<FakeMidiManager> manager_ = nullptr;
107 base::WeakPtrFactory<FakeMidiManagerFactory> weak_factory_;
108
109 DISALLOW_COPY_AND_ASSIGN(FakeMidiManagerFactory);
Takashi Toyoshimaa88997d2017-09-07 08:30:18 +0000110};
111
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000112class FakeMidiManagerClient : public MidiManagerClient {
113 public:
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900114 FakeMidiManagerClient() = default;
Chris Watkinsc6cbcf62017-12-01 03:08:01 +0000115 ~FakeMidiManagerClient() override = default;
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000116
117 // MidiManagerClient implementation.
toyoshima62d6742014-10-23 09:05:03 -0700118 void AddInputPort(const MidiPortInfo& info) override {}
119 void AddOutputPort(const MidiPortInfo& info) override {}
toyoshimec2570a2016-10-21 02:15:27 -0700120 void SetInputPortState(uint32_t port_index, PortState state) override {}
121 void SetOutputPortState(uint32_t port_index, PortState state) override {}
toyoshimf1b88962015-07-09 14:14:51 -0700122 void CompleteStartSession(Result result) override {
toyoshim@chromium.orgfc2002e2014-05-07 08:10:34 +0000123 EXPECT_TRUE(wait_for_result_);
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000124 result_ = result;
toyoshim@chromium.orgc1e05fb2014-05-06 16:39:20 +0000125 wait_for_result_ = false;
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000126 }
Avi Drissman3528fd02015-12-18 20:11:31 -0500127 void ReceiveMidiData(uint32_t port_index,
128 const uint8_t* data,
dcheng63ccbc32014-10-21 05:23:27 -0700129 size_t size,
tzik925e2c62018-02-02 07:39:45 +0000130 base::TimeTicks timestamp) override {}
dcheng63ccbc32014-10-21 05:23:27 -0700131 void AccumulateMidiBytesSent(size_t size) override {}
toyoshim7a809662015-10-06 00:54:21 -0700132 void Detach() override {}
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000133
toyoshimf1b88962015-07-09 14:14:51 -0700134 Result result() const { return result_; }
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000135
toyoshimf1b88962015-07-09 14:14:51 -0700136 Result WaitForResult() {
toyoshim11f7d572014-10-20 02:37:10 -0700137 while (wait_for_result_) {
138 base::RunLoop run_loop;
139 run_loop.RunUntilIdle();
140 }
toyoshim@chromium.orga25e6832014-05-07 18:06:25 +0000141 return result();
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000142 }
143
144 private:
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900145 Result result_ = Result::NOT_SUPPORTED;
146 bool wait_for_result_ = true;
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000147
148 DISALLOW_COPY_AND_ASSIGN(FakeMidiManagerClient);
149};
150
151class MidiManagerTest : public ::testing::Test {
152 public:
Takashi Toyoshimaa88997d2017-09-07 08:30:18 +0000153 MidiManagerTest() : message_loop_(std::make_unique<base::MessageLoop>()) {
154 std::unique_ptr<FakeMidiManagerFactory> factory =
155 std::make_unique<FakeMidiManagerFactory>();
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900156 factory_ = factory->GetWeakPtr();
Takashi Toyoshimaa88997d2017-09-07 08:30:18 +0000157 service_ = std::make_unique<MidiService>(std::move(factory));
Takashi Toyoshimaa88997d2017-09-07 08:30:18 +0000158 }
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900159
toyoshim7a809662015-10-06 00:54:21 -0700160 ~MidiManagerTest() override {
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900161 service_->Shutdown();
toyoshim7a809662015-10-06 00:54:21 -0700162 base::RunLoop run_loop;
163 run_loop.RunUntilIdle();
toyoshim7a809662015-10-06 00:54:21 -0700164 }
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000165
166 protected:
toyoshim@chromium.orgc1e05fb2014-05-06 16:39:20 +0000167 void StartTheFirstSession(FakeMidiManagerClient* client) {
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900168 DCHECK(factory_);
169
170 EXPECT_FALSE(factory_->manager());
171 service_->StartSession(client);
172 ASSERT_TRUE(factory_->manager());
173 EXPECT_TRUE(factory_->manager()->IsInitialized());
174 EXPECT_EQ(0U, factory_->manager()->GetClientCount());
175 EXPECT_EQ(1U, factory_->manager()->GetPendingClientCount());
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000176 }
177
toyoshim@chromium.orgfc2002e2014-05-07 08:10:34 +0000178 void StartTheNthSession(FakeMidiManagerClient* client, size_t nth) {
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900179 DCHECK(factory_);
180 DCHECK_NE(1U, nth);
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000181
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900182 ASSERT_TRUE(factory_->manager());
183 EXPECT_TRUE(factory_->manager()->IsInitialized());
184 EXPECT_EQ(0U, factory_->manager()->GetClientCount());
185 EXPECT_EQ(nth - 1U, factory_->manager()->GetPendingClientCount());
186 service_->StartSession(client);
187 EXPECT_EQ(nth, factory_->manager()->GetPendingClientCount());
188 }
189
190 void StartSession(FakeMidiManagerClient* client) {
191 service_->StartSession(client);
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000192 }
193
194 void EndSession(FakeMidiManagerClient* client, size_t before, size_t after) {
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900195 DCHECK(factory_);
196
197 ASSERT_TRUE(factory_->manager());
198 EXPECT_EQ(before, factory_->manager()->GetClientCount());
199 EXPECT_TRUE(service_->EndSession(client));
200 if (after) {
201 ASSERT_TRUE(factory_->manager());
202 EXPECT_EQ(after, factory_->manager()->GetClientCount());
203 } else {
204 EXPECT_FALSE(factory_->manager());
205 }
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000206 }
207
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900208 bool CompleteInitialization(Result result) {
209 DCHECK(factory_);
210
211 if (!factory_->manager())
212 return false;
213
214 factory_->manager()->CallCompleteInitialization(result);
215 return true;
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000216 }
217
toyoshim@chromium.orgfc2002e2014-05-07 08:10:34 +0000218 void RunLoopUntilIdle() {
219 base::RunLoop run_loop;
220 run_loop.RunUntilIdle();
221 }
222
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900223 base::WeakPtr<FakeMidiManagerFactory> factory() { return factory_; }
toyoshim@chromium.orgfc2002e2014-05-07 08:10:34 +0000224
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000225 private:
danakj75afea02016-04-25 20:36:04 -0700226 std::unique_ptr<base::MessageLoop> message_loop_;
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900227 base::WeakPtr<FakeMidiManagerFactory> factory_;
228 std::unique_ptr<MidiService> service_;
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000229
230 DISALLOW_COPY_AND_ASSIGN(MidiManagerTest);
231};
232
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000233TEST_F(MidiManagerTest, StartAndEndSession) {
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900234 std::unique_ptr<FakeMidiManagerClient> client =
235 std::make_unique<FakeMidiManagerClient>();
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000236
toyoshim@chromium.orgc1e05fb2014-05-06 16:39:20 +0000237 StartTheFirstSession(client.get());
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900238 EXPECT_TRUE(CompleteInitialization(Result::OK));
toyoshimf1b88962015-07-09 14:14:51 -0700239 EXPECT_EQ(Result::OK, client->WaitForResult());
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000240 EndSession(client.get(), 1U, 0U);
241}
242
243TEST_F(MidiManagerTest, StartAndEndSessionWithError) {
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900244 std::unique_ptr<FakeMidiManagerClient> client =
245 std::make_unique<FakeMidiManagerClient>();
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000246
toyoshim@chromium.orgc1e05fb2014-05-06 16:39:20 +0000247 StartTheFirstSession(client.get());
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900248 EXPECT_TRUE(CompleteInitialization(Result::INITIALIZATION_ERROR));
toyoshimf1b88962015-07-09 14:14:51 -0700249 EXPECT_EQ(Result::INITIALIZATION_ERROR, client->WaitForResult());
Takashi Toyoshimaec05edf2017-11-28 11:21:20 +0000250 EndSession(client.get(), 1U, 0U);
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000251}
252
253TEST_F(MidiManagerTest, StartMultipleSessions) {
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900254 std::unique_ptr<FakeMidiManagerClient> client1 =
255 std::make_unique<FakeMidiManagerClient>();
256 std::unique_ptr<FakeMidiManagerClient> client2 =
257 std::make_unique<FakeMidiManagerClient>();
258 std::unique_ptr<FakeMidiManagerClient> client3 =
259 std::make_unique<FakeMidiManagerClient>();
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000260
toyoshim@chromium.orgc1e05fb2014-05-06 16:39:20 +0000261 StartTheFirstSession(client1.get());
toyoshim@chromium.orgfc2002e2014-05-07 08:10:34 +0000262 StartTheNthSession(client2.get(), 2);
toyoshim@chromium.org1fa678a2014-06-13 09:40:33 +0000263 StartTheNthSession(client3.get(), 3);
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900264 EXPECT_TRUE(CompleteInitialization(Result::OK));
toyoshimf1b88962015-07-09 14:14:51 -0700265 EXPECT_EQ(Result::OK, client1->WaitForResult());
266 EXPECT_EQ(Result::OK, client2->WaitForResult());
267 EXPECT_EQ(Result::OK, client3->WaitForResult());
toyoshim@chromium.org1fa678a2014-06-13 09:40:33 +0000268 EndSession(client1.get(), 3U, 2U);
269 EndSession(client2.get(), 2U, 1U);
270 EndSession(client3.get(), 1U, 0U);
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000271}
272
toyoshim@chromium.orgfc2002e2014-05-07 08:10:34 +0000273TEST_F(MidiManagerTest, TooManyPendingSessions) {
274 // Push as many client requests for starting session as possible.
xiaofeng.zhang06152d82017-05-21 04:39:34 -0700275 std::vector<std::unique_ptr<FakeMidiManagerClient>> many_existing_clients;
toyoshim@chromium.orgfc2002e2014-05-07 08:10:34 +0000276 many_existing_clients.resize(MidiManager::kMaxPendingClientCount);
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900277 many_existing_clients[0] = std::make_unique<FakeMidiManagerClient>();
278 StartTheFirstSession(many_existing_clients[0].get());
279 for (size_t i = 1; i < MidiManager::kMaxPendingClientCount; ++i) {
Takashi Toyoshimaa88997d2017-09-07 08:30:18 +0000280 many_existing_clients[i] = std::make_unique<FakeMidiManagerClient>();
xiaofeng.zhang06152d82017-05-21 04:39:34 -0700281 StartTheNthSession(many_existing_clients[i].get(), i + 1);
toyoshim@chromium.orgfc2002e2014-05-07 08:10:34 +0000282 }
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900283 ASSERT_TRUE(factory()->manager());
284 EXPECT_TRUE(factory()->manager()->IsInitialized());
toyoshim@chromium.orgfc2002e2014-05-07 08:10:34 +0000285
286 // Push the last client that should be rejected for too many pending requests.
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900287 std::unique_ptr<FakeMidiManagerClient> additional_client =
288 std::make_unique<FakeMidiManagerClient>();
289 StartSession(additional_client.get());
toyoshimf1b88962015-07-09 14:14:51 -0700290 EXPECT_EQ(Result::INITIALIZATION_ERROR, additional_client->result());
toyoshim@chromium.orgfc2002e2014-05-07 08:10:34 +0000291
292 // Other clients still should not receive a result.
293 RunLoopUntilIdle();
294 for (size_t i = 0; i < many_existing_clients.size(); ++i)
toyoshimf1b88962015-07-09 14:14:51 -0700295 EXPECT_EQ(Result::NOT_SUPPORTED, many_existing_clients[i]->result());
toyoshim@chromium.orgfc2002e2014-05-07 08:10:34 +0000296
toyoshimf1b88962015-07-09 14:14:51 -0700297 // The Result::OK should be distributed to other clients.
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900298 EXPECT_TRUE(CompleteInitialization(Result::OK));
toyoshim@chromium.orgfc2002e2014-05-07 08:10:34 +0000299 for (size_t i = 0; i < many_existing_clients.size(); ++i)
toyoshimf1b88962015-07-09 14:14:51 -0700300 EXPECT_EQ(Result::OK, many_existing_clients[i]->WaitForResult());
toyoshim@chromium.orgfc2002e2014-05-07 08:10:34 +0000301
302 // Close all successful sessions in FIFO order.
303 size_t sessions = many_existing_clients.size();
304 for (size_t i = 0; i < many_existing_clients.size(); ++i, --sessions)
xiaofeng.zhang06152d82017-05-21 04:39:34 -0700305 EndSession(many_existing_clients[i].get(), sessions, sessions - 1);
toyoshim@chromium.orgfc2002e2014-05-07 08:10:34 +0000306}
307
toyoshim@chromium.org1fa678a2014-06-13 09:40:33 +0000308TEST_F(MidiManagerTest, AbortSession) {
309 // A client starting a session can be destructed while an asynchronous
310 // initialization is performed.
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900311 std::unique_ptr<FakeMidiManagerClient> client =
312 std::make_unique<FakeMidiManagerClient>();
toyoshim@chromium.org1fa678a2014-06-13 09:40:33 +0000313
314 StartTheFirstSession(client.get());
315 EndSession(client.get(), 0, 0);
316 client.reset();
317
318 // Following function should not call the destructed |client| function.
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900319 EXPECT_FALSE(CompleteInitialization(Result::OK));
toyoshim@chromium.org1fa678a2014-06-13 09:40:33 +0000320 base::RunLoop run_loop;
321 run_loop.RunUntilIdle();
322}
323
Hans Wennborg3b620e72018-05-17 16:58:16 +0000324#if defined(OS_ANDROID)
325// The test sometimes fails on Android. https://crbug.com/844027
326#define MAYBE_CreatePlatformMidiManager DISABLED_CreatePlatformMidiManager
327#else
328#define MAYBE_CreatePlatformMidiManager CreatePlatformMidiManager
329#endif
330TEST_F(MidiManagerTest, MAYBE_CreatePlatformMidiManager) {
toyoshim71818732015-04-07 04:15:44 -0700331 // SystemMonitor is needed on Windows.
332 base::SystemMonitor system_monitor;
333
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900334 std::unique_ptr<FakeMidiManagerClient> client =
335 std::make_unique<FakeMidiManagerClient>();
toyoshim@chromium.orgc1e05fb2014-05-06 16:39:20 +0000336
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900337 // Use own MidiService instance to construct a real platform dependent
338 // MidiManager instance.
339 std::unique_ptr<MidiService> service = std::make_unique<MidiService>();
toyoshimf4d61522017-02-10 02:03:32 -0800340 service->StartSession(client.get());
toyoshim@chromium.orga25e6832014-05-07 18:06:25 +0000341
toyoshimf1b88962015-07-09 14:14:51 -0700342 Result result = client->WaitForResult();
toyoshim@chromium.orga25e6832014-05-07 18:06:25 +0000343 // This #ifdef needs to be identical to the one in media/midi/midi_manager.cc.
344 // Do not change the condition for disabling this test.
agoode7de413f2015-04-24 00:13:39 -0700345#if !defined(OS_MACOSX) && !defined(OS_WIN) && \
346 !(defined(USE_ALSA) && defined(USE_UDEV)) && !defined(OS_ANDROID)
toyoshimf1b88962015-07-09 14:14:51 -0700347 EXPECT_EQ(Result::NOT_SUPPORTED, result);
agoode@chromium.org25227512014-06-08 05:12:05 +0000348#elif defined(USE_ALSA)
349 // Temporary until http://crbug.com/371230 is resolved.
toyoshimf1b88962015-07-09 14:14:51 -0700350 EXPECT_TRUE(result == Result::OK || result == Result::INITIALIZATION_ERROR);
dnicoara@chromium.orgc404df62014-05-06 22:56:00 +0000351#else
toyoshimf1b88962015-07-09 14:14:51 -0700352 EXPECT_EQ(Result::OK, result);
dnicoara@chromium.orgc404df62014-05-06 22:56:00 +0000353#endif
toyoshim7a809662015-10-06 00:54:21 -0700354
toyoshimf4d61522017-02-10 02:03:32 -0800355 service->Shutdown();
toyoshim7a809662015-10-06 00:54:21 -0700356 base::RunLoop run_loop;
357 run_loop.RunUntilIdle();
toyoshim@chromium.orgc1e05fb2014-05-06 16:39:20 +0000358}
359
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000360} // namespace
361
toyoshime147c5e2015-05-07 21:58:31 -0700362} // namespace midi