blob: d4bd3145e3de5f67ad8357589a5516b5f13f0787 [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:
Jeremy Roman9e1d1a72019-07-09 18:34:37 +000038 explicit FakeMidiManager(MidiService* service) : MidiManager(service) {}
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +090039
Takashi Toyoshimae8240ab2018-10-03 09:30:11 +000040 ~FakeMidiManager() override = default;
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +090041
42 base::WeakPtr<FakeMidiManager> GetWeakPtr() {
43 return weak_factory_.GetWeakPtr();
44 }
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +000045
46 // MidiManager implementation.
dcheng63ccbc32014-10-21 05:23:27 -070047 void StartInitialization() override {
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +090048 DCHECK(!initialized_);
49 initialized_ = true;
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +000050 }
dcheng63ccbc32014-10-21 05:23:27 -070051 void DispatchSendMidiData(MidiManagerClient* client,
Avi Drissman3528fd02015-12-18 20:11:31 -050052 uint32_t port_index,
53 const std::vector<uint8_t>& data,
tzik925e2c62018-02-02 07:39:45 +000054 base::TimeTicks timestamp) override {}
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +000055
56 // Utility functions for testing.
toyoshimf1b88962015-07-09 14:14:51 -070057 void CallCompleteInitialization(Result result) {
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +000058 CompleteInitialization(result);
59 }
60
Takashi Toyoshimad4f37cd2018-10-01 07:43:39 +000061 size_t GetClientCount() { return GetClientCountForTesting(); }
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +000062
Takashi Toyoshimad4f37cd2018-10-01 07:43:39 +000063 size_t GetPendingClientCount() { return GetPendingClientCountForTesting(); }
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +000064
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +090065 bool IsInitialized() const { return initialized_; }
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +000066
67 private:
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +090068 bool initialized_ = false;
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +090069
Jeremy Roman9e1d1a72019-07-09 18:34:37 +000070 base::WeakPtrFactory<FakeMidiManager> weak_factory_{this};
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +090071
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +000072 DISALLOW_COPY_AND_ASSIGN(FakeMidiManager);
73};
74
Takashi Toyoshimaa88997d2017-09-07 08:30:18 +000075class FakeMidiManagerFactory : public MidiService::ManagerFactory {
76 public:
Jeremy Roman9e1d1a72019-07-09 18:34:37 +000077 FakeMidiManagerFactory() {}
Takashi Toyoshimaa88997d2017-09-07 08:30:18 +000078 ~FakeMidiManagerFactory() override = default;
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +090079
Takashi Toyoshimaa88997d2017-09-07 08:30:18 +000080 std::unique_ptr<MidiManager> Create(MidiService* service) override {
81 std::unique_ptr<FakeMidiManager> manager =
82 std::make_unique<FakeMidiManager>(service);
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +090083 manager_ = manager->GetWeakPtr();
Takashi Toyoshimaa88997d2017-09-07 08:30:18 +000084 return manager;
85 }
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +090086
87 base::WeakPtr<FakeMidiManagerFactory> GetWeakPtr() {
88 return weak_factory_.GetWeakPtr();
89 }
90
91 base::WeakPtr<FakeMidiManager> manager() {
92#if defined(OS_MACOSX)
93 // To avoid Core MIDI issues, MidiManager won't be destructed on macOS.
94 // See https://crbug.com/718140.
95 if (!manager_ ||
96 (!manager_->GetClientCount() && !manager_->GetPendingClientCount())) {
97 return nullptr;
98 }
99#endif
Takashi Toyoshimaa88997d2017-09-07 08:30:18 +0000100 return manager_;
101 }
102
103 private:
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900104 base::WeakPtr<FakeMidiManager> manager_ = nullptr;
Jeremy Roman9e1d1a72019-07-09 18:34:37 +0000105 base::WeakPtrFactory<FakeMidiManagerFactory> weak_factory_{this};
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900106
107 DISALLOW_COPY_AND_ASSIGN(FakeMidiManagerFactory);
Takashi Toyoshimaa88997d2017-09-07 08:30:18 +0000108};
109
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000110class FakeMidiManagerClient : public MidiManagerClient {
111 public:
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900112 FakeMidiManagerClient() = default;
Chris Watkinsc6cbcf62017-12-01 03:08:01 +0000113 ~FakeMidiManagerClient() override = default;
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000114
115 // MidiManagerClient implementation.
Adithya Srinivasan33252732018-10-17 15:59:40 +0000116 void AddInputPort(const mojom::PortInfo& info) override {}
117 void AddOutputPort(const mojom::PortInfo& info) override {}
toyoshimec2570a2016-10-21 02:15:27 -0700118 void SetInputPortState(uint32_t port_index, PortState state) override {}
119 void SetOutputPortState(uint32_t port_index, PortState state) override {}
toyoshimf1b88962015-07-09 14:14:51 -0700120 void CompleteStartSession(Result result) override {
toyoshim@chromium.orgfc2002e2014-05-07 08:10:34 +0000121 EXPECT_TRUE(wait_for_result_);
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000122 result_ = result;
toyoshim@chromium.orgc1e05fb2014-05-06 16:39:20 +0000123 wait_for_result_ = false;
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000124 }
Avi Drissman3528fd02015-12-18 20:11:31 -0500125 void ReceiveMidiData(uint32_t port_index,
126 const uint8_t* data,
dcheng63ccbc32014-10-21 05:23:27 -0700127 size_t size,
tzik925e2c62018-02-02 07:39:45 +0000128 base::TimeTicks timestamp) override {}
dcheng63ccbc32014-10-21 05:23:27 -0700129 void AccumulateMidiBytesSent(size_t size) override {}
toyoshim7a809662015-10-06 00:54:21 -0700130 void Detach() override {}
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000131
toyoshimf1b88962015-07-09 14:14:51 -0700132 Result result() const { return result_; }
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000133
toyoshimf1b88962015-07-09 14:14:51 -0700134 Result WaitForResult() {
toyoshim11f7d572014-10-20 02:37:10 -0700135 while (wait_for_result_) {
136 base::RunLoop run_loop;
137 run_loop.RunUntilIdle();
138 }
toyoshim@chromium.orga25e6832014-05-07 18:06:25 +0000139 return result();
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000140 }
141
142 private:
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900143 Result result_ = Result::NOT_SUPPORTED;
144 bool wait_for_result_ = true;
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000145
146 DISALLOW_COPY_AND_ASSIGN(FakeMidiManagerClient);
147};
148
149class MidiManagerTest : public ::testing::Test {
150 public:
Sebastien Marchand812fdbf2018-11-22 12:08:44 +0000151 MidiManagerTest() {
Takashi Toyoshimaa88997d2017-09-07 08:30:18 +0000152 std::unique_ptr<FakeMidiManagerFactory> factory =
153 std::make_unique<FakeMidiManagerFactory>();
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900154 factory_ = factory->GetWeakPtr();
Takashi Toyoshimaa88997d2017-09-07 08:30:18 +0000155 service_ = std::make_unique<MidiService>(std::move(factory));
Takashi Toyoshimaa88997d2017-09-07 08:30:18 +0000156 }
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900157
toyoshim7a809662015-10-06 00:54:21 -0700158 ~MidiManagerTest() override {
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900159 service_->Shutdown();
toyoshim7a809662015-10-06 00:54:21 -0700160 base::RunLoop run_loop;
161 run_loop.RunUntilIdle();
toyoshim7a809662015-10-06 00:54:21 -0700162 }
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000163
164 protected:
toyoshim@chromium.orgc1e05fb2014-05-06 16:39:20 +0000165 void StartTheFirstSession(FakeMidiManagerClient* client) {
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900166 DCHECK(factory_);
167
168 EXPECT_FALSE(factory_->manager());
169 service_->StartSession(client);
170 ASSERT_TRUE(factory_->manager());
171 EXPECT_TRUE(factory_->manager()->IsInitialized());
172 EXPECT_EQ(0U, factory_->manager()->GetClientCount());
173 EXPECT_EQ(1U, factory_->manager()->GetPendingClientCount());
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000174 }
175
toyoshim@chromium.orgfc2002e2014-05-07 08:10:34 +0000176 void StartTheNthSession(FakeMidiManagerClient* client, size_t nth) {
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900177 DCHECK(factory_);
178 DCHECK_NE(1U, nth);
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000179
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900180 ASSERT_TRUE(factory_->manager());
181 EXPECT_TRUE(factory_->manager()->IsInitialized());
182 EXPECT_EQ(0U, factory_->manager()->GetClientCount());
183 EXPECT_EQ(nth - 1U, factory_->manager()->GetPendingClientCount());
184 service_->StartSession(client);
185 EXPECT_EQ(nth, factory_->manager()->GetPendingClientCount());
186 }
187
188 void StartSession(FakeMidiManagerClient* client) {
189 service_->StartSession(client);
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000190 }
191
192 void EndSession(FakeMidiManagerClient* client, size_t before, size_t after) {
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900193 DCHECK(factory_);
194
195 ASSERT_TRUE(factory_->manager());
196 EXPECT_EQ(before, factory_->manager()->GetClientCount());
197 EXPECT_TRUE(service_->EndSession(client));
198 if (after) {
199 ASSERT_TRUE(factory_->manager());
200 EXPECT_EQ(after, factory_->manager()->GetClientCount());
201 } else {
202 EXPECT_FALSE(factory_->manager());
203 }
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000204 }
205
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900206 bool CompleteInitialization(Result result) {
207 DCHECK(factory_);
208
209 if (!factory_->manager())
210 return false;
211
212 factory_->manager()->CallCompleteInitialization(result);
213 return true;
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000214 }
215
toyoshim@chromium.orgfc2002e2014-05-07 08:10:34 +0000216 void RunLoopUntilIdle() {
217 base::RunLoop run_loop;
218 run_loop.RunUntilIdle();
219 }
220
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900221 base::WeakPtr<FakeMidiManagerFactory> factory() { return factory_; }
toyoshim@chromium.orgfc2002e2014-05-07 08:10:34 +0000222
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000223 private:
Sebastien Marchand812fdbf2018-11-22 12:08:44 +0000224 base::test::ScopedTaskEnvironment env_;
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900225 base::WeakPtr<FakeMidiManagerFactory> factory_;
226 std::unique_ptr<MidiService> service_;
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000227
228 DISALLOW_COPY_AND_ASSIGN(MidiManagerTest);
229};
230
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000231TEST_F(MidiManagerTest, StartAndEndSession) {
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900232 std::unique_ptr<FakeMidiManagerClient> client =
233 std::make_unique<FakeMidiManagerClient>();
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000234
toyoshim@chromium.orgc1e05fb2014-05-06 16:39:20 +0000235 StartTheFirstSession(client.get());
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900236 EXPECT_TRUE(CompleteInitialization(Result::OK));
toyoshimf1b88962015-07-09 14:14:51 -0700237 EXPECT_EQ(Result::OK, client->WaitForResult());
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000238 EndSession(client.get(), 1U, 0U);
239}
240
241TEST_F(MidiManagerTest, StartAndEndSessionWithError) {
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900242 std::unique_ptr<FakeMidiManagerClient> client =
243 std::make_unique<FakeMidiManagerClient>();
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000244
toyoshim@chromium.orgc1e05fb2014-05-06 16:39:20 +0000245 StartTheFirstSession(client.get());
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900246 EXPECT_TRUE(CompleteInitialization(Result::INITIALIZATION_ERROR));
toyoshimf1b88962015-07-09 14:14:51 -0700247 EXPECT_EQ(Result::INITIALIZATION_ERROR, client->WaitForResult());
Takashi Toyoshimaec05edf2017-11-28 11:21:20 +0000248 EndSession(client.get(), 1U, 0U);
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000249}
250
251TEST_F(MidiManagerTest, StartMultipleSessions) {
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900252 std::unique_ptr<FakeMidiManagerClient> client1 =
253 std::make_unique<FakeMidiManagerClient>();
254 std::unique_ptr<FakeMidiManagerClient> client2 =
255 std::make_unique<FakeMidiManagerClient>();
256 std::unique_ptr<FakeMidiManagerClient> client3 =
257 std::make_unique<FakeMidiManagerClient>();
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000258
toyoshim@chromium.orgc1e05fb2014-05-06 16:39:20 +0000259 StartTheFirstSession(client1.get());
toyoshim@chromium.orgfc2002e2014-05-07 08:10:34 +0000260 StartTheNthSession(client2.get(), 2);
toyoshim@chromium.org1fa678a2014-06-13 09:40:33 +0000261 StartTheNthSession(client3.get(), 3);
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900262 EXPECT_TRUE(CompleteInitialization(Result::OK));
toyoshimf1b88962015-07-09 14:14:51 -0700263 EXPECT_EQ(Result::OK, client1->WaitForResult());
264 EXPECT_EQ(Result::OK, client2->WaitForResult());
265 EXPECT_EQ(Result::OK, client3->WaitForResult());
toyoshim@chromium.org1fa678a2014-06-13 09:40:33 +0000266 EndSession(client1.get(), 3U, 2U);
267 EndSession(client2.get(), 2U, 1U);
268 EndSession(client3.get(), 1U, 0U);
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000269}
270
toyoshim@chromium.orgfc2002e2014-05-07 08:10:34 +0000271TEST_F(MidiManagerTest, TooManyPendingSessions) {
272 // Push as many client requests for starting session as possible.
xiaofeng.zhang06152d82017-05-21 04:39:34 -0700273 std::vector<std::unique_ptr<FakeMidiManagerClient>> many_existing_clients;
toyoshim@chromium.orgfc2002e2014-05-07 08:10:34 +0000274 many_existing_clients.resize(MidiManager::kMaxPendingClientCount);
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900275 many_existing_clients[0] = std::make_unique<FakeMidiManagerClient>();
276 StartTheFirstSession(many_existing_clients[0].get());
277 for (size_t i = 1; i < MidiManager::kMaxPendingClientCount; ++i) {
Takashi Toyoshimaa88997d2017-09-07 08:30:18 +0000278 many_existing_clients[i] = std::make_unique<FakeMidiManagerClient>();
xiaofeng.zhang06152d82017-05-21 04:39:34 -0700279 StartTheNthSession(many_existing_clients[i].get(), i + 1);
toyoshim@chromium.orgfc2002e2014-05-07 08:10:34 +0000280 }
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900281 ASSERT_TRUE(factory()->manager());
282 EXPECT_TRUE(factory()->manager()->IsInitialized());
toyoshim@chromium.orgfc2002e2014-05-07 08:10:34 +0000283
284 // Push the last client that should be rejected for too many pending requests.
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900285 std::unique_ptr<FakeMidiManagerClient> additional_client =
286 std::make_unique<FakeMidiManagerClient>();
287 StartSession(additional_client.get());
toyoshimf1b88962015-07-09 14:14:51 -0700288 EXPECT_EQ(Result::INITIALIZATION_ERROR, additional_client->result());
toyoshim@chromium.orgfc2002e2014-05-07 08:10:34 +0000289
290 // Other clients still should not receive a result.
291 RunLoopUntilIdle();
292 for (size_t i = 0; i < many_existing_clients.size(); ++i)
toyoshimf1b88962015-07-09 14:14:51 -0700293 EXPECT_EQ(Result::NOT_SUPPORTED, many_existing_clients[i]->result());
toyoshim@chromium.orgfc2002e2014-05-07 08:10:34 +0000294
toyoshimf1b88962015-07-09 14:14:51 -0700295 // The Result::OK should be distributed to other clients.
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900296 EXPECT_TRUE(CompleteInitialization(Result::OK));
toyoshim@chromium.orgfc2002e2014-05-07 08:10:34 +0000297 for (size_t i = 0; i < many_existing_clients.size(); ++i)
toyoshimf1b88962015-07-09 14:14:51 -0700298 EXPECT_EQ(Result::OK, many_existing_clients[i]->WaitForResult());
toyoshim@chromium.orgfc2002e2014-05-07 08:10:34 +0000299
300 // Close all successful sessions in FIFO order.
301 size_t sessions = many_existing_clients.size();
302 for (size_t i = 0; i < many_existing_clients.size(); ++i, --sessions)
xiaofeng.zhang06152d82017-05-21 04:39:34 -0700303 EndSession(many_existing_clients[i].get(), sessions, sessions - 1);
toyoshim@chromium.orgfc2002e2014-05-07 08:10:34 +0000304}
305
toyoshim@chromium.org1fa678a2014-06-13 09:40:33 +0000306TEST_F(MidiManagerTest, AbortSession) {
307 // A client starting a session can be destructed while an asynchronous
308 // initialization is performed.
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900309 std::unique_ptr<FakeMidiManagerClient> client =
310 std::make_unique<FakeMidiManagerClient>();
toyoshim@chromium.org1fa678a2014-06-13 09:40:33 +0000311
312 StartTheFirstSession(client.get());
313 EndSession(client.get(), 0, 0);
314 client.reset();
315
316 // Following function should not call the destructed |client| function.
Takashi Toyoshimabc959ee2018-01-09 16:04:04 +0900317 EXPECT_FALSE(CompleteInitialization(Result::OK));
toyoshim@chromium.org1fa678a2014-06-13 09:40:33 +0000318 base::RunLoop run_loop;
319 run_loop.RunUntilIdle();
320}
321
Takashi Toyoshima88b4ac02019-02-12 11:25:56 +0000322class PlatformMidiManagerTest : public ::testing::Test {
323 public:
324 PlatformMidiManagerTest()
325 : client_(std::make_unique<FakeMidiManagerClient>()),
326 service_(std::make_unique<MidiService>()) {
327 //
328 }
329
330 ~PlatformMidiManagerTest() override {
331 service_->Shutdown();
332 base::RunLoop run_loop;
333 run_loop.RunUntilIdle();
334 }
335
336 MidiService* service() { return service_.get(); }
337
338 void StartSession() { service_->StartSession(client_.get()); }
339 void EndSession() { service_->EndSession(client_.get()); }
340 Result WaitForResult() { return client_->WaitForResult(); }
341
342 // This #ifdef needs to be identical to the one in media/midi/midi_manager.cc.
343 // Do not change the condition for disabling this test.
344 bool IsSupported() {
345#if !defined(OS_MACOSX) && !defined(OS_WIN) && \
346 !(defined(USE_ALSA) && defined(USE_UDEV)) && !defined(OS_ANDROID)
347 return false;
348#else
349 return true;
350#endif
351 }
352
353 private:
354 // SystemMonitor is needed on Windows.
355 base::SystemMonitor system_monitor;
356
357 base::test::ScopedTaskEnvironment env_;
358
359 std::unique_ptr<FakeMidiManagerClient> client_;
360 std::unique_ptr<MidiService> service_;
361
362 DISALLOW_COPY_AND_ASSIGN(PlatformMidiManagerTest);
363};
364
Hans Wennborg3b620e72018-05-17 16:58:16 +0000365#if defined(OS_ANDROID)
366// The test sometimes fails on Android. https://crbug.com/844027
367#define MAYBE_CreatePlatformMidiManager DISABLED_CreatePlatformMidiManager
368#else
369#define MAYBE_CreatePlatformMidiManager CreatePlatformMidiManager
370#endif
Takashi Toyoshima88b4ac02019-02-12 11:25:56 +0000371TEST_F(PlatformMidiManagerTest, MAYBE_CreatePlatformMidiManager) {
372 StartSession();
373 Result result = WaitForResult();
toyoshim71818732015-04-07 04:15:44 -0700374
Takashi Toyoshima88b4ac02019-02-12 11:25:56 +0000375#if defined(USE_ALSA)
agoode@chromium.org25227512014-06-08 05:12:05 +0000376 // Temporary until http://crbug.com/371230 is resolved.
toyoshimf1b88962015-07-09 14:14:51 -0700377 EXPECT_TRUE(result == Result::OK || result == Result::INITIALIZATION_ERROR);
dnicoara@chromium.orgc404df62014-05-06 22:56:00 +0000378#else
Takashi Toyoshima88b4ac02019-02-12 11:25:56 +0000379 EXPECT_EQ(IsSupported() ? Result::OK : Result::NOT_SUPPORTED, result);
dnicoara@chromium.orgc404df62014-05-06 22:56:00 +0000380#endif
Takashi Toyoshima88b4ac02019-02-12 11:25:56 +0000381}
toyoshim7a809662015-10-06 00:54:21 -0700382
Takashi Toyoshima88b4ac02019-02-12 11:25:56 +0000383TEST_F(PlatformMidiManagerTest, InstanceIdOverflow) {
384 service()->task_service()->OverflowInstanceIdForTesting();
385#if defined(OS_WIN)
386 MidiManagerWin::OverflowInstanceIdForTesting();
387#endif // defined(OS_WIN)
388
389 StartSession();
390 EXPECT_EQ(
391 IsSupported() ? Result::INITIALIZATION_ERROR : Result::NOT_SUPPORTED,
392 WaitForResult());
393
394 EndSession();
toyoshim@chromium.orgc1e05fb2014-05-06 16:39:20 +0000395}
396
toyoshim@chromium.org51c7f532014-05-01 17:17:32 +0000397} // namespace
398
toyoshime147c5e2015-05-07 21:58:31 -0700399} // namespace midi