Library that implements the CellularInterface using PPP and LWIP on the mbed MCU. May be used on the C027 and C030 (non-N2xx flavour) boards from mbed 5.5 onwards.

Dependents:   example-ublox-cellular-interface HelloMQTT example-ublox-cellular-interface_r410M example-ublox-mbed-client

Committer:
rob.meades@u-blox.com
Date:
Thu Jun 15 14:05:47 2017 +0100
Revision:
1:80ec3fccad9e
Parent:
0:44dd95724bc2
Child:
3:9863dcade75d
Bring PPP interface code up to date with AT interface code and test on both C030 and C027 platforms.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
RobMeades 0:44dd95724bc2 1 #include "UbloxPPPCellularInterface.h"
RobMeades 0:44dd95724bc2 2 #include "mbed.h"
RobMeades 0:44dd95724bc2 3 #include "Callback.h"
RobMeades 0:44dd95724bc2 4 #include "greentea-client/test_env.h"
RobMeades 0:44dd95724bc2 5 #include "unity.h"
RobMeades 0:44dd95724bc2 6 #include "utest.h"
RobMeades 0:44dd95724bc2 7 #include "UDPSocket.h"
RobMeades 0:44dd95724bc2 8 #ifdef FEATURE_COMMON_PAL
RobMeades 0:44dd95724bc2 9 #include "mbed_trace.h"
RobMeades 0:44dd95724bc2 10 #define TRACE_GROUP "TEST"
RobMeades 0:44dd95724bc2 11 #else
rob.meades@u-blox.com 1:80ec3fccad9e 12 #define tr_debug(format, ...) debug(format "\n", ## __VA_ARGS__)
rob.meades@u-blox.com 1:80ec3fccad9e 13 #define tr_info(format, ...) debug(format "\n", ## __VA_ARGS__)
rob.meades@u-blox.com 1:80ec3fccad9e 14 #define tr_warn(format, ...) debug(format "\n", ## __VA_ARGS__)
rob.meades@u-blox.com 1:80ec3fccad9e 15 #define tr_error(format, ...) debug(format "\n", ## __VA_ARGS__)
RobMeades 0:44dd95724bc2 16 #endif
RobMeades 0:44dd95724bc2 17
RobMeades 0:44dd95724bc2 18 using namespace utest::v1;
RobMeades 0:44dd95724bc2 19
RobMeades 0:44dd95724bc2 20 #if NSAPI_PPP_AVAILABLE
RobMeades 0:44dd95724bc2 21
RobMeades 0:44dd95724bc2 22 // IMPORTANT!!! if you make a change to the tests here you should
RobMeades 0:44dd95724bc2 23 // check whether the same change should be made to the tests under
rob.meades@u-blox.com 1:80ec3fccad9e 24 // the AT interface.
rob.meades@u-blox.com 1:80ec3fccad9e 25
rob.meades@u-blox.com 1:80ec3fccad9e 26 // NOTE: these test are only as reliable as UDP across the internet
rob.meades@u-blox.com 1:80ec3fccad9e 27 // over a radio link. The tests expect an NTP server to respond
rob.meades@u-blox.com 1:80ec3fccad9e 28 // to UDP packets and, if configured, an echo server to respond
rob.meades@u-blox.com 1:80ec3fccad9e 29 // to UDP packets. This simply may not happen. Please be patient.
RobMeades 0:44dd95724bc2 30
RobMeades 0:44dd95724bc2 31 // ----------------------------------------------------------------
RobMeades 0:44dd95724bc2 32 // COMPILE-TIME MACROS
RobMeades 0:44dd95724bc2 33 // ----------------------------------------------------------------
RobMeades 0:44dd95724bc2 34
RobMeades 0:44dd95724bc2 35 // These macros can be overridden with an mbed_app.json file and
RobMeades 0:44dd95724bc2 36 // contents of the following form:
RobMeades 0:44dd95724bc2 37 //
RobMeades 0:44dd95724bc2 38 //{
RobMeades 0:44dd95724bc2 39 // "config": {
RobMeades 0:44dd95724bc2 40 // "default-pin": {
RobMeades 0:44dd95724bc2 41 // "value": "\"1234\""
RobMeades 0:44dd95724bc2 42 // }
RobMeades 0:44dd95724bc2 43 //}
RobMeades 0:44dd95724bc2 44 //
RobMeades 0:44dd95724bc2 45 // See the template_mbed_app.txt in this directory for a fuller example.
RobMeades 0:44dd95724bc2 46
RobMeades 0:44dd95724bc2 47 // Whether debug trace is on
RobMeades 0:44dd95724bc2 48 #ifndef MBED_CONF_APP_DEBUG_ON
RobMeades 0:44dd95724bc2 49 # define MBED_CONF_APP_DEBUG_ON false
RobMeades 0:44dd95724bc2 50 #endif
RobMeades 0:44dd95724bc2 51
RobMeades 0:44dd95724bc2 52 // Run the SIM change tests, which require the DEFAULT_PIN
RobMeades 0:44dd95724bc2 53 // above to be correct for the board on which the test
RobMeades 0:44dd95724bc2 54 // is being run (and the SIM PIN to be disabled before tests run).
RobMeades 0:44dd95724bc2 55 #ifndef MBED_CONF_APP_RUN_SIM_PIN_CHANGE_TESTS
RobMeades 0:44dd95724bc2 56 # define MBED_CONF_APP_RUN_SIM_PIN_CHANGE_TESTS 0
RobMeades 0:44dd95724bc2 57 #endif
RobMeades 0:44dd95724bc2 58
RobMeades 0:44dd95724bc2 59 #if MBED_CONF_APP_RUN_SIM_PIN_CHANGE_TESTS
RobMeades 0:44dd95724bc2 60 # ifndef MBED_CONF_APP_DEFAULT_PIN
RobMeades 0:44dd95724bc2 61 # error "MBED_CONF_APP_DEFAULT_PIN must be defined to run the SIM tests"
RobMeades 0:44dd95724bc2 62 # endif
RobMeades 0:44dd95724bc2 63 # ifndef MBED_CONF_APP_ALT_PIN
RobMeades 0:44dd95724bc2 64 # error "MBED_CONF_APP_ALT_PIN must be defined to run the SIM tests"
RobMeades 0:44dd95724bc2 65 # endif
RobMeades 0:44dd95724bc2 66 # ifndef MBED_CONF_APP_INCORRECT_PIN
RobMeades 0:44dd95724bc2 67 # error "MBED_CONF_APP_INCORRECT_PIN must be defined to run the SIM tests"
RobMeades 0:44dd95724bc2 68 # endif
RobMeades 0:44dd95724bc2 69 #endif
RobMeades 0:44dd95724bc2 70
RobMeades 0:44dd95724bc2 71 // The credentials of the SIM in the board.
RobMeades 0:44dd95724bc2 72 #ifndef MBED_CONF_APP_DEFAULT_PIN
RobMeades 0:44dd95724bc2 73 // Note: if PIN is enabled on your SIM, or you wish to run the SIM PIN change
RobMeades 0:44dd95724bc2 74 // tests, you must define the PIN for your SIM (see note above on using
RobMeades 0:44dd95724bc2 75 // mbed_app.json to do so).
RobMeades 0:44dd95724bc2 76 # define MBED_CONF_APP_DEFAULT_PIN "0000"
RobMeades 0:44dd95724bc2 77 #endif
RobMeades 0:44dd95724bc2 78 #ifndef MBED_CONF_APP_APN
RobMeades 0:44dd95724bc2 79 # define MBED_CONF_APP_APN NULL
RobMeades 0:44dd95724bc2 80 #endif
RobMeades 0:44dd95724bc2 81 #ifndef MBED_CONF_APP_USERNAME
RobMeades 0:44dd95724bc2 82 # define MBED_CONF_APP_USERNAME NULL
RobMeades 0:44dd95724bc2 83 #endif
RobMeades 0:44dd95724bc2 84 #ifndef MBED_CONF_APP_PASSWORD
RobMeades 0:44dd95724bc2 85 # define MBED_CONF_APP_PASSWORD NULL
RobMeades 0:44dd95724bc2 86 #endif
RobMeades 0:44dd95724bc2 87
RobMeades 0:44dd95724bc2 88 // Alternate PIN to use during pin change testing
RobMeades 0:44dd95724bc2 89 #ifndef MBED_CONF_APP_ALT_PIN
RobMeades 0:44dd95724bc2 90 # define MBED_CONF_APP_ALT_PIN "9876"
RobMeades 0:44dd95724bc2 91 #endif
RobMeades 0:44dd95724bc2 92
RobMeades 0:44dd95724bc2 93 // A PIN that is definitely incorrect
RobMeades 0:44dd95724bc2 94 #ifndef MBED_CONF_APP_INCORRECT_PIN
RobMeades 0:44dd95724bc2 95 # define MBED_CONF_APP_INCORRECT_PIN "1530"
RobMeades 0:44dd95724bc2 96 #endif
RobMeades 0:44dd95724bc2 97
RobMeades 0:44dd95724bc2 98 // Servers and ports
RobMeades 0:44dd95724bc2 99 #ifdef MBED_CONF_APP_ECHO_SERVER
RobMeades 0:44dd95724bc2 100 # ifndef MBED_CONF_APP_ECHO_UDP_PORT
RobMeades 0:44dd95724bc2 101 # error "MBED_CONF_APP_ECHO_UDP_PORT (the port on which your echo server echoes UDP packets) must be defined"
RobMeades 0:44dd95724bc2 102 # endif
RobMeades 0:44dd95724bc2 103 # ifndef MBED_CONF_APP_ECHO_TCP_PORT
RobMeades 0:44dd95724bc2 104 # error "MBED_CONF_APP_ECHO_TCP_PORT (the port on which your echo server echoes TCP packets) must be defined"
RobMeades 0:44dd95724bc2 105 # endif
RobMeades 0:44dd95724bc2 106 #endif
RobMeades 0:44dd95724bc2 107
RobMeades 0:44dd95724bc2 108 #ifndef MBED_CONF_APP_NTP_SERVER
RobMeades 0:44dd95724bc2 109 # define MBED_CONF_APP_NTP_SERVER "2.pool.ntp.org"
RobMeades 0:44dd95724bc2 110 #else
RobMeades 0:44dd95724bc2 111 # ifndef MBED_CONF_APP_NTP_PORT
RobMeades 0:44dd95724bc2 112 # error "MBED_CONF_APP_NTP_PORT must be defined if MBED_CONF_APP_NTP_SERVER is defined"
RobMeades 0:44dd95724bc2 113 # endif
RobMeades 0:44dd95724bc2 114 #endif
RobMeades 0:44dd95724bc2 115 #ifndef MBED_CONF_APP_NTP_PORT
RobMeades 0:44dd95724bc2 116 # define MBED_CONF_APP_NTP_PORT 123
RobMeades 0:44dd95724bc2 117 #endif
RobMeades 0:44dd95724bc2 118
RobMeades 0:44dd95724bc2 119 #ifndef MBED_CONF_APP_LOCAL_PORT
RobMeades 0:44dd95724bc2 120 # define MBED_CONF_APP_LOCAL_PORT 15
RobMeades 0:44dd95724bc2 121 #endif
RobMeades 0:44dd95724bc2 122
RobMeades 0:44dd95724bc2 123 // UDP packet size limit for testing
RobMeades 0:44dd95724bc2 124 #ifndef MBED_CONF_APP_UDP_MAX_PACKET_SIZE
RobMeades 0:44dd95724bc2 125 # define MBED_CONF_APP_UDP_MAX_PACKET_SIZE 508
RobMeades 0:44dd95724bc2 126 #endif
RobMeades 0:44dd95724bc2 127
RobMeades 0:44dd95724bc2 128 // TCP packet size limit for testing
RobMeades 0:44dd95724bc2 129 #ifndef MBED_CONF_APP_MBED_CONF_APP_TCP_MAX_PACKET_SIZE
RobMeades 0:44dd95724bc2 130 # define MBED_CONF_APP_TCP_MAX_PACKET_SIZE 1500
RobMeades 0:44dd95724bc2 131 #endif
RobMeades 0:44dd95724bc2 132
RobMeades 0:44dd95724bc2 133 // The number of retries for UDP exchanges
RobMeades 0:44dd95724bc2 134 #define NUM_UDP_RETRIES 5
RobMeades 0:44dd95724bc2 135
RobMeades 0:44dd95724bc2 136 // How long to wait for stuff to travel in the async tests
RobMeades 0:44dd95724bc2 137 #define ASYNC_TEST_WAIT_TIME 10000
RobMeades 0:44dd95724bc2 138
RobMeades 0:44dd95724bc2 139 // ----------------------------------------------------------------
RobMeades 0:44dd95724bc2 140 // PRIVATE VARIABLES
RobMeades 0:44dd95724bc2 141 // ----------------------------------------------------------------
RobMeades 0:44dd95724bc2 142
RobMeades 0:44dd95724bc2 143 #ifdef FEATURE_COMMON_PAL
RobMeades 0:44dd95724bc2 144 // Lock for debug prints
RobMeades 0:44dd95724bc2 145 static Mutex mtx;
RobMeades 0:44dd95724bc2 146 #endif
RobMeades 0:44dd95724bc2 147
RobMeades 0:44dd95724bc2 148 // An instance of the cellular interface
RobMeades 0:44dd95724bc2 149 static UbloxPPPCellularInterface *interface = new UbloxPPPCellularInterface(MDMTXD,
RobMeades 0:44dd95724bc2 150 MDMRXD,
RobMeades 0:44dd95724bc2 151 MBED_CONF_UBLOX_CELL_BAUD_RATE,
RobMeades 0:44dd95724bc2 152 MBED_CONF_APP_DEBUG_ON);
RobMeades 0:44dd95724bc2 153
RobMeades 0:44dd95724bc2 154 // Connection flag
RobMeades 0:44dd95724bc2 155 static bool connection_has_gone_down = false;
RobMeades 0:44dd95724bc2 156
RobMeades 0:44dd95724bc2 157 static const char send_data[] = "_____0000:0123456789012345678901234567890123456789"
RobMeades 0:44dd95724bc2 158 "01234567890123456789012345678901234567890123456789"
RobMeades 0:44dd95724bc2 159 "_____0100:0123456789012345678901234567890123456789"
RobMeades 0:44dd95724bc2 160 "01234567890123456789012345678901234567890123456789"
RobMeades 0:44dd95724bc2 161 "_____0200:0123456789012345678901234567890123456789"
RobMeades 0:44dd95724bc2 162 "01234567890123456789012345678901234567890123456789"
RobMeades 0:44dd95724bc2 163 "_____0300:0123456789012345678901234567890123456789"
RobMeades 0:44dd95724bc2 164 "01234567890123456789012345678901234567890123456789"
RobMeades 0:44dd95724bc2 165 "_____0400:0123456789012345678901234567890123456789"
RobMeades 0:44dd95724bc2 166 "01234567890123456789012345678901234567890123456789"
RobMeades 0:44dd95724bc2 167 "_____0500:0123456789012345678901234567890123456789"
RobMeades 0:44dd95724bc2 168 "01234567890123456789012345678901234567890123456789"
RobMeades 0:44dd95724bc2 169 "_____0600:0123456789012345678901234567890123456789"
RobMeades 0:44dd95724bc2 170 "01234567890123456789012345678901234567890123456789"
RobMeades 0:44dd95724bc2 171 "_____0700:0123456789012345678901234567890123456789"
RobMeades 0:44dd95724bc2 172 "01234567890123456789012345678901234567890123456789"
RobMeades 0:44dd95724bc2 173 "_____0800:0123456789012345678901234567890123456789"
RobMeades 0:44dd95724bc2 174 "01234567890123456789012345678901234567890123456789"
RobMeades 0:44dd95724bc2 175 "_____0900:0123456789012345678901234567890123456789"
RobMeades 0:44dd95724bc2 176 "01234567890123456789012345678901234567890123456789"
RobMeades 0:44dd95724bc2 177 "_____1000:0123456789012345678901234567890123456789"
RobMeades 0:44dd95724bc2 178 "01234567890123456789012345678901234567890123456789"
RobMeades 0:44dd95724bc2 179 "_____1100:0123456789012345678901234567890123456789"
RobMeades 0:44dd95724bc2 180 "01234567890123456789012345678901234567890123456789"
RobMeades 0:44dd95724bc2 181 "_____1200:0123456789012345678901234567890123456789"
RobMeades 0:44dd95724bc2 182 "01234567890123456789012345678901234567890123456789"
RobMeades 0:44dd95724bc2 183 "_____1300:0123456789012345678901234567890123456789"
RobMeades 0:44dd95724bc2 184 "01234567890123456789012345678901234567890123456789"
RobMeades 0:44dd95724bc2 185 "_____1400:0123456789012345678901234567890123456789"
RobMeades 0:44dd95724bc2 186 "01234567890123456789012345678901234567890123456789"
RobMeades 0:44dd95724bc2 187 "_____1500:0123456789012345678901234567890123456789"
RobMeades 0:44dd95724bc2 188 "01234567890123456789012345678901234567890123456789"
RobMeades 0:44dd95724bc2 189 "_____1600:0123456789012345678901234567890123456789"
RobMeades 0:44dd95724bc2 190 "01234567890123456789012345678901234567890123456789"
RobMeades 0:44dd95724bc2 191 "_____1700:0123456789012345678901234567890123456789"
RobMeades 0:44dd95724bc2 192 "01234567890123456789012345678901234567890123456789"
RobMeades 0:44dd95724bc2 193 "_____1800:0123456789012345678901234567890123456789"
RobMeades 0:44dd95724bc2 194 "01234567890123456789012345678901234567890123456789"
RobMeades 0:44dd95724bc2 195 "_____1900:0123456789012345678901234567890123456789"
RobMeades 0:44dd95724bc2 196 "01234567890123456789012345678901234567890123456789"
RobMeades 0:44dd95724bc2 197 "_____2000:0123456789012345678901234567890123456789"
RobMeades 0:44dd95724bc2 198 "01234567890123456789012345678901234567890123456789";
RobMeades 0:44dd95724bc2 199
RobMeades 0:44dd95724bc2 200 // ----------------------------------------------------------------
RobMeades 0:44dd95724bc2 201 // PRIVATE FUNCTIONS
RobMeades 0:44dd95724bc2 202 // ----------------------------------------------------------------
RobMeades 0:44dd95724bc2 203
RobMeades 0:44dd95724bc2 204 #ifdef FEATURE_COMMON_PAL
RobMeades 0:44dd95724bc2 205 // Locks for debug prints
RobMeades 0:44dd95724bc2 206 static void lock()
RobMeades 0:44dd95724bc2 207 {
RobMeades 0:44dd95724bc2 208 mtx.lock();
RobMeades 0:44dd95724bc2 209 }
RobMeades 0:44dd95724bc2 210
RobMeades 0:44dd95724bc2 211 static void unlock()
RobMeades 0:44dd95724bc2 212 {
RobMeades 0:44dd95724bc2 213 mtx.unlock();
RobMeades 0:44dd95724bc2 214 }
RobMeades 0:44dd95724bc2 215 #endif
RobMeades 0:44dd95724bc2 216
RobMeades 0:44dd95724bc2 217 // Callback in case the connection goes down
RobMeades 0:44dd95724bc2 218 void connection_down_cb(nsapi_error_t err)
RobMeades 0:44dd95724bc2 219 {
RobMeades 0:44dd95724bc2 220 connection_has_gone_down = true;
RobMeades 0:44dd95724bc2 221 }
RobMeades 0:44dd95724bc2 222
RobMeades 0:44dd95724bc2 223 #ifdef MBED_CONF_APP_ECHO_SERVER
RobMeades 0:44dd95724bc2 224 // Make sure that size is greater than 0 and no more than limit,
RobMeades 0:44dd95724bc2 225 // useful since, when moduloing a very large number number,
RobMeades 0:44dd95724bc2 226 // compilers sometimes screw up and produce a small *negative*
RobMeades 0:44dd95724bc2 227 // number. Who knew? For example, GCC decided that
RobMeades 0:44dd95724bc2 228 // 492318453 (0x1d582ef5) modulo 508 was -47 (0xffffffd1).
RobMeades 0:44dd95724bc2 229 static int fix (int size, int limit)
RobMeades 0:44dd95724bc2 230 {
RobMeades 0:44dd95724bc2 231 if (size <= 0) {
RobMeades 0:44dd95724bc2 232 size = limit / 2; // better than 1
RobMeades 0:44dd95724bc2 233 } else if (size > limit) {
RobMeades 0:44dd95724bc2 234 size = limit;
RobMeades 0:44dd95724bc2 235 }
RobMeades 0:44dd95724bc2 236 return size;
RobMeades 0:44dd95724bc2 237 }
RobMeades 0:44dd95724bc2 238
RobMeades 0:44dd95724bc2 239 // Do a UDP socket echo test to a given host of a given packet size
RobMeades 0:44dd95724bc2 240 static void do_udp_echo(UDPSocket *sock, SocketAddress *host_address, int size)
RobMeades 0:44dd95724bc2 241 {
RobMeades 0:44dd95724bc2 242 bool success = false;
RobMeades 0:44dd95724bc2 243 void * recv_data = malloc (size);
RobMeades 0:44dd95724bc2 244 TEST_ASSERT(recv_data != NULL);
RobMeades 0:44dd95724bc2 245
RobMeades 0:44dd95724bc2 246 // Retry this a few times, don't want to fail due to a flaky link
RobMeades 0:44dd95724bc2 247 for (int x = 0; !success && (x < NUM_UDP_RETRIES); x++) {
RobMeades 0:44dd95724bc2 248 tr_debug("Echo testing UDP packet size %d byte(s), try %d.", size, x + 1);
RobMeades 0:44dd95724bc2 249 if ((sock->sendto(*host_address, (void*) send_data, size) == size) &&
RobMeades 0:44dd95724bc2 250 (sock->recvfrom(host_address, recv_data, size) == size)) {
RobMeades 0:44dd95724bc2 251 TEST_ASSERT (memcmp(send_data, recv_data, size) == 0);
RobMeades 0:44dd95724bc2 252 success = true;
RobMeades 0:44dd95724bc2 253 }
RobMeades 0:44dd95724bc2 254 }
RobMeades 0:44dd95724bc2 255 TEST_ASSERT (success);
RobMeades 0:44dd95724bc2 256 TEST_ASSERT(!connection_has_gone_down);
RobMeades 0:44dd95724bc2 257
RobMeades 0:44dd95724bc2 258 free (recv_data);
RobMeades 0:44dd95724bc2 259 }
RobMeades 0:44dd95724bc2 260
RobMeades 0:44dd95724bc2 261 // Send an entire TCP data buffer until done
RobMeades 0:44dd95724bc2 262 static int sendAll(TCPSocket *sock, const char *data, int size)
RobMeades 0:44dd95724bc2 263 {
RobMeades 0:44dd95724bc2 264 int x;
RobMeades 0:44dd95724bc2 265 int count = 0;
RobMeades 0:44dd95724bc2 266 Timer timer;
RobMeades 0:44dd95724bc2 267
RobMeades 0:44dd95724bc2 268 timer.start();
RobMeades 0:44dd95724bc2 269 while ((count < size) && (timer.read_ms() < ASYNC_TEST_WAIT_TIME)) {
RobMeades 0:44dd95724bc2 270 x = sock->send(data + count, size - count);
RobMeades 0:44dd95724bc2 271 if (x > 0) {
RobMeades 0:44dd95724bc2 272 count += x;
RobMeades 0:44dd95724bc2 273 tr_debug("%d byte(s) sent, %d left to send.", count, size - count);
RobMeades 0:44dd95724bc2 274 }
RobMeades 0:44dd95724bc2 275 wait_ms(10);
RobMeades 0:44dd95724bc2 276 }
RobMeades 0:44dd95724bc2 277 timer.stop();
RobMeades 0:44dd95724bc2 278
RobMeades 0:44dd95724bc2 279 return count;
RobMeades 0:44dd95724bc2 280 }
RobMeades 0:44dd95724bc2 281
RobMeades 0:44dd95724bc2 282 // The asynchronous callback
RobMeades 0:44dd95724bc2 283 static void async_cb(bool *callback_triggered)
RobMeades 0:44dd95724bc2 284 {
RobMeades 0:44dd95724bc2 285
RobMeades 0:44dd95724bc2 286 TEST_ASSERT (callback_triggered != NULL);
RobMeades 0:44dd95724bc2 287 *callback_triggered = true;
RobMeades 0:44dd95724bc2 288 }
RobMeades 0:44dd95724bc2 289
RobMeades 0:44dd95724bc2 290 // Do a TCP echo using the asynchronous interface
RobMeades 0:44dd95724bc2 291 static void do_tcp_echo_async(TCPSocket *sock, int size, bool *callback_triggered)
RobMeades 0:44dd95724bc2 292 {
RobMeades 0:44dd95724bc2 293 void * recv_data = malloc (size);
RobMeades 0:44dd95724bc2 294 int recv_size = 0;
RobMeades 0:44dd95724bc2 295 int x, y;
RobMeades 0:44dd95724bc2 296 Timer timer;
RobMeades 0:44dd95724bc2 297 TEST_ASSERT(recv_data != NULL);
RobMeades 0:44dd95724bc2 298
RobMeades 0:44dd95724bc2 299 *callback_triggered = false;
RobMeades 0:44dd95724bc2 300 tr_debug("Echo testing TCP packet size %d byte(s) async.", size);
RobMeades 0:44dd95724bc2 301 TEST_ASSERT (sendAll(sock, send_data, size) == size);
RobMeades 0:44dd95724bc2 302 // Wait for all the echoed data to arrive
RobMeades 0:44dd95724bc2 303 timer.start();
RobMeades 0:44dd95724bc2 304 while ((recv_size < size) && (timer.read_ms() < ASYNC_TEST_WAIT_TIME)) {
RobMeades 0:44dd95724bc2 305 if (*callback_triggered) {
RobMeades 0:44dd95724bc2 306 *callback_triggered = false;
RobMeades 0:44dd95724bc2 307 x = sock->recv((char *) recv_data + recv_size, size);
RobMeades 0:44dd95724bc2 308 // IMPORTANT: this is different to the version in the AT DATA tests
RobMeades 0:44dd95724bc2 309 // In the AT DATA case we know that the only reason the callback
RobMeades 0:44dd95724bc2 310 // will be triggered is if there is received data. In the case
RobMeades 0:44dd95724bc2 311 // of calling the LWIP implementation other things can also trigger
RobMeades 0:44dd95724bc2 312 // it, so don't rely on there being any bytes to receive.
RobMeades 0:44dd95724bc2 313 if (x > 0) {
RobMeades 0:44dd95724bc2 314 recv_size += x;
RobMeades 0:44dd95724bc2 315 tr_debug("%d byte(s) echoed back so far.", recv_size);
RobMeades 0:44dd95724bc2 316 }
RobMeades 0:44dd95724bc2 317 }
RobMeades 0:44dd95724bc2 318 wait_ms(10);
RobMeades 0:44dd95724bc2 319 }
RobMeades 0:44dd95724bc2 320 TEST_ASSERT(recv_size == size);
RobMeades 0:44dd95724bc2 321 y = memcmp(send_data, recv_data, size);
RobMeades 0:44dd95724bc2 322 if (y != 0) {
RobMeades 0:44dd95724bc2 323 tr_debug("Sent %d, |%*.*s|", size, size, size, send_data);
RobMeades 0:44dd95724bc2 324 tr_debug("Rcvd %d, |%*.*s|", size, size, size, (char *) recv_data);
RobMeades 0:44dd95724bc2 325 TEST_ASSERT(false);
RobMeades 0:44dd95724bc2 326 }
RobMeades 0:44dd95724bc2 327 timer.stop();
RobMeades 0:44dd95724bc2 328
RobMeades 0:44dd95724bc2 329 TEST_ASSERT(!connection_has_gone_down);
RobMeades 0:44dd95724bc2 330
RobMeades 0:44dd95724bc2 331 free (recv_data);
RobMeades 0:44dd95724bc2 332 }
RobMeades 0:44dd95724bc2 333 #endif
RobMeades 0:44dd95724bc2 334
RobMeades 0:44dd95724bc2 335 // Get NTP time
RobMeades 0:44dd95724bc2 336 static void do_ntp(UbloxPPPCellularInterface *interface)
RobMeades 0:44dd95724bc2 337 {
RobMeades 0:44dd95724bc2 338 char ntp_values[48] = { 0 };
RobMeades 0:44dd95724bc2 339 time_t timestamp = 0;
RobMeades 0:44dd95724bc2 340 struct tm *localTime;
RobMeades 0:44dd95724bc2 341 char timeString[25];
RobMeades 0:44dd95724bc2 342 time_t TIME1970 = 2208988800U;
RobMeades 0:44dd95724bc2 343 int len;
rob.meades@u-blox.com 1:80ec3fccad9e 344 UDPSocket sock;
rob.meades@u-blox.com 1:80ec3fccad9e 345 SocketAddress ntp_address;
RobMeades 0:44dd95724bc2 346 bool comms_done = false;
RobMeades 0:44dd95724bc2 347
RobMeades 0:44dd95724bc2 348 ntp_values[0] = '\x1b';
RobMeades 0:44dd95724bc2 349
rob.meades@u-blox.com 1:80ec3fccad9e 350 TEST_ASSERT(sock.open(interface) == 0)
rob.meades@u-blox.com 1:80ec3fccad9e 351
rob.meades@u-blox.com 1:80ec3fccad9e 352 TEST_ASSERT(interface->gethostbyname(MBED_CONF_APP_NTP_SERVER, &ntp_address) == 0);
rob.meades@u-blox.com 1:80ec3fccad9e 353 ntp_address.set_port(MBED_CONF_APP_NTP_PORT);
rob.meades@u-blox.com 1:80ec3fccad9e 354
rob.meades@u-blox.com 1:80ec3fccad9e 355 tr_debug("UDP: NIST server %s address: %s on port %d.", MBED_CONF_APP_NTP_SERVER,
rob.meades@u-blox.com 1:80ec3fccad9e 356 ntp_address.get_ip_address(), ntp_address.get_port());
rob.meades@u-blox.com 1:80ec3fccad9e 357
rob.meades@u-blox.com 1:80ec3fccad9e 358 sock.set_timeout(10000);
rob.meades@u-blox.com 1:80ec3fccad9e 359
RobMeades 0:44dd95724bc2 360 // Retry this a few times, don't want to fail due to a flaky link
RobMeades 0:44dd95724bc2 361 for (unsigned int x = 0; !comms_done && (x < NUM_UDP_RETRIES); x++) {
rob.meades@u-blox.com 1:80ec3fccad9e 362 sock.sendto(ntp_address, (void*) ntp_values, sizeof(ntp_values));
rob.meades@u-blox.com 1:80ec3fccad9e 363 len = sock.recvfrom(&ntp_address, (void*) ntp_values, sizeof(ntp_values));
RobMeades 0:44dd95724bc2 364 if (len > 0) {
RobMeades 0:44dd95724bc2 365 comms_done = true;
RobMeades 0:44dd95724bc2 366 }
RobMeades 0:44dd95724bc2 367 }
RobMeades 0:44dd95724bc2 368 TEST_ASSERT (comms_done);
rob.meades@u-blox.com 1:80ec3fccad9e 369
rob.meades@u-blox.com 1:80ec3fccad9e 370 sock.close();
rob.meades@u-blox.com 1:80ec3fccad9e 371
RobMeades 0:44dd95724bc2 372 tr_debug("UDP: %d byte(s) returned by NTP server.", len);
RobMeades 0:44dd95724bc2 373 if (len >= 43) {
RobMeades 0:44dd95724bc2 374 timestamp |= ((int) *(ntp_values + 40)) << 24;
RobMeades 0:44dd95724bc2 375 timestamp |= ((int) *(ntp_values + 41)) << 16;
RobMeades 0:44dd95724bc2 376 timestamp |= ((int) *(ntp_values + 42)) << 8;
RobMeades 0:44dd95724bc2 377 timestamp |= ((int) *(ntp_values + 43));
RobMeades 0:44dd95724bc2 378 timestamp -= TIME1970;
RobMeades 0:44dd95724bc2 379 srand (timestamp);
RobMeades 0:44dd95724bc2 380 tr_debug("srand() called");
RobMeades 0:44dd95724bc2 381 localTime = localtime(&timestamp);
RobMeades 0:44dd95724bc2 382 if (localTime) {
RobMeades 0:44dd95724bc2 383 if (strftime(timeString, sizeof(timeString), "%a %b %d %H:%M:%S %Y", localTime) > 0) {
RobMeades 0:44dd95724bc2 384 printf("NTP timestamp is %s.\n", timeString);
RobMeades 0:44dd95724bc2 385 }
RobMeades 0:44dd95724bc2 386 }
RobMeades 0:44dd95724bc2 387 }
RobMeades 0:44dd95724bc2 388 }
RobMeades 0:44dd95724bc2 389
RobMeades 0:44dd95724bc2 390 // Use a connection, checking that it is good
RobMeades 0:44dd95724bc2 391 static void use_connection(UbloxPPPCellularInterface *interface)
RobMeades 0:44dd95724bc2 392 {
RobMeades 0:44dd95724bc2 393 const char * ip_address = interface->get_ip_address();
RobMeades 0:44dd95724bc2 394 const char * net_mask = interface->get_netmask();
RobMeades 0:44dd95724bc2 395 const char * gateway = interface->get_gateway();
RobMeades 0:44dd95724bc2 396
RobMeades 0:44dd95724bc2 397 TEST_ASSERT(interface->is_connected());
RobMeades 0:44dd95724bc2 398
RobMeades 0:44dd95724bc2 399 TEST_ASSERT(ip_address != NULL);
RobMeades 0:44dd95724bc2 400 tr_debug ("IP address %s.", ip_address);
RobMeades 0:44dd95724bc2 401 TEST_ASSERT(net_mask != NULL);
RobMeades 0:44dd95724bc2 402 tr_debug ("Net mask %s.", net_mask);
RobMeades 0:44dd95724bc2 403 TEST_ASSERT(gateway != NULL);
RobMeades 0:44dd95724bc2 404 tr_debug ("Gateway %s.", gateway);
RobMeades 0:44dd95724bc2 405
RobMeades 0:44dd95724bc2 406 do_ntp(interface);
RobMeades 0:44dd95724bc2 407 TEST_ASSERT(!connection_has_gone_down);
RobMeades 0:44dd95724bc2 408 }
RobMeades 0:44dd95724bc2 409
RobMeades 0:44dd95724bc2 410 // Drop a connection and check that it has dropped
RobMeades 0:44dd95724bc2 411 static void drop_connection(UbloxPPPCellularInterface *interface)
RobMeades 0:44dd95724bc2 412 {
RobMeades 0:44dd95724bc2 413 TEST_ASSERT(interface->disconnect() == 0);
RobMeades 0:44dd95724bc2 414 TEST_ASSERT(connection_has_gone_down);
RobMeades 0:44dd95724bc2 415 connection_has_gone_down = false;
RobMeades 0:44dd95724bc2 416 TEST_ASSERT(!interface->is_connected());
RobMeades 0:44dd95724bc2 417 }
RobMeades 0:44dd95724bc2 418
RobMeades 0:44dd95724bc2 419 // ----------------------------------------------------------------
RobMeades 0:44dd95724bc2 420 // TESTS
RobMeades 0:44dd95724bc2 421 // ----------------------------------------------------------------
RobMeades 0:44dd95724bc2 422
RobMeades 0:44dd95724bc2 423 // Call srand() using the NTP server
RobMeades 0:44dd95724bc2 424 void test_set_randomise() {
RobMeades 0:44dd95724bc2 425 UDPSocket sock;
RobMeades 0:44dd95724bc2 426 SocketAddress host_address;
RobMeades 0:44dd95724bc2 427
RobMeades 0:44dd95724bc2 428 TEST_ASSERT(interface->connect(MBED_CONF_APP_DEFAULT_PIN, MBED_CONF_APP_APN,
RobMeades 0:44dd95724bc2 429 MBED_CONF_APP_USERNAME, MBED_CONF_APP_PASSWORD) == 0);
RobMeades 0:44dd95724bc2 430 do_ntp(interface);
RobMeades 0:44dd95724bc2 431 TEST_ASSERT(!connection_has_gone_down);
RobMeades 0:44dd95724bc2 432 drop_connection(interface);
RobMeades 0:44dd95724bc2 433 }
RobMeades 0:44dd95724bc2 434
RobMeades 0:44dd95724bc2 435 #ifdef MBED_CONF_APP_ECHO_SERVER
RobMeades 0:44dd95724bc2 436 // Test UDP data exchange
RobMeades 0:44dd95724bc2 437 void test_udp_echo() {
RobMeades 0:44dd95724bc2 438 UDPSocket sock;
RobMeades 0:44dd95724bc2 439 SocketAddress host_address;
RobMeades 0:44dd95724bc2 440 int x;
RobMeades 0:44dd95724bc2 441 int size;
RobMeades 0:44dd95724bc2 442
RobMeades 0:44dd95724bc2 443 interface->deinit();
RobMeades 0:44dd95724bc2 444 TEST_ASSERT(interface->connect(MBED_CONF_APP_DEFAULT_PIN, MBED_CONF_APP_APN,
RobMeades 0:44dd95724bc2 445 MBED_CONF_APP_USERNAME, MBED_CONF_APP_PASSWORD) == 0);
RobMeades 0:44dd95724bc2 446
RobMeades 0:44dd95724bc2 447 TEST_ASSERT(interface->gethostbyname(MBED_CONF_APP_ECHO_SERVER, &host_address) == 0);
RobMeades 0:44dd95724bc2 448 host_address.set_port(MBED_CONF_APP_ECHO_UDP_PORT);
RobMeades 0:44dd95724bc2 449
RobMeades 0:44dd95724bc2 450 tr_debug("UDP: Server %s address: %s on port %d.", MBED_CONF_APP_ECHO_SERVER,
RobMeades 0:44dd95724bc2 451 host_address.get_ip_address(), host_address.get_port());
RobMeades 0:44dd95724bc2 452
RobMeades 0:44dd95724bc2 453 TEST_ASSERT(sock.open(interface) == 0)
RobMeades 0:44dd95724bc2 454
RobMeades 0:44dd95724bc2 455 sock.set_timeout(10000);
RobMeades 0:44dd95724bc2 456
RobMeades 0:44dd95724bc2 457 // Test min, max, and some random sizes in-between
RobMeades 0:44dd95724bc2 458 do_udp_echo(&sock, &host_address, 1);
RobMeades 0:44dd95724bc2 459 do_udp_echo(&sock, &host_address, MBED_CONF_APP_UDP_MAX_PACKET_SIZE);
RobMeades 0:44dd95724bc2 460 for (x = 0; x < 10; x++) {
RobMeades 0:44dd95724bc2 461 size = (rand() % MBED_CONF_APP_UDP_MAX_PACKET_SIZE) + 1;
RobMeades 0:44dd95724bc2 462 size = fix(size, MBED_CONF_APP_UDP_MAX_PACKET_SIZE);
RobMeades 0:44dd95724bc2 463 do_udp_echo(&sock, &host_address, size);
RobMeades 0:44dd95724bc2 464 }
RobMeades 0:44dd95724bc2 465
RobMeades 0:44dd95724bc2 466 sock.close();
RobMeades 0:44dd95724bc2 467
RobMeades 0:44dd95724bc2 468 drop_connection(interface);
RobMeades 0:44dd95724bc2 469
RobMeades 0:44dd95724bc2 470 tr_debug("%d UDP packets of size up to %d byte(s) echoed successfully.", x,
RobMeades 0:44dd95724bc2 471 MBED_CONF_APP_UDP_MAX_PACKET_SIZE);
RobMeades 0:44dd95724bc2 472 }
RobMeades 0:44dd95724bc2 473
RobMeades 0:44dd95724bc2 474 // Test TCP data exchange via the asynchronous sigio() mechanism
RobMeades 0:44dd95724bc2 475 void test_tcp_echo_async() {
RobMeades 0:44dd95724bc2 476 TCPSocket sock;
RobMeades 0:44dd95724bc2 477 SocketAddress host_address;
RobMeades 0:44dd95724bc2 478 bool callback_triggered = false;
RobMeades 0:44dd95724bc2 479 int x;
RobMeades 0:44dd95724bc2 480 int size;
RobMeades 0:44dd95724bc2 481
RobMeades 0:44dd95724bc2 482 interface->deinit();
RobMeades 0:44dd95724bc2 483 TEST_ASSERT(interface->connect(MBED_CONF_APP_DEFAULT_PIN, MBED_CONF_APP_APN, MBED_CONF_APP_USERNAME, MBED_CONF_APP_PASSWORD) == 0);
RobMeades 0:44dd95724bc2 484
RobMeades 0:44dd95724bc2 485 TEST_ASSERT(interface->gethostbyname(MBED_CONF_APP_ECHO_SERVER, &host_address) == 0);
RobMeades 0:44dd95724bc2 486 host_address.set_port(MBED_CONF_APP_ECHO_TCP_PORT);
RobMeades 0:44dd95724bc2 487
RobMeades 0:44dd95724bc2 488 tr_debug("TCP: Server %s address: %s on port %d.", MBED_CONF_APP_ECHO_SERVER,
RobMeades 0:44dd95724bc2 489 host_address.get_ip_address(), host_address.get_port());
RobMeades 0:44dd95724bc2 490
RobMeades 0:44dd95724bc2 491 TEST_ASSERT(sock.open(interface) == 0)
RobMeades 0:44dd95724bc2 492
RobMeades 0:44dd95724bc2 493 // Set up the async callback and set the timeout to zero
RobMeades 0:44dd95724bc2 494 sock.sigio(callback(async_cb, &callback_triggered));
RobMeades 0:44dd95724bc2 495 sock.set_timeout(0);
RobMeades 0:44dd95724bc2 496
RobMeades 0:44dd95724bc2 497 TEST_ASSERT(sock.connect(host_address) == 0);
RobMeades 0:44dd95724bc2 498 // Test min, max, and some random sizes in-between
RobMeades 0:44dd95724bc2 499 do_tcp_echo_async(&sock, 1, &callback_triggered);
RobMeades 0:44dd95724bc2 500 do_tcp_echo_async(&sock, MBED_CONF_APP_TCP_MAX_PACKET_SIZE, &callback_triggered);
RobMeades 0:44dd95724bc2 501 for (x = 0; x < 10; x++) {
RobMeades 0:44dd95724bc2 502 size = (rand() % MBED_CONF_APP_TCP_MAX_PACKET_SIZE) + 1;
RobMeades 0:44dd95724bc2 503 size = fix(size, MBED_CONF_APP_TCP_MAX_PACKET_SIZE);
RobMeades 0:44dd95724bc2 504 do_tcp_echo_async(&sock, size, &callback_triggered);
RobMeades 0:44dd95724bc2 505 }
RobMeades 0:44dd95724bc2 506
RobMeades 0:44dd95724bc2 507 sock.close();
RobMeades 0:44dd95724bc2 508
RobMeades 0:44dd95724bc2 509 drop_connection(interface);
RobMeades 0:44dd95724bc2 510
RobMeades 0:44dd95724bc2 511 tr_debug("%d TCP packets of size up to %d byte(s) echoed asynchronously and successfully.",
RobMeades 0:44dd95724bc2 512 x, MBED_CONF_APP_TCP_MAX_PACKET_SIZE);
RobMeades 0:44dd95724bc2 513 }
RobMeades 0:44dd95724bc2 514 #endif
RobMeades 0:44dd95724bc2 515
RobMeades 0:44dd95724bc2 516 // Connect with credentials included in the connect request
RobMeades 0:44dd95724bc2 517 void test_connect_credentials() {
RobMeades 0:44dd95724bc2 518
RobMeades 0:44dd95724bc2 519 interface->deinit();
RobMeades 0:44dd95724bc2 520 TEST_ASSERT(interface->connect(MBED_CONF_APP_DEFAULT_PIN, MBED_CONF_APP_APN,
RobMeades 0:44dd95724bc2 521 MBED_CONF_APP_USERNAME, MBED_CONF_APP_PASSWORD) == 0);
RobMeades 0:44dd95724bc2 522 use_connection(interface);
RobMeades 0:44dd95724bc2 523 drop_connection(interface);
RobMeades 0:44dd95724bc2 524 }
RobMeades 0:44dd95724bc2 525
RobMeades 0:44dd95724bc2 526 // Test with credentials preset
RobMeades 0:44dd95724bc2 527 void test_connect_preset_credentials() {
RobMeades 0:44dd95724bc2 528
RobMeades 0:44dd95724bc2 529 interface->deinit();
RobMeades 0:44dd95724bc2 530 TEST_ASSERT(interface->init(MBED_CONF_APP_DEFAULT_PIN));
RobMeades 0:44dd95724bc2 531 interface->set_credentials(MBED_CONF_APP_APN, MBED_CONF_APP_USERNAME,
RobMeades 0:44dd95724bc2 532 MBED_CONF_APP_PASSWORD);
RobMeades 0:44dd95724bc2 533 TEST_ASSERT(interface->connect(MBED_CONF_APP_DEFAULT_PIN) == 0);
RobMeades 0:44dd95724bc2 534 use_connection(interface);
RobMeades 0:44dd95724bc2 535 drop_connection(interface);
RobMeades 0:44dd95724bc2 536 }
RobMeades 0:44dd95724bc2 537
RobMeades 0:44dd95724bc2 538 // Test adding and using a SIM pin, then removing it, using the pending
RobMeades 0:44dd95724bc2 539 // mechanism where the change doesn't occur until connect() is called
RobMeades 0:44dd95724bc2 540 void test_check_sim_pin_pending() {
RobMeades 0:44dd95724bc2 541
RobMeades 0:44dd95724bc2 542 interface->deinit();
RobMeades 0:44dd95724bc2 543
RobMeades 0:44dd95724bc2 544 // Enable PIN checking (which will use the current PIN)
RobMeades 0:44dd95724bc2 545 // and also flag that the PIN should be changed to MBED_CONF_APP_ALT_PIN,
RobMeades 0:44dd95724bc2 546 // then try connecting
RobMeades 0:44dd95724bc2 547 interface->sim_pin_check_enable(true);
RobMeades 0:44dd95724bc2 548 interface->change_sim_pin(MBED_CONF_APP_ALT_PIN);
RobMeades 0:44dd95724bc2 549 TEST_ASSERT(interface->connect(MBED_CONF_APP_DEFAULT_PIN, MBED_CONF_APP_APN,
RobMeades 0:44dd95724bc2 550 MBED_CONF_APP_USERNAME, MBED_CONF_APP_PASSWORD) == 0);
RobMeades 0:44dd95724bc2 551 use_connection(interface);
RobMeades 0:44dd95724bc2 552 drop_connection(interface);
RobMeades 0:44dd95724bc2 553 interface->deinit();
RobMeades 0:44dd95724bc2 554
RobMeades 0:44dd95724bc2 555 // Now change the PIN back to what it was before
RobMeades 0:44dd95724bc2 556 interface->change_sim_pin(MBED_CONF_APP_DEFAULT_PIN);
RobMeades 0:44dd95724bc2 557 TEST_ASSERT(interface->connect(MBED_CONF_APP_ALT_PIN, MBED_CONF_APP_APN,
RobMeades 0:44dd95724bc2 558 MBED_CONF_APP_USERNAME, MBED_CONF_APP_PASSWORD) == 0);
RobMeades 0:44dd95724bc2 559 use_connection(interface);
RobMeades 0:44dd95724bc2 560 drop_connection(interface);
RobMeades 0:44dd95724bc2 561 interface->deinit();
RobMeades 0:44dd95724bc2 562
RobMeades 0:44dd95724bc2 563 // Check that it was changed back, and this time
RobMeades 0:44dd95724bc2 564 // use the other way of entering the PIN
RobMeades 0:44dd95724bc2 565 interface->set_sim_pin(MBED_CONF_APP_DEFAULT_PIN);
RobMeades 0:44dd95724bc2 566 TEST_ASSERT(interface->connect(NULL, MBED_CONF_APP_APN, MBED_CONF_APP_USERNAME,
RobMeades 0:44dd95724bc2 567 MBED_CONF_APP_PASSWORD) == 0);
RobMeades 0:44dd95724bc2 568 use_connection(interface);
RobMeades 0:44dd95724bc2 569 drop_connection(interface);
RobMeades 0:44dd95724bc2 570 interface->deinit();
RobMeades 0:44dd95724bc2 571
RobMeades 0:44dd95724bc2 572 // Remove PIN checking again and check that it no
RobMeades 0:44dd95724bc2 573 // longer matters what the PIN is
RobMeades 0:44dd95724bc2 574 interface->sim_pin_check_enable(false);
RobMeades 0:44dd95724bc2 575 TEST_ASSERT(interface->connect(MBED_CONF_APP_DEFAULT_PIN, MBED_CONF_APP_APN,
RobMeades 0:44dd95724bc2 576 MBED_CONF_APP_USERNAME, MBED_CONF_APP_PASSWORD) == 0);
RobMeades 0:44dd95724bc2 577 use_connection(interface);
RobMeades 0:44dd95724bc2 578 drop_connection(interface);
RobMeades 0:44dd95724bc2 579 interface->deinit();
RobMeades 0:44dd95724bc2 580 TEST_ASSERT(interface->init(NULL));
RobMeades 0:44dd95724bc2 581 TEST_ASSERT(interface->connect(MBED_CONF_APP_INCORRECT_PIN, MBED_CONF_APP_APN,
RobMeades 0:44dd95724bc2 582 MBED_CONF_APP_USERNAME, MBED_CONF_APP_PASSWORD) == 0);
RobMeades 0:44dd95724bc2 583 use_connection(interface);
RobMeades 0:44dd95724bc2 584 drop_connection(interface);
RobMeades 0:44dd95724bc2 585
RobMeades 0:44dd95724bc2 586 // Put the SIM pin back to the correct value for any subsequent tests
RobMeades 0:44dd95724bc2 587 interface->set_sim_pin(MBED_CONF_APP_DEFAULT_PIN);
RobMeades 0:44dd95724bc2 588 }
RobMeades 0:44dd95724bc2 589
RobMeades 0:44dd95724bc2 590 // Test adding and using a SIM pin, then removing it, using the immediate
RobMeades 0:44dd95724bc2 591 // mechanism
RobMeades 0:44dd95724bc2 592 void test_check_sim_pin_immediate() {
RobMeades 0:44dd95724bc2 593
RobMeades 0:44dd95724bc2 594 interface->deinit();
RobMeades 0:44dd95724bc2 595 interface->connection_status_cb(callback(connection_down_cb));
RobMeades 0:44dd95724bc2 596
RobMeades 0:44dd95724bc2 597 // Enable PIN checking (which will use the current PIN), change
RobMeades 0:44dd95724bc2 598 // the PIN to MBED_CONF_APP_ALT_PIN, then try connecting after powering on and
RobMeades 0:44dd95724bc2 599 // off the modem
RobMeades 0:44dd95724bc2 600 interface->set_sim_pin_check(true, true, MBED_CONF_APP_DEFAULT_PIN);
RobMeades 0:44dd95724bc2 601 interface->set_new_sim_pin(MBED_CONF_APP_ALT_PIN, true);
RobMeades 0:44dd95724bc2 602 interface->deinit();
RobMeades 0:44dd95724bc2 603 TEST_ASSERT(interface->init(NULL));
RobMeades 0:44dd95724bc2 604 TEST_ASSERT(interface->connect(MBED_CONF_APP_ALT_PIN, MBED_CONF_APP_APN,
RobMeades 0:44dd95724bc2 605 MBED_CONF_APP_USERNAME, MBED_CONF_APP_PASSWORD) == 0);
RobMeades 0:44dd95724bc2 606 use_connection(interface);
RobMeades 0:44dd95724bc2 607 drop_connection(interface);
RobMeades 0:44dd95724bc2 608
RobMeades 0:44dd95724bc2 609 interface->connection_status_cb(callback(connection_down_cb));
RobMeades 0:44dd95724bc2 610
RobMeades 0:44dd95724bc2 611 // Now change the PIN back to what it was before
RobMeades 0:44dd95724bc2 612 interface->set_new_sim_pin(MBED_CONF_APP_DEFAULT_PIN, true);
RobMeades 0:44dd95724bc2 613 interface->deinit();
RobMeades 0:44dd95724bc2 614 interface->set_sim_pin(MBED_CONF_APP_DEFAULT_PIN);
RobMeades 0:44dd95724bc2 615 TEST_ASSERT(interface->init(NULL));
RobMeades 0:44dd95724bc2 616 TEST_ASSERT(interface->connect(NULL, MBED_CONF_APP_APN, MBED_CONF_APP_USERNAME,
RobMeades 0:44dd95724bc2 617 MBED_CONF_APP_PASSWORD) == 0);
RobMeades 0:44dd95724bc2 618 use_connection(interface);
RobMeades 0:44dd95724bc2 619 drop_connection(interface);
RobMeades 0:44dd95724bc2 620
RobMeades 0:44dd95724bc2 621 interface->connection_status_cb(callback(connection_down_cb));
RobMeades 0:44dd95724bc2 622
RobMeades 0:44dd95724bc2 623 // Remove PIN checking again and check that it no
RobMeades 0:44dd95724bc2 624 // longer matters what the PIN is
RobMeades 0:44dd95724bc2 625 interface->set_sim_pin_check(false, true);
RobMeades 0:44dd95724bc2 626 interface->deinit();
RobMeades 0:44dd95724bc2 627 TEST_ASSERT(interface->init(MBED_CONF_APP_INCORRECT_PIN));
RobMeades 0:44dd95724bc2 628 TEST_ASSERT(interface->connect(NULL, MBED_CONF_APP_APN, MBED_CONF_APP_USERNAME,
RobMeades 0:44dd95724bc2 629 MBED_CONF_APP_PASSWORD) == 0);
RobMeades 0:44dd95724bc2 630 use_connection(interface);
RobMeades 0:44dd95724bc2 631 drop_connection(interface);
RobMeades 0:44dd95724bc2 632
RobMeades 0:44dd95724bc2 633 // Put the SIM pin back to the correct value for any subsequent tests
RobMeades 0:44dd95724bc2 634 interface->set_sim_pin(MBED_CONF_APP_DEFAULT_PIN);
RobMeades 0:44dd95724bc2 635 }
RobMeades 0:44dd95724bc2 636
RobMeades 0:44dd95724bc2 637 // Test being able to connect with a local instance of the driver
RobMeades 0:44dd95724bc2 638 // NOTE: since this local instance will fiddle with bits of HW that the
RobMeades 0:44dd95724bc2 639 // static instance thought it owned, the static instance will no longer
RobMeades 0:44dd95724bc2 640 // work afterwards, hence this must be run as the last test in the list
RobMeades 0:44dd95724bc2 641 void test_connect_local_instance_last_test() {
RobMeades 0:44dd95724bc2 642
RobMeades 0:44dd95724bc2 643 UbloxPPPCellularInterface *pLocalInterface = NULL;
RobMeades 0:44dd95724bc2 644
RobMeades 0:44dd95724bc2 645 pLocalInterface = new UbloxPPPCellularInterface(MDMTXD, MDMRXD,
RobMeades 0:44dd95724bc2 646 MBED_CONF_UBLOX_CELL_BAUD_RATE,
RobMeades 0:44dd95724bc2 647 MBED_CONF_APP_DEBUG_ON);
RobMeades 0:44dd95724bc2 648 pLocalInterface->connection_status_cb(callback(connection_down_cb));
RobMeades 0:44dd95724bc2 649
RobMeades 0:44dd95724bc2 650 TEST_ASSERT(pLocalInterface->connect(MBED_CONF_APP_DEFAULT_PIN, MBED_CONF_APP_APN,
RobMeades 0:44dd95724bc2 651 MBED_CONF_APP_USERNAME, MBED_CONF_APP_PASSWORD) == 0);
RobMeades 0:44dd95724bc2 652 use_connection(pLocalInterface);
RobMeades 0:44dd95724bc2 653 drop_connection(pLocalInterface);
RobMeades 0:44dd95724bc2 654 delete pLocalInterface;
RobMeades 0:44dd95724bc2 655
RobMeades 0:44dd95724bc2 656 pLocalInterface = new UbloxPPPCellularInterface(MDMTXD, MDMRXD,
RobMeades 0:44dd95724bc2 657 MBED_CONF_UBLOX_CELL_BAUD_RATE,
RobMeades 0:44dd95724bc2 658 MBED_CONF_APP_DEBUG_ON);
RobMeades 0:44dd95724bc2 659 pLocalInterface->connection_status_cb(callback(connection_down_cb));
RobMeades 0:44dd95724bc2 660
RobMeades 0:44dd95724bc2 661 TEST_ASSERT(pLocalInterface->connect(MBED_CONF_APP_DEFAULT_PIN, MBED_CONF_APP_APN,
RobMeades 0:44dd95724bc2 662 MBED_CONF_APP_USERNAME, MBED_CONF_APP_PASSWORD) == 0);
RobMeades 0:44dd95724bc2 663 use_connection(pLocalInterface);
RobMeades 0:44dd95724bc2 664 drop_connection(pLocalInterface);
RobMeades 0:44dd95724bc2 665 delete pLocalInterface;
RobMeades 0:44dd95724bc2 666 }
RobMeades 0:44dd95724bc2 667
RobMeades 0:44dd95724bc2 668 // ----------------------------------------------------------------
RobMeades 0:44dd95724bc2 669 // TEST ENVIRONMENT
RobMeades 0:44dd95724bc2 670 // ----------------------------------------------------------------
RobMeades 0:44dd95724bc2 671
RobMeades 0:44dd95724bc2 672 // Setup the test environment
RobMeades 0:44dd95724bc2 673 utest::v1::status_t test_setup(const size_t number_of_cases) {
RobMeades 0:44dd95724bc2 674 // Setup Greentea with a timeout
RobMeades 0:44dd95724bc2 675 GREENTEA_SETUP(600, "default_auto");
RobMeades 0:44dd95724bc2 676 return verbose_test_setup_handler(number_of_cases);
RobMeades 0:44dd95724bc2 677 }
RobMeades 0:44dd95724bc2 678
RobMeades 0:44dd95724bc2 679 // IMPORTANT!!! if you make a change to the tests here you should
RobMeades 0:44dd95724bc2 680 // check whether the same change should be made to the tests under
rob.meades@u-blox.com 1:80ec3fccad9e 681 // the AT interface.
RobMeades 0:44dd95724bc2 682
RobMeades 0:44dd95724bc2 683 // Test cases
RobMeades 0:44dd95724bc2 684 Case cases[] = {
RobMeades 0:44dd95724bc2 685 Case("Set randomise", test_set_randomise),
RobMeades 0:44dd95724bc2 686 #ifdef MBED_CONF_APP_ECHO_SERVER
RobMeades 0:44dd95724bc2 687 Case("UDP echo test", test_udp_echo),
RobMeades 0:44dd95724bc2 688 # if MBED_CONF_LWIP_TCP_ENABLED
RobMeades 0:44dd95724bc2 689 Case("TCP async echo test", test_tcp_echo_async),
RobMeades 0:44dd95724bc2 690 # endif
RobMeades 0:44dd95724bc2 691 #endif
RobMeades 0:44dd95724bc2 692 Case("Connect with credentials", test_connect_credentials),
RobMeades 0:44dd95724bc2 693 Case("Connect with preset credentials", test_connect_preset_credentials),
RobMeades 0:44dd95724bc2 694 #if MBED_CONF_APP_RUN_SIM_PIN_CHANGE_TESTS
RobMeades 0:44dd95724bc2 695 Case("Check SIM pin, pending", test_check_sim_pin_pending),
RobMeades 0:44dd95724bc2 696 Case("Check SIM pin, immediate", test_check_sim_pin_immediate),
RobMeades 0:44dd95724bc2 697 #endif
RobMeades 0:44dd95724bc2 698 #ifndef TARGET_UBLOX_C027 // Not enough RAM on little 'ole C027 for this
RobMeades 0:44dd95724bc2 699 Case("Connect using local instance, must be last test", test_connect_local_instance_last_test)
RobMeades 0:44dd95724bc2 700 #endif
RobMeades 0:44dd95724bc2 701 };
RobMeades 0:44dd95724bc2 702
RobMeades 0:44dd95724bc2 703 Specification specification(test_setup, cases);
RobMeades 0:44dd95724bc2 704
RobMeades 0:44dd95724bc2 705 // ----------------------------------------------------------------
RobMeades 0:44dd95724bc2 706 // MAIN
RobMeades 0:44dd95724bc2 707 // ----------------------------------------------------------------
RobMeades 0:44dd95724bc2 708
RobMeades 0:44dd95724bc2 709 int main() {
RobMeades 0:44dd95724bc2 710
RobMeades 0:44dd95724bc2 711 #ifdef FEATURE_COMMON_PAL
RobMeades 0:44dd95724bc2 712 mbed_trace_init();
RobMeades 0:44dd95724bc2 713
RobMeades 0:44dd95724bc2 714 mbed_trace_mutex_wait_function_set(lock);
RobMeades 0:44dd95724bc2 715 mbed_trace_mutex_release_function_set(unlock);
RobMeades 0:44dd95724bc2 716 #endif
RobMeades 0:44dd95724bc2 717
rob.meades@u-blox.com 1:80ec3fccad9e 718 interface->connection_status_cb(callback(connection_down_cb));
rob.meades@u-blox.com 1:80ec3fccad9e 719
RobMeades 0:44dd95724bc2 720 // Run tests
RobMeades 0:44dd95724bc2 721 return !Harness::run(specification);
RobMeades 0:44dd95724bc2 722 }
RobMeades 0:44dd95724bc2 723
RobMeades 0:44dd95724bc2 724 #else
RobMeades 0:44dd95724bc2 725
RobMeades 0:44dd95724bc2 726 // This looks a bit peculiar. These tests should only be compiled if LWIP is included and PPP support is enabled.
RobMeades 0:44dd95724bc2 727 // The way the "mbed test" command, which parses these files, does its filtering is by looking for the pattern:
RobMeades 0:44dd95724bc2 728 //
RobMeades 0:44dd95724bc2 729 // #ifndef THING
RobMeades 0:44dd95724bc2 730 // #error [NOT_SUPPORTED] this test can only be used if THING is defined
RobMeades 0:44dd95724bc2 731 // endif
RobMeades 0:44dd95724bc2 732 //
RobMeades 0:44dd95724bc2 733 // So if THING is not defined, this test will not even be compiled. However, the only compilation switch which
RobMeades 0:44dd95724bc2 734 // is visible here for PPP being enabled or not is NSAPI_PPP_AVAILABLE, which is 0 if PPP is not enabled (the default)
RobMeades 0:44dd95724bc2 735 // or 1 if PPP is enabled. There is NO visible compilation switch which is or isn't _defined_ when PPP is or
RobMeades 0:44dd95724bc2 736 // isn't enabled.
RobMeades 0:44dd95724bc2 737 //
RobMeades 0:44dd95724bc2 738 // Instead, here is a dummy test body which clearly states that these tests are irrelevant 'cos there's no PPP.
RobMeades 0:44dd95724bc2 739
RobMeades 0:44dd95724bc2 740 void dummy() {
RobMeades 0:44dd95724bc2 741 }
RobMeades 0:44dd95724bc2 742 utest::v1::status_t test_setup(const size_t number_of_cases) {
RobMeades 0:44dd95724bc2 743 GREENTEA_SETUP(10, "default_auto");
RobMeades 0:44dd95724bc2 744 return verbose_test_setup_handler(number_of_cases);
RobMeades 0:44dd95724bc2 745 }
RobMeades 0:44dd95724bc2 746 Case cases[] = {
RobMeades 0:44dd95724bc2 747 Case("No PPP, no tests to run", dummy)
RobMeades 0:44dd95724bc2 748 };
RobMeades 0:44dd95724bc2 749 Specification specification(test_setup, cases);
RobMeades 0:44dd95724bc2 750
RobMeades 0:44dd95724bc2 751 int main() {
RobMeades 0:44dd95724bc2 752 return !Harness::run(specification);;
RobMeades 0:44dd95724bc2 753 }
RobMeades 0:44dd95724bc2 754
RobMeades 0:44dd95724bc2 755 #endif
RobMeades 0:44dd95724bc2 756
RobMeades 0:44dd95724bc2 757 // End Of File
RobMeades 0:44dd95724bc2 758