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:
wajahat.abbas@u-blox.com
Date:
Wed Oct 09 14:48:57 2019 +0500
Revision:
37:0ceb2dfc746c
Parent:
30:0f571a4920c8
Child:
38:c3ad075a347b
Updated test cases for C030_R41XM

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 }
RobMeades 0:7ccf0e7e8a83 315 wait_ms(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 }
RobMeades 0:7ccf0e7e8a83 355 wait_ms(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 }
RobMeades 0:7ccf0e7e8a83 385 wait_ms(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);
RobMeades 0:7ccf0e7e8a83 566 }
RobMeades 0:7ccf0e7e8a83 567
RobMeades 0:7ccf0e7e8a83 568 #ifdef MBED_CONF_APP_ECHO_SERVER
RobMeades 0:7ccf0e7e8a83 569
RobMeades 0:7ccf0e7e8a83 570 // Test UDP data exchange
RobMeades 0:7ccf0e7e8a83 571 void test_udp_echo() {
RobMeades 0:7ccf0e7e8a83 572 UDPSocket sock;
RobMeades 0:7ccf0e7e8a83 573 SocketAddress host_address;
RobMeades 0:7ccf0e7e8a83 574 SocketAddress local_address;
RobMeades 0:7ccf0e7e8a83 575 int x;
RobMeades 0:7ccf0e7e8a83 576 int size;
RobMeades 0:7ccf0e7e8a83 577
rob.meades@u-blox.com 6:63dad754c267 578 TEST_ASSERT(interface->connect(MBED_CONF_APP_DEFAULT_PIN, MBED_CONF_APP_APN,
rob.meades@u-blox.com 6:63dad754c267 579 MBED_CONF_APP_USERNAME, MBED_CONF_APP_PASSWORD) == 0);
RobMeades 0:7ccf0e7e8a83 580
rob.meades@u-blox.com 6:63dad754c267 581 TEST_ASSERT(interface->gethostbyname(MBED_CONF_APP_ECHO_SERVER, &host_address) == 0);
RobMeades 0:7ccf0e7e8a83 582 host_address.set_port(MBED_CONF_APP_ECHO_UDP_PORT);
RobMeades 0:7ccf0e7e8a83 583
RobMeades 0:7ccf0e7e8a83 584 tr_debug("UDP: Server %s address: %s on port %d.", MBED_CONF_APP_ECHO_SERVER,
RobMeades 0:7ccf0e7e8a83 585 host_address.get_ip_address(), host_address.get_port());
RobMeades 0:7ccf0e7e8a83 586
rob.meades@u-blox.com 6:63dad754c267 587 TEST_ASSERT(sock.open(interface) == 0)
RobMeades 0:7ccf0e7e8a83 588
RobMeades 0:7ccf0e7e8a83 589 // Do a bind, just for the helluvit
RobMeades 0:7ccf0e7e8a83 590 local_address.set_port(MBED_CONF_APP_LOCAL_PORT);
RobMeades 0:7ccf0e7e8a83 591 TEST_ASSERT(sock.bind(local_address) == 0);
RobMeades 0:7ccf0e7e8a83 592
RobMeades 0:7ccf0e7e8a83 593 sock.set_timeout(10000);
RobMeades 0:7ccf0e7e8a83 594
RobMeades 0:7ccf0e7e8a83 595 // Test min, max, and some random sizes in-between
RobMeades 0:7ccf0e7e8a83 596 do_udp_echo(&sock, &host_address, 1);
RobMeades 0:7ccf0e7e8a83 597 do_udp_echo(&sock, &host_address, MBED_CONF_APP_UDP_MAX_PACKET_SIZE);
RobMeades 0:7ccf0e7e8a83 598 for (x = 0; x < 10; x++) {
RobMeades 0:7ccf0e7e8a83 599 size = (rand() % MBED_CONF_APP_UDP_MAX_PACKET_SIZE) + 1;
RobMeades 0:7ccf0e7e8a83 600 size = fix(size, MBED_CONF_APP_UDP_MAX_PACKET_SIZE);
RobMeades 0:7ccf0e7e8a83 601 do_udp_echo(&sock, &host_address, size);
RobMeades 0:7ccf0e7e8a83 602 }
RobMeades 0:7ccf0e7e8a83 603
RobMeades 0:7ccf0e7e8a83 604 sock.close();
rob.meades@u-blox.com 6:63dad754c267 605 drop_connection(interface);
RobMeades 0:7ccf0e7e8a83 606 tr_debug("%d UDP packets of size up to %d byte(s) echoed successfully.",
RobMeades 0:7ccf0e7e8a83 607 x, MBED_CONF_APP_UDP_MAX_PACKET_SIZE);
RobMeades 0:7ccf0e7e8a83 608 }
RobMeades 0:7ccf0e7e8a83 609
RobMeades 0:7ccf0e7e8a83 610 // Test many different sizes of UDP data arriving at once
RobMeades 0:7ccf0e7e8a83 611 void test_udp_echo_recv_sizes() {
RobMeades 0:7ccf0e7e8a83 612 UDPSocket sock;
RobMeades 0:7ccf0e7e8a83 613 SocketAddress host_address;
RobMeades 0:7ccf0e7e8a83 614 int x, y, z;
RobMeades 0:7ccf0e7e8a83 615 int size;
RobMeades 0:7ccf0e7e8a83 616 int tries = 0;
RobMeades 0:7ccf0e7e8a83 617 unsigned int offset;
RobMeades 0:7ccf0e7e8a83 618 char * recv_data;
RobMeades 0:7ccf0e7e8a83 619 bool packetLoss;
RobMeades 0:7ccf0e7e8a83 620 bool sendSuccess;
RobMeades 0:7ccf0e7e8a83 621 Timer timer;
RobMeades 0:7ccf0e7e8a83 622
rob.meades@u-blox.com 6:63dad754c267 623 interface->deinit();
rob.meades@u-blox.com 6:63dad754c267 624 TEST_ASSERT(interface->connect(MBED_CONF_APP_DEFAULT_PIN, MBED_CONF_APP_APN,
rob.meades@u-blox.com 6:63dad754c267 625 MBED_CONF_APP_USERNAME, MBED_CONF_APP_PASSWORD) == 0);
RobMeades 0:7ccf0e7e8a83 626
rob.meades@u-blox.com 6:63dad754c267 627 TEST_ASSERT(interface->gethostbyname(MBED_CONF_APP_ECHO_SERVER, &host_address) == 0);
RobMeades 0:7ccf0e7e8a83 628 host_address.set_port(MBED_CONF_APP_ECHO_UDP_PORT);
RobMeades 0:7ccf0e7e8a83 629
RobMeades 0:7ccf0e7e8a83 630 tr_debug("UDP: Server %s address: %s on port %d.", MBED_CONF_APP_ECHO_SERVER,
RobMeades 0:7ccf0e7e8a83 631 host_address.get_ip_address(), host_address.get_port());
RobMeades 0:7ccf0e7e8a83 632
rob.meades@u-blox.com 6:63dad754c267 633 TEST_ASSERT(sock.open(interface) == 0)
RobMeades 0:7ccf0e7e8a83 634
RobMeades 0:7ccf0e7e8a83 635 do {
RobMeades 0:7ccf0e7e8a83 636 tr_debug("--- UDP packet size test, test try %d, flushing input buffers", tries + 1);
RobMeades 0:7ccf0e7e8a83 637 // First of all, clear any junk from the socket
RobMeades 0:7ccf0e7e8a83 638 sock.set_timeout(1000);
RobMeades 0:7ccf0e7e8a83 639 recv_data = (char *) malloc (MBED_CONF_APP_UDP_MAX_PACKET_SIZE);
RobMeades 0:7ccf0e7e8a83 640 TEST_ASSERT(recv_data != NULL);
RobMeades 0:7ccf0e7e8a83 641 while (sock.recvfrom(&host_address, (void *) recv_data, MBED_CONF_APP_UDP_MAX_PACKET_SIZE) > 0) {
RobMeades 0:7ccf0e7e8a83 642 // Throw it away
RobMeades 0:7ccf0e7e8a83 643 }
RobMeades 0:7ccf0e7e8a83 644 free (recv_data);
RobMeades 0:7ccf0e7e8a83 645
RobMeades 0:7ccf0e7e8a83 646 sock.set_timeout(10000);
RobMeades 0:7ccf0e7e8a83 647
RobMeades 0:7ccf0e7e8a83 648 // Throw random sized UDP packets up...
RobMeades 0:7ccf0e7e8a83 649 x = 0;
RobMeades 0:7ccf0e7e8a83 650 offset = 0;
RobMeades 0:7ccf0e7e8a83 651 while (offset < sizeof (send_data)) {
RobMeades 0:7ccf0e7e8a83 652 size = (rand() % (MBED_CONF_APP_UDP_MAX_PACKET_SIZE / 2)) + 1;
RobMeades 0:7ccf0e7e8a83 653 size = fix(size, MBED_CONF_APP_UDP_MAX_PACKET_SIZE / 2);
RobMeades 0:7ccf0e7e8a83 654 if (offset + size > sizeof (send_data)) {
RobMeades 0:7ccf0e7e8a83 655 size = sizeof (send_data) - offset;
RobMeades 0:7ccf0e7e8a83 656 }
RobMeades 0:7ccf0e7e8a83 657 sendSuccess = false;
RobMeades 0:7ccf0e7e8a83 658 for (y = 0; !sendSuccess && (y < NUM_UDP_RETRIES); y++) {
RobMeades 0:7ccf0e7e8a83 659 tr_debug("Sending UDP packet number %d, size %d byte(s), send try %d.", x + 1, size, y + 1);
RobMeades 0:7ccf0e7e8a83 660 if (sock.sendto(host_address, (void *) (send_data + offset), size) == size) {
RobMeades 0:7ccf0e7e8a83 661 sendSuccess = true;
RobMeades 0:7ccf0e7e8a83 662 offset += size;
RobMeades 0:7ccf0e7e8a83 663 }
RobMeades 0:7ccf0e7e8a83 664 }
RobMeades 0:7ccf0e7e8a83 665 TEST_ASSERT(sendSuccess);
RobMeades 0:7ccf0e7e8a83 666 x++;
RobMeades 0:7ccf0e7e8a83 667 }
RobMeades 0:7ccf0e7e8a83 668 tr_debug("--- All UDP packets sent");
RobMeades 0:7ccf0e7e8a83 669
RobMeades 0:7ccf0e7e8a83 670 // ...and capture them all again afterwards
RobMeades 0:7ccf0e7e8a83 671 recv_data = (char *) malloc (sizeof (send_data));
RobMeades 0:7ccf0e7e8a83 672 TEST_ASSERT(recv_data != NULL);
RobMeades 0:7ccf0e7e8a83 673 memset (recv_data, 0, sizeof (send_data));
RobMeades 0:7ccf0e7e8a83 674 size = 0;
RobMeades 0:7ccf0e7e8a83 675 y = 0;
RobMeades 0:7ccf0e7e8a83 676 packetLoss = false;
RobMeades 0:7ccf0e7e8a83 677 timer.start();
RobMeades 0:7ccf0e7e8a83 678 while ((size < (int) sizeof (send_data)) && (timer.read_ms() < 10000)) {
RobMeades 0:7ccf0e7e8a83 679 y = sock.recvfrom(&host_address, (void *) (recv_data + size), sizeof (send_data) - size);
RobMeades 0:7ccf0e7e8a83 680 if (y > 0) {
RobMeades 0:7ccf0e7e8a83 681 size += y;
RobMeades 0:7ccf0e7e8a83 682 }
RobMeades 0:7ccf0e7e8a83 683 }
RobMeades 0:7ccf0e7e8a83 684 timer.stop();
RobMeades 0:7ccf0e7e8a83 685 timer.reset();
RobMeades 0:7ccf0e7e8a83 686 tr_debug( "--- Either received everything back or timed out waiting");
RobMeades 0:7ccf0e7e8a83 687
RobMeades 0:7ccf0e7e8a83 688 // Check that we reassembled everything correctly
RobMeades 0:7ccf0e7e8a83 689 if (size == sizeof (send_data)) {
RobMeades 0:7ccf0e7e8a83 690 for (x = 0; ((*(recv_data + x) == *(send_data + x))) && (x < (int) sizeof (send_data)); x++) {
RobMeades 0:7ccf0e7e8a83 691 }
RobMeades 0:7ccf0e7e8a83 692 if (x != sizeof (send_data)) {
RobMeades 0:7ccf0e7e8a83 693 y = x - 5;
RobMeades 0:7ccf0e7e8a83 694 if (y < 0) {
RobMeades 0:7ccf0e7e8a83 695 y = 0;
RobMeades 0:7ccf0e7e8a83 696 }
RobMeades 0:7ccf0e7e8a83 697 z = 10;
RobMeades 0:7ccf0e7e8a83 698 if (y + z > (int) sizeof (send_data)) {
RobMeades 0:7ccf0e7e8a83 699 z = sizeof(send_data) - y;
RobMeades 0:7ccf0e7e8a83 700 }
RobMeades 0:7ccf0e7e8a83 701 tr_debug(" --- Difference at character %d (send \"%*.*s\", recv \"%*.*s\")",
RobMeades 0:7ccf0e7e8a83 702 x + 1, z, z, send_data + y, z, z, recv_data + y);
RobMeades 0:7ccf0e7e8a83 703 packetLoss = true;
RobMeades 0:7ccf0e7e8a83 704 }
RobMeades 0:7ccf0e7e8a83 705 } else {
RobMeades 0:7ccf0e7e8a83 706 tr_debug(" --- %d bytes missing (%d bytes received when %d were expected))",
RobMeades 0:7ccf0e7e8a83 707 sizeof (send_data) - size, size, sizeof (send_data));
RobMeades 0:7ccf0e7e8a83 708 packetLoss = true;
RobMeades 0:7ccf0e7e8a83 709 }
RobMeades 0:7ccf0e7e8a83 710 free (recv_data);
RobMeades 0:7ccf0e7e8a83 711 tries++;
RobMeades 0:7ccf0e7e8a83 712 } while (packetLoss && (tries < NUM_UDP_RETRIES));
RobMeades 0:7ccf0e7e8a83 713
RobMeades 0:7ccf0e7e8a83 714 TEST_ASSERT(!packetLoss);
RobMeades 0:7ccf0e7e8a83 715 TEST_ASSERT(!connection_has_gone_down);
RobMeades 0:7ccf0e7e8a83 716 sock.close();
rob.meades@u-blox.com 6:63dad754c267 717 drop_connection(interface);
RobMeades 0:7ccf0e7e8a83 718 }
RobMeades 0:7ccf0e7e8a83 719
RobMeades 0:7ccf0e7e8a83 720 // Test UDP data exchange via the asynchronous sigio() mechanism
RobMeades 0:7ccf0e7e8a83 721 void test_udp_echo_async() {
RobMeades 0:7ccf0e7e8a83 722 UDPSocket sock;
RobMeades 0:7ccf0e7e8a83 723 SocketAddress host_address;
RobMeades 0:7ccf0e7e8a83 724 SocketAddress local_address;
RobMeades 0:7ccf0e7e8a83 725 bool callback_triggered = false;
RobMeades 0:7ccf0e7e8a83 726 int x;
RobMeades 0:7ccf0e7e8a83 727 int size;
RobMeades 0:7ccf0e7e8a83 728
rob.meades@u-blox.com 6:63dad754c267 729 interface->deinit();
rob.meades@u-blox.com 6:63dad754c267 730 TEST_ASSERT(interface->connect(MBED_CONF_APP_DEFAULT_PIN, MBED_CONF_APP_APN,
rob.meades@u-blox.com 6:63dad754c267 731 MBED_CONF_APP_USERNAME, MBED_CONF_APP_PASSWORD) == 0);
RobMeades 0:7ccf0e7e8a83 732
rob.meades@u-blox.com 6:63dad754c267 733 TEST_ASSERT(interface->gethostbyname(MBED_CONF_APP_ECHO_SERVER, &host_address) == 0);
RobMeades 0:7ccf0e7e8a83 734 host_address.set_port(MBED_CONF_APP_ECHO_UDP_PORT);
RobMeades 0:7ccf0e7e8a83 735
RobMeades 0:7ccf0e7e8a83 736 tr_debug("UDP: Server %s address: %s on port %d.", MBED_CONF_APP_ECHO_SERVER,
RobMeades 0:7ccf0e7e8a83 737 host_address.get_ip_address(), host_address.get_port());
RobMeades 0:7ccf0e7e8a83 738
rob.meades@u-blox.com 6:63dad754c267 739 TEST_ASSERT(sock.open(interface) == 0)
RobMeades 0:7ccf0e7e8a83 740
RobMeades 0:7ccf0e7e8a83 741 // Set up the async callback and set the timeout to zero
RobMeades 0:7ccf0e7e8a83 742 sock.sigio(callback(async_cb, &callback_triggered));
RobMeades 0:7ccf0e7e8a83 743 sock.set_timeout(0);
RobMeades 0:7ccf0e7e8a83 744
RobMeades 0:7ccf0e7e8a83 745 // Test min, max, and some random sizes in-between
RobMeades 0:7ccf0e7e8a83 746 // and this time allow the UDP packets to be fragmented
RobMeades 0:7ccf0e7e8a83 747 do_udp_echo_async(&sock, &host_address, 1, &callback_triggered);
RobMeades 0:7ccf0e7e8a83 748 do_udp_echo_async(&sock, &host_address, MBED_CONF_APP_UDP_MAX_FRAG_PACKET_SIZE,
RobMeades 0:7ccf0e7e8a83 749 &callback_triggered);
RobMeades 0:7ccf0e7e8a83 750 for (x = 0; x < 10; x++) {
RobMeades 0:7ccf0e7e8a83 751 size = (rand() % MBED_CONF_APP_UDP_MAX_FRAG_PACKET_SIZE) + 1;
RobMeades 0:7ccf0e7e8a83 752 size = fix(size, MBED_CONF_APP_UDP_MAX_FRAG_PACKET_SIZE);
RobMeades 0:7ccf0e7e8a83 753 do_udp_echo_async(&sock, &host_address, size, &callback_triggered);
RobMeades 0:7ccf0e7e8a83 754 }
RobMeades 0:7ccf0e7e8a83 755
RobMeades 0:7ccf0e7e8a83 756 sock.close();
RobMeades 0:7ccf0e7e8a83 757
rob.meades@u-blox.com 6:63dad754c267 758 drop_connection(interface);
RobMeades 0:7ccf0e7e8a83 759
RobMeades 0:7ccf0e7e8a83 760 tr_debug("%d UDP packets of size up to %d byte(s) echoed asynchronously and successfully.",
RobMeades 0:7ccf0e7e8a83 761 x, MBED_CONF_APP_UDP_MAX_FRAG_PACKET_SIZE);
RobMeades 0:7ccf0e7e8a83 762 }
RobMeades 0:7ccf0e7e8a83 763
RobMeades 0:7ccf0e7e8a83 764 // Test many different sizes of TCP data arriving at once
RobMeades 0:7ccf0e7e8a83 765 void test_tcp_echo_recv_sizes() {
RobMeades 0:7ccf0e7e8a83 766 TCPSocket sock;
RobMeades 0:7ccf0e7e8a83 767 SocketAddress host_address;
RobMeades 0:7ccf0e7e8a83 768 int x, y, z;
RobMeades 0:7ccf0e7e8a83 769 int size;
RobMeades 0:7ccf0e7e8a83 770 unsigned int offset;
RobMeades 0:7ccf0e7e8a83 771 char * recv_data;
RobMeades 0:7ccf0e7e8a83 772 Timer timer;
RobMeades 0:7ccf0e7e8a83 773
rob.meades@u-blox.com 6:63dad754c267 774 interface->deinit();
rob.meades@u-blox.com 6:63dad754c267 775 TEST_ASSERT(interface->connect(MBED_CONF_APP_DEFAULT_PIN, MBED_CONF_APP_APN,
rob.meades@u-blox.com 6:63dad754c267 776 MBED_CONF_APP_USERNAME, MBED_CONF_APP_PASSWORD) == 0);
RobMeades 0:7ccf0e7e8a83 777
rob.meades@u-blox.com 6:63dad754c267 778 TEST_ASSERT(interface->gethostbyname(MBED_CONF_APP_ECHO_SERVER, &host_address) == 0);
RobMeades 0:7ccf0e7e8a83 779 host_address.set_port(MBED_CONF_APP_ECHO_TCP_PORT);
RobMeades 0:7ccf0e7e8a83 780
RobMeades 0:7ccf0e7e8a83 781 tr_debug("TCP: Server %s address: %s on port %d.", MBED_CONF_APP_ECHO_SERVER,
RobMeades 0:7ccf0e7e8a83 782 host_address.get_ip_address(), host_address.get_port());
RobMeades 0:7ccf0e7e8a83 783
rob.meades@u-blox.com 6:63dad754c267 784 TEST_ASSERT(sock.open(interface) == 0)
RobMeades 0:7ccf0e7e8a83 785
RobMeades 0:7ccf0e7e8a83 786 TEST_ASSERT(sock.connect(host_address) == 0);
RobMeades 0:7ccf0e7e8a83 787
RobMeades 0:7ccf0e7e8a83 788 sock.set_timeout(10000);
RobMeades 0:7ccf0e7e8a83 789
RobMeades 0:7ccf0e7e8a83 790 // Throw random sized TCP packets up...
RobMeades 0:7ccf0e7e8a83 791 x = 0;
RobMeades 0:7ccf0e7e8a83 792 offset = 0;
RobMeades 0:7ccf0e7e8a83 793 while (offset < sizeof (send_data)) {
RobMeades 0:7ccf0e7e8a83 794 size = (rand() % (MBED_CONF_APP_UDP_MAX_PACKET_SIZE / 2)) + 1;
RobMeades 0:7ccf0e7e8a83 795 size = fix(size, MBED_CONF_APP_UDP_MAX_PACKET_SIZE / 2);
RobMeades 0:7ccf0e7e8a83 796 if (offset + size > sizeof (send_data)) {
RobMeades 0:7ccf0e7e8a83 797 size = sizeof (send_data) - offset;
RobMeades 0:7ccf0e7e8a83 798 }
RobMeades 0:7ccf0e7e8a83 799 tr_debug("Sending TCP packet number %d, size %d byte(s).", x + 1, size);
RobMeades 0:7ccf0e7e8a83 800 TEST_ASSERT(sendAll(&sock, (send_data + offset), size) == size);
RobMeades 0:7ccf0e7e8a83 801 offset += size;
RobMeades 0:7ccf0e7e8a83 802 x++;
RobMeades 0:7ccf0e7e8a83 803 }
RobMeades 0:7ccf0e7e8a83 804
RobMeades 0:7ccf0e7e8a83 805 // ...and capture them all again afterwards
RobMeades 0:7ccf0e7e8a83 806 recv_data = (char *) malloc (sizeof (send_data));
RobMeades 0:7ccf0e7e8a83 807 TEST_ASSERT(recv_data != NULL);
RobMeades 0:7ccf0e7e8a83 808 memset (recv_data, 0, sizeof (send_data));
RobMeades 0:7ccf0e7e8a83 809 size = 0;
RobMeades 0:7ccf0e7e8a83 810 x = 0;
RobMeades 0:7ccf0e7e8a83 811 timer.start();
RobMeades 0:7ccf0e7e8a83 812 while ((size < (int) sizeof (send_data)) && (timer.read_ms() < 30000)) {
RobMeades 0:7ccf0e7e8a83 813 y = sock.recv((void *) (recv_data + size), sizeof (send_data) - size);
RobMeades 0:7ccf0e7e8a83 814 tr_debug("Received TCP packet number %d, size %d byte(s).", x, y);
RobMeades 0:7ccf0e7e8a83 815 size += y;
RobMeades 0:7ccf0e7e8a83 816 x++;
RobMeades 0:7ccf0e7e8a83 817 }
RobMeades 0:7ccf0e7e8a83 818 timer.stop();
RobMeades 0:7ccf0e7e8a83 819 timer.reset();
RobMeades 0:7ccf0e7e8a83 820
RobMeades 0:7ccf0e7e8a83 821 // Check that we reassembled everything correctly
RobMeades 0:7ccf0e7e8a83 822 for (x = 0; ((*(recv_data + x) == *(send_data + x))) && (x < (int) sizeof (send_data)); x++) {
RobMeades 0:7ccf0e7e8a83 823 }
RobMeades 0:7ccf0e7e8a83 824 if (x != sizeof (send_data)) {
RobMeades 0:7ccf0e7e8a83 825 y = x - 5;
RobMeades 0:7ccf0e7e8a83 826 if (y < 0) {
RobMeades 0:7ccf0e7e8a83 827 y = 0;
RobMeades 0:7ccf0e7e8a83 828 }
RobMeades 0:7ccf0e7e8a83 829 z = 10;
RobMeades 0:7ccf0e7e8a83 830 if (y + z > (int) sizeof (send_data)) {
RobMeades 0:7ccf0e7e8a83 831 z = sizeof(send_data) - y;
RobMeades 0:7ccf0e7e8a83 832 }
RobMeades 0:7ccf0e7e8a83 833 tr_debug("Difference at character %d (send \"%*.*s\", recv \"%*.*s\")",
RobMeades 0:7ccf0e7e8a83 834 x + 1, z, z, send_data + y, z, z, recv_data + y);
RobMeades 0:7ccf0e7e8a83 835 TEST_ASSERT(false);
RobMeades 0:7ccf0e7e8a83 836 }
RobMeades 0:7ccf0e7e8a83 837 free (recv_data);
RobMeades 0:7ccf0e7e8a83 838
RobMeades 0:7ccf0e7e8a83 839 TEST_ASSERT(!connection_has_gone_down);
RobMeades 0:7ccf0e7e8a83 840 sock.close();
rob.meades@u-blox.com 6:63dad754c267 841 drop_connection(interface);
RobMeades 0:7ccf0e7e8a83 842 }
RobMeades 0:7ccf0e7e8a83 843
RobMeades 0:7ccf0e7e8a83 844 // Test TCP data exchange via the asynchronous sigio() mechanism
RobMeades 0:7ccf0e7e8a83 845 void test_tcp_echo_async() {
RobMeades 0:7ccf0e7e8a83 846 TCPSocket sock;
RobMeades 0:7ccf0e7e8a83 847 SocketAddress host_address;
RobMeades 0:7ccf0e7e8a83 848 bool callback_triggered = false;
RobMeades 0:7ccf0e7e8a83 849 int x;
RobMeades 0:7ccf0e7e8a83 850 int size;
RobMeades 0:7ccf0e7e8a83 851
rob.meades@u-blox.com 6:63dad754c267 852 interface->deinit();
rob.meades@u-blox.com 6:63dad754c267 853 TEST_ASSERT(interface->connect(MBED_CONF_APP_DEFAULT_PIN, MBED_CONF_APP_APN,
rob.meades@u-blox.com 6:63dad754c267 854 MBED_CONF_APP_USERNAME, MBED_CONF_APP_PASSWORD) == 0);
RobMeades 0:7ccf0e7e8a83 855
rob.meades@u-blox.com 6:63dad754c267 856 TEST_ASSERT(interface->gethostbyname(MBED_CONF_APP_ECHO_SERVER, &host_address) == 0);
RobMeades 0:7ccf0e7e8a83 857 host_address.set_port(MBED_CONF_APP_ECHO_TCP_PORT);
RobMeades 0:7ccf0e7e8a83 858
RobMeades 0:7ccf0e7e8a83 859 tr_debug("TCP: Server %s address: %s on port %d.", MBED_CONF_APP_ECHO_SERVER,
RobMeades 0:7ccf0e7e8a83 860 host_address.get_ip_address(), host_address.get_port());
RobMeades 0:7ccf0e7e8a83 861
rob.meades@u-blox.com 6:63dad754c267 862 TEST_ASSERT(sock.open(interface) == 0)
RobMeades 0:7ccf0e7e8a83 863
RobMeades 0:7ccf0e7e8a83 864 // Set up the async callback and set the timeout to zero
RobMeades 0:7ccf0e7e8a83 865 sock.sigio(callback(async_cb, &callback_triggered));
RobMeades 0:7ccf0e7e8a83 866 sock.set_timeout(0);
RobMeades 0:7ccf0e7e8a83 867
RobMeades 0:7ccf0e7e8a83 868 TEST_ASSERT(sock.connect(host_address) == 0);
RobMeades 0:7ccf0e7e8a83 869 // Test min, max, and some random sizes in-between
RobMeades 0:7ccf0e7e8a83 870 do_tcp_echo_async(&sock, 1, &callback_triggered);
RobMeades 0:7ccf0e7e8a83 871 do_tcp_echo_async(&sock, MBED_CONF_APP_TCP_MAX_PACKET_SIZE, &callback_triggered);
RobMeades 0:7ccf0e7e8a83 872 for (x = 0; x < 10; x++) {
RobMeades 0:7ccf0e7e8a83 873 size = (rand() % MBED_CONF_APP_TCP_MAX_PACKET_SIZE) + 1;
RobMeades 0:7ccf0e7e8a83 874 size = fix(size, MBED_CONF_APP_TCP_MAX_PACKET_SIZE);
RobMeades 0:7ccf0e7e8a83 875 do_tcp_echo_async(&sock, size, &callback_triggered);
RobMeades 0:7ccf0e7e8a83 876 }
RobMeades 0:7ccf0e7e8a83 877
RobMeades 0:7ccf0e7e8a83 878 sock.close();
RobMeades 0:7ccf0e7e8a83 879
rob.meades@u-blox.com 6:63dad754c267 880 drop_connection(interface);
RobMeades 0:7ccf0e7e8a83 881
RobMeades 0:7ccf0e7e8a83 882 tr_debug("%d TCP packets of size up to %d byte(s) echoed asynchronously and successfully.",
RobMeades 0:7ccf0e7e8a83 883 x, MBED_CONF_APP_TCP_MAX_PACKET_SIZE);
RobMeades 0:7ccf0e7e8a83 884 }
RobMeades 0:7ccf0e7e8a83 885 #endif
RobMeades 0:7ccf0e7e8a83 886
RobMeades 0:7ccf0e7e8a83 887 // Allocate max sockets
RobMeades 0:7ccf0e7e8a83 888 void test_max_sockets() {
RobMeades 0:7ccf0e7e8a83 889 UDPSocket sock[MAX_NUM_SOCKETS];
RobMeades 0:7ccf0e7e8a83 890 UDPSocket sockNone;
RobMeades 0:7ccf0e7e8a83 891 SocketAddress host_address;
RobMeades 0:7ccf0e7e8a83 892
rob.meades@u-blox.com 6:63dad754c267 893 TEST_ASSERT(interface->connect(MBED_CONF_APP_DEFAULT_PIN, MBED_CONF_APP_APN,
rob.meades@u-blox.com 6:63dad754c267 894 MBED_CONF_APP_USERNAME, MBED_CONF_APP_PASSWORD) == 0);
RobMeades 0:7ccf0e7e8a83 895
rob.meades@u-blox.com 6:63dad754c267 896 TEST_ASSERT(interface->gethostbyname(MBED_CONF_APP_NTP_SERVER, &host_address) == 0);
RobMeades 0:7ccf0e7e8a83 897 host_address.set_port(MBED_CONF_APP_NTP_PORT);
RobMeades 0:7ccf0e7e8a83 898
RobMeades 0:7ccf0e7e8a83 899 // Open the first socket and use it
rob.meades@u-blox.com 6:63dad754c267 900 TEST_ASSERT(sock[0].open(interface) == 0)
RobMeades 0:7ccf0e7e8a83 901 sock[0].set_timeout(10000);
RobMeades 0:7ccf0e7e8a83 902 do_ntp_sock(&sock[0], host_address);
RobMeades 0:7ccf0e7e8a83 903
RobMeades 0:7ccf0e7e8a83 904 // Check that we stop being able to get sockets at the max number
RobMeades 0:7ccf0e7e8a83 905 for (int x = 1; x < (int) (sizeof (sock) / sizeof (sock[0])); x++) {
rob.meades@u-blox.com 6:63dad754c267 906 TEST_ASSERT(sock[x].open(interface) == 0)
RobMeades 0:7ccf0e7e8a83 907 }
rob.meades@u-blox.com 6:63dad754c267 908 TEST_ASSERT(sockNone.open(interface) < 0);
RobMeades 0:7ccf0e7e8a83 909
RobMeades 0:7ccf0e7e8a83 910 // Now use the last one
RobMeades 0:7ccf0e7e8a83 911 sock[sizeof (sock) / sizeof (sock[0]) - 1].set_timeout(10000);
RobMeades 0:7ccf0e7e8a83 912 do_ntp_sock(&sock[sizeof (sock) / sizeof (sock[0]) - 1], host_address);
RobMeades 0:7ccf0e7e8a83 913
RobMeades 0:7ccf0e7e8a83 914 // Close all of the sockets
RobMeades 0:7ccf0e7e8a83 915 for (int x = 0; x < (int) (sizeof (sock) / sizeof (sock[0])); x++) {
RobMeades 0:7ccf0e7e8a83 916 TEST_ASSERT(sock[x].close() == 0);
RobMeades 0:7ccf0e7e8a83 917 }
RobMeades 0:7ccf0e7e8a83 918
rob.meades@u-blox.com 6:63dad754c267 919 drop_connection(interface);
RobMeades 0:7ccf0e7e8a83 920 }
RobMeades 0:7ccf0e7e8a83 921
RobMeades 0:7ccf0e7e8a83 922 // Connect with credentials included in the connect request
RobMeades 0:7ccf0e7e8a83 923 void test_connect_credentials() {
RobMeades 0:7ccf0e7e8a83 924
rob.meades@u-blox.com 6:63dad754c267 925 interface->deinit();
rob.meades@u-blox.com 6:63dad754c267 926 TEST_ASSERT(interface->connect(MBED_CONF_APP_DEFAULT_PIN, MBED_CONF_APP_APN,
rob.meades@u-blox.com 6:63dad754c267 927 MBED_CONF_APP_USERNAME, MBED_CONF_APP_PASSWORD) == 0);
rob.meades@u-blox.com 6:63dad754c267 928 use_connection(interface);
rob.meades@u-blox.com 6:63dad754c267 929 drop_connection(interface);
RobMeades 0:7ccf0e7e8a83 930 }
RobMeades 0:7ccf0e7e8a83 931
RobMeades 0:7ccf0e7e8a83 932 // Test with credentials preset
RobMeades 0:7ccf0e7e8a83 933 void test_connect_preset_credentials() {
RobMeades 0:7ccf0e7e8a83 934
rob.meades@u-blox.com 6:63dad754c267 935 interface->deinit();
rob.meades@u-blox.com 6:63dad754c267 936 TEST_ASSERT(interface->init(MBED_CONF_APP_DEFAULT_PIN));
rob.meades@u-blox.com 6:63dad754c267 937 interface->set_credentials(MBED_CONF_APP_APN, MBED_CONF_APP_USERNAME,
rob.meades@u-blox.com 6:63dad754c267 938 MBED_CONF_APP_PASSWORD);
rob.meades@u-blox.com 6:63dad754c267 939 TEST_ASSERT(interface->connect(MBED_CONF_APP_DEFAULT_PIN) == 0);
rob.meades@u-blox.com 6:63dad754c267 940 use_connection(interface);
rob.meades@u-blox.com 6:63dad754c267 941 drop_connection(interface);
RobMeades 0:7ccf0e7e8a83 942 }
RobMeades 0:7ccf0e7e8a83 943
RobMeades 0:7ccf0e7e8a83 944 // Test adding and using a SIM pin, then removing it, using the pending
RobMeades 0:7ccf0e7e8a83 945 // mechanism where the change doesn't occur until connect() is called
RobMeades 0:7ccf0e7e8a83 946 void test_check_sim_pin_pending() {
RobMeades 0:7ccf0e7e8a83 947
rob.meades@u-blox.com 6:63dad754c267 948 interface->deinit();
RobMeades 0:7ccf0e7e8a83 949
RobMeades 0:7ccf0e7e8a83 950 // Enable PIN checking (which will use the current PIN)
RobMeades 0:7ccf0e7e8a83 951 // and also flag that the PIN should be changed to MBED_CONF_APP_ALT_PIN,
RobMeades 0:7ccf0e7e8a83 952 // then try connecting
rob.meades@u-blox.com 6:63dad754c267 953 interface->set_sim_pin_check(true);
rob.meades@u-blox.com 6:63dad754c267 954 interface->set_new_sim_pin(MBED_CONF_APP_ALT_PIN);
rob.meades@u-blox.com 6:63dad754c267 955 TEST_ASSERT(interface->connect(MBED_CONF_APP_DEFAULT_PIN, MBED_CONF_APP_APN,
rob.meades@u-blox.com 6:63dad754c267 956 MBED_CONF_APP_USERNAME, MBED_CONF_APP_PASSWORD) == 0);
rob.meades@u-blox.com 6:63dad754c267 957 use_connection(interface);
rob.meades@u-blox.com 6:63dad754c267 958 drop_connection(interface);
rob.meades@u-blox.com 6:63dad754c267 959 interface->deinit();
RobMeades 0:7ccf0e7e8a83 960
RobMeades 0:7ccf0e7e8a83 961 // Now change the PIN back to what it was before
rob.meades@u-blox.com 6:63dad754c267 962 interface->set_new_sim_pin(MBED_CONF_APP_DEFAULT_PIN);
rob.meades@u-blox.com 6:63dad754c267 963 TEST_ASSERT(interface->connect(MBED_CONF_APP_ALT_PIN, MBED_CONF_APP_APN,
rob.meades@u-blox.com 6:63dad754c267 964 MBED_CONF_APP_USERNAME, MBED_CONF_APP_PASSWORD) == 0);
rob.meades@u-blox.com 6:63dad754c267 965 use_connection(interface);
rob.meades@u-blox.com 6:63dad754c267 966 drop_connection(interface);
rob.meades@u-blox.com 6:63dad754c267 967 interface->deinit();
RobMeades 0:7ccf0e7e8a83 968
RobMeades 0:7ccf0e7e8a83 969 // Check that it was changed back, and this time
RobMeades 0:7ccf0e7e8a83 970 // use the other way of entering the PIN
rob.meades@u-blox.com 6:63dad754c267 971 interface->set_sim_pin(MBED_CONF_APP_DEFAULT_PIN);
rob.meades@u-blox.com 6:63dad754c267 972 TEST_ASSERT(interface->connect(NULL, MBED_CONF_APP_APN, MBED_CONF_APP_USERNAME,
rob.meades@u-blox.com 6:63dad754c267 973 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 // Remove PIN checking again and check that it no
RobMeades 0:7ccf0e7e8a83 979 // longer matters what the PIN is
rob.meades@u-blox.com 6:63dad754c267 980 interface->set_sim_pin_check(false);
rob.meades@u-blox.com 6:63dad754c267 981 TEST_ASSERT(interface->connect(MBED_CONF_APP_DEFAULT_PIN, MBED_CONF_APP_APN,
rob.meades@u-blox.com 6:63dad754c267 982 MBED_CONF_APP_USERNAME, 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();
rob.meades@u-blox.com 6:63dad754c267 986 TEST_ASSERT(interface->init(NULL));
rob.meades@u-blox.com 6:63dad754c267 987 TEST_ASSERT(interface->connect(MBED_CONF_APP_INCORRECT_PIN, MBED_CONF_APP_APN,
rob.meades@u-blox.com 6:63dad754c267 988 MBED_CONF_APP_USERNAME, MBED_CONF_APP_PASSWORD) == 0);
rob.meades@u-blox.com 6:63dad754c267 989 use_connection(interface);
rob.meades@u-blox.com 6:63dad754c267 990 drop_connection(interface);
RobMeades 0:7ccf0e7e8a83 991
RobMeades 0:7ccf0e7e8a83 992 // Put the SIM pin back to the correct value for any subsequent tests
rob.meades@u-blox.com 6:63dad754c267 993 interface->set_sim_pin(MBED_CONF_APP_DEFAULT_PIN);
RobMeades 0:7ccf0e7e8a83 994 }
RobMeades 0:7ccf0e7e8a83 995
RobMeades 0:7ccf0e7e8a83 996 // Test adding and using a SIM pin, then removing it, using the immediate
RobMeades 0:7ccf0e7e8a83 997 // mechanism
RobMeades 0:7ccf0e7e8a83 998 void test_check_sim_pin_immediate() {
RobMeades 0:7ccf0e7e8a83 999
rob.meades@u-blox.com 6:63dad754c267 1000 interface->deinit();
rob.meades@u-blox.com 6:63dad754c267 1001 interface->connection_status_cb(connection_down_cb);
RobMeades 0:7ccf0e7e8a83 1002
RobMeades 0:7ccf0e7e8a83 1003 // Enable PIN checking (which will use the current PIN), change
RobMeades 0:7ccf0e7e8a83 1004 // the PIN to MBED_CONF_APP_ALT_PIN, then try connecting after powering on and
RobMeades 0:7ccf0e7e8a83 1005 // off the modem
rob.meades@u-blox.com 6:63dad754c267 1006 interface->set_sim_pin_check(true, true, MBED_CONF_APP_DEFAULT_PIN);
rob.meades@u-blox.com 6:63dad754c267 1007 interface->set_new_sim_pin(MBED_CONF_APP_ALT_PIN, true);
rob.meades@u-blox.com 6:63dad754c267 1008 interface->deinit();
rob.meades@u-blox.com 6:63dad754c267 1009 TEST_ASSERT(interface->init(NULL));
rob.meades@u-blox.com 6:63dad754c267 1010 TEST_ASSERT(interface->connect(MBED_CONF_APP_ALT_PIN, MBED_CONF_APP_APN,
rob.meades@u-blox.com 6:63dad754c267 1011 MBED_CONF_APP_USERNAME, MBED_CONF_APP_PASSWORD) == 0);
rob.meades@u-blox.com 6:63dad754c267 1012 use_connection(interface);
rob.meades@u-blox.com 6:63dad754c267 1013 drop_connection(interface);
RobMeades 0:7ccf0e7e8a83 1014
rob.meades@u-blox.com 6:63dad754c267 1015 interface->connection_status_cb(connection_down_cb);
RobMeades 0:7ccf0e7e8a83 1016
RobMeades 0:7ccf0e7e8a83 1017 // Now change the PIN back to what it was before
rob.meades@u-blox.com 6:63dad754c267 1018 interface->set_new_sim_pin(MBED_CONF_APP_DEFAULT_PIN, true);
rob.meades@u-blox.com 6:63dad754c267 1019 interface->deinit();
rob.meades@u-blox.com 6:63dad754c267 1020 interface->set_sim_pin(MBED_CONF_APP_DEFAULT_PIN);
rob.meades@u-blox.com 6:63dad754c267 1021 TEST_ASSERT(interface->init(NULL));
rob.meades@u-blox.com 6:63dad754c267 1022 TEST_ASSERT(interface->connect(NULL, MBED_CONF_APP_APN, MBED_CONF_APP_USERNAME,
rob.meades@u-blox.com 6:63dad754c267 1023 MBED_CONF_APP_PASSWORD) == 0);
rob.meades@u-blox.com 6:63dad754c267 1024 use_connection(interface);
rob.meades@u-blox.com 6:63dad754c267 1025 drop_connection(interface);
RobMeades 0:7ccf0e7e8a83 1026
rob.meades@u-blox.com 6:63dad754c267 1027 interface->connection_status_cb(connection_down_cb);
RobMeades 0:7ccf0e7e8a83 1028
RobMeades 0:7ccf0e7e8a83 1029 // Remove PIN checking again and check that it no
RobMeades 0:7ccf0e7e8a83 1030 // longer matters what the PIN is
rob.meades@u-blox.com 6:63dad754c267 1031 interface->set_sim_pin_check(false, true);
rob.meades@u-blox.com 6:63dad754c267 1032 interface->deinit();
rob.meades@u-blox.com 6:63dad754c267 1033 TEST_ASSERT(interface->init(MBED_CONF_APP_INCORRECT_PIN));
rob.meades@u-blox.com 6:63dad754c267 1034 TEST_ASSERT(interface->connect(NULL, MBED_CONF_APP_APN, MBED_CONF_APP_USERNAME,
rob.meades@u-blox.com 6:63dad754c267 1035 MBED_CONF_APP_PASSWORD) == 0);
rob.meades@u-blox.com 6:63dad754c267 1036 use_connection(interface);
rob.meades@u-blox.com 6:63dad754c267 1037 drop_connection(interface);
RobMeades 0:7ccf0e7e8a83 1038
RobMeades 0:7ccf0e7e8a83 1039 // Put the SIM pin back to the correct value for any subsequent tests
rob.meades@u-blox.com 6:63dad754c267 1040 interface->set_sim_pin(MBED_CONF_APP_DEFAULT_PIN);
RobMeades 0:7ccf0e7e8a83 1041 }
RobMeades 0:7ccf0e7e8a83 1042
rob.meades@u-blox.com 6:63dad754c267 1043 // Test being able to connect with a local instance of the interface
RobMeades 0:7ccf0e7e8a83 1044 // NOTE: since this local instance will fiddle with bits of HW that the
RobMeades 0:7ccf0e7e8a83 1045 // static instance thought it owned, the static instance will no longer
RobMeades 0:7ccf0e7e8a83 1046 // work afterwards, hence this must be run as the last test in the list
RobMeades 0:7ccf0e7e8a83 1047 void test_connect_local_instance_last_test() {
RobMeades 0:7ccf0e7e8a83 1048
RobMeades 0:7ccf0e7e8a83 1049 UbloxATCellularInterface *pLocalInterface = NULL;
RobMeades 0:7ccf0e7e8a83 1050
RobMeades 0:7ccf0e7e8a83 1051 pLocalInterface = new UbloxATCellularInterface(MDMTXD, MDMRXD,
RobMeades 0:7ccf0e7e8a83 1052 MBED_CONF_UBLOX_CELL_BAUD_RATE,
RobMeades 0:7ccf0e7e8a83 1053 MBED_CONF_APP_DEBUG_ON);
RobMeades 0:7ccf0e7e8a83 1054 pLocalInterface->connection_status_cb(connection_down_cb);
RobMeades 0:7ccf0e7e8a83 1055
RobMeades 0:7ccf0e7e8a83 1056 TEST_ASSERT(pLocalInterface->connect(MBED_CONF_APP_DEFAULT_PIN, MBED_CONF_APP_APN,
RobMeades 0:7ccf0e7e8a83 1057 MBED_CONF_APP_USERNAME, MBED_CONF_APP_PASSWORD) == 0);
RobMeades 0:7ccf0e7e8a83 1058 use_connection(pLocalInterface);
RobMeades 0:7ccf0e7e8a83 1059 drop_connection(pLocalInterface);
RobMeades 0:7ccf0e7e8a83 1060 delete pLocalInterface;
RobMeades 0:7ccf0e7e8a83 1061 }
wajahat.abbas@u-blox.com 37:0ceb2dfc746c 1062 #if defined (TARGET_UBLOX_C030_U201) || defined (TARGET_UBLOX_C030_R412M)
mudassar0121 22:63b1a3c02fb8 1063 void test_set_new_rat() {
mudassar0121 22:63b1a3c02fb8 1064
mudassar0121 22:63b1a3c02fb8 1065 int currentSelectedRat = -1, currentPreferredRat = -1, currentSecondPreferredRat = -1;
mudassar0121 22:63b1a3c02fb8 1066
mudassar0121 22:63b1a3c02fb8 1067 // Power-up the modem
mudassar0121 22:63b1a3c02fb8 1068 TEST_ASSERT(interface->init());
mudassar0121 22:63b1a3c02fb8 1069
mudassar0121 22:63b1a3c02fb8 1070 // Check if modem is registered with network
mudassar0121 22:63b1a3c02fb8 1071 if (interface->is_registered_csd() || interface->is_registered_psd() || interface->is_registered_eps()) {
mudassar0121 22:63b1a3c02fb8 1072 tr_error("RAT should only be set in detached state");
mudassar0121 22:63b1a3c02fb8 1073 // Deregister from Network
wajahat.abbas@u-blox.com 27:3d709ee8c3e1 1074 drop_connection(interface);
mudassar0121 22:63b1a3c02fb8 1075 }
mudassar0121 22:63b1a3c02fb8 1076
mudassar0121 22:63b1a3c02fb8 1077 // Get and store initial RAT set on modem
mudassar0121 22:63b1a3c02fb8 1078 TEST_ASSERT(interface->get_modem_rat(&previousSelectedRat, &previousPreferredRat, &previousSecondPreferredRat));
mudassar0121 22:63b1a3c02fb8 1079 tr_debug("previous selected RAT: %d\nprevious preferred RAT: %d\nprevious second preferred RAT: %d\n", previousSelectedRat, previousPreferredRat, previousSecondPreferredRat);
mudassar0121 22:63b1a3c02fb8 1080
mudassar0121 22:63b1a3c02fb8 1081 #ifdef TARGET_UBLOX_C030_U201
mudassar0121 22:63b1a3c02fb8 1082 // Set new RAT
mudassar0121 22:63b1a3c02fb8 1083 TEST_ASSERT(interface->set_modem_rat(UbloxATCellularInterface::GSM_UMTS, UbloxATCellularInterface::UMTS));
mudassar0121 22:63b1a3c02fb8 1084 tr_debug("RAT configured\n");
mudassar0121 22:63b1a3c02fb8 1085
mudassar0121 22:63b1a3c02fb8 1086 // Get latest set RAT on modem
mudassar0121 22:63b1a3c02fb8 1087 TEST_ASSERT(interface->get_modem_rat(&currentSelectedRat, &currentPreferredRat, &currentSecondPreferredRat));
mudassar0121 22:63b1a3c02fb8 1088 tr_debug("new selected RAT: %d\nnew preferred RAT: %d\nnew second preferred RAT: %d\n", currentSelectedRat, currentPreferredRat, currentSecondPreferredRat);
mudassar0121 22:63b1a3c02fb8 1089
mudassar0121 22:63b1a3c02fb8 1090 // Check RAT configured correctly
mudassar0121 22:63b1a3c02fb8 1091 TEST_ASSERT((currentSelectedRat == UbloxATCellularInterface::GSM_UMTS) && (currentPreferredRat == UbloxATCellularInterface::UMTS));
mudassar0121 22:63b1a3c02fb8 1092
wajahat.abbas@u-blox.com 37:0ceb2dfc746c 1093 #elif TARGET_UBLOX_C030_R412M
mudassar0121 22:63b1a3c02fb8 1094 // Set new RAT
wajahat.abbas@u-blox.com 37:0ceb2dfc746c 1095 TEST_ASSERT(interface->set_modem_rat(UbloxATCellularInterface::LTE_CATM1, UbloxATCellularInterface::LTE_CATNB1, UbloxATCellularInterface::GPRS_EGPRS));
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::LTE_CATM1) && (currentPreferredRat == UbloxATCellularInterface::LTE_CATNB1));
mudassar0121 22:63b1a3c02fb8 1104 #endif
mudassar0121 22:63b1a3c02fb8 1105 }
mudassar0121 22:63b1a3c02fb8 1106
mudassar0121 22:63b1a3c02fb8 1107 void test_reboot() {
mudassar0121 22:63b1a3c02fb8 1108
mudassar0121 22:63b1a3c02fb8 1109 // Rebooting modem for settings to take effect
mudassar0121 22:63b1a3c02fb8 1110 TEST_ASSERT(interface->reboot_modem());
mudassar0121 22:63b1a3c02fb8 1111 }
mudassar0121 22:63b1a3c02fb8 1112
mudassar0121 22:63b1a3c02fb8 1113 void test_registration() {
mudassar0121 22:63b1a3c02fb8 1114
mudassar0121 22:63b1a3c02fb8 1115 TEST_ASSERT(interface->connect(MBED_CONF_APP_DEFAULT_PIN, MBED_CONF_APP_APN,
mudassar0121 22:63b1a3c02fb8 1116 MBED_CONF_APP_USERNAME, MBED_CONF_APP_PASSWORD) == 0);
mudassar0121 22:63b1a3c02fb8 1117
wajahat.abbas@u-blox.com 27:3d709ee8c3e1 1118 drop_connection(interface);
mudassar0121 22:63b1a3c02fb8 1119 }
mudassar0121 22:63b1a3c02fb8 1120
mudassar0121 22:63b1a3c02fb8 1121
mudassar0121 22:63b1a3c02fb8 1122 void test_set_previous_rat() {
mudassar0121 22:63b1a3c02fb8 1123
mudassar0121 22:63b1a3c02fb8 1124 int currentSelectedRat = -1, currentPreferredRat = -1, currentSecondPreferredRat = -1;
mudassar0121 22:63b1a3c02fb8 1125
mudassar0121 22:63b1a3c02fb8 1126 // Restore RAT to previous settings
mudassar0121 22:63b1a3c02fb8 1127 TEST_ASSERT(interface->set_modem_rat((UbloxATCellularInterface::RAT)previousSelectedRat, (UbloxATCellularInterface::RAT)previousPreferredRat, (UbloxATCellularInterface::RAT)previousSecondPreferredRat));
mudassar0121 22:63b1a3c02fb8 1128 tr_debug("RAT configured\n");
mudassar0121 22:63b1a3c02fb8 1129
mudassar0121 22:63b1a3c02fb8 1130 TEST_ASSERT(interface->get_modem_rat(&currentSelectedRat, &currentPreferredRat, &currentSecondPreferredRat));
mudassar0121 22:63b1a3c02fb8 1131 tr_debug("current selected RAT: %d\ncurrent preferred RAT: %d\ncurrent second preferred RAT: %d\n", currentSelectedRat, currentPreferredRat, currentSecondPreferredRat);
mudassar0121 22:63b1a3c02fb8 1132
mudassar0121 22:63b1a3c02fb8 1133 // Check RAT configured correctly
mudassar0121 22:63b1a3c02fb8 1134 TEST_ASSERT((currentSelectedRat == previousSelectedRat) && (currentPreferredRat == previousPreferredRat));
mudassar0121 22:63b1a3c02fb8 1135
mudassar0121 22:63b1a3c02fb8 1136 // Rebooting modem for settings to take effect
mudassar0121 22:63b1a3c02fb8 1137 TEST_ASSERT(interface->reboot_modem());
mudassar0121 22:63b1a3c02fb8 1138 }
wajahat.abbas@u-blox.com 37:0ceb2dfc746c 1139 #endif
mudassar0121 22:63b1a3c02fb8 1140
mudassar0121 22:63b1a3c02fb8 1141 #ifdef TARGET_UBLOX_C030_R41XM
mudassar0121 22:63b1a3c02fb8 1142 void test_mno_profile() {
mudassar0121 22:63b1a3c02fb8 1143
mudassar0121 22:63b1a3c02fb8 1144 int previous_profile, current_profile;
mudassar0121 22:63b1a3c02fb8 1145
mudassar0121 22:63b1a3c02fb8 1146 // Power-up the modem
wajahat.abbas@u-blox.com 37:0ceb2dfc746c 1147 interface->init(MBED_CONF_APP_DEFAULT_PIN); //init can return false if profile set is SW_DEFAULT
mudassar0121 22:63b1a3c02fb8 1148
mudassar0121 22:63b1a3c02fb8 1149 // Check if modem is registered with network
mudassar0121 22:63b1a3c02fb8 1150 if (interface->is_registered_csd() || interface->is_registered_psd() || interface->is_registered_eps()) {
mudassar0121 22:63b1a3c02fb8 1151 tr_error("MNO profile should only be set in detached state");
mudassar0121 22:63b1a3c02fb8 1152 // Deregister from Network
wajahat.abbas@u-blox.com 27:3d709ee8c3e1 1153 drop_connection(interface);
mudassar0121 22:63b1a3c02fb8 1154 }
mudassar0121 22:63b1a3c02fb8 1155
mudassar0121 22:63b1a3c02fb8 1156 // Getting current mno profile
mudassar0121 22:63b1a3c02fb8 1157 TEST_ASSERT(interface->get_mno_profile(&previous_profile));
wajahat.abbas@u-blox.com 37:0ceb2dfc746c 1158 tr_debug("Previous MNO profile is: %d\n", previous_profile);
mudassar0121 22:63b1a3c02fb8 1159
mudassar0121 22:63b1a3c02fb8 1160 // Set MNO profile
wajahat.abbas@u-blox.com 37:0ceb2dfc746c 1161 TEST_ASSERT(interface->set_mno_profile(UbloxATCellularInterface::STANDARD_EU));
mudassar0121 22:63b1a3c02fb8 1162 tr_debug("MNO configured\n");
mudassar0121 22:63b1a3c02fb8 1163
mudassar0121 22:63b1a3c02fb8 1164 // Rebooting modem for settings to take effect
mudassar0121 22:63b1a3c02fb8 1165 TEST_ASSERT(interface->reboot_modem());
mudassar0121 22:63b1a3c02fb8 1166 tr_debug("Reboot successful\n");
mudassar0121 22:63b1a3c02fb8 1167 wait_ms(5000);
mudassar0121 22:63b1a3c02fb8 1168
wajahat.abbas@u-blox.com 37:0ceb2dfc746c 1169 TEST_ASSERT(interface->init(MBED_CONF_APP_DEFAULT_PIN));
wajahat.abbas@u-blox.com 37:0ceb2dfc746c 1170
mudassar0121 22:63b1a3c02fb8 1171 // Check MNO profile configured correctly
mudassar0121 22:63b1a3c02fb8 1172 TEST_ASSERT(interface->get_mno_profile(&current_profile));
wajahat.abbas@u-blox.com 37:0ceb2dfc746c 1173 tr_debug("New MNO profile is: %d\n", current_profile);
mudassar0121 22:63b1a3c02fb8 1174
wajahat.abbas@u-blox.com 37:0ceb2dfc746c 1175 TEST_ASSERT(interface->disable_psm());
wajahat.abbas@u-blox.com 37:0ceb2dfc746c 1176
wajahat.abbas@u-blox.com 37:0ceb2dfc746c 1177 TEST_ASSERT((UbloxATCellularInterface::MNOProfile)current_profile == UbloxATCellularInterface::STANDARD_EU);
mudassar0121 22:63b1a3c02fb8 1178
mudassar0121 22:63b1a3c02fb8 1179 TEST_ASSERT(interface->connect(MBED_CONF_APP_DEFAULT_PIN, MBED_CONF_APP_APN,
mudassar0121 22:63b1a3c02fb8 1180 MBED_CONF_APP_USERNAME, MBED_CONF_APP_PASSWORD) == 0);
mudassar0121 22:63b1a3c02fb8 1181
wajahat.abbas@u-blox.com 27:3d709ee8c3e1 1182 drop_connection(interface);
fahimalavi 30:0f571a4920c8 1183 }
fahimalavi 30:0f571a4920c8 1184
fahimalavi 30:0f571a4920c8 1185 void test_edrx() {
fahimalavi 30:0f571a4920c8 1186 const int c_edrx_value = 2;
fahimalavi 30:0f571a4920c8 1187
fahimalavi 30:0f571a4920c8 1188 // Power-up the modem
fahimalavi 30:0f571a4920c8 1189 TEST_ASSERT(interface->init(MBED_CONF_APP_DEFAULT_PIN));
mudassar0121 22:63b1a3c02fb8 1190
fahimalavi 30:0f571a4920c8 1191 // Check if modem is registered with network
fahimalavi 30:0f571a4920c8 1192 if (interface->is_registered_csd() || interface->is_registered_psd() || interface->is_registered_eps()) {
fahimalavi 30:0f571a4920c8 1193 tr_error("set edrx in detached state");
fahimalavi 30:0f571a4920c8 1194 // Deregister from Network
fahimalavi 30:0f571a4920c8 1195 drop_connection(interface);
fahimalavi 30:0f571a4920c8 1196 }
fahimalavi 30:0f571a4920c8 1197
wajahat.abbas@u-blox.com 37:0ceb2dfc746c 1198 //disable edrx
wajahat.abbas@u-blox.com 37:0ceb2dfc746c 1199 interface->set_receive_period(3, UbloxCellularBase::EDRXEUTRAN_WB_S1_mode);
wajahat.abbas@u-blox.com 37:0ceb2dfc746c 1200 interface->set_receive_period(3, UbloxCellularBase::EDRXEUTRAN_NB_S1_mode);
wajahat.abbas@u-blox.com 37:0ceb2dfc746c 1201
wajahat.abbas@u-blox.com 37:0ceb2dfc746c 1202 //set edrx
fahimalavi 30:0f571a4920c8 1203 interface->set_receive_period(2, UbloxCellularBase::EDRXEUTRAN_WB_S1_mode, c_edrx_value);
fahimalavi 30:0f571a4920c8 1204 interface->set_receive_period(2, UbloxCellularBase::EDRXEUTRAN_NB_S1_mode, c_edrx_value);
mudassar0121 22:63b1a3c02fb8 1205
fahimalavi 30:0f571a4920c8 1206 TEST_ASSERT(interface->connect(MBED_CONF_APP_DEFAULT_PIN, MBED_CONF_APP_APN,
fahimalavi 30:0f571a4920c8 1207 MBED_CONF_APP_USERNAME, MBED_CONF_APP_PASSWORD) == 0);
fahimalavi 30:0f571a4920c8 1208
fahimalavi 30:0f571a4920c8 1209 TEST_ASSERT(interface->get_receive_period() == c_edrx_value);
fahimalavi 30:0f571a4920c8 1210
fahimalavi 30:0f571a4920c8 1211 drop_connection(interface);
fahimalavi 30:0f571a4920c8 1212
wajahat.abbas@u-blox.com 37:0ceb2dfc746c 1213 //re-apply default mno profile
wajahat.abbas@u-blox.com 37:0ceb2dfc746c 1214 TEST_ASSERT(interface->set_mno_profile(UbloxATCellularInterface::STANDARD_EU));
fahimalavi 30:0f571a4920c8 1215 TEST_ASSERT(interface->reboot_modem());
fahimalavi 30:0f571a4920c8 1216 wait_ms(5000);
wajahat.abbas@u-blox.com 37:0ceb2dfc746c 1217 TEST_ASSERT(interface->init(MBED_CONF_APP_DEFAULT_PIN));
wajahat.abbas@u-blox.com 37:0ceb2dfc746c 1218 TEST_ASSERT(interface->disable_psm());
mudassar0121 22:63b1a3c02fb8 1219 }
mudassar0121 22:63b1a3c02fb8 1220 #endif
mudassar0121 22:63b1a3c02fb8 1221
RobMeades 0:7ccf0e7e8a83 1222 // ----------------------------------------------------------------
RobMeades 0:7ccf0e7e8a83 1223 // TEST ENVIRONMENT
RobMeades 0:7ccf0e7e8a83 1224 // ----------------------------------------------------------------
RobMeades 0:7ccf0e7e8a83 1225
RobMeades 0:7ccf0e7e8a83 1226 // Setup the test environment
RobMeades 0:7ccf0e7e8a83 1227 utest::v1::status_t test_setup(const size_t number_of_cases) {
RobMeades 0:7ccf0e7e8a83 1228 // Setup Greentea with a timeout
RobMeades 0:7ccf0e7e8a83 1229 GREENTEA_SETUP(960, "default_auto");
RobMeades 0:7ccf0e7e8a83 1230 return verbose_test_setup_handler(number_of_cases);
RobMeades 0:7ccf0e7e8a83 1231 }
RobMeades 0:7ccf0e7e8a83 1232
RobMeades 0:7ccf0e7e8a83 1233 // IMPORTANT!!! if you make a change to the tests here you should
RobMeades 0:7ccf0e7e8a83 1234 // check whether the same change should be made to the tests under
rob.meades@u-blox.com 6:63dad754c267 1235 // the PPP interface.
RobMeades 0:7ccf0e7e8a83 1236
RobMeades 0:7ccf0e7e8a83 1237 // Test cases
RobMeades 0:7ccf0e7e8a83 1238 Case cases[] = {
fahimalavi 30:0f571a4920c8 1239 #ifdef TARGET_UBLOX_C030_R41XM
fahimalavi 30:0f571a4920c8 1240 Case("MNO profile test", test_mno_profile),
fahimalavi 30:0f571a4920c8 1241 Case("edrx test", test_edrx),
fahimalavi 30:0f571a4920c8 1242 #endif
RobMeades 12:ff6fac481487 1243 Case("Base class tests", test_base_class),
RobMeades 0:7ccf0e7e8a83 1244 Case("Set randomise", test_set_randomise),
RobMeades 0:7ccf0e7e8a83 1245 #ifdef MBED_CONF_APP_ECHO_SERVER
RobMeades 0:7ccf0e7e8a83 1246 Case("UDP echo test", test_udp_echo),
RobMeades 0:7ccf0e7e8a83 1247 # ifndef TARGET_UBLOX_C027 // Not enough RAM on little 'ole C027 to run this test
RobMeades 0:7ccf0e7e8a83 1248 Case("UDP recv sizes", test_udp_echo_recv_sizes),
RobMeades 0:7ccf0e7e8a83 1249 # endif
RobMeades 0:7ccf0e7e8a83 1250 Case("UDP async echo test", test_udp_echo_async),
RobMeades 0:7ccf0e7e8a83 1251 # ifndef TARGET_UBLOX_C027 // Not enough RAM on little 'ole C027 to run this test
RobMeades 0:7ccf0e7e8a83 1252 Case("TCP recv sizes", test_tcp_echo_recv_sizes),
RobMeades 0:7ccf0e7e8a83 1253 # endif
RobMeades 0:7ccf0e7e8a83 1254 Case("TCP async echo test", test_tcp_echo_async),
RobMeades 0:7ccf0e7e8a83 1255 #endif
RobMeades 0:7ccf0e7e8a83 1256 #ifndef TARGET_UBLOX_C027 // Not enough RAM on little 'ole C027 to run this test
RobMeades 0:7ccf0e7e8a83 1257 Case("Alloc max sockets", test_max_sockets),
RobMeades 0:7ccf0e7e8a83 1258 #endif
RobMeades 0:7ccf0e7e8a83 1259 Case("Connect with credentials", test_connect_credentials),
RobMeades 0:7ccf0e7e8a83 1260 Case("Connect with preset credentials", test_connect_preset_credentials),
RobMeades 0:7ccf0e7e8a83 1261 #if MBED_CONF_APP_RUN_SIM_PIN_CHANGE_TESTS
RobMeades 0:7ccf0e7e8a83 1262 Case("Check SIM pin, pending", test_check_sim_pin_pending),
RobMeades 0:7ccf0e7e8a83 1263 Case("Check SIM pin, immediate", test_check_sim_pin_immediate),
RobMeades 0:7ccf0e7e8a83 1264 #endif
mudassar0121 22:63b1a3c02fb8 1265 #if defined (TARGET_UBLOX_C030_U201) || defined (TARGET_UBLOX_C030_R412M)
mudassar0121 22:63b1a3c02fb8 1266 Case("Set RAT test", test_set_new_rat),
mudassar0121 22:63b1a3c02fb8 1267 Case("Reboot test", test_reboot),
mudassar0121 22:63b1a3c02fb8 1268 Case("Register with network test", test_registration),
mudassar0121 22:63b1a3c02fb8 1269 Case("Set previous RAT test", test_set_previous_rat),
mudassar0121 22:63b1a3c02fb8 1270 #endif
RobMeades 0:7ccf0e7e8a83 1271 #ifndef TARGET_UBLOX_C027 // Not enough RAM on little 'ole C027 for this
RobMeades 0:7ccf0e7e8a83 1272 Case("Connect using local instance, must be last test", test_connect_local_instance_last_test)
RobMeades 0:7ccf0e7e8a83 1273 #endif
RobMeades 0:7ccf0e7e8a83 1274 };
RobMeades 0:7ccf0e7e8a83 1275
RobMeades 0:7ccf0e7e8a83 1276 Specification specification(test_setup, cases);
RobMeades 0:7ccf0e7e8a83 1277
RobMeades 0:7ccf0e7e8a83 1278 // ----------------------------------------------------------------
RobMeades 0:7ccf0e7e8a83 1279 // MAIN
RobMeades 0:7ccf0e7e8a83 1280 // ----------------------------------------------------------------
RobMeades 0:7ccf0e7e8a83 1281
RobMeades 0:7ccf0e7e8a83 1282 int main() {
RobMeades 0:7ccf0e7e8a83 1283
RobMeades 0:7ccf0e7e8a83 1284 #ifdef FEATURE_COMMON_PAL
RobMeades 0:7ccf0e7e8a83 1285 mbed_trace_init();
RobMeades 0:7ccf0e7e8a83 1286
RobMeades 0:7ccf0e7e8a83 1287 mbed_trace_mutex_wait_function_set(lock);
RobMeades 0:7ccf0e7e8a83 1288 mbed_trace_mutex_release_function_set(unlock);
RobMeades 0:7ccf0e7e8a83 1289 #endif
RobMeades 0:7ccf0e7e8a83 1290
rob.meades@u-blox.com 6:63dad754c267 1291 interface->connection_status_cb(connection_down_cb);
RobMeades 0:7ccf0e7e8a83 1292
RobMeades 0:7ccf0e7e8a83 1293 // Run tests
RobMeades 0:7ccf0e7e8a83 1294 return !Harness::run(specification);
RobMeades 0:7ccf0e7e8a83 1295 }
RobMeades 0:7ccf0e7e8a83 1296
RobMeades 0:7ccf0e7e8a83 1297 // End Of File