Implementation of the CellularInterface for u-blox C027 and C030 (non-N2xx flavour) modems that uses the IP stack on-board the cellular modem, hence not requiring LWIP (and so less RAM) and allowing any AT command exchanges to be carried out at the same time as data transfers (since the modem remains in AT mode all the time). This library may be used from mbed 5.5 onwards. If you need to use SMS, USSD or access the modem file system at the same time as using the CellularInterface then use ublox-at-cellular-interface-ext instead.
Dependents: example-ublox-cellular-interface example-ublox-cellular-interface_r410M example-ublox-mbed-client example-ublox-cellular-interface ... more
TESTS/unit_tests/default/main.cpp@42:98808477a691, 2020-01-06 (annotated)
- Committer:
- mudassar0121
- Date:
- Mon Jan 06 14:29:40 2020 +0500
- Revision:
- 42:98808477a691
- Parent:
- 40:9299d6d117f1
Replaced depreciated wait_ms with ThisThread::sleep_for
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
mudassar0121 |
22:63b1a3c02fb8 | 1 | |
rob.meades@u-blox.com | 1:bc228becc45d | 2 | #include "UbloxATCellularInterface.h" |
RobMeades | 0:7ccf0e7e8a83 | 3 | #include "greentea-client/test_env.h" |
RobMeades | 0:7ccf0e7e8a83 | 4 | #include "unity.h" |
RobMeades | 0:7ccf0e7e8a83 | 5 | #include "utest.h" |
RobMeades | 0:7ccf0e7e8a83 | 6 | #include "UDPSocket.h" |
RobMeades | 0:7ccf0e7e8a83 | 7 | #ifdef FEATURE_COMMON_PAL |
RobMeades | 0:7ccf0e7e8a83 | 8 | #include "mbed_trace.h" |
RobMeades | 0:7ccf0e7e8a83 | 9 | #define TRACE_GROUP "TEST" |
RobMeades | 0:7ccf0e7e8a83 | 10 | #else |
rob.meades@u-blox.com | 1:bc228becc45d | 11 | #define tr_debug(format, ...) debug(format "\n", ## __VA_ARGS__) |
rob.meades@u-blox.com | 1:bc228becc45d | 12 | #define tr_info(format, ...) debug(format "\n", ## __VA_ARGS__) |
rob.meades@u-blox.com | 1:bc228becc45d | 13 | #define tr_warn(format, ...) debug(format "\n", ## __VA_ARGS__) |
rob.meades@u-blox.com | 1:bc228becc45d | 14 | #define tr_error(format, ...) debug(format "\n", ## __VA_ARGS__) |
RobMeades | 0:7ccf0e7e8a83 | 15 | #endif |
RobMeades | 0:7ccf0e7e8a83 | 16 | |
RobMeades | 0:7ccf0e7e8a83 | 17 | using namespace utest::v1; |
RobMeades | 0:7ccf0e7e8a83 | 18 | |
RobMeades | 0:7ccf0e7e8a83 | 19 | // IMPORTANT!!! if you make a change to the tests here you should |
RobMeades | 0:7ccf0e7e8a83 | 20 | // check whether the same change should be made to the tests under |
rob.meades@u-blox.com | 6:63dad754c267 | 21 | // the PPP interface. |
rob.meades@u-blox.com | 6:63dad754c267 | 22 | |
rob.meades@u-blox.com | 6:63dad754c267 | 23 | // NOTE: these test are only as reliable as UDP across the internet |
rob.meades@u-blox.com | 6:63dad754c267 | 24 | // over a radio link. The tests expect an NTP server to respond |
rob.meades@u-blox.com | 6:63dad754c267 | 25 | // to UDP packets and, if configured, an echo server to respond |
rob.meades@u-blox.com | 6:63dad754c267 | 26 | // to UDP packets. This simply may not happen. Please be patient. |
RobMeades | 0:7ccf0e7e8a83 | 27 | |
RobMeades | 0:7ccf0e7e8a83 | 28 | // ---------------------------------------------------------------- |
RobMeades | 0:7ccf0e7e8a83 | 29 | // COMPILE-TIME MACROS |
RobMeades | 0:7ccf0e7e8a83 | 30 | // ---------------------------------------------------------------- |
RobMeades | 0:7ccf0e7e8a83 | 31 | |
RobMeades | 0:7ccf0e7e8a83 | 32 | // These macros can be overridden with an mbed_app.json file and |
RobMeades | 0:7ccf0e7e8a83 | 33 | // contents of the following form: |
RobMeades | 0:7ccf0e7e8a83 | 34 | // |
RobMeades | 0:7ccf0e7e8a83 | 35 | //{ |
RobMeades | 0:7ccf0e7e8a83 | 36 | // "config": { |
RobMeades | 0:7ccf0e7e8a83 | 37 | // "default-pin": { |
RobMeades | 0:7ccf0e7e8a83 | 38 | // "value": "\"1234\"" |
RobMeades | 0:7ccf0e7e8a83 | 39 | // } |
RobMeades | 0:7ccf0e7e8a83 | 40 | //} |
RobMeades | 0:7ccf0e7e8a83 | 41 | // |
RobMeades | 0:7ccf0e7e8a83 | 42 | // See the template_mbed_app.txt in this directory for a fuller example. |
RobMeades | 0:7ccf0e7e8a83 | 43 | |
RobMeades | 0:7ccf0e7e8a83 | 44 | // Whether debug trace is on |
RobMeades | 0:7ccf0e7e8a83 | 45 | #ifndef MBED_CONF_APP_DEBUG_ON |
RobMeades | 0:7ccf0e7e8a83 | 46 | # define MBED_CONF_APP_DEBUG_ON false |
RobMeades | 0:7ccf0e7e8a83 | 47 | #endif |
RobMeades | 0:7ccf0e7e8a83 | 48 | |
RobMeades | 0:7ccf0e7e8a83 | 49 | // Run the SIM change tests, which require the DEFAULT_PIN |
RobMeades | 0:7ccf0e7e8a83 | 50 | // above to be correct for the board on which the test |
RobMeades | 0:7ccf0e7e8a83 | 51 | // is being run (and the SIM PIN to be disabled before tests run). |
RobMeades | 0:7ccf0e7e8a83 | 52 | #ifndef MBED_CONF_APP_RUN_SIM_PIN_CHANGE_TESTS |
RobMeades | 0:7ccf0e7e8a83 | 53 | # define MBED_CONF_APP_RUN_SIM_PIN_CHANGE_TESTS 0 |
RobMeades | 0:7ccf0e7e8a83 | 54 | #endif |
RobMeades | 0:7ccf0e7e8a83 | 55 | |
RobMeades | 0:7ccf0e7e8a83 | 56 | #if MBED_CONF_APP_RUN_SIM_PIN_CHANGE_TESTS |
RobMeades | 0:7ccf0e7e8a83 | 57 | # ifndef MBED_CONF_APP_DEFAULT_PIN |
RobMeades | 0:7ccf0e7e8a83 | 58 | # error "MBED_CONF_APP_DEFAULT_PIN must be defined to run the SIM tests" |
RobMeades | 0:7ccf0e7e8a83 | 59 | # endif |
RobMeades | 0:7ccf0e7e8a83 | 60 | # ifndef MBED_CONF_APP_ALT_PIN |
RobMeades | 0:7ccf0e7e8a83 | 61 | # error "MBED_CONF_APP_ALT_PIN must be defined to run the SIM tests" |
RobMeades | 0:7ccf0e7e8a83 | 62 | # endif |
RobMeades | 0:7ccf0e7e8a83 | 63 | # ifndef MBED_CONF_APP_INCORRECT_PIN |
RobMeades | 0:7ccf0e7e8a83 | 64 | # error "MBED_CONF_APP_INCORRECT_PIN must be defined to run the SIM tests" |
RobMeades | 0:7ccf0e7e8a83 | 65 | # endif |
RobMeades | 0:7ccf0e7e8a83 | 66 | #endif |
RobMeades | 0:7ccf0e7e8a83 | 67 | |
RobMeades | 0:7ccf0e7e8a83 | 68 | // The credentials of the SIM in the board. |
RobMeades | 0:7ccf0e7e8a83 | 69 | #ifndef MBED_CONF_APP_DEFAULT_PIN |
RobMeades | 0:7ccf0e7e8a83 | 70 | // Note: if PIN is enabled on your SIM, or you wish to run the SIM PIN change |
RobMeades | 0:7ccf0e7e8a83 | 71 | // tests, you must define the PIN for your SIM (see note above on using |
RobMeades | 0:7ccf0e7e8a83 | 72 | // mbed_app.json to do so). |
RobMeades | 0:7ccf0e7e8a83 | 73 | # define MBED_CONF_APP_DEFAULT_PIN "0000" |
RobMeades | 0:7ccf0e7e8a83 | 74 | #endif |
RobMeades | 0:7ccf0e7e8a83 | 75 | #ifndef MBED_CONF_APP_APN |
RobMeades | 0:7ccf0e7e8a83 | 76 | # define MBED_CONF_APP_APN NULL |
RobMeades | 0:7ccf0e7e8a83 | 77 | #endif |
RobMeades | 0:7ccf0e7e8a83 | 78 | #ifndef MBED_CONF_APP_USERNAME |
RobMeades | 0:7ccf0e7e8a83 | 79 | # define MBED_CONF_APP_USERNAME NULL |
RobMeades | 0:7ccf0e7e8a83 | 80 | #endif |
RobMeades | 0:7ccf0e7e8a83 | 81 | #ifndef MBED_CONF_APP_PASSWORD |
RobMeades | 0:7ccf0e7e8a83 | 82 | # define MBED_CONF_APP_PASSWORD NULL |
RobMeades | 0:7ccf0e7e8a83 | 83 | #endif |
RobMeades | 0:7ccf0e7e8a83 | 84 | |
RobMeades | 0:7ccf0e7e8a83 | 85 | // Alternate PIN to use during pin change testing |
RobMeades | 0:7ccf0e7e8a83 | 86 | #ifndef MBED_CONF_APP_ALT_PIN |
RobMeades | 0:7ccf0e7e8a83 | 87 | # define MBED_CONF_APP_ALT_PIN "9876" |
RobMeades | 0:7ccf0e7e8a83 | 88 | #endif |
RobMeades | 0:7ccf0e7e8a83 | 89 | |
RobMeades | 0:7ccf0e7e8a83 | 90 | // A PIN that is definitely incorrect |
RobMeades | 0:7ccf0e7e8a83 | 91 | #ifndef MBED_CONF_APP_INCORRECT_PIN |
RobMeades | 0:7ccf0e7e8a83 | 92 | # define MBED_CONF_APP_INCORRECT_PIN "1530" |
RobMeades | 0:7ccf0e7e8a83 | 93 | #endif |
RobMeades | 0:7ccf0e7e8a83 | 94 | |
RobMeades | 0:7ccf0e7e8a83 | 95 | // Servers and ports |
RobMeades | 0:7ccf0e7e8a83 | 96 | #ifdef MBED_CONF_APP_ECHO_SERVER |
RobMeades | 0:7ccf0e7e8a83 | 97 | # ifndef MBED_CONF_APP_ECHO_UDP_PORT |
RobMeades | 0:7ccf0e7e8a83 | 98 | # error "MBED_CONF_APP_ECHO_UDP_PORT (the port on which your echo server echoes UDP packets) must be defined" |
RobMeades | 0:7ccf0e7e8a83 | 99 | # endif |
RobMeades | 0:7ccf0e7e8a83 | 100 | # ifndef MBED_CONF_APP_ECHO_TCP_PORT |
RobMeades | 0:7ccf0e7e8a83 | 101 | # error "MBED_CONF_APP_ECHO_TCP_PORT (the port on which your echo server echoes TCP packets) must be defined" |
RobMeades | 0:7ccf0e7e8a83 | 102 | # endif |
RobMeades | 0:7ccf0e7e8a83 | 103 | #endif |
RobMeades | 0:7ccf0e7e8a83 | 104 | |
RobMeades | 0:7ccf0e7e8a83 | 105 | #ifndef MBED_CONF_APP_NTP_SERVER |
RobMeades | 0:7ccf0e7e8a83 | 106 | # define MBED_CONF_APP_NTP_SERVER "2.pool.ntp.org" |
RobMeades | 0:7ccf0e7e8a83 | 107 | #else |
RobMeades | 0:7ccf0e7e8a83 | 108 | # ifndef MBED_CONF_APP_NTP_PORT |
RobMeades | 0:7ccf0e7e8a83 | 109 | # error "MBED_CONF_APP_NTP_PORT must be defined if MBED_CONF_APP_NTP_SERVER is defined" |
RobMeades | 0:7ccf0e7e8a83 | 110 | # endif |
RobMeades | 0:7ccf0e7e8a83 | 111 | #endif |
RobMeades | 0:7ccf0e7e8a83 | 112 | #ifndef MBED_CONF_APP_NTP_PORT |
RobMeades | 0:7ccf0e7e8a83 | 113 | # define MBED_CONF_APP_NTP_PORT 123 |
RobMeades | 0:7ccf0e7e8a83 | 114 | #endif |
RobMeades | 0:7ccf0e7e8a83 | 115 | |
RobMeades | 0:7ccf0e7e8a83 | 116 | #ifndef MBED_CONF_APP_LOCAL_PORT |
RobMeades | 0:7ccf0e7e8a83 | 117 | # define MBED_CONF_APP_LOCAL_PORT 15 |
RobMeades | 0:7ccf0e7e8a83 | 118 | #endif |
RobMeades | 0:7ccf0e7e8a83 | 119 | |
RobMeades | 0:7ccf0e7e8a83 | 120 | // UDP packet size limit for testing |
RobMeades | 0:7ccf0e7e8a83 | 121 | #ifndef MBED_CONF_APP_UDP_MAX_PACKET_SIZE |
RobMeades | 0:7ccf0e7e8a83 | 122 | # define MBED_CONF_APP_UDP_MAX_PACKET_SIZE 1024 |
RobMeades | 0:7ccf0e7e8a83 | 123 | #endif |
RobMeades | 0:7ccf0e7e8a83 | 124 | |
RobMeades | 0:7ccf0e7e8a83 | 125 | // The maximum size of UDP data fragmented across |
RobMeades | 0:7ccf0e7e8a83 | 126 | // multiple packets |
RobMeades | 0:7ccf0e7e8a83 | 127 | #ifndef MBED_CONF_APP_UDP_MAX_FRAG_PACKET_SIZE |
RobMeades | 0:7ccf0e7e8a83 | 128 | # define MBED_CONF_APP_UDP_MAX_FRAG_PACKET_SIZE 1500 |
RobMeades | 0:7ccf0e7e8a83 | 129 | #endif |
RobMeades | 0:7ccf0e7e8a83 | 130 | |
RobMeades | 0:7ccf0e7e8a83 | 131 | // TCP packet size limit for testing |
RobMeades | 0:7ccf0e7e8a83 | 132 | #ifndef MBED_CONF_APP_MBED_CONF_APP_TCP_MAX_PACKET_SIZE |
RobMeades | 0:7ccf0e7e8a83 | 133 | # define MBED_CONF_APP_TCP_MAX_PACKET_SIZE 1500 |
RobMeades | 0:7ccf0e7e8a83 | 134 | #endif |
RobMeades | 0:7ccf0e7e8a83 | 135 | |
RobMeades | 0:7ccf0e7e8a83 | 136 | // The number of retries for UDP exchanges |
RobMeades | 0:7ccf0e7e8a83 | 137 | #define NUM_UDP_RETRIES 5 |
RobMeades | 0:7ccf0e7e8a83 | 138 | |
RobMeades | 0:7ccf0e7e8a83 | 139 | // How long to wait for stuff to travel in the async echo tests |
RobMeades | 0:7ccf0e7e8a83 | 140 | #define ASYNC_TEST_WAIT_TIME 10000 |
RobMeades | 0:7ccf0e7e8a83 | 141 | |
RobMeades | 0:7ccf0e7e8a83 | 142 | // The maximum number of sockets that can be open at one time |
RobMeades | 0:7ccf0e7e8a83 | 143 | #define MAX_NUM_SOCKETS 7 |
RobMeades | 0:7ccf0e7e8a83 | 144 | |
mudassar0121 |
22:63b1a3c02fb8 | 145 | int previousSelectedRat = -1, previousPreferredRat = -1, previousSecondPreferredRat = -1; |
mudassar0121 |
22:63b1a3c02fb8 | 146 | |
RobMeades | 0:7ccf0e7e8a83 | 147 | // ---------------------------------------------------------------- |
RobMeades | 0:7ccf0e7e8a83 | 148 | // PRIVATE VARIABLES |
RobMeades | 0:7ccf0e7e8a83 | 149 | // ---------------------------------------------------------------- |
RobMeades | 0:7ccf0e7e8a83 | 150 | |
RobMeades | 0:7ccf0e7e8a83 | 151 | #ifdef FEATURE_COMMON_PAL |
RobMeades | 0:7ccf0e7e8a83 | 152 | // Lock for debug prints |
RobMeades | 0:7ccf0e7e8a83 | 153 | static Mutex mtx; |
RobMeades | 0:7ccf0e7e8a83 | 154 | #endif |
RobMeades | 0:7ccf0e7e8a83 | 155 | |
rob.meades@u-blox.com | 6:63dad754c267 | 156 | // An instance of the cellular interface |
rob.meades@u-blox.com | 6:63dad754c267 | 157 | static UbloxATCellularInterface *interface = |
RobMeades | 0:7ccf0e7e8a83 | 158 | new UbloxATCellularInterface(MDMTXD, MDMRXD, |
RobMeades | 0:7ccf0e7e8a83 | 159 | MBED_CONF_UBLOX_CELL_BAUD_RATE, |
RobMeades | 0:7ccf0e7e8a83 | 160 | MBED_CONF_APP_DEBUG_ON); |
RobMeades | 0:7ccf0e7e8a83 | 161 | |
RobMeades | 0:7ccf0e7e8a83 | 162 | // Connection flag |
RobMeades | 0:7ccf0e7e8a83 | 163 | static bool connection_has_gone_down = false; |
RobMeades | 0:7ccf0e7e8a83 | 164 | |
wajahat.abbas@u-blox.com | 37:0ceb2dfc746c | 165 | #ifdef MBED_CONF_APP_ECHO_SERVER |
RobMeades | 0:7ccf0e7e8a83 | 166 | // Data to exchange |
RobMeades | 0:7ccf0e7e8a83 | 167 | static const char send_data[] = "_____0000:0123456789012345678901234567890123456789" |
RobMeades | 0:7ccf0e7e8a83 | 168 | "01234567890123456789012345678901234567890123456789" |
RobMeades | 0:7ccf0e7e8a83 | 169 | "_____0100:0123456789012345678901234567890123456789" |
RobMeades | 0:7ccf0e7e8a83 | 170 | "01234567890123456789012345678901234567890123456789" |
RobMeades | 0:7ccf0e7e8a83 | 171 | "_____0200:0123456789012345678901234567890123456789" |
RobMeades | 0:7ccf0e7e8a83 | 172 | "01234567890123456789012345678901234567890123456789" |
RobMeades | 0:7ccf0e7e8a83 | 173 | "_____0300:0123456789012345678901234567890123456789" |
RobMeades | 0:7ccf0e7e8a83 | 174 | "01234567890123456789012345678901234567890123456789" |
RobMeades | 0:7ccf0e7e8a83 | 175 | "_____0400:0123456789012345678901234567890123456789" |
RobMeades | 0:7ccf0e7e8a83 | 176 | "01234567890123456789012345678901234567890123456789" |
RobMeades | 0:7ccf0e7e8a83 | 177 | "_____0500:0123456789012345678901234567890123456789" |
RobMeades | 0:7ccf0e7e8a83 | 178 | "01234567890123456789012345678901234567890123456789" |
RobMeades | 0:7ccf0e7e8a83 | 179 | "_____0600:0123456789012345678901234567890123456789" |
RobMeades | 0:7ccf0e7e8a83 | 180 | "01234567890123456789012345678901234567890123456789" |
RobMeades | 0:7ccf0e7e8a83 | 181 | "_____0700:0123456789012345678901234567890123456789" |
RobMeades | 0:7ccf0e7e8a83 | 182 | "01234567890123456789012345678901234567890123456789" |
RobMeades | 0:7ccf0e7e8a83 | 183 | "_____0800:0123456789012345678901234567890123456789" |
RobMeades | 0:7ccf0e7e8a83 | 184 | "01234567890123456789012345678901234567890123456789" |
RobMeades | 0:7ccf0e7e8a83 | 185 | "_____0900:0123456789012345678901234567890123456789" |
RobMeades | 0:7ccf0e7e8a83 | 186 | "01234567890123456789012345678901234567890123456789" |
RobMeades | 0:7ccf0e7e8a83 | 187 | "_____1000:0123456789012345678901234567890123456789" |
RobMeades | 0:7ccf0e7e8a83 | 188 | "01234567890123456789012345678901234567890123456789" |
RobMeades | 0:7ccf0e7e8a83 | 189 | "_____1100:0123456789012345678901234567890123456789" |
RobMeades | 0:7ccf0e7e8a83 | 190 | "01234567890123456789012345678901234567890123456789" |
RobMeades | 0:7ccf0e7e8a83 | 191 | "_____1200:0123456789012345678901234567890123456789" |
RobMeades | 0:7ccf0e7e8a83 | 192 | "01234567890123456789012345678901234567890123456789" |
RobMeades | 0:7ccf0e7e8a83 | 193 | "_____1300:0123456789012345678901234567890123456789" |
RobMeades | 0:7ccf0e7e8a83 | 194 | "01234567890123456789012345678901234567890123456789" |
RobMeades | 0:7ccf0e7e8a83 | 195 | "_____1400:0123456789012345678901234567890123456789" |
RobMeades | 0:7ccf0e7e8a83 | 196 | "01234567890123456789012345678901234567890123456789" |
RobMeades | 0:7ccf0e7e8a83 | 197 | "_____1500:0123456789012345678901234567890123456789" |
RobMeades | 0:7ccf0e7e8a83 | 198 | "01234567890123456789012345678901234567890123456789" |
RobMeades | 0:7ccf0e7e8a83 | 199 | "_____1600:0123456789012345678901234567890123456789" |
RobMeades | 0:7ccf0e7e8a83 | 200 | "01234567890123456789012345678901234567890123456789" |
RobMeades | 0:7ccf0e7e8a83 | 201 | "_____1700:0123456789012345678901234567890123456789" |
RobMeades | 0:7ccf0e7e8a83 | 202 | "01234567890123456789012345678901234567890123456789" |
RobMeades | 0:7ccf0e7e8a83 | 203 | "_____1800:0123456789012345678901234567890123456789" |
RobMeades | 0:7ccf0e7e8a83 | 204 | "01234567890123456789012345678901234567890123456789" |
RobMeades | 0:7ccf0e7e8a83 | 205 | "_____1900:0123456789012345678901234567890123456789" |
RobMeades | 0:7ccf0e7e8a83 | 206 | "01234567890123456789012345678901234567890123456789" |
RobMeades | 0:7ccf0e7e8a83 | 207 | "_____2000:0123456789012345678901234567890123456789" |
RobMeades | 0:7ccf0e7e8a83 | 208 | "01234567890123456789012345678901234567890123456789"; |
wajahat.abbas@u-blox.com | 37:0ceb2dfc746c | 209 | #endif |
RobMeades | 0:7ccf0e7e8a83 | 210 | |
RobMeades | 0:7ccf0e7e8a83 | 211 | // ---------------------------------------------------------------- |
RobMeades | 0:7ccf0e7e8a83 | 212 | // PRIVATE FUNCTIONS |
RobMeades | 0:7ccf0e7e8a83 | 213 | // ---------------------------------------------------------------- |
RobMeades | 0:7ccf0e7e8a83 | 214 | |
RobMeades | 0:7ccf0e7e8a83 | 215 | #ifdef FEATURE_COMMON_PAL |
RobMeades | 0:7ccf0e7e8a83 | 216 | // Locks for debug prints |
RobMeades | 0:7ccf0e7e8a83 | 217 | static void lock() |
RobMeades | 0:7ccf0e7e8a83 | 218 | { |
RobMeades | 0:7ccf0e7e8a83 | 219 | mtx.lock(); |
RobMeades | 0:7ccf0e7e8a83 | 220 | } |
RobMeades | 0:7ccf0e7e8a83 | 221 | |
RobMeades | 0:7ccf0e7e8a83 | 222 | static void unlock() |
RobMeades | 0:7ccf0e7e8a83 | 223 | { |
RobMeades | 0:7ccf0e7e8a83 | 224 | mtx.unlock(); |
RobMeades | 0:7ccf0e7e8a83 | 225 | } |
RobMeades | 0:7ccf0e7e8a83 | 226 | #endif |
RobMeades | 0:7ccf0e7e8a83 | 227 | |
RobMeades | 0:7ccf0e7e8a83 | 228 | // Callback in case the connection goes down |
RobMeades | 0:7ccf0e7e8a83 | 229 | static void connection_down_cb(nsapi_error_t err) |
RobMeades | 0:7ccf0e7e8a83 | 230 | { |
RobMeades | 0:7ccf0e7e8a83 | 231 | connection_has_gone_down = true; |
RobMeades | 0:7ccf0e7e8a83 | 232 | } |
RobMeades | 0:7ccf0e7e8a83 | 233 | |
RobMeades | 0:7ccf0e7e8a83 | 234 | #ifdef MBED_CONF_APP_ECHO_SERVER |
RobMeades | 0:7ccf0e7e8a83 | 235 | // Make sure that size is greater than 0 and no more than limit, |
RobMeades | 0:7ccf0e7e8a83 | 236 | // useful since, when moduloing a very large number number, |
RobMeades | 0:7ccf0e7e8a83 | 237 | // compilers sometimes screw up and produce a small *negative* |
RobMeades | 0:7ccf0e7e8a83 | 238 | // number. Who knew? For example, GCC decided that |
RobMeades | 0:7ccf0e7e8a83 | 239 | // 492318453 (0x1d582ef5) modulo 508 was -47 (0xffffffd1). |
RobMeades | 0:7ccf0e7e8a83 | 240 | static int fix (int size, int limit) |
RobMeades | 0:7ccf0e7e8a83 | 241 | { |
RobMeades | 0:7ccf0e7e8a83 | 242 | if (size <= 0) { |
RobMeades | 0:7ccf0e7e8a83 | 243 | size = limit / 2; // better than 1 |
RobMeades | 0:7ccf0e7e8a83 | 244 | } else if (size > limit) { |
RobMeades | 0:7ccf0e7e8a83 | 245 | size = limit; |
RobMeades | 0:7ccf0e7e8a83 | 246 | } |
RobMeades | 0:7ccf0e7e8a83 | 247 | |
RobMeades | 0:7ccf0e7e8a83 | 248 | return size; |
RobMeades | 0:7ccf0e7e8a83 | 249 | } |
RobMeades | 0:7ccf0e7e8a83 | 250 | |
RobMeades | 0:7ccf0e7e8a83 | 251 | // Do a UDP socket echo test to a given host of a given packet size |
RobMeades | 0:7ccf0e7e8a83 | 252 | static void do_udp_echo(UDPSocket *sock, SocketAddress *host_address, int size) |
RobMeades | 0:7ccf0e7e8a83 | 253 | { |
RobMeades | 0:7ccf0e7e8a83 | 254 | bool success = false; |
RobMeades | 0:7ccf0e7e8a83 | 255 | void * recv_data = malloc (size); |
RobMeades | 0:7ccf0e7e8a83 | 256 | SocketAddress sender_address; |
RobMeades | 0:7ccf0e7e8a83 | 257 | TEST_ASSERT(recv_data != NULL); |
RobMeades | 0:7ccf0e7e8a83 | 258 | |
RobMeades | 0:7ccf0e7e8a83 | 259 | // Retry this a few times, don't want to fail due to a flaky link |
RobMeades | 0:7ccf0e7e8a83 | 260 | for (int x = 0; !success && (x < NUM_UDP_RETRIES); x++) { |
RobMeades | 0:7ccf0e7e8a83 | 261 | tr_debug("Echo testing UDP packet size %d byte(s), try %d.", size, x + 1); |
RobMeades | 0:7ccf0e7e8a83 | 262 | if ((sock->sendto(*host_address, (void*) send_data, size) == size) && |
RobMeades | 0:7ccf0e7e8a83 | 263 | (sock->recvfrom(&sender_address, recv_data, size) == size)) { |
RobMeades | 0:7ccf0e7e8a83 | 264 | TEST_ASSERT (memcmp(send_data, recv_data, size) == 0); |
RobMeades | 0:7ccf0e7e8a83 | 265 | TEST_ASSERT (strcmp(sender_address.get_ip_address(), host_address->get_ip_address()) == 0); |
RobMeades | 0:7ccf0e7e8a83 | 266 | TEST_ASSERT (sender_address.get_port() == host_address->get_port()); |
RobMeades | 0:7ccf0e7e8a83 | 267 | success = true; |
RobMeades | 0:7ccf0e7e8a83 | 268 | } |
RobMeades | 0:7ccf0e7e8a83 | 269 | } |
RobMeades | 0:7ccf0e7e8a83 | 270 | TEST_ASSERT (success); |
RobMeades | 0:7ccf0e7e8a83 | 271 | TEST_ASSERT(!connection_has_gone_down); |
RobMeades | 0:7ccf0e7e8a83 | 272 | |
RobMeades | 0:7ccf0e7e8a83 | 273 | free (recv_data); |
RobMeades | 0:7ccf0e7e8a83 | 274 | } |
RobMeades | 0:7ccf0e7e8a83 | 275 | |
RobMeades | 0:7ccf0e7e8a83 | 276 | // The asynchronous callback |
RobMeades | 0:7ccf0e7e8a83 | 277 | static void async_cb(bool *callback_triggered) |
RobMeades | 0:7ccf0e7e8a83 | 278 | { |
RobMeades | 0:7ccf0e7e8a83 | 279 | |
RobMeades | 0:7ccf0e7e8a83 | 280 | TEST_ASSERT (callback_triggered != NULL); |
RobMeades | 0:7ccf0e7e8a83 | 281 | *callback_triggered = true; |
RobMeades | 0:7ccf0e7e8a83 | 282 | } |
RobMeades | 0:7ccf0e7e8a83 | 283 | |
rob.meades@u-blox.com | 6:63dad754c267 | 284 | // Do a UDP echo but using the asynchronous interface; we can exchange |
RobMeades | 0:7ccf0e7e8a83 | 285 | // packets longer in size than one UDP packet this way |
RobMeades | 0:7ccf0e7e8a83 | 286 | static void do_udp_echo_async(UDPSocket *sock, SocketAddress *host_address, |
RobMeades | 0:7ccf0e7e8a83 | 287 | int size, bool *callback_triggered) |
RobMeades | 0:7ccf0e7e8a83 | 288 | { |
RobMeades | 0:7ccf0e7e8a83 | 289 | void * recv_data = malloc (size); |
RobMeades | 0:7ccf0e7e8a83 | 290 | int recv_size = 0; |
RobMeades | 0:7ccf0e7e8a83 | 291 | SocketAddress sender_address; |
RobMeades | 0:7ccf0e7e8a83 | 292 | Timer timer; |
RobMeades | 0:7ccf0e7e8a83 | 293 | int x, y, z; |
RobMeades | 0:7ccf0e7e8a83 | 294 | TEST_ASSERT(recv_data != NULL); |
RobMeades | 0:7ccf0e7e8a83 | 295 | |
RobMeades | 0:7ccf0e7e8a83 | 296 | *callback_triggered = false; |
RobMeades | 0:7ccf0e7e8a83 | 297 | for (y = 0; (recv_size < size) && (y < NUM_UDP_RETRIES); y++) { |
RobMeades | 0:7ccf0e7e8a83 | 298 | tr_debug("Echo testing UDP packet size %d byte(s) async, try %d.", size, y + 1); |
RobMeades | 0:7ccf0e7e8a83 | 299 | recv_size = 0; |
RobMeades | 0:7ccf0e7e8a83 | 300 | // Retry this a few times, don't want to fail due to a flaky link |
RobMeades | 0:7ccf0e7e8a83 | 301 | if (sock->sendto(*host_address, (void *) send_data, size) == size) { |
RobMeades | 0:7ccf0e7e8a83 | 302 | // Wait for all the echoed data to arrive |
RobMeades | 0:7ccf0e7e8a83 | 303 | timer.start(); |
RobMeades | 0:7ccf0e7e8a83 | 304 | while ((recv_size < size) && (timer.read_ms() < ASYNC_TEST_WAIT_TIME)) { |
RobMeades | 0:7ccf0e7e8a83 | 305 | if (*callback_triggered) { |
RobMeades | 0:7ccf0e7e8a83 | 306 | *callback_triggered = false; |
RobMeades | 0:7ccf0e7e8a83 | 307 | x = sock->recvfrom(&sender_address, (char *) recv_data + recv_size, size); |
RobMeades | 0:7ccf0e7e8a83 | 308 | if (x > 0) { |
RobMeades | 0:7ccf0e7e8a83 | 309 | recv_size += x; |
RobMeades | 0:7ccf0e7e8a83 | 310 | } |
RobMeades | 0:7ccf0e7e8a83 | 311 | tr_debug("%d byte(s) echoed back so far, %d to go.", recv_size, size - recv_size); |
RobMeades | 0:7ccf0e7e8a83 | 312 | TEST_ASSERT(strcmp(sender_address.get_ip_address(), host_address->get_ip_address()) == 0); |
RobMeades | 0:7ccf0e7e8a83 | 313 | TEST_ASSERT(sender_address.get_port() == host_address->get_port()); |
RobMeades | 0:7ccf0e7e8a83 | 314 | } |
mudassar0121 |
42:98808477a691 | 315 | ThisThread::sleep_for(10); |
RobMeades | 0:7ccf0e7e8a83 | 316 | } |
RobMeades | 0:7ccf0e7e8a83 | 317 | timer.stop(); |
RobMeades | 0:7ccf0e7e8a83 | 318 | timer.reset(); |
RobMeades | 0:7ccf0e7e8a83 | 319 | |
RobMeades | 0:7ccf0e7e8a83 | 320 | // If everything arrived back, check it's the same as we sent |
RobMeades | 0:7ccf0e7e8a83 | 321 | if (recv_size == size) { |
RobMeades | 0:7ccf0e7e8a83 | 322 | z = memcmp(send_data, recv_data, size); |
RobMeades | 0:7ccf0e7e8a83 | 323 | if (z != 0) { |
RobMeades | 0:7ccf0e7e8a83 | 324 | tr_debug("WARNING: mismatch, retrying"); |
RobMeades | 0:7ccf0e7e8a83 | 325 | tr_debug("Sent %d, |%*.*s|", size, size, size, send_data); |
RobMeades | 0:7ccf0e7e8a83 | 326 | tr_debug("Rcvd %d, |%*.*s|", size, size, size, (char *) recv_data); |
RobMeades | 0:7ccf0e7e8a83 | 327 | // If things don't match, it could be due to data loss (this is UDP |
RobMeades | 0:7ccf0e7e8a83 | 328 | // you know...), so set recv_size to 0 to cause another try |
RobMeades | 0:7ccf0e7e8a83 | 329 | recv_size = 0; |
RobMeades | 0:7ccf0e7e8a83 | 330 | } |
RobMeades | 0:7ccf0e7e8a83 | 331 | } |
RobMeades | 0:7ccf0e7e8a83 | 332 | } |
RobMeades | 0:7ccf0e7e8a83 | 333 | } |
RobMeades | 0:7ccf0e7e8a83 | 334 | |
RobMeades | 0:7ccf0e7e8a83 | 335 | TEST_ASSERT(recv_size == size); |
RobMeades | 0:7ccf0e7e8a83 | 336 | TEST_ASSERT(!connection_has_gone_down); |
RobMeades | 0:7ccf0e7e8a83 | 337 | |
RobMeades | 0:7ccf0e7e8a83 | 338 | free (recv_data); |
RobMeades | 0:7ccf0e7e8a83 | 339 | } |
RobMeades | 0:7ccf0e7e8a83 | 340 | |
RobMeades | 0:7ccf0e7e8a83 | 341 | // Send an entire TCP data buffer until done |
RobMeades | 0:7ccf0e7e8a83 | 342 | static int sendAll(TCPSocket *sock, const char *data, int size) |
RobMeades | 0:7ccf0e7e8a83 | 343 | { |
RobMeades | 0:7ccf0e7e8a83 | 344 | int x; |
RobMeades | 0:7ccf0e7e8a83 | 345 | int count = 0; |
RobMeades | 0:7ccf0e7e8a83 | 346 | Timer timer; |
RobMeades | 0:7ccf0e7e8a83 | 347 | |
RobMeades | 0:7ccf0e7e8a83 | 348 | timer.start(); |
RobMeades | 0:7ccf0e7e8a83 | 349 | while ((count < size) && (timer.read_ms() < 10000)) { |
RobMeades | 0:7ccf0e7e8a83 | 350 | x = sock->send(data + count, size - count); |
RobMeades | 0:7ccf0e7e8a83 | 351 | if (x > 0) { |
RobMeades | 0:7ccf0e7e8a83 | 352 | count += x; |
RobMeades | 0:7ccf0e7e8a83 | 353 | tr_debug("%d byte(s) sent, %d left to send.", count, size - count); |
RobMeades | 0:7ccf0e7e8a83 | 354 | } |
mudassar0121 |
42:98808477a691 | 355 | ThisThread::sleep_for(10); |
RobMeades | 0:7ccf0e7e8a83 | 356 | } |
RobMeades | 0:7ccf0e7e8a83 | 357 | timer.stop(); |
RobMeades | 0:7ccf0e7e8a83 | 358 | |
RobMeades | 0:7ccf0e7e8a83 | 359 | return count; |
RobMeades | 0:7ccf0e7e8a83 | 360 | } |
RobMeades | 0:7ccf0e7e8a83 | 361 | |
rob.meades@u-blox.com | 6:63dad754c267 | 362 | // Do a TCP echo but using the asynchronous interface |
RobMeades | 0:7ccf0e7e8a83 | 363 | static void do_tcp_echo_async(TCPSocket *sock, int size, bool *callback_triggered) |
RobMeades | 0:7ccf0e7e8a83 | 364 | { |
RobMeades | 0:7ccf0e7e8a83 | 365 | void * recv_data = malloc (size); |
RobMeades | 0:7ccf0e7e8a83 | 366 | int recv_size = 0; |
RobMeades | 0:7ccf0e7e8a83 | 367 | int x, y; |
RobMeades | 0:7ccf0e7e8a83 | 368 | Timer timer; |
RobMeades | 0:7ccf0e7e8a83 | 369 | TEST_ASSERT(recv_data != NULL); |
RobMeades | 0:7ccf0e7e8a83 | 370 | |
RobMeades | 0:7ccf0e7e8a83 | 371 | *callback_triggered = false; |
RobMeades | 0:7ccf0e7e8a83 | 372 | tr_debug("Echo testing TCP packet size %d byte(s) async.", size); |
RobMeades | 0:7ccf0e7e8a83 | 373 | TEST_ASSERT (sendAll(sock, send_data, size) == size); |
RobMeades | 0:7ccf0e7e8a83 | 374 | |
RobMeades | 0:7ccf0e7e8a83 | 375 | // Wait for all the echoed data to arrive |
RobMeades | 0:7ccf0e7e8a83 | 376 | timer.start(); |
RobMeades | 0:7ccf0e7e8a83 | 377 | while ((recv_size < size) && (timer.read_ms() < ASYNC_TEST_WAIT_TIME)) { |
RobMeades | 0:7ccf0e7e8a83 | 378 | if (*callback_triggered) { |
RobMeades | 0:7ccf0e7e8a83 | 379 | *callback_triggered = false; |
RobMeades | 0:7ccf0e7e8a83 | 380 | x = sock->recv((char *) recv_data + recv_size, size); |
RobMeades | 0:7ccf0e7e8a83 | 381 | TEST_ASSERT(x > 0); |
RobMeades | 0:7ccf0e7e8a83 | 382 | recv_size += x; |
RobMeades | 0:7ccf0e7e8a83 | 383 | tr_debug("%d byte(s) echoed back so far, %d to go.", recv_size, size - recv_size); |
RobMeades | 0:7ccf0e7e8a83 | 384 | } |
mudassar0121 |
42:98808477a691 | 385 | ThisThread::sleep_for(10); |
RobMeades | 0:7ccf0e7e8a83 | 386 | } |
RobMeades | 0:7ccf0e7e8a83 | 387 | TEST_ASSERT(recv_size == size); |
RobMeades | 0:7ccf0e7e8a83 | 388 | y = memcmp(send_data, recv_data, size); |
RobMeades | 0:7ccf0e7e8a83 | 389 | if (y != 0) { |
RobMeades | 0:7ccf0e7e8a83 | 390 | tr_debug("Sent %d, |%*.*s|", size, size, size, send_data); |
RobMeades | 0:7ccf0e7e8a83 | 391 | tr_debug("Rcvd %d, |%*.*s|", size, size, size, (char *) recv_data); |
RobMeades | 0:7ccf0e7e8a83 | 392 | TEST_ASSERT(false); |
RobMeades | 0:7ccf0e7e8a83 | 393 | } |
RobMeades | 0:7ccf0e7e8a83 | 394 | timer.stop(); |
RobMeades | 0:7ccf0e7e8a83 | 395 | |
RobMeades | 0:7ccf0e7e8a83 | 396 | TEST_ASSERT(!connection_has_gone_down); |
RobMeades | 0:7ccf0e7e8a83 | 397 | |
RobMeades | 0:7ccf0e7e8a83 | 398 | free (recv_data); |
RobMeades | 0:7ccf0e7e8a83 | 399 | } |
RobMeades | 0:7ccf0e7e8a83 | 400 | #endif |
RobMeades | 0:7ccf0e7e8a83 | 401 | |
RobMeades | 0:7ccf0e7e8a83 | 402 | // Get NTP time from a socket |
RobMeades | 0:7ccf0e7e8a83 | 403 | static void do_ntp_sock (UDPSocket *sock, SocketAddress ntp_address) |
RobMeades | 0:7ccf0e7e8a83 | 404 | { |
RobMeades | 0:7ccf0e7e8a83 | 405 | char ntp_values[48] = { 0 }; |
RobMeades | 0:7ccf0e7e8a83 | 406 | time_t timestamp = 0; |
RobMeades | 0:7ccf0e7e8a83 | 407 | int len; |
RobMeades | 0:7ccf0e7e8a83 | 408 | bool comms_done = false; |
RobMeades | 0:7ccf0e7e8a83 | 409 | |
RobMeades | 0:7ccf0e7e8a83 | 410 | ntp_values[0] = '\x1b'; |
RobMeades | 0:7ccf0e7e8a83 | 411 | |
RobMeades | 0:7ccf0e7e8a83 | 412 | // Retry this a few times, don't want to fail due to a flaky link |
RobMeades | 0:7ccf0e7e8a83 | 413 | for (unsigned int x = 0; !comms_done && (x < NUM_UDP_RETRIES); x++) { |
RobMeades | 0:7ccf0e7e8a83 | 414 | sock->sendto(ntp_address, (void*) ntp_values, sizeof(ntp_values)); |
RobMeades | 0:7ccf0e7e8a83 | 415 | len = sock->recvfrom(&ntp_address, (void*) ntp_values, sizeof(ntp_values)); |
RobMeades | 0:7ccf0e7e8a83 | 416 | if (len > 0) { |
RobMeades | 0:7ccf0e7e8a83 | 417 | comms_done = true; |
RobMeades | 0:7ccf0e7e8a83 | 418 | } |
RobMeades | 0:7ccf0e7e8a83 | 419 | } |
RobMeades | 0:7ccf0e7e8a83 | 420 | TEST_ASSERT (comms_done); |
RobMeades | 0:7ccf0e7e8a83 | 421 | |
RobMeades | 0:7ccf0e7e8a83 | 422 | tr_debug("UDP: %d byte(s) returned by NTP server.", len); |
RobMeades | 0:7ccf0e7e8a83 | 423 | if (len >= 43) { |
SanaMasood | 21:2a500a881a5a | 424 | struct tm *localTime; |
SanaMasood | 21:2a500a881a5a | 425 | time_t TIME1970 = 2208988800U; |
RobMeades | 0:7ccf0e7e8a83 | 426 | timestamp |= ((int) *(ntp_values + 40)) << 24; |
RobMeades | 0:7ccf0e7e8a83 | 427 | timestamp |= ((int) *(ntp_values + 41)) << 16; |
RobMeades | 0:7ccf0e7e8a83 | 428 | timestamp |= ((int) *(ntp_values + 42)) << 8; |
RobMeades | 0:7ccf0e7e8a83 | 429 | timestamp |= ((int) *(ntp_values + 43)); |
RobMeades | 0:7ccf0e7e8a83 | 430 | timestamp -= TIME1970; |
RobMeades | 0:7ccf0e7e8a83 | 431 | srand (timestamp); |
RobMeades | 0:7ccf0e7e8a83 | 432 | tr_debug("srand() called"); |
RobMeades | 0:7ccf0e7e8a83 | 433 | localTime = localtime(×tamp); |
RobMeades | 0:7ccf0e7e8a83 | 434 | if (localTime) { |
SanaMasood | 21:2a500a881a5a | 435 | char timeString[25]; |
RobMeades | 0:7ccf0e7e8a83 | 436 | if (strftime(timeString, sizeof(timeString), "%a %b %d %H:%M:%S %Y", localTime) > 0) { |
RobMeades | 0:7ccf0e7e8a83 | 437 | printf("NTP timestamp is %s.\n", timeString); |
RobMeades | 0:7ccf0e7e8a83 | 438 | } |
RobMeades | 0:7ccf0e7e8a83 | 439 | } |
RobMeades | 0:7ccf0e7e8a83 | 440 | } |
RobMeades | 0:7ccf0e7e8a83 | 441 | } |
RobMeades | 0:7ccf0e7e8a83 | 442 | |
RobMeades | 0:7ccf0e7e8a83 | 443 | // Get NTP time |
rob.meades@u-blox.com | 6:63dad754c267 | 444 | static void do_ntp(UbloxATCellularInterface *interface) |
RobMeades | 0:7ccf0e7e8a83 | 445 | { |
RobMeades | 0:7ccf0e7e8a83 | 446 | UDPSocket sock; |
RobMeades | 0:7ccf0e7e8a83 | 447 | SocketAddress host_address; |
RobMeades | 0:7ccf0e7e8a83 | 448 | |
rob.meades@u-blox.com | 6:63dad754c267 | 449 | TEST_ASSERT(sock.open(interface) == 0) |
RobMeades | 0:7ccf0e7e8a83 | 450 | |
rob.meades@u-blox.com | 6:63dad754c267 | 451 | TEST_ASSERT(interface->gethostbyname(MBED_CONF_APP_NTP_SERVER, &host_address) == 0); |
RobMeades | 0:7ccf0e7e8a83 | 452 | host_address.set_port(MBED_CONF_APP_NTP_PORT); |
RobMeades | 0:7ccf0e7e8a83 | 453 | |
RobMeades | 0:7ccf0e7e8a83 | 454 | tr_debug("UDP: NIST server %s address: %s on port %d.", MBED_CONF_APP_NTP_SERVER, |
RobMeades | 0:7ccf0e7e8a83 | 455 | host_address.get_ip_address(), host_address.get_port()); |
RobMeades | 0:7ccf0e7e8a83 | 456 | |
RobMeades | 0:7ccf0e7e8a83 | 457 | sock.set_timeout(10000); |
RobMeades | 0:7ccf0e7e8a83 | 458 | |
RobMeades | 0:7ccf0e7e8a83 | 459 | do_ntp_sock(&sock, host_address); |
RobMeades | 0:7ccf0e7e8a83 | 460 | |
RobMeades | 0:7ccf0e7e8a83 | 461 | sock.close(); |
RobMeades | 0:7ccf0e7e8a83 | 462 | } |
RobMeades | 0:7ccf0e7e8a83 | 463 | |
RobMeades | 0:7ccf0e7e8a83 | 464 | // Use a connection, checking that it is good |
rob.meades@u-blox.com | 6:63dad754c267 | 465 | static void use_connection(UbloxATCellularInterface *interface) |
RobMeades | 0:7ccf0e7e8a83 | 466 | { |
rob.meades@u-blox.com | 6:63dad754c267 | 467 | const char * ip_address = interface->get_ip_address(); |
rob.meades@u-blox.com | 6:63dad754c267 | 468 | const char * net_mask = interface->get_netmask(); |
rob.meades@u-blox.com | 6:63dad754c267 | 469 | const char * gateway = interface->get_gateway(); |
RobMeades | 0:7ccf0e7e8a83 | 470 | |
rob.meades@u-blox.com | 6:63dad754c267 | 471 | TEST_ASSERT(interface->is_connected()); |
RobMeades | 0:7ccf0e7e8a83 | 472 | |
RobMeades | 0:7ccf0e7e8a83 | 473 | TEST_ASSERT(ip_address != NULL); |
RobMeades | 0:7ccf0e7e8a83 | 474 | tr_debug ("IP address %s.", ip_address); |
RobMeades | 0:7ccf0e7e8a83 | 475 | TEST_ASSERT(net_mask == NULL); |
RobMeades | 0:7ccf0e7e8a83 | 476 | tr_debug ("Net mask %s.", net_mask); |
RobMeades | 0:7ccf0e7e8a83 | 477 | TEST_ASSERT(gateway != NULL); |
RobMeades | 0:7ccf0e7e8a83 | 478 | tr_debug ("Gateway %s.", gateway); |
RobMeades | 0:7ccf0e7e8a83 | 479 | |
rob.meades@u-blox.com | 6:63dad754c267 | 480 | do_ntp(interface); |
RobMeades | 0:7ccf0e7e8a83 | 481 | TEST_ASSERT(!connection_has_gone_down); |
RobMeades | 0:7ccf0e7e8a83 | 482 | } |
RobMeades | 0:7ccf0e7e8a83 | 483 | |
RobMeades | 0:7ccf0e7e8a83 | 484 | // Drop a connection and check that it has dropped |
rob.meades@u-blox.com | 6:63dad754c267 | 485 | static void drop_connection(UbloxATCellularInterface *interface) |
RobMeades | 0:7ccf0e7e8a83 | 486 | { |
rob.meades@u-blox.com | 6:63dad754c267 | 487 | TEST_ASSERT(interface->disconnect() == 0); |
RobMeades | 0:7ccf0e7e8a83 | 488 | TEST_ASSERT(connection_has_gone_down); |
RobMeades | 0:7ccf0e7e8a83 | 489 | connection_has_gone_down = false; |
rob.meades@u-blox.com | 6:63dad754c267 | 490 | TEST_ASSERT(!interface->is_connected()); |
RobMeades | 0:7ccf0e7e8a83 | 491 | } |
RobMeades | 0:7ccf0e7e8a83 | 492 | |
RobMeades | 0:7ccf0e7e8a83 | 493 | // ---------------------------------------------------------------- |
RobMeades | 0:7ccf0e7e8a83 | 494 | // TESTS |
RobMeades | 0:7ccf0e7e8a83 | 495 | // ---------------------------------------------------------------- |
RobMeades | 0:7ccf0e7e8a83 | 496 | |
RobMeades | 12:ff6fac481487 | 497 | // Tests of stuff in the base class |
RobMeades | 12:ff6fac481487 | 498 | void test_base_class() { |
RobMeades | 12:ff6fac481487 | 499 | const char *imei; |
RobMeades | 12:ff6fac481487 | 500 | const char *meid; |
RobMeades | 12:ff6fac481487 | 501 | const char *imsi; |
RobMeades | 12:ff6fac481487 | 502 | const char *iccid; |
RobMeades | 12:ff6fac481487 | 503 | int rssi; |
mudassar0121 |
22:63b1a3c02fb8 | 504 | |
RobMeades | 12:ff6fac481487 | 505 | // Power-up the modem |
RobMeades | 12:ff6fac481487 | 506 | interface->init(); |
mudassar0121 |
22:63b1a3c02fb8 | 507 | |
RobMeades | 12:ff6fac481487 | 508 | // Check all of the IMEI, MEID, IMSI and ICCID calls |
RobMeades | 12:ff6fac481487 | 509 | imei = interface->imei(); |
RobMeades | 12:ff6fac481487 | 510 | if (imei != NULL) { |
RobMeades | 12:ff6fac481487 | 511 | tr_debug("IMEI is %s.", imei); |
RobMeades | 12:ff6fac481487 | 512 | } else { |
RobMeades | 12:ff6fac481487 | 513 | TEST_ASSERT(false); |
RobMeades | 12:ff6fac481487 | 514 | } |
mudassar0121 |
22:63b1a3c02fb8 | 515 | |
RobMeades | 12:ff6fac481487 | 516 | meid = interface->meid(); |
RobMeades | 12:ff6fac481487 | 517 | if (meid != NULL) { |
RobMeades | 12:ff6fac481487 | 518 | tr_debug("MEID is %s.", meid); |
RobMeades | 12:ff6fac481487 | 519 | } else { |
RobMeades | 12:ff6fac481487 | 520 | TEST_ASSERT(false); |
RobMeades | 12:ff6fac481487 | 521 | } |
mudassar0121 |
22:63b1a3c02fb8 | 522 | |
RobMeades | 12:ff6fac481487 | 523 | imsi = interface->imsi(); |
RobMeades | 12:ff6fac481487 | 524 | if (imsi != NULL) { |
RobMeades | 12:ff6fac481487 | 525 | tr_debug("IMSI is %s.", imsi); |
RobMeades | 12:ff6fac481487 | 526 | } else { |
RobMeades | 12:ff6fac481487 | 527 | TEST_ASSERT(false); |
RobMeades | 12:ff6fac481487 | 528 | } |
mudassar0121 |
22:63b1a3c02fb8 | 529 | |
RobMeades | 12:ff6fac481487 | 530 | iccid = interface->iccid(); |
RobMeades | 12:ff6fac481487 | 531 | if (iccid != NULL) { |
RobMeades | 12:ff6fac481487 | 532 | tr_debug("ICCID is %s.", iccid); |
RobMeades | 12:ff6fac481487 | 533 | } else { |
RobMeades | 12:ff6fac481487 | 534 | TEST_ASSERT(false); |
RobMeades | 12:ff6fac481487 | 535 | } |
mudassar0121 |
22:63b1a3c02fb8 | 536 | |
RobMeades | 12:ff6fac481487 | 537 | // Check the RSSI call at least doesn't assert |
RobMeades | 12:ff6fac481487 | 538 | rssi = interface->rssi(); |
RobMeades | 12:ff6fac481487 | 539 | tr_debug("RSSI is %d dBm.", rssi); |
mudassar0121 |
22:63b1a3c02fb8 | 540 | |
RobMeades | 12:ff6fac481487 | 541 | // Now connect and check that the answers for the |
RobMeades | 12:ff6fac481487 | 542 | // static fields are the same while connected |
RobMeades | 12:ff6fac481487 | 543 | TEST_ASSERT(interface->connect(MBED_CONF_APP_DEFAULT_PIN, MBED_CONF_APP_APN, |
RobMeades | 12:ff6fac481487 | 544 | MBED_CONF_APP_USERNAME, MBED_CONF_APP_PASSWORD) == 0); |
mudassar0121 |
22:63b1a3c02fb8 | 545 | |
RobMeades | 12:ff6fac481487 | 546 | TEST_ASSERT(strcmp(imei, interface->imei()) == 0); |
RobMeades | 12:ff6fac481487 | 547 | TEST_ASSERT(strcmp(meid, interface->meid()) == 0); |
RobMeades | 12:ff6fac481487 | 548 | TEST_ASSERT(strcmp(imsi, interface->imsi()) == 0); |
RobMeades | 12:ff6fac481487 | 549 | TEST_ASSERT(strcmp(iccid, interface->iccid()) == 0); |
RobMeades | 12:ff6fac481487 | 550 | |
RobMeades | 12:ff6fac481487 | 551 | // Check that the RSSI call still doesn't assert |
RobMeades | 12:ff6fac481487 | 552 | rssi = interface->rssi(); |
RobMeades | 12:ff6fac481487 | 553 | tr_debug("RSSI is %d dBm.", rssi); |
RobMeades | 12:ff6fac481487 | 554 | } |
RobMeades | 12:ff6fac481487 | 555 | |
RobMeades | 0:7ccf0e7e8a83 | 556 | // Call srand() using the NTP server |
RobMeades | 0:7ccf0e7e8a83 | 557 | void test_set_randomise() { |
RobMeades | 0:7ccf0e7e8a83 | 558 | UDPSocket sock; |
RobMeades | 0:7ccf0e7e8a83 | 559 | SocketAddress host_address; |
RobMeades | 0:7ccf0e7e8a83 | 560 | |
rob.meades@u-blox.com | 6:63dad754c267 | 561 | TEST_ASSERT(interface->connect(MBED_CONF_APP_DEFAULT_PIN, MBED_CONF_APP_APN, |
rob.meades@u-blox.com | 6:63dad754c267 | 562 | MBED_CONF_APP_USERNAME, MBED_CONF_APP_PASSWORD) == 0); |
rob.meades@u-blox.com | 6:63dad754c267 | 563 | do_ntp(interface); |
RobMeades | 0:7ccf0e7e8a83 | 564 | TEST_ASSERT(!connection_has_gone_down); |
rob.meades@u-blox.com | 6:63dad754c267 | 565 | drop_connection(interface); |
mudassar0121 |
39:f038c51be44f | 566 | interface->deinit(); |
RobMeades | 0:7ccf0e7e8a83 | 567 | } |
RobMeades | 0:7ccf0e7e8a83 | 568 | |
RobMeades | 0:7ccf0e7e8a83 | 569 | #ifdef MBED_CONF_APP_ECHO_SERVER |
RobMeades | 0:7ccf0e7e8a83 | 570 | |
RobMeades | 0:7ccf0e7e8a83 | 571 | // Test UDP data exchange |
RobMeades | 0:7ccf0e7e8a83 | 572 | void test_udp_echo() { |
RobMeades | 0:7ccf0e7e8a83 | 573 | UDPSocket sock; |
RobMeades | 0:7ccf0e7e8a83 | 574 | SocketAddress host_address; |
RobMeades | 0:7ccf0e7e8a83 | 575 | SocketAddress local_address; |
RobMeades | 0:7ccf0e7e8a83 | 576 | int x; |
RobMeades | 0:7ccf0e7e8a83 | 577 | int size; |
RobMeades | 0:7ccf0e7e8a83 | 578 | |
rob.meades@u-blox.com | 6:63dad754c267 | 579 | TEST_ASSERT(interface->connect(MBED_CONF_APP_DEFAULT_PIN, MBED_CONF_APP_APN, |
rob.meades@u-blox.com | 6:63dad754c267 | 580 | MBED_CONF_APP_USERNAME, MBED_CONF_APP_PASSWORD) == 0); |
RobMeades | 0:7ccf0e7e8a83 | 581 | |
rob.meades@u-blox.com | 6:63dad754c267 | 582 | TEST_ASSERT(interface->gethostbyname(MBED_CONF_APP_ECHO_SERVER, &host_address) == 0); |
RobMeades | 0:7ccf0e7e8a83 | 583 | host_address.set_port(MBED_CONF_APP_ECHO_UDP_PORT); |
RobMeades | 0:7ccf0e7e8a83 | 584 | |
RobMeades | 0:7ccf0e7e8a83 | 585 | tr_debug("UDP: Server %s address: %s on port %d.", MBED_CONF_APP_ECHO_SERVER, |
RobMeades | 0:7ccf0e7e8a83 | 586 | host_address.get_ip_address(), host_address.get_port()); |
RobMeades | 0:7ccf0e7e8a83 | 587 | |
rob.meades@u-blox.com | 6:63dad754c267 | 588 | TEST_ASSERT(sock.open(interface) == 0) |
RobMeades | 0:7ccf0e7e8a83 | 589 | |
RobMeades | 0:7ccf0e7e8a83 | 590 | // Do a bind, just for the helluvit |
RobMeades | 0:7ccf0e7e8a83 | 591 | local_address.set_port(MBED_CONF_APP_LOCAL_PORT); |
RobMeades | 0:7ccf0e7e8a83 | 592 | TEST_ASSERT(sock.bind(local_address) == 0); |
RobMeades | 0:7ccf0e7e8a83 | 593 | |
RobMeades | 0:7ccf0e7e8a83 | 594 | sock.set_timeout(10000); |
RobMeades | 0:7ccf0e7e8a83 | 595 | |
RobMeades | 0:7ccf0e7e8a83 | 596 | // Test min, max, and some random sizes in-between |
RobMeades | 0:7ccf0e7e8a83 | 597 | do_udp_echo(&sock, &host_address, 1); |
RobMeades | 0:7ccf0e7e8a83 | 598 | do_udp_echo(&sock, &host_address, MBED_CONF_APP_UDP_MAX_PACKET_SIZE); |
RobMeades | 0:7ccf0e7e8a83 | 599 | for (x = 0; x < 10; x++) { |
RobMeades | 0:7ccf0e7e8a83 | 600 | size = (rand() % MBED_CONF_APP_UDP_MAX_PACKET_SIZE) + 1; |
RobMeades | 0:7ccf0e7e8a83 | 601 | size = fix(size, MBED_CONF_APP_UDP_MAX_PACKET_SIZE); |
RobMeades | 0:7ccf0e7e8a83 | 602 | do_udp_echo(&sock, &host_address, size); |
RobMeades | 0:7ccf0e7e8a83 | 603 | } |
RobMeades | 0:7ccf0e7e8a83 | 604 | |
RobMeades | 0:7ccf0e7e8a83 | 605 | sock.close(); |
rob.meades@u-blox.com | 6:63dad754c267 | 606 | drop_connection(interface); |
mudassar0121 |
39:f038c51be44f | 607 | interface->deinit(); |
RobMeades | 0:7ccf0e7e8a83 | 608 | tr_debug("%d UDP packets of size up to %d byte(s) echoed successfully.", |
RobMeades | 0:7ccf0e7e8a83 | 609 | x, MBED_CONF_APP_UDP_MAX_PACKET_SIZE); |
RobMeades | 0:7ccf0e7e8a83 | 610 | } |
RobMeades | 0:7ccf0e7e8a83 | 611 | |
RobMeades | 0:7ccf0e7e8a83 | 612 | // Test many different sizes of UDP data arriving at once |
RobMeades | 0:7ccf0e7e8a83 | 613 | void test_udp_echo_recv_sizes() { |
RobMeades | 0:7ccf0e7e8a83 | 614 | UDPSocket sock; |
RobMeades | 0:7ccf0e7e8a83 | 615 | SocketAddress host_address; |
RobMeades | 0:7ccf0e7e8a83 | 616 | int x, y, z; |
RobMeades | 0:7ccf0e7e8a83 | 617 | int size; |
RobMeades | 0:7ccf0e7e8a83 | 618 | int tries = 0; |
RobMeades | 0:7ccf0e7e8a83 | 619 | unsigned int offset; |
RobMeades | 0:7ccf0e7e8a83 | 620 | char * recv_data; |
RobMeades | 0:7ccf0e7e8a83 | 621 | bool packetLoss; |
RobMeades | 0:7ccf0e7e8a83 | 622 | bool sendSuccess; |
RobMeades | 0:7ccf0e7e8a83 | 623 | Timer timer; |
RobMeades | 0:7ccf0e7e8a83 | 624 | |
rob.meades@u-blox.com | 6:63dad754c267 | 625 | interface->deinit(); |
rob.meades@u-blox.com | 6:63dad754c267 | 626 | TEST_ASSERT(interface->connect(MBED_CONF_APP_DEFAULT_PIN, MBED_CONF_APP_APN, |
rob.meades@u-blox.com | 6:63dad754c267 | 627 | MBED_CONF_APP_USERNAME, MBED_CONF_APP_PASSWORD) == 0); |
RobMeades | 0:7ccf0e7e8a83 | 628 | |
rob.meades@u-blox.com | 6:63dad754c267 | 629 | TEST_ASSERT(interface->gethostbyname(MBED_CONF_APP_ECHO_SERVER, &host_address) == 0); |
RobMeades | 0:7ccf0e7e8a83 | 630 | host_address.set_port(MBED_CONF_APP_ECHO_UDP_PORT); |
RobMeades | 0:7ccf0e7e8a83 | 631 | |
RobMeades | 0:7ccf0e7e8a83 | 632 | tr_debug("UDP: Server %s address: %s on port %d.", MBED_CONF_APP_ECHO_SERVER, |
RobMeades | 0:7ccf0e7e8a83 | 633 | host_address.get_ip_address(), host_address.get_port()); |
RobMeades | 0:7ccf0e7e8a83 | 634 | |
rob.meades@u-blox.com | 6:63dad754c267 | 635 | TEST_ASSERT(sock.open(interface) == 0) |
RobMeades | 0:7ccf0e7e8a83 | 636 | |
RobMeades | 0:7ccf0e7e8a83 | 637 | do { |
RobMeades | 0:7ccf0e7e8a83 | 638 | tr_debug("--- UDP packet size test, test try %d, flushing input buffers", tries + 1); |
RobMeades | 0:7ccf0e7e8a83 | 639 | // First of all, clear any junk from the socket |
RobMeades | 0:7ccf0e7e8a83 | 640 | sock.set_timeout(1000); |
RobMeades | 0:7ccf0e7e8a83 | 641 | recv_data = (char *) malloc (MBED_CONF_APP_UDP_MAX_PACKET_SIZE); |
RobMeades | 0:7ccf0e7e8a83 | 642 | TEST_ASSERT(recv_data != NULL); |
RobMeades | 0:7ccf0e7e8a83 | 643 | while (sock.recvfrom(&host_address, (void *) recv_data, MBED_CONF_APP_UDP_MAX_PACKET_SIZE) > 0) { |
RobMeades | 0:7ccf0e7e8a83 | 644 | // Throw it away |
RobMeades | 0:7ccf0e7e8a83 | 645 | } |
RobMeades | 0:7ccf0e7e8a83 | 646 | free (recv_data); |
RobMeades | 0:7ccf0e7e8a83 | 647 | |
RobMeades | 0:7ccf0e7e8a83 | 648 | sock.set_timeout(10000); |
RobMeades | 0:7ccf0e7e8a83 | 649 | |
RobMeades | 0:7ccf0e7e8a83 | 650 | // Throw random sized UDP packets up... |
RobMeades | 0:7ccf0e7e8a83 | 651 | x = 0; |
RobMeades | 0:7ccf0e7e8a83 | 652 | offset = 0; |
RobMeades | 0:7ccf0e7e8a83 | 653 | while (offset < sizeof (send_data)) { |
RobMeades | 0:7ccf0e7e8a83 | 654 | size = (rand() % (MBED_CONF_APP_UDP_MAX_PACKET_SIZE / 2)) + 1; |
RobMeades | 0:7ccf0e7e8a83 | 655 | size = fix(size, MBED_CONF_APP_UDP_MAX_PACKET_SIZE / 2); |
RobMeades | 0:7ccf0e7e8a83 | 656 | if (offset + size > sizeof (send_data)) { |
RobMeades | 0:7ccf0e7e8a83 | 657 | size = sizeof (send_data) - offset; |
RobMeades | 0:7ccf0e7e8a83 | 658 | } |
RobMeades | 0:7ccf0e7e8a83 | 659 | sendSuccess = false; |
RobMeades | 0:7ccf0e7e8a83 | 660 | for (y = 0; !sendSuccess && (y < NUM_UDP_RETRIES); y++) { |
RobMeades | 0:7ccf0e7e8a83 | 661 | tr_debug("Sending UDP packet number %d, size %d byte(s), send try %d.", x + 1, size, y + 1); |
RobMeades | 0:7ccf0e7e8a83 | 662 | if (sock.sendto(host_address, (void *) (send_data + offset), size) == size) { |
RobMeades | 0:7ccf0e7e8a83 | 663 | sendSuccess = true; |
RobMeades | 0:7ccf0e7e8a83 | 664 | offset += size; |
RobMeades | 0:7ccf0e7e8a83 | 665 | } |
RobMeades | 0:7ccf0e7e8a83 | 666 | } |
RobMeades | 0:7ccf0e7e8a83 | 667 | TEST_ASSERT(sendSuccess); |
RobMeades | 0:7ccf0e7e8a83 | 668 | x++; |
RobMeades | 0:7ccf0e7e8a83 | 669 | } |
RobMeades | 0:7ccf0e7e8a83 | 670 | tr_debug("--- All UDP packets sent"); |
RobMeades | 0:7ccf0e7e8a83 | 671 | |
RobMeades | 0:7ccf0e7e8a83 | 672 | // ...and capture them all again afterwards |
RobMeades | 0:7ccf0e7e8a83 | 673 | recv_data = (char *) malloc (sizeof (send_data)); |
RobMeades | 0:7ccf0e7e8a83 | 674 | TEST_ASSERT(recv_data != NULL); |
RobMeades | 0:7ccf0e7e8a83 | 675 | memset (recv_data, 0, sizeof (send_data)); |
RobMeades | 0:7ccf0e7e8a83 | 676 | size = 0; |
RobMeades | 0:7ccf0e7e8a83 | 677 | y = 0; |
RobMeades | 0:7ccf0e7e8a83 | 678 | packetLoss = false; |
RobMeades | 0:7ccf0e7e8a83 | 679 | timer.start(); |
RobMeades | 0:7ccf0e7e8a83 | 680 | while ((size < (int) sizeof (send_data)) && (timer.read_ms() < 10000)) { |
RobMeades | 0:7ccf0e7e8a83 | 681 | y = sock.recvfrom(&host_address, (void *) (recv_data + size), sizeof (send_data) - size); |
RobMeades | 0:7ccf0e7e8a83 | 682 | if (y > 0) { |
RobMeades | 0:7ccf0e7e8a83 | 683 | size += y; |
RobMeades | 0:7ccf0e7e8a83 | 684 | } |
RobMeades | 0:7ccf0e7e8a83 | 685 | } |
RobMeades | 0:7ccf0e7e8a83 | 686 | timer.stop(); |
RobMeades | 0:7ccf0e7e8a83 | 687 | timer.reset(); |
RobMeades | 0:7ccf0e7e8a83 | 688 | tr_debug( "--- Either received everything back or timed out waiting"); |
RobMeades | 0:7ccf0e7e8a83 | 689 | |
RobMeades | 0:7ccf0e7e8a83 | 690 | // Check that we reassembled everything correctly |
RobMeades | 0:7ccf0e7e8a83 | 691 | if (size == sizeof (send_data)) { |
RobMeades | 0:7ccf0e7e8a83 | 692 | for (x = 0; ((*(recv_data + x) == *(send_data + x))) && (x < (int) sizeof (send_data)); x++) { |
RobMeades | 0:7ccf0e7e8a83 | 693 | } |
RobMeades | 0:7ccf0e7e8a83 | 694 | if (x != sizeof (send_data)) { |
RobMeades | 0:7ccf0e7e8a83 | 695 | y = x - 5; |
RobMeades | 0:7ccf0e7e8a83 | 696 | if (y < 0) { |
RobMeades | 0:7ccf0e7e8a83 | 697 | y = 0; |
RobMeades | 0:7ccf0e7e8a83 | 698 | } |
RobMeades | 0:7ccf0e7e8a83 | 699 | z = 10; |
RobMeades | 0:7ccf0e7e8a83 | 700 | if (y + z > (int) sizeof (send_data)) { |
RobMeades | 0:7ccf0e7e8a83 | 701 | z = sizeof(send_data) - y; |
RobMeades | 0:7ccf0e7e8a83 | 702 | } |
RobMeades | 0:7ccf0e7e8a83 | 703 | tr_debug(" --- Difference at character %d (send \"%*.*s\", recv \"%*.*s\")", |
RobMeades | 0:7ccf0e7e8a83 | 704 | x + 1, z, z, send_data + y, z, z, recv_data + y); |
RobMeades | 0:7ccf0e7e8a83 | 705 | packetLoss = true; |
RobMeades | 0:7ccf0e7e8a83 | 706 | } |
RobMeades | 0:7ccf0e7e8a83 | 707 | } else { |
RobMeades | 0:7ccf0e7e8a83 | 708 | tr_debug(" --- %d bytes missing (%d bytes received when %d were expected))", |
RobMeades | 0:7ccf0e7e8a83 | 709 | sizeof (send_data) - size, size, sizeof (send_data)); |
RobMeades | 0:7ccf0e7e8a83 | 710 | packetLoss = true; |
RobMeades | 0:7ccf0e7e8a83 | 711 | } |
RobMeades | 0:7ccf0e7e8a83 | 712 | free (recv_data); |
RobMeades | 0:7ccf0e7e8a83 | 713 | tries++; |
RobMeades | 0:7ccf0e7e8a83 | 714 | } while (packetLoss && (tries < NUM_UDP_RETRIES)); |
RobMeades | 0:7ccf0e7e8a83 | 715 | |
RobMeades | 0:7ccf0e7e8a83 | 716 | TEST_ASSERT(!packetLoss); |
RobMeades | 0:7ccf0e7e8a83 | 717 | TEST_ASSERT(!connection_has_gone_down); |
RobMeades | 0:7ccf0e7e8a83 | 718 | sock.close(); |
rob.meades@u-blox.com | 6:63dad754c267 | 719 | drop_connection(interface); |
mudassar0121 |
39:f038c51be44f | 720 | interface->deinit(); |
RobMeades | 0:7ccf0e7e8a83 | 721 | } |
RobMeades | 0:7ccf0e7e8a83 | 722 | |
RobMeades | 0:7ccf0e7e8a83 | 723 | // Test UDP data exchange via the asynchronous sigio() mechanism |
RobMeades | 0:7ccf0e7e8a83 | 724 | void test_udp_echo_async() { |
RobMeades | 0:7ccf0e7e8a83 | 725 | UDPSocket sock; |
RobMeades | 0:7ccf0e7e8a83 | 726 | SocketAddress host_address; |
RobMeades | 0:7ccf0e7e8a83 | 727 | SocketAddress local_address; |
RobMeades | 0:7ccf0e7e8a83 | 728 | bool callback_triggered = false; |
RobMeades | 0:7ccf0e7e8a83 | 729 | int x; |
RobMeades | 0:7ccf0e7e8a83 | 730 | int size; |
RobMeades | 0:7ccf0e7e8a83 | 731 | |
rob.meades@u-blox.com | 6:63dad754c267 | 732 | interface->deinit(); |
rob.meades@u-blox.com | 6:63dad754c267 | 733 | TEST_ASSERT(interface->connect(MBED_CONF_APP_DEFAULT_PIN, MBED_CONF_APP_APN, |
rob.meades@u-blox.com | 6:63dad754c267 | 734 | MBED_CONF_APP_USERNAME, MBED_CONF_APP_PASSWORD) == 0); |
RobMeades | 0:7ccf0e7e8a83 | 735 | |
rob.meades@u-blox.com | 6:63dad754c267 | 736 | TEST_ASSERT(interface->gethostbyname(MBED_CONF_APP_ECHO_SERVER, &host_address) == 0); |
RobMeades | 0:7ccf0e7e8a83 | 737 | host_address.set_port(MBED_CONF_APP_ECHO_UDP_PORT); |
RobMeades | 0:7ccf0e7e8a83 | 738 | |
RobMeades | 0:7ccf0e7e8a83 | 739 | tr_debug("UDP: Server %s address: %s on port %d.", MBED_CONF_APP_ECHO_SERVER, |
RobMeades | 0:7ccf0e7e8a83 | 740 | host_address.get_ip_address(), host_address.get_port()); |
RobMeades | 0:7ccf0e7e8a83 | 741 | |
rob.meades@u-blox.com | 6:63dad754c267 | 742 | TEST_ASSERT(sock.open(interface) == 0) |
RobMeades | 0:7ccf0e7e8a83 | 743 | |
RobMeades | 0:7ccf0e7e8a83 | 744 | // Set up the async callback and set the timeout to zero |
RobMeades | 0:7ccf0e7e8a83 | 745 | sock.sigio(callback(async_cb, &callback_triggered)); |
RobMeades | 0:7ccf0e7e8a83 | 746 | sock.set_timeout(0); |
RobMeades | 0:7ccf0e7e8a83 | 747 | |
RobMeades | 0:7ccf0e7e8a83 | 748 | // Test min, max, and some random sizes in-between |
RobMeades | 0:7ccf0e7e8a83 | 749 | // and this time allow the UDP packets to be fragmented |
RobMeades | 0:7ccf0e7e8a83 | 750 | do_udp_echo_async(&sock, &host_address, 1, &callback_triggered); |
RobMeades | 0:7ccf0e7e8a83 | 751 | do_udp_echo_async(&sock, &host_address, MBED_CONF_APP_UDP_MAX_FRAG_PACKET_SIZE, |
RobMeades | 0:7ccf0e7e8a83 | 752 | &callback_triggered); |
RobMeades | 0:7ccf0e7e8a83 | 753 | for (x = 0; x < 10; x++) { |
RobMeades | 0:7ccf0e7e8a83 | 754 | size = (rand() % MBED_CONF_APP_UDP_MAX_FRAG_PACKET_SIZE) + 1; |
RobMeades | 0:7ccf0e7e8a83 | 755 | size = fix(size, MBED_CONF_APP_UDP_MAX_FRAG_PACKET_SIZE); |
RobMeades | 0:7ccf0e7e8a83 | 756 | do_udp_echo_async(&sock, &host_address, size, &callback_triggered); |
RobMeades | 0:7ccf0e7e8a83 | 757 | } |
RobMeades | 0:7ccf0e7e8a83 | 758 | |
RobMeades | 0:7ccf0e7e8a83 | 759 | sock.close(); |
RobMeades | 0:7ccf0e7e8a83 | 760 | |
rob.meades@u-blox.com | 6:63dad754c267 | 761 | drop_connection(interface); |
mudassar0121 |
39:f038c51be44f | 762 | interface->deinit(); |
RobMeades | 0:7ccf0e7e8a83 | 763 | |
RobMeades | 0:7ccf0e7e8a83 | 764 | tr_debug("%d UDP packets of size up to %d byte(s) echoed asynchronously and successfully.", |
RobMeades | 0:7ccf0e7e8a83 | 765 | x, MBED_CONF_APP_UDP_MAX_FRAG_PACKET_SIZE); |
RobMeades | 0:7ccf0e7e8a83 | 766 | } |
RobMeades | 0:7ccf0e7e8a83 | 767 | |
RobMeades | 0:7ccf0e7e8a83 | 768 | // Test many different sizes of TCP data arriving at once |
RobMeades | 0:7ccf0e7e8a83 | 769 | void test_tcp_echo_recv_sizes() { |
RobMeades | 0:7ccf0e7e8a83 | 770 | TCPSocket sock; |
RobMeades | 0:7ccf0e7e8a83 | 771 | SocketAddress host_address; |
RobMeades | 0:7ccf0e7e8a83 | 772 | int x, y, z; |
RobMeades | 0:7ccf0e7e8a83 | 773 | int size; |
RobMeades | 0:7ccf0e7e8a83 | 774 | unsigned int offset; |
RobMeades | 0:7ccf0e7e8a83 | 775 | char * recv_data; |
RobMeades | 0:7ccf0e7e8a83 | 776 | Timer timer; |
RobMeades | 0:7ccf0e7e8a83 | 777 | |
rob.meades@u-blox.com | 6:63dad754c267 | 778 | interface->deinit(); |
rob.meades@u-blox.com | 6:63dad754c267 | 779 | TEST_ASSERT(interface->connect(MBED_CONF_APP_DEFAULT_PIN, MBED_CONF_APP_APN, |
rob.meades@u-blox.com | 6:63dad754c267 | 780 | MBED_CONF_APP_USERNAME, MBED_CONF_APP_PASSWORD) == 0); |
RobMeades | 0:7ccf0e7e8a83 | 781 | |
rob.meades@u-blox.com | 6:63dad754c267 | 782 | TEST_ASSERT(interface->gethostbyname(MBED_CONF_APP_ECHO_SERVER, &host_address) == 0); |
RobMeades | 0:7ccf0e7e8a83 | 783 | host_address.set_port(MBED_CONF_APP_ECHO_TCP_PORT); |
RobMeades | 0:7ccf0e7e8a83 | 784 | |
RobMeades | 0:7ccf0e7e8a83 | 785 | tr_debug("TCP: Server %s address: %s on port %d.", MBED_CONF_APP_ECHO_SERVER, |
RobMeades | 0:7ccf0e7e8a83 | 786 | host_address.get_ip_address(), host_address.get_port()); |
RobMeades | 0:7ccf0e7e8a83 | 787 | |
rob.meades@u-blox.com | 6:63dad754c267 | 788 | TEST_ASSERT(sock.open(interface) == 0) |
RobMeades | 0:7ccf0e7e8a83 | 789 | |
RobMeades | 0:7ccf0e7e8a83 | 790 | TEST_ASSERT(sock.connect(host_address) == 0); |
RobMeades | 0:7ccf0e7e8a83 | 791 | |
RobMeades | 0:7ccf0e7e8a83 | 792 | sock.set_timeout(10000); |
RobMeades | 0:7ccf0e7e8a83 | 793 | |
RobMeades | 0:7ccf0e7e8a83 | 794 | // Throw random sized TCP packets up... |
RobMeades | 0:7ccf0e7e8a83 | 795 | x = 0; |
RobMeades | 0:7ccf0e7e8a83 | 796 | offset = 0; |
RobMeades | 0:7ccf0e7e8a83 | 797 | while (offset < sizeof (send_data)) { |
RobMeades | 0:7ccf0e7e8a83 | 798 | size = (rand() % (MBED_CONF_APP_UDP_MAX_PACKET_SIZE / 2)) + 1; |
RobMeades | 0:7ccf0e7e8a83 | 799 | size = fix(size, MBED_CONF_APP_UDP_MAX_PACKET_SIZE / 2); |
RobMeades | 0:7ccf0e7e8a83 | 800 | if (offset + size > sizeof (send_data)) { |
RobMeades | 0:7ccf0e7e8a83 | 801 | size = sizeof (send_data) - offset; |
RobMeades | 0:7ccf0e7e8a83 | 802 | } |
RobMeades | 0:7ccf0e7e8a83 | 803 | tr_debug("Sending TCP packet number %d, size %d byte(s).", x + 1, size); |
RobMeades | 0:7ccf0e7e8a83 | 804 | TEST_ASSERT(sendAll(&sock, (send_data + offset), size) == size); |
RobMeades | 0:7ccf0e7e8a83 | 805 | offset += size; |
RobMeades | 0:7ccf0e7e8a83 | 806 | x++; |
RobMeades | 0:7ccf0e7e8a83 | 807 | } |
RobMeades | 0:7ccf0e7e8a83 | 808 | |
RobMeades | 0:7ccf0e7e8a83 | 809 | // ...and capture them all again afterwards |
RobMeades | 0:7ccf0e7e8a83 | 810 | recv_data = (char *) malloc (sizeof (send_data)); |
RobMeades | 0:7ccf0e7e8a83 | 811 | TEST_ASSERT(recv_data != NULL); |
RobMeades | 0:7ccf0e7e8a83 | 812 | memset (recv_data, 0, sizeof (send_data)); |
RobMeades | 0:7ccf0e7e8a83 | 813 | size = 0; |
RobMeades | 0:7ccf0e7e8a83 | 814 | x = 0; |
RobMeades | 0:7ccf0e7e8a83 | 815 | timer.start(); |
RobMeades | 0:7ccf0e7e8a83 | 816 | while ((size < (int) sizeof (send_data)) && (timer.read_ms() < 30000)) { |
RobMeades | 0:7ccf0e7e8a83 | 817 | y = sock.recv((void *) (recv_data + size), sizeof (send_data) - size); |
RobMeades | 0:7ccf0e7e8a83 | 818 | tr_debug("Received TCP packet number %d, size %d byte(s).", x, y); |
RobMeades | 0:7ccf0e7e8a83 | 819 | size += y; |
RobMeades | 0:7ccf0e7e8a83 | 820 | x++; |
RobMeades | 0:7ccf0e7e8a83 | 821 | } |
RobMeades | 0:7ccf0e7e8a83 | 822 | timer.stop(); |
RobMeades | 0:7ccf0e7e8a83 | 823 | timer.reset(); |
RobMeades | 0:7ccf0e7e8a83 | 824 | |
RobMeades | 0:7ccf0e7e8a83 | 825 | // Check that we reassembled everything correctly |
RobMeades | 0:7ccf0e7e8a83 | 826 | for (x = 0; ((*(recv_data + x) == *(send_data + x))) && (x < (int) sizeof (send_data)); x++) { |
RobMeades | 0:7ccf0e7e8a83 | 827 | } |
RobMeades | 0:7ccf0e7e8a83 | 828 | if (x != sizeof (send_data)) { |
RobMeades | 0:7ccf0e7e8a83 | 829 | y = x - 5; |
RobMeades | 0:7ccf0e7e8a83 | 830 | if (y < 0) { |
RobMeades | 0:7ccf0e7e8a83 | 831 | y = 0; |
RobMeades | 0:7ccf0e7e8a83 | 832 | } |
RobMeades | 0:7ccf0e7e8a83 | 833 | z = 10; |
RobMeades | 0:7ccf0e7e8a83 | 834 | if (y + z > (int) sizeof (send_data)) { |
RobMeades | 0:7ccf0e7e8a83 | 835 | z = sizeof(send_data) - y; |
RobMeades | 0:7ccf0e7e8a83 | 836 | } |
RobMeades | 0:7ccf0e7e8a83 | 837 | tr_debug("Difference at character %d (send \"%*.*s\", recv \"%*.*s\")", |
RobMeades | 0:7ccf0e7e8a83 | 838 | x + 1, z, z, send_data + y, z, z, recv_data + y); |
RobMeades | 0:7ccf0e7e8a83 | 839 | TEST_ASSERT(false); |
RobMeades | 0:7ccf0e7e8a83 | 840 | } |
RobMeades | 0:7ccf0e7e8a83 | 841 | free (recv_data); |
RobMeades | 0:7ccf0e7e8a83 | 842 | |
RobMeades | 0:7ccf0e7e8a83 | 843 | TEST_ASSERT(!connection_has_gone_down); |
RobMeades | 0:7ccf0e7e8a83 | 844 | sock.close(); |
rob.meades@u-blox.com | 6:63dad754c267 | 845 | drop_connection(interface); |
mudassar0121 |
39:f038c51be44f | 846 | interface->deinit(); |
RobMeades | 0:7ccf0e7e8a83 | 847 | } |
RobMeades | 0:7ccf0e7e8a83 | 848 | |
RobMeades | 0:7ccf0e7e8a83 | 849 | // Test TCP data exchange via the asynchronous sigio() mechanism |
RobMeades | 0:7ccf0e7e8a83 | 850 | void test_tcp_echo_async() { |
RobMeades | 0:7ccf0e7e8a83 | 851 | TCPSocket sock; |
RobMeades | 0:7ccf0e7e8a83 | 852 | SocketAddress host_address; |
RobMeades | 0:7ccf0e7e8a83 | 853 | bool callback_triggered = false; |
RobMeades | 0:7ccf0e7e8a83 | 854 | int x; |
RobMeades | 0:7ccf0e7e8a83 | 855 | int size; |
RobMeades | 0:7ccf0e7e8a83 | 856 | |
rob.meades@u-blox.com | 6:63dad754c267 | 857 | interface->deinit(); |
rob.meades@u-blox.com | 6:63dad754c267 | 858 | TEST_ASSERT(interface->connect(MBED_CONF_APP_DEFAULT_PIN, MBED_CONF_APP_APN, |
rob.meades@u-blox.com | 6:63dad754c267 | 859 | MBED_CONF_APP_USERNAME, MBED_CONF_APP_PASSWORD) == 0); |
RobMeades | 0:7ccf0e7e8a83 | 860 | |
rob.meades@u-blox.com | 6:63dad754c267 | 861 | TEST_ASSERT(interface->gethostbyname(MBED_CONF_APP_ECHO_SERVER, &host_address) == 0); |
RobMeades | 0:7ccf0e7e8a83 | 862 | host_address.set_port(MBED_CONF_APP_ECHO_TCP_PORT); |
RobMeades | 0:7ccf0e7e8a83 | 863 | |
RobMeades | 0:7ccf0e7e8a83 | 864 | tr_debug("TCP: Server %s address: %s on port %d.", MBED_CONF_APP_ECHO_SERVER, |
RobMeades | 0:7ccf0e7e8a83 | 865 | host_address.get_ip_address(), host_address.get_port()); |
RobMeades | 0:7ccf0e7e8a83 | 866 | |
rob.meades@u-blox.com | 6:63dad754c267 | 867 | TEST_ASSERT(sock.open(interface) == 0) |
RobMeades | 0:7ccf0e7e8a83 | 868 | |
RobMeades | 0:7ccf0e7e8a83 | 869 | // Set up the async callback and set the timeout to zero |
RobMeades | 0:7ccf0e7e8a83 | 870 | sock.sigio(callback(async_cb, &callback_triggered)); |
RobMeades | 0:7ccf0e7e8a83 | 871 | sock.set_timeout(0); |
RobMeades | 0:7ccf0e7e8a83 | 872 | |
RobMeades | 0:7ccf0e7e8a83 | 873 | TEST_ASSERT(sock.connect(host_address) == 0); |
RobMeades | 0:7ccf0e7e8a83 | 874 | // Test min, max, and some random sizes in-between |
RobMeades | 0:7ccf0e7e8a83 | 875 | do_tcp_echo_async(&sock, 1, &callback_triggered); |
RobMeades | 0:7ccf0e7e8a83 | 876 | do_tcp_echo_async(&sock, MBED_CONF_APP_TCP_MAX_PACKET_SIZE, &callback_triggered); |
RobMeades | 0:7ccf0e7e8a83 | 877 | for (x = 0; x < 10; x++) { |
RobMeades | 0:7ccf0e7e8a83 | 878 | size = (rand() % MBED_CONF_APP_TCP_MAX_PACKET_SIZE) + 1; |
RobMeades | 0:7ccf0e7e8a83 | 879 | size = fix(size, MBED_CONF_APP_TCP_MAX_PACKET_SIZE); |
RobMeades | 0:7ccf0e7e8a83 | 880 | do_tcp_echo_async(&sock, size, &callback_triggered); |
RobMeades | 0:7ccf0e7e8a83 | 881 | } |
RobMeades | 0:7ccf0e7e8a83 | 882 | |
RobMeades | 0:7ccf0e7e8a83 | 883 | sock.close(); |
RobMeades | 0:7ccf0e7e8a83 | 884 | |
rob.meades@u-blox.com | 6:63dad754c267 | 885 | drop_connection(interface); |
mudassar0121 |
39:f038c51be44f | 886 | interface->deinit(); |
RobMeades | 0:7ccf0e7e8a83 | 887 | |
RobMeades | 0:7ccf0e7e8a83 | 888 | tr_debug("%d TCP packets of size up to %d byte(s) echoed asynchronously and successfully.", |
RobMeades | 0:7ccf0e7e8a83 | 889 | x, MBED_CONF_APP_TCP_MAX_PACKET_SIZE); |
RobMeades | 0:7ccf0e7e8a83 | 890 | } |
RobMeades | 0:7ccf0e7e8a83 | 891 | #endif |
RobMeades | 0:7ccf0e7e8a83 | 892 | |
RobMeades | 0:7ccf0e7e8a83 | 893 | // Allocate max sockets |
RobMeades | 0:7ccf0e7e8a83 | 894 | void test_max_sockets() { |
RobMeades | 0:7ccf0e7e8a83 | 895 | UDPSocket sock[MAX_NUM_SOCKETS]; |
RobMeades | 0:7ccf0e7e8a83 | 896 | UDPSocket sockNone; |
RobMeades | 0:7ccf0e7e8a83 | 897 | SocketAddress host_address; |
RobMeades | 0:7ccf0e7e8a83 | 898 | |
rob.meades@u-blox.com | 6:63dad754c267 | 899 | TEST_ASSERT(interface->connect(MBED_CONF_APP_DEFAULT_PIN, MBED_CONF_APP_APN, |
rob.meades@u-blox.com | 6:63dad754c267 | 900 | MBED_CONF_APP_USERNAME, MBED_CONF_APP_PASSWORD) == 0); |
RobMeades | 0:7ccf0e7e8a83 | 901 | |
rob.meades@u-blox.com | 6:63dad754c267 | 902 | TEST_ASSERT(interface->gethostbyname(MBED_CONF_APP_NTP_SERVER, &host_address) == 0); |
RobMeades | 0:7ccf0e7e8a83 | 903 | host_address.set_port(MBED_CONF_APP_NTP_PORT); |
RobMeades | 0:7ccf0e7e8a83 | 904 | |
RobMeades | 0:7ccf0e7e8a83 | 905 | // Open the first socket and use it |
rob.meades@u-blox.com | 6:63dad754c267 | 906 | TEST_ASSERT(sock[0].open(interface) == 0) |
RobMeades | 0:7ccf0e7e8a83 | 907 | sock[0].set_timeout(10000); |
RobMeades | 0:7ccf0e7e8a83 | 908 | do_ntp_sock(&sock[0], host_address); |
RobMeades | 0:7ccf0e7e8a83 | 909 | |
RobMeades | 0:7ccf0e7e8a83 | 910 | // Check that we stop being able to get sockets at the max number |
RobMeades | 0:7ccf0e7e8a83 | 911 | for (int x = 1; x < (int) (sizeof (sock) / sizeof (sock[0])); x++) { |
rob.meades@u-blox.com | 6:63dad754c267 | 912 | TEST_ASSERT(sock[x].open(interface) == 0) |
RobMeades | 0:7ccf0e7e8a83 | 913 | } |
rob.meades@u-blox.com | 6:63dad754c267 | 914 | TEST_ASSERT(sockNone.open(interface) < 0); |
RobMeades | 0:7ccf0e7e8a83 | 915 | |
RobMeades | 0:7ccf0e7e8a83 | 916 | // Now use the last one |
RobMeades | 0:7ccf0e7e8a83 | 917 | sock[sizeof (sock) / sizeof (sock[0]) - 1].set_timeout(10000); |
RobMeades | 0:7ccf0e7e8a83 | 918 | do_ntp_sock(&sock[sizeof (sock) / sizeof (sock[0]) - 1], host_address); |
RobMeades | 0:7ccf0e7e8a83 | 919 | |
RobMeades | 0:7ccf0e7e8a83 | 920 | // Close all of the sockets |
RobMeades | 0:7ccf0e7e8a83 | 921 | for (int x = 0; x < (int) (sizeof (sock) / sizeof (sock[0])); x++) { |
RobMeades | 0:7ccf0e7e8a83 | 922 | TEST_ASSERT(sock[x].close() == 0); |
RobMeades | 0:7ccf0e7e8a83 | 923 | } |
RobMeades | 0:7ccf0e7e8a83 | 924 | |
rob.meades@u-blox.com | 6:63dad754c267 | 925 | drop_connection(interface); |
mudassar0121 |
39:f038c51be44f | 926 | interface->deinit(); |
RobMeades | 0:7ccf0e7e8a83 | 927 | } |
RobMeades | 0:7ccf0e7e8a83 | 928 | |
RobMeades | 0:7ccf0e7e8a83 | 929 | // Connect with credentials included in the connect request |
RobMeades | 0:7ccf0e7e8a83 | 930 | void test_connect_credentials() { |
RobMeades | 0:7ccf0e7e8a83 | 931 | |
rob.meades@u-blox.com | 6:63dad754c267 | 932 | interface->deinit(); |
rob.meades@u-blox.com | 6:63dad754c267 | 933 | TEST_ASSERT(interface->connect(MBED_CONF_APP_DEFAULT_PIN, MBED_CONF_APP_APN, |
rob.meades@u-blox.com | 6:63dad754c267 | 934 | MBED_CONF_APP_USERNAME, MBED_CONF_APP_PASSWORD) == 0); |
rob.meades@u-blox.com | 6:63dad754c267 | 935 | use_connection(interface); |
rob.meades@u-blox.com | 6:63dad754c267 | 936 | drop_connection(interface); |
mudassar0121 |
39:f038c51be44f | 937 | interface->deinit(); |
RobMeades | 0:7ccf0e7e8a83 | 938 | } |
RobMeades | 0:7ccf0e7e8a83 | 939 | |
RobMeades | 0:7ccf0e7e8a83 | 940 | // Test with credentials preset |
RobMeades | 0:7ccf0e7e8a83 | 941 | void test_connect_preset_credentials() { |
RobMeades | 0:7ccf0e7e8a83 | 942 | |
rob.meades@u-blox.com | 6:63dad754c267 | 943 | interface->deinit(); |
rob.meades@u-blox.com | 6:63dad754c267 | 944 | TEST_ASSERT(interface->init(MBED_CONF_APP_DEFAULT_PIN)); |
rob.meades@u-blox.com | 6:63dad754c267 | 945 | interface->set_credentials(MBED_CONF_APP_APN, MBED_CONF_APP_USERNAME, |
rob.meades@u-blox.com | 6:63dad754c267 | 946 | MBED_CONF_APP_PASSWORD); |
rob.meades@u-blox.com | 6:63dad754c267 | 947 | TEST_ASSERT(interface->connect(MBED_CONF_APP_DEFAULT_PIN) == 0); |
rob.meades@u-blox.com | 6:63dad754c267 | 948 | use_connection(interface); |
rob.meades@u-blox.com | 6:63dad754c267 | 949 | drop_connection(interface); |
mudassar0121 |
39:f038c51be44f | 950 | interface->deinit(); |
RobMeades | 0:7ccf0e7e8a83 | 951 | } |
RobMeades | 0:7ccf0e7e8a83 | 952 | |
RobMeades | 0:7ccf0e7e8a83 | 953 | // Test adding and using a SIM pin, then removing it, using the pending |
RobMeades | 0:7ccf0e7e8a83 | 954 | // mechanism where the change doesn't occur until connect() is called |
RobMeades | 0:7ccf0e7e8a83 | 955 | void test_check_sim_pin_pending() { |
RobMeades | 0:7ccf0e7e8a83 | 956 | |
rob.meades@u-blox.com | 6:63dad754c267 | 957 | interface->deinit(); |
RobMeades | 0:7ccf0e7e8a83 | 958 | |
RobMeades | 0:7ccf0e7e8a83 | 959 | // Enable PIN checking (which will use the current PIN) |
RobMeades | 0:7ccf0e7e8a83 | 960 | // and also flag that the PIN should be changed to MBED_CONF_APP_ALT_PIN, |
RobMeades | 0:7ccf0e7e8a83 | 961 | // then try connecting |
rob.meades@u-blox.com | 6:63dad754c267 | 962 | interface->set_sim_pin_check(true); |
rob.meades@u-blox.com | 6:63dad754c267 | 963 | interface->set_new_sim_pin(MBED_CONF_APP_ALT_PIN); |
rob.meades@u-blox.com | 6:63dad754c267 | 964 | TEST_ASSERT(interface->connect(MBED_CONF_APP_DEFAULT_PIN, MBED_CONF_APP_APN, |
rob.meades@u-blox.com | 6:63dad754c267 | 965 | MBED_CONF_APP_USERNAME, MBED_CONF_APP_PASSWORD) == 0); |
rob.meades@u-blox.com | 6:63dad754c267 | 966 | use_connection(interface); |
rob.meades@u-blox.com | 6:63dad754c267 | 967 | drop_connection(interface); |
rob.meades@u-blox.com | 6:63dad754c267 | 968 | interface->deinit(); |
RobMeades | 0:7ccf0e7e8a83 | 969 | |
RobMeades | 0:7ccf0e7e8a83 | 970 | // Now change the PIN back to what it was before |
rob.meades@u-blox.com | 6:63dad754c267 | 971 | interface->set_new_sim_pin(MBED_CONF_APP_DEFAULT_PIN); |
rob.meades@u-blox.com | 6:63dad754c267 | 972 | TEST_ASSERT(interface->connect(MBED_CONF_APP_ALT_PIN, MBED_CONF_APP_APN, |
rob.meades@u-blox.com | 6:63dad754c267 | 973 | MBED_CONF_APP_USERNAME, MBED_CONF_APP_PASSWORD) == 0); |
rob.meades@u-blox.com | 6:63dad754c267 | 974 | use_connection(interface); |
rob.meades@u-blox.com | 6:63dad754c267 | 975 | drop_connection(interface); |
rob.meades@u-blox.com | 6:63dad754c267 | 976 | interface->deinit(); |
RobMeades | 0:7ccf0e7e8a83 | 977 | |
RobMeades | 0:7ccf0e7e8a83 | 978 | // Check that it was changed back, and this time |
RobMeades | 0:7ccf0e7e8a83 | 979 | // use the other way of entering the PIN |
rob.meades@u-blox.com | 6:63dad754c267 | 980 | interface->set_sim_pin(MBED_CONF_APP_DEFAULT_PIN); |
rob.meades@u-blox.com | 6:63dad754c267 | 981 | TEST_ASSERT(interface->connect(NULL, MBED_CONF_APP_APN, MBED_CONF_APP_USERNAME, |
rob.meades@u-blox.com | 6:63dad754c267 | 982 | MBED_CONF_APP_PASSWORD) == 0); |
rob.meades@u-blox.com | 6:63dad754c267 | 983 | use_connection(interface); |
rob.meades@u-blox.com | 6:63dad754c267 | 984 | drop_connection(interface); |
rob.meades@u-blox.com | 6:63dad754c267 | 985 | interface->deinit(); |
RobMeades | 0:7ccf0e7e8a83 | 986 | |
RobMeades | 0:7ccf0e7e8a83 | 987 | // Remove PIN checking again and check that it no |
RobMeades | 0:7ccf0e7e8a83 | 988 | // longer matters what the PIN is |
rob.meades@u-blox.com | 6:63dad754c267 | 989 | interface->set_sim_pin_check(false); |
rob.meades@u-blox.com | 6:63dad754c267 | 990 | TEST_ASSERT(interface->connect(MBED_CONF_APP_DEFAULT_PIN, MBED_CONF_APP_APN, |
rob.meades@u-blox.com | 6:63dad754c267 | 991 | MBED_CONF_APP_USERNAME, MBED_CONF_APP_PASSWORD) == 0); |
rob.meades@u-blox.com | 6:63dad754c267 | 992 | use_connection(interface); |
rob.meades@u-blox.com | 6:63dad754c267 | 993 | drop_connection(interface); |
rob.meades@u-blox.com | 6:63dad754c267 | 994 | interface->deinit(); |
rob.meades@u-blox.com | 6:63dad754c267 | 995 | TEST_ASSERT(interface->init(NULL)); |
rob.meades@u-blox.com | 6:63dad754c267 | 996 | TEST_ASSERT(interface->connect(MBED_CONF_APP_INCORRECT_PIN, MBED_CONF_APP_APN, |
rob.meades@u-blox.com | 6:63dad754c267 | 997 | MBED_CONF_APP_USERNAME, MBED_CONF_APP_PASSWORD) == 0); |
rob.meades@u-blox.com | 6:63dad754c267 | 998 | use_connection(interface); |
rob.meades@u-blox.com | 6:63dad754c267 | 999 | drop_connection(interface); |
RobMeades | 0:7ccf0e7e8a83 | 1000 | |
RobMeades | 0:7ccf0e7e8a83 | 1001 | // Put the SIM pin back to the correct value for any subsequent tests |
rob.meades@u-blox.com | 6:63dad754c267 | 1002 | interface->set_sim_pin(MBED_CONF_APP_DEFAULT_PIN); |
mudassar0121 |
39:f038c51be44f | 1003 | interface->deinit(); |
RobMeades | 0:7ccf0e7e8a83 | 1004 | } |
RobMeades | 0:7ccf0e7e8a83 | 1005 | |
RobMeades | 0:7ccf0e7e8a83 | 1006 | // Test adding and using a SIM pin, then removing it, using the immediate |
RobMeades | 0:7ccf0e7e8a83 | 1007 | // mechanism |
RobMeades | 0:7ccf0e7e8a83 | 1008 | void test_check_sim_pin_immediate() { |
RobMeades | 0:7ccf0e7e8a83 | 1009 | |
rob.meades@u-blox.com | 6:63dad754c267 | 1010 | interface->deinit(); |
rob.meades@u-blox.com | 6:63dad754c267 | 1011 | interface->connection_status_cb(connection_down_cb); |
RobMeades | 0:7ccf0e7e8a83 | 1012 | |
RobMeades | 0:7ccf0e7e8a83 | 1013 | // Enable PIN checking (which will use the current PIN), change |
RobMeades | 0:7ccf0e7e8a83 | 1014 | // the PIN to MBED_CONF_APP_ALT_PIN, then try connecting after powering on and |
RobMeades | 0:7ccf0e7e8a83 | 1015 | // off the modem |
rob.meades@u-blox.com | 6:63dad754c267 | 1016 | interface->set_sim_pin_check(true, true, MBED_CONF_APP_DEFAULT_PIN); |
rob.meades@u-blox.com | 6:63dad754c267 | 1017 | interface->set_new_sim_pin(MBED_CONF_APP_ALT_PIN, true); |
rob.meades@u-blox.com | 6:63dad754c267 | 1018 | interface->deinit(); |
rob.meades@u-blox.com | 6:63dad754c267 | 1019 | TEST_ASSERT(interface->init(NULL)); |
rob.meades@u-blox.com | 6:63dad754c267 | 1020 | TEST_ASSERT(interface->connect(MBED_CONF_APP_ALT_PIN, MBED_CONF_APP_APN, |
rob.meades@u-blox.com | 6:63dad754c267 | 1021 | MBED_CONF_APP_USERNAME, MBED_CONF_APP_PASSWORD) == 0); |
rob.meades@u-blox.com | 6:63dad754c267 | 1022 | use_connection(interface); |
rob.meades@u-blox.com | 6:63dad754c267 | 1023 | drop_connection(interface); |
RobMeades | 0:7ccf0e7e8a83 | 1024 | |
rob.meades@u-blox.com | 6:63dad754c267 | 1025 | interface->connection_status_cb(connection_down_cb); |
RobMeades | 0:7ccf0e7e8a83 | 1026 | |
RobMeades | 0:7ccf0e7e8a83 | 1027 | // Now change the PIN back to what it was before |
rob.meades@u-blox.com | 6:63dad754c267 | 1028 | interface->set_new_sim_pin(MBED_CONF_APP_DEFAULT_PIN, true); |
rob.meades@u-blox.com | 6:63dad754c267 | 1029 | interface->deinit(); |
rob.meades@u-blox.com | 6:63dad754c267 | 1030 | interface->set_sim_pin(MBED_CONF_APP_DEFAULT_PIN); |
rob.meades@u-blox.com | 6:63dad754c267 | 1031 | TEST_ASSERT(interface->init(NULL)); |
rob.meades@u-blox.com | 6:63dad754c267 | 1032 | TEST_ASSERT(interface->connect(NULL, MBED_CONF_APP_APN, MBED_CONF_APP_USERNAME, |
rob.meades@u-blox.com | 6:63dad754c267 | 1033 | MBED_CONF_APP_PASSWORD) == 0); |
rob.meades@u-blox.com | 6:63dad754c267 | 1034 | use_connection(interface); |
rob.meades@u-blox.com | 6:63dad754c267 | 1035 | drop_connection(interface); |
RobMeades | 0:7ccf0e7e8a83 | 1036 | |
rob.meades@u-blox.com | 6:63dad754c267 | 1037 | interface->connection_status_cb(connection_down_cb); |
RobMeades | 0:7ccf0e7e8a83 | 1038 | |
RobMeades | 0:7ccf0e7e8a83 | 1039 | // Remove PIN checking again and check that it no |
RobMeades | 0:7ccf0e7e8a83 | 1040 | // longer matters what the PIN is |
rob.meades@u-blox.com | 6:63dad754c267 | 1041 | interface->set_sim_pin_check(false, true); |
rob.meades@u-blox.com | 6:63dad754c267 | 1042 | interface->deinit(); |
rob.meades@u-blox.com | 6:63dad754c267 | 1043 | TEST_ASSERT(interface->init(MBED_CONF_APP_INCORRECT_PIN)); |
rob.meades@u-blox.com | 6:63dad754c267 | 1044 | TEST_ASSERT(interface->connect(NULL, MBED_CONF_APP_APN, MBED_CONF_APP_USERNAME, |
rob.meades@u-blox.com | 6:63dad754c267 | 1045 | MBED_CONF_APP_PASSWORD) == 0); |
rob.meades@u-blox.com | 6:63dad754c267 | 1046 | use_connection(interface); |
rob.meades@u-blox.com | 6:63dad754c267 | 1047 | drop_connection(interface); |
RobMeades | 0:7ccf0e7e8a83 | 1048 | |
RobMeades | 0:7ccf0e7e8a83 | 1049 | // Put the SIM pin back to the correct value for any subsequent tests |
rob.meades@u-blox.com | 6:63dad754c267 | 1050 | interface->set_sim_pin(MBED_CONF_APP_DEFAULT_PIN); |
mudassar0121 |
39:f038c51be44f | 1051 | interface->deinit(); |
RobMeades | 0:7ccf0e7e8a83 | 1052 | } |
RobMeades | 0:7ccf0e7e8a83 | 1053 | |
rob.meades@u-blox.com | 6:63dad754c267 | 1054 | // Test being able to connect with a local instance of the interface |
RobMeades | 0:7ccf0e7e8a83 | 1055 | // NOTE: since this local instance will fiddle with bits of HW that the |
RobMeades | 0:7ccf0e7e8a83 | 1056 | // static instance thought it owned, the static instance will no longer |
RobMeades | 0:7ccf0e7e8a83 | 1057 | // work afterwards, hence this must be run as the last test in the list |
RobMeades | 0:7ccf0e7e8a83 | 1058 | void test_connect_local_instance_last_test() { |
RobMeades | 0:7ccf0e7e8a83 | 1059 | |
RobMeades | 0:7ccf0e7e8a83 | 1060 | UbloxATCellularInterface *pLocalInterface = NULL; |
RobMeades | 0:7ccf0e7e8a83 | 1061 | |
RobMeades | 0:7ccf0e7e8a83 | 1062 | pLocalInterface = new UbloxATCellularInterface(MDMTXD, MDMRXD, |
RobMeades | 0:7ccf0e7e8a83 | 1063 | MBED_CONF_UBLOX_CELL_BAUD_RATE, |
RobMeades | 0:7ccf0e7e8a83 | 1064 | MBED_CONF_APP_DEBUG_ON); |
RobMeades | 0:7ccf0e7e8a83 | 1065 | pLocalInterface->connection_status_cb(connection_down_cb); |
RobMeades | 0:7ccf0e7e8a83 | 1066 | |
RobMeades | 0:7ccf0e7e8a83 | 1067 | TEST_ASSERT(pLocalInterface->connect(MBED_CONF_APP_DEFAULT_PIN, MBED_CONF_APP_APN, |
RobMeades | 0:7ccf0e7e8a83 | 1068 | MBED_CONF_APP_USERNAME, MBED_CONF_APP_PASSWORD) == 0); |
RobMeades | 0:7ccf0e7e8a83 | 1069 | use_connection(pLocalInterface); |
RobMeades | 0:7ccf0e7e8a83 | 1070 | drop_connection(pLocalInterface); |
RobMeades | 0:7ccf0e7e8a83 | 1071 | delete pLocalInterface; |
RobMeades | 0:7ccf0e7e8a83 | 1072 | } |
wajahat.abbas@u-blox.com | 37:0ceb2dfc746c | 1073 | #if defined (TARGET_UBLOX_C030_U201) || defined (TARGET_UBLOX_C030_R412M) |
mudassar0121 |
22:63b1a3c02fb8 | 1074 | void test_set_new_rat() { |
mudassar0121 |
22:63b1a3c02fb8 | 1075 | |
mudassar0121 |
22:63b1a3c02fb8 | 1076 | int currentSelectedRat = -1, currentPreferredRat = -1, currentSecondPreferredRat = -1; |
mudassar0121 |
22:63b1a3c02fb8 | 1077 | |
mudassar0121 |
22:63b1a3c02fb8 | 1078 | // Power-up the modem |
mudassar0121 |
22:63b1a3c02fb8 | 1079 | TEST_ASSERT(interface->init()); |
mudassar0121 |
40:9299d6d117f1 | 1080 | interface->set_functionality_mode(UbloxCellularBase::FUNC_FULL); |
mudassar0121 |
22:63b1a3c02fb8 | 1081 | |
mudassar0121 |
22:63b1a3c02fb8 | 1082 | // Check if modem is registered with network |
mudassar0121 |
22:63b1a3c02fb8 | 1083 | if (interface->is_registered_csd() || interface->is_registered_psd() || interface->is_registered_eps()) { |
mudassar0121 |
22:63b1a3c02fb8 | 1084 | tr_error("RAT should only be set in detached state"); |
mudassar0121 |
22:63b1a3c02fb8 | 1085 | // Deregister from Network |
wajahat.abbas@u-blox.com | 27:3d709ee8c3e1 | 1086 | drop_connection(interface); |
mudassar0121 |
22:63b1a3c02fb8 | 1087 | } |
mudassar0121 |
22:63b1a3c02fb8 | 1088 | |
mudassar0121 |
22:63b1a3c02fb8 | 1089 | // Get and store initial RAT set on modem |
mudassar0121 |
22:63b1a3c02fb8 | 1090 | TEST_ASSERT(interface->get_modem_rat(&previousSelectedRat, &previousPreferredRat, &previousSecondPreferredRat)); |
mudassar0121 |
22:63b1a3c02fb8 | 1091 | tr_debug("previous selected RAT: %d\nprevious preferred RAT: %d\nprevious second preferred RAT: %d\n", previousSelectedRat, previousPreferredRat, previousSecondPreferredRat); |
mudassar0121 |
22:63b1a3c02fb8 | 1092 | |
mudassar0121 |
22:63b1a3c02fb8 | 1093 | #ifdef TARGET_UBLOX_C030_U201 |
mudassar0121 |
22:63b1a3c02fb8 | 1094 | // Set new RAT |
mudassar0121 |
22:63b1a3c02fb8 | 1095 | TEST_ASSERT(interface->set_modem_rat(UbloxATCellularInterface::GSM_UMTS, UbloxATCellularInterface::UMTS)); |
mudassar0121 |
22:63b1a3c02fb8 | 1096 | tr_debug("RAT configured\n"); |
mudassar0121 |
22:63b1a3c02fb8 | 1097 | |
mudassar0121 |
22:63b1a3c02fb8 | 1098 | // Get latest set RAT on modem |
mudassar0121 |
22:63b1a3c02fb8 | 1099 | TEST_ASSERT(interface->get_modem_rat(¤tSelectedRat, ¤tPreferredRat, ¤tSecondPreferredRat)); |
mudassar0121 |
22:63b1a3c02fb8 | 1100 | tr_debug("new selected RAT: %d\nnew preferred RAT: %d\nnew second preferred RAT: %d\n", currentSelectedRat, currentPreferredRat, currentSecondPreferredRat); |
mudassar0121 |
22:63b1a3c02fb8 | 1101 | |
mudassar0121 |
22:63b1a3c02fb8 | 1102 | // Check RAT configured correctly |
mudassar0121 |
22:63b1a3c02fb8 | 1103 | TEST_ASSERT((currentSelectedRat == UbloxATCellularInterface::GSM_UMTS) && (currentPreferredRat == UbloxATCellularInterface::UMTS)); |
mudassar0121 |
22:63b1a3c02fb8 | 1104 | |
wajahat.abbas@u-blox.com | 37:0ceb2dfc746c | 1105 | #elif TARGET_UBLOX_C030_R412M |
mudassar0121 |
22:63b1a3c02fb8 | 1106 | // Set new RAT |
wajahat.abbas@u-blox.com | 37:0ceb2dfc746c | 1107 | TEST_ASSERT(interface->set_modem_rat(UbloxATCellularInterface::LTE_CATM1, UbloxATCellularInterface::LTE_CATNB1, UbloxATCellularInterface::GPRS_EGPRS)); |
mudassar0121 |
22:63b1a3c02fb8 | 1108 | tr_debug("RAT configured\n"); |
mudassar0121 |
22:63b1a3c02fb8 | 1109 | |
mudassar0121 |
22:63b1a3c02fb8 | 1110 | // Get latest set RAT on modem |
mudassar0121 |
22:63b1a3c02fb8 | 1111 | TEST_ASSERT(interface->get_modem_rat(¤tSelectedRat, ¤tPreferredRat, ¤tSecondPreferredRat)); |
mudassar0121 |
22:63b1a3c02fb8 | 1112 | tr_debug("new selected RAT: %d\nnew preferred RAT: %d\nnew second preferred RAT: %d\n", currentSelectedRat, currentPreferredRat, currentSecondPreferredRat); |
mudassar0121 |
22:63b1a3c02fb8 | 1113 | |
mudassar0121 |
22:63b1a3c02fb8 | 1114 | // Check RAT configured correctly |
mudassar0121 |
22:63b1a3c02fb8 | 1115 | TEST_ASSERT((currentSelectedRat == UbloxATCellularInterface::LTE_CATM1) && (currentPreferredRat == UbloxATCellularInterface::LTE_CATNB1)); |
mudassar0121 |
22:63b1a3c02fb8 | 1116 | #endif |
mudassar0121 |
22:63b1a3c02fb8 | 1117 | } |
mudassar0121 |
22:63b1a3c02fb8 | 1118 | |
mudassar0121 |
22:63b1a3c02fb8 | 1119 | void test_reboot() { |
mudassar0121 |
22:63b1a3c02fb8 | 1120 | |
mudassar0121 |
22:63b1a3c02fb8 | 1121 | // Rebooting modem for settings to take effect |
mudassar0121 |
22:63b1a3c02fb8 | 1122 | TEST_ASSERT(interface->reboot_modem()); |
mudassar0121 |
22:63b1a3c02fb8 | 1123 | } |
mudassar0121 |
22:63b1a3c02fb8 | 1124 | |
mudassar0121 |
22:63b1a3c02fb8 | 1125 | void test_registration() { |
mudassar0121 |
22:63b1a3c02fb8 | 1126 | |
mudassar0121 |
22:63b1a3c02fb8 | 1127 | TEST_ASSERT(interface->connect(MBED_CONF_APP_DEFAULT_PIN, MBED_CONF_APP_APN, |
mudassar0121 |
22:63b1a3c02fb8 | 1128 | MBED_CONF_APP_USERNAME, MBED_CONF_APP_PASSWORD) == 0); |
mudassar0121 |
22:63b1a3c02fb8 | 1129 | |
wajahat.abbas@u-blox.com | 27:3d709ee8c3e1 | 1130 | drop_connection(interface); |
mudassar0121 |
22:63b1a3c02fb8 | 1131 | } |
mudassar0121 |
22:63b1a3c02fb8 | 1132 | |
mudassar0121 |
22:63b1a3c02fb8 | 1133 | |
mudassar0121 |
22:63b1a3c02fb8 | 1134 | void test_set_previous_rat() { |
mudassar0121 |
22:63b1a3c02fb8 | 1135 | |
mudassar0121 |
22:63b1a3c02fb8 | 1136 | int currentSelectedRat = -1, currentPreferredRat = -1, currentSecondPreferredRat = -1; |
mudassar0121 |
22:63b1a3c02fb8 | 1137 | |
mudassar0121 |
22:63b1a3c02fb8 | 1138 | // Restore RAT to previous settings |
mudassar0121 |
22:63b1a3c02fb8 | 1139 | TEST_ASSERT(interface->set_modem_rat((UbloxATCellularInterface::RAT)previousSelectedRat, (UbloxATCellularInterface::RAT)previousPreferredRat, (UbloxATCellularInterface::RAT)previousSecondPreferredRat)); |
mudassar0121 |
22:63b1a3c02fb8 | 1140 | tr_debug("RAT configured\n"); |
mudassar0121 |
22:63b1a3c02fb8 | 1141 | |
mudassar0121 |
22:63b1a3c02fb8 | 1142 | TEST_ASSERT(interface->get_modem_rat(¤tSelectedRat, ¤tPreferredRat, ¤tSecondPreferredRat)); |
mudassar0121 |
22:63b1a3c02fb8 | 1143 | tr_debug("current selected RAT: %d\ncurrent preferred RAT: %d\ncurrent second preferred RAT: %d\n", currentSelectedRat, currentPreferredRat, currentSecondPreferredRat); |
mudassar0121 |
22:63b1a3c02fb8 | 1144 | |
mudassar0121 |
22:63b1a3c02fb8 | 1145 | // Check RAT configured correctly |
mudassar0121 |
22:63b1a3c02fb8 | 1146 | TEST_ASSERT((currentSelectedRat == previousSelectedRat) && (currentPreferredRat == previousPreferredRat)); |
mudassar0121 |
22:63b1a3c02fb8 | 1147 | |
mudassar0121 |
22:63b1a3c02fb8 | 1148 | // Rebooting modem for settings to take effect |
mudassar0121 |
22:63b1a3c02fb8 | 1149 | TEST_ASSERT(interface->reboot_modem()); |
mudassar0121 |
22:63b1a3c02fb8 | 1150 | } |
wajahat.abbas@u-blox.com | 37:0ceb2dfc746c | 1151 | #endif |
mudassar0121 |
22:63b1a3c02fb8 | 1152 | |
mudassar0121 |
22:63b1a3c02fb8 | 1153 | #ifdef TARGET_UBLOX_C030_R41XM |
mudassar0121 |
22:63b1a3c02fb8 | 1154 | void test_mno_profile() { |
mudassar0121 |
22:63b1a3c02fb8 | 1155 | |
mudassar0121 |
22:63b1a3c02fb8 | 1156 | int previous_profile, current_profile; |
mudassar0121 |
22:63b1a3c02fb8 | 1157 | |
mudassar0121 |
22:63b1a3c02fb8 | 1158 | // Power-up the modem |
wajahat.abbas@u-blox.com | 37:0ceb2dfc746c | 1159 | interface->init(MBED_CONF_APP_DEFAULT_PIN); //init can return false if profile set is SW_DEFAULT |
mudassar0121 |
22:63b1a3c02fb8 | 1160 | |
mudassar0121 |
22:63b1a3c02fb8 | 1161 | // Check if modem is registered with network |
mudassar0121 |
22:63b1a3c02fb8 | 1162 | if (interface->is_registered_csd() || interface->is_registered_psd() || interface->is_registered_eps()) { |
mudassar0121 |
22:63b1a3c02fb8 | 1163 | tr_error("MNO profile should only be set in detached state"); |
mudassar0121 |
22:63b1a3c02fb8 | 1164 | // Deregister from Network |
wajahat.abbas@u-blox.com | 27:3d709ee8c3e1 | 1165 | drop_connection(interface); |
mudassar0121 |
22:63b1a3c02fb8 | 1166 | } |
mudassar0121 |
22:63b1a3c02fb8 | 1167 | |
mudassar0121 |
22:63b1a3c02fb8 | 1168 | // Getting current mno profile |
mudassar0121 |
22:63b1a3c02fb8 | 1169 | TEST_ASSERT(interface->get_mno_profile(&previous_profile)); |
wajahat.abbas@u-blox.com | 37:0ceb2dfc746c | 1170 | tr_debug("Previous MNO profile is: %d\n", previous_profile); |
mudassar0121 |
22:63b1a3c02fb8 | 1171 | |
mudassar0121 |
22:63b1a3c02fb8 | 1172 | // Set MNO profile |
wajahat.abbas@u-blox.com | 37:0ceb2dfc746c | 1173 | TEST_ASSERT(interface->set_mno_profile(UbloxATCellularInterface::STANDARD_EU)); |
mudassar0121 |
22:63b1a3c02fb8 | 1174 | tr_debug("MNO configured\n"); |
mudassar0121 |
22:63b1a3c02fb8 | 1175 | |
mudassar0121 |
22:63b1a3c02fb8 | 1176 | // Rebooting modem for settings to take effect |
mudassar0121 |
22:63b1a3c02fb8 | 1177 | TEST_ASSERT(interface->reboot_modem()); |
mudassar0121 |
22:63b1a3c02fb8 | 1178 | tr_debug("Reboot successful\n"); |
mudassar0121 |
42:98808477a691 | 1179 | ThisThread::sleep_for(5000); |
mudassar0121 |
22:63b1a3c02fb8 | 1180 | |
wajahat.abbas@u-blox.com | 37:0ceb2dfc746c | 1181 | TEST_ASSERT(interface->init(MBED_CONF_APP_DEFAULT_PIN)); |
wajahat.abbas@u-blox.com | 37:0ceb2dfc746c | 1182 | |
mudassar0121 |
22:63b1a3c02fb8 | 1183 | // Check MNO profile configured correctly |
mudassar0121 |
22:63b1a3c02fb8 | 1184 | TEST_ASSERT(interface->get_mno_profile(¤t_profile)); |
wajahat.abbas@u-blox.com | 37:0ceb2dfc746c | 1185 | tr_debug("New MNO profile is: %d\n", current_profile); |
mudassar0121 |
22:63b1a3c02fb8 | 1186 | |
mudassar0121 |
38:c3ad075a347b | 1187 | TEST_ASSERT(interface->disable_power_saving_mode()); |
wajahat.abbas@u-blox.com | 37:0ceb2dfc746c | 1188 | |
wajahat.abbas@u-blox.com | 37:0ceb2dfc746c | 1189 | TEST_ASSERT((UbloxATCellularInterface::MNOProfile)current_profile == UbloxATCellularInterface::STANDARD_EU); |
mudassar0121 |
22:63b1a3c02fb8 | 1190 | |
mudassar0121 |
22:63b1a3c02fb8 | 1191 | TEST_ASSERT(interface->connect(MBED_CONF_APP_DEFAULT_PIN, MBED_CONF_APP_APN, |
mudassar0121 |
22:63b1a3c02fb8 | 1192 | MBED_CONF_APP_USERNAME, MBED_CONF_APP_PASSWORD) == 0); |
mudassar0121 |
22:63b1a3c02fb8 | 1193 | |
wajahat.abbas@u-blox.com | 27:3d709ee8c3e1 | 1194 | drop_connection(interface); |
mudassar0121 |
39:f038c51be44f | 1195 | interface->deinit(); |
fahimalavi | 30:0f571a4920c8 | 1196 | } |
fahimalavi | 30:0f571a4920c8 | 1197 | |
fahimalavi | 30:0f571a4920c8 | 1198 | void test_edrx() { |
fahimalavi | 30:0f571a4920c8 | 1199 | const int c_edrx_value = 2; |
fahimalavi | 30:0f571a4920c8 | 1200 | |
fahimalavi | 30:0f571a4920c8 | 1201 | // Power-up the modem |
fahimalavi | 30:0f571a4920c8 | 1202 | TEST_ASSERT(interface->init(MBED_CONF_APP_DEFAULT_PIN)); |
mudassar0121 |
22:63b1a3c02fb8 | 1203 | |
fahimalavi | 30:0f571a4920c8 | 1204 | // Check if modem is registered with network |
fahimalavi | 30:0f571a4920c8 | 1205 | if (interface->is_registered_csd() || interface->is_registered_psd() || interface->is_registered_eps()) { |
fahimalavi | 30:0f571a4920c8 | 1206 | tr_error("set edrx in detached state"); |
fahimalavi | 30:0f571a4920c8 | 1207 | // Deregister from Network |
fahimalavi | 30:0f571a4920c8 | 1208 | drop_connection(interface); |
fahimalavi | 30:0f571a4920c8 | 1209 | } |
fahimalavi | 30:0f571a4920c8 | 1210 | |
wajahat.abbas@u-blox.com | 37:0ceb2dfc746c | 1211 | //disable edrx |
wajahat.abbas@u-blox.com | 37:0ceb2dfc746c | 1212 | interface->set_receive_period(3, UbloxCellularBase::EDRXEUTRAN_WB_S1_mode); |
wajahat.abbas@u-blox.com | 37:0ceb2dfc746c | 1213 | interface->set_receive_period(3, UbloxCellularBase::EDRXEUTRAN_NB_S1_mode); |
wajahat.abbas@u-blox.com | 37:0ceb2dfc746c | 1214 | |
wajahat.abbas@u-blox.com | 37:0ceb2dfc746c | 1215 | //set edrx |
fahimalavi | 30:0f571a4920c8 | 1216 | interface->set_receive_period(2, UbloxCellularBase::EDRXEUTRAN_WB_S1_mode, c_edrx_value); |
fahimalavi | 30:0f571a4920c8 | 1217 | interface->set_receive_period(2, UbloxCellularBase::EDRXEUTRAN_NB_S1_mode, c_edrx_value); |
mudassar0121 |
22:63b1a3c02fb8 | 1218 | |
fahimalavi | 30:0f571a4920c8 | 1219 | TEST_ASSERT(interface->connect(MBED_CONF_APP_DEFAULT_PIN, MBED_CONF_APP_APN, |
fahimalavi | 30:0f571a4920c8 | 1220 | MBED_CONF_APP_USERNAME, MBED_CONF_APP_PASSWORD) == 0); |
fahimalavi | 30:0f571a4920c8 | 1221 | |
fahimalavi | 30:0f571a4920c8 | 1222 | TEST_ASSERT(interface->get_receive_period() == c_edrx_value); |
fahimalavi | 30:0f571a4920c8 | 1223 | |
fahimalavi | 30:0f571a4920c8 | 1224 | drop_connection(interface); |
fahimalavi | 30:0f571a4920c8 | 1225 | |
wajahat.abbas@u-blox.com | 37:0ceb2dfc746c | 1226 | //re-apply default mno profile |
wajahat.abbas@u-blox.com | 37:0ceb2dfc746c | 1227 | TEST_ASSERT(interface->set_mno_profile(UbloxATCellularInterface::STANDARD_EU)); |
fahimalavi | 30:0f571a4920c8 | 1228 | TEST_ASSERT(interface->reboot_modem()); |
mudassar0121 |
42:98808477a691 | 1229 | ThisThread::sleep_for(5000); |
wajahat.abbas@u-blox.com | 37:0ceb2dfc746c | 1230 | TEST_ASSERT(interface->init(MBED_CONF_APP_DEFAULT_PIN)); |
mudassar0121 |
38:c3ad075a347b | 1231 | TEST_ASSERT(interface->disable_power_saving_mode()); |
mudassar0121 |
22:63b1a3c02fb8 | 1232 | } |
mudassar0121 |
22:63b1a3c02fb8 | 1233 | #endif |
mudassar0121 |
22:63b1a3c02fb8 | 1234 | |
RobMeades | 0:7ccf0e7e8a83 | 1235 | // ---------------------------------------------------------------- |
RobMeades | 0:7ccf0e7e8a83 | 1236 | // TEST ENVIRONMENT |
RobMeades | 0:7ccf0e7e8a83 | 1237 | // ---------------------------------------------------------------- |
RobMeades | 0:7ccf0e7e8a83 | 1238 | |
RobMeades | 0:7ccf0e7e8a83 | 1239 | // Setup the test environment |
RobMeades | 0:7ccf0e7e8a83 | 1240 | utest::v1::status_t test_setup(const size_t number_of_cases) { |
RobMeades | 0:7ccf0e7e8a83 | 1241 | // Setup Greentea with a timeout |
RobMeades | 0:7ccf0e7e8a83 | 1242 | GREENTEA_SETUP(960, "default_auto"); |
RobMeades | 0:7ccf0e7e8a83 | 1243 | return verbose_test_setup_handler(number_of_cases); |
RobMeades | 0:7ccf0e7e8a83 | 1244 | } |
RobMeades | 0:7ccf0e7e8a83 | 1245 | |
RobMeades | 0:7ccf0e7e8a83 | 1246 | // IMPORTANT!!! if you make a change to the tests here you should |
RobMeades | 0:7ccf0e7e8a83 | 1247 | // check whether the same change should be made to the tests under |
rob.meades@u-blox.com | 6:63dad754c267 | 1248 | // the PPP interface. |
RobMeades | 0:7ccf0e7e8a83 | 1249 | |
RobMeades | 0:7ccf0e7e8a83 | 1250 | // Test cases |
RobMeades | 0:7ccf0e7e8a83 | 1251 | Case cases[] = { |
fahimalavi | 30:0f571a4920c8 | 1252 | #ifdef TARGET_UBLOX_C030_R41XM |
fahimalavi | 30:0f571a4920c8 | 1253 | Case("MNO profile test", test_mno_profile), |
fahimalavi | 30:0f571a4920c8 | 1254 | Case("edrx test", test_edrx), |
fahimalavi | 30:0f571a4920c8 | 1255 | #endif |
RobMeades | 12:ff6fac481487 | 1256 | Case("Base class tests", test_base_class), |
RobMeades | 0:7ccf0e7e8a83 | 1257 | Case("Set randomise", test_set_randomise), |
RobMeades | 0:7ccf0e7e8a83 | 1258 | #ifdef MBED_CONF_APP_ECHO_SERVER |
RobMeades | 0:7ccf0e7e8a83 | 1259 | Case("UDP echo test", test_udp_echo), |
RobMeades | 0:7ccf0e7e8a83 | 1260 | # ifndef TARGET_UBLOX_C027 // Not enough RAM on little 'ole C027 to run this test |
RobMeades | 0:7ccf0e7e8a83 | 1261 | Case("UDP recv sizes", test_udp_echo_recv_sizes), |
RobMeades | 0:7ccf0e7e8a83 | 1262 | # endif |
RobMeades | 0:7ccf0e7e8a83 | 1263 | Case("UDP async echo test", test_udp_echo_async), |
RobMeades | 0:7ccf0e7e8a83 | 1264 | # ifndef TARGET_UBLOX_C027 // Not enough RAM on little 'ole C027 to run this test |
RobMeades | 0:7ccf0e7e8a83 | 1265 | Case("TCP recv sizes", test_tcp_echo_recv_sizes), |
RobMeades | 0:7ccf0e7e8a83 | 1266 | # endif |
RobMeades | 0:7ccf0e7e8a83 | 1267 | Case("TCP async echo test", test_tcp_echo_async), |
RobMeades | 0:7ccf0e7e8a83 | 1268 | #endif |
RobMeades | 0:7ccf0e7e8a83 | 1269 | #ifndef TARGET_UBLOX_C027 // Not enough RAM on little 'ole C027 to run this test |
RobMeades | 0:7ccf0e7e8a83 | 1270 | Case("Alloc max sockets", test_max_sockets), |
RobMeades | 0:7ccf0e7e8a83 | 1271 | #endif |
RobMeades | 0:7ccf0e7e8a83 | 1272 | Case("Connect with credentials", test_connect_credentials), |
RobMeades | 0:7ccf0e7e8a83 | 1273 | Case("Connect with preset credentials", test_connect_preset_credentials), |
RobMeades | 0:7ccf0e7e8a83 | 1274 | #if MBED_CONF_APP_RUN_SIM_PIN_CHANGE_TESTS |
RobMeades | 0:7ccf0e7e8a83 | 1275 | Case("Check SIM pin, pending", test_check_sim_pin_pending), |
RobMeades | 0:7ccf0e7e8a83 | 1276 | Case("Check SIM pin, immediate", test_check_sim_pin_immediate), |
RobMeades | 0:7ccf0e7e8a83 | 1277 | #endif |
mudassar0121 |
22:63b1a3c02fb8 | 1278 | #if defined (TARGET_UBLOX_C030_U201) || defined (TARGET_UBLOX_C030_R412M) |
mudassar0121 |
22:63b1a3c02fb8 | 1279 | Case("Set RAT test", test_set_new_rat), |
mudassar0121 |
22:63b1a3c02fb8 | 1280 | Case("Reboot test", test_reboot), |
mudassar0121 |
22:63b1a3c02fb8 | 1281 | Case("Register with network test", test_registration), |
mudassar0121 |
22:63b1a3c02fb8 | 1282 | Case("Set previous RAT test", test_set_previous_rat), |
mudassar0121 |
22:63b1a3c02fb8 | 1283 | #endif |
RobMeades | 0:7ccf0e7e8a83 | 1284 | #ifndef TARGET_UBLOX_C027 // Not enough RAM on little 'ole C027 for this |
RobMeades | 0:7ccf0e7e8a83 | 1285 | Case("Connect using local instance, must be last test", test_connect_local_instance_last_test) |
RobMeades | 0:7ccf0e7e8a83 | 1286 | #endif |
RobMeades | 0:7ccf0e7e8a83 | 1287 | }; |
RobMeades | 0:7ccf0e7e8a83 | 1288 | |
RobMeades | 0:7ccf0e7e8a83 | 1289 | Specification specification(test_setup, cases); |
RobMeades | 0:7ccf0e7e8a83 | 1290 | |
RobMeades | 0:7ccf0e7e8a83 | 1291 | // ---------------------------------------------------------------- |
RobMeades | 0:7ccf0e7e8a83 | 1292 | // MAIN |
RobMeades | 0:7ccf0e7e8a83 | 1293 | // ---------------------------------------------------------------- |
RobMeades | 0:7ccf0e7e8a83 | 1294 | |
RobMeades | 0:7ccf0e7e8a83 | 1295 | int main() { |
RobMeades | 0:7ccf0e7e8a83 | 1296 | |
RobMeades | 0:7ccf0e7e8a83 | 1297 | #ifdef FEATURE_COMMON_PAL |
RobMeades | 0:7ccf0e7e8a83 | 1298 | mbed_trace_init(); |
RobMeades | 0:7ccf0e7e8a83 | 1299 | |
RobMeades | 0:7ccf0e7e8a83 | 1300 | mbed_trace_mutex_wait_function_set(lock); |
RobMeades | 0:7ccf0e7e8a83 | 1301 | mbed_trace_mutex_release_function_set(unlock); |
RobMeades | 0:7ccf0e7e8a83 | 1302 | #endif |
RobMeades | 0:7ccf0e7e8a83 | 1303 | |
rob.meades@u-blox.com | 6:63dad754c267 | 1304 | interface->connection_status_cb(connection_down_cb); |
RobMeades | 0:7ccf0e7e8a83 | 1305 | |
RobMeades | 0:7ccf0e7e8a83 | 1306 | // Run tests |
RobMeades | 0:7ccf0e7e8a83 | 1307 | return !Harness::run(specification); |
RobMeades | 0:7ccf0e7e8a83 | 1308 | } |
RobMeades | 0:7ccf0e7e8a83 | 1309 | |
RobMeades | 0:7ccf0e7e8a83 | 1310 | // End Of File |