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

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?

UserRevisionLine numberNew 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(&timestamp);
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(&currentSelectedRat, &currentPreferredRat, &currentSecondPreferredRat));
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(&currentSelectedRat, &currentPreferredRat, &currentSecondPreferredRat));
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(&currentSelectedRat, &currentPreferredRat, &currentSecondPreferredRat));
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(&current_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