Skip to content

Commit c5a41d8

Browse files
committed
test: add sleep manager tests
This commits contains two tests: - race condition - deep sleep locking/unlocking
1 parent bc70442 commit c5a41d8

File tree

2 files changed

+159
-0
lines changed

2 files changed

+159
-0
lines changed

TESTS/mbed_hal/sleep_manager/main.cpp

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
/* mbed Microcontroller Library
2+
* Copyright (c) 2017 ARM Limited
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
#include "utest/utest.h"
17+
#include "unity/unity.h"
18+
#include "greentea-client/test_env.h"
19+
20+
#if !DEVICE_SLEEP
21+
#error [NOT_SUPPORTED] test not supported
22+
#endif
23+
24+
using namespace utest::v1;
25+
26+
void sleep_manager_deepsleep_counter_test()
27+
{
28+
bool deep_sleep_allowed = sleep_manager_can_deep_sleep();
29+
TEST_ASSERT_TRUE(deep_sleep_allowed);
30+
31+
sleep_manager_lock_deep_sleep();
32+
deep_sleep_allowed = sleep_manager_can_deep_sleep();
33+
TEST_ASSERT_FALSE(deep_sleep_allowed);
34+
35+
sleep_manager_unlock_deep_sleep();
36+
deep_sleep_allowed = sleep_manager_can_deep_sleep();
37+
TEST_ASSERT_TRUE(deep_sleep_allowed);
38+
}
39+
40+
utest::v1::status_t greentea_failure_handler(const Case *const source, const failure_t reason)
41+
{
42+
greentea_case_failure_abort_handler(source, reason);
43+
return STATUS_CONTINUE;
44+
}
45+
46+
utest::v1::status_t greentea_test_setup(const size_t number_of_cases)
47+
{
48+
GREENTEA_SETUP(20, "default_auto");
49+
return greentea_test_setup_handler(number_of_cases);
50+
}
51+
52+
Case cases[] = {
53+
Case("sleep manager - deep sleep counter", sleep_manager_deepsleep_counter_test, greentea_failure_handler),
54+
};
55+
56+
Specification specification(greentea_test_setup, cases, greentea_test_teardown_handler);
57+
58+
int main() {
59+
Harness::run(specification);
60+
}
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
/* mbed Microcontroller Library
2+
* Copyright (c) 2017 ARM Limited
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
#include "utest/utest.h"
18+
#include "unity/unity.h"
19+
#include "greentea-client/test_env.h"
20+
21+
#if !DEVICE_SLEEP
22+
#error [NOT_SUPPORTED] test not supported
23+
#endif
24+
25+
using namespace utest::v1;
26+
27+
void sleep_manager_locking_thread_test()
28+
{
29+
for (uint32_t i = 0; i < 100; i++) {
30+
sleep_manager_lock_deep_sleep();
31+
Thread::wait(25);
32+
sleep_manager_unlock_deep_sleep();
33+
}
34+
}
35+
36+
void sleep_manager_multithread_test()
37+
{
38+
{
39+
Callback<void()> cb(sleep_manager_locking_thread_test);
40+
Thread t1;
41+
Thread t2;
42+
43+
t1.start(callback(cb));
44+
Thread::wait(25);
45+
t2.start(callback(cb));
46+
47+
// Wait for the threads to finish
48+
t1.join();
49+
t2.join();
50+
}
51+
52+
bool deep_sleep_allowed = sleep_manager_can_deep_sleep();
53+
TEST_ASSERT_TRUE_MESSAGE(deep_sleep_allowed, "Deep sleep should be allowed");
54+
}
55+
56+
void sleep_manager_locking_irq_test()
57+
{
58+
sleep_manager_lock_deep_sleep();
59+
sleep_manager_unlock_deep_sleep();
60+
}
61+
62+
void sleep_manager_irq_test()
63+
{
64+
{
65+
Ticker ticker1;
66+
Timer timer;
67+
68+
ticker1.attach_us(&sleep_manager_locking_irq_test, 500);
69+
70+
// run this for 5 seconds
71+
timer.start();
72+
int start = timer.read();
73+
int end = start + 5;
74+
while (timer.read() < end) {
75+
sleep_manager_locking_irq_test();
76+
}
77+
timer.stop();
78+
}
79+
80+
bool deep_sleep_allowed = sleep_manager_can_deep_sleep();
81+
TEST_ASSERT_TRUE_MESSAGE(deep_sleep_allowed, "Deep sleep should be allowed");
82+
}
83+
84+
utest::v1::status_t greentea_test_setup(const size_t number_of_cases)
85+
{
86+
GREENTEA_SETUP(30, "default_auto");
87+
return greentea_test_setup_handler(number_of_cases);
88+
}
89+
90+
Case cases[] = {
91+
Case("sleep manager HAL - locking multithreaded", sleep_manager_multithread_test),
92+
Case("sleep manager HAL - locking IRQ", sleep_manager_irq_test),
93+
};
94+
95+
Specification specification(greentea_test_setup, cases, greentea_test_teardown_handler);
96+
97+
int main() {
98+
Harness::run(specification);
99+
}

0 commit comments

Comments
 (0)