13cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati/******************************************************************************
23cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati *
33cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati *  Copyright (C) 2014 Google, Inc.
43cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati *
53cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati *  Licensed under the Apache License, Version 2.0 (the "License");
63cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati *  you may not use this file except in compliance with the License.
73cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati *  You may obtain a copy of the License at:
83cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati *
93cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati *  http://www.apache.org/licenses/LICENSE-2.0
103cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati *
113cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati *  Unless required by applicable law or agreed to in writing, software
123cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati *  distributed under the License is distributed on an "AS IS" BASIS,
133cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
143cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati *  See the License for the specific language governing permissions and
153cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati *  limitations under the License.
163cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati *
173cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati ******************************************************************************/
183cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati
193cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati#include "base.h"
203cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati#include "cases/cases.h"
213cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati#include "support/callbacks.h"
223cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati#include "support/hal.h"
233cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati#include "support/pan.h"
243cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati
253cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati#define GRAY  "\x1b[0;37m"
263cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati#define GREEN "\x1b[0;32m"
273cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati#define RED   "\x1b[0;31m"
283cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati
293cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavaticonst bt_interface_t *bt_interface;
303cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavatibt_bdaddr_t bt_remote_bdaddr;
313cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati
323cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavatistatic bool parse_bdaddr(const char *str, bt_bdaddr_t *addr) {
333cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  if (!addr) {
343cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati    return false;
353cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  }
363cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati
373cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  int v[6];
383cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  if (sscanf(str, "%02x:%02x:%02x:%02x:%02x:%02x", &v[0], &v[1], &v[2], &v[3], &v[4], &v[5]) != 6) {
393cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati    return false;
403cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  }
413cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati
423cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  for (int i = 0; i < 6; ++i) {
433cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati    addr->address[i] = (uint8_t)v[i];
443cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  }
453cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati
463cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  return true;
473cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati}
483cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati
493cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavatiint main(int argc, char **argv) {
503cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  if (argc < 2 || !parse_bdaddr(argv[1], &bt_remote_bdaddr)) {
513cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati    printf("Usage: %s <bdaddr>\n", argv[0]);
523cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati    return -1;
533cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  }
543cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati
553cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  if (!hal_open(callbacks_get_adapter_struct())) {
563cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati    printf("Unable to open Bluetooth HAL.\n");
573cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati    return 1;
583cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  }
593cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati
603cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  if (!pan_init()) {
613cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati    printf("Unable to initialize PAN.\n");
623cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati    return 2;
633cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  }
643cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati
653cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  int pass = 0;
663cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  int fail = 0;
673cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  int case_num = 0;
683cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati
693cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  // Run through the sanity suite.
703cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  for (size_t i = 0; i < sanity_suite_size; ++i) {
713cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati    callbacks_init();
723cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati    if (sanity_suite[i].function()) {
733cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati      printf("[%4d] %-64s [%sPASS%s]\n", ++case_num, sanity_suite[i].function_name, GREEN, GRAY);
743cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati      ++pass;
753cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati    } else {
763cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati      printf("[%4d] %-64s [%sFAIL%s]\n", ++case_num, sanity_suite[i].function_name, RED, GRAY);
773cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati      ++fail;
783cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati    }
793cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati    callbacks_cleanup();
803cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  }
813cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati
823cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  // If there was a failure in the sanity suite, don't bother running the rest of the tests.
833cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  if (fail) {
843cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati    printf("\n%sSanity suite failed with %d errors.%s\n", RED, fail, GRAY);
853cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati    hal_close();
863cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati    return 0;
873cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  }
883cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati
893cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  // Run the full test suite.
903cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  for (size_t i = 0; i < test_suite_size; ++i) {
913cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati    callbacks_init();
923cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati    CALL_AND_WAIT(bt_interface->enable(), adapter_state_changed);
933cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati    if (test_suite[i].function()) {
943cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati      printf("[%4d] %-64s [%sPASS%s]\n", ++case_num, test_suite[i].function_name, GREEN, GRAY);
953cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati      ++pass;
963cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati    } else {
973cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati      printf("[%4d] %-64s [%sFAIL%s]\n", ++case_num, test_suite[i].function_name, RED, GRAY);
983cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati      ++fail;
993cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati    }
1003cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati    CALL_AND_WAIT(bt_interface->disable(), adapter_state_changed);
1013cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati    callbacks_cleanup();
1023cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  }
1033cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati
1043cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  printf("\n");
1053cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati
1063cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  if (fail) {
1073cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati    printf("%d/%d tests failed. See above for failed test cases.\n", fail, test_suite_size);
1083cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  } else {
1093cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati    printf("All tests passed!\n");
1103cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  }
1113cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati
1123cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  hal_close();
1133cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  return 0;
1143cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati}
115