1 // Copyright (c) 2012 The Chromium OS 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 <stdio.h>
6 #include <gtest/gtest.h>
7 #include <unistd.h>
8
9 extern "C" {
10 #include "audio_thread.h"
11 #include "cras_messages.h"
12 #include "cras_rclient.h"
13 #include "cras_rstream.h"
14 #include "cras_system_state.h"
15
16 // Access to data structures and static functions.
17 #include "cras_rclient.c"
18 }
19
20 // Stub data.
21 static int cras_rstream_create_return;
22 static struct cras_rstream *cras_rstream_create_stream_out;
23 static int cras_iodev_attach_stream_retval;
24 static size_t cras_system_set_volume_value;
25 static int cras_system_set_volume_called;
26 static size_t cras_system_set_capture_gain_value;
27 static int cras_system_set_capture_gain_called;
28 static size_t cras_system_set_mute_value;
29 static int cras_system_set_mute_called;
30 static size_t cras_system_set_user_mute_value;
31 static int cras_system_set_user_mute_called;
32 static size_t cras_system_set_mute_locked_value;
33 static int cras_system_set_mute_locked_called;
34 static size_t cras_system_set_capture_mute_value;
35 static int cras_system_set_capture_mute_called;
36 static size_t cras_system_set_capture_mute_locked_value;
37 static int cras_system_set_capture_mute_locked_called;
38 static size_t cras_make_fd_nonblocking_called;
39 static audio_thread* iodev_get_thread_return;
40 static int stream_list_add_stream_return;
41 static unsigned int stream_list_add_stream_called;
42 static unsigned int stream_list_disconnect_stream_called;
43 static unsigned int cras_iodev_list_rm_input_called;
44 static unsigned int cras_iodev_list_rm_output_called;
45 static struct cras_rstream dummy_rstream;
46 static size_t cras_observer_num_ops_registered;
47 static size_t cras_observer_register_notify_called;
48 static size_t cras_observer_add_called;
49 static void *cras_observer_add_context_value;
50 static struct cras_observer_client *cras_observer_add_return_value;
51 static size_t cras_observer_get_ops_called;
52 static struct cras_observer_ops cras_observer_ops_value;
53 static size_t cras_observer_set_ops_called;
54 static size_t cras_observer_ops_are_empty_called;
55 static struct cras_observer_ops cras_observer_ops_are_empty_empty_ops;
56 static size_t cras_observer_remove_called;
57
ResetStubData()58 void ResetStubData() {
59 cras_rstream_create_return = 0;
60 cras_rstream_create_stream_out = (struct cras_rstream *)NULL;
61 cras_iodev_attach_stream_retval = 0;
62 cras_system_set_volume_value = 0;
63 cras_system_set_volume_called = 0;
64 cras_system_set_capture_gain_value = 0;
65 cras_system_set_capture_gain_called = 0;
66 cras_system_set_mute_value = 0;
67 cras_system_set_mute_called = 0;
68 cras_system_set_user_mute_value = 0;
69 cras_system_set_user_mute_called = 0;
70 cras_system_set_mute_locked_value = 0;
71 cras_system_set_mute_locked_called = 0;
72 cras_system_set_capture_mute_value = 0;
73 cras_system_set_capture_mute_called = 0;
74 cras_system_set_capture_mute_locked_value = 0;
75 cras_system_set_capture_mute_locked_called = 0;
76 cras_make_fd_nonblocking_called = 0;
77 iodev_get_thread_return = reinterpret_cast<audio_thread*>(0xad);
78 stream_list_add_stream_return = 0;
79 stream_list_add_stream_called = 0;
80 stream_list_disconnect_stream_called = 0;
81 cras_iodev_list_rm_output_called = 0;
82 cras_iodev_list_rm_input_called = 0;
83 cras_observer_num_ops_registered = 0;
84 cras_observer_register_notify_called = 0;
85 cras_observer_add_called = 0;
86 cras_observer_add_return_value =
87 reinterpret_cast<struct cras_observer_client *>(1);
88 cras_observer_add_context_value = NULL;
89 cras_observer_get_ops_called = 0;
90 memset(&cras_observer_ops_value, 0, sizeof(cras_observer_ops_value));
91 cras_observer_set_ops_called = 0;
92 cras_observer_ops_are_empty_called = 0;
93 memset(&cras_observer_ops_are_empty_empty_ops, 0,
94 sizeof(cras_observer_ops_are_empty_empty_ops));
95 cras_observer_remove_called = 0;
96 }
97
98 namespace {
99
TEST(RClientSuite,CreateSendMessage)100 TEST(RClientSuite, CreateSendMessage) {
101 struct cras_rclient *rclient;
102 int rc;
103 struct cras_client_connected msg;
104 int pipe_fds[2];
105
106 ResetStubData();
107
108 rc = pipe(pipe_fds);
109 ASSERT_EQ(0, rc);
110
111 rclient = cras_rclient_create(pipe_fds[1], 800);
112 ASSERT_NE((void *)NULL, rclient);
113
114 rc = read(pipe_fds[0], &msg, sizeof(msg));
115 EXPECT_EQ(sizeof(msg), rc);
116 EXPECT_EQ(CRAS_CLIENT_CONNECTED, msg.header.id);
117
118 cras_rclient_destroy(rclient);
119 close(pipe_fds[0]);
120 close(pipe_fds[1]);
121 }
122
123 class RClientMessagesSuite : public testing::Test {
124 protected:
SetUp()125 virtual void SetUp() {
126 int rc;
127 struct cras_client_connected msg;
128
129 rc = pipe(pipe_fds_);
130 if (rc < 0)
131 return;
132 rclient_ = cras_rclient_create(pipe_fds_[1], 800);
133 rc = read(pipe_fds_[0], &msg, sizeof(msg));
134 if (rc < 0)
135 return;
136
137 rstream_ = (struct cras_rstream *)calloc(1, sizeof(*rstream_));
138
139 stream_id_ = 0x10002;
140 connect_msg_.header.id = CRAS_SERVER_CONNECT_STREAM;
141 connect_msg_.header.length = sizeof(connect_msg_);
142 connect_msg_.stream_type = CRAS_STREAM_TYPE_DEFAULT;
143 connect_msg_.direction = CRAS_STREAM_OUTPUT;
144 connect_msg_.stream_id = stream_id_;
145 connect_msg_.buffer_frames = 480;
146 connect_msg_.cb_threshold = 240;
147 connect_msg_.flags = 0;
148 connect_msg_.format.num_channels = 2;
149 connect_msg_.format.frame_rate = 48000;
150 connect_msg_.format.format = SND_PCM_FORMAT_S16_LE;
151 connect_msg_.dev_idx = NO_DEVICE;
152
153 ResetStubData();
154 }
155
TearDown()156 virtual void TearDown() {
157 cras_rclient_destroy(rclient_);
158 free(rstream_);
159 close(pipe_fds_[0]);
160 close(pipe_fds_[1]);
161 }
162
163 void RegisterNotification(enum CRAS_CLIENT_MESSAGE_ID msg_id,
164 void *callback, void **ops_address);
165
166 struct cras_connect_message connect_msg_;
167 struct cras_rclient *rclient_;
168 struct cras_rstream *rstream_;
169 size_t stream_id_;
170 int pipe_fds_[2];
171 };
172
TEST_F(RClientMessagesSuite,AudThreadAttachFail)173 TEST_F(RClientMessagesSuite, AudThreadAttachFail) {
174 struct cras_client_stream_connected out_msg;
175 int rc;
176
177 cras_rstream_create_stream_out = rstream_;
178 stream_list_add_stream_return = -EINVAL;
179
180 rc = cras_rclient_message_from_client(rclient_, &connect_msg_.header, 100);
181 EXPECT_EQ(0, rc);
182
183 rc = read(pipe_fds_[0], &out_msg, sizeof(out_msg));
184 EXPECT_EQ(sizeof(out_msg), rc);
185 EXPECT_EQ(stream_id_, out_msg.stream_id);
186 EXPECT_NE(0, out_msg.err);
187 EXPECT_EQ(0, cras_iodev_list_rm_output_called);
188 EXPECT_EQ(1, stream_list_add_stream_called);
189 EXPECT_EQ(0, stream_list_disconnect_stream_called);
190 }
191
TEST_F(RClientMessagesSuite,ConnectMsgWithBadFd)192 TEST_F(RClientMessagesSuite, ConnectMsgWithBadFd) {
193 struct cras_client_stream_connected out_msg;
194 int rc;
195
196 rc = cras_rclient_message_from_client(rclient_, &connect_msg_.header, -1);
197 EXPECT_EQ(0, rc);
198
199 rc = read(pipe_fds_[0], &out_msg, sizeof(out_msg));
200 EXPECT_EQ(sizeof(out_msg), rc);
201 EXPECT_EQ(stream_id_, out_msg.stream_id);
202 EXPECT_NE(0, out_msg.err);
203 EXPECT_EQ(stream_list_add_stream_called,
204 stream_list_disconnect_stream_called);
205 }
206
TEST_F(RClientMessagesSuite,SuccessReply)207 TEST_F(RClientMessagesSuite, SuccessReply) {
208 struct cras_client_stream_connected out_msg;
209 int rc;
210
211 cras_rstream_create_stream_out = rstream_;
212 cras_iodev_attach_stream_retval = 0;
213
214 rc = cras_rclient_message_from_client(rclient_, &connect_msg_.header, 100);
215 EXPECT_EQ(0, rc);
216 EXPECT_EQ(1, cras_make_fd_nonblocking_called);
217
218 rc = read(pipe_fds_[0], &out_msg, sizeof(out_msg));
219 EXPECT_EQ(sizeof(out_msg), rc);
220 EXPECT_EQ(stream_id_, out_msg.stream_id);
221 EXPECT_EQ(0, out_msg.err);
222 EXPECT_EQ(1, stream_list_add_stream_called);
223 EXPECT_EQ(0, stream_list_disconnect_stream_called);
224 }
225
TEST_F(RClientMessagesSuite,SuccessCreateThreadReply)226 TEST_F(RClientMessagesSuite, SuccessCreateThreadReply) {
227 struct cras_client_stream_connected out_msg;
228 int rc;
229
230 cras_rstream_create_stream_out = rstream_;
231 cras_iodev_attach_stream_retval = 0;
232
233 rc = cras_rclient_message_from_client(rclient_, &connect_msg_.header, 100);
234 EXPECT_EQ(0, rc);
235 EXPECT_EQ(1, cras_make_fd_nonblocking_called);
236
237 rc = read(pipe_fds_[0], &out_msg, sizeof(out_msg));
238 EXPECT_EQ(sizeof(out_msg), rc);
239 EXPECT_EQ(stream_id_, out_msg.stream_id);
240 EXPECT_EQ(0, out_msg.err);
241 EXPECT_EQ(1, stream_list_add_stream_called);
242 EXPECT_EQ(0, stream_list_disconnect_stream_called);
243 }
244
TEST_F(RClientMessagesSuite,SetVolume)245 TEST_F(RClientMessagesSuite, SetVolume) {
246 struct cras_set_system_volume msg;
247 int rc;
248
249 msg.header.id = CRAS_SERVER_SET_SYSTEM_VOLUME;
250 msg.header.length = sizeof(msg);
251 msg.volume = 66;
252
253 rc = cras_rclient_message_from_client(rclient_, &msg.header, -1);
254 EXPECT_EQ(0, rc);
255 EXPECT_EQ(1, cras_system_set_volume_called);
256 EXPECT_EQ(66, cras_system_set_volume_value);
257 }
258
TEST_F(RClientMessagesSuite,SetCaptureVolume)259 TEST_F(RClientMessagesSuite, SetCaptureVolume) {
260 struct cras_set_system_volume msg;
261 int rc;
262
263 msg.header.id = CRAS_SERVER_SET_SYSTEM_CAPTURE_GAIN;
264 msg.header.length = sizeof(msg);
265 msg.volume = 66;
266
267 rc = cras_rclient_message_from_client(rclient_, &msg.header, -1);
268 EXPECT_EQ(0, rc);
269 EXPECT_EQ(1, cras_system_set_capture_gain_called);
270 EXPECT_EQ(66, cras_system_set_capture_gain_value);
271 }
272
TEST_F(RClientMessagesSuite,SetMute)273 TEST_F(RClientMessagesSuite, SetMute) {
274 struct cras_set_system_mute msg;
275 int rc;
276
277 msg.header.id = CRAS_SERVER_SET_SYSTEM_MUTE;
278 msg.header.length = sizeof(msg);
279 msg.mute = 1;
280
281 rc = cras_rclient_message_from_client(rclient_, &msg.header, -1);
282 EXPECT_EQ(0, rc);
283 EXPECT_EQ(1, cras_system_set_mute_called);
284 EXPECT_EQ(1, cras_system_set_mute_value);
285
286 msg.header.id = CRAS_SERVER_SET_SYSTEM_MUTE_LOCKED;
287 rc = cras_rclient_message_from_client(rclient_, &msg.header, -1);
288 EXPECT_EQ(0, rc);
289 EXPECT_EQ(1, cras_system_set_mute_locked_called);
290 EXPECT_EQ(1, cras_system_set_mute_locked_value);
291 }
292
TEST_F(RClientMessagesSuite,SetUserMute)293 TEST_F(RClientMessagesSuite, SetUserMute) {
294 struct cras_set_system_mute msg;
295 int rc;
296
297 msg.header.id = CRAS_SERVER_SET_USER_MUTE;
298 msg.header.length = sizeof(msg);
299 msg.mute = 1;
300
301 rc = cras_rclient_message_from_client(rclient_, &msg.header, -1);
302 EXPECT_EQ(0, rc);
303 EXPECT_EQ(1, cras_system_set_user_mute_called);
304 EXPECT_EQ(1, cras_system_set_user_mute_value);
305 }
306
TEST_F(RClientMessagesSuite,SetCaptureMute)307 TEST_F(RClientMessagesSuite, SetCaptureMute) {
308 struct cras_set_system_mute msg;
309 int rc;
310
311 msg.header.id = CRAS_SERVER_SET_SYSTEM_CAPTURE_MUTE;
312 msg.header.length = sizeof(msg);
313 msg.mute = 1;
314
315 rc = cras_rclient_message_from_client(rclient_, &msg.header, -1);
316 EXPECT_EQ(0, rc);
317 EXPECT_EQ(1, cras_system_set_capture_mute_called);
318 EXPECT_EQ(1, cras_system_set_capture_mute_value);
319
320 msg.header.id = CRAS_SERVER_SET_SYSTEM_CAPTURE_MUTE_LOCKED;
321 rc = cras_rclient_message_from_client(rclient_, &msg.header, -1);
322 EXPECT_EQ(0, rc);
323 EXPECT_EQ(1, cras_system_set_capture_mute_locked_called);
324 EXPECT_EQ(1, cras_system_set_capture_mute_locked_value);
325 }
326
RegisterNotification(enum CRAS_CLIENT_MESSAGE_ID msg_id,void * callback,void ** ops_address)327 void RClientMessagesSuite::RegisterNotification(
328 enum CRAS_CLIENT_MESSAGE_ID msg_id,
329 void *callback, void **ops_address) {
330 struct cras_register_notification msg;
331 int do_register = callback != NULL ? 1 : 0;
332 int rc;
333
334 cras_observer_register_notify_called++;
335
336 cras_fill_register_notification_message(&msg, msg_id, do_register);
337 EXPECT_EQ(msg.header.length, sizeof(msg));
338 EXPECT_EQ(msg.header.id, CRAS_SERVER_REGISTER_NOTIFICATION);
339 EXPECT_EQ(msg.do_register, do_register);
340 EXPECT_EQ(msg.msg_id, msg_id);
341
342 rc = cras_rclient_message_from_client(rclient_, &msg.header, -1);
343 EXPECT_EQ(0, rc);
344 EXPECT_EQ(cras_observer_register_notify_called, cras_observer_get_ops_called);
345 EXPECT_EQ(cras_observer_register_notify_called,\
346 cras_observer_ops_are_empty_called);
347 if (msg.do_register)
348 cras_observer_num_ops_registered++;
349 if (cras_observer_num_ops_registered == 1) {
350 if (msg.do_register) {
351 EXPECT_EQ(1, cras_observer_add_called);
352 EXPECT_EQ(rclient_, cras_observer_add_context_value);
353 EXPECT_EQ(rclient_->observer, cras_observer_add_return_value);
354 } else {
355 EXPECT_EQ(1, cras_observer_remove_called);
356 EXPECT_EQ(rclient_->observer, (struct cras_observer_client *)NULL);
357 }
358 } else {
359 EXPECT_EQ(cras_observer_register_notify_called - 1,\
360 cras_observer_set_ops_called);
361 }
362 if (!msg.do_register)
363 cras_observer_num_ops_registered--;
364 if (cras_observer_num_ops_registered)
365 EXPECT_EQ(callback, *ops_address);
366 }
367
TEST_F(RClientMessagesSuite,RegisterStatusNotification)368 TEST_F(RClientMessagesSuite, RegisterStatusNotification) {
369 /* First registration for this client. */
370 RegisterNotification(
371 CRAS_CLIENT_OUTPUT_VOLUME_CHANGED,
372 (void *)send_output_volume_changed,
373 (void **)&cras_observer_ops_value.output_volume_changed);
374
375 /* Second registration for this client. */
376 RegisterNotification(
377 CRAS_CLIENT_CAPTURE_GAIN_CHANGED,
378 (void *)send_capture_gain_changed,
379 (void **)&cras_observer_ops_value.capture_gain_changed);
380
381 /* Deregister output_volume. */
382 RegisterNotification(
383 CRAS_CLIENT_OUTPUT_VOLUME_CHANGED, NULL,
384 (void **)&cras_observer_ops_value.output_volume_changed);
385
386 /* Register/deregister all msg_ids. */
387
388 RegisterNotification(
389 CRAS_CLIENT_OUTPUT_MUTE_CHANGED,
390 (void *)send_output_mute_changed,
391 (void **)&cras_observer_ops_value.output_mute_changed);
392 RegisterNotification(
393 CRAS_CLIENT_OUTPUT_MUTE_CHANGED, NULL,
394 (void **)&cras_observer_ops_value.output_mute_changed);
395
396 RegisterNotification(
397 CRAS_CLIENT_CAPTURE_MUTE_CHANGED,
398 (void *)send_capture_mute_changed,
399 (void **)&cras_observer_ops_value.capture_mute_changed);
400 RegisterNotification(
401 CRAS_CLIENT_CAPTURE_MUTE_CHANGED, NULL,
402 (void **)&cras_observer_ops_value.capture_mute_changed);
403
404 RegisterNotification(
405 CRAS_CLIENT_NODES_CHANGED,
406 (void *)send_nodes_changed,
407 (void **)&cras_observer_ops_value.nodes_changed);
408 RegisterNotification(
409 CRAS_CLIENT_NODES_CHANGED, NULL,
410 (void **)&cras_observer_ops_value.nodes_changed);
411
412 RegisterNotification(
413 CRAS_CLIENT_ACTIVE_NODE_CHANGED,
414 (void *)send_active_node_changed,
415 (void **)&cras_observer_ops_value.active_node_changed);
416 RegisterNotification(
417 CRAS_CLIENT_ACTIVE_NODE_CHANGED, NULL,
418 (void **)&cras_observer_ops_value.active_node_changed);
419
420 RegisterNotification(
421 CRAS_CLIENT_OUTPUT_NODE_VOLUME_CHANGED,
422 (void *)send_output_node_volume_changed,
423 (void **)&cras_observer_ops_value.output_node_volume_changed);
424 RegisterNotification(
425 CRAS_CLIENT_OUTPUT_NODE_VOLUME_CHANGED, NULL,
426 (void **)&cras_observer_ops_value.output_node_volume_changed);
427
428 RegisterNotification(
429 CRAS_CLIENT_NODE_LEFT_RIGHT_SWAPPED_CHANGED,
430 (void *)send_node_left_right_swapped_changed,
431 (void **)&cras_observer_ops_value.node_left_right_swapped_changed);
432 RegisterNotification(
433 CRAS_CLIENT_NODE_LEFT_RIGHT_SWAPPED_CHANGED, NULL,
434 (void **)&cras_observer_ops_value.node_left_right_swapped_changed);
435
436 RegisterNotification(
437 CRAS_CLIENT_INPUT_NODE_GAIN_CHANGED,
438 (void *)send_input_node_gain_changed,
439 (void **)&cras_observer_ops_value.input_node_gain_changed);
440 RegisterNotification(
441 CRAS_CLIENT_INPUT_NODE_GAIN_CHANGED, NULL,
442 (void **)&cras_observer_ops_value.input_node_gain_changed);
443
444 RegisterNotification(
445 CRAS_CLIENT_NUM_ACTIVE_STREAMS_CHANGED,
446 (void *)send_num_active_streams_changed,
447 (void **)&cras_observer_ops_value.num_active_streams_changed);
448 RegisterNotification(
449 CRAS_CLIENT_NUM_ACTIVE_STREAMS_CHANGED, NULL,
450 (void **)&cras_observer_ops_value.num_active_streams_changed);
451
452 /* Deregister last. */
453 RegisterNotification(
454 CRAS_CLIENT_CAPTURE_GAIN_CHANGED, NULL,
455 (void **)&cras_observer_ops_value.capture_gain_changed);
456 }
457
TEST_F(RClientMessagesSuite,SendOutputVolumeChanged)458 TEST_F(RClientMessagesSuite, SendOutputVolumeChanged) {
459 void *void_client = reinterpret_cast<void *>(rclient_);
460 char buf[1024];
461 ssize_t rc;
462 struct cras_client_volume_changed *msg =
463 (struct cras_client_volume_changed *)buf;
464 const int32_t volume = 90;
465
466 send_output_volume_changed(void_client, volume);
467 rc = read(pipe_fds_[0], buf, sizeof(buf));
468 ASSERT_EQ(rc, (ssize_t)sizeof(*msg));
469 EXPECT_EQ(msg->header.id, CRAS_CLIENT_OUTPUT_VOLUME_CHANGED);
470 EXPECT_EQ(msg->volume, volume);
471 }
472
TEST_F(RClientMessagesSuite,SendOutputMuteChanged)473 TEST_F(RClientMessagesSuite, SendOutputMuteChanged) {
474 void *void_client = reinterpret_cast<void *>(rclient_);
475 char buf[1024];
476 ssize_t rc;
477 struct cras_client_mute_changed *msg =
478 (struct cras_client_mute_changed *)buf;
479 const int muted = 1;
480 const int user_muted = 0;
481 const int mute_locked = 1;
482
483 send_output_mute_changed(void_client, muted, user_muted, mute_locked);
484 rc = read(pipe_fds_[0], buf, sizeof(buf));
485 ASSERT_EQ(rc, (ssize_t)sizeof(*msg));
486 EXPECT_EQ(msg->header.id, CRAS_CLIENT_OUTPUT_MUTE_CHANGED);
487 EXPECT_EQ(msg->muted, muted);
488 EXPECT_EQ(msg->user_muted, user_muted);
489 EXPECT_EQ(msg->mute_locked, mute_locked);
490 }
491
TEST_F(RClientMessagesSuite,SendCaptureGainChanged)492 TEST_F(RClientMessagesSuite, SendCaptureGainChanged) {
493 void *void_client = reinterpret_cast<void *>(rclient_);
494 char buf[1024];
495 ssize_t rc;
496 struct cras_client_volume_changed *msg =
497 (struct cras_client_volume_changed *)buf;
498 const int32_t gain = 90;
499
500 send_capture_gain_changed(void_client, gain);
501 rc = read(pipe_fds_[0], buf, sizeof(buf));
502 ASSERT_EQ(rc, (ssize_t)sizeof(*msg));
503 EXPECT_EQ(msg->header.id, CRAS_CLIENT_CAPTURE_GAIN_CHANGED);
504 EXPECT_EQ(msg->volume, gain);
505 }
506
TEST_F(RClientMessagesSuite,SendCaptureMuteChanged)507 TEST_F(RClientMessagesSuite, SendCaptureMuteChanged) {
508 void *void_client = reinterpret_cast<void *>(rclient_);
509 char buf[1024];
510 ssize_t rc;
511 struct cras_client_mute_changed *msg =
512 (struct cras_client_mute_changed *)buf;
513 const int muted = 1;
514 const int mute_locked = 0;
515
516 send_capture_mute_changed(void_client, muted, mute_locked);
517 rc = read(pipe_fds_[0], buf, sizeof(buf));
518 ASSERT_EQ(rc, (ssize_t)sizeof(*msg));
519 EXPECT_EQ(msg->header.id, CRAS_CLIENT_CAPTURE_MUTE_CHANGED);
520 EXPECT_EQ(msg->muted, muted);
521 EXPECT_EQ(msg->mute_locked, mute_locked);
522 }
523
TEST_F(RClientMessagesSuite,SendNodesChanged)524 TEST_F(RClientMessagesSuite, SendNodesChanged) {
525 void *void_client = reinterpret_cast<void *>(rclient_);
526 char buf[1024];
527 ssize_t rc;
528 struct cras_client_nodes_changed *msg =
529 (struct cras_client_nodes_changed *)buf;
530
531 send_nodes_changed(void_client);
532 rc = read(pipe_fds_[0], buf, sizeof(buf));
533 ASSERT_EQ(rc, (ssize_t)sizeof(*msg));
534 EXPECT_EQ(msg->header.id, CRAS_CLIENT_NODES_CHANGED);
535 }
536
TEST_F(RClientMessagesSuite,SendActiveNodeChanged)537 TEST_F(RClientMessagesSuite, SendActiveNodeChanged) {
538 void *void_client = reinterpret_cast<void *>(rclient_);
539 char buf[1024];
540 ssize_t rc;
541 struct cras_client_active_node_changed *msg =
542 (struct cras_client_active_node_changed *)buf;
543 const enum CRAS_STREAM_DIRECTION dir = CRAS_STREAM_INPUT;
544 const cras_node_id_t node_id = 0x0001000200030004;
545
546 send_active_node_changed(void_client, dir, node_id);
547 rc = read(pipe_fds_[0], buf, sizeof(buf));
548 ASSERT_EQ(rc, (ssize_t)sizeof(*msg));
549 EXPECT_EQ(msg->header.id, CRAS_CLIENT_ACTIVE_NODE_CHANGED);
550 EXPECT_EQ(msg->direction, (int32_t)dir);
551 EXPECT_EQ(msg->node_id, node_id);
552 }
553
TEST_F(RClientMessagesSuite,SendOutputNodeVolumeChanged)554 TEST_F(RClientMessagesSuite, SendOutputNodeVolumeChanged) {
555 void *void_client = reinterpret_cast<void *>(rclient_);
556 char buf[1024];
557 ssize_t rc;
558 struct cras_client_node_value_changed *msg =
559 (struct cras_client_node_value_changed *)buf;
560 const cras_node_id_t node_id = 0x0001000200030004;
561 const int32_t value = 90;
562
563 send_output_node_volume_changed(void_client, node_id, value);
564 rc = read(pipe_fds_[0], buf, sizeof(buf));
565 ASSERT_EQ(rc, (ssize_t)sizeof(*msg));
566 EXPECT_EQ(msg->header.id, CRAS_CLIENT_OUTPUT_NODE_VOLUME_CHANGED);
567 EXPECT_EQ(msg->node_id, node_id);
568 EXPECT_EQ(msg->value, value);
569 }
570
TEST_F(RClientMessagesSuite,SendNodeLeftRightSwappedChanged)571 TEST_F(RClientMessagesSuite, SendNodeLeftRightSwappedChanged) {
572 void *void_client = reinterpret_cast<void *>(rclient_);
573 char buf[1024];
574 ssize_t rc;
575 struct cras_client_node_value_changed *msg =
576 (struct cras_client_node_value_changed *)buf;
577 const cras_node_id_t node_id = 0x0001000200030004;
578 const int32_t value = 0;
579
580 send_node_left_right_swapped_changed(void_client, node_id, value);
581 rc = read(pipe_fds_[0], buf, sizeof(buf));
582 ASSERT_EQ(rc, (ssize_t)sizeof(*msg));
583 EXPECT_EQ(msg->header.id, CRAS_CLIENT_NODE_LEFT_RIGHT_SWAPPED_CHANGED);
584 EXPECT_EQ(msg->node_id, node_id);
585 EXPECT_EQ(msg->value, value);
586 }
587
TEST_F(RClientMessagesSuite,SendNodeInputNodeGainChanged)588 TEST_F(RClientMessagesSuite, SendNodeInputNodeGainChanged) {
589 void *void_client = reinterpret_cast<void *>(rclient_);
590 char buf[1024];
591 ssize_t rc;
592 struct cras_client_node_value_changed *msg =
593 (struct cras_client_node_value_changed *)buf;
594 const cras_node_id_t node_id = 0x0001000200030004;
595 const int32_t value = -19;
596
597 send_input_node_gain_changed(void_client, node_id, value);
598 rc = read(pipe_fds_[0], buf, sizeof(buf));
599 ASSERT_EQ(rc, (ssize_t)sizeof(*msg));
600 EXPECT_EQ(msg->header.id, CRAS_CLIENT_INPUT_NODE_GAIN_CHANGED);
601 EXPECT_EQ(msg->node_id, node_id);
602 EXPECT_EQ(msg->value, value);
603 }
604
TEST_F(RClientMessagesSuite,SendNumActiveStreamsChanged)605 TEST_F(RClientMessagesSuite, SendNumActiveStreamsChanged) {
606 void *void_client = reinterpret_cast<void *>(rclient_);
607 char buf[1024];
608 ssize_t rc;
609 struct cras_client_num_active_streams_changed *msg =
610 (struct cras_client_num_active_streams_changed *)buf;
611 const enum CRAS_STREAM_DIRECTION dir = CRAS_STREAM_INPUT;
612 const uint32_t num_active_streams = 3;
613
614 send_num_active_streams_changed(void_client, dir, num_active_streams);
615 rc = read(pipe_fds_[0], buf, sizeof(buf));
616 ASSERT_EQ(rc, (ssize_t)sizeof(*msg));
617 EXPECT_EQ(msg->header.id, CRAS_CLIENT_NUM_ACTIVE_STREAMS_CHANGED);
618 EXPECT_EQ(msg->direction, (int32_t)dir);
619 EXPECT_EQ(msg->num_active_streams, num_active_streams);
620 }
621
622 } // namespace
623
main(int argc,char ** argv)624 int main(int argc, char **argv) {
625 ::testing::InitGoogleTest(&argc, argv);
626 return RUN_ALL_TESTS();
627 }
628
629 /* stubs */
630 extern "C" {
631
cras_iodev_list_get_audio_thread()632 struct audio_thread* cras_iodev_list_get_audio_thread() {
633 return iodev_get_thread_return;
634 }
635
cras_iodev_list_add_active_node(enum CRAS_STREAM_DIRECTION dir,cras_node_id_t node_id)636 void cras_iodev_list_add_active_node(enum CRAS_STREAM_DIRECTION dir,
637 cras_node_id_t node_id)
638 {
639 }
640
cras_iodev_list_rm_active_node(enum CRAS_STREAM_DIRECTION dir,cras_node_id_t node_id)641 void cras_iodev_list_rm_active_node(enum CRAS_STREAM_DIRECTION dir,
642 cras_node_id_t node_id)
643 {
644 }
645
audio_thread_rm_stream(audio_thread * thread,cras_rstream * stream)646 int audio_thread_rm_stream(audio_thread* thread,
647 cras_rstream* stream) {
648 return 0;
649 }
650
audio_thread_add_output_dev(struct audio_thread * thread,struct cras_iodev * odev)651 void audio_thread_add_output_dev(struct audio_thread *thread,
652 struct cras_iodev *odev)
653 {
654 }
655
audio_thread_dump_thread_info(struct audio_thread * thread,struct audio_debug_info * info)656 int audio_thread_dump_thread_info(struct audio_thread *thread,
657 struct audio_debug_info *info)
658 {
659 return 0;
660 }
661
audio_thread_suspend(struct audio_thread * thread)662 int audio_thread_suspend(struct audio_thread *thread)
663 {
664 return 0;
665 }
666
audio_thread_resume(struct audio_thread * thread)667 int audio_thread_resume(struct audio_thread *thread)
668 {
669 return 0;
670 }
671
audio_thread_config_global_remix(struct audio_thread * thread,unsigned int num_channels,const float * coefficient)672 int audio_thread_config_global_remix(struct audio_thread *thread,
673 unsigned int num_channels,
674 const float *coefficient)
675 {
676 return 0;
677 }
678
cras_config_get_socket_file_dir()679 const char *cras_config_get_socket_file_dir()
680 {
681 return CRAS_UT_TMPDIR;
682 }
683
cras_rstream_create(struct cras_rstream_config * stream_config,struct cras_rstream ** stream_out)684 int cras_rstream_create(struct cras_rstream_config *stream_config,
685 struct cras_rstream **stream_out)
686 {
687 *stream_out = cras_rstream_create_stream_out;
688 return cras_rstream_create_return;
689 }
690
cras_iodev_move_stream_type(uint32_t type,uint32_t index)691 int cras_iodev_move_stream_type(uint32_t type, uint32_t index)
692 {
693 return 0;
694 }
695
cras_iodev_list_rm_output(struct cras_iodev * output)696 int cras_iodev_list_rm_output(struct cras_iodev *output) {
697 cras_iodev_list_rm_output_called++;
698 return 0;
699 }
700
cras_iodev_list_rm_input(struct cras_iodev * input)701 int cras_iodev_list_rm_input(struct cras_iodev *input) {
702 cras_iodev_list_rm_input_called++;
703 return 0;
704 }
705
cras_server_disconnect_from_client_socket(int socket_fd)706 int cras_server_disconnect_from_client_socket(int socket_fd) {
707 return 0;
708 }
709
cras_make_fd_nonblocking(int fd)710 int cras_make_fd_nonblocking(int fd)
711 {
712 cras_make_fd_nonblocking_called++;
713 return 0;
714 }
715
cras_system_set_volume(size_t volume)716 void cras_system_set_volume(size_t volume)
717 {
718 cras_system_set_volume_value = volume;
719 cras_system_set_volume_called++;
720 }
721
cras_system_set_capture_gain(long gain)722 void cras_system_set_capture_gain(long gain)
723 {
724 cras_system_set_capture_gain_value = gain;
725 cras_system_set_capture_gain_called++;
726 }
727
728 // From system_state.
cras_system_set_mute(int mute)729 void cras_system_set_mute(int mute)
730 {
731 cras_system_set_mute_value = mute;
732 cras_system_set_mute_called++;
733 }
cras_system_set_user_mute(int mute)734 void cras_system_set_user_mute(int mute)
735 {
736 cras_system_set_user_mute_value = mute;
737 cras_system_set_user_mute_called++;
738 }
cras_system_set_mute_locked(int mute)739 void cras_system_set_mute_locked(int mute)
740 {
741 cras_system_set_mute_locked_value = mute;
742 cras_system_set_mute_locked_called++;
743 }
cras_system_set_capture_mute(int mute)744 void cras_system_set_capture_mute(int mute)
745 {
746 cras_system_set_capture_mute_value = mute;
747 cras_system_set_capture_mute_called++;
748 }
cras_system_set_capture_mute_locked(int mute)749 void cras_system_set_capture_mute_locked(int mute)
750 {
751 cras_system_set_capture_mute_locked_value = mute;
752 cras_system_set_capture_mute_locked_called++;
753 }
754
cras_system_remove_alsa_card(size_t alsa_card_index)755 int cras_system_remove_alsa_card(size_t alsa_card_index)
756 {
757 return -1;
758 }
759
cras_system_set_suspended(int suspended)760 void cras_system_set_suspended(int suspended) {
761 }
762
cras_system_state_get_no_lock()763 struct cras_server_state *cras_system_state_get_no_lock()
764 {
765 return NULL;
766 }
767
cras_sys_state_shm_fd()768 key_t cras_sys_state_shm_fd()
769 {
770 return 1;
771 }
772
cras_dsp_reload_ini()773 void cras_dsp_reload_ini()
774 {
775 }
776
cras_dsp_dump_info()777 void cras_dsp_dump_info()
778 {
779 }
780
cras_iodev_list_set_node_attr(cras_node_id_t id,enum ionode_attr attr,int value)781 int cras_iodev_list_set_node_attr(cras_node_id_t id,
782 enum ionode_attr attr, int value)
783 {
784 return 0;
785 }
786
cras_iodev_list_select_node(enum CRAS_STREAM_DIRECTION direction,cras_node_id_t node_id)787 void cras_iodev_list_select_node(enum CRAS_STREAM_DIRECTION direction,
788 cras_node_id_t node_id)
789 {
790 }
791
cras_iodev_list_add_test_dev(enum TEST_IODEV_TYPE type)792 void cras_iodev_list_add_test_dev(enum TEST_IODEV_TYPE type) {
793 }
794
cras_iodev_list_get_stream_list()795 struct stream_list *cras_iodev_list_get_stream_list()
796 {
797 return NULL;
798 }
799
800 /* Handles sending a command to a test iodev. */
cras_iodev_list_test_dev_command(unsigned int iodev_idx,enum CRAS_TEST_IODEV_CMD command,unsigned int data_len,const uint8_t * data)801 void cras_iodev_list_test_dev_command(unsigned int iodev_idx,
802 enum CRAS_TEST_IODEV_CMD command,
803 unsigned int data_len,
804 const uint8_t *data) {
805 }
806
cras_iodev_list_configure_global_remix_converter(unsigned int num_channels,const float * coefficient)807 void cras_iodev_list_configure_global_remix_converter(
808 unsigned int num_channels,
809 const float *coefficient)
810 {
811 }
812
stream_list_add(struct stream_list * list,struct cras_rstream_config * config,struct cras_rstream ** stream)813 int stream_list_add(struct stream_list *list,
814 struct cras_rstream_config *config,
815 struct cras_rstream **stream)
816 {
817 int ret;
818
819 *stream = &dummy_rstream;
820
821 stream_list_add_stream_called++;
822 ret = stream_list_add_stream_return;
823 if (ret)
824 stream_list_add_stream_return = -EINVAL;
825
826 dummy_rstream.direction = config->direction;
827 dummy_rstream.stream_id = config->stream_id;
828
829 return ret;
830 }
831
stream_list_rm(struct stream_list * list,cras_stream_id_t id)832 int stream_list_rm(struct stream_list *list, cras_stream_id_t id)
833 {
834 stream_list_disconnect_stream_called++;
835 return 0;
836 }
837
stream_list_rm_all_client_streams(struct stream_list * list,struct cras_rclient * rclient)838 int stream_list_rm_all_client_streams(struct stream_list *list,
839 struct cras_rclient *rclient)
840 {
841 return 0;
842 }
843
cras_send_with_fds(int sockfd,const void * buf,size_t len,int * fd,unsigned int num_fds)844 int cras_send_with_fds(int sockfd, const void *buf, size_t len, int *fd,
845 unsigned int num_fds)
846 {
847 return write(sockfd, buf, len);
848 }
849
cras_iodev_list_get_hotword_models(cras_node_id_t node_id)850 char *cras_iodev_list_get_hotword_models(cras_node_id_t node_id)
851 {
852 return NULL;
853 }
854
cras_iodev_list_set_hotword_model(cras_node_id_t id,const char * model_name)855 int cras_iodev_list_set_hotword_model(cras_node_id_t id,
856 const char *model_name)
857 {
858 return 0;
859 }
860
cras_observer_add(const struct cras_observer_ops * ops,void * context)861 struct cras_observer_client *cras_observer_add(
862 const struct cras_observer_ops *ops,
863 void *context)
864 {
865 cras_observer_add_called++;
866 cras_observer_add_context_value = context;
867 memcpy(&cras_observer_ops_value, ops, sizeof(cras_observer_ops_value));
868 return cras_observer_add_return_value;
869 }
870
cras_observer_get_ops(const struct cras_observer_client * client,struct cras_observer_ops * ops)871 void cras_observer_get_ops(const struct cras_observer_client *client,
872 struct cras_observer_ops *ops)
873 {
874 cras_observer_get_ops_called++;
875 memcpy(ops, &cras_observer_ops_value, sizeof(*ops));
876 }
877
cras_observer_set_ops(struct cras_observer_client * client,const struct cras_observer_ops * ops)878 void cras_observer_set_ops(struct cras_observer_client *client,
879 const struct cras_observer_ops *ops)
880 {
881 cras_observer_set_ops_called++;
882 memcpy(&cras_observer_ops_value, ops, sizeof(cras_observer_ops_value));
883 }
884
cras_observer_ops_are_empty(const struct cras_observer_ops * ops)885 int cras_observer_ops_are_empty(const struct cras_observer_ops *ops)
886 {
887 cras_observer_ops_are_empty_called++;
888 return memcmp(&cras_observer_ops_are_empty_empty_ops, ops,
889 sizeof(cras_observer_ops_are_empty_empty_ops)) == 0;
890 }
891
cras_observer_remove(struct cras_observer_client * client)892 void cras_observer_remove(struct cras_observer_client *client)
893 {
894 cras_observer_remove_called++;
895 }
896
897 } // extern "C"
898