added code to close the netlink socket.
[contrib/iotivity.git] / java / iotivity-android / src / androidTest / java / org / iotivity / base / SmokeTest.java
1 /*
2  *******************************************************************
3  *
4  * Copyright 2015 Intel Corporation.
5  *
6  *-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
7  *
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  *      http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  *
20  *-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
21  */
22
23 package org.iotivity.base;
24
25 import android.test.InstrumentationTestCase;
26 import android.util.Log;
27
28 import java.util.Date;
29 import java.util.EnumSet;
30 import java.util.HashMap;
31 import java.util.LinkedList;
32 import java.util.List;
33 import java.util.Map;
34 import java.util.Random;
35 import java.util.Timer;
36 import java.util.TimerTask;
37 import java.util.concurrent.CountDownLatch;
38 import java.util.concurrent.TimeUnit;
39
40 public class SmokeTest extends InstrumentationTestCase {
41     private static final String TAG = "SmokeTest";
42     private Random rnd = new Random();
43
44     @Override
45     protected void setUp() throws Exception {
46         super.setUp();
47         PlatformConfig cfg = new PlatformConfig(
48                 getInstrumentation().getContext(),
49                 ServiceType.IN_PROC,
50                 ModeType.CLIENT_SERVER,
51                 "0.0.0.0",
52                 0,
53                 QualityOfService.LOW);
54
55         OcPlatform.Configure(cfg);
56     }
57
58     @Override
59     protected void tearDown() throws Exception {
60         super.tearDown();
61     }
62
63     public void testResourceRegisterUnregister() throws InterruptedException {
64         final String resourceType = "unit.test.resource" +
65                 new Date().getTime();
66         final CountDownLatch signal = new CountDownLatch(1);
67
68         OcPlatform.EntityHandler entityHandler = new OcPlatform.EntityHandler() {
69             @Override
70             public EntityHandlerResult handleEntity(OcResourceRequest ocResourceRequest) {
71                 return EntityHandlerResult.OK;
72             }
73         };
74
75         OcPlatform.OnResourceFoundListener resourceFoundListener =
76                 new OcPlatform.OnResourceFoundListener() {
77                     @Override
78                     public void onResourceFound(OcResource resource) {
79                         Log.i(TAG, "Host: " + resource.getHost());
80                         Log.i(TAG, "Server ID: " + resource.getServerId());
81                         Log.i(TAG, "Connectivity Types: ");
82                         for (OcConnectivityType connectivityType : resource.getConnectivityTypeSet()) {
83                             Log.i(TAG, " " + connectivityType);
84                         }
85                         signal.countDown();
86                     }
87                 };
88
89         try {
90             //server
91             OcResourceHandle resourceHandle = OcPlatform.registerResource(
92                     "/a/unittest",
93                     resourceType,
94                     OcPlatform.DEFAULT_INTERFACE,
95                     entityHandler,
96                     EnumSet.of(ResourceProperty.DISCOVERABLE)
97             );
98
99             //client
100             OcPlatform.findResource("",
101                     OcPlatform.WELL_KNOWN_QUERY + "?rt=" + resourceType,
102                     EnumSet.of(OcConnectivityType.CT_DEFAULT),
103                     resourceFoundListener);
104
105             //wait for onResourceFound event
106             assertTrue(signal.await(60, TimeUnit.SECONDS));
107
108             //server
109             OcPlatform.unregisterResource(resourceHandle);
110         } catch (OcException e) {
111             Log.e(TAG, e.getMessage());
112             assertTrue(false);
113         }
114     }
115
116     public void testStartStopListenForPresence() throws InterruptedException {
117         final String resourceType = "unit.test.resource" +
118                 new Date().getTime();
119         final CountDownLatch signal = new CountDownLatch(1);
120
121         OcPlatform.EntityHandler entityHandler = new OcPlatform.EntityHandler() {
122             @Override
123             public EntityHandlerResult handleEntity(OcResourceRequest ocResourceRequest) {
124                 return EntityHandlerResult.OK;
125             }
126         };
127
128         final OcPlatform.OnPresenceListener presenceListener = new OcPlatform.OnPresenceListener() {
129             @Override
130             public void onPresence(OcPresenceStatus ocPresenceStatus, int nonce, String hostAddress) {
131                 Log.i(TAG, "onPresence status " + ocPresenceStatus.toString() + " nonce " + nonce);
132                 signal.countDown();
133             }
134         };
135
136         OcPlatform.OnResourceFoundListener resourceFoundListener =
137                 new OcPlatform.OnResourceFoundListener() {
138                     @Override
139                     public void onResourceFound(OcResource resource) {
140                         try {
141                             //client
142                             OcPresenceHandle presenceHandle = OcPlatform.subscribePresence(
143                                     resource.getHost(),
144                                     EnumSet.of(OcConnectivityType.CT_DEFAULT),
145                                     presenceListener
146                             );
147
148                             //wait for onPresence event
149                             assertTrue(signal.await(60, TimeUnit.SECONDS));
150
151                             //client
152                             OcPlatform.unsubscribePresence(presenceHandle);
153                         } catch (OcException e) {
154                             assertTrue(false);
155                         } catch (InterruptedException e) {
156                             assertTrue(false);
157                         }
158                     }
159                 };
160
161         try {
162             //server
163             OcResourceHandle resourceHandle = OcPlatform.registerResource(
164                     "/a/unittest",
165                     resourceType,
166                     OcPlatform.DEFAULT_INTERFACE,
167                     entityHandler,
168                     EnumSet.of(ResourceProperty.DISCOVERABLE, ResourceProperty.OBSERVABLE)
169             );
170
171             //client
172             OcPlatform.findResource("",
173                     OcPlatform.WELL_KNOWN_QUERY + "?rt=" + resourceType,
174                     EnumSet.of(OcConnectivityType.CT_DEFAULT),
175                     resourceFoundListener);
176
177             //server
178             OcPlatform.startPresence(OcPlatform.DEFAULT_PRESENCE_TTL);
179
180             //wait for onPresence event
181             assertTrue(signal.await(60, TimeUnit.SECONDS));
182
183             //server
184             OcPlatform.stopPresence();
185
186             //client
187             OcPlatform.unregisterResource(resourceHandle);
188
189         } catch (OcException e) {
190             Log.e(TAG, e.getMessage());
191             assertTrue(false);
192         }
193     }
194
195     public void testHandleGetRequest() throws InterruptedException {
196         final String someKey = "SomeKey";
197         final String someValue = "SomeValue";
198         final String resourceType = "unit.test.resource" + new Date().getTime();
199         final CountDownLatch signal1 = new CountDownLatch(1);
200         final CountDownLatch signal2 = new CountDownLatch(1);
201         final List<OcResource> ocResourceList = new LinkedList<OcResource>();
202
203         //client
204         final OcResource.OnGetListener onGetListener = new OcResource.OnGetListener() {
205             @Override
206             public void onGetCompleted(List<OcHeaderOption> headerOptionList, OcRepresentation ocRepresentation) {
207                 if (!headerOptionList.isEmpty()) {
208                     for (OcHeaderOption headerOption : headerOptionList) {
209                         Log.i(TAG, "Header option " +
210                                 headerOption.getOptionId() +
211                                 " : " +
212                                 headerOption.getOptionData());
213                     }
214                 }
215                 try {
216                     Log.i(TAG, "Power: " + ocRepresentation.getValue("power"));
217                 } catch (OcException e) {
218                     Log.e(TAG, e.toString());
219                     assertTrue(false);
220                 }
221                 signal2.countDown();
222             }
223
224             @Override
225             public void onGetFailed(Throwable ex) {
226                 if (ex instanceof OcException) {
227                     OcException ocEx = (OcException) ex;
228                     ErrorCode errCode = ocEx.getErrorCode();
229                     if (ErrorCode.NO_RESOURCE != errCode) {
230                         Log.e(TAG, ocEx.getMessage());
231                         assertTrue(false);
232                     }
233                 } else {
234                     Log.e(TAG, ex.getMessage());
235                     assertTrue(false);
236                 }
237             }
238         };
239
240         //client
241         final OcPlatform.OnResourceFoundListener resourceFoundListener =
242                 new OcPlatform.OnResourceFoundListener() {
243                     @Override
244                     public void onResourceFound(OcResource resource) {
245                         Map<String, String> queryParamsMap = new HashMap<String, String>();
246                         queryParamsMap.put(someKey, someValue);
247
248                         ocResourceList.add(resource);
249                         try {
250                             resource.get(queryParamsMap, onGetListener);
251 //                            TODO there is a bug in the stack that prevents the usage of the following APIs
252 //                            resource.get(resourceType, OcPlatform.DEFAULT_INTERFACE, queryParamsMap,
253 //                                    onGetListener);
254 //
255 //                            resource.get(queryParamsMap, onGetListener, QualityOfService.LOW);
256 //
257 //                            resource.get(resourceType, OcPlatform.DEFAULT_INTERFACE,queryParamsMap,
258 //                                    onGetListener, QualityOfService.LOW);
259                         } catch (OcException e) {
260                             Log.e(TAG, e.toString());
261                             assertTrue(false);
262                         }
263                         signal1.countDown();
264                     }
265                 };
266
267         try {
268             //server
269             OcResourceHandle resourceHandle = OcPlatform.registerResource(
270                     "/a/unittest",
271                     resourceType,
272                     OcPlatform.DEFAULT_INTERFACE,
273                     new OcPlatform.EntityHandler() {
274                         @Override
275                         public EntityHandlerResult handleEntity(OcResourceRequest ocResourceRequest) {
276                             EnumSet<RequestHandlerFlag> handlerFlagSet =
277                                     ocResourceRequest.getRequestHandlerFlagSet();
278
279                             RequestType requestType = ocResourceRequest.getRequestType();
280
281                             if (handlerFlagSet.contains(RequestHandlerFlag.INIT)) {
282                             }
283                             if (handlerFlagSet.contains(RequestHandlerFlag.REQUEST)) {
284                                 OcResourceResponse ocResourceResponse = new OcResourceResponse();
285                                 ocResourceResponse.setRequestHandle(
286                                         ocResourceRequest.getRequestHandle());
287                                 ocResourceResponse.setResourceHandle(
288                                         ocResourceRequest.getResourceHandle());
289
290                                 switch (requestType) {
291                                     case GET:
292                                         Map<String, String> queryParams =
293                                                 ocResourceRequest.getQueryParameters();
294
295                                         if (!(queryParams.containsKey(someKey) &&
296                                                 someValue.equals(queryParams.get(someKey)))) {
297                                             assertTrue(false);
298                                         }
299
300                                         ocResourceResponse.setErrorCode(200);
301                                         ocResourceResponse.setResponseResult(EntityHandlerResult.OK);
302                                         ocResourceResponse.setResourceRepresentation(
303                                                 getRepresentation(74));
304                                         break;
305                                 }
306
307                                 try {
308                                     OcPlatform.sendResponse(ocResourceResponse);
309                                 } catch (OcException e) {
310                                     Log.e(TAG, e.getMessage());
311                                     return EntityHandlerResult.ERROR;
312                                 }
313                             }
314                             if (handlerFlagSet.contains(RequestHandlerFlag.OBSERVER)) {
315                             }
316                             return EntityHandlerResult.OK;
317                         }
318                     },
319                     EnumSet.of(ResourceProperty.DISCOVERABLE)
320             );
321
322             //client
323             OcPlatform.findResource(null,
324                     OcPlatform.WELL_KNOWN_QUERY + "?rt=" + resourceType,
325                     EnumSet.of(OcConnectivityType.CT_DEFAULT),
326                     resourceFoundListener);
327
328             //wait for onResourceFound event
329             assertTrue(signal1.await(60, TimeUnit.SECONDS));
330
331             //wait for onGetCompleted event
332             assertTrue(signal2.await(60, TimeUnit.SECONDS));
333
334             //server
335             OcPlatform.unregisterResource(resourceHandle);
336
337         } catch (OcException e) {
338             Log.e(TAG, e.getMessage());
339             assertTrue(false);
340         }
341     }
342
343     public void testHandlePutRequest() throws InterruptedException {
344         final String resourceType = "unit.test.resource" + new Date().getTime();
345         final CountDownLatch signal1 = new CountDownLatch(1);
346         final CountDownLatch signal2 = new CountDownLatch(3);
347         final List<OcResource> ocResourceList = new LinkedList<OcResource>();
348
349         final OcResource.OnPutListener onPutListener = new OcResource.OnPutListener() {
350             @Override
351             public void onPutCompleted(List<OcHeaderOption> headerOptionList, OcRepresentation ocRepresentation) {
352                 if (!headerOptionList.isEmpty()) {
353                     for (OcHeaderOption headerOption : headerOptionList) {
354                         Log.i(TAG, "Header option " +
355                                 headerOption.getOptionId() +
356                                 " : " +
357                                 headerOption.getOptionData());
358                     }
359                 }
360                 try {
361                     Log.i(TAG, "onPutCompleted Power: " + ocRepresentation.getValue("power"));
362                 } catch (OcException e) {
363                     Log.e(TAG, e.getMessage());
364                     assertTrue(false);
365                 }
366                 Log.i(TAG, "onPutCompleted Uri: " + ocRepresentation.getUri());
367                 signal2.countDown();
368             }
369
370             @Override
371             public void onPutFailed(Throwable ex) {
372                 if (ex instanceof OcException) {
373                     OcException ocEx = (OcException) ex;
374                     ErrorCode errCode = ocEx.getErrorCode();
375                     if (ErrorCode.NO_RESOURCE != errCode) {
376                         Log.e(TAG, ocEx.getMessage());
377                         assertTrue(false);
378                     }
379                 } else {
380                     Log.e(TAG, ex.getMessage());
381                     assertTrue(false);
382                 }
383             }
384         };
385
386         final OcPlatform.OnResourceFoundListener resourceFoundListener =
387                 new OcPlatform.OnResourceFoundListener() {
388                     @Override
389                     public void onResourceFound(OcResource resource) {
390                         ocResourceList.add(resource);
391                         try {
392                             resource.put(
393                                     getRepresentation(),
394                                     new HashMap<String, String>(),
395                                     onPutListener);
396
397                             resource.put(
398                                     getRepresentation(),
399                                     new HashMap<String, String>(),
400                                     onPutListener);
401
402                             resource.put(
403                                     getRepresentation(),
404                                     new HashMap<String, String>(),
405                                     new OcResource.OnPutListener() {
406                                         @Override
407                                         public void onPutCompleted(List<OcHeaderOption> headerOptionList, OcRepresentation ocRepresentation) {
408                                             signal2.countDown();
409                                         }
410
411                                         @Override
412                                         public void onPutFailed(Throwable ex) {
413                                             if (ex instanceof OcException) {
414                                                 OcException ocEx = (OcException) ex;
415                                                 ErrorCode errCode = ocEx.getErrorCode();
416                                                 if (ErrorCode.NO_RESOURCE != errCode) {
417                                                     Log.e(TAG, ocEx.getMessage());
418                                                     assertTrue(false);
419                                                 }
420                                             } else {
421                                                 Log.e(TAG, ex.getMessage());
422                                                 assertTrue(false);
423                                             }
424                                         }
425                                     });
426
427                         } catch (OcException e) {
428                             assertTrue(false);
429                         }
430                         signal1.countDown();
431                     }
432                 };
433
434         try {
435             //server
436             OcResourceHandle resourceHandle = OcPlatform.registerResource(
437                     "/a/unittest",
438                     resourceType,
439                     OcPlatform.DEFAULT_INTERFACE,
440                     new OcPlatform.EntityHandler() {
441                         @Override
442                         public EntityHandlerResult handleEntity(OcResourceRequest ocResourceRequest) {
443                             EnumSet<RequestHandlerFlag> handlerFlagSet = ocResourceRequest.getRequestHandlerFlagSet();
444                             RequestType requestType = ocResourceRequest.getRequestType();
445
446                             if (handlerFlagSet.contains(RequestHandlerFlag.INIT)) {
447                             }
448                             if (handlerFlagSet.contains(RequestHandlerFlag.REQUEST)) {
449                                 OcResourceResponse ocResourceResponse = new OcResourceResponse();
450                                 ocResourceResponse.setRequestHandle(
451                                         ocResourceRequest.getRequestHandle());
452                                 ocResourceResponse.setResourceHandle(
453                                         ocResourceRequest.getResourceHandle());
454
455                                 switch (requestType) {
456                                     case GET:
457                                         assertTrue(false);
458                                         break;
459                                     case PUT:
460                                         OcRepresentation rep = ocResourceRequest.getResourceRepresentation();
461                                         try {
462                                             Log.i(TAG, "Put res. power: " + rep.getValue("power"));
463                                         } catch (OcException e) {
464                                             Log.e(TAG, e.toString());
465                                             assertTrue(false);
466                                         }
467                                         Log.i(TAG, "URI: " + rep.getUri());
468
469                                         ocResourceResponse.setResponseResult(EntityHandlerResult.OK);
470                                         ocResourceResponse.setErrorCode(200);
471                                         ocResourceResponse.setResourceRepresentation(rep);
472                                         break;
473                                     case POST:
474                                         assertTrue(false);
475                                         break;
476                                     case DELETE:
477                                         break;
478                                 }
479
480                                 try {
481                                     OcPlatform.sendResponse(ocResourceResponse);
482                                 } catch (OcException e) {
483                                     Log.e(TAG, e.getMessage());
484                                     return EntityHandlerResult.ERROR;
485                                 }
486                             }
487                             if (handlerFlagSet.contains(RequestHandlerFlag.OBSERVER)) {
488                             }
489                             return EntityHandlerResult.OK;
490                         }
491                     },
492                     EnumSet.of(ResourceProperty.DISCOVERABLE)
493             );
494
495             //client
496             OcPlatform.findResource("",
497                     OcPlatform.WELL_KNOWN_QUERY + "?rt=" + resourceType,
498                     EnumSet.of(OcConnectivityType.CT_DEFAULT),
499                     resourceFoundListener);
500
501             //wait for onResourceFound event
502             assertTrue(signal1.await(60, TimeUnit.SECONDS));
503
504             //wait for onGetCompleted event
505             assertTrue(signal2.await(60, TimeUnit.SECONDS));
506
507             //server
508             OcPlatform.unregisterResource(resourceHandle);
509
510         } catch (OcException e) {
511             Log.e(TAG, e.getMessage());
512             assertTrue(false);
513         }
514     }
515
516     public void testHandlePostRequest() throws InterruptedException {
517         final String resourceType = "unit.test.resource" + new Date().getTime();
518         final CountDownLatch signal1 = new CountDownLatch(1);
519         final CountDownLatch signal2 = new CountDownLatch(3);
520         final List<OcResource> ocResourceList = new LinkedList<OcResource>();
521
522         final OcResource.OnPostListener onPostListener = new OcResource.OnPostListener() {
523             @Override
524             public void onPostCompleted(List<OcHeaderOption> headerOptionList, OcRepresentation ocRepresentation) {
525                 if (!headerOptionList.isEmpty()) {
526                     for (OcHeaderOption headerOption : headerOptionList) {
527                         Log.i(TAG, "Header option " +
528                                 headerOption.getOptionId() +
529                                 " : " +
530                                 headerOption.getOptionData());
531                     }
532                 }
533                 try {
534                     Log.i(TAG, "onPostCompleted Power: " + ocRepresentation.getValue("power"));
535                 } catch (OcException e) {
536                     Log.e(TAG, e.toString());
537                     assertTrue(false);
538                 }
539                 Log.i(TAG, "onPostCompleted Uri: " + ocRepresentation.getUri());
540                 signal2.countDown();
541             }
542
543             @Override
544             public void onPostFailed(Throwable ex) {
545                 if (ex instanceof OcException) {
546                     OcException ocEx = (OcException) ex;
547                     ErrorCode errCode = ocEx.getErrorCode();
548                     if (ErrorCode.NO_RESOURCE != errCode) {
549                         Log.e(TAG, ocEx.getMessage());
550                         assertTrue(false);
551                     }
552                 } else {
553                     Log.e(TAG, ex.getMessage());
554                     assertTrue(false);
555                 }
556             }
557         };
558
559         final OcPlatform.OnResourceFoundListener resourceFoundListener =
560                 new OcPlatform.OnResourceFoundListener() {
561                     @Override
562                     public void onResourceFound(OcResource resource) {
563                         ocResourceList.add(resource);
564                         try {
565                             resource.post(
566                                     getRepresentation(),
567                                     new HashMap<String, String>(),
568                                     onPostListener);
569
570                             resource.post(
571                                     getRepresentation(),
572                                     new HashMap<String, String>(),
573                                     onPostListener);
574
575                             resource.post(
576                                     getRepresentation(),
577                                     new HashMap<String, String>(),
578                                     new OcResource.OnPostListener() {
579                                         @Override
580                                         public void onPostCompleted(List<OcHeaderOption> headerOptionList, OcRepresentation ocRepresentation) {
581                                             signal2.countDown();
582                                         }
583
584                                         @Override
585                                         public void onPostFailed(Throwable ex) {
586                                             if (ex instanceof OcException) {
587                                                 OcException ocEx = (OcException) ex;
588                                                 ErrorCode errCode = ocEx.getErrorCode();
589                                                 if (ErrorCode.NO_RESOURCE != errCode) {
590                                                     Log.e(TAG, ocEx.getMessage());
591                                                     assertTrue(false);
592                                                 }
593                                             } else {
594                                                 Log.e(TAG, ex.getMessage());
595                                                 assertTrue(false);
596                                             }
597                                         }
598                                     });
599
600                         } catch (OcException e) {
601                             assertTrue(false);
602                         }
603                         signal1.countDown();
604                     }
605                 };
606
607         try {
608             //server
609             OcResourceHandle resourceHandle = OcPlatform.registerResource(
610                     "/a/unittest",
611                     resourceType,
612                     OcPlatform.DEFAULT_INTERFACE,
613                     new OcPlatform.EntityHandler() {
614                         @Override
615                         public EntityHandlerResult handleEntity(OcResourceRequest ocResourceRequest) {
616                             EnumSet<RequestHandlerFlag> handlerFlagSet = ocResourceRequest.getRequestHandlerFlagSet();
617                             RequestType requestType = ocResourceRequest.getRequestType();
618
619                             if (handlerFlagSet.contains(RequestHandlerFlag.INIT)) {
620                             }
621                             if (handlerFlagSet.contains(RequestHandlerFlag.REQUEST)) {
622                                 OcResourceResponse ocResourceResponse = new OcResourceResponse();
623                                 ocResourceResponse.setRequestHandle(
624                                         ocResourceRequest.getRequestHandle());
625                                 ocResourceResponse.setResourceHandle(
626                                         ocResourceRequest.getResourceHandle());
627
628                                 switch (requestType) {
629                                     case GET:
630                                         assertTrue(false);
631                                         break;
632                                     case PUT:
633                                         assertTrue(false);
634                                         break;
635                                     case POST:
636                                         OcRepresentation rep = ocResourceRequest.getResourceRepresentation();
637                                         try {
638                                             Log.i(TAG, "Post res. power: " + rep.getValue("power"));
639                                         } catch (OcException e) {
640                                             Log.e(TAG, e.toString());
641                                             assertTrue(false);
642                                         }
643                                         Log.i(TAG, "URI: " + rep.getUri());
644
645                                         ocResourceResponse.setErrorCode(200);
646                                         ocResourceResponse.setResponseResult(EntityHandlerResult.OK);
647                                         ocResourceResponse.setResourceRepresentation(
648                                                 getRepresentation(44));
649
650                                         break;
651                                     case DELETE:
652                                         assertTrue(false);
653                                         break;
654                                 }
655
656                                 try {
657                                     OcPlatform.sendResponse(ocResourceResponse);
658                                 } catch (OcException e) {
659                                     Log.e(TAG, e.getMessage());
660                                     return EntityHandlerResult.ERROR;
661                                 }
662                             }
663                             if (handlerFlagSet.contains(RequestHandlerFlag.OBSERVER)) {
664                             }
665                             return EntityHandlerResult.OK;
666                         }
667                     },
668                     EnumSet.of(ResourceProperty.DISCOVERABLE)
669             );
670
671             //client
672             OcPlatform.findResource("",
673                     OcPlatform.WELL_KNOWN_QUERY + "?rt=" + resourceType,
674                     EnumSet.of(OcConnectivityType.CT_DEFAULT),
675                     resourceFoundListener);
676
677             //wait for onResourceFound event
678             assertTrue(signal1.await(60, TimeUnit.SECONDS));
679
680             //wait for onPostCompleted event
681             assertTrue(signal2.await(60, TimeUnit.SECONDS));
682
683             //server
684             OcPlatform.unregisterResource(resourceHandle);
685
686         } catch (OcException e) {
687             Log.e(TAG, e.getMessage());
688             assertTrue(false);
689         }
690
691     }
692
693     public void testHandleDeleteRequest() throws InterruptedException {
694         final String resourceType = "unit.test.resource" + new Date().getTime();
695         final CountDownLatch signal1 = new CountDownLatch(1);
696         final CountDownLatch signal2 = new CountDownLatch(1);
697         final List<OcResource> ocResourceList = new LinkedList<OcResource>();
698
699         final OcResource.OnDeleteListener onDeleteListener = new OcResource.OnDeleteListener() {
700             @Override
701             public void onDeleteCompleted(List<OcHeaderOption> headerOptionList) {
702                 signal2.countDown();
703             }
704
705             @Override
706             public void onDeleteFailed(Throwable ex) {
707                 if (ex instanceof OcException) {
708                     OcException ocEx = (OcException) ex;
709                     ErrorCode errCode = ocEx.getErrorCode();
710                     if (ErrorCode.NO_RESOURCE != errCode) {
711                         Log.e(TAG, ocEx.getMessage());
712                         assertTrue(false);
713                     }
714                 } else {
715                     Log.e(TAG, ex.getMessage());
716                     assertTrue(false);
717                 }
718             }
719         };
720
721         final OcPlatform.OnResourceFoundListener resourceFoundListener =
722                 new OcPlatform.OnResourceFoundListener() {
723                     @Override
724                     public void onResourceFound(OcResource resource) {
725                         ocResourceList.add(resource);
726                         try {
727                             resource.deleteResource(onDeleteListener);
728                         } catch (OcException e) {
729                             assertTrue(false);
730                         }
731                         signal1.countDown();
732                     }
733                 };
734
735         try {
736             //server
737             OcResourceHandle resourceHandle = OcPlatform.registerResource(
738                     "/a/unittest",
739                     resourceType,
740                     OcPlatform.DEFAULT_INTERFACE,
741                     new OcPlatform.EntityHandler() {
742                         @Override
743                         public EntityHandlerResult handleEntity(OcResourceRequest ocResourceRequest) {
744                             EnumSet<RequestHandlerFlag> handlerFlagSet =
745                                     ocResourceRequest.getRequestHandlerFlagSet();
746                             RequestType requestType = ocResourceRequest.getRequestType();
747
748                             if (handlerFlagSet.contains(RequestHandlerFlag.INIT)) {
749                             }
750                             if (handlerFlagSet.contains(RequestHandlerFlag.REQUEST)) {
751                                 OcResourceResponse ocResourceResponse = new OcResourceResponse();
752                                 ocResourceResponse.setRequestHandle(
753                                         ocResourceRequest.getRequestHandle());
754                                 ocResourceResponse.setResourceHandle(
755                                         ocResourceRequest.getResourceHandle());
756
757                                 switch (requestType) {
758                                     case DELETE:
759                                         ocResourceResponse.setErrorCode(200);
760                                         ocResourceResponse.setResponseResult(
761                                                 EntityHandlerResult.RESOURCE_DELETED);
762                                         break;
763                                 }
764
765                                 try {
766                                     OcPlatform.sendResponse(ocResourceResponse);
767                                 } catch (OcException e) {
768                                     Log.e(TAG, e.getMessage());
769                                     return EntityHandlerResult.ERROR;
770                                 }
771                             }
772                             if (handlerFlagSet.contains(RequestHandlerFlag.OBSERVER)) {
773                             }
774                             return EntityHandlerResult.OK;
775                         }
776                     },
777                     EnumSet.of(ResourceProperty.DISCOVERABLE)
778             );
779
780             //client
781             OcPlatform.findResource("",
782                     OcPlatform.WELL_KNOWN_QUERY + "?rt=" + resourceType,
783                     EnumSet.of(OcConnectivityType.CT_DEFAULT),
784                     resourceFoundListener);
785
786             //wait for onResourceFound event
787             assertTrue(signal1.await(60, TimeUnit.SECONDS));
788
789             //wait for onDeleteCompleted event
790             assertTrue(signal2.await(60, TimeUnit.SECONDS));
791
792             //server
793             OcPlatform.unregisterResource(resourceHandle);
794
795         } catch (OcException e) {
796             Log.e(TAG, e.getMessage());
797             assertTrue(false);
798         }
799     }
800
801     public void testHandleGetPutPostDeleteFailures() throws InterruptedException {
802         final String resourceType = "unit.test.resource" + new Date().getTime();
803         final CountDownLatch signal1 = new CountDownLatch(1);
804         final CountDownLatch signal2 = new CountDownLatch(1);
805         final CountDownLatch signal3 = new CountDownLatch(1);
806         final CountDownLatch signal4 = new CountDownLatch(1);
807         final CountDownLatch signal5 = new CountDownLatch(1);
808
809         final List<OcResource> ocResourceList = new LinkedList<OcResource>();
810         final OcResource.OnGetListener onGetListener = new OcResource.OnGetListener() {
811             @Override
812             public void onGetCompleted(List<OcHeaderOption> headerOptionList,
813                                        OcRepresentation ocRepresentation) {
814                 assertTrue(false);
815             }
816
817             @Override
818             public void onGetFailed(Throwable ex) {
819                 if (ex instanceof OcException) {
820                     OcException ocEx = (OcException) ex;
821                     ErrorCode errCode = ocEx.getErrorCode();
822                 }
823                 Log.i(TAG, ex.toString());
824                 signal2.countDown();
825             }
826         };
827
828         final OcResource.OnPutListener onPutListener = new OcResource.OnPutListener() {
829             @Override
830             public void onPutCompleted(List<OcHeaderOption> headerOptionList,
831                                        OcRepresentation ocRepresentation) {
832                 assertTrue(false);
833             }
834
835             @Override
836             public void onPutFailed(Throwable ex) {
837                 if (ex instanceof OcException) {
838                     OcException ocEx = (OcException) ex;
839                     ErrorCode errCode = ocEx.getErrorCode();
840                 }
841                 Log.i(TAG, ex.toString());
842                 signal3.countDown();
843             }
844         };
845         final OcResource.OnPostListener onPostListener = new OcResource.OnPostListener() {
846             @Override
847             public void onPostCompleted(List<OcHeaderOption> headerOptionList,
848                                         OcRepresentation ocRepresentation) {
849                 assertTrue(false);
850             }
851
852             @Override
853             public void onPostFailed(Throwable ex) {
854                 if (ex instanceof OcException) {
855                     OcException ocEx = (OcException) ex;
856                     ErrorCode errCode = ocEx.getErrorCode();
857                 }
858                 Log.i(TAG, ex.toString());
859                 signal4.countDown();
860             }
861         };
862
863         final OcResource.OnDeleteListener onDeleteListener = new OcResource.OnDeleteListener() {
864             @Override
865             public void onDeleteCompleted(List<OcHeaderOption> headerOptionList) {
866                 assertTrue(false);
867             }
868
869             @Override
870             public void onDeleteFailed(Throwable ex) {
871                 if (ex instanceof OcException) {
872                     OcException ocEx = (OcException) ex;
873                     ErrorCode errCode = ocEx.getErrorCode();
874                 }
875                 Log.i(TAG, ex.toString());
876                 signal5.countDown();
877             }
878         };
879
880         final OcPlatform.OnResourceFoundListener resourceFoundListener =
881                 new OcPlatform.OnResourceFoundListener() {
882                     @Override
883                     public void onResourceFound(OcResource resource) {
884                         ocResourceList.add(resource);
885                         try {
886                             resource.get(new HashMap<String, String>(), onGetListener);
887                             resource.put(new OcRepresentation(), new HashMap<String, String>(),
888                                     onPutListener);
889                             resource.post(new OcRepresentation(), new HashMap<String, String>(),
890                                     onPostListener);
891                             resource.deleteResource(onDeleteListener);
892                         } catch (OcException e) {
893                             assertTrue(false);
894                         }
895                         signal1.countDown();
896                     }
897                 };
898
899         try {
900             //server
901             OcResourceHandle resourceHandle = OcPlatform.registerResource(
902                     "/a/unittest",
903                     resourceType,
904                     OcPlatform.DEFAULT_INTERFACE,
905                     new OcPlatform.EntityHandler() {
906                         @Override
907                         public EntityHandlerResult handleEntity(OcResourceRequest ocResourceRequest) {
908                             EnumSet<RequestHandlerFlag> handlerFlagSet =
909                                     ocResourceRequest.getRequestHandlerFlagSet();
910                             RequestType requestType = ocResourceRequest.getRequestType();
911
912                             if (handlerFlagSet.contains(RequestHandlerFlag.INIT)) {
913                             }
914                             if (handlerFlagSet.contains(RequestHandlerFlag.REQUEST)) {
915                                 OcResourceResponse ocResourceResponse = new OcResourceResponse();
916                                 ocResourceResponse.setRequestHandle(
917                                         ocResourceRequest.getRequestHandle());
918                                 ocResourceResponse.setResourceHandle(
919                                         ocResourceRequest.getResourceHandle());
920
921                                 switch (requestType) {
922                                     case GET:
923                                         ocResourceResponse.setErrorCode(200);
924                                         ocResourceResponse.setResponseResult(
925                                                 EntityHandlerResult.ERROR);
926                                         break;
927                                     case PUT:
928                                         ocResourceResponse.setErrorCode(200);
929                                         ocResourceResponse.setResponseResult(
930                                                 EntityHandlerResult.ERROR);
931                                         break;
932                                     case POST:
933                                         ocResourceResponse.setErrorCode(200);
934                                         ocResourceResponse.setResponseResult(
935                                                 EntityHandlerResult.ERROR);
936                                         break;
937                                     case DELETE:
938                                         ocResourceResponse.setErrorCode(200);
939                                         ocResourceResponse.setResponseResult(
940                                                 EntityHandlerResult.ERROR);
941                                         break;
942                                 }
943                                 try {
944                                     OcPlatform.sendResponse(ocResourceResponse);
945                                 } catch (OcException e) {
946                                     Log.e(TAG, e.getMessage());
947                                     return EntityHandlerResult.ERROR;
948                                 }
949                             }
950                             if (handlerFlagSet.contains(RequestHandlerFlag.OBSERVER)) {
951                             }
952                             return EntityHandlerResult.OK;
953                         }
954                     },
955                     EnumSet.of(ResourceProperty.DISCOVERABLE)
956             );
957
958             //client
959             OcPlatform.findResource("",
960                     OcPlatform.WELL_KNOWN_QUERY + "?rt=" + resourceType,
961                     EnumSet.of(OcConnectivityType.CT_DEFAULT),
962                     resourceFoundListener);
963
964             //wait for onResourceFound event
965             assertTrue(signal1.await(60, TimeUnit.SECONDS));
966             //wait for onGetCompleted event
967             assertTrue(signal2.await(60, TimeUnit.SECONDS));
968             //wait for onPutCompleted event
969             assertTrue(signal3.await(60, TimeUnit.SECONDS));
970             //wait for onPostCompleted event
971             assertTrue(signal4.await(60, TimeUnit.SECONDS));
972             //wait for onDeleteCompleted event
973             assertTrue(signal5.await(60, TimeUnit.SECONDS));
974
975             //server
976             OcPlatform.unregisterResource(resourceHandle);
977
978         } catch (OcException e) {
979             Log.e(TAG, e.getMessage());
980             assertTrue(false);
981         }
982     }
983
984     public void testPlatformInfo() throws InterruptedException {
985         final String resourceType = "unit.test.resource" + new Date().getTime();
986         final CountDownLatch signal = new CountDownLatch(1);
987
988         OcPlatform.OnPlatformFoundListener platformFoundListener = new OcPlatform.OnPlatformFoundListener() {
989             @Override
990             public void onPlatformFound(OcRepresentation ocRepresentation) {
991                 Log.i(TAG, "Platform Info Received: ");
992                 Log.i(TAG, "URI: " + ocRepresentation.getUri());
993                 signal.countDown();
994             }
995         };
996
997         OcPlatformInfo platformInfo = null;
998
999         platformInfo = new OcPlatformInfo("myPlatformID", "myManuName", "myManuUrl");
1000
1001         platformInfo.setModelNumber("myModelNumber");
1002         platformInfo.setDateOfManufacture("myDateOfManufacture");
1003         platformInfo.setPlatformVersion("myPlatformVersion");
1004         platformInfo.setOperatingSystemVersion("myOperatingSystemVersion");
1005         platformInfo.setHardwareVersion("myHardwareVersion");
1006         platformInfo.setFirmwareVersion("myFirmwareVersion");
1007         platformInfo.setSupportUrl("mySupportUrl");
1008         platformInfo.setSystemTime("mySystemTime");
1009
1010         try {
1011             //server
1012             OcPlatform.registerPlatformInfo(platformInfo);
1013
1014             //client
1015             OcPlatform.getPlatformInfo(
1016                     "",
1017                     OcPlatform.WELL_KNOWN_PLATFORM_QUERY,
1018                     EnumSet.of(OcConnectivityType.CT_DEFAULT),
1019                     platformFoundListener);
1020
1021             //wait for onPlatformFound event
1022             assertTrue(signal.await(60, TimeUnit.SECONDS));
1023         } catch (OcException e) {
1024             Log.e(TAG, e.getMessage() + platformInfo.toString());
1025             assertTrue(false);
1026         }
1027     }
1028
1029     public void testRegisterDeviceInfoGetDeviceInfo() throws InterruptedException {
1030         final String resourceType = "unit.test.resource" + new Date().getTime();
1031         final CountDownLatch signal = new CountDownLatch(1);
1032
1033         OcPlatform.OnDeviceFoundListener deviceFoundListener = new OcPlatform.OnDeviceFoundListener() {
1034             @Override
1035             public void onDeviceFound(OcRepresentation ocRepresentation) {
1036                 try {
1037                     Log.i(TAG, "Device Name: " + ocRepresentation.getValue("n"));
1038                 } catch (OcException e) {
1039                     Log.e(TAG, e.toString());
1040                     assertTrue(false);
1041                 }
1042                 boolean hasDeviceNameAtr = ocRepresentation.hasAttribute("n");
1043                 assertTrue(hasDeviceNameAtr);
1044                 boolean hasNonExistingAtr = ocRepresentation.hasAttribute("NonExisting");
1045                 assertFalse(hasNonExistingAtr);
1046                 Log.i(TAG, "URI: " + ocRepresentation.getUri());
1047                 signal.countDown();
1048             }
1049         };
1050
1051         OcDeviceInfo devInfo = new OcDeviceInfo("myDeviceName");
1052
1053         try {
1054             //server
1055             OcPlatform.registerDeviceInfo(devInfo);
1056             //client
1057             OcPlatform.getDeviceInfo(
1058                     "",
1059                     OcPlatform.WELL_KNOWN_DEVICE_QUERY,
1060                     EnumSet.of(OcConnectivityType.CT_DEFAULT),
1061                     deviceFoundListener);
1062
1063             //wait for onDeviceFound event
1064             assertTrue(signal.await(60, TimeUnit.SECONDS));
1065
1066         } catch (OcException e) {
1067             Log.e(TAG, e.getMessage());
1068             assertTrue(false);
1069         }
1070     }
1071
1072     public void testBindUnbindResources() throws InterruptedException {
1073         final String resourceType = "unit.test.resource" + new Date().getTime();
1074         final CountDownLatch signal1 = new CountDownLatch(3);
1075         final CountDownLatch signal2 = new CountDownLatch(2);
1076         final CountDownLatch signal3 = new CountDownLatch(1);
1077         final CountDownLatch signal4 = new CountDownLatch(3);
1078         final CountDownLatch signal5 = new CountDownLatch(3);
1079         final CountDownLatch signal6 = new CountDownLatch(1);
1080
1081         OcPlatform.EntityHandler entityHandler = new OcPlatform.EntityHandler() {
1082             @Override
1083             public EntityHandlerResult handleEntity(OcResourceRequest ocResourceRequest) {
1084                 return EntityHandlerResult.OK;
1085             }
1086         };
1087
1088         OcPlatform.OnResourceFoundListener resourceFoundListener1 = new OcPlatform.OnResourceFoundListener() {
1089             @Override
1090             public void onResourceFound(OcResource resource) {
1091                 signal1.countDown();
1092             }
1093         };
1094
1095         OcPlatform.OnResourceFoundListener resourceFoundListener2 = new OcPlatform.OnResourceFoundListener() {
1096             @Override
1097             public void onResourceFound(OcResource resource) {
1098                 signal2.countDown();
1099             }
1100         };
1101
1102         OcPlatform.OnResourceFoundListener resourceFoundListener3 = new OcPlatform.OnResourceFoundListener() {
1103             @Override
1104             public void onResourceFound(OcResource resource) {
1105                 signal3.countDown();
1106             }
1107         };
1108
1109         OcPlatform.OnResourceFoundListener resourceFoundListener4 = new OcPlatform.OnResourceFoundListener() {
1110             @Override
1111             public void onResourceFound(OcResource resource) {
1112                 signal4.countDown();
1113             }
1114         };
1115
1116         OcPlatform.OnResourceFoundListener resourceFoundListener5 = new OcPlatform.OnResourceFoundListener() {
1117             @Override
1118             public void onResourceFound(OcResource resource) {
1119                 signal5.countDown();
1120             }
1121         };
1122
1123         OcPlatform.OnResourceFoundListener resourceFoundListener6 = new OcPlatform.OnResourceFoundListener() {
1124             @Override
1125             public void onResourceFound(OcResource resource) {
1126                 signal6.countDown();
1127             }
1128         };
1129
1130         try {
1131
1132             //server
1133             OcResourceHandle resourceHandleCollection = OcPlatform.registerResource(
1134                     "/a/unittest1",
1135                     resourceType,
1136                     OcPlatform.DEFAULT_INTERFACE,
1137                     entityHandler,
1138                     EnumSet.of(ResourceProperty.DISCOVERABLE)
1139             );
1140
1141             OcResourceHandle resourceHandle1 = OcPlatform.registerResource(
1142                     "/a/unittest2",
1143                     resourceType,
1144                     OcPlatform.DEFAULT_INTERFACE,
1145                     entityHandler,
1146                     EnumSet.of(ResourceProperty.DISCOVERABLE)
1147             );
1148
1149             OcResourceHandle resourceHandle2 = OcPlatform.registerResource(
1150                     "/a/unittest3",
1151                     resourceType,
1152                     OcPlatform.DEFAULT_INTERFACE,
1153                     entityHandler,
1154                     EnumSet.of(ResourceProperty.DISCOVERABLE)
1155             );
1156
1157             //client
1158             OcPlatform.findResource("",
1159                     OcPlatform.WELL_KNOWN_QUERY + "?rt=" + resourceType,
1160                     EnumSet.of(OcConnectivityType.CT_DEFAULT),
1161                     resourceFoundListener1);
1162
1163             //wait for onResourceFound event to find 3 registered resources
1164             assertTrue(signal1.await(60, TimeUnit.SECONDS));
1165
1166             //server
1167             OcPlatform.bindResource(resourceHandleCollection, resourceHandle1);
1168             OcPlatform.bindResource(resourceHandleCollection, resourceHandle2);
1169
1170             //client
1171             OcPlatform.findResource("",
1172                     OcPlatform.WELL_KNOWN_QUERY + "?rt=" + resourceType,
1173                     EnumSet.of(OcConnectivityType.CT_DEFAULT),
1174                     resourceFoundListener3);
1175
1176             //wait for onResourceFound event to find 1 collection resources
1177             assertTrue(signal3.await(60, TimeUnit.SECONDS));
1178
1179             //server
1180             OcPlatform.unbindResource(resourceHandleCollection, resourceHandle1);
1181
1182             //client
1183             OcPlatform.findResource("",
1184                     OcPlatform.WELL_KNOWN_QUERY + "?rt=" + resourceType,
1185                     EnumSet.of(OcConnectivityType.CT_DEFAULT),
1186                     resourceFoundListener2);
1187
1188             //wait for onResourceFound event to find 2 resources
1189             assertTrue(signal2.await(60, TimeUnit.SECONDS));
1190
1191             //server
1192             OcPlatform.unbindResource(resourceHandleCollection, resourceHandle2);
1193
1194             //client
1195             OcPlatform.findResource("",
1196                     OcPlatform.WELL_KNOWN_QUERY + "?rt=" + resourceType,
1197                     EnumSet.of(OcConnectivityType.CT_DEFAULT),
1198                     resourceFoundListener4);
1199
1200             //wait for onResourceFound event to find 3 registered resources
1201             assertTrue(signal4.await(60, TimeUnit.SECONDS));
1202
1203             //Bind/unbind a list of resource handles
1204             List<OcResourceHandle> resourceHandleList = new LinkedList<OcResourceHandle>();
1205             resourceHandleList.add(resourceHandle1);
1206             resourceHandleList.add(resourceHandle2);
1207             OcPlatform.bindResources(resourceHandleCollection, resourceHandleList);
1208
1209             //client
1210             OcPlatform.findResource("",
1211                     OcPlatform.WELL_KNOWN_QUERY + "?rt=" + resourceType,
1212                     EnumSet.of(OcConnectivityType.CT_DEFAULT),
1213                     resourceFoundListener6);
1214
1215             //wait for onResourceFound event to find 1 collection resources
1216             assertTrue(signal6.await(60, TimeUnit.SECONDS));
1217
1218             OcPlatform.unbindResources(resourceHandleCollection, resourceHandleList);
1219
1220             //client
1221             OcPlatform.findResource("",
1222                     OcPlatform.WELL_KNOWN_QUERY + "?rt=" + resourceType,
1223                     EnumSet.of(OcConnectivityType.CT_DEFAULT),
1224                     resourceFoundListener5);
1225
1226             //wait for onResourceFound event to find 1 collection resources
1227             assertTrue(signal5.await(60, TimeUnit.SECONDS));
1228
1229             //server
1230             OcPlatform.unregisterResource(resourceHandleCollection);
1231             OcPlatform.unregisterResource(resourceHandle1);
1232             OcPlatform.unregisterResource(resourceHandle2);
1233         } catch (OcException e) {
1234             Log.e(TAG, e.getMessage());
1235             assertTrue(false);
1236         }
1237     }
1238
1239     public void testResourceMethods() throws InterruptedException {
1240         final String resourceType1 = "unit.test.resource" + new Date().getTime();
1241         final String resourceType2 = "unit.test.resource" + new Date().getTime();
1242
1243         final CountDownLatch signal = new CountDownLatch(2);
1244         final List<OcResource> resourceList = new LinkedList<>();
1245
1246         OcPlatform.OnResourceFoundListener resourceFoundListener =
1247                 new OcPlatform.OnResourceFoundListener() {
1248                     @Override
1249                     public synchronized void onResourceFound(OcResource resource) {
1250                         resourceList.add(resource);
1251                         Log.i(TAG, "Host: " + resource.getHost());
1252                         Log.i(TAG, "Uri: " + resource.getUri());
1253                         Log.i(TAG, "Observable: " + resource.isObservable());
1254
1255                         assertFalse(resource.getResourceTypes().isEmpty());
1256                         for (String resourceType : resource.getResourceTypes()) {
1257                             Log.i(TAG, "Type: " + resourceType);
1258                         }
1259
1260                         assertFalse(resource.getResourceTypes().isEmpty());
1261                         for (String resourceInterface : resource.getResourceInterfaces()) {
1262                             Log.i(TAG, "Interface: " + resourceInterface);
1263                         }
1264
1265                         List<OcHeaderOption> headerOptionList = new LinkedList<OcHeaderOption>();
1266                         headerOptionList.add(new OcHeaderOption(2885, "OptionData1"));
1267                         headerOptionList.add(new OcHeaderOption(2886, "OptionData2"));
1268
1269                         resource.setHeaderOptions(headerOptionList);
1270                         resource.unsetHeaderOptions();
1271
1272                         OcResourceIdentifier resourceIdentifier = resource.getUniqueIdentifier();
1273                         OcResourceIdentifier resourceIdentifier2 = resource.getUniqueIdentifier();
1274                         assertTrue(resourceIdentifier.equals(resourceIdentifier2));
1275
1276                         signal.countDown();
1277                     }
1278                 };
1279
1280         try {
1281             //server
1282             OcResourceHandle resourceHandle1 = OcPlatform.registerResource(
1283                     "/a/unittest1",
1284                     resourceType1,
1285                     OcPlatform.DEFAULT_INTERFACE,
1286                     null,
1287                     EnumSet.of(ResourceProperty.DISCOVERABLE)
1288             );
1289
1290             OcResourceHandle resourceHandle2 = OcPlatform.registerResource(
1291                     "/a/unittest2",
1292                     resourceType2,
1293                     OcPlatform.DEFAULT_INTERFACE,
1294                     null,
1295                     EnumSet.of(ResourceProperty.DISCOVERABLE)
1296             );
1297
1298             //client
1299             OcPlatform.findResource("",
1300                     OcPlatform.WELL_KNOWN_QUERY + "?rt=" + resourceType1,
1301                     EnumSet.of(OcConnectivityType.CT_DEFAULT),
1302                     resourceFoundListener);
1303
1304             OcPlatform.findResource("",
1305                     OcPlatform.WELL_KNOWN_QUERY + "?rt=" + resourceType2,
1306                     EnumSet.of(OcConnectivityType.CT_DEFAULT),
1307                     resourceFoundListener);
1308
1309             //wait for onResourceFound event
1310             assertTrue(signal.await(60, TimeUnit.SECONDS));
1311
1312             assertTrue(2 == resourceList.size());
1313
1314             OcResource res0 = resourceList.get(0);
1315             OcResource res1 = resourceList.get(1);
1316             assertFalse(res0.getUniqueIdentifier().equals(res1.getUniqueIdentifier()));
1317             assertTrue(res0.getUniqueIdentifier().equals(res0.getUniqueIdentifier()));
1318
1319             //server
1320             OcPlatform.unregisterResource(resourceHandle1);
1321             OcPlatform.unregisterResource(resourceHandle2);
1322
1323         } catch (OcException e) {
1324             Log.e(TAG, e.getMessage());
1325             assertTrue(false);
1326         }
1327     }
1328
1329     public void testCreateResourceProxy() throws InterruptedException {
1330         final String resourceType = "unit.test.resource" + new Date().getTime();
1331         final CountDownLatch signal = new CountDownLatch(1);
1332
1333         OcPlatform.OnResourceFoundListener resourceFoundListener =
1334                 new OcPlatform.OnResourceFoundListener() {
1335                     @Override
1336                     public void onResourceFound(OcResource resource) {
1337
1338                         try {
1339                             //client: construct resource proxy
1340                             OcResource resourceProxy = OcPlatform.constructResourceObject(
1341                                     resource.getHost(),
1342                                     resource.getUri(),
1343                                     EnumSet.of(OcConnectivityType.CT_DEFAULT),
1344                                     resource.isObservable(),
1345                                     resource.getResourceTypes(),
1346                                     resource.getResourceInterfaces());
1347
1348                             //client: register resource proxy
1349                             OcResourceHandle resourceProxyHandle =
1350                                     OcPlatform.registerResource(resourceProxy);
1351
1352                             OcPlatform.unregisterResource(resourceProxyHandle);
1353                         } catch (OcException e) {
1354                             assertTrue(false);
1355                         }
1356                         signal.countDown();
1357                     }
1358                 };
1359
1360         try {
1361             //server
1362             OcResourceHandle resourceHandle = OcPlatform.registerResource(
1363                     "/a/unittest",
1364                     resourceType,
1365                     OcPlatform.DEFAULT_INTERFACE,
1366                     null,
1367                     EnumSet.of(ResourceProperty.DISCOVERABLE)
1368             );
1369
1370             //client
1371             OcPlatform.findResource("",
1372                     OcPlatform.WELL_KNOWN_QUERY + "?rt=" + resourceType,
1373                     EnumSet.of(OcConnectivityType.CT_DEFAULT),
1374                     resourceFoundListener);
1375
1376             //wait for onResourceFound event
1377             assertTrue(signal.await(60, TimeUnit.SECONDS));
1378
1379             //server
1380             OcPlatform.unregisterResource(resourceHandle);
1381
1382         } catch (OcException e) {
1383             Log.e(TAG, e.getMessage());
1384             assertTrue(false);
1385         }
1386
1387         try {
1388             //server
1389             OcResourceHandle resourceHandle = OcPlatform.registerResource(
1390                     "/a/unittest",
1391                     resourceType,
1392                     OcPlatform.DEFAULT_INTERFACE,
1393                     null,
1394                     EnumSet.of(ResourceProperty.DISCOVERABLE)
1395             );
1396
1397             //client
1398             OcPlatform.findResource("",
1399                     OcPlatform.WELL_KNOWN_QUERY + "?rt=" + resourceType,
1400                     EnumSet.of(OcConnectivityType.CT_DEFAULT),
1401                     resourceFoundListener);
1402
1403             //wait for onResourceFound event
1404             assertTrue(signal.await(60, TimeUnit.SECONDS));
1405
1406             //server
1407             OcPlatform.unregisterResource(resourceHandle);
1408
1409         } catch (OcException e) {
1410             Log.e(TAG, e.getMessage());
1411             assertTrue(false);
1412         }
1413     }
1414
1415     public void testObserveClientServer() throws InterruptedException {
1416         final int NUM_OBSERVES = 20;
1417         final Timer timer = new Timer();
1418         final List<OcResource> resourceList = new LinkedList<OcResource>();
1419         final List<OcResourceHandle> resourceHandleList = new LinkedList<OcResourceHandle>();
1420         final CountDownLatch signal1 = new CountDownLatch(1);
1421         final CountDownLatch signal2 = new CountDownLatch(NUM_OBSERVES);
1422         final CountDownLatch signal3 = new CountDownLatch(1);
1423
1424         final String resourceType = "unit.test.resource" + new Date().getTime();
1425
1426         final OcResource.OnObserveListener observeListener = new OcResource.OnObserveListener() {
1427             @Override
1428             public void onObserveCompleted(
1429                     List<OcHeaderOption> headerOptionList,
1430                     OcRepresentation ocRepresentation,
1431                     int sequenceNumber) {
1432
1433                 try {
1434                     Log.i(TAG, "Observe #" + sequenceNumber + " power: " +
1435                             ocRepresentation.getValue("power"));
1436                 } catch (OcException e) {
1437                     Log.e(TAG, e.toString());
1438                     assertTrue(false);
1439                 }
1440                 signal2.countDown();
1441             }
1442
1443             @Override
1444             public void onObserveFailed(Throwable ex) {
1445                 if (ex instanceof OcException) {
1446                     OcException ocEx = (OcException) ex;
1447                     ErrorCode errCode = ocEx.getErrorCode();
1448                 }
1449                 Log.e(TAG, ex.toString());
1450                 assertTrue(false);
1451             }
1452         };
1453
1454         final List<Byte> observationIdList = new LinkedList<Byte>();
1455         OcPlatform.EntityHandler entityHandler = new OcPlatform.EntityHandler() {
1456             @Override
1457             public EntityHandlerResult handleEntity(OcResourceRequest ocResourceRequest) {
1458                 EnumSet<RequestHandlerFlag> handlerFlagSet = ocResourceRequest.getRequestHandlerFlagSet();
1459                 RequestType requestType = ocResourceRequest.getRequestType();
1460
1461                 if (handlerFlagSet.contains(RequestHandlerFlag.INIT)) {
1462
1463                 }
1464                 if (handlerFlagSet.contains(RequestHandlerFlag.REQUEST)) {
1465                     OcResourceResponse ocResourceResponse = new OcResourceResponse();
1466                     ocResourceResponse.setRequestHandle(ocResourceRequest.getRequestHandle());
1467                     ocResourceResponse.setResourceHandle(ocResourceRequest.getResourceHandle());
1468
1469                     switch (requestType) {
1470                         case GET:
1471                             ocResourceResponse.setErrorCode(200);
1472                             ocResourceResponse.setResponseResult(EntityHandlerResult.OK);
1473                             ocResourceResponse.setResourceRepresentation(
1474                                     getRepresentation(
1475                                             rnd.nextInt(100)));
1476                             try {
1477                                 OcPlatform.sendResponse(ocResourceResponse);
1478                             } catch (OcException e) {
1479                                 Log.e(TAG, e.getMessage());
1480                                 return EntityHandlerResult.ERROR;
1481                             }
1482                             break;
1483                     }
1484                 }
1485
1486                 if (handlerFlagSet.contains(RequestHandlerFlag.OBSERVER)) {
1487                     ObservationInfo observationInfo = ocResourceRequest.getObservationInfo();
1488
1489                     switch (observationInfo.getObserveAction()) {
1490                         case REGISTER:
1491                             synchronized (observationIdList) {
1492                                 observationIdList.add(observationInfo.getOcObservationId());
1493                                 timer.schedule(new TimerTask() {
1494                                     int numNotified = 1;
1495
1496                                     @Override
1497                                     public void run() {
1498                                         if (0 < resourceHandleList.size()) {
1499                                             synchronized (observationIdList) {
1500                                                 if (numNotified > NUM_OBSERVES) {
1501                                                     timer.cancel();
1502                                                     timer.purge();
1503                                                     signal3.countDown();
1504                                                 } else {
1505                                                     try {
1506                                                         OcPlatform.notifyAllObservers(
1507                                                                 resourceHandleList.get(0));
1508                                                     } catch (OcException e) {
1509                                                         if (ErrorCode.NO_OBSERVERS == e.getErrorCode()) {
1510                                                             timer.cancel();
1511                                                             timer.purge();
1512                                                             signal3.countDown();
1513                                                         }
1514                                                         Log.e(TAG, e.getMessage());
1515                                                     }
1516                                                     numNotified++;
1517                                                 }
1518                                             }
1519                                         }
1520
1521                                     }
1522                                 }, 0, 100);
1523                             }
1524                             break;
1525                         case UNREGISTER:
1526                             //TODO unregister isn't implemented in C++ API, yet
1527                             synchronized (observationIdList) {
1528                                 timer.cancel();
1529                                 break;
1530                             }
1531                     }
1532                 }
1533                 return EntityHandlerResult.OK;
1534             }
1535         };
1536
1537         OcPlatform.OnResourceFoundListener resourceFoundListener =
1538                 new OcPlatform.OnResourceFoundListener() {
1539                     @Override
1540                     public void onResourceFound(OcResource resource) {
1541                         resourceList.add(resource);
1542                         if (resource.isObservable()) {
1543                             try {
1544                                 resource.observe(
1545                                         ObserveType.OBSERVE,
1546                                         new HashMap<String, String>(),
1547                                         observeListener);
1548
1549                                 signal1.countDown();
1550                             } catch (OcException e) {
1551                                 Log.e(TAG, e.getMessage());
1552                                 assertTrue(false);
1553                             }
1554                         }
1555                     }
1556                 };
1557         try {
1558             //server
1559             OcResourceHandle resourceHandle = OcPlatform.registerResource(
1560                     "/a/unittest",
1561                     resourceType,
1562                     OcPlatform.DEFAULT_INTERFACE,
1563                     entityHandler,
1564                     EnumSet.of(ResourceProperty.DISCOVERABLE, ResourceProperty.OBSERVABLE)
1565             );
1566
1567             resourceHandleList.add(resourceHandle);
1568
1569             //client
1570             OcPlatform.findResource("",
1571                     OcPlatform.WELL_KNOWN_QUERY + "?rt=" + resourceType,
1572                     EnumSet.of(OcConnectivityType.CT_DEFAULT),
1573                     resourceFoundListener);
1574
1575             //wait for onResourceFound event
1576             assertTrue(signal1.await(60, TimeUnit.SECONDS));
1577
1578             //wait for OnObserveListener event to observe 20 values
1579             assertTrue(signal2.await(60, TimeUnit.SECONDS));
1580
1581             if (resourceList.size() > 0) {
1582                 OcResource resource = resourceList.get(0);
1583                 if (resource.isObservable()) {
1584                     resource.cancelObserve();
1585                 }
1586             }
1587
1588             //wait for server to finish
1589             assertTrue(signal3.await(60, TimeUnit.SECONDS));
1590
1591             //server
1592             OcPlatform.unregisterResource(resourceHandle);
1593
1594         } catch (OcException e) {
1595             Log.e(TAG, e.getMessage());
1596             assertTrue(false);
1597         }
1598     }
1599
1600     private OcRepresentation getRepresentation(int value) {
1601         OcRepresentation rep = new OcRepresentation();
1602         try {
1603             rep.setValue("power", value);
1604         } catch (OcException e) {
1605             Log.e(TAG, e.toString());
1606             assertTrue(false);
1607         }
1608         return rep;
1609     }
1610
1611     private OcRepresentation getRepresentation() {
1612         return getRepresentation(74);
1613     }
1614 }