Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3b7e218e authored by Chris Manton's avatar Chris Manton
Browse files

bt_headless: Add connect/disconnect timeouts

Towards testable code

Bug: 163134718
Tag: #refactor
Test: gd/cert/run

Change-Id: I74d0b45a737efcbe1f855346d08a07e085e56107
parent 0fb70b22
Loading
Loading
Loading
Loading
+37 −9
Original line number Diff line number Diff line
@@ -36,6 +36,8 @@
#include "test/headless/interface.h"
#include "types/raw_address.h"

extern bt_interface_t bluetoothInterface;

void power_mode_callback(const RawAddress& p_bda, tBTM_PM_STATUS status,
                         uint16_t value, tHCI_STATUS hci_status) {
  fprintf(stdout, "Got callback\n");
@@ -59,7 +61,20 @@ void callback_interface(interface_data_t data) {

namespace {

int do_connect(unsigned int num_loops, const RawAddress& bd_addr) {
int do_connect(unsigned int num_loops, const RawAddress& bd_addr,
               std::list<std::string> options) {
  int disconnect_wait_time{0};

  if (options.size() != 0) {
    std::string opt = options.front();
    options.pop_front();
    auto v = bluetooth::test::headless::GetOpt::Split(opt);
    if (v.size() == 2) {
      if (v[0] == "wait") disconnect_wait_time = std::stoi(v[1]);
    }
  }
  ASSERT_LOG(disconnect_wait_time >= 0, "Time cannot go backwards");

  headless_add_callback("acl_state_changed", callback_interface);

  acl_state_changed_promise = std::promise<acl_state_changed_params_t>();
@@ -80,7 +95,12 @@ int do_connect(unsigned int num_loops, const RawAddress& bd_addr) {
                         .count();
  fprintf(stdout, "Waiting for supervision timeout\n");
  result = future.get();
  uint64_t disconnect = std::chrono::duration_cast<std::chrono::milliseconds>(

  if (disconnect_wait_time == 0) {
    fprintf(stdout, "Waiting to disconnect from supervision timeout\n");
    result = future.get();
    uint64_t disconnect =
        std::chrono::duration_cast<std::chrono::milliseconds>(
            std::chrono::system_clock::now().time_since_epoch())
            .count();

@@ -88,6 +108,13 @@ int do_connect(unsigned int num_loops, const RawAddress& bd_addr) {
            disconnect - connect, bd_addr.ToString().c_str(), result.status);

    headless_remove_callback("acl_state_changed", callback_interface);
  } else {
    fprintf(stdout, "Waiting %d seconds to just shutdown\n",
            disconnect_wait_time);
    sleep(disconnect_wait_time);
    bluetoothInterface.dump(1, nullptr);
    bluetoothInterface.cleanup();
  }
  return 0;
}

@@ -95,6 +122,7 @@ int do_connect(unsigned int num_loops, const RawAddress& bd_addr) {

int bluetooth::test::headless::Connect::Run() {
  return RunOnHeadlessStack<int>([this]() {
    return do_connect(options_.loop_, options_.device_.front());
    return do_connect(options_.loop_, options_.device_.front(),
                      options_.non_options_);
  });
}
+15 −1
Original line number Diff line number Diff line
@@ -43,6 +43,8 @@ constexpr struct option long_options[] = {
    {"flags", required_argument, 0, 0},   // kOptionFlags
    {0, 0, 0, 0}};

const char* kShortArgs = "d:l:u:";

}  // namespace

void bluetooth::test::headless::GetOpt::Usage() const {
@@ -77,6 +79,17 @@ void bluetooth::test::headless::GetOpt::ParseValue(
  if (pp != p) string_list.push_back(std::string(pp));
}

std::vector<std::string> bluetooth::test::headless::GetOpt::Split(
    std::string s) {
  std::stringstream ss(s);
  std::vector<std::string> values;
  std::string item;
  while (std::getline(ss, item, '=')) {
    values.push_back(item);
  }
  return values;
}

void bluetooth::test::headless::GetOpt::ProcessOption(int option_index,
                                                      char* optarg) {
  std::list<std::string> string_list;
@@ -147,7 +160,8 @@ bluetooth::test::headless::GetOpt::GetOpt(int argc, char** argv)
    : name_(argv[0]) {
  while (1) {
    int option_index = 0;
    int c = getopt_long_only(argc, argv, "d:l:u:", long_options, &option_index);
    int c =
        getopt_long_only(argc, argv, kShortArgs, long_options, &option_index);
    if (c == -1) break;

    switch (c) {
+2 −0
Original line number Diff line number Diff line
@@ -52,6 +52,8 @@ class GetOpt {

  mutable std::list<std::string> non_options_;

  static std::vector<std::string> Split(std::string);

 private:
  void ParseValue(char* optarg, std::list<std::string>& my_list);
  void ProcessOption(int option_index, char* optarg);
+3 −0
Original line number Diff line number Diff line
@@ -21,8 +21,11 @@
#include <unistd.h>

#include "base/logging.h"  // LOG() stdout and android log
#include "include/hardware/bluetooth.h"
#include "test/headless/get_options.h"

extern bt_interface_t bluetoothInterface;

namespace bluetooth {
namespace test {
namespace headless {