blob: 995ccc350bd2137dea55450ae7264f14e66d45f6 [file] [log] [blame]
agoode55a8b522015-03-08 12:40:17 -07001// Copyright 2015 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_alsa.h"
6
danakj75afea02016-04-25 20:36:04 -07007#include <memory>
dchengc2aeece2015-12-27 00:54:00 -08008#include <utility>
9
agoode55a8b522015-03-08 12:40:17 -070010#include "testing/gtest/include/gtest/gtest.h"
11
toyoshime147c5e2015-05-07 21:58:31 -070012namespace midi {
agoode55a8b522015-03-08 12:40:17 -070013
agoode99d63292015-04-13 08:39:25 -070014class MidiManagerAlsaTest : public ::testing::Test {
15 protected:
16 void SetUp() override {
17 // Pre-instantiate typical MidiPort instances that are often used in
18 // following tests.
19
20 // Inputs. port_input_0_ == port_input_1_.
Peter Boström6cdc7522021-04-15 03:53:08 +000021 port_input_0_ = std::make_unique<MidiManagerAlsa::MidiPort>(
22 "path",
23 MidiManagerAlsa::MidiPort::Id("bus", "vendor", "model", "interface",
24 "serial"),
agooded87fc0f2015-05-21 08:29:31 -070025 1, 2, 5, "client_name", "port_name", "manufacturer", "version",
Peter Boström6cdc7522021-04-15 03:53:08 +000026 MidiManagerAlsa::MidiPort::Type::kInput);
27 port_input_1_ = std::make_unique<MidiManagerAlsa::MidiPort>(
28 "path",
29 MidiManagerAlsa::MidiPort::Id("bus", "vendor", "model", "interface",
30 "serial"),
agooded87fc0f2015-05-21 08:29:31 -070031 1, 2, 5, "client_name", "port_name", "manufacturer", "version",
Peter Boström6cdc7522021-04-15 03:53:08 +000032 MidiManagerAlsa::MidiPort::Type::kInput);
33 port_input_minimal_ = std::make_unique<MidiManagerAlsa::MidiPort>(
agooded87fc0f2015-05-21 08:29:31 -070034 "", MidiManagerAlsa::MidiPort::Id(), 0, 0, 0, "", "", "", "",
Peter Boström6cdc7522021-04-15 03:53:08 +000035 MidiManagerAlsa::MidiPort::Type::kInput);
agoode99d63292015-04-13 08:39:25 -070036 // Outputs. port_output_0_ == port_output_1_.
Peter Boström6cdc7522021-04-15 03:53:08 +000037 port_output_0_ = std::make_unique<MidiManagerAlsa::MidiPort>(
38 "path",
39 MidiManagerAlsa::MidiPort::Id("bus", "vendor", "model", "interface",
40 "serial"),
agooded87fc0f2015-05-21 08:29:31 -070041 1, 2, 5, "client_name", "port_name", "manufacturer", "version",
Peter Boström6cdc7522021-04-15 03:53:08 +000042 MidiManagerAlsa::MidiPort::Type::kOutput);
43 port_output_1_ = std::make_unique<MidiManagerAlsa::MidiPort>(
44 "path",
45 MidiManagerAlsa::MidiPort::Id("bus", "vendor", "model", "interface",
46 "serial"),
agooded87fc0f2015-05-21 08:29:31 -070047 1, 2, 5, "client_name", "port_name", "manufacturer", "version",
Peter Boström6cdc7522021-04-15 03:53:08 +000048 MidiManagerAlsa::MidiPort::Type::kOutput);
agoode99d63292015-04-13 08:39:25 -070049
50 // MidiPort fields that differ from port_input_0_ in a single way each time.
51 // Used for testing the Match* and Find* methods.
Peter Boström6cdc7522021-04-15 03:53:08 +000052 port_input_0_alt_path_ = std::make_unique<MidiManagerAlsa::MidiPort>(
53 "path2",
54 MidiManagerAlsa::MidiPort::Id("bus", "vendor", "model", "interface",
55 "serial"),
agooded87fc0f2015-05-21 08:29:31 -070056 1, 2, 5, "client_name", "port_name", "manufacturer", "version",
Peter Boström6cdc7522021-04-15 03:53:08 +000057 MidiManagerAlsa::MidiPort::Type::kInput);
58 port_input_0_alt_id_ = std::make_unique<MidiManagerAlsa::MidiPort>(
59 "path",
60 MidiManagerAlsa::MidiPort::Id("bus", "vendor", "model", "interface",
61 "serial2"),
agooded87fc0f2015-05-21 08:29:31 -070062 1, 2, 5, "client_name", "port_name", "manufacturer", "version",
Peter Boström6cdc7522021-04-15 03:53:08 +000063 MidiManagerAlsa::MidiPort::Type::kInput);
64 port_input_0_alt_client_name_ = std::make_unique<MidiManagerAlsa::MidiPort>(
65 "path",
66 MidiManagerAlsa::MidiPort::Id("bus", "vendor", "model", "interface",
67 "serial"),
agooded87fc0f2015-05-21 08:29:31 -070068 1, 2, 5, "client_name2", "port_name", "manufacturer", "version",
Peter Boström6cdc7522021-04-15 03:53:08 +000069 MidiManagerAlsa::MidiPort::Type::kInput);
70 port_input_0_alt_port_name_ = std::make_unique<MidiManagerAlsa::MidiPort>(
71 "path",
72 MidiManagerAlsa::MidiPort::Id("bus", "vendor", "model", "interface",
73 "serial"),
agooded87fc0f2015-05-21 08:29:31 -070074 1, 2, 5, "client_name", "port_name2", "manufacturer", "version",
Peter Boström6cdc7522021-04-15 03:53:08 +000075 MidiManagerAlsa::MidiPort::Type::kInput);
76 port_input_0_alt_client_id_ = std::make_unique<MidiManagerAlsa::MidiPort>(
77 "path",
78 MidiManagerAlsa::MidiPort::Id("bus", "vendor", "model", "interface",
79 "serial"),
agooded87fc0f2015-05-21 08:29:31 -070080 2, 2, 5, "client_name", "port_name", "manufacturer", "version",
Peter Boström6cdc7522021-04-15 03:53:08 +000081 MidiManagerAlsa::MidiPort::Type::kInput);
82 port_input_0_alt_port_id_ = std::make_unique<MidiManagerAlsa::MidiPort>(
83 "path",
84 MidiManagerAlsa::MidiPort::Id("bus", "vendor", "model", "interface",
85 "serial"),
agooded87fc0f2015-05-21 08:29:31 -070086 1, 3, 5, "client_name", "port_name", "manufacturer", "version",
Peter Boström6cdc7522021-04-15 03:53:08 +000087 MidiManagerAlsa::MidiPort::Type::kInput);
88 port_input_0_alt_midi_device_ = std::make_unique<MidiManagerAlsa::MidiPort>(
89 "path",
90 MidiManagerAlsa::MidiPort::Id("bus", "vendor", "model", "interface",
91 "serial"),
agooded87fc0f2015-05-21 08:29:31 -070092 1, 2, 6, "client_name", "port_name", "manufacturer", "version",
Peter Boström6cdc7522021-04-15 03:53:08 +000093 MidiManagerAlsa::MidiPort::Type::kInput);
agoode99d63292015-04-13 08:39:25 -070094
95 // "No card" variants of above. For testing FindDisconnected.
Peter Boström6cdc7522021-04-15 03:53:08 +000096 port_input_0_no_card_ = std::make_unique<MidiManagerAlsa::MidiPort>(
agooded87fc0f2015-05-21 08:29:31 -070097 "", MidiManagerAlsa::MidiPort::Id(), 1, 2, -1, "client_name",
98 "port_name", "manufacturer", "version",
Peter Boström6cdc7522021-04-15 03:53:08 +000099 MidiManagerAlsa::MidiPort::Type::kInput);
100 port_input_1_no_card_ = std::make_unique<MidiManagerAlsa::MidiPort>(
agooded87fc0f2015-05-21 08:29:31 -0700101 "", MidiManagerAlsa::MidiPort::Id(), 1, 2, -1, "client_name",
102 "port_name", "manufacturer", "version",
Peter Boström6cdc7522021-04-15 03:53:08 +0000103 MidiManagerAlsa::MidiPort::Type::kInput);
104 port_output_0_no_card_ = std::make_unique<MidiManagerAlsa::MidiPort>(
agooded87fc0f2015-05-21 08:29:31 -0700105 "", MidiManagerAlsa::MidiPort::Id(), 1, 2, -1, "client_name",
106 "port_name", "manufacturer", "version",
Peter Boström6cdc7522021-04-15 03:53:08 +0000107 MidiManagerAlsa::MidiPort::Type::kOutput);
agoode99d63292015-04-13 08:39:25 -0700108
109 // No card variants of the alt variants from above. For more testing
110 // of Match* and Find*.
Peter Boström6cdc7522021-04-15 03:53:08 +0000111 port_input_0_no_card_alt_client_name_ =
112 std::make_unique<MidiManagerAlsa::MidiPort>(
113 "", MidiManagerAlsa::MidiPort::Id(), 1, 2, -1, "client_name2",
114 "port_name", "manufacturer", "version",
115 MidiManagerAlsa::MidiPort::Type::kInput);
116 port_input_0_no_card_alt_port_name_ =
117 std::make_unique<MidiManagerAlsa::MidiPort>(
118 "", MidiManagerAlsa::MidiPort::Id(), 1, 2, -1, "client_name",
119 "port_name2", "manufacturer", "version",
120 MidiManagerAlsa::MidiPort::Type::kInput);
121 port_input_0_no_card_alt_client_id_ =
122 std::make_unique<MidiManagerAlsa::MidiPort>(
123 "", MidiManagerAlsa::MidiPort::Id(), 2, 2, -1, "client_name",
124 "port_name", "manufacturer", "version",
125 MidiManagerAlsa::MidiPort::Type::kInput);
126 port_input_0_no_card_alt_port_id_ =
127 std::make_unique<MidiManagerAlsa::MidiPort>(
128 "", MidiManagerAlsa::MidiPort::Id(), 1, 3, -1, "client_name",
129 "port_name", "manufacturer", "version",
130 MidiManagerAlsa::MidiPort::Type::kInput);
agoode99d63292015-04-13 08:39:25 -0700131 }
132
133 // Counts ports for help with testing ToMidiPortState().
134 int CountPorts(MidiManagerAlsa::TemporaryMidiPortState& state) {
135 int count = 0;
136 for (auto it = state.begin(); it != state.end(); ++it)
137 ++count;
138 return count;
139 }
140
danakj75afea02016-04-25 20:36:04 -0700141 std::unique_ptr<MidiManagerAlsa::MidiPort> port_input_0_;
142 std::unique_ptr<MidiManagerAlsa::MidiPort> port_input_1_;
143 std::unique_ptr<MidiManagerAlsa::MidiPort> port_input_minimal_;
144 std::unique_ptr<MidiManagerAlsa::MidiPort> port_output_0_;
145 std::unique_ptr<MidiManagerAlsa::MidiPort> port_output_1_;
agoode99d63292015-04-13 08:39:25 -0700146
danakj75afea02016-04-25 20:36:04 -0700147 std::unique_ptr<MidiManagerAlsa::MidiPort> port_input_0_alt_path_;
148 std::unique_ptr<MidiManagerAlsa::MidiPort> port_input_0_alt_id_;
149 std::unique_ptr<MidiManagerAlsa::MidiPort> port_input_0_alt_client_name_;
150 std::unique_ptr<MidiManagerAlsa::MidiPort> port_input_0_alt_port_name_;
151 std::unique_ptr<MidiManagerAlsa::MidiPort> port_input_0_alt_client_id_;
152 std::unique_ptr<MidiManagerAlsa::MidiPort> port_input_0_alt_port_id_;
153 std::unique_ptr<MidiManagerAlsa::MidiPort> port_input_0_alt_midi_device_;
agoode99d63292015-04-13 08:39:25 -0700154
danakj75afea02016-04-25 20:36:04 -0700155 std::unique_ptr<MidiManagerAlsa::MidiPort> port_input_0_no_card_;
156 std::unique_ptr<MidiManagerAlsa::MidiPort> port_input_1_no_card_;
157 std::unique_ptr<MidiManagerAlsa::MidiPort> port_output_0_no_card_;
agoode99d63292015-04-13 08:39:25 -0700158
danakj75afea02016-04-25 20:36:04 -0700159 std::unique_ptr<MidiManagerAlsa::MidiPort>
160 port_input_0_no_card_alt_client_name_;
161 std::unique_ptr<MidiManagerAlsa::MidiPort>
162 port_input_0_no_card_alt_port_name_;
163 std::unique_ptr<MidiManagerAlsa::MidiPort>
164 port_input_0_no_card_alt_client_id_;
165 std::unique_ptr<MidiManagerAlsa::MidiPort> port_input_0_no_card_alt_port_id_;
agoode99d63292015-04-13 08:39:25 -0700166
167 // State fields to avoid declaring in test fixtures below.
168 MidiManagerAlsa::MidiPortState midi_port_state_0_;
169 MidiManagerAlsa::MidiPortState midi_port_state_1_;
170 MidiManagerAlsa::TemporaryMidiPortState temporary_midi_port_state_0_;
171 MidiManagerAlsa::AlsaSeqState alsa_seq_state_0_;
agoodeb09423b2015-05-11 11:39:57 -0700172 MidiManagerAlsa::AlsaCardMap alsa_cards_;
agoode99d63292015-04-13 08:39:25 -0700173};
174
175// Tests that ExtractManufacturerString works as expected.
176TEST_F(MidiManagerAlsaTest, ExtractManufacturer) {
agoodeb09423b2015-05-11 11:39:57 -0700177 EXPECT_EQ("My\\x20Vendor",
178 MidiManagerAlsa::AlsaCard::ExtractManufacturerString(
179 "My\\x20Vendor", "1234", "My Vendor, Inc.", "Card",
180 "My Vendor Inc Card at bus"));
181 EXPECT_EQ("My Vendor", MidiManagerAlsa::AlsaCard::ExtractManufacturerString(
agoodeaf6e9f52015-03-24 10:23:49 -0700182 "My Vendor", "1234", "My Vendor, Inc.", "Card",
183 "My Vendor Inc Card at bus"));
agoodeb09423b2015-05-11 11:39:57 -0700184 EXPECT_EQ("My Vendor, Inc.",
185 MidiManagerAlsa::AlsaCard::ExtractManufacturerString(
186 "1234", "1234", "My Vendor, Inc.", "Card",
187 "My Vendor Inc Card at bus"));
agoode99d63292015-04-13 08:39:25 -0700188 EXPECT_EQ("My Vendor Inc",
agoodeb09423b2015-05-11 11:39:57 -0700189 MidiManagerAlsa::AlsaCard::ExtractManufacturerString(
agoodebd4be9b2015-03-16 19:17:25 -0700190 "1234", "1234", "", "Card", "My Vendor Inc Card at bus"));
agoode99d63292015-04-13 08:39:25 -0700191 EXPECT_EQ("My Vendor Inc",
agoodeb09423b2015-05-11 11:39:57 -0700192 MidiManagerAlsa::AlsaCard::ExtractManufacturerString(
agoodebd4be9b2015-03-16 19:17:25 -0700193 "", "", "", "Card", "My Vendor Inc Card at bus"));
agoodeb09423b2015-05-11 11:39:57 -0700194 EXPECT_EQ("", MidiManagerAlsa::AlsaCard::ExtractManufacturerString(
195 "1234", "1234", "", "Card", "Longname"));
agoode99d63292015-04-13 08:39:25 -0700196 EXPECT_EQ("Keystation\\x20Mini\\x2032",
agoodeb09423b2015-05-11 11:39:57 -0700197 MidiManagerAlsa::AlsaCard::ExtractManufacturerString(
agoodebd4be9b2015-03-16 19:17:25 -0700198 "Keystation\\x20Mini\\x2032", "129d",
199 "Evolution Electronics, Ltd", "Keystation Mini 32",
200 "Keystation Mini 32 Keystation Mini 32 at"
201 " usb-0000:00:14.0-2.4.4, full speed"));
agoode99d63292015-04-13 08:39:25 -0700202 EXPECT_EQ("Keystation Mini 32",
agoodeb09423b2015-05-11 11:39:57 -0700203 MidiManagerAlsa::AlsaCard::ExtractManufacturerString(
agoodebd4be9b2015-03-16 19:17:25 -0700204 "Keystation Mini 32", "129d", "Evolution Electronics, Ltd",
agoode55a8b522015-03-08 12:40:17 -0700205 "Keystation Mini 32",
206 "Keystation Mini 32 Keystation Mini 32 at"
207 " usb-0000:00:14.0-2.4.4, full speed"));
agoodeb09423b2015-05-11 11:39:57 -0700208 EXPECT_EQ("Keystation Mini 32",
209 MidiManagerAlsa::AlsaCard::ExtractManufacturerString(
210 "", "", "", "Keystation Mini 32",
211 "Keystation Mini 32 Keystation Mini 32 at"
212 " usb-0000:00:14.0-2.4.4, full speed"));
213 EXPECT_EQ("", MidiManagerAlsa::AlsaCard::ExtractManufacturerString(
agoodef212b2a2015-03-19 12:53:23 -0700214 "", "", "", "Serial MIDI (UART16550A)",
215 "Serial MIDI (UART16550A) [Soundcanvas] at 0x3f8, irq 4"));
agoodeb09423b2015-05-11 11:39:57 -0700216 EXPECT_EQ("", MidiManagerAlsa::AlsaCard::ExtractManufacturerString(
agoodef212b2a2015-03-19 12:53:23 -0700217 "", "", "", "VirMIDI", "Virtual MIDI Card 1"));
agoode99d63292015-04-13 08:39:25 -0700218 EXPECT_EQ("C-Media Electronics Inc",
agoodeb09423b2015-05-11 11:39:57 -0700219 MidiManagerAlsa::AlsaCard::ExtractManufacturerString(
agoodee83758c2015-03-23 22:07:54 -0700220 "", "0x13f6", "C-Media Electronics Inc", "C-Media CMI8738 MIDI",
221 "C-Media CMI8738 (model 55) at 0xd000, irq 19"));
agoode99d63292015-04-13 08:39:25 -0700222 EXPECT_EQ("C-Media Electronics Inc",
agoodeb09423b2015-05-11 11:39:57 -0700223 MidiManagerAlsa::AlsaCard::ExtractManufacturerString(
agoodee83758c2015-03-23 22:07:54 -0700224 "", "0x13f6", "C-Media Electronics Inc", "C-Media CMI8738 FM",
225 "C-Media CMI8738 (model 55) at 0xd000, irq 19"));
agoodef212b2a2015-03-19 12:53:23 -0700226}
227
agoode99d63292015-04-13 08:39:25 -0700228// Tests that verify proper serialization and generation of opaque key for
229// MidiPort.
230TEST_F(MidiManagerAlsaTest, JSONPortMetadata) {
231 EXPECT_EQ(
agooded87fc0f2015-05-21 08:29:31 -0700232 "{\"bus\":\"bus\",\"clientId\":1,\"clientName\":\"client_name\","
233 "\"midiDevice\":5,\"modelId\":\"model\",\"path\":\"path\",\"portId\":2,"
234 "\"portName\":\"port_name\",\"serial\":\"serial\",\"type\":\"input\","
235 "\"usbInterfaceNum\":\"interface\",\"vendorId\":\"vendor\"}",
agoode99d63292015-04-13 08:39:25 -0700236 port_input_0_->JSONValue());
agoodef212b2a2015-03-19 12:53:23 -0700237
agooded87fc0f2015-05-21 08:29:31 -0700238 EXPECT_EQ("810194DAF713B32FC9BE40EC822E21682635B48C242D09EA95DBA4A184A95877",
agoode99d63292015-04-13 08:39:25 -0700239 port_input_0_->OpaqueKey());
agoodef212b2a2015-03-19 12:53:23 -0700240
agoode99d63292015-04-13 08:39:25 -0700241 EXPECT_EQ(
agooded87fc0f2015-05-21 08:29:31 -0700242 "{\"bus\":\"bus\",\"clientId\":1,\"clientName\":\"client_name\","
243 "\"midiDevice\":5,\"modelId\":\"model\",\"path\":\"path\",\"portId\":2,"
244 "\"portName\":\"port_name\",\"serial\":\"serial\",\"type\":\"output\","
245 "\"usbInterfaceNum\":\"interface\",\"vendorId\":\"vendor\"}",
agoode99d63292015-04-13 08:39:25 -0700246 port_output_0_->JSONValue());
agooded87fc0f2015-05-21 08:29:31 -0700247 EXPECT_EQ("C32552FC772A0CA453A675CED05EFB3BDEF749EB58ED9522475206F111BC01E2",
agoode99d63292015-04-13 08:39:25 -0700248 port_output_0_->OpaqueKey());
agoodef212b2a2015-03-19 12:53:23 -0700249
agoode99d63292015-04-13 08:39:25 -0700250 EXPECT_EQ("{\"clientId\":0,\"midiDevice\":0,\"portId\":0,\"type\":\"input\"}",
251 port_input_minimal_->JSONValue());
252 EXPECT_EQ("3BC2A85598E5026D01DBCB022016C8A3362A9C7F912B88E303BF619C56D0C111",
253 port_input_minimal_->OpaqueKey());
agoode55a8b522015-03-08 12:40:17 -0700254}
255
agoode99d63292015-04-13 08:39:25 -0700256// Tests Match* methods.
257TEST_F(MidiManagerAlsaTest, MatchConnected) {
258 // The query can be disconnected or connected, but the target
259 // must be connected.
260 port_input_1_->set_connected(false);
261 EXPECT_TRUE(port_input_0_->MatchConnected(*port_input_1_.get()));
262 EXPECT_FALSE(port_input_1_->MatchConnected(*port_input_0_.get()));
263
264 // Differing types.
265 EXPECT_FALSE(port_input_0_->MatchConnected(*port_output_0_.get()));
266
267 // Differing in 1 field. None should succeed.
268 EXPECT_FALSE(port_input_0_->MatchConnected(*port_input_0_alt_path_.get()));
269 EXPECT_FALSE(port_input_0_->MatchConnected(*port_input_0_alt_id_.get()));
270 EXPECT_FALSE(
271 port_input_0_->MatchConnected(*port_input_0_alt_client_name_.get()));
272 EXPECT_FALSE(
273 port_input_0_->MatchConnected(*port_input_0_alt_port_name_.get()));
274 EXPECT_FALSE(
275 port_input_0_->MatchConnected(*port_input_0_alt_client_id_.get()));
276 EXPECT_FALSE(port_input_0_->MatchConnected(*port_input_0_alt_port_id_.get()));
277 EXPECT_FALSE(
278 port_input_0_->MatchConnected(*port_input_0_alt_midi_device_.get()));
279}
280
281TEST_F(MidiManagerAlsaTest, MatchCard1) {
282 // The query can be disconnected or connected, but the target
283 // must be disonnected.
284 EXPECT_FALSE(port_input_0_->MatchCardPass1(*port_input_1_.get()));
285 port_input_0_->set_connected(false);
286 EXPECT_TRUE(port_input_0_->MatchCardPass1(*port_input_1_.get()));
287
288 // Differing types.
289 EXPECT_FALSE(port_input_0_->MatchCardPass1(*port_output_0_.get()));
290
291 // Tests matches differing in 1 field.
292 // client_name, port_name, client_id are ok to differ.
293 EXPECT_FALSE(port_input_0_->MatchCardPass1(*port_input_0_alt_path_.get()));
294 EXPECT_FALSE(port_input_0_->MatchCardPass1(*port_input_0_alt_id_.get()));
295 EXPECT_TRUE(
296 port_input_0_->MatchCardPass1(*port_input_0_alt_client_name_.get()));
297 EXPECT_TRUE(
298 port_input_0_->MatchCardPass1(*port_input_0_alt_port_name_.get()));
299 EXPECT_TRUE(
300 port_input_0_->MatchCardPass1(*port_input_0_alt_client_id_.get()));
301 EXPECT_FALSE(port_input_0_->MatchCardPass1(*port_input_0_alt_port_id_.get()));
302 EXPECT_FALSE(
303 port_input_0_->MatchCardPass1(*port_input_0_alt_midi_device_.get()));
304}
305
306TEST_F(MidiManagerAlsaTest, MatchCard2) {
307 // The query can be disconnected or connected, but the target
308 // must be disonnected.
309 EXPECT_FALSE(port_input_0_->MatchCardPass2(*port_input_1_.get()));
310 port_input_0_->set_connected(false);
311 EXPECT_TRUE(port_input_0_->MatchCardPass2(*port_input_1_.get()));
312
313 // Differing types.
314 EXPECT_FALSE(port_input_0_->MatchCardPass2(*port_output_0_.get()));
315
316 // Tests matches differing in 1 field.
317 // client_name, port_name, path, client_id are ok to differ.
318 EXPECT_TRUE(port_input_0_->MatchCardPass2(*port_input_0_alt_path_.get()));
319 EXPECT_FALSE(port_input_0_->MatchCardPass2(*port_input_0_alt_id_.get()));
320 EXPECT_TRUE(
321 port_input_0_->MatchCardPass2(*port_input_0_alt_client_name_.get()));
322 EXPECT_TRUE(
323 port_input_0_->MatchCardPass2(*port_input_0_alt_port_name_.get()));
324 EXPECT_TRUE(
325 port_input_0_->MatchCardPass2(*port_input_0_alt_client_id_.get()));
326 EXPECT_FALSE(port_input_0_->MatchCardPass2(*port_input_0_alt_port_id_.get()));
327 EXPECT_FALSE(
328 port_input_0_->MatchCardPass2(*port_input_0_alt_midi_device_.get()));
329}
330
331TEST_F(MidiManagerAlsaTest, MatchNoCard1) {
332 // The query can be disconnected or connected, but the target
333 // must be disonnected.
334 // path and id must be empty. midi_device must be -1.
335 EXPECT_FALSE(port_input_0_no_card_->MatchNoCardPass1(*port_input_1_.get()));
336 port_input_0_no_card_->set_connected(false);
337 EXPECT_FALSE(port_input_0_no_card_->MatchNoCardPass1(*port_input_1_.get()));
338 EXPECT_TRUE(
339 port_input_0_no_card_->MatchNoCardPass1(*port_input_1_no_card_.get()));
340
341 // Differing types.
342 EXPECT_FALSE(
343 port_input_0_no_card_->MatchNoCardPass1(*port_output_0_no_card_.get()));
344
345 // Tests matches differing in 1 field.
346 EXPECT_FALSE(port_input_0_no_card_->MatchNoCardPass1(
347 *port_input_0_no_card_alt_client_name_.get()));
348 EXPECT_FALSE(port_input_0_no_card_->MatchNoCardPass1(
349 *port_input_0_no_card_alt_port_name_.get()));
350 EXPECT_FALSE(port_input_0_no_card_->MatchNoCardPass1(
351 *port_input_0_no_card_alt_client_id_.get()));
352 EXPECT_FALSE(port_input_0_no_card_->MatchNoCardPass1(
353 *port_input_0_no_card_alt_port_id_.get()));
354}
355
356TEST_F(MidiManagerAlsaTest, MatchNoCard2) {
357 // The query can be disconnected or connected, but the target
358 // must be disonnected.
359 // path and id must be empty. midi_device must be -1.
360 EXPECT_FALSE(port_input_0_no_card_->MatchNoCardPass2(*port_input_1_.get()));
361 port_input_0_no_card_->set_connected(false);
362 EXPECT_FALSE(port_input_0_no_card_->MatchNoCardPass2(*port_input_1_.get()));
363 EXPECT_TRUE(
364 port_input_0_no_card_->MatchNoCardPass2(*port_input_1_no_card_.get()));
365
366 // Differing types.
367 EXPECT_FALSE(
368 port_input_0_no_card_->MatchNoCardPass2(*port_output_0_no_card_.get()));
369
370 // Tests matches differing in 1 field.
371 // client_id ok to differ.
372 EXPECT_FALSE(port_input_0_no_card_->MatchNoCardPass2(
373 *port_input_0_no_card_alt_client_name_.get()));
374 EXPECT_FALSE(port_input_0_no_card_->MatchNoCardPass2(
375 *port_input_0_no_card_alt_port_name_.get()));
376 EXPECT_TRUE(port_input_0_no_card_->MatchNoCardPass2(
377 *port_input_0_no_card_alt_client_id_.get()));
378 EXPECT_FALSE(port_input_0_no_card_->MatchNoCardPass2(
379 *port_input_0_no_card_alt_port_id_.get()));
380}
381
382// Tests that MidiPorts start connected.
383TEST_F(MidiManagerAlsaTest, PortStartsConnected) {
384 EXPECT_TRUE(port_output_0_->connected());
385 EXPECT_TRUE(port_input_0_->connected());
386}
387
388// Tests that the web_port_index gets updated by MidiPortState.
389TEST_F(MidiManagerAlsaTest, PortIndexSet) {
390 auto* port_input_0_tracking_pointer = port_input_0_.get();
391 auto* port_output_0_tracking_pointer = port_output_0_.get();
392 auto* port_input_1_tracking_pointer = port_input_1_.get();
393 auto* port_output_1_tracking_pointer = port_input_1_.get();
394
395 // Explicitly initialize web_port_index.
396 port_input_1_->set_web_port_index(5000);
397 port_output_1_->set_web_port_index(5000);
398
dchengc2aeece2015-12-27 00:54:00 -0800399 midi_port_state_0_.push_back(std::move(port_input_0_));
400 midi_port_state_0_.push_back(std::move(port_output_0_));
401 midi_port_state_0_.push_back(std::move(port_input_1_));
402 midi_port_state_0_.push_back(std::move(port_output_1_));
agoode99d63292015-04-13 08:39:25 -0700403
404 // First port of each type has index of 0.
405 EXPECT_EQ(0U, port_input_0_tracking_pointer->web_port_index());
406 EXPECT_EQ(0U, port_output_0_tracking_pointer->web_port_index());
407 // Second port of each type has index of 1.
408 EXPECT_EQ(1U, port_input_1_tracking_pointer->web_port_index());
409 EXPECT_EQ(1U, port_output_1_tracking_pointer->web_port_index());
410}
411
412// Tests that the web_port_index is not updated by TemporaryMidiPortState.
413TEST_F(MidiManagerAlsaTest, PortIndexNotSet) {
414 auto* port_input_0_tracking_pointer = port_input_0_.get();
415 auto* port_output_0_tracking_pointer = port_output_0_.get();
416 auto* port_input_1_tracking_pointer = port_input_1_.get();
417 auto* port_output_1_tracking_pointer = port_input_1_.get();
418
419 // Explicitly initialize web_port_index.
420 port_input_1_->set_web_port_index(5000);
421 port_output_1_->set_web_port_index(5000);
422
dchengc2aeece2015-12-27 00:54:00 -0800423 temporary_midi_port_state_0_.push_back(std::move(port_input_0_));
424 temporary_midi_port_state_0_.push_back(std::move(port_output_0_));
425 temporary_midi_port_state_0_.push_back(std::move(port_input_1_));
426 temporary_midi_port_state_0_.push_back(std::move(port_output_1_));
agoode99d63292015-04-13 08:39:25 -0700427
428 // web_port_index is untouched.
429 EXPECT_EQ(0U, port_input_0_tracking_pointer->web_port_index());
430 EXPECT_EQ(0U, port_output_0_tracking_pointer->web_port_index());
431 EXPECT_EQ(5000U, port_input_1_tracking_pointer->web_port_index());
432 EXPECT_EQ(5000U, port_output_1_tracking_pointer->web_port_index());
433}
434
435// Tests that inputs and outputs stay separate in MidiPortState.
436TEST_F(MidiManagerAlsaTest, SeparateInputOutput) {
437 auto* port_input_0_tracking_pointer = port_input_0_.get();
438 auto* port_output_0_tracking_pointer = port_output_0_.get();
439 auto* port_input_1_tracking_pointer = port_input_1_.get();
440 auto* port_output_1_tracking_pointer = port_input_1_.get();
441
442 // First port of each type has index of 0.
dchengc2aeece2015-12-27 00:54:00 -0800443 EXPECT_EQ(0U, midi_port_state_0_.push_back(std::move(port_input_0_)));
444 EXPECT_EQ(0U, midi_port_state_0_.push_back(std::move(port_output_0_)));
agoode99d63292015-04-13 08:39:25 -0700445
446 // Second port of each type has index of 1.
dchengc2aeece2015-12-27 00:54:00 -0800447 EXPECT_EQ(1U, midi_port_state_0_.push_back(std::move(port_input_1_)));
448 EXPECT_EQ(1U, midi_port_state_0_.push_back(std::move(port_output_1_)));
agoode99d63292015-04-13 08:39:25 -0700449
450 // Check again that the field matches what was returned.
451 EXPECT_EQ(0U, port_input_0_tracking_pointer->web_port_index());
452 EXPECT_EQ(0U, port_output_0_tracking_pointer->web_port_index());
453 EXPECT_EQ(1U, port_input_1_tracking_pointer->web_port_index());
454 EXPECT_EQ(1U, port_output_1_tracking_pointer->web_port_index());
455}
456
457// Tests FindConnected.
458TEST_F(MidiManagerAlsaTest, FindConnected) {
459 auto* port_input_0_tracking_pointer = port_input_0_.get();
460 auto* port_input_1_tracking_pointer = port_input_1_.get();
461
462 // Insert port_input_0.
dchengc2aeece2015-12-27 00:54:00 -0800463 midi_port_state_0_.push_back(std::move(port_input_0_));
agoode99d63292015-04-13 08:39:25 -0700464 // Look for port_input_1 (every field matches port_input_0).
465 auto it = midi_port_state_0_.FindConnected(*port_input_1_tracking_pointer);
agoode5ebc4932015-12-01 08:25:12 -0800466 EXPECT_EQ(port_input_0_tracking_pointer, it->get());
agoode99d63292015-04-13 08:39:25 -0700467 // Look for something else that we won't find.
468 EXPECT_EQ(midi_port_state_0_.end(),
469 midi_port_state_0_.FindConnected(*port_input_0_alt_path_));
470}
471
472TEST_F(MidiManagerAlsaTest, FindConnected2) {
473 auto* port_input_0_tracking_pointer = port_input_0_.get();
474 auto* port_input_1_tracking_pointer = port_input_1_.get();
475
476 // Insert some stuff.
dchengc2aeece2015-12-27 00:54:00 -0800477 midi_port_state_0_.push_back(std::move(port_input_0_alt_path_));
478 midi_port_state_0_.push_back(std::move(port_input_0_alt_id_));
479 midi_port_state_0_.push_back(std::move(port_input_0_alt_client_name_));
agoode99d63292015-04-13 08:39:25 -0700480 // Insert port_input_0.
dchengc2aeece2015-12-27 00:54:00 -0800481 midi_port_state_0_.push_back(std::move(port_input_0_));
agoode99d63292015-04-13 08:39:25 -0700482 // Insert some more stuff.
dchengc2aeece2015-12-27 00:54:00 -0800483 midi_port_state_0_.push_back(std::move(port_input_0_alt_port_id_));
agoode99d63292015-04-13 08:39:25 -0700484 // Look for port_input_1 (matches to port_input_0).
485 auto it = midi_port_state_0_.FindConnected(*port_input_1_tracking_pointer);
agoode5ebc4932015-12-01 08:25:12 -0800486 EXPECT_EQ(port_input_0_tracking_pointer, it->get());
agoode99d63292015-04-13 08:39:25 -0700487 // Look for something else that we won't find.
488 EXPECT_EQ(midi_port_state_0_.end(),
489 midi_port_state_0_.FindConnected(*port_input_minimal_));
490}
491
492TEST_F(MidiManagerAlsaTest, FindConnected3) {
493 // midi_port_state_0_ is empty to start.
494 EXPECT_EQ(midi_port_state_0_.end(),
495 midi_port_state_0_.FindConnected(*port_input_minimal_));
496}
497
498// Tests FindDisconnected.
499TEST_F(MidiManagerAlsaTest, FindDisconnected) {
500 // midi_port_state_0_ is empty to start.
501 EXPECT_EQ(midi_port_state_0_.end(),
502 midi_port_state_0_.FindDisconnected(*port_input_minimal_));
503}
504
505TEST_F(MidiManagerAlsaTest, FindDisconnected2) {
506 auto* port_input_0_tracking_pointer = port_input_0_.get();
507 auto* port_input_1_tracking_pointer = port_input_1_.get();
508 auto* port_input_1_no_card_tracking_pointer = port_input_1_no_card_.get();
509
510 // Ports need to be disconnected to find them.
511 port_input_0_alt_id_->set_connected(false);
512 port_input_0_alt_path_->set_connected(false);
513 port_input_0_->set_connected(false);
514
515 // Insert some stuff.
dchengc2aeece2015-12-27 00:54:00 -0800516 midi_port_state_0_.push_back(std::move(port_input_0_alt_id_));
517 midi_port_state_0_.push_back(std::move(port_input_0_alt_path_));
agoode99d63292015-04-13 08:39:25 -0700518 // Insert port_input_0.
dchengc2aeece2015-12-27 00:54:00 -0800519 midi_port_state_0_.push_back(std::move(port_input_0_));
agoode99d63292015-04-13 08:39:25 -0700520
521 // Add "no card" stuff.
522 port_input_1_no_card_->set_connected(false);
dchengc2aeece2015-12-27 00:54:00 -0800523 midi_port_state_0_.push_back(std::move(port_input_1_no_card_));
agoode99d63292015-04-13 08:39:25 -0700524
525 // Insert some more stuff.
dchengc2aeece2015-12-27 00:54:00 -0800526 midi_port_state_0_.push_back(std::move(port_input_0_alt_port_id_));
agoode99d63292015-04-13 08:39:25 -0700527
528 // Look for port_input_1, should trigger exact match.
agoode5ebc4932015-12-01 08:25:12 -0800529 EXPECT_EQ(port_input_0_tracking_pointer,
530 midi_port_state_0_.FindDisconnected(*port_input_1_tracking_pointer)
531 ->get());
agoode99d63292015-04-13 08:39:25 -0700532
533 // Look for no card exact match.
agoode5ebc4932015-12-01 08:25:12 -0800534 EXPECT_EQ(
535 port_input_1_no_card_tracking_pointer,
536 midi_port_state_0_.FindDisconnected(*port_input_0_no_card_.get())->get());
agoode99d63292015-04-13 08:39:25 -0700537
538 // Look for something else that we won't find.
539 EXPECT_EQ(midi_port_state_0_.end(),
540 midi_port_state_0_.FindDisconnected(*port_input_minimal_));
541}
542
543TEST_F(MidiManagerAlsaTest, FindDisconnected3) {
544 auto* port_input_0_tracking_pointer = port_input_0_.get();
545 auto* port_input_0_alt_path_tracking_pointer = port_input_0_alt_path_.get();
546 auto* port_input_1_no_card_tracking_pointer = port_input_1_no_card_.get();
547
548 // Ports need to be disconnected to find them.
549 port_input_0_alt_path_->set_connected(false);
550 port_input_0_->set_connected(false);
551
552 // Insert some stuff.
dchengc2aeece2015-12-27 00:54:00 -0800553 midi_port_state_0_.push_back(std::move(port_input_0_alt_path_));
554 midi_port_state_0_.push_back(std::move(port_input_0_alt_id_));
agoode99d63292015-04-13 08:39:25 -0700555
556 // Add no card stuff.
557 port_input_1_no_card_->set_connected(false);
dchengc2aeece2015-12-27 00:54:00 -0800558 midi_port_state_0_.push_back(std::move(port_input_1_no_card_));
agoode99d63292015-04-13 08:39:25 -0700559
560 // Look for port_input_0, should find port_input_0_alt_path.
agoode5ebc4932015-12-01 08:25:12 -0800561 EXPECT_EQ(port_input_0_alt_path_tracking_pointer,
562 midi_port_state_0_.FindDisconnected(*port_input_0_tracking_pointer)
563 ->get());
agoode99d63292015-04-13 08:39:25 -0700564
565 // Look for no card partial match.
566 EXPECT_EQ(port_input_1_no_card_tracking_pointer,
agoode5ebc4932015-12-01 08:25:12 -0800567 midi_port_state_0_.FindDisconnected(
568 *port_input_0_no_card_alt_client_id_.get())
569 ->get());
agoode99d63292015-04-13 08:39:25 -0700570
571 // Won't find this.
572 EXPECT_EQ(midi_port_state_0_.end(),
573 midi_port_state_0_.FindDisconnected(
574 *port_input_0_no_card_alt_port_id_.get()));
575
576 // Look for something else that we won't find.
577 EXPECT_EQ(midi_port_state_0_.end(),
578 midi_port_state_0_.FindDisconnected(*port_input_minimal_));
579}
580
581// Tests AlsaSeqState -> MidiPortState.
582TEST_F(MidiManagerAlsaTest, ToMidiPortState) {
583 // Empty state.
agoodeb09423b2015-05-11 11:39:57 -0700584 EXPECT_EQ(0,
585 CountPorts(*alsa_seq_state_0_.ToMidiPortState(alsa_cards_).get()));
agoode99d63292015-04-13 08:39:25 -0700586
587 // Still empty, because there are no ports yet.
588 alsa_seq_state_0_.ClientStart(0, "0", SND_SEQ_KERNEL_CLIENT);
agoodeb09423b2015-05-11 11:39:57 -0700589 EXPECT_EQ(0,
590 CountPorts(*alsa_seq_state_0_.ToMidiPortState(alsa_cards_).get()));
agoode99d63292015-04-13 08:39:25 -0700591
592 // Add a port, now it has 1 item when converted.
593 alsa_seq_state_0_.PortStart(
594 0, 0, "0:0", MidiManagerAlsa::AlsaSeqState::PortDirection::kInput, true);
agoodeb09423b2015-05-11 11:39:57 -0700595 EXPECT_EQ(1,
596 CountPorts(*alsa_seq_state_0_.ToMidiPortState(alsa_cards_).get()));
agoode99d63292015-04-13 08:39:25 -0700597
598 // Close client. This closes its ports and returns count to 0.
599 alsa_seq_state_0_.ClientExit(0);
agoodeb09423b2015-05-11 11:39:57 -0700600 EXPECT_EQ(0,
601 CountPorts(*alsa_seq_state_0_.ToMidiPortState(alsa_cards_).get()));
agoode99d63292015-04-13 08:39:25 -0700602
603 // Add another port, without client. This does nothing.
604 alsa_seq_state_0_.PortStart(
605 0, 0, "0:0", MidiManagerAlsa::AlsaSeqState::PortDirection::kInput, true);
agoodeb09423b2015-05-11 11:39:57 -0700606 EXPECT_EQ(0,
607 CountPorts(*alsa_seq_state_0_.ToMidiPortState(alsa_cards_).get()));
agoode99d63292015-04-13 08:39:25 -0700608
609 // Close client again. This does nothing.
610 alsa_seq_state_0_.ClientExit(0);
agoodeb09423b2015-05-11 11:39:57 -0700611 EXPECT_EQ(0,
612 CountPorts(*alsa_seq_state_0_.ToMidiPortState(alsa_cards_).get()));
agoode99d63292015-04-13 08:39:25 -0700613
614 // Add duplex port. This will add 2 ports when converted.
615 alsa_seq_state_0_.ClientStart(0, "0", SND_SEQ_KERNEL_CLIENT);
616 alsa_seq_state_0_.PortStart(
617 0, 0, "0:0", MidiManagerAlsa::AlsaSeqState::PortDirection::kDuplex, true);
agoodeb09423b2015-05-11 11:39:57 -0700618 EXPECT_EQ(2,
619 CountPorts(*alsa_seq_state_0_.ToMidiPortState(alsa_cards_).get()));
agoode99d63292015-04-13 08:39:25 -0700620
621 // Add an output port. Now we are at 3.
622 alsa_seq_state_0_.PortStart(
623 0, 1, "0:1", MidiManagerAlsa::AlsaSeqState::PortDirection::kOutput, true);
agoodeb09423b2015-05-11 11:39:57 -0700624 EXPECT_EQ(3,
625 CountPorts(*alsa_seq_state_0_.ToMidiPortState(alsa_cards_).get()));
agoode99d63292015-04-13 08:39:25 -0700626
627 // Add another client. Still at 3.
628 alsa_seq_state_0_.ClientStart(1, "1", SND_SEQ_KERNEL_CLIENT);
agoodeb09423b2015-05-11 11:39:57 -0700629 EXPECT_EQ(3,
630 CountPorts(*alsa_seq_state_0_.ToMidiPortState(alsa_cards_).get()));
agoode99d63292015-04-13 08:39:25 -0700631
632 // Add a port. Now at 4.
633 alsa_seq_state_0_.PortStart(
634 1, 0, "1:0", MidiManagerAlsa::AlsaSeqState::PortDirection::kInput, true);
agoodeb09423b2015-05-11 11:39:57 -0700635 EXPECT_EQ(4,
636 CountPorts(*alsa_seq_state_0_.ToMidiPortState(alsa_cards_).get()));
agoode99d63292015-04-13 08:39:25 -0700637
638 // Add a duplicate port. Still at 4.
639 alsa_seq_state_0_.PortStart(
640 1, 0, "1:0", MidiManagerAlsa::AlsaSeqState::PortDirection::kInput, true);
agoodeb09423b2015-05-11 11:39:57 -0700641 EXPECT_EQ(4,
642 CountPorts(*alsa_seq_state_0_.ToMidiPortState(alsa_cards_).get()));
agoode99d63292015-04-13 08:39:25 -0700643
644 // Add a duplicate client. This will close the ports from the previous client.
645 alsa_seq_state_0_.ClientStart(1, "1", SND_SEQ_KERNEL_CLIENT);
agoodeb09423b2015-05-11 11:39:57 -0700646 EXPECT_EQ(3,
647 CountPorts(*alsa_seq_state_0_.ToMidiPortState(alsa_cards_).get()));
agoode99d63292015-04-13 08:39:25 -0700648
649 // Remove a duplex port. This reduces count by 2.
650 alsa_seq_state_0_.PortExit(0, 0);
agoodeb09423b2015-05-11 11:39:57 -0700651 EXPECT_EQ(1,
652 CountPorts(*alsa_seq_state_0_.ToMidiPortState(alsa_cards_).get()));
agoode99d63292015-04-13 08:39:25 -0700653
654 // Remove a non-existent port. No change.
655 alsa_seq_state_0_.PortExit(0, 0);
agoodeb09423b2015-05-11 11:39:57 -0700656 EXPECT_EQ(1,
657 CountPorts(*alsa_seq_state_0_.ToMidiPortState(alsa_cards_).get()));
agoode99d63292015-04-13 08:39:25 -0700658
659 // Verify the last entry.
agoodeb09423b2015-05-11 11:39:57 -0700660 EXPECT_TRUE((*alsa_seq_state_0_.ToMidiPortState(alsa_cards_)->begin())
agoode99d63292015-04-13 08:39:25 -0700661 ->MatchConnected(MidiManagerAlsa::MidiPort(
agooded87fc0f2015-05-21 08:29:31 -0700662 "", MidiManagerAlsa::MidiPort::Id(), 0, 1, -1, "0", "0:1",
663 "", "", MidiManagerAlsa::MidiPort::Type::kOutput)));
agoode99d63292015-04-13 08:39:25 -0700664}
665
agoodeb09423b2015-05-11 11:39:57 -0700666// Tests card_client_count of AlsaSeqState.
667TEST_F(MidiManagerAlsaTest, CardClientCount) {
668 EXPECT_EQ(0, alsa_seq_state_0_.card_client_count());
669
670 // Add a kernel client.
671 alsa_seq_state_0_.ClientStart(16, "16", SND_SEQ_KERNEL_CLIENT);
672 EXPECT_EQ(1, alsa_seq_state_0_.card_client_count());
673
674 // Add a duplicate kernel client.
675 alsa_seq_state_0_.ClientStart(16, "16", SND_SEQ_KERNEL_CLIENT);
676 EXPECT_EQ(1, alsa_seq_state_0_.card_client_count());
677
678 // Add a duplicate user client.
679 alsa_seq_state_0_.ClientStart(16, "16", SND_SEQ_USER_CLIENT);
680 EXPECT_EQ(0, alsa_seq_state_0_.card_client_count());
681
682 // Add 2 more kernel clients.
683 alsa_seq_state_0_.ClientStart(17, "17", SND_SEQ_KERNEL_CLIENT);
684 alsa_seq_state_0_.ClientStart(18, "18", SND_SEQ_KERNEL_CLIENT);
685 EXPECT_EQ(2, alsa_seq_state_0_.card_client_count());
686
687 // Add another user client.
688 alsa_seq_state_0_.ClientStart(101, "101", SND_SEQ_USER_CLIENT);
689 EXPECT_EQ(2, alsa_seq_state_0_.card_client_count());
690
691 // Remove kernel client.
692 alsa_seq_state_0_.ClientExit(17);
693 EXPECT_EQ(1, alsa_seq_state_0_.card_client_count());
694
695 // Remove user client.
696 alsa_seq_state_0_.ClientExit(16);
697 EXPECT_EQ(1, alsa_seq_state_0_.card_client_count());
698
699 // Remove kernel client.
700 alsa_seq_state_0_.ClientExit(18);
701 EXPECT_EQ(0, alsa_seq_state_0_.card_client_count());
702
703 // Add a duplicate kernel client.
704 alsa_seq_state_0_.ClientStart(101, "101", SND_SEQ_KERNEL_CLIENT);
705 EXPECT_EQ(1, alsa_seq_state_0_.card_client_count());
706
707 // Add a low kernel client.
708 alsa_seq_state_0_.ClientStart(1, "1", SND_SEQ_KERNEL_CLIENT);
709 EXPECT_EQ(1, alsa_seq_state_0_.card_client_count());
710
711 // Remove low kernel client.
712 alsa_seq_state_0_.ClientExit(1);
713 EXPECT_EQ(1, alsa_seq_state_0_.card_client_count());
714}
715
716TEST_F(MidiManagerAlsaTest, AlsaCards) {
717 // TODO(agoode): test add/remove of alsa cards.
718}
719
agoode99d63292015-04-13 08:39:25 -0700720// TODO(agoode): Test old -> new state event generation, using mocks.
721
toyoshime147c5e2015-05-07 21:58:31 -0700722} // namespace midi