Initial merge-commit of the OIC code. Should successfully do discovery for single...
[platform/upstream/iotivity.git] / csdk / ocsocket / test / arduino / ocsocket_test.cpp
1 //******************************************************************
2 //
3 // copyright 2014 intel corporation all rights reserved.
4 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
5
6 #include <SPI.h>
7 #include <Ethernet.h>
8 #include <ocsocket.h>
9 #include <logger.h>
10
11 //Mac address of my ethernet shield
12 static uint8_t ETHERNET_MAC[] = {0x90, 0xA2, 0xDA, 0x0F, 0x24, 0xCC };
13 //IP address of the peer whom I wish to send some data
14 static uint8_t PEER_IP_ADDR[] = {192, 168, 1, 125};
15 static uint8_t MULTICAST_IP_ADDR[] = {224, 0, 1, 187};
16
17 //Set below to 0 to disable multicast testing
18 //#define MCAST_TESTING_EN 1
19
20 #define TEST_NUM_PKTS (20)
21 #define TEST_PORT_NUM (8888)
22 #define MAX_BUF_SIZE  (256)
23
24 unsigned char TEST_BUF[] = {
25   0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
26   0x00, 0x00, 0x00, 0x00, 0x0b, 0x5f, 0x67, 0x6f,
27   0x6f, 0x67, 0x6c, 0x65, 0x63, 0x61, 0x73, 0x74,
28   0x04, 0x5f, 0x74, 0x63, 0x70, 0x05, 0x6c, 0x6f,
29   0x63, 0x61, 0x6c, 0x00, 0x00, 0x0c, 0x00, 0x01,
30   0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
31   0x00, 0x00, 0x00, 0x00, 0x0b, 0x5f, 0x67, 0x6f,
32   0x6f, 0x67, 0x6c, 0x65, 0x63, 0x61, 0x73, 0x74,
33   0x04, 0x5f, 0x74, 0x63, 0x70, 0x05, 0x6c, 0x6f,
34   0x63, 0x61, 0x6c, 0x00, 0x00, 0x0c, 0x00, 0x01,
35   0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
36   0x00, 0x00, 0x00, 0x00, 0x0b, 0x5f, 0x67, 0x6f,
37   0x6f, 0x67, 0x6c, 0x65, 0x63, 0x61, 0x73, 0x74,
38   0x04, 0x5f, 0x74, 0x63, 0x70, 0x05, 0x6c, 0x6f,
39   0x63, 0x61, 0x6c, 0x00, 0x00, 0x0c, 0x00, 0x01,
40   0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
41   0x00, 0x00, 0x00, 0x00, 0x0b, 0x5f, 0x67, 0x6f,
42   0x6f, 0x67, 0x6c, 0x65, 0x63, 0x61, 0x73, 0x74,
43   0x04, 0x5f, 0x74, 0x63, 0x70, 0x05, 0x6c, 0x6f,
44   0x63, 0x61, 0x6c, 0x00, 0x00, 0x0c, 0x00, 0x01,
45   0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
46   0x00, 0x00, 0x00, 0x00, 0x0b, 0x5f, 0x67, 0x6f,
47   0x6f, 0x67, 0x6c, 0x65, 0x63, 0x61, 0x73, 0x74,
48   0x04, 0x5f, 0x74, 0x63, 0x70, 0x05, 0x6c, 0x6f,
49   0x63, 0x61, 0x6c, 0x00, 0x00, 0x0c, 0x00, 0x01,
50   0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
51   0x00, 0x00, 0x00, 0x00, 0x0b, 0x5f, 0x67, 0x6f,
52   0x6f, 0x67, 0x6c, 0x65, 0x63, 0x61, 0x73, 0x74,
53   0x04, 0x5f, 0x74, 0x63, 0x70, 0x05, 0x6c, 0x6f,
54   0x63, 0x61, 0x6c, 0x00, 0x00, 0x0c, 0x00, 0x01,
55   0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
56   0x00, 0x00, 0x00, 0x00, 0x0b, 0x5f, 0x67, 0x6f,
57   0x6f, 0x67, 0x6c, 0x65, 0x63, 0x61, 0x73, 0x74,
58   0x04, 0x5f, 0x74, 0x63, 0x70, 0x05, 0x6c, 0x6f,
59   0x63, 0x61, 0x6c, 0x00, 0x00, 0x0c, 0x00, 0x01,
60   0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
61   0x00, 0x00, 0x00, 0x00, 0x0b, 0x5f, 0x67, 0x6f,
62   0x6f, 0x67, 0x6c, 0x65, 0x63, 0x61, 0x73, 0x74,
63   0x04, 0x5f, 0x74, 0x63, 0x70, 0x05, 0x6c, 0x6f,
64   0x63, 0x61, 0x6c, 0x00, 0x00, 0x0c, 0x00, 0x01,
65 };
66 unsigned int TEST_BUF_LEN = sizeof(TEST_BUF);
67
68 #define PCF(str) ((const prog_char*)(F(str)))
69
70 #define MOD_NAME PCF("ocsocket_test")
71
72 #define VERIFY_SUCCESS(op, res) { if (op == res) {OC_LOG(DEBUG, MOD_NAME, PCF(#op " SUCCEEDED"));} \
73      else {OC_LOG(FATAL, MOD_NAME, PCF(#op "!!!!  FAILED FAILED FAILED !!!!"));} }
74
75
76 //OCGetInterfaceAddress tests
77 void test10() {
78     char strAddr[16] = "";
79     VERIFY_SUCCESS(OCGetInterfaceAddress(NULL, 0, AF_INET, (uint8_t*)strAddr, 16), ERR_SUCCESS);
80     OC_LOG(DEBUG, MOD_NAME, PCF("My IP address :"));
81     OC_LOG_BUFFER(INFO, MOD_NAME, (uint8_t*)strAddr, sizeof(strAddr));
82     delay(15000);
83     VERIFY_SUCCESS(OCGetInterfaceAddress(NULL, 0, AF_INET, NULL, 16), ERR_INVALID_INPUT);
84     VERIFY_SUCCESS(OCGetInterfaceAddress(NULL, 0, AF_INET, (uint8_t*)strAddr, 10), ERR_INVALID_INPUT);
85     OC_LOG(DEBUG, MOD_NAME, PCF("test10 - Completed"));
86 }
87
88 //OCBuildIPv4Address tests
89 void test20() {
90     OCDevAddr ipAddr;
91     VERIFY_SUCCESS(OCBuildIPv4Address( 0, 0, 0, 0, TEST_PORT_NUM, &ipAddr), ERR_SUCCESS);
92     VERIFY_SUCCESS(OCBuildIPv4Address( 0, 0, 0, 0, TEST_PORT_NUM, NULL), ERR_INVALID_INPUT);
93     OC_LOG(DEBUG, MOD_NAME, PCF("test20 - Completed"));
94 }
95
96
97 void test30() {
98
99     OCDevAddr ipAddr;
100     uint8_t a, b, c, d;
101     uint16_t port;
102     VERIFY_SUCCESS(OCBuildIPv4Address( 1, 2, 3, 4, TEST_PORT_NUM, &ipAddr), ERR_SUCCESS);
103     VERIFY_SUCCESS(OCDevAddrToIPv4Addr( &ipAddr, &a, &b, &c, &d), ERR_SUCCESS);
104     if ((a != 1) || (b != 2) || (c !=3) || (d !=4)) {
105         OC_LOG(DEBUG, MOD_NAME, PCF("test30 - Failed !!!"));
106         return;
107     }
108
109     VERIFY_SUCCESS(OCDevAddrToPort( &ipAddr, &port), ERR_SUCCESS);
110     if (port != TEST_PORT_NUM) {
111         OC_LOG(DEBUG, MOD_NAME, PCF("test30 - Failed !!!"));
112         return;
113     }
114     VERIFY_SUCCESS(OCDevAddrToIPv4Addr( NULL, &a, &b, &c, &d), ERR_INVALID_INPUT);
115     VERIFY_SUCCESS(OCDevAddrToPort( &ipAddr, NULL), ERR_INVALID_INPUT);
116     OC_LOG(DEBUG, MOD_NAME, PCF("test30 - Completed"));
117 }
118
119 //OCInitUDP tests
120 void test40() {
121     OCDevAddr ipAddr;
122     int32_t sfd1, sfd2, sfd3, sfd4, sfd5;
123
124     //We should be able to successfully open 4 sockets.
125     VERIFY_SUCCESS(OCBuildIPv4Address( 0, 0, 0, 0, TEST_PORT_NUM, &ipAddr), ERR_SUCCESS);
126     VERIFY_SUCCESS(OCInitUDP( &ipAddr, &sfd1), ERR_SUCCESS);
127
128     VERIFY_SUCCESS(OCBuildIPv4Address( 0, 0, 0, 0, TEST_PORT_NUM + 1, &ipAddr), ERR_SUCCESS);
129     VERIFY_SUCCESS(OCInitUDP( &ipAddr, &sfd2), ERR_SUCCESS);
130
131     VERIFY_SUCCESS(OCBuildIPv4Address( 0, 0, 0, 0, TEST_PORT_NUM + 2, &ipAddr), ERR_SUCCESS);
132     VERIFY_SUCCESS(OCInitUDP( &ipAddr, &sfd3), ERR_SUCCESS);
133
134     VERIFY_SUCCESS(OCBuildIPv4Address( 0, 0, 0, 0, TEST_PORT_NUM + 3, &ipAddr), ERR_SUCCESS);
135     VERIFY_SUCCESS(OCInitUDP( &ipAddr, &sfd4), ERR_SUCCESS);
136
137     //5th socket creation call should FAIL
138     VERIFY_SUCCESS(OCBuildIPv4Address( 0, 0, 0, 0, TEST_PORT_NUM + 4, &ipAddr), ERR_SUCCESS);
139     VERIFY_SUCCESS(OCInitUDP( &ipAddr, &sfd5), ERR_UNKNOWN);
140
141     VERIFY_SUCCESS(OCClose( sfd4), ERR_SUCCESS);
142     VERIFY_SUCCESS(OCInitUDP( &ipAddr, &sfd5), ERR_SUCCESS);
143
144     VERIFY_SUCCESS(OCClose( sfd1), ERR_SUCCESS);
145     VERIFY_SUCCESS(OCClose( sfd2), ERR_SUCCESS);
146     VERIFY_SUCCESS(OCClose( sfd3), ERR_SUCCESS);
147     VERIFY_SUCCESS(OCClose( sfd5), ERR_SUCCESS);
148     OC_LOG(DEBUG, MOD_NAME, PCF("test40 - Completed"));
149 }
150
151
152 //OCInitUDPMulticast tests
153 void test50() {
154     OCDevAddr ipAddr;
155     int32_t sfd1, sfd2;
156
157     VERIFY_SUCCESS(OCBuildIPv4Address( MULTICAST_IP_ADDR[0], MULTICAST_IP_ADDR[1],
158                 MULTICAST_IP_ADDR[2], MULTICAST_IP_ADDR[3], TEST_PORT_NUM, &ipAddr), ERR_SUCCESS);
159     VERIFY_SUCCESS(OCInitUDPMulticast( &ipAddr, &sfd1), ERR_SUCCESS);
160
161     VERIFY_SUCCESS(OCBuildIPv4Address( 0, 0, 0, 0, TEST_PORT_NUM + 1, &ipAddr), ERR_SUCCESS);
162     VERIFY_SUCCESS(OCInitUDP( &ipAddr, &sfd2), ERR_SUCCESS);
163
164     VERIFY_SUCCESS(OCClose( sfd1), ERR_SUCCESS);
165     VERIFY_SUCCESS(OCClose( sfd2), ERR_SUCCESS);
166     OC_LOG(DEBUG, MOD_NAME, PCF("test50 - Completed"));
167 }
168
169
170 //OCSendTo -- Unicast tests
171 void test60() {
172     OCDevAddr ipAddr, peerAddr;
173     int32_t sfd;
174
175     VERIFY_SUCCESS(OCBuildIPv4Address( 0, 0, 0, 0, TEST_PORT_NUM, &ipAddr), ERR_SUCCESS);
176     VERIFY_SUCCESS(OCBuildIPv4Address(PEER_IP_ADDR[0], PEER_IP_ADDR[0],
177                 PEER_IP_ADDR[0], PEER_IP_ADDR[0], TEST_PORT_NUM, &peerAddr), ERR_SUCCESS);
178
179     VERIFY_SUCCESS(OCInitUDP( &ipAddr, &sfd), ERR_SUCCESS);
180     for (int i = 2; i < 300; ) {
181         VERIFY_SUCCESS(OCSendTo(sfd, TEST_BUF, i, 0, &peerAddr), i);
182         i = i + 12;
183
184         delay(100);
185     }
186     VERIFY_SUCCESS(OCClose( sfd), ERR_SUCCESS);
187     OC_LOG(DEBUG, MOD_NAME, PCF("test60 - Completed"));
188 }
189
190
191 //OCSendTo -- Multicast tests
192 void test70() {
193     OCDevAddr ipAddrMcast;
194     int32_t sfd;
195
196     VERIFY_SUCCESS(OCBuildIPv4Address( MULTICAST_IP_ADDR[0], MULTICAST_IP_ADDR[1],
197                 MULTICAST_IP_ADDR[2], MULTICAST_IP_ADDR[3], TEST_PORT_NUM, &ipAddrMcast), ERR_SUCCESS);
198     VERIFY_SUCCESS(OCInitUDPMulticast( &ipAddrMcast, &sfd), ERR_SUCCESS);
199     for (int i = 2; i < 300; ) {
200         VERIFY_SUCCESS(OCSendTo(sfd, TEST_BUF, i, 0, &ipAddrMcast), i);
201         i = i + 12;
202
203         delay(100);
204     }
205     VERIFY_SUCCESS(OCClose( sfd), ERR_SUCCESS);
206     OC_LOG(DEBUG, MOD_NAME, PCF("test70 - Completed"));
207 }
208
209
210
211 //End to End - Unicast Send/Recv test
212 //Start sample app 'sendrecv' on different Linux box.
213 void test80() {
214     OCDevAddr ipAddr, peerAddr;
215     int32_t sfd;
216     int32_t recvLen;
217     uint8_t buf[MAX_BUF_SIZE];
218     uint8_t pktrecv = 0;
219
220     //Unicast
221     VERIFY_SUCCESS(OCBuildIPv4Address( 0, 0, 0, 0, TEST_PORT_NUM, &ipAddr), ERR_SUCCESS);
222     VERIFY_SUCCESS(OCInitUDP( &ipAddr, &sfd), ERR_SUCCESS);
223
224     do {
225         recvLen = OCRecvFrom(sfd, buf, MAX_BUF_SIZE, 0, &peerAddr);
226         if (recvLen > 0) {
227             pktrecv++;
228             OC_LOG(DEBUG, MOD_NAME, PCF("Rcvd data from :"));
229             OC_LOG_BUFFER(INFO, MOD_NAME, peerAddr.addr, peerAddr.size);
230             OC_LOG(DEBUG, MOD_NAME, PCF("Data Length :"));
231             OC_LOG_BUFFER(INFO, MOD_NAME, (uint8_t*)&recvLen, sizeof(recvLen));
232
233             VERIFY_SUCCESS(OCSendTo(sfd, buf, recvLen, 0, &peerAddr), recvLen);
234         } else {
235             OC_LOG(DEBUG, MOD_NAME, PCF("No data received"));
236         }
237         delay(500); //delay  secs
238     } while (pktrecv < TEST_NUM_PKTS);
239
240     VERIFY_SUCCESS(OCClose(sfd), ERR_SUCCESS);
241     OC_LOG(DEBUG, MOD_NAME, PCF("test80 - Completed"));
242 }
243
244
245 //End to End - Multicast Send/Recv test
246 //Start sample app 'sendrecv' on different Linux box.
247 void test90() {
248     OCDevAddr ipAddrMcast, peerAddr;
249     int32_t sfd;
250     int32_t recvLen;
251     uint8_t buf[MAX_BUF_SIZE];
252     uint8_t pktrecv = 0;
253
254     //Multicast
255     VERIFY_SUCCESS(OCBuildIPv4Address( MULTICAST_IP_ADDR[0], MULTICAST_IP_ADDR[1],
256                 MULTICAST_IP_ADDR[2], MULTICAST_IP_ADDR[3], TEST_PORT_NUM, &ipAddrMcast), ERR_SUCCESS);
257     VERIFY_SUCCESS(OCInitUDPMulticast( &ipAddrMcast, &sfd), ERR_SUCCESS);
258
259     do {
260
261         recvLen = OCRecvFrom(sfd, buf, MAX_BUF_SIZE, 0, &peerAddr);
262         if (recvLen > 0) {
263             pktrecv++;
264             OC_LOG(DEBUG, MOD_NAME, PCF("Rcvd data from :"));
265             OC_LOG_BUFFER(INFO, MOD_NAME, peerAddr.addr, peerAddr.size);
266             OC_LOG(DEBUG, MOD_NAME, PCF("Data Length :"));
267             OC_LOG_BUFFER(INFO, MOD_NAME, (uint8_t*)&recvLen, sizeof(recvLen));
268
269             VERIFY_SUCCESS(OCSendTo(sfd, buf, recvLen, 0, &ipAddrMcast), recvLen);
270         } else {
271             OC_LOG(DEBUG, MOD_NAME, PCF("No data received"));
272         }
273         delay(500); //delay  secs
274     } while (pktrecv < TEST_NUM_PKTS);
275
276     VERIFY_SUCCESS(OCClose(sfd), ERR_SUCCESS);
277     OC_LOG(DEBUG, MOD_NAME, PCF("test90 - Completed"));
278 }
279
280
281
282 //End to End - 'Simultaneous' Unicast-Multicast Send/Recv test
283 //This tests if Arduino Wiznet shield can open 2 independent sockets listening on same port:
284 //  one for unicast traffic and another for multicast traffic.
285 //Start sample app 'sendrecv' on different Linux box.
286 void test100() {
287     //TBD
288     //TBD
289     //TBD
290 }
291
292
293
294
295
296 void setup() {
297
298     Serial.begin(115200);
299
300     Serial.println("Trying to get an IP address using DHCP");
301     if (Ethernet.begin(ETHERNET_MAC) == 0) {
302         Serial.println("Failed to configure Ethernet using DHCP");
303     }
304 }
305
306 void loop() {
307     test10();
308     test20();
309     test30();
310     test40();
311     test50();
312     test60(); //SendTo --Unicast
313     test70(); //SendTo --Multicast
314     test80(); //End-to-End  --Unicast
315     delay(5000);
316     test90(); //End-to-End  --Multicast
317
318     do {
319         OC_LOG(DEBUG, MOD_NAME, PCF("All tests Completed"));
320         delay(10000);
321     } while (1);
322 }
323
324