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 "support/adapter.h"
213cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati#include "support/callbacks.h"
223cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati#include "support/property.h"
233cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati
243cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavatibool adapter_enable_disable() {
253cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  int error;
263cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati
273cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  CALL_AND_WAIT(error = bt_interface->enable(), adapter_state_changed);
283cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  TASSERT(error == BT_STATUS_SUCCESS, "Error enabling Bluetooth: %d", error);
293cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  TASSERT(adapter_get_state() == BT_STATE_ON, "Adapter did not turn on.");
303cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati
313cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  CALL_AND_WAIT(error = bt_interface->disable(), adapter_state_changed);
323cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  TASSERT(error == BT_STATUS_SUCCESS, "Error disabling Bluetooth: %d", error);
333cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  TASSERT(adapter_get_state() == BT_STATE_OFF, "Adapter did not turn off.");
343cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati
353cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  return true;
363cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati}
373cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati
383cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavatibool adapter_repeated_enable_disable() {
393cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  for (int i = 0; i < 10; ++i) {
403cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati    if (!adapter_enable_disable()) {
413cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati      return false;
423cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati    }
433cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  }
443cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  return true;
453cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati}
463cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati
473cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavatibool adapter_set_name() {
483cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  int error;
493cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  bt_property_t *name = property_new_name("set_name");
503cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati
513cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  CALL_AND_WAIT(error = bt_interface->set_adapter_property(name), adapter_properties);
523cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  TASSERT(error == BT_STATUS_SUCCESS, "Error setting device name.");
533cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  TASSERT(adapter_get_property_count() == 1, "Expected 1 adapter property change, found %d instead.", adapter_get_property_count());
543cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  TASSERT(adapter_get_property(BT_PROPERTY_BDNAME), "The Bluetooth name property did not change.");
553cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  TASSERT(property_equals(adapter_get_property(BT_PROPERTY_BDNAME), name), "Bluetooth name '%s' does not match test value", property_extract_name(adapter_get_property(BT_PROPERTY_BDNAME)));
563cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati
573cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  property_free(name);
583cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati
593cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  return true;
603cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati}
613cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati
623cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavatibool adapter_get_name() {
633cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  int error;
643cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  bt_property_t *name = property_new_name("get_name");
653cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati
663cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  CALL_AND_WAIT(bt_interface->set_adapter_property(name), adapter_properties);
673cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  CALL_AND_WAIT(error = bt_interface->get_adapter_property(BT_PROPERTY_BDNAME), adapter_properties);
683cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  TASSERT(error == BT_STATUS_SUCCESS, "Error getting device name.");
693cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  TASSERT(adapter_get_property_count() == 1, "Expected 1 adapter property change, found %d instead.", adapter_get_property_count());
703cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  TASSERT(adapter_get_property(BT_PROPERTY_BDNAME), "The Bluetooth name property did not change.");
713cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  TASSERT(property_equals(adapter_get_property(BT_PROPERTY_BDNAME), name), "Bluetooth name '%s' does not match test value", property_extract_name(adapter_get_property(BT_PROPERTY_BDNAME)));
723cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati
733cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  property_free(name);
743cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  return true;
753cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati}
763cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati
773cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavatibool adapter_start_discovery() {
783cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  int error;
793cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati
803cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  CALL_AND_WAIT(error = bt_interface->start_discovery(), discovery_state_changed);
813cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  TASSERT(error == BT_STATUS_SUCCESS, "Error calling start_discovery: %d", error);
823cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  TASSERT(adapter_get_discovery_state() == BT_DISCOVERY_STARTED, "Unable to start discovery.");
833cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati
843cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  return true;
853cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati}
863cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati
873cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavatibool adapter_cancel_discovery() {
883cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  int error;
893cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati
903cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  CALL_AND_WAIT(bt_interface->start_discovery(), discovery_state_changed);
913cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  CALL_AND_WAIT(error = bt_interface->cancel_discovery(), discovery_state_changed);
923cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  TASSERT(error == BT_STATUS_SUCCESS, "Error calling cancel_discovery: %d", error);
933cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  TASSERT(adapter_get_discovery_state() == BT_DISCOVERY_STOPPED, "Unable to stop discovery.");
943cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati
953cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati  return true;
963cf59ef3b216adffbe7e49297e6e3e8c56c4e9a0Sharvil Nanavati}
97