blob: d7bceb13910c1a0fef7a36b0c4a798c80a8c4bba [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"
toyoshim@chromium.orgc1e05fb2014-05-06 16:39:20 +000017#include "base/run_loop.h"
Sebastien Marchand21848772018-10-05 15:29:27 +000018#include "base/system/system_monitor.h"
Sebastien Marchand812fdbf2018-11-22 12:08:44 +000019#include "base/test/scoped_task_environment.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"
Takashi Toyoshima88b4ac02019-02-12 11:25:56 +000022#include "media/midi/task_service.h"
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +000023#include "testing/gtest/include/gtest/gtest.h"
24
Takashi Toyoshima88b4ac02019-02-12 11:25:56 +000025#if defined(OS_WIN)
26#include "media/midi/midi_manager_win.h"
27#endif // defined(OS_WIN)
28
toyoshime147c5e2015-05-07 21:58:31 -070029namespace midi {
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +000030
31namespace {
32
toyoshimec2570a2016-10-21 02:15:27 -070033using mojom::PortState;
toyoshim2f3a48f2016-10-17 01:54:13 -070034using mojom::Result;
35
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +000036class FakeMidiManager : public MidiManager {
37 public:
Takashi Toyoshimaa88997d2017-09-07 08:30:18 +000038 explicit FakeMidiManager(MidiService* service)
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +090039 : MidiManager(service), weak_factory_(this) {}
40
Takashi Toyoshimae8240ab2018-10-03 09:30:11 +000041 ~FakeMidiManager() override = default;
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +090042
43 base::WeakPtr<FakeMidiManager> GetWeakPtr() {
44 return weak_factory_.GetWeakPtr();
45 }
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +000046
47 // MidiManager implementation.
dcheng63ccbc32014-10-21 05:23:27 -070048 void StartInitialization() override {
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +090049 DCHECK(!initialized_);
50 initialized_ = true;
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +000051 }
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;
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +090070
71 base::WeakPtrFactory<FakeMidiManager> weak_factory_;
72
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +000073 DISALLOW_COPY_AND_ASSIGN(FakeMidiManager);
74};
75
Takashi Toyoshimaa88997d2017-09-07 08:30:18 +000076class FakeMidiManagerFactory : public MidiService::ManagerFactory {
77 public:
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +090078 FakeMidiManagerFactory() : weak_factory_(this) {}
Takashi Toyoshimaa88997d2017-09-07 08:30:18 +000079 ~FakeMidiManagerFactory() override = default;
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +090080
Takashi Toyoshimaa88997d2017-09-07 08:30:18 +000081 std::unique_ptr<MidiManager> Create(MidiService* service) override {
82 std::unique_ptr<FakeMidiManager> manager =
83 std::make_unique<FakeMidiManager>(service);
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +090084 manager_ = manager->GetWeakPtr();
Takashi Toyoshimaa88997d2017-09-07 08:30:18 +000085 return manager;
86 }
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +090087
88 base::WeakPtr<FakeMidiManagerFactory> GetWeakPtr() {
89 return weak_factory_.GetWeakPtr();
90 }
91
92 base::WeakPtr<FakeMidiManager> manager() {
93#if defined(OS_MACOSX)
94 // To avoid Core MIDI issues, MidiManager won't be destructed on macOS.
95 // See https://crbug.com/718140.
96 if (!manager_ ||
97 (!manager_->GetClientCount() && !manager_->GetPendingClientCount())) {
98 return nullptr;
99 }
100#endif
Takashi Toyoshimaa88997d2017-09-07 08:30:18 +0000101 return manager_;
102 }
103
104 private:
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900105 base::WeakPtr<FakeMidiManager> manager_ = nullptr;
106 base::WeakPtrFactory<FakeMidiManagerFactory> weak_factory_;
107
108 DISALLOW_COPY_AND_ASSIGN(FakeMidiManagerFactory);
Takashi Toyoshimaa88997d2017-09-07 08:30:18 +0000109};
110
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000111class FakeMidiManagerClient : public MidiManagerClient {
112 public:
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900113 FakeMidiManagerClient() = default;
Chris Watkinsc6cbcf62017-12-01 03:08:01 +0000114 ~FakeMidiManagerClient() override = default;
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000115
116 // MidiManagerClient implementation.
Adithya Srinivasan33252732018-10-17 15:59:40 +0000117 void AddInputPort(const mojom::PortInfo& info) override {}
118 void AddOutputPort(const mojom::PortInfo& info) override {}
toyoshimec2570a2016-10-21 02:15:27 -0700119 void SetInputPortState(uint32_t port_index, PortState state) override {}
120 void SetOutputPortState(uint32_t port_index, PortState state) override {}
toyoshimf1b88962015-07-09 14:14:51 -0700121 void CompleteStartSession(Result result) override {
toyoshim@chromium.orgfc2002e2014-05-07 08:10:34 +0000122 EXPECT_TRUE(wait_for_result_);
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000123 result_ = result;
toyoshim@chromium.orgc1e05fb2014-05-06 16:39:20 +0000124 wait_for_result_ = false;
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000125 }
Avi Drissman3528fd02015-12-18 20:11:31 -0500126 void ReceiveMidiData(uint32_t port_index,
127 const uint8_t* data,
dcheng63ccbc32014-10-21 05:23:27 -0700128 size_t size,
tzik925e2c62018-02-02 07:39:45 +0000129 base::TimeTicks timestamp) override {}
dcheng63ccbc32014-10-21 05:23:27 -0700130 void AccumulateMidiBytesSent(size_t size) override {}
toyoshim7a809662015-10-06 00:54:21 -0700131 void Detach() override {}
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000132
toyoshimf1b88962015-07-09 14:14:51 -0700133 Result result() const { return result_; }
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000134
toyoshimf1b88962015-07-09 14:14:51 -0700135 Result WaitForResult() {
toyoshim11f7d572014-10-20 02:37:10 -0700136 while (wait_for_result_) {
137 base::RunLoop run_loop;
138 run_loop.RunUntilIdle();
139 }
toyoshim@chromium.orga25e6832014-05-07 18:06:25 +0000140 return result();
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000141 }
142
143 private:
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900144 Result result_ = Result::NOT_SUPPORTED;
145 bool wait_for_result_ = true;
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000146
147 DISALLOW_COPY_AND_ASSIGN(FakeMidiManagerClient);
148};
149
150class MidiManagerTest : public ::testing::Test {
151 public:
Sebastien Marchand812fdbf2018-11-22 12:08:44 +0000152 MidiManagerTest() {
Takashi Toyoshimaa88997d2017-09-07 08:30:18 +0000153 std::unique_ptr<FakeMidiManagerFactory> factory =
154 std::make_unique<FakeMidiManagerFactory>();
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900155 factory_ = factory->GetWeakPtr();
Takashi Toyoshimaa88997d2017-09-07 08:30:18 +0000156 service_ = std::make_unique<MidiService>(std::move(factory));
Takashi Toyoshimaa88997d2017-09-07 08:30:18 +0000157 }
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900158
toyoshim7a809662015-10-06 00:54:21 -0700159 ~MidiManagerTest() override {
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900160 service_->Shutdown();
toyoshim7a809662015-10-06 00:54:21 -0700161 base::RunLoop run_loop;
162 run_loop.RunUntilIdle();
toyoshim7a809662015-10-06 00:54:21 -0700163 }
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000164
165 protected:
toyoshim@chromium.orgc1e05fb2014-05-06 16:39:20 +0000166 void StartTheFirstSession(FakeMidiManagerClient* client) {
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900167 DCHECK(factory_);
168
169 EXPECT_FALSE(factory_->manager());
170 service_->StartSession(client);
171 ASSERT_TRUE(factory_->manager());
172 EXPECT_TRUE(factory_->manager()->IsInitialized());
173 EXPECT_EQ(0U, factory_->manager()->GetClientCount());
174 EXPECT_EQ(1U, factory_->manager()->GetPendingClientCount());
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000175 }
176
toyoshim@chromium.orgfc2002e2014-05-07 08:10:34 +0000177 void StartTheNthSession(FakeMidiManagerClient* client, size_t nth) {
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900178 DCHECK(factory_);
179 DCHECK_NE(1U, nth);
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000180
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900181 ASSERT_TRUE(factory_->manager());
182 EXPECT_TRUE(factory_->manager()->IsInitialized());
183 EXPECT_EQ(0U, factory_->manager()->GetClientCount());
184 EXPECT_EQ(nth - 1U, factory_->manager()->GetPendingClientCount());
185 service_->StartSession(client);
186 EXPECT_EQ(nth, factory_->manager()->GetPendingClientCount());
187 }
188
189 void StartSession(FakeMidiManagerClient* client) {
190 service_->StartSession(client);
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000191 }
192
193 void EndSession(FakeMidiManagerClient* client, size_t before, size_t after) {
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900194 DCHECK(factory_);
195
196 ASSERT_TRUE(factory_->manager());
197 EXPECT_EQ(before, factory_->manager()->GetClientCount());
198 EXPECT_TRUE(service_->EndSession(client));
199 if (after) {
200 ASSERT_TRUE(factory_->manager());
201 EXPECT_EQ(after, factory_->manager()->GetClientCount());
202 } else {
203 EXPECT_FALSE(factory_->manager());
204 }
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000205 }
206
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900207 bool CompleteInitialization(Result result) {
208 DCHECK(factory_);
209
210 if (!factory_->manager())
211 return false;
212
213 factory_->manager()->CallCompleteInitialization(result);
214 return true;
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000215 }
216
toyoshim@chromium.orgfc2002e2014-05-07 08:10:34 +0000217 void RunLoopUntilIdle() {
218 base::RunLoop run_loop;
219 run_loop.RunUntilIdle();
220 }
221
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900222 base::WeakPtr<FakeMidiManagerFactory> factory() { return factory_; }
toyoshim@chromium.orgfc2002e2014-05-07 08:10:34 +0000223
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000224 private:
Sebastien Marchand812fdbf2018-11-22 12:08:44 +0000225 base::test::ScopedTaskEnvironment env_;
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900226 base::WeakPtr<FakeMidiManagerFactory> factory_;
227 std::unique_ptr<MidiService> service_;
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000228
229 DISALLOW_COPY_AND_ASSIGN(MidiManagerTest);
230};
231
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000232TEST_F(MidiManagerTest, StartAndEndSession) {
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900233 std::unique_ptr<FakeMidiManagerClient> client =
234 std::make_unique<FakeMidiManagerClient>();
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000235
toyoshim@chromium.orgc1e05fb2014-05-06 16:39:20 +0000236 StartTheFirstSession(client.get());
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900237 EXPECT_TRUE(CompleteInitialization(Result::OK));
toyoshimf1b88962015-07-09 14:14:51 -0700238 EXPECT_EQ(Result::OK, client->WaitForResult());
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000239 EndSession(client.get(), 1U, 0U);
240}
241
242TEST_F(MidiManagerTest, StartAndEndSessionWithError) {
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900243 std::unique_ptr<FakeMidiManagerClient> client =
244 std::make_unique<FakeMidiManagerClient>();
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000245
toyoshim@chromium.orgc1e05fb2014-05-06 16:39:20 +0000246 StartTheFirstSession(client.get());
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900247 EXPECT_TRUE(CompleteInitialization(Result::INITIALIZATION_ERROR));
toyoshimf1b88962015-07-09 14:14:51 -0700248 EXPECT_EQ(Result::INITIALIZATION_ERROR, client->WaitForResult());
Takashi Toyoshimaec05edf2017-11-28 11:21:20 +0000249 EndSession(client.get(), 1U, 0U);
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000250}
251
252TEST_F(MidiManagerTest, StartMultipleSessions) {
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900253 std::unique_ptr<FakeMidiManagerClient> client1 =
254 std::make_unique<FakeMidiManagerClient>();
255 std::unique_ptr<FakeMidiManagerClient> client2 =
256 std::make_unique<FakeMidiManagerClient>();
257 std::unique_ptr<FakeMidiManagerClient> client3 =
258 std::make_unique<FakeMidiManagerClient>();
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000259
toyoshim@chromium.orgc1e05fb2014-05-06 16:39:20 +0000260 StartTheFirstSession(client1.get());
toyoshim@chromium.orgfc2002e2014-05-07 08:10:34 +0000261 StartTheNthSession(client2.get(), 2);
toyoshim@chromium.org1fa678a2014-06-13 09:40:33 +0000262 StartTheNthSession(client3.get(), 3);
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900263 EXPECT_TRUE(CompleteInitialization(Result::OK));
toyoshimf1b88962015-07-09 14:14:51 -0700264 EXPECT_EQ(Result::OK, client1->WaitForResult());
265 EXPECT_EQ(Result::OK, client2->WaitForResult());
266 EXPECT_EQ(Result::OK, client3->WaitForResult());
toyoshim@chromium.org1fa678a2014-06-13 09:40:33 +0000267 EndSession(client1.get(), 3U, 2U);
268 EndSession(client2.get(), 2U, 1U);
269 EndSession(client3.get(), 1U, 0U);
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000270}
271
toyoshim@chromium.orgfc2002e2014-05-07 08:10:34 +0000272TEST_F(MidiManagerTest, TooManyPendingSessions) {
273 // Push as many client requests for starting session as possible.
xiaofeng.zhang06152d82017-05-21 04:39:34 -0700274 std::vector<std::unique_ptr<FakeMidiManagerClient>> many_existing_clients;
toyoshim@chromium.orgfc2002e2014-05-07 08:10:34 +0000275 many_existing_clients.resize(MidiManager::kMaxPendingClientCount);
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900276 many_existing_clients[0] = std::make_unique<FakeMidiManagerClient>();
277 StartTheFirstSession(many_existing_clients[0].get());
278 for (size_t i = 1; i < MidiManager::kMaxPendingClientCount; ++i) {
Takashi Toyoshimaa88997d2017-09-07 08:30:18 +0000279 many_existing_clients[i] = std::make_unique<FakeMidiManagerClient>();
xiaofeng.zhang06152d82017-05-21 04:39:34 -0700280 StartTheNthSession(many_existing_clients[i].get(), i + 1);
toyoshim@chromium.orgfc2002e2014-05-07 08:10:34 +0000281 }
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900282 ASSERT_TRUE(factory()->manager());
283 EXPECT_TRUE(factory()->manager()->IsInitialized());
toyoshim@chromium.orgfc2002e2014-05-07 08:10:34 +0000284
285 // Push the last client that should be rejected for too many pending requests.
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900286 std::unique_ptr<FakeMidiManagerClient> additional_client =
287 std::make_unique<FakeMidiManagerClient>();
288 StartSession(additional_client.get());
toyoshimf1b88962015-07-09 14:14:51 -0700289 EXPECT_EQ(Result::INITIALIZATION_ERROR, additional_client->result());
toyoshim@chromium.orgfc2002e2014-05-07 08:10:34 +0000290
291 // Other clients still should not receive a result.
292 RunLoopUntilIdle();
293 for (size_t i = 0; i < many_existing_clients.size(); ++i)
toyoshimf1b88962015-07-09 14:14:51 -0700294 EXPECT_EQ(Result::NOT_SUPPORTED, many_existing_clients[i]->result());
toyoshim@chromium.orgfc2002e2014-05-07 08:10:34 +0000295
toyoshimf1b88962015-07-09 14:14:51 -0700296 // The Result::OK should be distributed to other clients.
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900297 EXPECT_TRUE(CompleteInitialization(Result::OK));
toyoshim@chromium.orgfc2002e2014-05-07 08:10:34 +0000298 for (size_t i = 0; i < many_existing_clients.size(); ++i)
toyoshimf1b88962015-07-09 14:14:51 -0700299 EXPECT_EQ(Result::OK, many_existing_clients[i]->WaitForResult());
toyoshim@chromium.orgfc2002e2014-05-07 08:10:34 +0000300
301 // Close all successful sessions in FIFO order.
302 size_t sessions = many_existing_clients.size();
303 for (size_t i = 0; i < many_existing_clients.size(); ++i, --sessions)
xiaofeng.zhang06152d82017-05-21 04:39:34 -0700304 EndSession(many_existing_clients[i].get(), sessions, sessions - 1);
toyoshim@chromium.orgfc2002e2014-05-07 08:10:34 +0000305}
306
toyoshim@chromium.org1fa678a2014-06-13 09:40:33 +0000307TEST_F(MidiManagerTest, AbortSession) {
308 // A client starting a session can be destructed while an asynchronous
309 // initialization is performed.
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900310 std::unique_ptr<FakeMidiManagerClient> client =
311 std::make_unique<FakeMidiManagerClient>();
toyoshim@chromium.org1fa678a2014-06-13 09:40:33 +0000312
313 StartTheFirstSession(client.get());
314 EndSession(client.get(), 0, 0);
315 client.reset();
316
317 // Following function should not call the destructed |client| function.
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900318 EXPECT_FALSE(CompleteInitialization(Result::OK));
toyoshim@chromium.org1fa678a2014-06-13 09:40:33 +0000319 base::RunLoop run_loop;
320 run_loop.RunUntilIdle();
321}
322
Takashi Toyoshima88b4ac02019-02-12 11:25:56 +0000323class PlatformMidiManagerTest : public ::testing::Test {
324 public:
325 PlatformMidiManagerTest()
326 : client_(std::make_unique<FakeMidiManagerClient>()),
327 service_(std::make_unique<MidiService>()) {
328 //
329 }
330
331 ~PlatformMidiManagerTest() override {
332 service_->Shutdown();
333 base::RunLoop run_loop;
334 run_loop.RunUntilIdle();
335 }
336
337 MidiService* service() { return service_.get(); }
338
339 void StartSession() { service_->StartSession(client_.get()); }
340 void EndSession() { service_->EndSession(client_.get()); }
341 Result WaitForResult() { return client_->WaitForResult(); }
342
343 // 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.
345 bool IsSupported() {
346#if !defined(OS_MACOSX) && !defined(OS_WIN) && \
347 !(defined(USE_ALSA) && defined(USE_UDEV)) && !defined(OS_ANDROID)
348 return false;
349#else
350 return true;
351#endif
352 }
353
354 private:
355 // SystemMonitor is needed on Windows.
356 base::SystemMonitor system_monitor;
357
358 base::test::ScopedTaskEnvironment env_;
359
360 std::unique_ptr<FakeMidiManagerClient> client_;
361 std::unique_ptr<MidiService> service_;
362
363 DISALLOW_COPY_AND_ASSIGN(PlatformMidiManagerTest);
364};
365
Hans Wennborg3b620e72018-05-17 16:58:16 +0000366#if defined(OS_ANDROID)
367// The test sometimes fails on Android. https://crbug.com/844027
368#define MAYBE_CreatePlatformMidiManager DISABLED_CreatePlatformMidiManager
369#else
370#define MAYBE_CreatePlatformMidiManager CreatePlatformMidiManager
371#endif
Takashi Toyoshima88b4ac02019-02-12 11:25:56 +0000372TEST_F(PlatformMidiManagerTest, MAYBE_CreatePlatformMidiManager) {
373 StartSession();
374 Result result = WaitForResult();
toyoshim71818732015-04-07 04:15:44 -0700375
Takashi Toyoshima88b4ac02019-02-12 11:25:56 +0000376#if defined(USE_ALSA)
agoode@chromium.org25227512014-06-08 05:12:05 +0000377 // Temporary until http://crbug.com/371230 is resolved.
toyoshimf1b88962015-07-09 14:14:51 -0700378 EXPECT_TRUE(result == Result::OK || result == Result::INITIALIZATION_ERROR);
dnicoara@chromium.orgc404df62014-05-06 22:56:00 +0000379#else
Takashi Toyoshima88b4ac02019-02-12 11:25:56 +0000380 EXPECT_EQ(IsSupported() ? Result::OK : Result::NOT_SUPPORTED, result);
dnicoara@chromium.orgc404df62014-05-06 22:56:00 +0000381#endif
Takashi Toyoshima88b4ac02019-02-12 11:25:56 +0000382}
toyoshim7a809662015-10-06 00:54:21 -0700383
Takashi Toyoshima88b4ac02019-02-12 11:25:56 +0000384TEST_F(PlatformMidiManagerTest, InstanceIdOverflow) {
385 service()->task_service()->OverflowInstanceIdForTesting();
386#if defined(OS_WIN)
387 MidiManagerWin::OverflowInstanceIdForTesting();
388#endif // defined(OS_WIN)
389
390 StartSession();
391 EXPECT_EQ(
392 IsSupported() ? Result::INITIALIZATION_ERROR : Result::NOT_SUPPORTED,
393 WaitForResult());
394
395 EndSession();
toyoshim@chromium.orgc1e05fb2014-05-06 16:39:20 +0000396}
397
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000398} // namespace
399
toyoshime147c5e2015-05-07 21:58:31 -0700400} // namespace midi