Rtos API example

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 
00002 /* mbed Microcontroller Library
00003  * Copyright (c) 2013-2015 ARM Limited
00004  *
00005  * Licensed under the Apache License, Version 2.0 (the "License");
00006  * you may not use this file except in compliance with the License.
00007  * You may obtain a copy of the License at
00008  *
00009  *     http://www.apache.org/licenses/LICENSE-2.0
00010  *
00011  * Unless required by applicable law or agreed to in writing, software
00012  * distributed under the License is distributed on an "AS IS" BASIS,
00013  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00014  * See the License for the specific language governing permissions and
00015  * limitations under the License.
00016  */
00017 #include "mbed.h"
00018 #include "greentea-client/test_env.h"
00019 #include "utest/utest.h"
00020 #include "unity/unity.h"
00021 
00022 #define ASSERT_CONTROL(value, expected_repeat, expected_timeout) { \
00023     c = value; \
00024     TEST_ASSERT_EQUAL_MESSAGE(expected_repeat, c.get_repeat(), "Repeat"); \
00025     TEST_ASSERT_EQUAL_MESSAGE(expected_timeout, c.get_timeout(), "Timeout"); }
00026 
00027 
00028 using namespace utest::v1;
00029 
00030 void test_constructors()
00031 {
00032     control_t c;
00033     TEST_ASSERT_EQUAL(REPEAT_UNDECLR, c.get_repeat());
00034     TEST_ASSERT_EQUAL(TIMEOUT_UNDECLR, c.get_timeout());
00035 
00036     ASSERT_CONTROL(control_t(REPEAT_ALL), REPEAT_ALL, TIMEOUT_UNDECLR);
00037 
00038     ASSERT_CONTROL(control_t(200), REPEAT_UNDECLR, 200);
00039 }
00040 
00041 void test_constants()
00042 {
00043     control_t c;
00044 
00045     ASSERT_CONTROL(CaseNext, REPEAT_NONE, TIMEOUT_NONE);
00046 
00047     ASSERT_CONTROL(CaseNoRepeat, REPEAT_NONE, TIMEOUT_UNDECLR);
00048 
00049     ASSERT_CONTROL(CaseRepeatAll, REPEAT_ALL, TIMEOUT_UNDECLR);
00050 
00051     ASSERT_CONTROL(CaseRepeatHandler, REPEAT_HANDLER, TIMEOUT_UNDECLR);
00052 
00053     ASSERT_CONTROL(CaseAwait, REPEAT_UNDECLR, TIMEOUT_FOREVER);
00054 
00055     ASSERT_CONTROL(CaseTimeout(0),      REPEAT_UNDECLR,      0);
00056     ASSERT_CONTROL(CaseTimeout(100000), REPEAT_UNDECLR, 100000);
00057 
00058     ASSERT_CONTROL(CaseRepeatAllOnTimeout(0),      REPEAT_ALL_ON_TIMEOUT,      0);
00059     ASSERT_CONTROL(CaseRepeatAllOnTimeout(100000), REPEAT_ALL_ON_TIMEOUT, 100000);
00060 
00061     ASSERT_CONTROL(CaseRepeatHandlerOnTimeout(0),      REPEAT_HANDLER_ON_TIMEOUT,      0);
00062     ASSERT_CONTROL(CaseRepeatHandlerOnTimeout(100000), REPEAT_HANDLER_ON_TIMEOUT, 100000);
00063 }
00064 
00065 void test_same_group_combinations()
00066 {
00067     control_t c;
00068     // arbitration within same group should not change anything
00069     ASSERT_CONTROL(CaseNext + CaseNext, REPEAT_NONE, TIMEOUT_NONE);
00070 
00071     ASSERT_CONTROL(CaseNoRepeat + CaseNoRepeat, REPEAT_NONE, TIMEOUT_UNDECLR);
00072 
00073     ASSERT_CONTROL(CaseRepeatAll + CaseRepeatAll, REPEAT_ALL, TIMEOUT_UNDECLR);
00074 
00075     ASSERT_CONTROL(CaseRepeatHandler + CaseRepeatHandler, REPEAT_HANDLER, TIMEOUT_UNDECLR);
00076 
00077     ASSERT_CONTROL(CaseAwait + CaseAwait, REPEAT_UNDECLR, TIMEOUT_FOREVER);
00078 
00079     // same group _and_ same values
00080     ASSERT_CONTROL(CaseTimeout(     0) + CaseTimeout(     0), REPEAT_UNDECLR,      0);
00081     ASSERT_CONTROL(CaseTimeout(100000) + CaseTimeout(100000), REPEAT_UNDECLR, 100000);
00082 
00083     ASSERT_CONTROL(CaseRepeatAllOnTimeout(     0) + CaseRepeatAllOnTimeout(     0), REPEAT_ALL_ON_TIMEOUT,      0);
00084     ASSERT_CONTROL(CaseRepeatAllOnTimeout(100000) + CaseRepeatAllOnTimeout(100000), REPEAT_ALL_ON_TIMEOUT, 100000);
00085 
00086     ASSERT_CONTROL(CaseRepeatHandlerOnTimeout(     0) + CaseRepeatHandlerOnTimeout(     0), REPEAT_HANDLER_ON_TIMEOUT,      0);
00087     ASSERT_CONTROL(CaseRepeatHandlerOnTimeout(100000) + CaseRepeatHandlerOnTimeout(100000), REPEAT_HANDLER_ON_TIMEOUT, 100000);
00088 
00089     // same group but _different_ values
00090     // stricter value should win
00091     ASSERT_CONTROL(CaseTimeout(100) + CaseTimeout(   12), REPEAT_UNDECLR,  12);
00092     ASSERT_CONTROL(CaseTimeout(267) + CaseTimeout(36756), REPEAT_UNDECLR, 267);
00093 
00094     ASSERT_CONTROL(CaseRepeatAllOnTimeout(12145) + CaseRepeatAllOnTimeout(   592), REPEAT_ALL_ON_TIMEOUT,  592);
00095     ASSERT_CONTROL(CaseRepeatAllOnTimeout( 3593) + CaseRepeatAllOnTimeout(294523), REPEAT_ALL_ON_TIMEOUT, 3593);
00096 
00097     ASSERT_CONTROL(CaseRepeatHandlerOnTimeout(124001) + CaseRepeatHandlerOnTimeout(49610), REPEAT_HANDLER_ON_TIMEOUT, 49610);
00098     ASSERT_CONTROL(CaseRepeatHandlerOnTimeout(    47) + CaseRepeatHandlerOnTimeout(  209), REPEAT_HANDLER_ON_TIMEOUT,    47);
00099 }
00100 
00101 void test_different_group_combinations()
00102 {
00103     // different group and different value
00104     control_t c;
00105 
00106     // Matrix with CaseNext
00107     // CaseNext + CaseNoRepeat => CaseNext
00108     ASSERT_CONTROL(CaseNext + CaseNoRepeat, REPEAT_NONE, TIMEOUT_NONE);
00109     ASSERT_CONTROL(CaseNoRepeat + CaseNext, REPEAT_NONE, TIMEOUT_NONE);
00110 
00111     // CaseNext + CaseRepeatAll => CaseNext
00112     ASSERT_CONTROL(CaseNext + CaseRepeatAll, REPEAT_NONE, TIMEOUT_NONE);
00113     ASSERT_CONTROL(CaseRepeatAll + CaseNext, REPEAT_NONE, TIMEOUT_NONE);
00114 
00115     // CaseNext + CaseRepeatHandler => CaseNext
00116     ASSERT_CONTROL(CaseNext + CaseRepeatHandler, REPEAT_NONE, TIMEOUT_NONE);
00117     ASSERT_CONTROL(CaseRepeatHandler + CaseNext, REPEAT_NONE, TIMEOUT_NONE);
00118 
00119     // CaseNext + CaseNoTimeout => CaseNext
00120     ASSERT_CONTROL(CaseNext + CaseNoTimeout, REPEAT_NONE, TIMEOUT_NONE);
00121     ASSERT_CONTROL(CaseNoTimeout + CaseNext, REPEAT_NONE, TIMEOUT_NONE);
00122 
00123     // CaseNext + CaseAwait => CaseNext
00124     ASSERT_CONTROL(CaseNext + CaseAwait, REPEAT_NONE, TIMEOUT_NONE);
00125     ASSERT_CONTROL(CaseAwait + CaseNext, REPEAT_NONE, TIMEOUT_NONE);
00126 
00127     // CaseNext + CaseTimeout => CaseNext
00128     ASSERT_CONTROL(CaseNext + CaseTimeout(42), REPEAT_NONE, TIMEOUT_NONE);
00129     ASSERT_CONTROL(CaseTimeout(42) + CaseNext, REPEAT_NONE, TIMEOUT_NONE);
00130 
00131     // CaseNext + CaseRepeatAllOnTimeout => CaseNext
00132     ASSERT_CONTROL(CaseNext + CaseRepeatAllOnTimeout(42), REPEAT_NONE, TIMEOUT_NONE);
00133     ASSERT_CONTROL(CaseRepeatAllOnTimeout(42) + CaseNext, REPEAT_NONE, TIMEOUT_NONE);
00134 
00135     // CaseNext + CaseRepeatHandlerOnTimeout => CaseNext
00136     ASSERT_CONTROL(CaseNext + CaseRepeatHandlerOnTimeout(42), REPEAT_NONE, TIMEOUT_NONE);
00137     ASSERT_CONTROL(CaseRepeatHandlerOnTimeout(42) + CaseNext, REPEAT_NONE, TIMEOUT_NONE);
00138 
00139     // Matrix with CaseNoRepeat
00140     // CaseNoRepeat + CaseRepeatHandler => CaseNoRepeat
00141     ASSERT_CONTROL(CaseNoRepeat + CaseRepeatHandler, REPEAT_NONE, TIMEOUT_UNDECLR);
00142     ASSERT_CONTROL(CaseRepeatHandler + CaseNoRepeat, REPEAT_NONE, TIMEOUT_UNDECLR);
00143 
00144     // CaseNoRepeat + CaseNoTimeout => CaseNext
00145     ASSERT_CONTROL(CaseNoRepeat + CaseNoTimeout, REPEAT_NONE, TIMEOUT_NONE);
00146     ASSERT_CONTROL(CaseNoTimeout + CaseNoRepeat, REPEAT_NONE, TIMEOUT_NONE);
00147 
00148     // CaseNoRepeat + CaseAwait => REPEAT_NONE + TIMEOUT_FOREVER
00149     ASSERT_CONTROL(CaseNoRepeat + CaseAwait, REPEAT_NONE, TIMEOUT_FOREVER);
00150     ASSERT_CONTROL(CaseAwait + CaseNoRepeat, REPEAT_NONE, TIMEOUT_FOREVER);
00151 
00152     // CaseNoRepeat + CaseTimeout => REPEAT_NONE + timeout
00153     ASSERT_CONTROL(CaseNoRepeat + CaseTimeout(42), REPEAT_NONE, 42);
00154     ASSERT_CONTROL(CaseTimeout(42) + CaseNoRepeat, REPEAT_NONE, 42);
00155 
00156     // CaseNoRepeat + CaseRepeatAllOnTimeout => REPEAT_NONE + timeout
00157     ASSERT_CONTROL(CaseNoRepeat + CaseRepeatAllOnTimeout(42), REPEAT_NONE, 42);
00158     ASSERT_CONTROL(CaseRepeatAllOnTimeout(42) + CaseNoRepeat, REPEAT_NONE, 42);
00159 
00160     // CaseNoRepeat + CaseRepeatHandlerOnTimeout => REPEAT_NONE + timeout
00161     ASSERT_CONTROL(CaseNoRepeat + CaseRepeatHandlerOnTimeout(42), REPEAT_NONE, 42);
00162     ASSERT_CONTROL(CaseRepeatHandlerOnTimeout(42) + CaseNoRepeat, REPEAT_NONE, 42);
00163 
00164     // Matrix with CaseRepeatAll
00165     // CaseRepeatAll + CaseRepeatHandler => CaseRepeatAll
00166     ASSERT_CONTROL(CaseRepeatAll + CaseRepeatHandler, REPEAT_ALL, TIMEOUT_UNDECLR);
00167     ASSERT_CONTROL(CaseRepeatHandler + CaseRepeatAll, REPEAT_ALL, TIMEOUT_UNDECLR);
00168 
00169     // CaseRepeatAll + CaseNoTimeout => REPEAT_ALL + TIMEOUT_NONE
00170     ASSERT_CONTROL(CaseRepeatAll + CaseNoTimeout, REPEAT_ALL, TIMEOUT_NONE);
00171     ASSERT_CONTROL(CaseNoTimeout + CaseRepeatAll, REPEAT_ALL, TIMEOUT_NONE);
00172 
00173     // CaseRepeatAll + CaseAwait => REPEAT_ALL + TIMEOUT_FOREVER
00174     ASSERT_CONTROL(CaseRepeatAll + CaseAwait, REPEAT_ALL, TIMEOUT_FOREVER);
00175     ASSERT_CONTROL(CaseAwait + CaseRepeatAll, REPEAT_ALL, TIMEOUT_FOREVER);
00176 
00177     // CaseRepeatAll + CaseTimeout => REPEAT_ALL + timeout
00178     ASSERT_CONTROL(CaseRepeatAll + CaseTimeout(42), REPEAT_ALL, 42);
00179     ASSERT_CONTROL(CaseTimeout(42) + CaseRepeatAll, REPEAT_ALL, 42);
00180 
00181     // CaseRepeatAll + CaseRepeatAllOnTimeout => (REPEAT_ALL | REPEAT_ON_TIMEOUT) + timeout
00182     ASSERT_CONTROL(CaseRepeatAll + CaseRepeatAllOnTimeout(42), (REPEAT_ALL | REPEAT_ON_TIMEOUT), 42);
00183     ASSERT_CONTROL(CaseRepeatAllOnTimeout(42) + CaseRepeatAll, (REPEAT_ALL | REPEAT_ON_TIMEOUT), 42);
00184 
00185     // CaseRepeatAll + CaseRepeatHandlerOnTimeout => (REPEAT_ALL | REPEAT_ON_TIMEOUT) + timeout
00186     ASSERT_CONTROL(CaseRepeatAll + CaseRepeatHandlerOnTimeout(42), REPEAT_ALL | REPEAT_ON_TIMEOUT, 42);
00187     ASSERT_CONTROL(CaseRepeatHandlerOnTimeout(42) + CaseRepeatAll, REPEAT_ALL | REPEAT_ON_TIMEOUT, 42);
00188 
00189     // Matrix with CaseRepeatHandler
00190     // CaseRepeatHandler + CaseNoTimeout => REPEAT_HANDLER + TIMEOUT_NONE
00191     ASSERT_CONTROL(CaseRepeatHandler + CaseNoTimeout, REPEAT_HANDLER, TIMEOUT_NONE);
00192     ASSERT_CONTROL(CaseNoTimeout + CaseRepeatHandler, REPEAT_HANDLER, TIMEOUT_NONE);
00193 
00194     // CaseRepeatHandler + CaseAwait => REPEAT_HANDLER + TIMEOUT_FOREVER
00195     ASSERT_CONTROL(CaseRepeatHandler + CaseAwait, REPEAT_HANDLER, TIMEOUT_FOREVER);
00196     ASSERT_CONTROL(CaseAwait + CaseRepeatHandler, REPEAT_HANDLER, TIMEOUT_FOREVER);
00197 
00198     // CaseRepeatHandler + CaseTimeout => REPEAT_HANDLER + timeout
00199     ASSERT_CONTROL(CaseRepeatHandler + CaseTimeout(42), REPEAT_HANDLER, 42);
00200     ASSERT_CONTROL(CaseTimeout(42) + CaseRepeatHandler, REPEAT_HANDLER, 42);
00201 
00202     // CaseRepeatHandler + CaseRepeatAllOnTimeout => (REPEAT_ALL | REPEAT_ON_TIMEOUT) + timeout
00203     ASSERT_CONTROL(CaseRepeatHandler + CaseRepeatAllOnTimeout(42), REPEAT_ALL | REPEAT_ON_TIMEOUT, 42);
00204     ASSERT_CONTROL(CaseRepeatAllOnTimeout(42) + CaseRepeatHandler, REPEAT_ALL | REPEAT_ON_TIMEOUT, 42);
00205 
00206     // CaseRepeatHandler + CaseRepeatHandlerOnTimeout => (REPEAT_HANDLER | REPEAT_ON_TIMEOUT) + timeout
00207     ASSERT_CONTROL(CaseRepeatHandler + CaseRepeatHandlerOnTimeout(42), REPEAT_HANDLER | REPEAT_ON_TIMEOUT, 42);
00208     ASSERT_CONTROL(CaseRepeatHandlerOnTimeout(42) + CaseRepeatHandler, REPEAT_HANDLER | REPEAT_ON_TIMEOUT, 42);
00209 
00210     // Matrix with CaseNoTimeout
00211     // CaseNoTimeout + CaseAwait => CaseNoTimeout
00212     ASSERT_CONTROL(CaseNoTimeout + CaseAwait, REPEAT_UNDECLR, TIMEOUT_NONE);
00213     ASSERT_CONTROL(CaseAwait + CaseNoTimeout, REPEAT_UNDECLR, TIMEOUT_NONE);
00214 
00215     // CaseNoTimeout + CaseTimeout => CaseNoTimeout
00216     ASSERT_CONTROL(CaseNoTimeout + CaseTimeout(42), REPEAT_UNDECLR, TIMEOUT_NONE);
00217     ASSERT_CONTROL(CaseTimeout(42) + CaseNoTimeout, REPEAT_UNDECLR, TIMEOUT_NONE);
00218 
00219     // CaseNoTimeout + CaseRepeatAllOnTimeout => REPEAT_SETUP_TEARDOWN + TIMEOUT_NONE
00220     ASSERT_CONTROL(CaseNoTimeout + CaseRepeatAllOnTimeout(42), REPEAT_SETUP_TEARDOWN, TIMEOUT_NONE);
00221     ASSERT_CONTROL(CaseRepeatAllOnTimeout(42) + CaseNoTimeout, REPEAT_SETUP_TEARDOWN, TIMEOUT_NONE);
00222 
00223     // CaseNoTimeout + CaseRepeatHandlerOnTimeout => REPEAT_CASE_ONLY + TIMEOUT_NONE
00224     ASSERT_CONTROL(CaseNoTimeout + CaseRepeatHandlerOnTimeout(42), REPEAT_CASE_ONLY, TIMEOUT_NONE);
00225     ASSERT_CONTROL(CaseRepeatHandlerOnTimeout(42) + CaseNoTimeout, REPEAT_CASE_ONLY, TIMEOUT_NONE);
00226 
00227     // Matrix with CaseAwait
00228     // CaseAwait + CaseTimeout => CaseTimeout
00229     ASSERT_CONTROL(CaseAwait + CaseTimeout(42), REPEAT_UNDECLR, 42);
00230     ASSERT_CONTROL(CaseTimeout(42) + CaseAwait, REPEAT_UNDECLR, 42);
00231 
00232     // CaseAwait + CaseRepeatAllOnTimeout => CaseRepeatAllOnTimeout
00233     ASSERT_CONTROL(CaseAwait + CaseRepeatAllOnTimeout(42), REPEAT_ALL_ON_TIMEOUT, 42);
00234     ASSERT_CONTROL(CaseRepeatAllOnTimeout(42) + CaseAwait, REPEAT_ALL_ON_TIMEOUT, 42);
00235 
00236     // CaseAwait + CaseRepeatHandlerOnTimeout => CaseRepeatHandlerOnTimeout
00237     ASSERT_CONTROL(CaseAwait + CaseRepeatHandlerOnTimeout(42), REPEAT_HANDLER_ON_TIMEOUT, 42);
00238     ASSERT_CONTROL(CaseRepeatHandlerOnTimeout(42) + CaseAwait, REPEAT_HANDLER_ON_TIMEOUT, 42);
00239 
00240     // Matrix with CaseTimeout
00241     // CaseTimeout + CaseRepeatAllOnTimeout => CaseRepeatAllOnTimeout with lower timeout
00242     ASSERT_CONTROL(CaseTimeout(21) + CaseRepeatAllOnTimeout(42), REPEAT_ALL_ON_TIMEOUT, 21);
00243     ASSERT_CONTROL(CaseRepeatAllOnTimeout(42) + CaseTimeout(21), REPEAT_ALL_ON_TIMEOUT, 21);
00244 
00245     // CaseAwait + CaseRepeatHandlerOnTimeout => CaseRepeatHandlerOnTimeout with lower timeout
00246     ASSERT_CONTROL(CaseTimeout(21) + CaseRepeatHandlerOnTimeout(42), REPEAT_HANDLER_ON_TIMEOUT, 21);
00247     ASSERT_CONTROL(CaseRepeatHandlerOnTimeout(42) + CaseTimeout(21), REPEAT_HANDLER_ON_TIMEOUT, 21);
00248 
00249     // Matrix with CaseRepeatAllOnTimeout
00250     // CaseRepeatAllOnTimeout + CaseRepeatHandlerOnTimeout => CaseRepeatAllOnTimeout with lower timeout
00251     ASSERT_CONTROL(CaseRepeatAllOnTimeout(21) + CaseRepeatHandlerOnTimeout(42), REPEAT_ALL_ON_TIMEOUT, 21);
00252     ASSERT_CONTROL(CaseRepeatHandlerOnTimeout(42) + CaseRepeatAllOnTimeout(21), REPEAT_ALL_ON_TIMEOUT, 21);
00253 }
00254 
00255 Case cases[] =
00256 {
00257     Case("Testing constructors", test_constructors),
00258     Case("Testing constants", test_constants),
00259     Case("Testing combinations of same group", test_same_group_combinations),
00260     Case("Testing combinations of different group", test_different_group_combinations)
00261 };
00262 
00263 utest::v1::status_t greentea_setup(const size_t number_of_cases)
00264 {
00265     GREENTEA_SETUP(15, "default_auto");
00266 
00267     return greentea_test_setup_handler(number_of_cases);
00268 };
00269 Specification specification(greentea_setup, cases, greentea_continue_handlers);
00270 
00271 int main()
00272 {
00273     // Run the specification only AFTER setting the custom scheduler(if required).
00274     Harness::run(specification);
00275 }