2 * //******************************************************************
4 * // Copyright 2016 Samsung Electronics All Rights Reserved.
6 * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
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
12 * // http://www.apache.org/licenses/LICENSE-2.0
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.
20 * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
22 package org.iotivity.cloud.testrdserver;
24 import static java.util.concurrent.TimeUnit.SECONDS;
25 import static org.junit.Assert.assertNull;
26 import static org.junit.Assert.assertTrue;
27 import static org.mockito.Mockito.mock;
29 import java.util.ArrayList;
30 import java.util.HashMap;
31 import java.util.concurrent.CountDownLatch;
33 import org.iotivity.cloud.base.device.CoapDevice;
34 import org.iotivity.cloud.base.protocols.IRequest;
35 import org.iotivity.cloud.base.protocols.IResponse;
36 import org.iotivity.cloud.base.protocols.MessageBuilder;
37 import org.iotivity.cloud.base.protocols.coap.CoapRequest;
38 import org.iotivity.cloud.base.protocols.coap.CoapResponse;
39 import org.iotivity.cloud.base.protocols.enums.ContentFormat;
40 import org.iotivity.cloud.base.protocols.enums.Observe;
41 import org.iotivity.cloud.base.protocols.enums.RequestMethod;
42 import org.iotivity.cloud.base.protocols.enums.ResponseStatus;
43 import org.iotivity.cloud.rdserver.Constants;
44 import org.iotivity.cloud.rdserver.resources.directory.rd.ResourceDirectoryResource;
45 import org.iotivity.cloud.rdserver.resources.presence.device.DevicePresenceResource;
46 import org.iotivity.cloud.util.Cbor;
47 import org.junit.After;
48 import org.junit.Before;
49 import org.junit.Test;
50 import org.mockito.Mockito;
51 import org.mockito.invocation.InvocationOnMock;
52 import org.mockito.stubbing.Answer;
54 public class DevicePresenceResourceTest {
55 private Cbor<HashMap<String, Object>> mCbor = new Cbor<>();
56 private ResourceDirectoryResource mRDResource = null;
57 private DevicePresenceResource mMockDevicePresenceResource = null;
58 private CoapDevice mMockDevice = null;
59 private CountDownLatch mLatch = null;
60 private IResponse mResponse;
63 public void setUp() throws Exception {
65 mMockDevice = mock(CoapDevice.class);
66 mLatch = new CountDownLatch(1);
67 mRDResource = new ResourceDirectoryResource();
68 mMockDevicePresenceResource = new DevicePresenceResource();
70 Mockito.doAnswer(new Answer<Object>() {
72 public CoapResponse answer(InvocationOnMock invocation)
74 CoapResponse resp = (CoapResponse) invocation.getArguments()[0];
79 }).when(mMockDevice).sendResponse(Mockito.anyObject());
83 public void tearDown() throws Exception {
84 RDServerTestUtils.resetRDDatabase();
87 private IRequest makePresenceGetRequest(Observe obs) {
88 String query = Constants.DEVICE_ID + "=" + RDServerTestUtils.DI;
89 IRequest request = null;
90 if (obs.compareTo(Observe.SUBSCRIBE) == 0) {
91 request = MessageBuilder.createRequest(RequestMethod.GET,
92 RDServerTestUtils.DEVICE_PRS_REQ_URI, query);
93 } else if (obs.compareTo(Observe.UNSUBSCRIBE) == 0) {
94 request = MessageBuilder.createRequest(RequestMethod.GET,
95 RDServerTestUtils.DEVICE_PRS_REQ_URI, query);
97 ((CoapRequest) request).setObserve(obs);
101 private HashMap<String, String> parsePayload(IResponse response) {
103 HashMap<String, Object> payloadData = mCbor
104 .parsePayloadFromCbor(response.getPayload(), HashMap.class);
106 ArrayList<HashMap<String, String>> prsList = (ArrayList<HashMap<String, String>>) payloadData
107 .get(Constants.PRESENCE_LIST);
109 if (prsList.isEmpty()) {
112 return prsList.get(0);
118 public void testSubscribeRequest() throws Exception {
119 System.out.println("\t------testHandleGetSubscribeRequest");
120 mRDResource.onDefaultRequestReceived(mMockDevice,
121 RDServerTestUtils.makePublishRequest());
122 IRequest request = makePresenceGetRequest(Observe.SUBSCRIBE);
123 mMockDevicePresenceResource.onDefaultRequestReceived(mMockDevice,
125 // assertion: if the response status is "CONTENT"
126 assertTrue(mLatch.await(2L, SECONDS));
127 assertTrue(checkResponseCode(mResponse, ResponseStatus.CONTENT));
128 assertNull(parsePayload(mResponse));
132 public void testUnsubscribeRequest() throws Exception {
133 System.out.println("\t------testHandleGetUnsubscribeRequest");
134 IRequest request = makePresenceGetRequest(Observe.UNSUBSCRIBE);
135 mRDResource.onDefaultRequestReceived(mMockDevice,
136 RDServerTestUtils.makePublishRequest());
137 mMockDevicePresenceResource.onDefaultRequestReceived(mMockDevice,
139 // assertion: if the response status is "CONTENT"
140 assertTrue(mLatch.await(2L, SECONDS));
141 assertTrue(checkResponseCode(mResponse, ResponseStatus.CONTENT));
142 assertNull(parsePayload(mResponse));
146 public void testSubscribeRequest_existDevice() throws Exception {
147 System.out.println("\t------testSubscribeRequest_existDevice");
148 CoapDevice observerDevice = mock(CoapDevice.class);
149 CountDownLatch observerLatch = new CountDownLatch(2);
150 // callback mock for observer Device
151 Mockito.doAnswer(new Answer<Object>() {
153 public CoapResponse answer(InvocationOnMock invocation)
155 CoapResponse response = (CoapResponse) invocation
157 observerLatch.countDown();
158 // assertion for observer device (subscribe response)
159 if (observerLatch.getCount() == 1) {
160 assertTrue(checkResponseCode(response,
161 ResponseStatus.CONTENT));
163 if (observerLatch.getCount() == 0) {
164 assertTrue(checkResponseCode(response,
165 ResponseStatus.CONTENT));
166 assertTrue(checkPayloadProperty(response,
167 Constants.DEVICE_ID));
168 assertTrue(checkPayloadProperty(response,
169 Constants.PRESENCE_STATE));
170 assertTrue(parsePayload(response)
171 .get(Constants.PRESENCE_STATE).equals("on"));
177 }).when(observerDevice).sendResponse(Mockito.anyObject());
178 // subscribe request (specific device)
179 IRequest subRequest = makePresenceGetRequest(Observe.SUBSCRIBE);
180 mMockDevicePresenceResource.onDefaultRequestReceived(observerDevice,
182 // POST device presence off
183 HashMap<String, Object> payload = new HashMap<>();
184 payload.put(Constants.DEVICE_ID, RDServerTestUtils.DI);
185 payload.put(Constants.PRESENCE_STATE, "on");
186 IRequest request = MessageBuilder.createRequest(RequestMethod.POST,
187 RDServerTestUtils.DEVICE_PRS_REQ_URI, null,
188 ContentFormat.APPLICATION_CBOR,
189 mCbor.encodingPayloadToCbor(payload));
190 mMockDevicePresenceResource.onDefaultRequestReceived(mMockDevice,
192 // assertion for resource server device : responseStatus is "CHANGED"
193 assertTrue(mLatch.await(2L, SECONDS));
194 assertTrue(observerLatch.await(2L, SECONDS));
195 assertTrue(checkResponseCode(mResponse, ResponseStatus.CHANGED));
199 public void testUnSubscribeRequest_existDevice() throws Exception {
200 System.out.println("\t------testUnSubscribeRequest_existDevice");
201 CoapDevice observerDevice = mock(CoapDevice.class);
202 CountDownLatch observerLatch = new CountDownLatch(1);
203 // callback mock for observer Device
204 Mockito.doAnswer(new Answer<Object>() {
206 public CoapResponse answer(InvocationOnMock invocation)
208 CoapResponse response = (CoapResponse) invocation
210 observerLatch.countDown();
211 // assertion for observer device (subscribe response)
212 if (observerLatch.getCount() == 0) {
213 assertTrue(checkResponseCode(response,
214 ResponseStatus.CONTENT));
220 }).when(observerDevice).sendResponse(Mockito.anyObject());
221 // subscribe request (specific device)
222 IRequest subRequest = makePresenceGetRequest(Observe.UNSUBSCRIBE);
223 mMockDevicePresenceResource.onDefaultRequestReceived(observerDevice,
225 HashMap<String, Object> payload = new HashMap<>();
226 payload.put(Constants.DEVICE_ID, RDServerTestUtils.DI);
227 payload.put(Constants.PRESENCE_STATE, "off");
228 IRequest request = MessageBuilder.createRequest(RequestMethod.POST,
229 RDServerTestUtils.DEVICE_PRS_REQ_URI, null,
230 ContentFormat.APPLICATION_CBOR,
231 mCbor.encodingPayloadToCbor(payload));
232 mMockDevicePresenceResource.onDefaultRequestReceived(mMockDevice,
234 // assertion for resource server device : responseStatus is "CHANGED"
235 assertTrue(mLatch.await(2L, SECONDS));
236 assertTrue(observerLatch.await(2L, SECONDS));
237 assertTrue(checkResponseCode(mResponse, ResponseStatus.CHANGED));
240 private boolean checkPayloadProperty(IResponse response,
241 String propertyName) {
242 HashMap<String, Object> payloadData = mCbor
243 .parsePayloadFromCbor(response.getPayload(), HashMap.class);
245 ArrayList<HashMap<String, String>> prsList = (ArrayList<HashMap<String, String>>) payloadData
246 .get(Constants.PRESENCE_LIST);
248 HashMap<String, String> mapData = prsList.get(0);
249 if (mapData.containsKey(propertyName))
255 private boolean checkResponseCode(IResponse response,
256 ResponseStatus responseStatus) {
257 if (responseStatus == response.getStatus())