blob: 496c70d4a08513b44816261b0c9297a783a606c7 [file] [log] [blame]
/******************************************************************************
*
* Copyright (C) 2014 Google, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
******************************************************************************/
#include <gtest/gtest.h>
#include <hardware/bluetooth.h>
#include <unistd.h>
#include "AlarmTestHarness.h"
extern "C" {
#include "alarm.h"
#include "allocation_tracker.h"
}
static timer_t timer;
static alarm_cb saved_callback;
static void *saved_data;
static AlarmTestHarness *current_harness;
static void timer_callback(void *) {
saved_callback(saved_data);
}
void AlarmTestHarness::SetUp() {
AllocationTestHarness::SetUp();
current_harness = this;
TIMER_INTERVAL_FOR_WAKELOCK_IN_MS = 100;
lock_count = 0;
struct sigevent sigevent;
memset(&sigevent, 0, sizeof(sigevent));
sigevent.sigev_notify = SIGEV_THREAD;
sigevent.sigev_notify_function = (void (*)(union sigval))timer_callback;
sigevent.sigev_value.sival_ptr = NULL;
timer_create(CLOCK_BOOTTIME, &sigevent, &timer);
}
void AlarmTestHarness::TearDown() {
alarm_cleanup();
timer_delete(timer);
AllocationTestHarness::TearDown();
}
static bool set_wake_alarm(uint64_t delay_millis, bool, alarm_cb cb, void *data) {
saved_callback = cb;
saved_data = data;
struct itimerspec wakeup_time;
memset(&wakeup_time, 0, sizeof(wakeup_time));
wakeup_time.it_value.tv_sec = (delay_millis / 1000);
wakeup_time.it_value.tv_nsec = (delay_millis % 1000) * 1000000LL;
timer_settime(timer, 0, &wakeup_time, NULL);
return true;
}
static int acquire_wake_lock(const char *) {
if (!current_harness->lock_count)
current_harness->lock_count = 1;
return BT_STATUS_SUCCESS;
}
static int release_wake_lock(const char *) {
if (current_harness->lock_count)
current_harness->lock_count = 0;
return BT_STATUS_SUCCESS;
}
static bt_os_callouts_t stub = {
sizeof(bt_os_callouts_t),
set_wake_alarm,
acquire_wake_lock,
release_wake_lock,
};
bt_os_callouts_t *bt_os_callouts = &stub;