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 * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
23 package org.iotivity.cloud.accountserver.resources.account.session;
25 import static org.junit.Assert.assertTrue;
26 import static org.mockito.Mockito.mock;
28 import java.text.DateFormat;
29 import java.text.SimpleDateFormat;
30 import java.util.Date;
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.AccountDBManager;
36 import org.iotivity.cloud.accountserver.db.TokenTable;
37 import org.iotivity.cloud.accountserver.db.UserTable;
38 import org.iotivity.cloud.accountserver.util.TypeCastingManager;
39 import org.iotivity.cloud.base.ServerSystem;
40 import org.iotivity.cloud.base.ServerSystem.PersistentPacketReceiver;
41 import org.iotivity.cloud.base.device.CoapDevice;
42 import org.iotivity.cloud.base.device.Device;
43 import org.iotivity.cloud.base.protocols.IRequest;
44 import org.iotivity.cloud.base.protocols.IResponse;
45 import org.iotivity.cloud.base.protocols.MessageBuilder;
46 import org.iotivity.cloud.base.protocols.coap.CoapResponse;
47 import org.iotivity.cloud.base.protocols.enums.ContentFormat;
48 import org.iotivity.cloud.base.protocols.enums.RequestMethod;
49 import org.iotivity.cloud.base.protocols.enums.ResponseStatus;
50 import org.iotivity.cloud.util.Cbor;
51 import org.iotivity.cloud.util.Log;
52 import org.junit.After;
53 import org.junit.Before;
54 import org.junit.Test;
55 import org.mockito.InjectMocks;
56 import org.mockito.Mock;
57 import org.mockito.Mockito;
58 import org.mockito.MockitoAnnotations;
59 import org.mockito.invocation.InvocationOnMock;
60 import org.mockito.stubbing.Answer;
62 import io.netty.channel.Channel;
63 import io.netty.channel.ChannelHandlerContext;
64 import io.netty.channel.ChannelId;
65 import io.netty.util.Attribute;
67 public class SessionResourceTest {
68 private final String DEFAULT_AUTH_LOGIN = "/.well-known/ocf/account/session";
69 private final String DEFAULT_AUTH_LOGOUT = "/.well-known/ocf/account/session";
70 private String di = "d0001";
71 private String accessToken = "5f5536c896da7dd437316585b86ef9dd03441c40";
72 private String refreshToken = "rt0001";
73 private TypeCastingManager<UserTable> mUserTableCastingManager = new TypeCastingManager<>();
74 private TypeCastingManager<TokenTable> mTokenTableCastingManager = new TypeCastingManager<>();
75 ServerSystem serverSystem = new ServerSystem();
76 final CountDownLatch latch = new CountDownLatch(
78 private String uuid = "bc38f243-aab5-44d3-8eb9-4a54ebbaf359";
79 private String authProvider = "github";
80 private CoapDevice mockDevice = Mockito
81 .mock(CoapDevice.class);
82 private Cbor<HashMap<String, Object>> mCbor = new Cbor<>();
86 ChannelHandlerContext ctx;
89 PersistentPacketReceiver receiver = serverSystem.new PersistentPacketReceiver();
92 public void setUp() throws Exception {
96 serverSystem.addResource(new SessionResource());
97 MockitoAnnotations.initMocks(this);
98 ChannelId channelId = mock(ChannelId.class);
99 // inject mocked coapDevice into the api
100 Channel channel = mock(Channel.class);
101 Attribute<Device> attribute = mock(Attribute.class);
102 Mockito.doReturn(channel).when(ctx).channel();
103 Mockito.doReturn(attribute).when(channel).attr(Mockito.any());
104 Mockito.doReturn(mockDevice).when(attribute).get();
105 Mockito.doReturn(channelId).when(channel).id();
107 "0000000141f3edcfc2c3000000000001d0000000000000000000000000000000000000")
108 .when(channelId).asLongText();
109 // register the token table and user table to the DB
110 HashMap<String, Object> tokenInfo = mTokenTableCastingManager
111 .convertObjectToMap(makeTokenTable());
112 HashMap<String, Object> userInfo = mUserTableCastingManager
113 .convertObjectToMap(makeUserTable());
114 AccountDBManager.getInstance()
115 .insertAndReplaceRecord(Constants.TOKEN_TABLE, tokenInfo);
116 AccountDBManager.getInstance().insertRecord(Constants.USER_TABLE,
118 // response handler mock
119 Mockito.doAnswer(new Answer<Object>() {
121 public CoapResponse answer(InvocationOnMock invocation)
124 Object[] args = invocation.getArguments();
125 CoapResponse resp = (CoapResponse) args[0];
127 "\t----------payload : " + resp.getPayloadString());
128 System.out.println("\t---------method : " + resp.getMethod());
133 }).when(mockDevice).sendResponse(Mockito.anyObject());
134 // exception handler mock
135 Mockito.doAnswer(new Answer<Object>() {
137 public CoapResponse answer(InvocationOnMock invocation)
139 Object[] args = invocation.getArguments();
140 CoapResponse resp = (CoapResponse) args[0];
141 System.out.println("\t----exception response status : "
147 }).when(channel).writeAndFlush(Mockito.any());
151 public void endTest() {
152 AccountDBManager.getInstance().deleteRecord(Constants.TOKEN_TABLE,
153 mTokenTableCastingManager.convertObjectToMap(makeTokenTable()));
154 AccountDBManager.getInstance().deleteRecord(Constants.USER_TABLE,
155 mUserTableCastingManager.convertObjectToMap(makeUserTable()));
159 public void testSignInOnDefaultRequestReceived() throws Exception {
160 System.out.println("\t--------------Sign In Test------------");
161 SignIn(di, accessToken);
162 assertTrue(hashmapCheck(res, "expiresin"));
163 assertTrue(methodCheck(res, ResponseStatus.CHANGED));
167 public void testSignInWithInvalidMethodOnDefaultRequestReceived()
170 "\t--------------Sign In With Invalid RequestMethod Test------------");
171 SignInWithInvalidMethod(di, accessToken);
172 assertTrue(methodCheck(res, ResponseStatus.BAD_REQUEST));
176 public void testWrongAccessTokenSignInOnDefaultRequestReceived()
179 "\t--------------Wrong AccessToken Sign In Test------------");
180 String accessTokenNotStored = "5689c70ffa245effc563017fee36d250";
182 SignIn(di, accessTokenNotStored);
183 assertTrue(methodCheck(res, ResponseStatus.UNAUTHORIZED));
187 public void testInvalidDeviceIdSignInOnDefaultRequestReceived()
190 "\t--------------Invalid DeviceId Sign In Test------------");
191 String diNotStored = "F371C481-38E6-4D47-8320-7688D8A5B58C";
192 SignIn(diNotStored, accessToken);
193 assertTrue(methodCheck(res, ResponseStatus.UNAUTHORIZED));
197 public void testSignOutOnDefaultRequestReceived() throws Exception {
198 System.out.println("\t--------------Sign Out Test------------");
199 SignOut(di, accessToken);
200 assertTrue(methodCheck(res, ResponseStatus.CHANGED));
204 public void testSignInWithNullPayloadOnDefaultRequestReceived()
207 "\t--------------Sign In With Null Payload Test------------");
208 SignInWithNullPayload();
209 assertTrue(methodCheck(res, ResponseStatus.BAD_REQUEST));
213 public void testSignOutWithNullPayloadOnDefaultRequestReceived()
216 "\t--------------Sign Out With Null Payload Test------------");
218 SignOutWithNullPayload();
219 assertTrue(methodCheck(res, ResponseStatus.BAD_REQUEST));
223 public void testSignInWithBlankHashMapPayloadOnDefaultRequestReceived()
226 "\t--------------Sign In With Blank HashMap Payload Test------------");
227 SignInWithBlankHashMapPayload();
228 assertTrue(methodCheck(res, ResponseStatus.PRECONDITION_FAILED));
232 public void testSignOutWithBlankHashMapPayloadOnDefaultRequestReceived()
235 "\t--------------Sign Out With Blank HashMap Test------------");
236 SignOutWithBlankHashMapPayload();
237 assertTrue(methodCheck(res, ResponseStatus.PRECONDITION_FAILED));
240 public void SignInWithInvalidMethod(String di, String accessToken)
242 System.out.println("-----Sign In With Invalid Method (GET)");
243 IRequest request = null;
244 request = SignInWithInvalidMethodRequest(di, accessToken);
245 receiver.channelRead(ctx, request);
248 public void SignIn(String di, String accessToken) throws Exception {
249 System.out.println("-----Sign In");
250 IRequest request = null;
251 request = SignInRequest(di, accessToken);
252 receiver.channelRead(ctx, request);
255 public void SignInWithBlankHashMapPayload() throws Exception {
256 System.out.println("-----Sign In With Blank Hashmap Payload");
257 IRequest request = null;
258 request = SignInBlankHashmapPayloadRequest();
259 receiver.channelRead(ctx, request);
262 public void SignInWithNullPayload() throws Exception {
263 System.out.println("-----Sign In With Null Payload");
264 IRequest request = null;
265 request = SignInNullPayloadRequest();
266 receiver.channelRead(ctx, request);
269 public void SignOut(String di, String accessToken) throws Exception {
270 System.out.println("-----Sign Out");
271 IRequest request = null;
272 request = SignOutRequest(di, accessToken);
273 receiver.channelRead(ctx, request);
276 public void SignOutWithBlankHashMapPayload() throws Exception {
277 System.out.println("-----Sign Out With Blank Hashmap Payload");
278 IRequest request = null;
279 request = SignOutBlankHashmapPayloadRequest();
280 receiver.channelRead(ctx, request);
283 public void SignOutWithNullPayload() throws Exception {
284 System.out.println("-----Sign Out With Null Payload");
285 IRequest request = null;
286 request = SignOutNullPayloadRequest();
287 receiver.channelRead(ctx, request);
290 public IRequest SignInNullPayloadRequest() {
291 IRequest request = null;
292 request = MessageBuilder.createRequest(RequestMethod.POST,
293 DEFAULT_AUTH_LOGIN, null);
297 public IRequest SignInBlankHashmapPayloadRequest() {
298 IRequest request = null;
299 HashMap<String, Object> payloadData = new HashMap<String, Object>();
300 Cbor<HashMap<String, Object>> cbor = new Cbor<HashMap<String, Object>>();
301 request = MessageBuilder.createRequest(RequestMethod.POST,
302 DEFAULT_AUTH_LOGIN, null, ContentFormat.APPLICATION_CBOR,
303 cbor.encodingPayloadToCbor(payloadData));
307 public IRequest SignOutNullPayloadRequest() {
308 IRequest request = null;
309 request = MessageBuilder.createRequest(RequestMethod.POST,
310 DEFAULT_AUTH_LOGOUT, null);
314 public IRequest SignOutBlankHashmapPayloadRequest() {
315 IRequest request = null;
316 HashMap<String, Object> payloadData = new HashMap<String, Object>();
317 Cbor<HashMap<String, Object>> cbor = new Cbor<HashMap<String, Object>>();
318 request = MessageBuilder.createRequest(RequestMethod.POST,
319 DEFAULT_AUTH_LOGOUT, null, ContentFormat.APPLICATION_CBOR,
320 cbor.encodingPayloadToCbor(payloadData));
324 public IRequest SignInWithInvalidMethodRequest(String deviceId,
325 String accessToken) {
326 IRequest request = null;
327 HashMap<String, Object> payloadData = new HashMap<String, Object>();
328 payloadData.put("accesstoken", accessToken);
329 payloadData.put("status", true);
330 payloadData.put("di", deviceId);
331 Cbor<HashMap<String, Object>> cbor = new Cbor<HashMap<String, Object>>();
332 request = MessageBuilder.createRequest(RequestMethod.GET,
333 DEFAULT_AUTH_LOGIN, null, ContentFormat.APPLICATION_CBOR,
334 cbor.encodingPayloadToCbor(payloadData));
338 public IRequest SignInRequest(String deviceId, String accessToken) {
339 IRequest request = null;
340 HashMap<String, Object> payloadData = new HashMap<String, Object>();
341 payloadData.put("accesstoken", accessToken);
342 payloadData.put("login", true);
343 payloadData.put("di", deviceId);
344 payloadData.put("uid", uuid);
345 Cbor<HashMap<String, Object>> cbor = new Cbor<HashMap<String, Object>>();
346 request = MessageBuilder.createRequest(RequestMethod.POST,
347 DEFAULT_AUTH_LOGIN, null, ContentFormat.APPLICATION_CBOR,
348 cbor.encodingPayloadToCbor(payloadData));
352 public IRequest SignOutRequest(String deviceId, String accessToken) {
353 IRequest request = null;
354 HashMap<String, Object> payloadData = new HashMap<String, Object>();
355 payloadData.put("accesstoken", accessToken);
356 payloadData.put("login", false);
357 payloadData.put("di", deviceId);
358 payloadData.put("uid", uuid);
359 Cbor<HashMap<String, Object>> cbor = new Cbor<HashMap<String, Object>>();
360 request = MessageBuilder.createRequest(RequestMethod.POST,
361 DEFAULT_AUTH_LOGOUT, null, ContentFormat.APPLICATION_CBOR,
362 cbor.encodingPayloadToCbor(payloadData));
366 public boolean hashmapCheck(IResponse response, String propertyName) {
367 HashMap<String, Object> payloadData = mCbor
368 .parsePayloadFromCbor(response.getPayload(), HashMap.class);
369 if (payloadData.get(propertyName) != null)
375 public boolean methodCheck(IResponse response,
376 ResponseStatus responseStatus) {
377 if (responseStatus == response.getStatus())
383 private TokenTable makeTokenTable() {
384 TokenTable tokenInfo = new TokenTable();
385 tokenInfo.setUuid(uuid);
386 tokenInfo.setDid(di);
387 tokenInfo.setAccesstoken(accessToken);
388 tokenInfo.setRefreshtoken(refreshToken);
389 tokenInfo.setProvider(authProvider);
390 tokenInfo.setExpiredtime(-1);
391 Date currentTime = new Date();
392 DateFormat transFormat = new SimpleDateFormat("yyyyMMddkkmm");
393 tokenInfo.setIssuedtime(transFormat.format(currentTime));
397 private UserTable makeUserTable() {
398 UserTable userInfo = new UserTable();
399 userInfo.setUuid(uuid);
400 userInfo.setProvider(authProvider);
401 userInfo.setUserid("userId");