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