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.accountserver.resources.acl.invite;
24 import static java.util.concurrent.TimeUnit.SECONDS;
25 import static org.junit.Assert.assertEquals;
26 import static org.junit.Assert.assertTrue;
27 import static org.mockito.Mockito.mock;
29 import java.util.ArrayList;
30 import java.util.Arrays;
31 import java.util.HashMap;
32 import java.util.concurrent.CountDownLatch;
34 import org.iotivity.cloud.accountserver.Constants;
35 import org.iotivity.cloud.accountserver.db.MongoDB;
36 import org.iotivity.cloud.accountserver.resources.acl.group.GroupResource;
37 import org.iotivity.cloud.base.device.CoapDevice;
38 import org.iotivity.cloud.base.exception.ServerException.PreconditionFailedException;
39 import org.iotivity.cloud.base.protocols.IRequest;
40 import org.iotivity.cloud.base.protocols.IResponse;
41 import org.iotivity.cloud.base.protocols.MessageBuilder;
42 import org.iotivity.cloud.base.protocols.coap.CoapRequest;
43 import org.iotivity.cloud.base.protocols.coap.CoapResponse;
44 import org.iotivity.cloud.base.protocols.enums.ContentFormat;
45 import org.iotivity.cloud.base.protocols.enums.Observe;
46 import org.iotivity.cloud.base.protocols.enums.RequestMethod;
47 import org.iotivity.cloud.base.protocols.enums.ResponseStatus;
48 import org.iotivity.cloud.util.Cbor;
49 import org.junit.Before;
50 import org.junit.Test;
51 import org.mockito.Mockito;
52 import org.mockito.invocation.InvocationOnMock;
53 import org.mockito.stubbing.Answer;
55 public class InviteResourceTest {
56 private static final String INVITE_URI = Constants.INVITE_FULL_URI;
57 private static final String GROUP_URI = Constants.GROUP_FULL_URI;
59 private static final String TEST_INVITE_USER = "u0001";
60 private static final String TEST_INVITED_USER = "u0002";
61 private static final String TEST_GROUP_ID = "g0001";
63 private String mInvitedGroupId = null;
65 private InviteResource mInviteResource = null;
67 private GroupResource mGroupResource = new GroupResource();
69 private CountDownLatch mLatch = null;
71 private CoapDevice mMockDevice = null;
72 private IResponse mResponse = null;
74 private Cbor<HashMap<String, Object>> mCbor = new Cbor<>();
77 public void setUp() throws Exception {
79 mInviteResource = new InviteResource();
81 mLatch = new CountDownLatch(1);
83 mMockDevice = Mockito.mock(CoapDevice.class);
88 MongoDB mongoDB = new MongoDB(Constants.DB_NAME);
89 mongoDB.deleteTable(Constants.INVITE_TABLE);
90 mongoDB.createTable(Constants.INVITE_TABLE);
92 Mockito.doAnswer(new Answer<Object>() {
94 public CoapResponse answer(InvocationOnMock invocation)
96 Object[] args = invocation.getArguments();
97 CoapResponse resp = (CoapResponse) args[0];
100 if (resp.getPayloadSize() != 0) {
102 HashMap<String, Object> payloadData = mCbor
103 .parsePayloadFromCbor(resp.getPayload(),
106 if (payloadData.containsKey(Constants.REQ_GROUP_ID)) {
107 mInvitedGroupId = (String) payloadData
108 .get(Constants.REQ_GROUP_ID);
116 }).when(mMockDevice).sendResponse(Mockito.anyObject());
121 public void testSendInvitation() throws Exception {
123 sendInvitation(TEST_GROUP_ID, TEST_INVITED_USER);
125 assertTrue(mLatch.await(1L, SECONDS));
126 assertEquals(mResponse.getStatus(), ResponseStatus.CHANGED);
129 @Test(expected = PreconditionFailedException.class)
130 public void testSendInvitationWithoutGid() throws Exception {
132 sendInvitation(null, TEST_INVITED_USER);
135 @Test(expected = PreconditionFailedException.class)
136 public void testSendInvitationWithoutMid() throws Exception {
138 sendInvitation(TEST_GROUP_ID, null);
142 public void testInviteUserObserveInvition() throws Exception {
144 CountDownLatch latchInviteUser = new CountDownLatch(2);
146 CoapDevice mockInviteUser = mock(CoapDevice.class);
148 // invite user callback
149 Mockito.doAnswer(new Answer<Object>() {
151 public CoapResponse answer(InvocationOnMock invocation)
153 Object[] args = invocation.getArguments();
154 CoapResponse resp = (CoapResponse) args[0];
156 latchInviteUser.countDown();
158 // check observe notification response
159 if (latchInviteUser.getCount() == 0) {
161 assertEquals(resp.getStatus(), ResponseStatus.CONTENT);
163 checkResponsePayload(resp, Constants.RESP_INVITE));
164 assertTrue(checkInviteInfo(resp.getPayload(),
165 Constants.RESP_INVITE, TEST_GROUP_ID,
171 }).when(mockInviteUser).sendResponse(Mockito.anyObject());
173 getInvitation(TEST_INVITE_USER, mockInviteUser, Observe.SUBSCRIBE);
174 sendInvitation(TEST_GROUP_ID, TEST_INVITED_USER);
176 assertTrue(latchInviteUser.await(2L, SECONDS));
180 public void testInvitedUserObserveInvitation() throws Exception {
182 CountDownLatch latchInvitedUser = new CountDownLatch(2);
184 CoapDevice mockInvitedUser = mock(CoapDevice.class);
186 // invited user callback
187 Mockito.doAnswer(new Answer<Object>() {
189 public CoapResponse answer(InvocationOnMock invocation)
191 Object[] args = invocation.getArguments();
192 CoapResponse resp = (CoapResponse) args[0];
194 latchInvitedUser.countDown();
196 // check observe notification response
197 if (latchInvitedUser.getCount() == 0) {
199 assertEquals(resp.getStatus(), ResponseStatus.CONTENT);
201 checkResponsePayload(resp, Constants.RESP_INVITED));
202 assertTrue(checkInviteInfo(resp.getPayload(),
203 Constants.RESP_INVITED, TEST_GROUP_ID,
209 }).when(mockInvitedUser).sendResponse(Mockito.anyObject());
211 getInvitation(TEST_INVITED_USER, mockInvitedUser, Observe.SUBSCRIBE);
212 sendInvitation(TEST_GROUP_ID, TEST_INVITED_USER);
214 assertTrue(latchInvitedUser.await(2L, SECONDS));
218 public void testInviteUserCancelObserveInvitation() throws Exception {
220 getInvitation(TEST_INVITE_USER, mMockDevice, Observe.SUBSCRIBE);
221 sendInvitation(TEST_GROUP_ID, TEST_INVITED_USER);
223 getInvitation(TEST_INVITE_USER, mMockDevice, Observe.UNSUBSCRIBE);
225 assertEquals(mResponse.getStatus(), ResponseStatus.CONTENT);
226 assertTrue(checkInviteInfo(mResponse.getPayload(),
227 Constants.RESP_INVITE, TEST_GROUP_ID, TEST_INVITED_USER));
231 public void testInvitedUserCancelObserveInvitation() throws Exception {
233 getInvitation(TEST_INVITED_USER, mMockDevice, Observe.SUBSCRIBE);
234 sendInvitation(TEST_GROUP_ID, TEST_INVITED_USER);
236 getInvitation(TEST_INVITED_USER, mMockDevice, Observe.UNSUBSCRIBE);
238 assertEquals(mResponse.getStatus(), ResponseStatus.CONTENT);
239 assertTrue(checkInviteInfo(mResponse.getPayload(),
240 Constants.RESP_INVITED, TEST_GROUP_ID, TEST_INVITE_USER));
244 public void testInviteUserGetInvitation() throws Exception {
246 sendInvitation(TEST_GROUP_ID, TEST_INVITED_USER);
248 getInvitation(TEST_INVITE_USER, mMockDevice, Observe.NOTHING);
250 assertEquals(mResponse.getStatus(), ResponseStatus.CONTENT);
251 assertTrue(checkInviteInfo(mResponse.getPayload(),
252 Constants.RESP_INVITE, TEST_GROUP_ID, TEST_INVITED_USER));
256 public void testInvitedUserGetInvitation() throws Exception {
258 sendInvitation(TEST_GROUP_ID, TEST_INVITED_USER);
260 getInvitation(TEST_INVITED_USER, mMockDevice, Observe.NOTHING);
262 assertEquals(mResponse.getStatus(), ResponseStatus.CONTENT);
263 assertTrue(checkInviteInfo(mResponse.getPayload(),
264 Constants.RESP_INVITED, TEST_GROUP_ID, TEST_INVITE_USER));
268 public void testDeleteInvitationForAccept() throws Exception {
270 createGroup(mMockDevice, TEST_INVITE_USER, "Public", null);
271 sendInvitation(mInvitedGroupId, TEST_INVITED_USER);
273 deleteInvitationWithQuery(mInvitedGroupId, TEST_INVITED_USER, true);
275 assertTrue(mLatch.await(1L, SECONDS));
276 assertEquals(mResponse.getStatus(), ResponseStatus.DELETED);
281 public void testDeleteInvitationForDeny() throws Exception {
283 createGroup(mMockDevice, TEST_INVITE_USER, "Public", null);
284 sendInvitation(mInvitedGroupId, TEST_INVITED_USER);
286 deleteInvitationWithQuery(mInvitedGroupId, TEST_INVITED_USER, false);
288 assertTrue(mLatch.await(1L, SECONDS));
289 assertEquals(mResponse.getStatus(), ResponseStatus.DELETED);
293 public void testCancelInvitation() throws Exception {
295 sendInvitation(TEST_GROUP_ID, TEST_INVITED_USER);
297 deleteInvitation(TEST_GROUP_ID, TEST_INVITE_USER, TEST_INVITED_USER);
299 assertTrue(mLatch.await(1L, SECONDS));
300 assertEquals(mResponse.getStatus(), ResponseStatus.DELETED);
303 private void sendInvitation(String gid, String mid) {
305 IRequest request = makeSendInvitationRequest(gid, mid);
307 mInviteResource.onDefaultRequestReceived(mMockDevice, request);
310 private void deleteInvitation(String gid, String uid, String mid) {
312 String uriQuery = Constants.REQ_GROUP_ID + "=" + gid + ";"
313 + Constants.REQ_UUID_ID + "=" + uid + ";" + Constants.REQ_MEMBER
316 IRequest request = MessageBuilder.createRequest(RequestMethod.DELETE,
317 INVITE_URI, uriQuery);
319 mInviteResource.onDefaultRequestReceived(mMockDevice, request);
322 private void getInvitation(String uid, CoapDevice device,
323 Observe observeOpt) {
325 String uriQuery = Constants.REQ_UUID_ID + "=" + uid;
326 IRequest request = MessageBuilder.createRequest(RequestMethod.GET,
327 INVITE_URI, uriQuery);
329 if (observeOpt.equals(Observe.NOTHING) == false) {
330 ((CoapRequest) request).setObserve(observeOpt);
333 mInviteResource.onDefaultRequestReceived(device, request);
336 private IRequest makeSendInvitationRequest(String gid, String mid) {
338 HashMap<String, Object> invitation = new HashMap<>();
339 invitation.put(Constants.REQ_GROUP_ID, gid);
340 invitation.put(Constants.REQ_MEMBER, mid);
342 HashMap<String, Object> payload = new HashMap<>();
343 payload.put(Constants.REQ_UUID_ID, TEST_INVITE_USER);
344 payload.put(Constants.REQ_INVITE, Arrays.asList(invitation));
346 return MessageBuilder.createRequest(RequestMethod.POST, INVITE_URI,
347 null, ContentFormat.APPLICATION_CBOR,
348 mCbor.encodingPayloadToCbor(payload));
351 private boolean checkResponsePayload(IResponse response,
352 String propertyName) {
354 HashMap<String, Object> payloadData = mCbor
355 .parsePayloadFromCbor(response.getPayload(), HashMap.class);
357 return payloadData.get(propertyName) != null ? true : false;
360 private boolean checkInviteInfo(byte[] payload, String propertyKey,
361 String gid, String mid) {
363 HashMap<String, Object> paredPayload = mCbor
364 .parsePayloadFromCbor(payload, HashMap.class);
366 @SuppressWarnings("unchecked")
367 ArrayList<HashMap<String, Object>> invitationList = (ArrayList<HashMap<String, Object>>) paredPayload
370 for (HashMap<String, Object> invitation : invitationList) {
372 if (invitation.get(Constants.REQ_GROUP_ID).equals(gid)
373 && invitation.get(Constants.REQ_MEMBER).equals(mid)) {
382 private void deleteInvitationWithQuery(String gid, String uid,
390 String uriQuery = Constants.REQ_GROUP_ID + "=" + gid + ";"
391 + Constants.REQ_UUID_ID + "=" + uid + ";"
392 + Constants.REQ_INVITE_ACCEPT + "=" + acceptInt;
394 IRequest request = MessageBuilder.createRequest(RequestMethod.DELETE,
395 INVITE_URI, uriQuery);
397 mInviteResource.onDefaultRequestReceived(mMockDevice, request);
400 private void createGroup(CoapDevice device, String uid, String gname,
401 String parent) throws Exception {
402 System.out.println("-----Create Group");
403 IRequest request = null;
404 HashMap<String, Object> payloadData = new HashMap<String, Object>();
405 payloadData.put(Constants.KEYFIELD_GROUP_NAME, gname);
406 payloadData.put(Constants.KEYFIELD_GROUP_PARENT, parent);
407 payloadData.put(Constants.KEYFIELD_GROUP_MEMBERS,
408 new ArrayList<String>(Arrays.asList(uid)));
409 payloadData.put(Constants.KEYFIELD_OID, uid);
410 request = MessageBuilder.createRequest(RequestMethod.POST, GROUP_URI,
411 Constants.KEYFIELD_UID + "=" + uid,
412 ContentFormat.APPLICATION_CBOR,
413 mCbor.encodingPayloadToCbor(payloadData));
414 mGroupResource.onDefaultRequestReceived(device, request);