Home | History | Annotate | Download | only in tests
      1 /* Copyright (c) 2013 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 
      6 #include <gtest/gtest.h>
      7 #include <stdint.h>
      8 #include <sys/socket.h>
      9 
     10 #include <stdio.h>
     11 
     12 extern "C" {
     13   #include "cras_hfp_slc.h"
     14   #include "cras_telephony.h"
     15 }
     16 
     17 static struct hfp_slc_handle *handle;
     18 static struct cras_telephony_handle fake_telephony;
     19 static int cras_bt_device_update_hardware_volume_called;
     20 static int slc_initialized_cb_called;
     21 static int slc_disconnected_cb_called;
     22 static int cras_system_add_select_fd_called;
     23 static void(*slc_cb)(void *data);
     24 static void *slc_cb_data;
     25 static int fake_errno;
     26 static struct cras_bt_device *device =
     27     reinterpret_cast<struct cras_bt_device *>(2);
     28 
     29 int slc_initialized_cb(struct hfp_slc_handle *handle);
     30 int slc_disconnected_cb(struct hfp_slc_handle *handle);
     31 
     32 void ResetStubData() {
     33   slc_initialized_cb_called = 0;
     34   cras_system_add_select_fd_called = 0;
     35   cras_bt_device_update_hardware_volume_called = 0;
     36   slc_cb = NULL;
     37   slc_cb_data = NULL;
     38 }
     39 
     40 namespace {
     41 
     42 TEST(HfpSlc, CreateSlcHandle) {
     43   ResetStubData();
     44 
     45   handle = hfp_slc_create(0, 0, device, slc_initialized_cb,
     46                           slc_disconnected_cb);
     47   ASSERT_EQ(1, cras_system_add_select_fd_called);
     48   ASSERT_EQ(handle, slc_cb_data);
     49 
     50   hfp_slc_destroy(handle);
     51 }
     52 
     53 TEST(HfpSlc, InitializeSlc) {
     54   int err;
     55   int sock[2];
     56   char buf[256];
     57   char *chp;
     58   ResetStubData();
     59 
     60   ASSERT_EQ(0, socketpair(AF_UNIX, SOCK_STREAM, 0, sock));
     61   handle = hfp_slc_create(sock[0], 0, device, slc_initialized_cb,
     62                           slc_disconnected_cb);
     63 
     64   err = write(sock[1], "AT+CIND=?\r", 10);
     65   ASSERT_EQ(10, err);
     66   slc_cb(slc_cb_data);
     67   err = read(sock[1], buf, 256);
     68 
     69   /* Assert "\r\n+CIND: ... \r\n" response is received */
     70   chp = strstr(buf, "\r\n");
     71   ASSERT_NE((void *)NULL, (void *)chp);
     72   ASSERT_EQ(0, strncmp("\r\n+CIND:", chp, 8));
     73   chp+=2;
     74   chp = strstr(chp, "\r\n");
     75   ASSERT_NE((void *)NULL, (void *)chp);
     76 
     77   /* Assert "\r\nOK\r\n" response is received */
     78   chp+=2;
     79   chp = strstr(chp, "\r\n");
     80   ASSERT_NE((void *)NULL, (void *)chp);
     81   ASSERT_EQ(0, strncmp("\r\nOK", chp, 4));
     82 
     83   err = write(sock[1], "AT+CMER=3,0,0,1\r", 16);
     84   ASSERT_EQ(16, err);
     85   slc_cb(slc_cb_data);
     86 
     87   ASSERT_EQ(1, slc_initialized_cb_called);
     88 
     89   /* Assert "\r\nOK\r\n" response is received */
     90   err = read(sock[1], buf, 256);
     91 
     92   chp = strstr(buf, "\r\n");
     93   ASSERT_NE((void *)NULL, (void *)chp);
     94   ASSERT_EQ(0, strncmp("\r\nOK", chp, 4));
     95 
     96   err = write(sock[1], "AT+VGS=13\r", 10);
     97   ASSERT_EQ(err, 10);
     98   slc_cb(slc_cb_data);
     99 
    100   err = read(sock[1], buf, 256);
    101 
    102   chp = strstr(buf, "\r\n");
    103   ASSERT_NE((void *)NULL, (void *)chp);
    104   ASSERT_EQ(0, strncmp("\r\nOK", chp, 4));
    105 
    106   ASSERT_EQ(1, cras_bt_device_update_hardware_volume_called);
    107 
    108   hfp_slc_destroy(handle);
    109 }
    110 
    111 TEST(HfpSlc, DisconnectSlc) {
    112   int sock[2];
    113   ResetStubData();
    114 
    115   ASSERT_EQ(0, socketpair(AF_UNIX, SOCK_STREAM, 0, sock));
    116   handle = hfp_slc_create(sock[0], 0, device, slc_initialized_cb,
    117                           slc_disconnected_cb);
    118   /* Close socket right away to make read() get negative err code, and
    119    * fake the errno to ECONNRESET. */
    120   close(sock[0]);
    121   close(sock[1]);
    122   fake_errno = 104;
    123   slc_cb(slc_cb_data);
    124 
    125   ASSERT_EQ(1, slc_disconnected_cb_called);
    126 
    127   hfp_slc_destroy(handle);
    128 }
    129 } // namespace
    130 
    131 int slc_initialized_cb(struct hfp_slc_handle *handle) {
    132   slc_initialized_cb_called++;
    133   return 0;
    134 }
    135 
    136 int slc_disconnected_cb(struct hfp_slc_handle *handle) {
    137   slc_disconnected_cb_called++;
    138   return 0;
    139 }
    140 
    141 extern "C" {
    142 int cras_system_add_select_fd(int fd,
    143 			      void (*callback)(void *data),
    144 			      void *callback_data) {
    145   cras_system_add_select_fd_called++;
    146   slc_cb = callback;
    147   slc_cb_data = callback_data;
    148   return 0;
    149 }
    150 
    151 void cras_system_rm_select_fd(int fd) {
    152 }
    153 
    154 void cras_bt_device_update_hardware_volume(struct cras_bt_device *device,
    155     int volume)
    156 {
    157   cras_bt_device_update_hardware_volume_called++;
    158 }
    159 
    160 /* To return fake errno */
    161 int *__errno_location() {
    162   return &fake_errno;
    163 }
    164 }
    165 
    166 // For telephony
    167 struct cras_telephony_handle* cras_telephony_get()
    168 {
    169   return &fake_telephony;
    170 }
    171 
    172 void cras_telephony_store_dial_number(int len, const char* num)
    173 {
    174 }
    175 
    176 int cras_telephony_event_answer_call()
    177 {
    178   return 0;
    179 }
    180 
    181 int cras_telephony_event_terminate_call()
    182 {
    183   return 0;
    184 }
    185 
    186 int main(int argc, char **argv) {
    187   ::testing::InitGoogleTest(&argc, argv);
    188   return RUN_ALL_TESTS();
    189 }
    190