1f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati#include <gtest/gtest.h> 2f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati#include <hardware/bluetooth.h> 3f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati#include <unistd.h> 4f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati 5f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavatiextern "C" { 6f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati#include "alarm.h" 7e0cdd3399119823e2f1ec75161c1cf67829651bfSharvil Nanavati#include "osi.h" 8f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati#include "semaphore.h" 9f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati} 10f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati 11f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavatiextern int64_t TIMER_INTERVAL_FOR_WAKELOCK_IN_MS; 12f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati 13f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavatistatic semaphore_t *semaphore; 14f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavatistatic int cb_counter; 15f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavatistatic int lock_count; 16f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavatistatic timer_t timer; 17f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavatistatic alarm_cb saved_callback; 18f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavatistatic void *saved_data; 19f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati 20f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavatistatic const uint64_t EPSILON_MS = 5; 21f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati 22f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavatistatic void msleep(uint64_t ms) { 23f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati usleep(ms * 1000); 24f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati} 25f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati 26f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavatistatic void timer_callback(void *) { 27f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati saved_callback(saved_data); 28f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati} 29f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati 30f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavaticlass AlarmTest : public ::testing::Test { 31f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati protected: 32f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati virtual void SetUp() { 33f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati TIMER_INTERVAL_FOR_WAKELOCK_IN_MS = 100; 34f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati cb_counter = 0; 35f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati lock_count = 0; 36f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati 37f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati semaphore = semaphore_new(0); 38f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati 39f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati struct sigevent sigevent; 40f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati memset(&sigevent, 0, sizeof(sigevent)); 41f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati sigevent.sigev_notify = SIGEV_THREAD; 42f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati sigevent.sigev_notify_function = (void (*)(union sigval))timer_callback; 43f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati sigevent.sigev_value.sival_ptr = NULL; 44f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati timer_create(CLOCK_BOOTTIME, &sigevent, &timer); 45f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati } 46f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati 47f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati virtual void TearDown() { 48f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati timer_delete(timer); 49f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati } 50f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati}; 51f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati 52e0cdd3399119823e2f1ec75161c1cf67829651bfSharvil Nanavatistatic void cb(UNUSED_ATTR void *data) { 53f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati ++cb_counter; 54f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati semaphore_post(semaphore); 55f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati} 56f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati 57f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavatistatic bool set_wake_alarm(uint64_t delay_millis, bool, alarm_cb cb, void *data) { 58f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati saved_callback = cb; 59f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati saved_data = data; 60f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati 61f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati struct itimerspec wakeup_time; 62f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati memset(&wakeup_time, 0, sizeof(wakeup_time)); 63f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati wakeup_time.it_value.tv_sec = (delay_millis / 1000); 64f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati wakeup_time.it_value.tv_nsec = (delay_millis % 1000) * 1000000LL; 65f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati timer_settime(timer, 0, &wakeup_time, NULL); 66f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati return true; 67f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati} 68f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati 69f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavatistatic int acquire_wake_lock(const char *) { 70f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati if (!lock_count) 71f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati lock_count = 1; 72f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati return BT_STATUS_SUCCESS; 73f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati} 74f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati 75f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavatistatic int release_wake_lock(const char *) { 76f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati if (lock_count) 77f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati lock_count = 0; 78f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati return BT_STATUS_SUCCESS; 79f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati} 80f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati 81f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavatistatic bt_os_callouts_t stub = { 82f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati sizeof(bt_os_callouts_t), 83f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati set_wake_alarm, 84f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati acquire_wake_lock, 85f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati release_wake_lock, 86f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati}; 87f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati 88f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavatibt_os_callouts_t *bt_os_callouts = &stub; 89f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati 90f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil NanavatiTEST_F(AlarmTest, test_new_simple) { 91f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati alarm_t *alarm = alarm_new(); 92f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati ASSERT_TRUE(alarm != NULL); 93f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati} 94f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati 95f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil NanavatiTEST_F(AlarmTest, test_free_simple) { 96f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati alarm_t *alarm = alarm_new(); 97f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati alarm_free(alarm); 98f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati} 99f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati 100f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil NanavatiTEST_F(AlarmTest, test_free_null) { 101f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati alarm_free(NULL); 102f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati} 103f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati 104f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil NanavatiTEST_F(AlarmTest, test_simple_cancel) { 105f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati alarm_t *alarm = alarm_new(); 106f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati alarm_cancel(alarm); 107f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati alarm_free(alarm); 108f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati} 109f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati 110f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil NanavatiTEST_F(AlarmTest, test_cancel) { 111f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati alarm_t *alarm = alarm_new(); 112f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati alarm_set(alarm, 10, cb, NULL); 113f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati alarm_cancel(alarm); 114f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati 115f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati msleep(10 + EPSILON_MS); 116f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati 117f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati EXPECT_EQ(cb_counter, 0); 118f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati EXPECT_EQ(lock_count, 0); 119f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati alarm_free(alarm); 120f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati} 121f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati 122f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil NanavatiTEST_F(AlarmTest, test_cancel_idempotent) { 123f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati alarm_t *alarm = alarm_new(); 124f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati alarm_set(alarm, 10, cb, NULL); 125f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati alarm_cancel(alarm); 126f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati alarm_cancel(alarm); 127f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati alarm_cancel(alarm); 128f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati alarm_free(alarm); 129f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati} 130f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati 131f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil NanavatiTEST_F(AlarmTest, test_set_short) { 132f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati alarm_t *alarm = alarm_new(); 133f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati alarm_set(alarm, 10, cb, NULL); 134f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati 135f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati EXPECT_EQ(cb_counter, 0); 136f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati EXPECT_EQ(lock_count, 1); 137f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati 138f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati semaphore_wait(semaphore); 139f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati 140f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati EXPECT_EQ(cb_counter, 1); 141f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati EXPECT_EQ(lock_count, 0); 142f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati 143f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati alarm_free(alarm); 144f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati} 145f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati 146f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil NanavatiTEST_F(AlarmTest, test_set_long) { 147f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati alarm_t *alarm = alarm_new(); 148f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati alarm_set(alarm, TIMER_INTERVAL_FOR_WAKELOCK_IN_MS, cb, NULL); 149f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati 150f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati EXPECT_EQ(cb_counter, 0); 151f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati EXPECT_EQ(lock_count, 0); 152f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati 153f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati semaphore_wait(semaphore); 154f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati 155f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati EXPECT_EQ(cb_counter, 1); 156f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati EXPECT_EQ(lock_count, 0); 157f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati 158f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati alarm_free(alarm); 159f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati} 160f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati 161f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil NanavatiTEST_F(AlarmTest, test_set_short_short) { 162f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati alarm_t *alarm[2] = { 163f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati alarm_new(), 164f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati alarm_new() 165f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati }; 166f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati 167f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati alarm_set(alarm[0], 10, cb, NULL); 168f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati alarm_set(alarm[1], 20, cb, NULL); 169f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati 170f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati EXPECT_EQ(cb_counter, 0); 171f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati EXPECT_EQ(lock_count, 1); 172f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati 173f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati semaphore_wait(semaphore); 174f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati 175f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati EXPECT_EQ(cb_counter, 1); 176f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati EXPECT_EQ(lock_count, 1); 177f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati 178f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati semaphore_wait(semaphore); 179f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati 180f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati EXPECT_EQ(cb_counter, 2); 181f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati EXPECT_EQ(lock_count, 0); 182f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati 183f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati alarm_free(alarm[0]); 184f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati alarm_free(alarm[1]); 185f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati} 186f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati 187f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil NanavatiTEST_F(AlarmTest, test_set_short_long) { 188f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati alarm_t *alarm[2] = { 189f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati alarm_new(), 190f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati alarm_new() 191f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati }; 192f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati 193f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati alarm_set(alarm[0], 10, cb, NULL); 194f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati alarm_set(alarm[1], 10 + TIMER_INTERVAL_FOR_WAKELOCK_IN_MS + EPSILON_MS, cb, NULL); 195f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati 196f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati EXPECT_EQ(cb_counter, 0); 197f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati EXPECT_EQ(lock_count, 1); 198f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati 199f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati semaphore_wait(semaphore); 200f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati 201f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati EXPECT_EQ(cb_counter, 1); 202f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati EXPECT_EQ(lock_count, 0); 203f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati 204f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati semaphore_wait(semaphore); 205f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati 206f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati EXPECT_EQ(cb_counter, 2); 207f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati EXPECT_EQ(lock_count, 0); 208f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati 209f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati alarm_free(alarm[0]); 210f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati alarm_free(alarm[1]); 211f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati} 212f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati 213f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil NanavatiTEST_F(AlarmTest, test_set_long_long) { 214f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati alarm_t *alarm[2] = { 215f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati alarm_new(), 216f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati alarm_new() 217f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati }; 218f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati 219f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati alarm_set(alarm[0], TIMER_INTERVAL_FOR_WAKELOCK_IN_MS, cb, NULL); 220f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati alarm_set(alarm[1], 2 * TIMER_INTERVAL_FOR_WAKELOCK_IN_MS + EPSILON_MS, cb, NULL); 221f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati 222f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati EXPECT_EQ(cb_counter, 0); 223f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati EXPECT_EQ(lock_count, 0); 224f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati 225f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati semaphore_wait(semaphore); 226f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati 227f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati EXPECT_EQ(cb_counter, 1); 228f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati EXPECT_EQ(lock_count, 0); 229f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati 230f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati semaphore_wait(semaphore); 231f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati 232f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati EXPECT_EQ(cb_counter, 2); 233f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati EXPECT_EQ(lock_count, 0); 234f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati 235f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati alarm_free(alarm[0]); 236f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati alarm_free(alarm[1]); 237f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati} 238f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati 239f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati// Try to catch any race conditions between the timer callback and |alarm_free|. 240f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil NanavatiTEST_F(AlarmTest, test_callback_free_race) { 241f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati for (int i = 0; i < 1000; ++i) { 242f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati alarm_t *alarm = alarm_new(); 243f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati alarm_set(alarm, 0, cb, NULL); 244f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati alarm_free(alarm); 245f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati } 246f0e7c8b895c61104ce962b7c5e3705a32943d711Sharvil Nanavati} 247