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