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