• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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