1 package org.iotivity.cloud.ciserver.resources.proxy.rd;
3 import static java.util.concurrent.TimeUnit.SECONDS;
4 import static org.junit.Assert.assertEquals;
5 import static org.junit.Assert.assertTrue;
6 import static org.mockito.Mockito.mock;
8 import java.util.ArrayList;
9 import java.util.HashMap;
10 import java.util.List;
11 import java.util.concurrent.CountDownLatch;
13 import org.iotivity.cloud.base.connector.ConnectorPool;
14 import org.iotivity.cloud.base.device.CoapDevice;
15 import org.iotivity.cloud.base.device.IRequestChannel;
16 import org.iotivity.cloud.base.exception.ClientException;
17 import org.iotivity.cloud.base.protocols.IRequest;
18 import org.iotivity.cloud.base.protocols.IResponse;
19 import org.iotivity.cloud.base.protocols.MessageBuilder;
20 import org.iotivity.cloud.base.protocols.coap.CoapRequest;
21 import org.iotivity.cloud.base.protocols.enums.ContentFormat;
22 import org.iotivity.cloud.base.protocols.enums.Observe;
23 import org.iotivity.cloud.base.protocols.enums.RequestMethod;
24 import org.iotivity.cloud.base.protocols.enums.ResponseStatus;
25 import org.iotivity.cloud.ciserver.DeviceServerSystem;
26 import org.iotivity.cloud.util.Cbor;
27 import org.junit.Before;
28 import org.junit.Test;
29 import org.mockito.InjectMocks;
30 import org.mockito.Mock;
31 import org.mockito.Mockito;
32 import org.mockito.MockitoAnnotations;
33 import org.mockito.invocation.InvocationOnMock;
34 import org.mockito.stubbing.Answer;
36 public class DevicePresenceTest {
37 public static final String DEVICE_PRS_REQ_URI = "/.well-known/ocf/prs";
38 public static final String DEVICE_LIST_KEY = "devices";
39 public static final String RES_PRS_URI = "/oic/ad";
40 private String di = "B371C481-38E6-4D47-8320-7688D8A5B58C";
41 String userId = "testuser";
42 private CoapDevice mockDevice = mock(CoapDevice.class);
45 ConnectorPool connectorPool = null;
46 DeviceServerSystem deviceServerSystem = new DeviceServerSystem();
47 final CountDownLatch latch = new CountDownLatch(1);
49 IRequestChannel requestChannel;
51 DevicePresence prsHandler = new DevicePresence();
54 public void setUp() throws Exception {
55 MockitoAnnotations.initMocks(this);
56 deviceServerSystem.addResource(prsHandler);
57 Mockito.doReturn("mockDeviceId").when(mockDevice).getDeviceId();
58 Mockito.doAnswer(new Answer<Object>() {
60 public CoapRequest answer(InvocationOnMock invocation)
62 Object[] args = invocation.getArguments();
63 CoapRequest request = (CoapRequest) args[0];
65 "\t----------payload : " + request.getPayloadString());
67 "\t----------uripath : " + request.getUriPath());
69 "\t---------uriquery : " + request.getUriQuery());
74 }).when(requestChannel).sendRequest(Mockito.any(IRequest.class),
75 Mockito.any(CoapDevice.class));
78 // @InjectMocks for testSpecificDeviceonResponseReceived
79 IRequest requestSpecificDevice = makePresenceSpecificDevice(
82 DevicePresence.AccountReceiveHandler SpecificDeviceHandler = prsHandler.new AccountReceiveHandler(
83 requestSpecificDevice, mockDevice);
86 public void testSpecificDeviceonResponseReceived() throws ClientException {
88 "\t--------------onResponseReceived(RD) Device Presence (specific deivce) Test------------");
89 IResponse response = responseFromAccountServer();
90 SpecificDeviceHandler.onResponseReceived(response);
91 HashMap<String, List<String>> queryMap = req.getUriQueryMap();
92 assertTrue(req.getObserve() == Observe.SUBSCRIBE);
93 assertTrue(queryMap.get("di").contains("device1"));
94 assertTrue(req.getMethod() == RequestMethod.GET);
97 // @InjectMocks for testEntireDeviceonResponseReceived
98 IRequest requestEntireDevices = makePresenceEntireDevice();
100 DevicePresence.AccountReceiveHandler EntireDeviceHandler = prsHandler.new AccountReceiveHandler(
101 requestEntireDevices, mockDevice);
104 public void testEntireDeviceonResponseReceived() throws ClientException {
106 "\t--------------onResponseReceived(RD) Device Presence (entire deivces) Test------------");
107 IResponse response = responseFromAccountServer();
108 EntireDeviceHandler.onResponseReceived(response);
109 HashMap<String, List<String>> queryMap = req.getUriQueryMap();
110 assertTrue(req.getMethod() == RequestMethod.GET);
111 assertTrue(queryMap.get("di").contains("device1"));
112 assertTrue(queryMap.get("di").contains("device2"));
113 assertTrue(queryMap.get("di").contains("device3"));
114 assertTrue(req.getObserve() == Observe.SUBSCRIBE);
118 public void testDevicePresenceObserverSpecificDeviceOnRequestReceived()
121 "\t--------------OnRequestReceived(RD) Device Presence (observe specific device) Test------------");
122 IRequest request = makePresenceSpecificDevice(di);
123 deviceServerSystem.onRequestReceived(mockDevice, request);
124 assertTrue(latch.await(1L, SECONDS));
125 HashMap<String, List<String>> queryMap = req.getUriQueryMap();
126 assertTrue(queryMap.containsKey("mid"));
127 assertTrue(req.getMethod().equals(RequestMethod.GET));
128 assertEquals(req.getUriPath(), "/.well-known/ocf/acl/group/null");
131 // @InjectMocks for testPresenceDeregisterSpecificDeviceOnRequestReceived
132 IRequest requestDeregisterSpecificDevice = makeDeregisterSpecificDevice(
135 DevicePresence.AccountReceiveHandler DeregisterHandler = prsHandler.new AccountReceiveHandler(
136 requestDeregisterSpecificDevice, mockDevice);
139 public void testPresenceDeregisterSpecificDeviceOnRequestReceived()
142 "\t--------------OnRequestReceived(RD) Device Presence (deregister specific device) Test------------");
143 IResponse response = responseFromAccountServer();
144 DeregisterHandler.onResponseReceived(response);
145 HashMap<String, List<String>> queryMap = req.getUriQueryMap();
146 assertTrue(req.getMethod() == RequestMethod.GET);
147 assertTrue(queryMap.get("di").contains("device1"));
148 assertTrue(req.getObserve() == Observe.UNSUBSCRIBE);
152 public void testDevicePresenceObserverEntireDevicesOnRequestReceived()
155 "\t--------------OnRequestReceived(RD) Device Presence (observe entire devices) Test------------");
156 IRequest request = makePresenceEntireDevice();
157 deviceServerSystem.onRequestReceived(mockDevice, request);
158 assertTrue(latch.await(1L, SECONDS));
159 assertTrue(req.getMethod().equals(RequestMethod.GET));
160 HashMap<String, List<String>> queryMap = req.getUriQueryMap();
161 assertTrue(queryMap.containsKey("mid"));
162 assertEquals(req.getUriPath(), "/.well-known/ocf/acl/group/null");
165 public IRequest makePresenceEntireDevice() {
166 IRequest request = null;
167 request = MessageBuilder.createRequest(RequestMethod.GET,
168 DEVICE_PRS_REQ_URI, null);
169 ((CoapRequest) request).setObserve(Observe.SUBSCRIBE);
173 private IRequest makePresenceSpecificDevice(String di) {
174 String query = "di=" + di;
175 IRequest request = null;
176 request = MessageBuilder.createRequest(RequestMethod.GET,
177 DEVICE_PRS_REQ_URI, query);
178 ((CoapRequest) request).setObserve(Observe.SUBSCRIBE);
182 private IRequest makeDeregisterSpecificDevice(String di) {
183 String query = "di=" + di;
184 IRequest request = null;
185 request = MessageBuilder.createRequest(RequestMethod.GET,
186 DEVICE_PRS_REQ_URI, query);
187 ((CoapRequest) request).setObserve(Observe.UNSUBSCRIBE);
191 private IResponse responseFromAccountServer() {
192 // make response which has "CONTENT" status
193 Cbor<HashMap<String, Object>> cbor = new Cbor<>();
194 HashMap<String, Object> responsePayload = new HashMap<String, Object>();
195 ArrayList<String> deviceList = new ArrayList<String>();
196 // assuming that there are three devices in the response msg from
198 deviceList.add("device1");
199 deviceList.add("device2");
200 deviceList.add("device3");
201 responsePayload.put("dilist", deviceList);
202 responsePayload.put("gid", "g0001");
203 responsePayload.put("gmid", "u0001");
204 ArrayList<String> midList = new ArrayList<String>();
205 midList.add("u0001");
206 responsePayload.put("midlist", midList);
207 IRequest requestFromCitoAs = MessageBuilder.createRequest(
208 RequestMethod.GET, "/.well-known/ocf/acl/group/g0001",
210 IResponse response = MessageBuilder.createResponse(requestFromCitoAs,
211 ResponseStatus.CONTENT, ContentFormat.APPLICATION_CBOR,
212 cbor.encodingPayloadToCbor(responsePayload));