1fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson/******************************************************************************
2fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson *
3fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson *  Copyright (C) 2014 Google, Inc.
4fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson *
5fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson *  Licensed under the Apache License, Version 2.0 (the "License");
6fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson *  you may not use this file except in compliance with the License.
7fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson *  You may obtain a copy of the License at:
8fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson *
9fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson *  http://www.apache.org/licenses/LICENSE-2.0
10fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson *
11fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson *  Unless required by applicable law or agreed to in writing, software
12fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson *  distributed under the License is distributed on an "AS IS" BASIS,
13fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson *  See the License for the specific language governing permissions and
15fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson *  limitations under the License.
16fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson *
17fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson ******************************************************************************/
18fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson
19fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson#include <gtest/gtest.h>
20fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson
211e0ede7f5522a853fc39d4f183e508ed38f01636Zach Johnson#include "AlarmTestHarness.h"
221e0ede7f5522a853fc39d4f183e508ed38f01636Zach Johnson
23fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnsonextern "C" {
24fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson#include <stdint.h>
25fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson
26fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson#include "low_power_manager.h"
27c196f214c5ae349ec2022f8d3cbaf56910b3b9f8Pavlin Radoslavov#include "osi/include/osi.h"
28c196f214c5ae349ec2022f8d3cbaf56910b3b9f8Pavlin Radoslavov#include "osi/include/semaphore.h"
29c196f214c5ae349ec2022f8d3cbaf56910b3b9f8Pavlin Radoslavov#include "osi/include/thread.h"
30fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson#include "test_stubs.h"
31fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson#include "vendor.h"
32fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson}
33fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson
34fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach JohnsonDECLARE_TEST_MODES(
35fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson  init,
36fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson  cleanup,
37fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson  enable_disable
38fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson);
39fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson
40bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnsonstatic const low_power_manager_t *manager;
41fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnsonstatic thread_t *thread;
42fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnsonstatic semaphore_t *done;
43fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson
44fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnsonstatic vendor_cb low_power_state_callback;
45fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson
46fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnsonstatic void flush_work_queue_item(UNUSED_ATTR void *context) {
47fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson  semaphore_post(done);
48fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson}
49fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson
50fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach JohnsonSTUB_FUNCTION(int, vendor_send_command, (vendor_opcode_t opcode, void *param))
51b0f59256c6b3c465bc6721394f5e193f711b8384Andre Eisenbach  DURING(enable_disable) AT_CALL(0) {
52fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson    EXPECT_EQ(VENDOR_GET_LPM_IDLE_TIMEOUT, opcode);
53fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson    *((uint32_t *)param) = 100;
54fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson    return 0;
55fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson  }
56fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson
57fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson  UNEXPECTED_CALL;
58fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson  return 0;
59fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson}
60fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson
61fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach JohnsonSTUB_FUNCTION(int, vendor_send_async_command, (vendor_async_opcode_t opcode, void *param))
62fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson  DURING(enable_disable) {
63fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson    AT_CALL(0) {
64fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson      EXPECT_EQ(VENDOR_SET_LPM_MODE, opcode);
65fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson      EXPECT_EQ(BT_VND_LPM_ENABLE, *(uint8_t *)param);
66fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson      low_power_state_callback(true);
67fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson      thread_post(thread, flush_work_queue_item, NULL);
68fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson      return 0;
69fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson    }
70fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson    AT_CALL(1) {
71fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson      EXPECT_EQ(VENDOR_SET_LPM_MODE, opcode);
72fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson      EXPECT_EQ(BT_VND_LPM_DISABLE, *(uint8_t *)param);
73fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson      low_power_state_callback(true);
74fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson      thread_post(thread, flush_work_queue_item, NULL);
75fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson      return 0;
76fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson    }
77fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson  }
78fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson
79fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson  UNEXPECTED_CALL;
80fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson  return 0;
81fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson}
82fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson
83fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach JohnsonSTUB_FUNCTION(void, vendor_set_callback, (vendor_async_opcode_t opcode, vendor_cb callback))
84fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson  DURING(init) AT_CALL(0) {
85fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson    EXPECT_EQ(VENDOR_SET_LPM_MODE, opcode);
86fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson    low_power_state_callback = callback;
87fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson    return;
88fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson  }
89fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson
90fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson  UNEXPECTED_CALL;
91fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson}
92fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson
93fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnsonstatic void reset_for(TEST_MODES_T next) {
94fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson  RESET_CALL_COUNT(vendor_send_command);
95fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson  RESET_CALL_COUNT(vendor_send_async_command);
96fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson  RESET_CALL_COUNT(vendor_set_callback);
97fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson  CURRENT_TEST_MODE = next;
98fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson}
99fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson
100fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnsonclass LowPowerManagerTest : public AlarmTestHarness {
101fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson  protected:
102fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson    virtual void SetUp() {
103fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson      AlarmTestHarness::SetUp();
104fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson      low_power_state_callback = NULL;
105fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson      vendor.send_command = vendor_send_command;
106fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson      vendor.send_async_command = vendor_send_async_command;
107fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson      vendor.set_callback = vendor_set_callback;
108fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson      manager = low_power_manager_get_test_interface(&vendor);
109fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson      thread = thread_new("test_thread");
110fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson      done = semaphore_new(0);
111fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson
112fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson      reset_for(init);
113fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson      manager->init(thread);
114fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson
115fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson      EXPECT_CALL_COUNT(vendor_set_callback, 1);
116fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson    }
117fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson
118fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson    virtual void TearDown() {
119fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson      reset_for(cleanup);
120fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson      manager->cleanup();
121fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson
122fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson      semaphore_free(done);
123fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson      thread_free(thread);
124fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson      AlarmTestHarness::TearDown();
125fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson    }
126fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson
127bf8193bc81cc077e3acd245cacbe8e3789c4b9ffZach Johnson    vendor_t vendor;
128fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson};
129fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson
130fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach JohnsonTEST_F(LowPowerManagerTest, test_enable_disable) {
131fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson  reset_for(enable_disable);
132fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson  manager->post_command(LPM_ENABLE);
133fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson  semaphore_wait(done);
134fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson
135fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson  manager->post_command(LPM_DISABLE);
136fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson  semaphore_wait(done);
137fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson
138b0f59256c6b3c465bc6721394f5e193f711b8384Andre Eisenbach  EXPECT_CALL_COUNT(vendor_send_command, 1);
139fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson  EXPECT_CALL_COUNT(vendor_send_async_command, 2);
140fbbd42b1fc1aae7a106f46275ab1fd86452cce78Zach Johnson}
141