| /****************************************************************************** |
| * |
| * 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 "AlarmTestHarness.h" |
| |
| extern "C" { |
| #include <stdint.h> |
| #include <utils/Log.h> |
| |
| #include "low_power_manager.h" |
| #include "osi.h" |
| #include "semaphore.h" |
| #include "test_stubs.h" |
| #include "thread.h" |
| #include "vendor.h" |
| } |
| |
| DECLARE_TEST_MODES( |
| init, |
| cleanup, |
| enable_disable |
| ); |
| |
| static const low_power_manager_t *manager; |
| static thread_t *thread; |
| static semaphore_t *done; |
| |
| static vendor_cb low_power_state_callback; |
| |
| static void flush_work_queue_item(UNUSED_ATTR void *context) { |
| semaphore_post(done); |
| } |
| |
| STUB_FUNCTION(int, vendor_send_command, (vendor_opcode_t opcode, void *param)) |
| DURING(init) AT_CALL(0) { |
| EXPECT_EQ(VENDOR_GET_LPM_IDLE_TIMEOUT, opcode); |
| *((uint32_t *)param) = 100; |
| return 0; |
| } |
| |
| UNEXPECTED_CALL; |
| return 0; |
| } |
| |
| STUB_FUNCTION(int, vendor_send_async_command, (vendor_async_opcode_t opcode, void *param)) |
| DURING(enable_disable) { |
| AT_CALL(0) { |
| EXPECT_EQ(VENDOR_SET_LPM_MODE, opcode); |
| EXPECT_EQ(BT_VND_LPM_ENABLE, *(uint8_t *)param); |
| low_power_state_callback(true); |
| thread_post(thread, flush_work_queue_item, NULL); |
| return 0; |
| } |
| AT_CALL(1) { |
| EXPECT_EQ(VENDOR_SET_LPM_MODE, opcode); |
| EXPECT_EQ(BT_VND_LPM_DISABLE, *(uint8_t *)param); |
| low_power_state_callback(true); |
| thread_post(thread, flush_work_queue_item, NULL); |
| return 0; |
| } |
| } |
| |
| UNEXPECTED_CALL; |
| return 0; |
| } |
| |
| STUB_FUNCTION(void, vendor_set_callback, (vendor_async_opcode_t opcode, vendor_cb callback)) |
| DURING(init) AT_CALL(0) { |
| EXPECT_EQ(VENDOR_SET_LPM_MODE, opcode); |
| low_power_state_callback = callback; |
| return; |
| } |
| |
| UNEXPECTED_CALL; |
| } |
| |
| static void reset_for(TEST_MODES_T next) { |
| RESET_CALL_COUNT(vendor_send_command); |
| RESET_CALL_COUNT(vendor_send_async_command); |
| RESET_CALL_COUNT(vendor_set_callback); |
| CURRENT_TEST_MODE = next; |
| } |
| |
| class LowPowerManagerTest : public AlarmTestHarness { |
| protected: |
| virtual void SetUp() { |
| AlarmTestHarness::SetUp(); |
| low_power_state_callback = NULL; |
| vendor.send_command = vendor_send_command; |
| vendor.send_async_command = vendor_send_async_command; |
| vendor.set_callback = vendor_set_callback; |
| manager = low_power_manager_get_test_interface(&vendor); |
| thread = thread_new("test_thread"); |
| done = semaphore_new(0); |
| |
| reset_for(init); |
| manager->init(thread); |
| |
| EXPECT_CALL_COUNT(vendor_send_command, 1); |
| EXPECT_CALL_COUNT(vendor_set_callback, 1); |
| } |
| |
| virtual void TearDown() { |
| reset_for(cleanup); |
| manager->cleanup(); |
| |
| semaphore_free(done); |
| thread_free(thread); |
| AlarmTestHarness::TearDown(); |
| } |
| |
| vendor_t vendor; |
| }; |
| |
| TEST_F(LowPowerManagerTest, test_enable_disable) { |
| reset_for(enable_disable); |
| manager->post_command(LPM_ENABLE); |
| semaphore_wait(done); |
| |
| manager->post_command(LPM_DISABLE); |
| semaphore_wait(done); |
| |
| EXPECT_CALL_COUNT(vendor_send_async_command, 2); |
| } |