Committer:
borlanic
Date:
Tue Apr 24 11:45:18 2018 +0000
Revision:
0:02dd72d1d465
BaBoRo_test2 - backup 1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
borlanic 0:02dd72d1d465 1 /*
borlanic 0:02dd72d1d465 2 * Copyright (c) 2013-2017, ARM Limited, All Rights Reserved
borlanic 0:02dd72d1d465 3 * SPDX-License-Identifier: Apache-2.0
borlanic 0:02dd72d1d465 4 *
borlanic 0:02dd72d1d465 5 * Licensed under the Apache License, Version 2.0 (the "License"); you may
borlanic 0:02dd72d1d465 6 * not use this file except in compliance with the License.
borlanic 0:02dd72d1d465 7 * You may obtain a copy of the License at
borlanic 0:02dd72d1d465 8 *
borlanic 0:02dd72d1d465 9 * http://www.apache.org/licenses/LICENSE-2.0
borlanic 0:02dd72d1d465 10 *
borlanic 0:02dd72d1d465 11 * Unless required by applicable law or agreed to in writing, software
borlanic 0:02dd72d1d465 12 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
borlanic 0:02dd72d1d465 13 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
borlanic 0:02dd72d1d465 14 * See the License for the specific language governing permissions and
borlanic 0:02dd72d1d465 15 * limitations under the License.
borlanic 0:02dd72d1d465 16 */
borlanic 0:02dd72d1d465 17
borlanic 0:02dd72d1d465 18 #ifndef MBED_CONF_APP_CONNECT_STATEMENT
borlanic 0:02dd72d1d465 19 #error [NOT_SUPPORTED] No network configuration found for this target.
borlanic 0:02dd72d1d465 20 #endif
borlanic 0:02dd72d1d465 21
borlanic 0:02dd72d1d465 22 #include <algorithm>
borlanic 0:02dd72d1d465 23 #include "mbed.h"
borlanic 0:02dd72d1d465 24 #include MBED_CONF_APP_HEADER_FILE
borlanic 0:02dd72d1d465 25 #include "TCPSocket.h"
borlanic 0:02dd72d1d465 26 #include "greentea-client/test_env.h"
borlanic 0:02dd72d1d465 27 #include "unity/unity.h"
borlanic 0:02dd72d1d465 28 #include "utest.h"
borlanic 0:02dd72d1d465 29
borlanic 0:02dd72d1d465 30 using namespace utest::v1;
borlanic 0:02dd72d1d465 31
borlanic 0:02dd72d1d465 32 #ifndef MBED_CONF_APP_HTTP_SERVER_NAME
borlanic 0:02dd72d1d465 33 #define MBED_CONF_APP_HTTP_SERVER_NAME "os.mbed.com"
borlanic 0:02dd72d1d465 34 #define MBED_CONF_APP_HTTP_SERVER_FILE_PATH "/media/uploads/mbed_official/hello.txt"
borlanic 0:02dd72d1d465 35 #endif
borlanic 0:02dd72d1d465 36
borlanic 0:02dd72d1d465 37 namespace {
borlanic 0:02dd72d1d465 38 // Test connection information
borlanic 0:02dd72d1d465 39 const int HTTP_SERVER_PORT = 80;
borlanic 0:02dd72d1d465 40 #if defined(TARGET_VK_RZ_A1H)
borlanic 0:02dd72d1d465 41 const int RECV_BUFFER_SIZE = 300;
borlanic 0:02dd72d1d465 42 #else
borlanic 0:02dd72d1d465 43 const int RECV_BUFFER_SIZE = 512;
borlanic 0:02dd72d1d465 44 #endif
borlanic 0:02dd72d1d465 45 // Test related data
borlanic 0:02dd72d1d465 46 const char *HTTP_OK_STR = "200 OK";
borlanic 0:02dd72d1d465 47 const char *HTTP_HELLO_STR = "Hello world!";
borlanic 0:02dd72d1d465 48
borlanic 0:02dd72d1d465 49 // Test buffers
borlanic 0:02dd72d1d465 50 char buffer[RECV_BUFFER_SIZE] = {0};
borlanic 0:02dd72d1d465 51
borlanic 0:02dd72d1d465 52 Semaphore recvd;
borlanic 0:02dd72d1d465 53 NetworkInterface *net;
borlanic 0:02dd72d1d465 54 }
borlanic 0:02dd72d1d465 55
borlanic 0:02dd72d1d465 56 void net_bringup() {
borlanic 0:02dd72d1d465 57 net = MBED_CONF_APP_OBJECT_CONSTRUCTION;
borlanic 0:02dd72d1d465 58 int err = MBED_CONF_APP_CONNECT_STATEMENT;
borlanic 0:02dd72d1d465 59 TEST_ASSERT_EQUAL(0, err);
borlanic 0:02dd72d1d465 60 }
borlanic 0:02dd72d1d465 61
borlanic 0:02dd72d1d465 62 bool find_substring(const char *first, const char *last, const char *s_first, const char *s_last) {
borlanic 0:02dd72d1d465 63 const char *f = std::search(first, last, s_first, s_last);
borlanic 0:02dd72d1d465 64 return (f != last);
borlanic 0:02dd72d1d465 65 }
borlanic 0:02dd72d1d465 66
borlanic 0:02dd72d1d465 67 void get_data(TCPSocket* sock){
borlanic 0:02dd72d1d465 68 bool result = false;
borlanic 0:02dd72d1d465 69 // Server will respond with HTTP GET's success code
borlanic 0:02dd72d1d465 70 int len = 0;
borlanic 0:02dd72d1d465 71 int ret;
borlanic 0:02dd72d1d465 72 while((ret = sock->recv(buffer+len, sizeof(buffer) - 1 - len)) > 0) {
borlanic 0:02dd72d1d465 73 len += ret;
borlanic 0:02dd72d1d465 74 }
borlanic 0:02dd72d1d465 75 buffer[len] = '\0';
borlanic 0:02dd72d1d465 76
borlanic 0:02dd72d1d465 77 // Find 200 OK HTTP status in reply
borlanic 0:02dd72d1d465 78 bool found_200_ok = find_substring(buffer, buffer + len, HTTP_OK_STR, HTTP_OK_STR + strlen(HTTP_OK_STR));
borlanic 0:02dd72d1d465 79 // Find "Hello World!" string in reply
borlanic 0:02dd72d1d465 80 bool found_hello = find_substring(buffer, buffer + len, HTTP_HELLO_STR, HTTP_HELLO_STR + strlen(HTTP_HELLO_STR));
borlanic 0:02dd72d1d465 81
borlanic 0:02dd72d1d465 82 TEST_ASSERT_TRUE(found_200_ok);
borlanic 0:02dd72d1d465 83 TEST_ASSERT_TRUE(found_hello);
borlanic 0:02dd72d1d465 84
borlanic 0:02dd72d1d465 85 if (found_200_ok && found_hello) result = true;
borlanic 0:02dd72d1d465 86
borlanic 0:02dd72d1d465 87 TEST_ASSERT_EQUAL(result, true);
borlanic 0:02dd72d1d465 88
borlanic 0:02dd72d1d465 89 printf("HTTP: Received %d chars from server\r\n", len);
borlanic 0:02dd72d1d465 90 printf("HTTP: Received 200 OK status ... %s\r\n", found_200_ok ? "[OK]" : "[FAIL]");
borlanic 0:02dd72d1d465 91 printf("HTTP: Received '%s' status ... %s\r\n", HTTP_HELLO_STR, found_hello ? "[OK]" : "[FAIL]");
borlanic 0:02dd72d1d465 92 printf("HTTP: Received message:\r\n");
borlanic 0:02dd72d1d465 93 printf("%s", buffer);
borlanic 0:02dd72d1d465 94 // Signal that we have recvd
borlanic 0:02dd72d1d465 95 recvd.release();
borlanic 0:02dd72d1d465 96 }
borlanic 0:02dd72d1d465 97
borlanic 0:02dd72d1d465 98 void prep_buffer() {
borlanic 0:02dd72d1d465 99 memset(buffer, 0, sizeof(buffer));
borlanic 0:02dd72d1d465 100 // We are constructing GET command like this:
borlanic 0:02dd72d1d465 101 // GET http://developer.mbed.org/media/uploads/mbed_official/hello.txt HTTP/1.0\n\n
borlanic 0:02dd72d1d465 102 strcpy(buffer, "GET http://");
borlanic 0:02dd72d1d465 103 strcat(buffer, MBED_CONF_APP_HTTP_SERVER_NAME);
borlanic 0:02dd72d1d465 104 strcat(buffer, MBED_CONF_APP_HTTP_SERVER_FILE_PATH);
borlanic 0:02dd72d1d465 105 strcat(buffer, " HTTP/1.0\n\n");
borlanic 0:02dd72d1d465 106 }
borlanic 0:02dd72d1d465 107
borlanic 0:02dd72d1d465 108 void test_socket_attach() {
borlanic 0:02dd72d1d465 109 bool result = false;
borlanic 0:02dd72d1d465 110
borlanic 0:02dd72d1d465 111 // Dispatch event queue
borlanic 0:02dd72d1d465 112 Thread eventThread;
borlanic 0:02dd72d1d465 113 EventQueue queue(10*EVENTS_EVENT_SIZE);
borlanic 0:02dd72d1d465 114 eventThread.start(callback(&queue, &EventQueue::dispatch_forever));
borlanic 0:02dd72d1d465 115
borlanic 0:02dd72d1d465 116 printf("TCP client IP Address is %s\r\n", net->get_ip_address());
borlanic 0:02dd72d1d465 117
borlanic 0:02dd72d1d465 118 TCPSocket sock(net);
borlanic 0:02dd72d1d465 119 printf("HTTP: Connection to %s:%d\r\n", MBED_CONF_APP_HTTP_SERVER_NAME, HTTP_SERVER_PORT);
borlanic 0:02dd72d1d465 120 if (sock.connect(MBED_CONF_APP_HTTP_SERVER_NAME, HTTP_SERVER_PORT) == 0) {
borlanic 0:02dd72d1d465 121 printf("HTTP: OK\r\n");
borlanic 0:02dd72d1d465 122
borlanic 0:02dd72d1d465 123 prep_buffer();
borlanic 0:02dd72d1d465 124 // Attach a sigio function that adds function to event queue
borlanic 0:02dd72d1d465 125 sock.sigio(queue.event(get_data, &sock));
borlanic 0:02dd72d1d465 126 // Send GET command
borlanic 0:02dd72d1d465 127 sock.send(buffer, strlen(buffer));
borlanic 0:02dd72d1d465 128 // wait for recv data
borlanic 0:02dd72d1d465 129 recvd.wait();
borlanic 0:02dd72d1d465 130
borlanic 0:02dd72d1d465 131 result = true;
borlanic 0:02dd72d1d465 132 } else {
borlanic 0:02dd72d1d465 133 printf("HTTP: ERROR\r\n");
borlanic 0:02dd72d1d465 134 }
borlanic 0:02dd72d1d465 135 sock.close();
borlanic 0:02dd72d1d465 136 TEST_ASSERT_EQUAL(true, result);
borlanic 0:02dd72d1d465 137 }
borlanic 0:02dd72d1d465 138
borlanic 0:02dd72d1d465 139 void cb_fail() {
borlanic 0:02dd72d1d465 140 TEST_ASSERT(false);
borlanic 0:02dd72d1d465 141 }
borlanic 0:02dd72d1d465 142
borlanic 0:02dd72d1d465 143 void cb_pass() {
borlanic 0:02dd72d1d465 144 recvd.release();
borlanic 0:02dd72d1d465 145 }
borlanic 0:02dd72d1d465 146
borlanic 0:02dd72d1d465 147 void test_socket_detach() {
borlanic 0:02dd72d1d465 148 // Dispatch event queue
borlanic 0:02dd72d1d465 149 Thread eventThread;
borlanic 0:02dd72d1d465 150 EventQueue queue(4*EVENTS_EVENT_SIZE);
borlanic 0:02dd72d1d465 151 eventThread.start(callback(&queue, &EventQueue::dispatch_forever));
borlanic 0:02dd72d1d465 152
borlanic 0:02dd72d1d465 153 printf("TCP client IP Address is %s\r\n", net->get_ip_address());
borlanic 0:02dd72d1d465 154
borlanic 0:02dd72d1d465 155 TCPSocket sock(net);
borlanic 0:02dd72d1d465 156 printf("HTTP: Connection to %s:%d\r\n", MBED_CONF_APP_HTTP_SERVER_NAME, HTTP_SERVER_PORT);
borlanic 0:02dd72d1d465 157 if (sock.connect(MBED_CONF_APP_HTTP_SERVER_NAME, HTTP_SERVER_PORT) == 0) {
borlanic 0:02dd72d1d465 158 printf("HTTP: OK\r\n");
borlanic 0:02dd72d1d465 159
borlanic 0:02dd72d1d465 160 prep_buffer();
borlanic 0:02dd72d1d465 161 // Attach a sigio function that adds function to event queue
borlanic 0:02dd72d1d465 162 sock.sigio(queue.event(cb_fail));
borlanic 0:02dd72d1d465 163 // Detach function
borlanic 0:02dd72d1d465 164 sock.sigio(NULL);
borlanic 0:02dd72d1d465 165 // Send GET command
borlanic 0:02dd72d1d465 166 sock.send(buffer, strlen(buffer));
borlanic 0:02dd72d1d465 167 wait(5);
borlanic 0:02dd72d1d465 168 } else {
borlanic 0:02dd72d1d465 169 printf("HTTP: ERROR\r\n");
borlanic 0:02dd72d1d465 170 }
borlanic 0:02dd72d1d465 171 sock.close();
borlanic 0:02dd72d1d465 172 }
borlanic 0:02dd72d1d465 173
borlanic 0:02dd72d1d465 174 void test_socket_reattach() {
borlanic 0:02dd72d1d465 175 // Dispatch event queue
borlanic 0:02dd72d1d465 176 Thread eventThread;
borlanic 0:02dd72d1d465 177 EventQueue queue(4*EVENTS_EVENT_SIZE);
borlanic 0:02dd72d1d465 178 eventThread.start(callback(&queue, &EventQueue::dispatch_forever));
borlanic 0:02dd72d1d465 179
borlanic 0:02dd72d1d465 180 printf("TCP client IP Address is %s\r\n", net->get_ip_address());
borlanic 0:02dd72d1d465 181
borlanic 0:02dd72d1d465 182 TCPSocket sock(net);
borlanic 0:02dd72d1d465 183 printf("HTTP: Connection to %s:%d\r\n", MBED_CONF_APP_HTTP_SERVER_NAME, HTTP_SERVER_PORT);
borlanic 0:02dd72d1d465 184 if (sock.connect(MBED_CONF_APP_HTTP_SERVER_NAME, HTTP_SERVER_PORT) == 0) {
borlanic 0:02dd72d1d465 185 printf("HTTP: OK\r\n");
borlanic 0:02dd72d1d465 186
borlanic 0:02dd72d1d465 187 prep_buffer();
borlanic 0:02dd72d1d465 188 // Attach a sigio function that adds function to event queue
borlanic 0:02dd72d1d465 189 sock.sigio(queue.event(cb_fail));
borlanic 0:02dd72d1d465 190 // Override previous attach
borlanic 0:02dd72d1d465 191 sock.sigio(queue.event(cb_pass));
borlanic 0:02dd72d1d465 192 // Send GET command
borlanic 0:02dd72d1d465 193 sock.send(buffer, strlen(buffer));
borlanic 0:02dd72d1d465 194 recvd.wait();
borlanic 0:02dd72d1d465 195 TEST_ASSERT(true);
borlanic 0:02dd72d1d465 196 } else {
borlanic 0:02dd72d1d465 197 printf("HTTP: ERROR\r\n");
borlanic 0:02dd72d1d465 198 }
borlanic 0:02dd72d1d465 199 sock.close();
borlanic 0:02dd72d1d465 200 }
borlanic 0:02dd72d1d465 201
borlanic 0:02dd72d1d465 202
borlanic 0:02dd72d1d465 203 // Test setup
borlanic 0:02dd72d1d465 204 utest::v1::status_t test_setup(const size_t number_of_cases) {
borlanic 0:02dd72d1d465 205 GREENTEA_SETUP(120, "default_auto");
borlanic 0:02dd72d1d465 206 net_bringup();
borlanic 0:02dd72d1d465 207 return verbose_test_setup_handler(number_of_cases);
borlanic 0:02dd72d1d465 208 }
borlanic 0:02dd72d1d465 209
borlanic 0:02dd72d1d465 210 Case cases[] = {
borlanic 0:02dd72d1d465 211 Case("Socket Attach Test", test_socket_attach),
borlanic 0:02dd72d1d465 212 Case("Socket Detach Test", test_socket_detach),
borlanic 0:02dd72d1d465 213 Case("Socket Reattach Test", test_socket_reattach),
borlanic 0:02dd72d1d465 214 };
borlanic 0:02dd72d1d465 215
borlanic 0:02dd72d1d465 216 Specification specification(test_setup, cases);
borlanic 0:02dd72d1d465 217
borlanic 0:02dd72d1d465 218 int main() {
borlanic 0:02dd72d1d465 219 return !Harness::run(specification);
borlanic 0:02dd72d1d465 220 }