ublox-at-cellular-interface
TESTS/unit_tests/dynamic/main.cpp@14:e7dcf3388403, 2018-03-02 (annotated)
- Committer:
- RobMeades
- Date:
- Fri Mar 02 13:28:32 2018 +0000
- Revision:
- 14:e7dcf3388403
- Child:
- 21:2a500a881a5a
Make sure that the event handler thread is closed cleanly in all cases and add tests that this is the case, both for sleep and for memory.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
RobMeades | 14:e7dcf3388403 | 1 | #include "UbloxATCellularInterface.h" |
RobMeades | 14:e7dcf3388403 | 2 | #include "greentea-client/test_env.h" |
RobMeades | 14:e7dcf3388403 | 3 | #include "unity.h" |
RobMeades | 14:e7dcf3388403 | 4 | #include "utest.h" |
RobMeades | 14:e7dcf3388403 | 5 | #include "UDPSocket.h" |
RobMeades | 14:e7dcf3388403 | 6 | #include "mbed_stats.h" |
RobMeades | 14:e7dcf3388403 | 7 | #ifdef FEATURE_COMMON_PAL |
RobMeades | 14:e7dcf3388403 | 8 | #include "mbed_trace.h" |
RobMeades | 14:e7dcf3388403 | 9 | #define TRACE_GROUP "TEST" |
RobMeades | 14:e7dcf3388403 | 10 | #else |
RobMeades | 14:e7dcf3388403 | 11 | #define tr_debug(format, ...) debug(format "\n", ## __VA_ARGS__) |
RobMeades | 14:e7dcf3388403 | 12 | #define tr_info(format, ...) debug(format "\n", ## __VA_ARGS__) |
RobMeades | 14:e7dcf3388403 | 13 | #define tr_warn(format, ...) debug(format "\n", ## __VA_ARGS__) |
RobMeades | 14:e7dcf3388403 | 14 | #define tr_error(format, ...) debug(format "\n", ## __VA_ARGS__) |
RobMeades | 14:e7dcf3388403 | 15 | #endif |
RobMeades | 14:e7dcf3388403 | 16 | |
RobMeades | 14:e7dcf3388403 | 17 | using namespace utest::v1; |
RobMeades | 14:e7dcf3388403 | 18 | |
RobMeades | 14:e7dcf3388403 | 19 | // IMPORTANT!!! if you make a change to the tests here you should |
RobMeades | 14:e7dcf3388403 | 20 | // check whether the same change should be made to the tests under |
RobMeades | 14:e7dcf3388403 | 21 | // the PPP interface. |
RobMeades | 14:e7dcf3388403 | 22 | |
RobMeades | 14:e7dcf3388403 | 23 | // NOTE: these test are only as reliable as UDP across the internet |
RobMeades | 14:e7dcf3388403 | 24 | // over a radio link. The tests expect an NTP server to respond |
RobMeades | 14:e7dcf3388403 | 25 | // to UDP packets and, if configured, an echo server to respond |
RobMeades | 14:e7dcf3388403 | 26 | // to UDP packets. This simply may not happen. Please be patient. |
RobMeades | 14:e7dcf3388403 | 27 | |
RobMeades | 14:e7dcf3388403 | 28 | // ---------------------------------------------------------------- |
RobMeades | 14:e7dcf3388403 | 29 | // COMPILE-TIME MACROS |
RobMeades | 14:e7dcf3388403 | 30 | // ---------------------------------------------------------------- |
RobMeades | 14:e7dcf3388403 | 31 | |
RobMeades | 14:e7dcf3388403 | 32 | // These macros can be overridden with an mbed_app.json file and |
RobMeades | 14:e7dcf3388403 | 33 | // contents of the following form: |
RobMeades | 14:e7dcf3388403 | 34 | // |
RobMeades | 14:e7dcf3388403 | 35 | //{ |
RobMeades | 14:e7dcf3388403 | 36 | // "config": { |
RobMeades | 14:e7dcf3388403 | 37 | // "default-pin": { |
RobMeades | 14:e7dcf3388403 | 38 | // "value": "\"1234\"" |
RobMeades | 14:e7dcf3388403 | 39 | // } |
RobMeades | 14:e7dcf3388403 | 40 | //} |
RobMeades | 14:e7dcf3388403 | 41 | // |
RobMeades | 14:e7dcf3388403 | 42 | // See the template_mbed_app.txt in this directory for a fuller example. |
RobMeades | 14:e7dcf3388403 | 43 | |
RobMeades | 14:e7dcf3388403 | 44 | // Whether we can do the mbed stats tests or not |
RobMeades | 14:e7dcf3388403 | 45 | #ifndef MBED_HEAP_STATS_ENABLED |
RobMeades | 14:e7dcf3388403 | 46 | # define MBED_HEAP_STATS_ENABLED 0 |
RobMeades | 14:e7dcf3388403 | 47 | #endif |
RobMeades | 14:e7dcf3388403 | 48 | |
RobMeades | 14:e7dcf3388403 | 49 | // Whether debug trace is on |
RobMeades | 14:e7dcf3388403 | 50 | #ifndef MBED_CONF_APP_DEBUG_ON |
RobMeades | 14:e7dcf3388403 | 51 | # define MBED_CONF_APP_DEBUG_ON false |
RobMeades | 14:e7dcf3388403 | 52 | #endif |
RobMeades | 14:e7dcf3388403 | 53 | |
RobMeades | 14:e7dcf3388403 | 54 | // The credentials of the SIM in the board. |
RobMeades | 14:e7dcf3388403 | 55 | #ifndef MBED_CONF_APP_DEFAULT_PIN |
RobMeades | 14:e7dcf3388403 | 56 | // Note: if PIN is enabled on your SIM, or you wish to run the SIM PIN change |
RobMeades | 14:e7dcf3388403 | 57 | // tests, you must define the PIN for your SIM (see note above on using |
RobMeades | 14:e7dcf3388403 | 58 | // mbed_app.json to do so). |
RobMeades | 14:e7dcf3388403 | 59 | # define MBED_CONF_APP_DEFAULT_PIN "0000" |
RobMeades | 14:e7dcf3388403 | 60 | #endif |
RobMeades | 14:e7dcf3388403 | 61 | #ifndef MBED_CONF_APP_APN |
RobMeades | 14:e7dcf3388403 | 62 | # define MBED_CONF_APP_APN NULL |
RobMeades | 14:e7dcf3388403 | 63 | #endif |
RobMeades | 14:e7dcf3388403 | 64 | #ifndef MBED_CONF_APP_USERNAME |
RobMeades | 14:e7dcf3388403 | 65 | # define MBED_CONF_APP_USERNAME NULL |
RobMeades | 14:e7dcf3388403 | 66 | #endif |
RobMeades | 14:e7dcf3388403 | 67 | #ifndef MBED_CONF_APP_PASSWORD |
RobMeades | 14:e7dcf3388403 | 68 | # define MBED_CONF_APP_PASSWORD NULL |
RobMeades | 14:e7dcf3388403 | 69 | #endif |
RobMeades | 14:e7dcf3388403 | 70 | |
RobMeades | 14:e7dcf3388403 | 71 | // Servers and ports |
RobMeades | 14:e7dcf3388403 | 72 | #ifndef MBED_CONF_APP_NTP_SERVER |
RobMeades | 14:e7dcf3388403 | 73 | # define MBED_CONF_APP_NTP_SERVER "2.pool.ntp.org" |
RobMeades | 14:e7dcf3388403 | 74 | #else |
RobMeades | 14:e7dcf3388403 | 75 | # ifndef MBED_CONF_APP_NTP_PORT |
RobMeades | 14:e7dcf3388403 | 76 | # error "MBED_CONF_APP_NTP_PORT must be defined if MBED_CONF_APP_NTP_SERVER is defined" |
RobMeades | 14:e7dcf3388403 | 77 | # endif |
RobMeades | 14:e7dcf3388403 | 78 | #endif |
RobMeades | 14:e7dcf3388403 | 79 | #ifndef MBED_CONF_APP_NTP_PORT |
RobMeades | 14:e7dcf3388403 | 80 | # define MBED_CONF_APP_NTP_PORT 123 |
RobMeades | 14:e7dcf3388403 | 81 | #endif |
RobMeades | 14:e7dcf3388403 | 82 | |
RobMeades | 14:e7dcf3388403 | 83 | // UDP packet size limit for testing |
RobMeades | 14:e7dcf3388403 | 84 | #ifndef MBED_CONF_APP_UDP_MAX_PACKET_SIZE |
RobMeades | 14:e7dcf3388403 | 85 | # define MBED_CONF_APP_UDP_MAX_PACKET_SIZE 1024 |
RobMeades | 14:e7dcf3388403 | 86 | #endif |
RobMeades | 14:e7dcf3388403 | 87 | |
RobMeades | 14:e7dcf3388403 | 88 | // The number of retries for UDP exchanges |
RobMeades | 14:e7dcf3388403 | 89 | #define NUM_UDP_RETRIES 5 |
RobMeades | 14:e7dcf3388403 | 90 | |
RobMeades | 14:e7dcf3388403 | 91 | // ---------------------------------------------------------------- |
RobMeades | 14:e7dcf3388403 | 92 | // PRIVATE VARIABLES |
RobMeades | 14:e7dcf3388403 | 93 | // ---------------------------------------------------------------- |
RobMeades | 14:e7dcf3388403 | 94 | |
RobMeades | 14:e7dcf3388403 | 95 | #ifdef FEATURE_COMMON_PAL |
RobMeades | 14:e7dcf3388403 | 96 | // Lock for debug prints |
RobMeades | 14:e7dcf3388403 | 97 | static Mutex mtx; |
RobMeades | 14:e7dcf3388403 | 98 | #endif |
RobMeades | 14:e7dcf3388403 | 99 | |
RobMeades | 14:e7dcf3388403 | 100 | // Connection flag |
RobMeades | 14:e7dcf3388403 | 101 | static bool connection_has_gone_down = false; |
RobMeades | 14:e7dcf3388403 | 102 | |
RobMeades | 14:e7dcf3388403 | 103 | // ---------------------------------------------------------------- |
RobMeades | 14:e7dcf3388403 | 104 | // PRIVATE FUNCTIONS |
RobMeades | 14:e7dcf3388403 | 105 | // ---------------------------------------------------------------- |
RobMeades | 14:e7dcf3388403 | 106 | |
RobMeades | 14:e7dcf3388403 | 107 | #ifdef FEATURE_COMMON_PAL |
RobMeades | 14:e7dcf3388403 | 108 | // Locks for debug prints |
RobMeades | 14:e7dcf3388403 | 109 | static void lock() |
RobMeades | 14:e7dcf3388403 | 110 | { |
RobMeades | 14:e7dcf3388403 | 111 | mtx.lock(); |
RobMeades | 14:e7dcf3388403 | 112 | } |
RobMeades | 14:e7dcf3388403 | 113 | |
RobMeades | 14:e7dcf3388403 | 114 | static void unlock() |
RobMeades | 14:e7dcf3388403 | 115 | { |
RobMeades | 14:e7dcf3388403 | 116 | mtx.unlock(); |
RobMeades | 14:e7dcf3388403 | 117 | } |
RobMeades | 14:e7dcf3388403 | 118 | #endif |
RobMeades | 14:e7dcf3388403 | 119 | |
RobMeades | 14:e7dcf3388403 | 120 | // Callback in case the connection goes down |
RobMeades | 14:e7dcf3388403 | 121 | static void connection_down_cb(nsapi_error_t err) |
RobMeades | 14:e7dcf3388403 | 122 | { |
RobMeades | 14:e7dcf3388403 | 123 | connection_has_gone_down = true; |
RobMeades | 14:e7dcf3388403 | 124 | } |
RobMeades | 14:e7dcf3388403 | 125 | |
RobMeades | 14:e7dcf3388403 | 126 | // Get NTP time from a socket |
RobMeades | 14:e7dcf3388403 | 127 | static void do_ntp_sock (UDPSocket *sock, SocketAddress ntp_address) |
RobMeades | 14:e7dcf3388403 | 128 | { |
RobMeades | 14:e7dcf3388403 | 129 | char ntp_values[48] = { 0 }; |
RobMeades | 14:e7dcf3388403 | 130 | time_t timestamp = 0; |
RobMeades | 14:e7dcf3388403 | 131 | struct tm *localTime; |
RobMeades | 14:e7dcf3388403 | 132 | char timeString[25]; |
RobMeades | 14:e7dcf3388403 | 133 | time_t TIME1970 = 2208988800U; |
RobMeades | 14:e7dcf3388403 | 134 | int len; |
RobMeades | 14:e7dcf3388403 | 135 | bool comms_done = false; |
RobMeades | 14:e7dcf3388403 | 136 | |
RobMeades | 14:e7dcf3388403 | 137 | ntp_values[0] = '\x1b'; |
RobMeades | 14:e7dcf3388403 | 138 | |
RobMeades | 14:e7dcf3388403 | 139 | // Retry this a few times, don't want to fail due to a flaky link |
RobMeades | 14:e7dcf3388403 | 140 | for (unsigned int x = 0; !comms_done && (x < NUM_UDP_RETRIES); x++) { |
RobMeades | 14:e7dcf3388403 | 141 | sock->sendto(ntp_address, (void*) ntp_values, sizeof(ntp_values)); |
RobMeades | 14:e7dcf3388403 | 142 | len = sock->recvfrom(&ntp_address, (void*) ntp_values, sizeof(ntp_values)); |
RobMeades | 14:e7dcf3388403 | 143 | if (len > 0) { |
RobMeades | 14:e7dcf3388403 | 144 | comms_done = true; |
RobMeades | 14:e7dcf3388403 | 145 | } |
RobMeades | 14:e7dcf3388403 | 146 | } |
RobMeades | 14:e7dcf3388403 | 147 | TEST_ASSERT (comms_done); |
RobMeades | 14:e7dcf3388403 | 148 | |
RobMeades | 14:e7dcf3388403 | 149 | tr_debug("UDP: %d byte(s) returned by NTP server.", len); |
RobMeades | 14:e7dcf3388403 | 150 | if (len >= 43) { |
RobMeades | 14:e7dcf3388403 | 151 | timestamp |= ((int) *(ntp_values + 40)) << 24; |
RobMeades | 14:e7dcf3388403 | 152 | timestamp |= ((int) *(ntp_values + 41)) << 16; |
RobMeades | 14:e7dcf3388403 | 153 | timestamp |= ((int) *(ntp_values + 42)) << 8; |
RobMeades | 14:e7dcf3388403 | 154 | timestamp |= ((int) *(ntp_values + 43)); |
RobMeades | 14:e7dcf3388403 | 155 | timestamp -= TIME1970; |
RobMeades | 14:e7dcf3388403 | 156 | srand (timestamp); |
RobMeades | 14:e7dcf3388403 | 157 | tr_debug("srand() called"); |
RobMeades | 14:e7dcf3388403 | 158 | localTime = localtime(×tamp); |
RobMeades | 14:e7dcf3388403 | 159 | if (localTime) { |
RobMeades | 14:e7dcf3388403 | 160 | if (strftime(timeString, sizeof(timeString), "%a %b %d %H:%M:%S %Y", localTime) > 0) { |
RobMeades | 14:e7dcf3388403 | 161 | printf("NTP timestamp is %s.\n", timeString); |
RobMeades | 14:e7dcf3388403 | 162 | } |
RobMeades | 14:e7dcf3388403 | 163 | } |
RobMeades | 14:e7dcf3388403 | 164 | } |
RobMeades | 14:e7dcf3388403 | 165 | } |
RobMeades | 14:e7dcf3388403 | 166 | |
RobMeades | 14:e7dcf3388403 | 167 | // Get NTP time |
RobMeades | 14:e7dcf3388403 | 168 | static void do_ntp(UbloxATCellularInterface *interface) |
RobMeades | 14:e7dcf3388403 | 169 | { |
RobMeades | 14:e7dcf3388403 | 170 | UDPSocket sock; |
RobMeades | 14:e7dcf3388403 | 171 | SocketAddress host_address; |
RobMeades | 14:e7dcf3388403 | 172 | |
RobMeades | 14:e7dcf3388403 | 173 | TEST_ASSERT(sock.open(interface) == 0) |
RobMeades | 14:e7dcf3388403 | 174 | |
RobMeades | 14:e7dcf3388403 | 175 | TEST_ASSERT(interface->gethostbyname(MBED_CONF_APP_NTP_SERVER, &host_address) == 0); |
RobMeades | 14:e7dcf3388403 | 176 | host_address.set_port(MBED_CONF_APP_NTP_PORT); |
RobMeades | 14:e7dcf3388403 | 177 | |
RobMeades | 14:e7dcf3388403 | 178 | tr_debug("UDP: NIST server %s address: %s on port %d.", MBED_CONF_APP_NTP_SERVER, |
RobMeades | 14:e7dcf3388403 | 179 | host_address.get_ip_address(), host_address.get_port()); |
RobMeades | 14:e7dcf3388403 | 180 | |
RobMeades | 14:e7dcf3388403 | 181 | sock.set_timeout(10000); |
RobMeades | 14:e7dcf3388403 | 182 | |
RobMeades | 14:e7dcf3388403 | 183 | do_ntp_sock(&sock, host_address); |
RobMeades | 14:e7dcf3388403 | 184 | |
RobMeades | 14:e7dcf3388403 | 185 | sock.close(); |
RobMeades | 14:e7dcf3388403 | 186 | } |
RobMeades | 14:e7dcf3388403 | 187 | |
RobMeades | 14:e7dcf3388403 | 188 | // Use a connection, checking that it is good |
RobMeades | 14:e7dcf3388403 | 189 | static void use_connection(UbloxATCellularInterface *interface) |
RobMeades | 14:e7dcf3388403 | 190 | { |
RobMeades | 14:e7dcf3388403 | 191 | const char * ip_address = interface->get_ip_address(); |
RobMeades | 14:e7dcf3388403 | 192 | const char * net_mask = interface->get_netmask(); |
RobMeades | 14:e7dcf3388403 | 193 | const char * gateway = interface->get_gateway(); |
RobMeades | 14:e7dcf3388403 | 194 | |
RobMeades | 14:e7dcf3388403 | 195 | TEST_ASSERT(interface->is_connected()); |
RobMeades | 14:e7dcf3388403 | 196 | |
RobMeades | 14:e7dcf3388403 | 197 | TEST_ASSERT(ip_address != NULL); |
RobMeades | 14:e7dcf3388403 | 198 | tr_debug ("IP address %s.", ip_address); |
RobMeades | 14:e7dcf3388403 | 199 | TEST_ASSERT(net_mask == NULL); |
RobMeades | 14:e7dcf3388403 | 200 | tr_debug ("Net mask %s.", net_mask); |
RobMeades | 14:e7dcf3388403 | 201 | TEST_ASSERT(gateway != NULL); |
RobMeades | 14:e7dcf3388403 | 202 | tr_debug ("Gateway %s.", gateway); |
RobMeades | 14:e7dcf3388403 | 203 | |
RobMeades | 14:e7dcf3388403 | 204 | do_ntp(interface); |
RobMeades | 14:e7dcf3388403 | 205 | TEST_ASSERT(!connection_has_gone_down); |
RobMeades | 14:e7dcf3388403 | 206 | } |
RobMeades | 14:e7dcf3388403 | 207 | |
RobMeades | 14:e7dcf3388403 | 208 | // Drop a connection and check that it has dropped |
RobMeades | 14:e7dcf3388403 | 209 | static void drop_connection(UbloxATCellularInterface *interface) |
RobMeades | 14:e7dcf3388403 | 210 | { |
RobMeades | 14:e7dcf3388403 | 211 | TEST_ASSERT(interface->disconnect() == 0); |
RobMeades | 14:e7dcf3388403 | 212 | TEST_ASSERT(connection_has_gone_down); |
RobMeades | 14:e7dcf3388403 | 213 | connection_has_gone_down = false; |
RobMeades | 14:e7dcf3388403 | 214 | TEST_ASSERT(!interface->is_connected()); |
RobMeades | 14:e7dcf3388403 | 215 | } |
RobMeades | 14:e7dcf3388403 | 216 | |
RobMeades | 14:e7dcf3388403 | 217 | // ---------------------------------------------------------------- |
RobMeades | 14:e7dcf3388403 | 218 | // TESTS |
RobMeades | 14:e7dcf3388403 | 219 | // ---------------------------------------------------------------- |
RobMeades | 14:e7dcf3388403 | 220 | |
RobMeades | 14:e7dcf3388403 | 221 | // Test that sleep is possible both |
RobMeades | 14:e7dcf3388403 | 222 | // before and after running the driver. |
RobMeades | 14:e7dcf3388403 | 223 | void test_sleep() { |
RobMeades | 14:e7dcf3388403 | 224 | |
RobMeades | 14:e7dcf3388403 | 225 | TEST_ASSERT(sleep_manager_can_deep_sleep() == true); |
RobMeades | 14:e7dcf3388403 | 226 | |
RobMeades | 14:e7dcf3388403 | 227 | // Create an instance of the cellular interface |
RobMeades | 14:e7dcf3388403 | 228 | UbloxATCellularInterface *interface = |
RobMeades | 14:e7dcf3388403 | 229 | new UbloxATCellularInterface(MDMTXD, MDMRXD, |
RobMeades | 14:e7dcf3388403 | 230 | MBED_CONF_UBLOX_CELL_BAUD_RATE, |
RobMeades | 14:e7dcf3388403 | 231 | MBED_CONF_APP_DEBUG_ON); |
RobMeades | 14:e7dcf3388403 | 232 | interface->connection_status_cb(connection_down_cb); |
RobMeades | 14:e7dcf3388403 | 233 | |
RobMeades | 14:e7dcf3388403 | 234 | // Use it |
RobMeades | 14:e7dcf3388403 | 235 | TEST_ASSERT(interface->init(MBED_CONF_APP_DEFAULT_PIN)); |
RobMeades | 14:e7dcf3388403 | 236 | TEST_ASSERT(interface->connect(MBED_CONF_APP_DEFAULT_PIN, MBED_CONF_APP_APN, |
RobMeades | 14:e7dcf3388403 | 237 | MBED_CONF_APP_USERNAME, MBED_CONF_APP_PASSWORD) == 0); |
RobMeades | 14:e7dcf3388403 | 238 | use_connection(interface); |
RobMeades | 14:e7dcf3388403 | 239 | TEST_ASSERT(sleep_manager_can_deep_sleep() == false); |
RobMeades | 14:e7dcf3388403 | 240 | drop_connection(interface); |
RobMeades | 14:e7dcf3388403 | 241 | |
RobMeades | 14:e7dcf3388403 | 242 | // Destroy the instance |
RobMeades | 14:e7dcf3388403 | 243 | delete interface; |
RobMeades | 14:e7dcf3388403 | 244 | |
RobMeades | 14:e7dcf3388403 | 245 | TEST_ASSERT(sleep_manager_can_deep_sleep() == true); |
RobMeades | 14:e7dcf3388403 | 246 | } |
RobMeades | 14:e7dcf3388403 | 247 | |
RobMeades | 14:e7dcf3388403 | 248 | // Test that if communication with the modem |
RobMeades | 14:e7dcf3388403 | 249 | // fails for some reason that sleeping is possible |
RobMeades | 14:e7dcf3388403 | 250 | // afterwards (specific case found by Rostyslav Y.) |
RobMeades | 14:e7dcf3388403 | 251 | void test_sleep_failed_connection() { |
RobMeades | 14:e7dcf3388403 | 252 | |
RobMeades | 14:e7dcf3388403 | 253 | TEST_ASSERT(sleep_manager_can_deep_sleep() == true); |
RobMeades | 14:e7dcf3388403 | 254 | |
RobMeades | 14:e7dcf3388403 | 255 | // Create a bad instance of the cellular interface |
RobMeades | 14:e7dcf3388403 | 256 | UbloxATCellularInterface *interface = |
RobMeades | 14:e7dcf3388403 | 257 | new UbloxATCellularInterface(MDMTXD, MDMRXD, |
RobMeades | 14:e7dcf3388403 | 258 | 20, /* Silly baud rate */ |
RobMeades | 14:e7dcf3388403 | 259 | MBED_CONF_APP_DEBUG_ON); |
RobMeades | 14:e7dcf3388403 | 260 | |
RobMeades | 14:e7dcf3388403 | 261 | // [Fail to] use it |
RobMeades | 14:e7dcf3388403 | 262 | TEST_ASSERT_FALSE(interface->init(MBED_CONF_APP_DEFAULT_PIN)); |
RobMeades | 14:e7dcf3388403 | 263 | TEST_ASSERT(interface->connect(MBED_CONF_APP_DEFAULT_PIN, MBED_CONF_APP_APN, |
RobMeades | 14:e7dcf3388403 | 264 | MBED_CONF_APP_USERNAME, MBED_CONF_APP_PASSWORD) != NSAPI_ERROR_OK); |
RobMeades | 14:e7dcf3388403 | 265 | // Destroy the instance |
RobMeades | 14:e7dcf3388403 | 266 | delete interface; |
RobMeades | 14:e7dcf3388403 | 267 | |
RobMeades | 14:e7dcf3388403 | 268 | TEST_ASSERT(sleep_manager_can_deep_sleep() == true); |
RobMeades | 14:e7dcf3388403 | 269 | } |
RobMeades | 14:e7dcf3388403 | 270 | |
RobMeades | 14:e7dcf3388403 | 271 | #if MBED_HEAP_STATS_ENABLED |
RobMeades | 14:e7dcf3388403 | 272 | // Test for memory leaks. |
RobMeades | 14:e7dcf3388403 | 273 | void test_memory_leak() { |
RobMeades | 14:e7dcf3388403 | 274 | |
RobMeades | 14:e7dcf3388403 | 275 | mbed_stats_heap_t heap_stats_start; |
RobMeades | 14:e7dcf3388403 | 276 | mbed_stats_heap_t heap_stats; |
RobMeades | 14:e7dcf3388403 | 277 | |
RobMeades | 14:e7dcf3388403 | 278 | mbed_stats_heap_get(&heap_stats_start); |
RobMeades | 14:e7dcf3388403 | 279 | |
RobMeades | 14:e7dcf3388403 | 280 | // Create an instance of the cellular interface |
RobMeades | 14:e7dcf3388403 | 281 | UbloxATCellularInterface *interface = |
RobMeades | 14:e7dcf3388403 | 282 | new UbloxATCellularInterface(MDMTXD, MDMRXD, |
RobMeades | 14:e7dcf3388403 | 283 | MBED_CONF_UBLOX_CELL_BAUD_RATE, |
RobMeades | 14:e7dcf3388403 | 284 | MBED_CONF_APP_DEBUG_ON); |
RobMeades | 14:e7dcf3388403 | 285 | interface->connection_status_cb(connection_down_cb); |
RobMeades | 14:e7dcf3388403 | 286 | |
RobMeades | 14:e7dcf3388403 | 287 | // Use it |
RobMeades | 14:e7dcf3388403 | 288 | TEST_ASSERT(interface->init(MBED_CONF_APP_DEFAULT_PIN)); |
RobMeades | 14:e7dcf3388403 | 289 | TEST_ASSERT(interface->connect(MBED_CONF_APP_DEFAULT_PIN, MBED_CONF_APP_APN, |
RobMeades | 14:e7dcf3388403 | 290 | MBED_CONF_APP_USERNAME, MBED_CONF_APP_PASSWORD) == 0); |
RobMeades | 14:e7dcf3388403 | 291 | mbed_stats_heap_get(&heap_stats); |
RobMeades | 14:e7dcf3388403 | 292 | TEST_ASSERT(heap_stats.current_size > heap_stats_start.current_size); |
RobMeades | 14:e7dcf3388403 | 293 | use_connection(interface); |
RobMeades | 14:e7dcf3388403 | 294 | drop_connection(interface); |
RobMeades | 14:e7dcf3388403 | 295 | |
RobMeades | 14:e7dcf3388403 | 296 | // Destroy the instance |
RobMeades | 14:e7dcf3388403 | 297 | delete interface; |
RobMeades | 14:e7dcf3388403 | 298 | |
RobMeades | 14:e7dcf3388403 | 299 | mbed_stats_heap_get(&heap_stats); |
RobMeades | 14:e7dcf3388403 | 300 | TEST_ASSERT(heap_stats.current_size == heap_stats_start.current_size); |
RobMeades | 14:e7dcf3388403 | 301 | } |
RobMeades | 14:e7dcf3388403 | 302 | #endif |
RobMeades | 14:e7dcf3388403 | 303 | |
RobMeades | 14:e7dcf3388403 | 304 | // ---------------------------------------------------------------- |
RobMeades | 14:e7dcf3388403 | 305 | // TEST ENVIRONMENT |
RobMeades | 14:e7dcf3388403 | 306 | // ---------------------------------------------------------------- |
RobMeades | 14:e7dcf3388403 | 307 | |
RobMeades | 14:e7dcf3388403 | 308 | // Setup the test environment |
RobMeades | 14:e7dcf3388403 | 309 | utest::v1::status_t test_setup(const size_t number_of_cases) { |
RobMeades | 14:e7dcf3388403 | 310 | // Setup Greentea with a timeout |
RobMeades | 14:e7dcf3388403 | 311 | GREENTEA_SETUP(300, "default_auto"); |
RobMeades | 14:e7dcf3388403 | 312 | return verbose_test_setup_handler(number_of_cases); |
RobMeades | 14:e7dcf3388403 | 313 | } |
RobMeades | 14:e7dcf3388403 | 314 | |
RobMeades | 14:e7dcf3388403 | 315 | // IMPORTANT!!! if you make a change to the tests here you should |
RobMeades | 14:e7dcf3388403 | 316 | // check whether the same change should be made to the tests under |
RobMeades | 14:e7dcf3388403 | 317 | // the PPP interface. |
RobMeades | 14:e7dcf3388403 | 318 | |
RobMeades | 14:e7dcf3388403 | 319 | // Test cases |
RobMeades | 14:e7dcf3388403 | 320 | Case cases[] = { |
RobMeades | 14:e7dcf3388403 | 321 | Case("Sleep test", test_sleep), |
RobMeades | 14:e7dcf3388403 | 322 | Case("Sleep test with failed modem comms", test_sleep_failed_connection) |
RobMeades | 14:e7dcf3388403 | 323 | #if MBED_HEAP_STATS_ENABLED |
RobMeades | 14:e7dcf3388403 | 324 | , Case("Memory leak test", test_memory_leak) |
RobMeades | 14:e7dcf3388403 | 325 | #endif |
RobMeades | 14:e7dcf3388403 | 326 | }; |
RobMeades | 14:e7dcf3388403 | 327 | |
RobMeades | 14:e7dcf3388403 | 328 | Specification specification(test_setup, cases); |
RobMeades | 14:e7dcf3388403 | 329 | |
RobMeades | 14:e7dcf3388403 | 330 | // ---------------------------------------------------------------- |
RobMeades | 14:e7dcf3388403 | 331 | // MAIN |
RobMeades | 14:e7dcf3388403 | 332 | // ---------------------------------------------------------------- |
RobMeades | 14:e7dcf3388403 | 333 | |
RobMeades | 14:e7dcf3388403 | 334 | int main() { |
RobMeades | 14:e7dcf3388403 | 335 | |
RobMeades | 14:e7dcf3388403 | 336 | #ifdef FEATURE_COMMON_PAL |
RobMeades | 14:e7dcf3388403 | 337 | mbed_trace_init(); |
RobMeades | 14:e7dcf3388403 | 338 | |
RobMeades | 14:e7dcf3388403 | 339 | mbed_trace_mutex_wait_function_set(lock); |
RobMeades | 14:e7dcf3388403 | 340 | mbed_trace_mutex_release_function_set(unlock); |
RobMeades | 14:e7dcf3388403 | 341 | #endif |
RobMeades | 14:e7dcf3388403 | 342 | |
RobMeades | 14:e7dcf3388403 | 343 | // Run tests |
RobMeades | 14:e7dcf3388403 | 344 | return !Harness::run(specification); |
RobMeades | 14:e7dcf3388403 | 345 | } |
RobMeades | 14:e7dcf3388403 | 346 | |
RobMeades | 14:e7dcf3388403 | 347 | // End Of File |