Home | History | Annotate | Download | only in tests
      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 <gtest/gtest.h>
      6 #include <iniparser.h>
      7 #include <map>
      8 #include <stdio.h>
      9 #include <syslog.h>
     10 #include <sys/param.h>
     11 
     12 extern "C" {
     13 #include "cras_alsa_card.h"
     14 #include "cras_alsa_io.h"
     15 #include "cras_alsa_mixer.h"
     16 #include "cras_alsa_ucm.h"
     17 #include "cras_iodev.h"
     18 #include "cras_types.h"
     19 #include "cras_util.h"
     20 #include "utlist.h"
     21 }
     22 
     23 namespace {
     24 
     25 static size_t cras_alsa_mixer_create_called;
     26 static struct cras_alsa_mixer *cras_alsa_mixer_create_return;
     27 static size_t cras_alsa_mixer_destroy_called;
     28 static size_t cras_alsa_iodev_create_called;
     29 static struct cras_iodev **cras_alsa_iodev_create_return;
     30 static struct cras_iodev fake_dev1, fake_dev2, fake_dev3, fake_dev4;
     31 static struct cras_iodev *cras_alsa_iodev_create_default_return[] = {
     32   &fake_dev1,
     33   &fake_dev2,
     34   &fake_dev3,
     35   &fake_dev4,
     36 };
     37 static size_t cras_alsa_iodev_create_return_size;
     38 static size_t cras_alsa_iodev_legacy_complete_init_called;
     39 static size_t cras_alsa_iodev_ucm_add_nodes_and_jacks_called;
     40 static size_t cras_alsa_iodev_ucm_complete_init_called;
     41 static size_t cras_alsa_iodev_destroy_called;
     42 static struct cras_iodev *cras_alsa_iodev_destroy_arg;
     43 static size_t cras_alsa_iodev_index_called;
     44 static std::map<struct cras_iodev *, unsigned int> cras_alsa_iodev_index_return;
     45 static int alsa_iodev_has_hctl_jacks_return;
     46 static size_t snd_ctl_open_called;
     47 static size_t snd_ctl_open_return;
     48 static size_t snd_ctl_close_called;
     49 static size_t snd_ctl_close_return;
     50 static size_t snd_ctl_pcm_next_device_called;
     51 static bool snd_ctl_pcm_next_device_return_error;
     52 static int *snd_ctl_pcm_next_device_set_devs;
     53 static size_t snd_ctl_pcm_next_device_set_devs_size;
     54 static size_t snd_ctl_pcm_next_device_set_devs_index;
     55 static size_t snd_ctl_pcm_info_called;
     56 static int *snd_ctl_pcm_info_rets;
     57 static size_t snd_ctl_pcm_info_rets_size;
     58 static size_t snd_ctl_pcm_info_rets_index;
     59 static size_t snd_ctl_card_info_called;
     60 static int snd_ctl_card_info_ret;
     61 static size_t snd_hctl_open_called;
     62 static int snd_hctl_open_return_value;
     63 static int snd_hctl_close_called;
     64 static size_t snd_hctl_nonblock_called;
     65 static snd_hctl_t *snd_hctl_open_pointer_val;
     66 static size_t snd_hctl_load_called;
     67 static int snd_hctl_load_return_value;
     68 static struct pollfd *snd_hctl_poll_descriptors_fds;
     69 static size_t snd_hctl_poll_descriptors_num_fds;
     70 static size_t snd_hctl_poll_descriptors_called;
     71 static size_t cras_system_add_select_fd_called;
     72 static std::vector<int> cras_system_add_select_fd_values;
     73 static size_t cras_system_rm_select_fd_called;
     74 static std::vector<int> cras_system_rm_select_fd_values;
     75 static size_t snd_hctl_handle_events_called;
     76 static size_t iniparser_freedict_called;
     77 static size_t iniparser_load_called;
     78 static struct cras_device_blacklist *fake_blacklist;
     79 static int cras_device_blacklist_check_retval;
     80 static unsigned ucm_create_called;
     81 static unsigned ucm_destroy_called;
     82 static size_t ucm_get_dev_for_mixer_called;
     83 static size_t ucm_get_flag_called;
     84 static char ucm_get_flag_name[64];
     85 static char* device_config_dir;
     86 static const char* cras_card_config_dir;
     87 static struct mixer_name *ucm_get_coupled_mixer_names_return_value;
     88 static struct mixer_name *coupled_output_names_value;
     89 static int ucm_has_fully_specified_ucm_flag_return_value;
     90 static int ucm_get_sections_called;
     91 static struct ucm_section *ucm_get_sections_return_value;
     92 static size_t cras_alsa_mixer_add_controls_in_section_called;
     93 static int cras_alsa_mixer_add_controls_in_section_return_value;
     94 static int ucm_get_echo_reference_dev_name_for_dev_called;
     95 static const char *ucm_get_echo_reference_dev_name_for_dev_return_value[4];
     96 
     97 static void ResetStubData() {
     98   cras_alsa_mixer_create_called = 0;
     99   cras_alsa_mixer_create_return = reinterpret_cast<struct cras_alsa_mixer *>(1);
    100   cras_alsa_mixer_destroy_called = 0;
    101   cras_alsa_iodev_destroy_arg = NULL;
    102   cras_alsa_iodev_create_called = 0;
    103   cras_alsa_iodev_create_return = cras_alsa_iodev_create_default_return;
    104   cras_alsa_iodev_create_return_size =
    105       ARRAY_SIZE(cras_alsa_iodev_create_default_return);
    106   cras_alsa_iodev_legacy_complete_init_called = 0;
    107   cras_alsa_iodev_ucm_add_nodes_and_jacks_called = 0;
    108   cras_alsa_iodev_ucm_complete_init_called = 0;
    109   cras_alsa_iodev_destroy_called = 0;
    110   cras_alsa_iodev_index_called = 0;
    111   cras_alsa_iodev_index_return.clear();
    112   alsa_iodev_has_hctl_jacks_return = 1;
    113   snd_ctl_open_called = 0;
    114   snd_ctl_open_return = 0;
    115   snd_ctl_close_called = 0;
    116   snd_ctl_close_return = 0;
    117   snd_ctl_pcm_next_device_called = 0;
    118   snd_ctl_pcm_next_device_return_error = false;
    119   snd_ctl_pcm_next_device_set_devs_size = 0;
    120   snd_ctl_pcm_next_device_set_devs_index = 0;
    121   snd_ctl_pcm_info_called = 0;
    122   snd_ctl_pcm_info_rets_size = 0;
    123   snd_ctl_pcm_info_rets_index = 0;
    124   snd_ctl_card_info_called = 0;
    125   snd_ctl_card_info_ret = 0;
    126   snd_hctl_open_called = 0;
    127   snd_hctl_open_return_value = 0;
    128   snd_hctl_open_pointer_val = reinterpret_cast<snd_hctl_t *>(0x4323);
    129   snd_hctl_load_called = 0;
    130   snd_hctl_load_return_value = 0;
    131   snd_hctl_close_called = 0;
    132   snd_hctl_nonblock_called = 0;
    133   snd_hctl_poll_descriptors_num_fds = 0;
    134   snd_hctl_poll_descriptors_called = 0;
    135   snd_hctl_handle_events_called = 0;
    136   snd_hctl_poll_descriptors_num_fds = 0;
    137   snd_hctl_poll_descriptors_called = 0;
    138   cras_system_add_select_fd_called = 0;
    139   cras_system_add_select_fd_values.clear();
    140   cras_system_rm_select_fd_called = 0;
    141   cras_system_rm_select_fd_values.clear();
    142   iniparser_freedict_called = 0;
    143   iniparser_load_called = 0;
    144   fake_blacklist = reinterpret_cast<struct cras_device_blacklist *>(3);
    145   cras_device_blacklist_check_retval = 0;
    146   ucm_create_called = 0;
    147   ucm_destroy_called = 0;
    148   ucm_get_dev_for_mixer_called = 0;
    149   ucm_get_flag_called = 0;
    150   memset(ucm_get_flag_name, 0, sizeof(ucm_get_flag_name));
    151   device_config_dir = reinterpret_cast<char *>(3);
    152   cras_card_config_dir = NULL;
    153   ucm_get_coupled_mixer_names_return_value = NULL;
    154   mixer_name_free(coupled_output_names_value);
    155   coupled_output_names_value = NULL;
    156   ucm_has_fully_specified_ucm_flag_return_value = 0;
    157   ucm_get_sections_called = 0;
    158   ucm_get_sections_return_value = NULL;
    159   cras_alsa_mixer_add_controls_in_section_called = 0;
    160   cras_alsa_mixer_add_controls_in_section_return_value = 0;
    161   ucm_get_echo_reference_dev_name_for_dev_called = 0;
    162 }
    163 
    164 TEST(AlsaCard, CreateFailInvalidCard) {
    165   struct cras_alsa_card *c;
    166   cras_alsa_card_info card_info;
    167 
    168   ResetStubData();
    169   card_info.card_type = ALSA_CARD_TYPE_INTERNAL;
    170   card_info.card_index = 55;
    171   c = cras_alsa_card_create(&card_info, device_config_dir,
    172                             fake_blacklist, NULL);
    173   EXPECT_EQ(static_cast<struct cras_alsa_card *>(NULL), c);
    174   EXPECT_EQ(snd_ctl_close_called, snd_ctl_open_called);
    175   EXPECT_EQ(cras_alsa_mixer_create_called, cras_alsa_mixer_destroy_called);
    176 }
    177 
    178 TEST(AlsaCard, CreateFailMixerInit) {
    179   struct cras_alsa_card *c;
    180   cras_alsa_card_info card_info;
    181 
    182   ResetStubData();
    183   card_info.card_type = ALSA_CARD_TYPE_INTERNAL;
    184   card_info.card_index = 0;
    185   cras_alsa_mixer_create_return = static_cast<struct cras_alsa_mixer *>(NULL);
    186   c = cras_alsa_card_create(&card_info, device_config_dir,
    187                             fake_blacklist, NULL);
    188   EXPECT_EQ(static_cast<struct cras_alsa_card *>(NULL), c);
    189   EXPECT_EQ(snd_ctl_close_called, snd_ctl_open_called);
    190   EXPECT_EQ(1, cras_alsa_mixer_create_called);
    191   EXPECT_EQ(0, cras_alsa_mixer_destroy_called);
    192 }
    193 
    194 TEST(AlsaCard, CreateFailCtlOpen) {
    195   struct cras_alsa_card *c;
    196   cras_alsa_card_info card_info;
    197 
    198   ResetStubData();
    199   card_info.card_type = ALSA_CARD_TYPE_INTERNAL;
    200   card_info.card_index = 0;
    201   snd_ctl_open_return = -1;
    202   c = cras_alsa_card_create(&card_info, device_config_dir,
    203                             fake_blacklist, NULL);
    204   EXPECT_EQ(static_cast<struct cras_alsa_card *>(NULL), c);
    205   EXPECT_EQ(1, snd_ctl_open_called);
    206   EXPECT_EQ(0, snd_ctl_close_called);
    207   EXPECT_EQ(iniparser_load_called, iniparser_freedict_called);
    208   EXPECT_EQ(0, cras_alsa_mixer_create_called);
    209 }
    210 
    211 TEST(AlsaCard, CreateFailHctlOpen) {
    212   struct cras_alsa_card *c;
    213   cras_alsa_card_info card_info;
    214 
    215   ResetStubData();
    216   card_info.card_type = ALSA_CARD_TYPE_INTERNAL;
    217   card_info.card_index = 0;
    218   snd_hctl_open_pointer_val = NULL;
    219   snd_hctl_open_return_value = -1;
    220 
    221   c = cras_alsa_card_create(&card_info, device_config_dir,
    222                             fake_blacklist, NULL);
    223   EXPECT_NE(static_cast<struct cras_alsa_card *>(NULL), c);
    224   EXPECT_EQ(1, snd_ctl_open_called);
    225   EXPECT_EQ(1, snd_ctl_close_called);
    226   EXPECT_EQ(iniparser_load_called, iniparser_freedict_called);
    227   EXPECT_EQ(1, snd_hctl_open_called);
    228   EXPECT_EQ(0, snd_hctl_nonblock_called);
    229   EXPECT_EQ(0, snd_hctl_load_called);
    230   EXPECT_EQ(1, cras_alsa_mixer_create_called);
    231   cras_alsa_card_destroy(c);
    232 }
    233 
    234 TEST(AlsaCard, CreateFailHctlLoad) {
    235   struct cras_alsa_card *c;
    236   cras_alsa_card_info card_info;
    237 
    238   ResetStubData();
    239   card_info.card_type = ALSA_CARD_TYPE_INTERNAL;
    240   card_info.card_index = 0;
    241   snd_hctl_load_return_value = -1;
    242 
    243   c = cras_alsa_card_create(&card_info, device_config_dir,
    244                             fake_blacklist, NULL);
    245   EXPECT_EQ(static_cast<struct cras_alsa_card *>(NULL), c);
    246   EXPECT_EQ(1, snd_ctl_open_called);
    247   EXPECT_EQ(1, snd_ctl_close_called);
    248   EXPECT_EQ(iniparser_load_called, iniparser_freedict_called);
    249   EXPECT_EQ(1, snd_hctl_open_called);
    250   EXPECT_EQ(1, snd_hctl_nonblock_called);
    251   EXPECT_EQ(1, snd_hctl_load_called);
    252   EXPECT_EQ(0, cras_alsa_mixer_create_called);
    253 }
    254 
    255 TEST(AlsaCard, AddSelectForHctlNoDevices) {
    256   struct pollfd poll_fds[] = {
    257     {3, 0, 0},
    258   };
    259 
    260   struct cras_alsa_card *c;
    261   cras_alsa_card_info card_info;
    262 
    263   ResetStubData();
    264   card_info.card_type = ALSA_CARD_TYPE_INTERNAL;
    265   card_info.card_index = 0;
    266   snd_hctl_poll_descriptors_fds = poll_fds;
    267   snd_hctl_poll_descriptors_num_fds = ARRAY_SIZE(poll_fds);
    268 
    269   c = cras_alsa_card_create(&card_info, device_config_dir,
    270                             fake_blacklist, NULL);
    271   EXPECT_NE(static_cast<struct cras_alsa_card *>(NULL), c);
    272   EXPECT_EQ(1, snd_ctl_open_called);
    273   EXPECT_EQ(1, snd_ctl_close_called);
    274   EXPECT_EQ(iniparser_load_called, iniparser_freedict_called);
    275   EXPECT_EQ(1, snd_hctl_open_called);
    276   EXPECT_EQ(1, snd_hctl_nonblock_called);
    277   EXPECT_EQ(1, snd_hctl_load_called);
    278   EXPECT_EQ(1, cras_alsa_mixer_create_called);
    279   EXPECT_EQ(0, cras_system_add_select_fd_called);
    280   cras_alsa_card_destroy(c);
    281   EXPECT_EQ(0, cras_system_rm_select_fd_called);
    282 }
    283 
    284 TEST(AlsaCard, AddSelectForHctlWithDevices) {
    285   struct pollfd poll_fds[] = {
    286     {3, 0, 0},
    287   };
    288   int dev_nums[] = {0};
    289   int info_rets[] = {0, -1};
    290 
    291   struct cras_alsa_card *c;
    292   cras_alsa_card_info card_info;
    293 
    294   ResetStubData();
    295   snd_ctl_pcm_next_device_set_devs_size = ARRAY_SIZE(dev_nums);
    296   snd_ctl_pcm_next_device_set_devs = dev_nums;
    297   snd_ctl_pcm_info_rets_size = ARRAY_SIZE(info_rets);
    298   snd_ctl_pcm_info_rets = info_rets;
    299   card_info.card_type = ALSA_CARD_TYPE_INTERNAL;
    300   card_info.card_index = 0;
    301   snd_hctl_poll_descriptors_fds = poll_fds;
    302   snd_hctl_poll_descriptors_num_fds = ARRAY_SIZE(poll_fds);
    303 
    304   c = cras_alsa_card_create(&card_info, device_config_dir,
    305                             fake_blacklist, NULL);
    306   EXPECT_NE(static_cast<struct cras_alsa_card *>(NULL), c);
    307   EXPECT_EQ(snd_ctl_close_called, snd_ctl_open_called);
    308   EXPECT_EQ(2, snd_ctl_pcm_next_device_called);
    309   EXPECT_EQ(1, cras_alsa_iodev_create_called);
    310   EXPECT_EQ(0, cras_alsa_iodev_index_called);
    311   EXPECT_EQ(1, snd_ctl_card_info_called);
    312   EXPECT_EQ(1, ucm_create_called);
    313   EXPECT_EQ(1, ucm_get_dev_for_mixer_called);
    314   EXPECT_EQ(1, ucm_get_flag_called);
    315   EXPECT_EQ(0, strcmp(ucm_get_flag_name, "ExtraMainVolume"));
    316   EXPECT_EQ(cras_card_config_dir, device_config_dir);
    317   EXPECT_EQ(iniparser_load_called, iniparser_freedict_called);
    318   EXPECT_EQ(1, snd_hctl_open_called);
    319   EXPECT_EQ(1, snd_hctl_nonblock_called);
    320   EXPECT_EQ(1, snd_hctl_load_called);
    321   EXPECT_EQ(1, cras_alsa_mixer_create_called);
    322   ASSERT_EQ(1, cras_system_add_select_fd_called);
    323   EXPECT_EQ(3, cras_system_add_select_fd_values[0]);
    324   cras_alsa_card_destroy(c);
    325   EXPECT_EQ(ARRAY_SIZE(poll_fds), cras_system_rm_select_fd_called);
    326 }
    327 
    328 TEST(AlsaCard, CreateFailCtlCardInfo) {
    329   struct cras_alsa_card *c;
    330   cras_alsa_card_info card_info;
    331 
    332   ResetStubData();
    333   card_info.card_type = ALSA_CARD_TYPE_INTERNAL;
    334   card_info.card_index = 0;
    335   snd_ctl_card_info_ret = -1;
    336   c = cras_alsa_card_create(&card_info, device_config_dir,
    337                             fake_blacklist, NULL);
    338   EXPECT_EQ(static_cast<struct cras_alsa_card *>(NULL), c);
    339   EXPECT_EQ(1, snd_ctl_open_called);
    340   EXPECT_EQ(1, snd_ctl_close_called);
    341   EXPECT_EQ(cras_alsa_mixer_create_called, cras_alsa_mixer_destroy_called);
    342   EXPECT_EQ(iniparser_load_called, iniparser_freedict_called);
    343 }
    344 
    345 TEST(AlsaCard, CreateNoDevices) {
    346   struct cras_alsa_card *c;
    347   cras_alsa_card_info card_info;
    348 
    349   ResetStubData();
    350   card_info.card_type = ALSA_CARD_TYPE_INTERNAL;
    351   card_info.card_index = 1;
    352   c = cras_alsa_card_create(&card_info, device_config_dir,
    353                             fake_blacklist, NULL);
    354   EXPECT_NE(static_cast<struct cras_alsa_card *>(NULL), c);
    355   EXPECT_EQ(snd_ctl_close_called, snd_ctl_open_called);
    356   EXPECT_EQ(1, snd_ctl_pcm_next_device_called);
    357   EXPECT_EQ(0, cras_alsa_iodev_create_called);
    358   EXPECT_EQ(0, cras_alsa_iodev_legacy_complete_init_called);
    359   EXPECT_EQ(1, cras_alsa_card_get_index(c));
    360   EXPECT_EQ(0, ucm_get_sections_called);
    361   EXPECT_EQ(0, cras_alsa_mixer_add_controls_in_section_called);
    362 
    363   cras_alsa_card_destroy(c);
    364   EXPECT_EQ(0, cras_alsa_iodev_destroy_called);
    365   EXPECT_EQ(cras_alsa_mixer_create_called, cras_alsa_mixer_destroy_called);
    366   EXPECT_EQ(iniparser_load_called, iniparser_freedict_called);
    367 }
    368 
    369 TEST(AlsaCard, CreateOneOutputNextDevError) {
    370   struct cras_alsa_card *c;
    371   cras_alsa_card_info card_info;
    372 
    373   ResetStubData();
    374   snd_ctl_pcm_next_device_return_error = true;
    375   card_info.card_type = ALSA_CARD_TYPE_USB;
    376   card_info.card_index = 0;
    377   c = cras_alsa_card_create(&card_info, device_config_dir,
    378                             fake_blacklist, NULL);
    379   EXPECT_EQ(static_cast<struct cras_alsa_card *>(NULL), c);
    380   EXPECT_EQ(cras_alsa_mixer_create_called, cras_alsa_mixer_destroy_called);
    381   EXPECT_EQ(snd_ctl_open_called, snd_ctl_close_called);
    382   EXPECT_EQ(iniparser_load_called, iniparser_freedict_called);
    383 }
    384 
    385 TEST(AlsaCard, CreateOneOutput) {
    386   struct cras_alsa_card *c;
    387   int dev_nums[] = {0};
    388   int info_rets[] = {0, -1};
    389   cras_alsa_card_info card_info;
    390 
    391   ResetStubData();
    392   snd_ctl_pcm_next_device_set_devs_size = ARRAY_SIZE(dev_nums);
    393   snd_ctl_pcm_next_device_set_devs = dev_nums;
    394   snd_ctl_pcm_info_rets_size = ARRAY_SIZE(info_rets);
    395   snd_ctl_pcm_info_rets = info_rets;
    396   card_info.card_type = ALSA_CARD_TYPE_USB;
    397   card_info.card_index = 0;
    398   c = cras_alsa_card_create(&card_info, device_config_dir,
    399                             fake_blacklist, NULL);
    400   EXPECT_NE(static_cast<struct cras_alsa_card *>(NULL), c);
    401   EXPECT_EQ(snd_ctl_close_called, snd_ctl_open_called);
    402   EXPECT_EQ(2, snd_ctl_pcm_next_device_called);
    403   EXPECT_EQ(1, cras_alsa_iodev_create_called);
    404   EXPECT_EQ(1, cras_alsa_iodev_legacy_complete_init_called);
    405   EXPECT_EQ(0, cras_alsa_iodev_index_called);
    406   EXPECT_EQ(1, snd_ctl_card_info_called);
    407   EXPECT_EQ(1, ucm_create_called);
    408   EXPECT_EQ(1, ucm_get_dev_for_mixer_called);
    409   EXPECT_EQ(1, ucm_get_flag_called);
    410   EXPECT_EQ(0, strcmp(ucm_get_flag_name, "ExtraMainVolume"));
    411   EXPECT_EQ(cras_card_config_dir, device_config_dir);
    412   EXPECT_EQ(0, ucm_get_sections_called);
    413   EXPECT_EQ(0, cras_alsa_mixer_add_controls_in_section_called);
    414 
    415   cras_alsa_card_destroy(c);
    416   EXPECT_EQ(1, ucm_destroy_called);
    417   EXPECT_EQ(1, cras_alsa_iodev_destroy_called);
    418   EXPECT_EQ(cras_alsa_iodev_create_return[0], cras_alsa_iodev_destroy_arg);
    419   EXPECT_EQ(cras_alsa_mixer_create_called, cras_alsa_mixer_destroy_called);
    420   EXPECT_EQ(iniparser_load_called, iniparser_freedict_called);
    421 }
    422 
    423 TEST(AlsaCard, CreateOneOutputBlacklisted) {
    424   struct cras_alsa_card *c;
    425   int dev_nums[] = {0};
    426   int info_rets[] = {0, -1};
    427   cras_alsa_card_info card_info;
    428 
    429   ResetStubData();
    430   snd_ctl_pcm_next_device_set_devs_size = ARRAY_SIZE(dev_nums);
    431   snd_ctl_pcm_next_device_set_devs = dev_nums;
    432   snd_ctl_pcm_info_rets_size = ARRAY_SIZE(info_rets);
    433   snd_ctl_pcm_info_rets = info_rets;
    434   alsa_iodev_has_hctl_jacks_return = 0;
    435   cras_device_blacklist_check_retval = 1;
    436   card_info.card_type = ALSA_CARD_TYPE_USB;
    437   card_info.card_index = 0;
    438   c = cras_alsa_card_create(&card_info, device_config_dir,
    439                             fake_blacklist, NULL);
    440   EXPECT_NE(static_cast<struct cras_alsa_card *>(NULL), c);
    441   EXPECT_EQ(snd_ctl_close_called, snd_ctl_open_called);
    442   EXPECT_EQ(2, snd_ctl_pcm_next_device_called);
    443   EXPECT_EQ(1, snd_ctl_card_info_called);
    444   EXPECT_EQ(0, cras_alsa_iodev_create_called);
    445   EXPECT_EQ(0, cras_alsa_iodev_legacy_complete_init_called);
    446   EXPECT_EQ(cras_card_config_dir, device_config_dir);
    447 
    448   cras_alsa_card_destroy(c);
    449   EXPECT_EQ(0, cras_alsa_iodev_destroy_called);
    450   EXPECT_EQ(NULL, cras_alsa_iodev_destroy_arg);
    451   EXPECT_EQ(cras_alsa_mixer_create_called, cras_alsa_mixer_destroy_called);
    452   EXPECT_EQ(iniparser_load_called, iniparser_freedict_called);
    453 }
    454 
    455 TEST(AlsaCard, CreateTwoOutputs) {
    456   struct cras_alsa_card *c;
    457   int dev_nums[] = {0, 3};
    458   int info_rets[] = {0, -1, 0};
    459   cras_alsa_card_info card_info;
    460 
    461   ResetStubData();
    462   snd_ctl_pcm_next_device_set_devs_size = ARRAY_SIZE(dev_nums);
    463   snd_ctl_pcm_next_device_set_devs = dev_nums;
    464   snd_ctl_pcm_info_rets_size = ARRAY_SIZE(info_rets);
    465   snd_ctl_pcm_info_rets = info_rets;
    466   card_info.card_type = ALSA_CARD_TYPE_INTERNAL;
    467   card_info.card_index = 0;
    468   c = cras_alsa_card_create(&card_info, device_config_dir,
    469                             fake_blacklist, NULL);
    470   EXPECT_NE(static_cast<struct cras_alsa_card *>(NULL), c);
    471   EXPECT_EQ(snd_ctl_close_called, snd_ctl_open_called);
    472   EXPECT_EQ(3, snd_ctl_pcm_next_device_called);
    473   EXPECT_EQ(2, cras_alsa_iodev_create_called);
    474   EXPECT_EQ(2, cras_alsa_iodev_legacy_complete_init_called);
    475   EXPECT_EQ(1, cras_alsa_iodev_index_called);
    476   EXPECT_EQ(1, snd_ctl_card_info_called);
    477   EXPECT_EQ(cras_card_config_dir, device_config_dir);
    478   EXPECT_EQ(0, ucm_get_sections_called);
    479   EXPECT_EQ(0, cras_alsa_mixer_add_controls_in_section_called);
    480 
    481   cras_alsa_card_destroy(c);
    482   EXPECT_EQ(2, cras_alsa_iodev_destroy_called);
    483   EXPECT_EQ(cras_alsa_iodev_create_return[1], cras_alsa_iodev_destroy_arg);
    484   EXPECT_EQ(cras_alsa_mixer_create_called, cras_alsa_mixer_destroy_called);
    485   EXPECT_EQ(iniparser_load_called, iniparser_freedict_called);
    486 }
    487 
    488 TEST(AlsaCard, CreateTwoDuplicateDeviceIndex) {
    489   struct cras_alsa_card *c;
    490   int dev_nums[] = {0, 0};
    491   int info_rets[] = {0, -1, 0};
    492   cras_alsa_card_info card_info;
    493 
    494   ResetStubData();
    495   snd_ctl_pcm_next_device_set_devs_size = ARRAY_SIZE(dev_nums);
    496   snd_ctl_pcm_next_device_set_devs = dev_nums;
    497   snd_ctl_pcm_info_rets_size = ARRAY_SIZE(info_rets);
    498   snd_ctl_pcm_info_rets = info_rets;
    499   card_info.card_type = ALSA_CARD_TYPE_INTERNAL;
    500   card_info.card_index = 0;
    501   c = cras_alsa_card_create(&card_info, device_config_dir,
    502                             fake_blacklist, NULL);
    503   EXPECT_NE(static_cast<struct cras_alsa_card *>(NULL), c);
    504   EXPECT_EQ(snd_ctl_close_called, snd_ctl_open_called);
    505   EXPECT_EQ(3, snd_ctl_pcm_next_device_called);
    506   EXPECT_EQ(1, cras_alsa_iodev_create_called);
    507   EXPECT_EQ(2, cras_alsa_iodev_legacy_complete_init_called);
    508   EXPECT_EQ(1, cras_alsa_iodev_index_called);
    509   EXPECT_EQ(1, snd_ctl_card_info_called);
    510   EXPECT_EQ(cras_card_config_dir, device_config_dir);
    511   EXPECT_EQ(0, ucm_get_sections_called);
    512   EXPECT_EQ(0, cras_alsa_mixer_add_controls_in_section_called);
    513 
    514   cras_alsa_card_destroy(c);
    515   EXPECT_EQ(1, cras_alsa_iodev_destroy_called);
    516   EXPECT_EQ(cras_alsa_iodev_create_return[0], cras_alsa_iodev_destroy_arg);
    517   EXPECT_EQ(cras_alsa_mixer_create_called, cras_alsa_mixer_destroy_called);
    518   EXPECT_EQ(iniparser_load_called, iniparser_freedict_called);
    519 }
    520 
    521 TEST(AlsaCard, CreateOneInput) {
    522   struct cras_alsa_card *c;
    523   int dev_nums[] = {0};
    524   int info_rets[] = {-1, 0};
    525   cras_alsa_card_info card_info;
    526 
    527   ResetStubData();
    528   snd_ctl_pcm_next_device_set_devs_size = ARRAY_SIZE(dev_nums);
    529   snd_ctl_pcm_next_device_set_devs = dev_nums;
    530   snd_ctl_pcm_info_rets_size = ARRAY_SIZE(info_rets);
    531   snd_ctl_pcm_info_rets = info_rets;
    532   card_info.card_type = ALSA_CARD_TYPE_INTERNAL;
    533   card_info.card_index = 0;
    534   c = cras_alsa_card_create(&card_info, device_config_dir,
    535                             fake_blacklist, NULL);
    536   EXPECT_NE(static_cast<struct cras_alsa_card *>(NULL), c);
    537   EXPECT_EQ(snd_ctl_close_called, snd_ctl_open_called);
    538   EXPECT_EQ(2, snd_ctl_pcm_next_device_called);
    539   EXPECT_EQ(1, cras_alsa_iodev_create_called);
    540   EXPECT_EQ(1, cras_alsa_iodev_legacy_complete_init_called);
    541   EXPECT_EQ(0, cras_alsa_iodev_index_called);
    542   EXPECT_EQ(cras_card_config_dir, device_config_dir);
    543   EXPECT_EQ(0, ucm_get_sections_called);
    544   EXPECT_EQ(0, cras_alsa_mixer_add_controls_in_section_called);
    545 
    546   cras_alsa_card_destroy(c);
    547   EXPECT_EQ(1, cras_alsa_iodev_destroy_called);
    548   EXPECT_EQ(cras_alsa_iodev_create_return[0], cras_alsa_iodev_destroy_arg);
    549   EXPECT_EQ(cras_alsa_mixer_create_called, cras_alsa_mixer_destroy_called);
    550   EXPECT_EQ(iniparser_load_called, iniparser_freedict_called);
    551 }
    552 
    553 TEST(AlsaCard, CreateOneInputAndOneOutput) {
    554   struct cras_alsa_card *c;
    555   int dev_nums[] = {0};
    556   int info_rets[] = {0, 0};
    557   cras_alsa_card_info card_info;
    558 
    559   ResetStubData();
    560   snd_ctl_pcm_next_device_set_devs_size = ARRAY_SIZE(dev_nums);
    561   snd_ctl_pcm_next_device_set_devs = dev_nums;
    562   snd_ctl_pcm_info_rets_size = ARRAY_SIZE(info_rets);
    563   snd_ctl_pcm_info_rets = info_rets;
    564   card_info.card_type = ALSA_CARD_TYPE_INTERNAL;
    565   card_info.card_index = 0;
    566   c = cras_alsa_card_create(&card_info, device_config_dir,
    567                             fake_blacklist, NULL);
    568   EXPECT_NE(static_cast<struct cras_alsa_card *>(NULL), c);
    569   EXPECT_EQ(snd_ctl_close_called, snd_ctl_open_called);
    570   EXPECT_EQ(2, snd_ctl_pcm_next_device_called);
    571   EXPECT_EQ(2, cras_alsa_iodev_create_called);
    572   EXPECT_EQ(2, cras_alsa_iodev_legacy_complete_init_called);
    573   EXPECT_EQ(0, cras_alsa_iodev_index_called);
    574   EXPECT_EQ(cras_card_config_dir, device_config_dir);
    575   EXPECT_EQ(0, ucm_get_sections_called);
    576   EXPECT_EQ(0, cras_alsa_mixer_add_controls_in_section_called);
    577 
    578   cras_alsa_card_destroy(c);
    579   EXPECT_EQ(2, cras_alsa_iodev_destroy_called);
    580   EXPECT_EQ(cras_alsa_iodev_create_return[1], cras_alsa_iodev_destroy_arg);
    581   EXPECT_EQ(cras_alsa_mixer_create_called, cras_alsa_mixer_destroy_called);
    582   EXPECT_EQ(iniparser_load_called, iniparser_freedict_called);
    583 }
    584 
    585 TEST(AlsaCard, CreateOneInputAndOneOutputTwoDevices) {
    586   struct cras_alsa_card *c;
    587   int dev_nums[] = {0, 3};
    588   int info_rets[] = {0, -1, -1, 0};
    589   cras_alsa_card_info card_info;
    590 
    591   ResetStubData();
    592   snd_ctl_pcm_next_device_set_devs_size = ARRAY_SIZE(dev_nums);
    593   snd_ctl_pcm_next_device_set_devs = dev_nums;
    594   snd_ctl_pcm_info_rets_size = ARRAY_SIZE(info_rets);
    595   snd_ctl_pcm_info_rets = info_rets;
    596   card_info.card_type = ALSA_CARD_TYPE_INTERNAL;
    597   card_info.card_index = 0;
    598   c = cras_alsa_card_create(&card_info, device_config_dir,
    599                             fake_blacklist, NULL);
    600   EXPECT_NE(static_cast<struct cras_alsa_card *>(NULL), c);
    601   EXPECT_EQ(snd_ctl_close_called, snd_ctl_open_called);
    602   EXPECT_EQ(3, snd_ctl_pcm_next_device_called);
    603   EXPECT_EQ(2, cras_alsa_iodev_create_called);
    604   EXPECT_EQ(2, cras_alsa_iodev_legacy_complete_init_called);
    605   EXPECT_EQ(0, cras_alsa_iodev_index_called);
    606   EXPECT_EQ(cras_card_config_dir, device_config_dir);
    607   EXPECT_EQ(0, ucm_get_sections_called);
    608   EXPECT_EQ(0, cras_alsa_mixer_add_controls_in_section_called);
    609 
    610   cras_alsa_card_destroy(c);
    611   EXPECT_EQ(2, cras_alsa_iodev_destroy_called);
    612   EXPECT_EQ(cras_alsa_iodev_create_return[1], cras_alsa_iodev_destroy_arg);
    613   EXPECT_EQ(cras_alsa_mixer_create_called, cras_alsa_mixer_destroy_called);
    614   EXPECT_EQ(iniparser_load_called, iniparser_freedict_called);
    615 }
    616 
    617 TEST(AlsaCard, CreateOneOutputWithCoupledMixers) {
    618   struct cras_alsa_card *c;
    619   int dev_nums[] = {0};
    620   int info_rets[] = {0, -1};
    621   struct mixer_name *mixer_name_1, *mixer_name_2;
    622   /* Use strdup because cras_alsa_card_create will delete it. */
    623   const char *name1 = strdup("MixerName1"), *name2 = strdup("MixerName2");
    624 
    625   cras_alsa_card_info card_info;
    626 
    627   ResetStubData();
    628   snd_ctl_pcm_next_device_set_devs_size = ARRAY_SIZE(dev_nums);
    629   snd_ctl_pcm_next_device_set_devs = dev_nums;
    630   snd_ctl_pcm_info_rets_size = ARRAY_SIZE(info_rets);
    631   snd_ctl_pcm_info_rets = info_rets;
    632   card_info.card_type = ALSA_CARD_TYPE_INTERNAL;
    633   card_info.card_index = 0;
    634 
    635   /* Creates a list of mixer names as return value of
    636    * ucm_get_coupled_mixer_names. */
    637   mixer_name_1 = (struct mixer_name*)malloc(sizeof(*mixer_name_1));
    638   mixer_name_2 = (struct mixer_name*)malloc(sizeof(*mixer_name_2));
    639   mixer_name_1->name = name1;
    640   mixer_name_2->name = name2;
    641   mixer_name_1->dir = CRAS_STREAM_OUTPUT;
    642   mixer_name_2->dir = CRAS_STREAM_OUTPUT;
    643   mixer_name_1->type = MIXER_NAME_VOLUME;
    644   mixer_name_2->type = MIXER_NAME_VOLUME;
    645 
    646   DL_APPEND(ucm_get_coupled_mixer_names_return_value, mixer_name_1);
    647   DL_APPEND(ucm_get_coupled_mixer_names_return_value, mixer_name_2);
    648 
    649   c = cras_alsa_card_create(&card_info, device_config_dir,
    650                             fake_blacklist, NULL);
    651 
    652   EXPECT_NE(static_cast<struct cras_alsa_card *>(NULL), c);
    653   EXPECT_EQ(snd_ctl_close_called, snd_ctl_open_called);
    654   EXPECT_EQ(2, snd_ctl_pcm_next_device_called);
    655   EXPECT_EQ(1, cras_alsa_iodev_create_called);
    656   EXPECT_EQ(1, cras_alsa_iodev_legacy_complete_init_called);
    657   EXPECT_EQ(0, cras_alsa_iodev_index_called);
    658   EXPECT_EQ(1, snd_ctl_card_info_called);
    659   EXPECT_EQ(1, ucm_create_called);
    660   EXPECT_EQ(1, ucm_get_dev_for_mixer_called);
    661   EXPECT_EQ(1, ucm_get_flag_called);
    662   EXPECT_EQ(0, strcmp(ucm_get_flag_name, "ExtraMainVolume"));
    663   EXPECT_EQ(cras_card_config_dir, device_config_dir);
    664   EXPECT_EQ(0, ucm_get_sections_called);
    665   EXPECT_EQ(0, cras_alsa_mixer_add_controls_in_section_called);
    666 
    667   /* Checks cras_alsa_card_create can handle the list and pass the names to
    668    * cras_alsa_mixer_create. */
    669   struct mixer_name *m_name = coupled_output_names_value;
    670   EXPECT_EQ(0, m_name ? strcmp(m_name->name, "MixerName1") : 1);
    671   if (m_name)
    672     m_name = m_name->next;
    673   EXPECT_EQ(0, m_name ? strcmp(m_name->name, "MixerName2") : 1);
    674 
    675   cras_alsa_card_destroy(c);
    676   EXPECT_EQ(1, ucm_destroy_called);
    677   EXPECT_EQ(1, cras_alsa_iodev_destroy_called);
    678   EXPECT_EQ(cras_alsa_iodev_create_return[0], cras_alsa_iodev_destroy_arg);
    679   EXPECT_EQ(cras_alsa_mixer_create_called, cras_alsa_mixer_destroy_called);
    680   EXPECT_EQ(iniparser_load_called, iniparser_freedict_called);
    681 
    682   mixer_name_free(coupled_output_names_value);
    683   coupled_output_names_value = NULL;
    684 }
    685 
    686 TEST(AlsaCard, CreateFullyUCMNoSections) {
    687   struct cras_alsa_card *c;
    688   cras_alsa_card_info card_info;
    689 
    690   ResetStubData();
    691   card_info.card_type = ALSA_CARD_TYPE_INTERNAL;
    692   card_info.card_index = 0;
    693   ucm_has_fully_specified_ucm_flag_return_value = 1;
    694   ucm_get_sections_return_value = NULL;
    695   c = cras_alsa_card_create(&card_info, device_config_dir,
    696                             fake_blacklist, NULL);
    697   EXPECT_EQ(static_cast<struct cras_alsa_card *>(NULL), c);
    698   EXPECT_EQ(snd_ctl_close_called, snd_ctl_open_called);
    699   EXPECT_EQ(0, cras_alsa_iodev_create_called);
    700   EXPECT_EQ(0, cras_alsa_iodev_ucm_complete_init_called);
    701   EXPECT_EQ(1, snd_ctl_card_info_called);
    702   EXPECT_EQ(1, ucm_get_sections_called);
    703   EXPECT_EQ(0, cras_alsa_mixer_add_controls_in_section_called);
    704 
    705   cras_alsa_card_destroy(c);
    706   EXPECT_EQ(1, ucm_destroy_called);
    707   EXPECT_EQ(0, cras_alsa_iodev_destroy_called);
    708   EXPECT_EQ(NULL, cras_alsa_iodev_destroy_arg);
    709   EXPECT_EQ(cras_alsa_mixer_create_called, cras_alsa_mixer_destroy_called);
    710   EXPECT_EQ(iniparser_load_called, iniparser_freedict_called);
    711 }
    712 
    713 struct ucm_section *GenerateUcmSections (void) {
    714   struct ucm_section *sections = NULL;
    715   struct ucm_section *section;
    716 
    717   section = ucm_section_create("Headphone", 0, CRAS_STREAM_OUTPUT,
    718                                "my-sound-card Headset Jack", "gpio");
    719   ucm_section_add_coupled(section, "HP-L", MIXER_NAME_VOLUME);
    720   ucm_section_add_coupled(section, "HP-R", MIXER_NAME_VOLUME);
    721   DL_APPEND(sections, section);
    722 
    723   section = ucm_section_create("Speaker", 0, CRAS_STREAM_OUTPUT,
    724                                NULL, NULL);
    725   ucm_section_add_coupled(section, "SPK-L", MIXER_NAME_VOLUME);
    726   ucm_section_add_coupled(section, "SPK-R", MIXER_NAME_VOLUME);
    727   DL_APPEND(sections, section);
    728 
    729   section = ucm_section_create("Internal Mic", 0, CRAS_STREAM_INPUT,
    730                                NULL, NULL);
    731   ucm_section_add_coupled(section, "INT-MIC-L", MIXER_NAME_VOLUME);
    732   ucm_section_add_coupled(section, "INT-MIC-R", MIXER_NAME_VOLUME);
    733   DL_APPEND(sections, section);
    734 
    735   section = ucm_section_create("Mic", 1, CRAS_STREAM_INPUT,
    736                                "my-sound-card Headset Jack", "gpio");
    737   ucm_section_add_coupled(section, "MIC-L", MIXER_NAME_VOLUME);
    738   ucm_section_add_coupled(section, "MIC-R", MIXER_NAME_VOLUME);
    739   DL_APPEND(sections, section);
    740 
    741   section = ucm_section_create("HDMI", 2, CRAS_STREAM_OUTPUT,
    742                                NULL, NULL);
    743   ucm_section_set_mixer_name(section, "HDMI");
    744   DL_APPEND(sections, section);
    745 
    746   return sections;
    747 }
    748 
    749 TEST(AlsaCard, CreateFullyUCMFailureOnControls) {
    750   struct cras_alsa_card *c;
    751   cras_alsa_card_info card_info;
    752 
    753   ResetStubData();
    754   card_info.card_type = ALSA_CARD_TYPE_INTERNAL;
    755   card_info.card_index = 0;
    756   ucm_has_fully_specified_ucm_flag_return_value = 1;
    757   ucm_get_sections_return_value = GenerateUcmSections();
    758   ASSERT_NE(ucm_get_sections_return_value, (struct ucm_section *)NULL);
    759 
    760   cras_alsa_mixer_add_controls_in_section_return_value = -EINVAL;
    761 
    762   c = cras_alsa_card_create(&card_info, device_config_dir,
    763                             fake_blacklist, NULL);
    764 
    765   EXPECT_EQ(static_cast<struct cras_alsa_card *>(NULL), c);
    766   EXPECT_EQ(snd_ctl_close_called, snd_ctl_open_called);
    767   EXPECT_EQ(1, snd_ctl_card_info_called);
    768   EXPECT_EQ(1, ucm_get_sections_called);
    769   EXPECT_EQ(1, cras_alsa_mixer_add_controls_in_section_called);
    770   EXPECT_EQ(0, cras_alsa_iodev_create_called);
    771   EXPECT_EQ(0, cras_alsa_iodev_ucm_complete_init_called);
    772 
    773   cras_alsa_card_destroy(c);
    774   EXPECT_EQ(1, ucm_destroy_called);
    775   EXPECT_EQ(0, cras_alsa_iodev_destroy_called);
    776   EXPECT_EQ(NULL, cras_alsa_iodev_destroy_arg);
    777   EXPECT_EQ(cras_alsa_mixer_create_called, cras_alsa_mixer_destroy_called);
    778   EXPECT_EQ(iniparser_load_called, iniparser_freedict_called);
    779 }
    780 
    781 TEST(AlsaCard, CreateFullyUCMFourDevicesFiveSections) {
    782   struct cras_alsa_card *c;
    783   cras_alsa_card_info card_info;
    784   int info_rets[] = {0, 0, 0, 0, 0, -1};
    785 
    786   ResetStubData();
    787   card_info.card_type = ALSA_CARD_TYPE_INTERNAL;
    788   card_info.card_index = 0;
    789   snd_ctl_pcm_info_rets_size = ARRAY_SIZE(info_rets);
    790   snd_ctl_pcm_info_rets = info_rets;
    791   ucm_has_fully_specified_ucm_flag_return_value = 1;
    792   ucm_get_sections_return_value = GenerateUcmSections();
    793   cras_alsa_iodev_index_return[cras_alsa_iodev_create_return[0]] = 0;
    794   cras_alsa_iodev_index_return[cras_alsa_iodev_create_return[1]] = 0;
    795   cras_alsa_iodev_index_return[cras_alsa_iodev_create_return[2]] = 1;
    796   cras_alsa_iodev_index_return[cras_alsa_iodev_create_return[3]] = 2;
    797   ASSERT_NE(ucm_get_sections_return_value, (struct ucm_section *)NULL);
    798 
    799   c = cras_alsa_card_create(&card_info, device_config_dir,
    800                             fake_blacklist, NULL);
    801 
    802   EXPECT_NE(static_cast<struct cras_alsa_card *>(NULL), c);
    803   EXPECT_EQ(snd_ctl_close_called, snd_ctl_open_called);
    804   EXPECT_EQ(1, snd_ctl_card_info_called);
    805   EXPECT_EQ(1, ucm_get_sections_called);
    806   EXPECT_EQ(5, snd_ctl_pcm_info_called);
    807   EXPECT_EQ(5, cras_alsa_mixer_add_controls_in_section_called);
    808   EXPECT_EQ(4, cras_alsa_iodev_create_called);
    809   EXPECT_EQ(5, cras_alsa_iodev_ucm_add_nodes_and_jacks_called);
    810   EXPECT_EQ(4, cras_alsa_iodev_ucm_complete_init_called);
    811 
    812   cras_alsa_card_destroy(c);
    813   EXPECT_EQ(1, ucm_destroy_called);
    814   EXPECT_EQ(4, cras_alsa_iodev_destroy_called);
    815   EXPECT_EQ(cras_alsa_iodev_create_return[3], cras_alsa_iodev_destroy_arg);
    816   EXPECT_EQ(cras_alsa_mixer_create_called, cras_alsa_mixer_destroy_called);
    817   EXPECT_EQ(iniparser_load_called, iniparser_freedict_called);
    818 }
    819 
    820 TEST(AlsaCard, GG) {
    821   struct cras_alsa_card *c;
    822   cras_alsa_card_info card_info;
    823   int info_rets[] = {0, 0, 0, 0, 0, -1};
    824   struct cras_ionode nodes[4];
    825   const char *echo_ref = "echo ref";
    826 
    827   ResetStubData();
    828   card_info.card_type = ALSA_CARD_TYPE_INTERNAL;
    829   card_info.card_index = 0;
    830   snd_ctl_pcm_info_rets_size = ARRAY_SIZE(info_rets);
    831   snd_ctl_pcm_info_rets = info_rets;
    832   ucm_has_fully_specified_ucm_flag_return_value = 1;
    833   ucm_get_sections_return_value = GenerateUcmSections();
    834 
    835   fake_dev1.nodes = nodes;
    836   fake_dev2.nodes = nodes + 1;
    837   fake_dev3.nodes = nodes + 2;
    838   fake_dev4.nodes = nodes + 3;
    839   snprintf(nodes[0].name, CRAS_NODE_NAME_BUFFER_SIZE, "dev1");
    840   snprintf(nodes[1].name, CRAS_NODE_NAME_BUFFER_SIZE, "dev2");
    841   snprintf(nodes[2].name, CRAS_NODE_NAME_BUFFER_SIZE, "dev3");
    842   snprintf(nodes[3].name, CRAS_NODE_NAME_BUFFER_SIZE, "echo ref");
    843 
    844   ucm_get_echo_reference_dev_name_for_dev_return_value[0] = strdup(echo_ref);
    845 
    846   c = cras_alsa_card_create(&card_info, device_config_dir,
    847                             fake_blacklist, NULL);
    848 
    849   EXPECT_NE(static_cast<struct cras_alsa_card *>(NULL), c);
    850   EXPECT_EQ(fake_dev1.echo_reference_dev, &fake_dev4);
    851   cras_alsa_card_destroy(c);
    852 }
    853 
    854 /* Stubs */
    855 
    856 extern "C" {
    857 struct cras_alsa_mixer *cras_alsa_mixer_create(const char *card_name) {
    858   cras_alsa_mixer_create_called++;
    859   return cras_alsa_mixer_create_return;
    860 }
    861 
    862 int cras_alsa_mixer_add_controls_by_name_matching(
    863     struct cras_alsa_mixer* cmix,
    864     struct mixer_name *extra_controls,
    865     struct mixer_name *coupled_controls) {
    866   /* Duplicate coupled_output_names to verify in the end of unittest
    867    * because names will get freed later in cras_alsa_card_create. */
    868   struct mixer_name *control;
    869   DL_FOREACH(coupled_controls, control) {
    870     coupled_output_names_value =
    871       mixer_name_add(coupled_output_names_value,
    872                      control->name,
    873                      CRAS_STREAM_OUTPUT,
    874                      control->type);
    875   }
    876   return 0;
    877 }
    878 
    879 void cras_alsa_mixer_destroy(struct cras_alsa_mixer *cras_mixer) {
    880   cras_alsa_mixer_destroy_called++;
    881 }
    882 
    883 struct cras_iodev *alsa_iodev_create(size_t card_index,
    884 				     const char *card_name,
    885 				     size_t device_index,
    886 				     const char *dev_name,
    887 				     const char *dev_id,
    888 				     enum CRAS_ALSA_CARD_TYPE card_type,
    889 				     int is_first,
    890 				     struct cras_alsa_mixer *mixer,
    891 				     const struct cras_card_config *config,
    892 				     struct cras_use_case_mgr *ucm,
    893 				     snd_hctl_t *hctl,
    894 				     enum CRAS_STREAM_DIRECTION direction,
    895 				     size_t usb_vid,
    896 				     size_t usb_pid,
    897 				     char *usb_serial_number) {
    898   struct cras_iodev *result = NULL;
    899   if (cras_alsa_iodev_create_called < cras_alsa_iodev_create_return_size)
    900     result = cras_alsa_iodev_create_return[cras_alsa_iodev_create_called];
    901   cras_alsa_iodev_create_called++;
    902   return result;
    903 }
    904 void alsa_iodev_destroy(struct cras_iodev *iodev) {
    905   cras_alsa_iodev_destroy_called++;
    906   cras_alsa_iodev_destroy_arg = iodev;
    907 }
    908 int alsa_iodev_legacy_complete_init(struct cras_iodev *iodev) {
    909   cras_alsa_iodev_legacy_complete_init_called++;
    910   return 0;
    911 }
    912 int alsa_iodev_ucm_add_nodes_and_jacks(struct cras_iodev *iodev,
    913 				       struct ucm_section *section) {
    914   cras_alsa_iodev_ucm_add_nodes_and_jacks_called++;
    915   return 0;
    916 }
    917 void alsa_iodev_ucm_complete_init(struct cras_iodev *iodev) {
    918   cras_alsa_iodev_ucm_complete_init_called++;
    919 }
    920 unsigned alsa_iodev_index(struct cras_iodev *iodev) {
    921   std::map<struct cras_iodev *, unsigned int>::iterator i;
    922   cras_alsa_iodev_index_called++;
    923   i = cras_alsa_iodev_index_return.find(iodev);
    924   if (i != cras_alsa_iodev_index_return.end())
    925     return i->second;
    926   return 0;
    927 }
    928 int alsa_iodev_has_hctl_jacks(struct cras_iodev *iodev) {
    929   return alsa_iodev_has_hctl_jacks_return;
    930 }
    931 
    932 size_t snd_pcm_info_sizeof() {
    933   return 10;
    934 }
    935 size_t snd_ctl_card_info_sizeof() {
    936   return 10;
    937 }
    938 int snd_ctl_open(snd_ctl_t **handle, const char *name, int card) {
    939   snd_ctl_open_called++;
    940   if (snd_ctl_open_return == 0)
    941     *handle = reinterpret_cast<snd_ctl_t*>(0xff);
    942   else
    943     *handle = NULL;
    944   return snd_ctl_open_return;
    945 }
    946 int snd_ctl_close(snd_ctl_t *handle) {
    947   snd_ctl_close_called++;
    948   return snd_ctl_close_return;
    949 }
    950 int snd_ctl_pcm_next_device(snd_ctl_t *ctl, int *device) {
    951   if (snd_ctl_pcm_next_device_return_error) {
    952     *device = 10;
    953     return -1;
    954   }
    955   snd_ctl_pcm_next_device_called++;
    956   if (snd_ctl_pcm_next_device_set_devs_index >=
    957       snd_ctl_pcm_next_device_set_devs_size) {
    958     *device = -1;
    959     return 0;
    960   }
    961   *device =
    962       snd_ctl_pcm_next_device_set_devs[snd_ctl_pcm_next_device_set_devs_index];
    963   snd_ctl_pcm_next_device_set_devs_index++;
    964   return 0;
    965 }
    966 void snd_pcm_info_set_device(snd_pcm_info_t *obj, unsigned int val) {
    967 }
    968 void snd_pcm_info_set_subdevice(snd_pcm_info_t *obj, unsigned int val) {
    969 }
    970 void snd_pcm_info_set_stream(snd_pcm_info_t *obj, snd_pcm_stream_t val) {
    971 }
    972 const char *snd_pcm_info_get_name(const snd_pcm_info_t *obj) {
    973   return "Fake device name";
    974 }
    975 const char *snd_pcm_info_get_id(const snd_pcm_info_t *obj) {
    976   return "Fake device id";
    977 }
    978 int snd_ctl_pcm_info(snd_ctl_t *ctl, snd_pcm_info_t *info) {
    979   int ret;
    980   snd_ctl_pcm_info_called++;
    981   if (snd_ctl_pcm_info_rets_index >=
    982       snd_ctl_pcm_info_rets_size) {
    983     return -1;
    984   }
    985   ret = snd_ctl_pcm_info_rets[snd_ctl_pcm_info_rets_index];
    986   snd_ctl_pcm_info_rets_index++;
    987   return ret;
    988 }
    989 int snd_ctl_card_info(snd_ctl_t *ctl, snd_ctl_card_info_t *info) {
    990   snd_ctl_card_info_called++;
    991   return snd_ctl_card_info_ret;
    992 }
    993 const char *snd_ctl_card_info_get_name(const snd_ctl_card_info_t *obj) {
    994   return "TestName";
    995 }
    996 const char *snd_ctl_card_info_get_id(const snd_ctl_card_info_t *obj) {
    997   return "TestId";
    998 }
    999 int snd_hctl_open(snd_hctl_t **hctlp, const char *name, int mode) {
   1000   *hctlp = snd_hctl_open_pointer_val;
   1001   snd_hctl_open_called++;
   1002   return snd_hctl_open_return_value;
   1003 }
   1004 int snd_hctl_nonblock(snd_hctl_t *hctl, int nonblock) {
   1005   snd_hctl_nonblock_called++;
   1006   return 0;
   1007 }
   1008 int snd_hctl_load(snd_hctl_t *hctl) {
   1009   snd_hctl_load_called++;
   1010   return snd_hctl_load_return_value;
   1011 }
   1012 int snd_hctl_close(snd_hctl_t *hctl) {
   1013   snd_hctl_close_called++;
   1014   return 0;
   1015 }
   1016 int snd_hctl_poll_descriptors_count(snd_hctl_t *hctl) {
   1017   return snd_hctl_poll_descriptors_num_fds;
   1018 }
   1019 int snd_hctl_poll_descriptors(snd_hctl_t *hctl,
   1020                               struct pollfd *pfds,
   1021                               unsigned int space) {
   1022   unsigned int num = MIN(space, snd_hctl_poll_descriptors_num_fds);
   1023   memcpy(pfds, snd_hctl_poll_descriptors_fds, num * sizeof(*pfds));
   1024   snd_hctl_poll_descriptors_called++;
   1025   return num;
   1026 }
   1027 int snd_hctl_handle_events(snd_hctl_t *hctl) {
   1028   snd_hctl_handle_events_called++;
   1029   return 0;
   1030 }
   1031 
   1032 int cras_system_add_select_fd(int fd,
   1033 			      void (*callback)(void *data),
   1034 			      void *callback_data)
   1035 {
   1036   cras_system_add_select_fd_called++;
   1037   cras_system_add_select_fd_values.push_back(fd);
   1038   return 0;
   1039 }
   1040 void cras_system_rm_select_fd(int fd)
   1041 {
   1042   cras_system_rm_select_fd_called++;
   1043   cras_system_rm_select_fd_values.push_back(fd);
   1044 }
   1045 
   1046 struct cras_card_config *cras_card_config_create(const char *config_path,
   1047 						 const char *card_name)
   1048 {
   1049   cras_card_config_dir = config_path;
   1050   return NULL;
   1051 }
   1052 
   1053 void cras_card_config_destroy(struct cras_card_config *card_config)
   1054 {
   1055 }
   1056 
   1057 struct cras_volume_curve *cras_card_config_get_volume_curve_for_control(
   1058 		const struct cras_card_config *card_config,
   1059 		const char *control_name)
   1060 {
   1061   return NULL;
   1062 }
   1063 
   1064 int cras_device_blacklist_check(
   1065     struct cras_device_blacklist *blacklist,
   1066     unsigned vendor_id,
   1067     unsigned product_id,
   1068     unsigned device_index) {
   1069   EXPECT_EQ(fake_blacklist, blacklist);
   1070 
   1071   return cras_device_blacklist_check_retval;
   1072 }
   1073 
   1074 struct cras_use_case_mgr *ucm_create(const char* name) {
   1075   ucm_create_called++;
   1076   return reinterpret_cast<struct cras_use_case_mgr *>(0x44);
   1077 }
   1078 
   1079 void ucm_destroy(struct cras_use_case_mgr *mgr) {
   1080   ucm_destroy_called++;
   1081 }
   1082 
   1083 char *ucm_get_dev_for_mixer(struct cras_use_case_mgr *mgr, const char *mixer,
   1084                             enum CRAS_STREAM_DIRECTION dir)
   1085 {
   1086   ucm_get_dev_for_mixer_called++;
   1087   return strdup("device");
   1088 }
   1089 
   1090 char *ucm_get_flag(struct cras_use_case_mgr *mgr, const char *flag_name) {
   1091   ucm_get_flag_called++;
   1092   strncpy(ucm_get_flag_name, flag_name, sizeof(ucm_get_flag_name));
   1093   return NULL;
   1094 }
   1095 
   1096 struct mixer_name *ucm_get_coupled_mixer_names(
   1097     struct cras_use_case_mgr *mgr, const char *dev)
   1098 {
   1099   return ucm_get_coupled_mixer_names_return_value;
   1100 }
   1101 
   1102 int ucm_has_fully_specified_ucm_flag(struct cras_use_case_mgr *mgr)
   1103 {
   1104   return ucm_has_fully_specified_ucm_flag_return_value;
   1105 }
   1106 
   1107 struct ucm_section *ucm_get_sections(struct cras_use_case_mgr *mgr)
   1108 {
   1109   ucm_get_sections_called++;
   1110   return ucm_get_sections_return_value;
   1111 }
   1112 const char *ucm_get_echo_reference_dev_name_for_dev(
   1113     struct cras_use_case_mgr *mgr, const char *dev)
   1114 {
   1115   int idx = ucm_get_echo_reference_dev_name_for_dev_called++;
   1116   return ucm_get_echo_reference_dev_name_for_dev_return_value[idx];
   1117 }
   1118 
   1119 int cras_alsa_mixer_add_controls_in_section(
   1120 		struct cras_alsa_mixer *cmix,
   1121 		struct ucm_section *section)
   1122 {
   1123   cras_alsa_mixer_add_controls_in_section_called++;
   1124   return cras_alsa_mixer_add_controls_in_section_return_value;
   1125 }
   1126 
   1127 void ucm_free_mixer_names(struct mixer_name *names)
   1128 {
   1129   struct mixer_name *m;
   1130   DL_FOREACH(names, m) {
   1131     DL_DELETE(names, m);
   1132     free((void*)m->name);
   1133     free(m);
   1134   }
   1135 }
   1136 
   1137 } /* extern "C" */
   1138 
   1139 }  //  namespace
   1140 
   1141 int main(int argc, char **argv) {
   1142   ::testing::InitGoogleTest(&argc, argv);
   1143   openlog(NULL, LOG_PERROR, LOG_USER);
   1144   return RUN_ALL_TESTS();
   1145 }
   1146