mayuresh bharmoria / Mbed OS mbed-os-example-wifi
Committer:
mayur098
Date:
Thu Jun 21 17:50:21 2018 +0000
Revision:
0:8f8e8f3cbd1c
first commit;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mayur098 0:8f8e8f3cbd1c 1 #ifndef MBED_EXTENDED_TESTS
mayur098 0:8f8e8f3cbd1c 2 #error [NOT_SUPPORTED] Pressure tests are not supported by default
mayur098 0:8f8e8f3cbd1c 3 #endif
mayur098 0:8f8e8f3cbd1c 4
mayur098 0:8f8e8f3cbd1c 5 #include "mbed.h"
mayur098 0:8f8e8f3cbd1c 6 #include "ESP8266Interface.h"
mayur098 0:8f8e8f3cbd1c 7 #include "TCPSocket.h"
mayur098 0:8f8e8f3cbd1c 8 #include "greentea-client/test_env.h"
mayur098 0:8f8e8f3cbd1c 9 #include "unity/unity.h"
mayur098 0:8f8e8f3cbd1c 10 #include "utest.h"
mayur098 0:8f8e8f3cbd1c 11
mayur098 0:8f8e8f3cbd1c 12 using namespace utest::v1;
mayur098 0:8f8e8f3cbd1c 13
mayur098 0:8f8e8f3cbd1c 14
mayur098 0:8f8e8f3cbd1c 15 #ifndef MBED_CFG_TCP_CLIENT_PACKET_PRESSURE_MIN
mayur098 0:8f8e8f3cbd1c 16 #define MBED_CFG_TCP_CLIENT_PACKET_PRESSURE_MIN 64
mayur098 0:8f8e8f3cbd1c 17 #endif
mayur098 0:8f8e8f3cbd1c 18
mayur098 0:8f8e8f3cbd1c 19 #ifndef MBED_CFG_TCP_CLIENT_PACKET_PRESSURE_MAX
mayur098 0:8f8e8f3cbd1c 20 #define MBED_CFG_TCP_CLIENT_PACKET_PRESSURE_MAX 0x80000
mayur098 0:8f8e8f3cbd1c 21 #endif
mayur098 0:8f8e8f3cbd1c 22
mayur098 0:8f8e8f3cbd1c 23 #ifndef MBED_CFG_TCP_CLIENT_PACKET_PRESSURE_SEED
mayur098 0:8f8e8f3cbd1c 24 #define MBED_CFG_TCP_CLIENT_PACKET_PRESSURE_SEED 0x6d626564
mayur098 0:8f8e8f3cbd1c 25 #endif
mayur098 0:8f8e8f3cbd1c 26
mayur098 0:8f8e8f3cbd1c 27 #ifndef MBED_CFG_TCP_CLIENT_PACKET_PRESSURE_DEBUG
mayur098 0:8f8e8f3cbd1c 28 #define MBED_CFG_TCP_CLIENT_PACKET_PRESSURE_DEBUG false
mayur098 0:8f8e8f3cbd1c 29 #endif
mayur098 0:8f8e8f3cbd1c 30
mayur098 0:8f8e8f3cbd1c 31 #ifndef MBED_CFG_ESP8266_TX
mayur098 0:8f8e8f3cbd1c 32 #define MBED_CFG_ESP8266_TX D1
mayur098 0:8f8e8f3cbd1c 33 #endif
mayur098 0:8f8e8f3cbd1c 34
mayur098 0:8f8e8f3cbd1c 35 #ifndef MBED_CFG_ESP8266_RX
mayur098 0:8f8e8f3cbd1c 36 #define MBED_CFG_ESP8266_RX D0
mayur098 0:8f8e8f3cbd1c 37 #endif
mayur098 0:8f8e8f3cbd1c 38
mayur098 0:8f8e8f3cbd1c 39 #ifndef MBED_CFG_ESP8266_DEBUG
mayur098 0:8f8e8f3cbd1c 40 #define MBED_CFG_ESP8266_DEBUG false
mayur098 0:8f8e8f3cbd1c 41 #endif
mayur098 0:8f8e8f3cbd1c 42
mayur098 0:8f8e8f3cbd1c 43 #define STRINGIZE(x) STRINGIZE2(x)
mayur098 0:8f8e8f3cbd1c 44 #define STRINGIZE2(x) #x
mayur098 0:8f8e8f3cbd1c 45
mayur098 0:8f8e8f3cbd1c 46
mayur098 0:8f8e8f3cbd1c 47 // Simple xorshift pseudorandom number generator
mayur098 0:8f8e8f3cbd1c 48 class RandSeq {
mayur098 0:8f8e8f3cbd1c 49 private:
mayur098 0:8f8e8f3cbd1c 50 uint32_t x;
mayur098 0:8f8e8f3cbd1c 51 uint32_t y;
mayur098 0:8f8e8f3cbd1c 52 static const int A = 15;
mayur098 0:8f8e8f3cbd1c 53 static const int B = 18;
mayur098 0:8f8e8f3cbd1c 54 static const int C = 11;
mayur098 0:8f8e8f3cbd1c 55
mayur098 0:8f8e8f3cbd1c 56 public:
mayur098 0:8f8e8f3cbd1c 57 RandSeq(uint32_t seed=MBED_CFG_TCP_CLIENT_PACKET_PRESSURE_SEED)
mayur098 0:8f8e8f3cbd1c 58 : x(seed), y(seed) {}
mayur098 0:8f8e8f3cbd1c 59
mayur098 0:8f8e8f3cbd1c 60 uint32_t next(void) {
mayur098 0:8f8e8f3cbd1c 61 x ^= x << A;
mayur098 0:8f8e8f3cbd1c 62 x ^= x >> B;
mayur098 0:8f8e8f3cbd1c 63 x ^= y ^ (y >> C);
mayur098 0:8f8e8f3cbd1c 64 return x + y;
mayur098 0:8f8e8f3cbd1c 65 }
mayur098 0:8f8e8f3cbd1c 66
mayur098 0:8f8e8f3cbd1c 67 void skip(size_t size) {
mayur098 0:8f8e8f3cbd1c 68 for (size_t i = 0; i < size; i++) {
mayur098 0:8f8e8f3cbd1c 69 next();
mayur098 0:8f8e8f3cbd1c 70 }
mayur098 0:8f8e8f3cbd1c 71 }
mayur098 0:8f8e8f3cbd1c 72
mayur098 0:8f8e8f3cbd1c 73 void buffer(uint8_t *buffer, size_t size) {
mayur098 0:8f8e8f3cbd1c 74 RandSeq lookahead = *this;
mayur098 0:8f8e8f3cbd1c 75
mayur098 0:8f8e8f3cbd1c 76 for (size_t i = 0; i < size; i++) {
mayur098 0:8f8e8f3cbd1c 77 buffer[i] = lookahead.next() & 0xff;
mayur098 0:8f8e8f3cbd1c 78 }
mayur098 0:8f8e8f3cbd1c 79 }
mayur098 0:8f8e8f3cbd1c 80
mayur098 0:8f8e8f3cbd1c 81 int cmp(uint8_t *buffer, size_t size) {
mayur098 0:8f8e8f3cbd1c 82 RandSeq lookahead = *this;
mayur098 0:8f8e8f3cbd1c 83
mayur098 0:8f8e8f3cbd1c 84 for (size_t i = 0; i < size; i++) {
mayur098 0:8f8e8f3cbd1c 85 int diff = buffer[i] - (lookahead.next() & 0xff);
mayur098 0:8f8e8f3cbd1c 86 if (diff != 0) {
mayur098 0:8f8e8f3cbd1c 87 return diff;
mayur098 0:8f8e8f3cbd1c 88 }
mayur098 0:8f8e8f3cbd1c 89 }
mayur098 0:8f8e8f3cbd1c 90 return 0;
mayur098 0:8f8e8f3cbd1c 91 }
mayur098 0:8f8e8f3cbd1c 92 };
mayur098 0:8f8e8f3cbd1c 93
mayur098 0:8f8e8f3cbd1c 94 // Shared buffer for network transactions
mayur098 0:8f8e8f3cbd1c 95 uint8_t *buffer;
mayur098 0:8f8e8f3cbd1c 96 size_t buffer_size;
mayur098 0:8f8e8f3cbd1c 97
mayur098 0:8f8e8f3cbd1c 98 // Tries to get the biggest buffer possible on the device. Exponentially
mayur098 0:8f8e8f3cbd1c 99 // grows a buffer until heap runs out of space, and uses half to leave
mayur098 0:8f8e8f3cbd1c 100 // space for the rest of the program
mayur098 0:8f8e8f3cbd1c 101 void generate_buffer(uint8_t **buffer, size_t *size, size_t min, size_t max) {
mayur098 0:8f8e8f3cbd1c 102 size_t i = min;
mayur098 0:8f8e8f3cbd1c 103 while (i < max) {
mayur098 0:8f8e8f3cbd1c 104 void *b = malloc(i);
mayur098 0:8f8e8f3cbd1c 105 if (!b) {
mayur098 0:8f8e8f3cbd1c 106 i /= 4;
mayur098 0:8f8e8f3cbd1c 107 if (i < min) {
mayur098 0:8f8e8f3cbd1c 108 i = min;
mayur098 0:8f8e8f3cbd1c 109 }
mayur098 0:8f8e8f3cbd1c 110 break;
mayur098 0:8f8e8f3cbd1c 111 }
mayur098 0:8f8e8f3cbd1c 112 free(b);
mayur098 0:8f8e8f3cbd1c 113 i *= 2;
mayur098 0:8f8e8f3cbd1c 114 }
mayur098 0:8f8e8f3cbd1c 115
mayur098 0:8f8e8f3cbd1c 116 *buffer = (uint8_t *)malloc(i);
mayur098 0:8f8e8f3cbd1c 117 *size = i;
mayur098 0:8f8e8f3cbd1c 118 TEST_ASSERT(buffer);
mayur098 0:8f8e8f3cbd1c 119 }
mayur098 0:8f8e8f3cbd1c 120
mayur098 0:8f8e8f3cbd1c 121
mayur098 0:8f8e8f3cbd1c 122 void test_tcp_packet_pressure() {
mayur098 0:8f8e8f3cbd1c 123 generate_buffer(&buffer, &buffer_size,
mayur098 0:8f8e8f3cbd1c 124 MBED_CFG_TCP_CLIENT_PACKET_PRESSURE_MIN,
mayur098 0:8f8e8f3cbd1c 125 MBED_CFG_TCP_CLIENT_PACKET_PRESSURE_MAX);
mayur098 0:8f8e8f3cbd1c 126 printf("MBED: Generated buffer %d\r\n", buffer_size);
mayur098 0:8f8e8f3cbd1c 127
mayur098 0:8f8e8f3cbd1c 128 ESP8266Interface net(MBED_CFG_ESP8266_TX, MBED_CFG_ESP8266_RX, MBED_CFG_ESP8266_DEBUG);
mayur098 0:8f8e8f3cbd1c 129 int err = net.connect(STRINGIZE(MBED_CFG_ESP8266_SSID), STRINGIZE(MBED_CFG_ESP8266_PASS));
mayur098 0:8f8e8f3cbd1c 130 TEST_ASSERT_EQUAL(0, err);
mayur098 0:8f8e8f3cbd1c 131
mayur098 0:8f8e8f3cbd1c 132 printf("MBED: TCPClient IP address is '%s'\n", net.get_ip_address());
mayur098 0:8f8e8f3cbd1c 133 printf("MBED: TCPClient waiting for server IP and port...\n");
mayur098 0:8f8e8f3cbd1c 134
mayur098 0:8f8e8f3cbd1c 135 greentea_send_kv("target_ip", net.get_ip_address());
mayur098 0:8f8e8f3cbd1c 136
mayur098 0:8f8e8f3cbd1c 137 char recv_key[] = "host_port";
mayur098 0:8f8e8f3cbd1c 138 char ipbuf[60] = {0};
mayur098 0:8f8e8f3cbd1c 139 char portbuf[16] = {0};
mayur098 0:8f8e8f3cbd1c 140 unsigned int port = 0;
mayur098 0:8f8e8f3cbd1c 141
mayur098 0:8f8e8f3cbd1c 142 greentea_send_kv("host_ip", " ");
mayur098 0:8f8e8f3cbd1c 143 greentea_parse_kv(recv_key, ipbuf, sizeof(recv_key), sizeof(ipbuf));
mayur098 0:8f8e8f3cbd1c 144
mayur098 0:8f8e8f3cbd1c 145 greentea_send_kv("host_port", " ");
mayur098 0:8f8e8f3cbd1c 146 greentea_parse_kv(recv_key, portbuf, sizeof(recv_key), sizeof(ipbuf));
mayur098 0:8f8e8f3cbd1c 147 sscanf(portbuf, "%u", &port);
mayur098 0:8f8e8f3cbd1c 148
mayur098 0:8f8e8f3cbd1c 149 printf("MBED: Server IP address received: %s:%d \n", ipbuf, port);
mayur098 0:8f8e8f3cbd1c 150
mayur098 0:8f8e8f3cbd1c 151 TCPSocket sock;
mayur098 0:8f8e8f3cbd1c 152 SocketAddress tcp_addr(ipbuf, port);
mayur098 0:8f8e8f3cbd1c 153
mayur098 0:8f8e8f3cbd1c 154 Timer timer;
mayur098 0:8f8e8f3cbd1c 155 timer.start();
mayur098 0:8f8e8f3cbd1c 156
mayur098 0:8f8e8f3cbd1c 157 // Tests exponentially growing sequences
mayur098 0:8f8e8f3cbd1c 158 for (size_t size = MBED_CFG_TCP_CLIENT_PACKET_PRESSURE_MIN;
mayur098 0:8f8e8f3cbd1c 159 size < MBED_CFG_TCP_CLIENT_PACKET_PRESSURE_MAX;
mayur098 0:8f8e8f3cbd1c 160 size *= 2) {
mayur098 0:8f8e8f3cbd1c 161 err = sock.open(&net);
mayur098 0:8f8e8f3cbd1c 162 TEST_ASSERT_EQUAL(0, err);
mayur098 0:8f8e8f3cbd1c 163 err = sock.connect(tcp_addr);
mayur098 0:8f8e8f3cbd1c 164 TEST_ASSERT_EQUAL(0, err);
mayur098 0:8f8e8f3cbd1c 165 printf("TCP: %s:%d streaming %d bytes\r\n", ipbuf, port, size);
mayur098 0:8f8e8f3cbd1c 166
mayur098 0:8f8e8f3cbd1c 167 sock.set_blocking(false);
mayur098 0:8f8e8f3cbd1c 168
mayur098 0:8f8e8f3cbd1c 169 // Loop to send/recv all data
mayur098 0:8f8e8f3cbd1c 170 RandSeq tx_seq;
mayur098 0:8f8e8f3cbd1c 171 RandSeq rx_seq;
mayur098 0:8f8e8f3cbd1c 172 size_t rx_count = 0;
mayur098 0:8f8e8f3cbd1c 173 size_t tx_count = 0;
mayur098 0:8f8e8f3cbd1c 174 size_t window = buffer_size;
mayur098 0:8f8e8f3cbd1c 175
mayur098 0:8f8e8f3cbd1c 176 while (tx_count < size || rx_count < size) {
mayur098 0:8f8e8f3cbd1c 177 // Send out data
mayur098 0:8f8e8f3cbd1c 178 if (tx_count < size) {
mayur098 0:8f8e8f3cbd1c 179 size_t chunk_size = size - tx_count;
mayur098 0:8f8e8f3cbd1c 180 if (chunk_size > window) {
mayur098 0:8f8e8f3cbd1c 181 chunk_size = window;
mayur098 0:8f8e8f3cbd1c 182 }
mayur098 0:8f8e8f3cbd1c 183
mayur098 0:8f8e8f3cbd1c 184 tx_seq.buffer(buffer, chunk_size);
mayur098 0:8f8e8f3cbd1c 185 int td = sock.send(buffer, chunk_size);
mayur098 0:8f8e8f3cbd1c 186
mayur098 0:8f8e8f3cbd1c 187 if (td > 0) {
mayur098 0:8f8e8f3cbd1c 188 if (MBED_CFG_TCP_CLIENT_PACKET_PRESSURE_DEBUG) {
mayur098 0:8f8e8f3cbd1c 189 printf("TCP: tx -> %d\r\n", td);
mayur098 0:8f8e8f3cbd1c 190 }
mayur098 0:8f8e8f3cbd1c 191 tx_seq.skip(td);
mayur098 0:8f8e8f3cbd1c 192 tx_count += td;
mayur098 0:8f8e8f3cbd1c 193 } else if (td != NSAPI_ERROR_WOULD_BLOCK) {
mayur098 0:8f8e8f3cbd1c 194 // We may fail to send because of buffering issues,
mayur098 0:8f8e8f3cbd1c 195 // cut buffer in half
mayur098 0:8f8e8f3cbd1c 196 if (window > MBED_CFG_TCP_CLIENT_PACKET_PRESSURE_MIN) {
mayur098 0:8f8e8f3cbd1c 197 window /= 2;
mayur098 0:8f8e8f3cbd1c 198 }
mayur098 0:8f8e8f3cbd1c 199
mayur098 0:8f8e8f3cbd1c 200 if (MBED_CFG_TCP_CLIENT_PACKET_PRESSURE_DEBUG) {
mayur098 0:8f8e8f3cbd1c 201 printf("TCP: Not sent (%d), window = %d\r\n", td, window);
mayur098 0:8f8e8f3cbd1c 202 }
mayur098 0:8f8e8f3cbd1c 203 }
mayur098 0:8f8e8f3cbd1c 204 }
mayur098 0:8f8e8f3cbd1c 205
mayur098 0:8f8e8f3cbd1c 206 // Verify recieved data
mayur098 0:8f8e8f3cbd1c 207 while (rx_count < size) {
mayur098 0:8f8e8f3cbd1c 208 int rd = sock.recv(buffer, buffer_size);
mayur098 0:8f8e8f3cbd1c 209 TEST_ASSERT(rd > 0 || rd == NSAPI_ERROR_WOULD_BLOCK);
mayur098 0:8f8e8f3cbd1c 210 if (rd > 0) {
mayur098 0:8f8e8f3cbd1c 211 if (MBED_CFG_TCP_CLIENT_PACKET_PRESSURE_DEBUG) {
mayur098 0:8f8e8f3cbd1c 212 printf("TCP: rx <- %d\r\n", rd);
mayur098 0:8f8e8f3cbd1c 213 }
mayur098 0:8f8e8f3cbd1c 214 int diff = rx_seq.cmp(buffer, rd);
mayur098 0:8f8e8f3cbd1c 215 TEST_ASSERT_EQUAL(0, diff);
mayur098 0:8f8e8f3cbd1c 216 rx_seq.skip(rd);
mayur098 0:8f8e8f3cbd1c 217 rx_count += rd;
mayur098 0:8f8e8f3cbd1c 218 } else if (rd == NSAPI_ERROR_WOULD_BLOCK) {
mayur098 0:8f8e8f3cbd1c 219 break;
mayur098 0:8f8e8f3cbd1c 220 }
mayur098 0:8f8e8f3cbd1c 221 }
mayur098 0:8f8e8f3cbd1c 222 }
mayur098 0:8f8e8f3cbd1c 223
mayur098 0:8f8e8f3cbd1c 224 err = sock.close();
mayur098 0:8f8e8f3cbd1c 225 TEST_ASSERT_EQUAL(0, err);
mayur098 0:8f8e8f3cbd1c 226 }
mayur098 0:8f8e8f3cbd1c 227
mayur098 0:8f8e8f3cbd1c 228 timer.stop();
mayur098 0:8f8e8f3cbd1c 229 printf("MBED: Time taken: %fs\r\n", timer.read());
mayur098 0:8f8e8f3cbd1c 230 printf("MBED: Speed: %.3fkb/s\r\n",
mayur098 0:8f8e8f3cbd1c 231 8*(2*MBED_CFG_TCP_CLIENT_PACKET_PRESSURE_MAX -
mayur098 0:8f8e8f3cbd1c 232 MBED_CFG_TCP_CLIENT_PACKET_PRESSURE_MIN) / (1000*timer.read()));
mayur098 0:8f8e8f3cbd1c 233
mayur098 0:8f8e8f3cbd1c 234 net.disconnect();
mayur098 0:8f8e8f3cbd1c 235 }
mayur098 0:8f8e8f3cbd1c 236
mayur098 0:8f8e8f3cbd1c 237
mayur098 0:8f8e8f3cbd1c 238 // Test setup
mayur098 0:8f8e8f3cbd1c 239 utest::v1::status_t test_setup(const size_t number_of_cases) {
mayur098 0:8f8e8f3cbd1c 240 GREENTEA_SETUP(120, "tcp_echo");
mayur098 0:8f8e8f3cbd1c 241 return verbose_test_setup_handler(number_of_cases);
mayur098 0:8f8e8f3cbd1c 242 }
mayur098 0:8f8e8f3cbd1c 243
mayur098 0:8f8e8f3cbd1c 244 Case cases[] = {
mayur098 0:8f8e8f3cbd1c 245 Case("TCP packet pressure", test_tcp_packet_pressure),
mayur098 0:8f8e8f3cbd1c 246 };
mayur098 0:8f8e8f3cbd1c 247
mayur098 0:8f8e8f3cbd1c 248 Specification specification(test_setup, cases);
mayur098 0:8f8e8f3cbd1c 249
mayur098 0:8f8e8f3cbd1c 250 int main() {
mayur098 0:8f8e8f3cbd1c 251 return !Harness::run(specification);
mayur098 0:8f8e8f3cbd1c 252 }
mayur098 0:8f8e8f3cbd1c 253