AS unit test included
authoryeonghun.nam <yeonghun.nam@samsung.com>
Thu, 11 Aug 2016 07:44:12 +0000 (16:44 +0900)
committerJee Hyeok Kim <jihyeok13.kim@samsung.com>
Fri, 12 Aug 2016 07:27:34 +0000 (07:27 +0000)
Change-Id: I0a0e56f12817843d14f82f361ad0e52c5496045f
Signed-off-by: yeonghun.nam <yeonghun.nam@samsung.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/10137
Tested-by: jenkins-iotivity <jenkins-iotivity@opendaylight.org>
Reviewed-by: Jee Hyeok Kim <jihyeok13.kim@samsung.com>
cloud/account/pom.xml
cloud/account/src/test/java/org/iotivity/cloud/accountserver/resources/account/AccountResourceTest.java [new file with mode: 0644]
cloud/account/src/test/java/org/iotivity/cloud/accountserver/resources/account/session/SessionResourceTest.java [new file with mode: 0644]
cloud/account/src/test/java/org/iotivity/cloud/accountserver/resources/acl/group/GroupResourceTest.java [new file with mode: 0644]

index c283b9f..77acc5b 100644 (file)
@@ -1,45 +1,46 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-  <groupId>org.iotivity.cloud</groupId>
-  <artifactId>CloudAccount</artifactId>
-  <version>0.0.1-SNAPSHOT</version>
-  
-  <properties>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+       <modelVersion>4.0.0</modelVersion>
+       <groupId>org.iotivity.cloud</groupId>
+       <artifactId>CloudAccount</artifactId>
+       <version>0.0.1-SNAPSHOT</version>
+
+       <properties>
                <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
                <maven.test.skip>true</maven.test.skip>
        </properties>
-       
-  <dependencies>
-               <dependency>
+
+       <dependencies>
+               <dependency>
                        <groupId>org.iotivity.cloud</groupId>
                        <artifactId>CloudStack</artifactId>
                        <version>0.0.1-SNAPSHOT</version>
                </dependency>
-               <dependency>
-                       <groupId>org.mongodb</groupId>
-                       <artifactId>mongo-java-driver</artifactId>
-                       <version>3.2.0</version>
-               </dependency>
-               <dependency>
-                       <groupId>org.apache.oltu.oauth2</groupId>
-                       <artifactId>org.apache.oltu.oauth2.client</artifactId>
-                       <version>1.0.1</version>
-               </dependency>
-               <dependency>
-                       <groupId>org.apache.oltu.oauth2</groupId>
-                       <artifactId>
+               <dependency>
+                       <groupId>org.mongodb</groupId>
+                       <artifactId>mongo-java-driver</artifactId>
+                       <version>3.2.0</version>
+               </dependency>
+               <dependency>
+                       <groupId>org.apache.oltu.oauth2</groupId>
+                       <artifactId>org.apache.oltu.oauth2.client</artifactId>
+                       <version>1.0.1</version>
+               </dependency>
+               <dependency>
+                       <groupId>org.apache.oltu.oauth2</groupId>
+                       <artifactId>
                                org.apache.oltu.oauth2.common
                        </artifactId>
-                       <version>1.0.1</version>
-               </dependency>
-               <dependency>
-                       <groupId>org.apache.oltu.oauth2</groupId>
-                       <artifactId>
+                       <version>1.0.1</version>
+               </dependency>
+               <dependency>
+                       <groupId>org.apache.oltu.oauth2</groupId>
+                       <artifactId>
                                org.apache.oltu.oauth2.authzserver
                        </artifactId>
-                       <version>1.0.1</version>
-               </dependency>
-               <dependency>
+                       <version>1.0.1</version>
+               </dependency>
+               <dependency>
                        <groupId>junit</groupId>
                        <artifactId>junit</artifactId>
                        <version>4.12</version>
                        <artifactId>awaitility</artifactId>
                        <version>1.7.0</version>
                </dependency>
+               <dependency>
+                       <groupId>org.powermock</groupId>
+                       <artifactId>powermock-api-mockito</artifactId>
+                       <version>1.6.5</version>
+                       <scope>test</scope>
+               </dependency>
+               <dependency>
+                       <groupId>org.powermock</groupId>
+                       <artifactId>powermock-core</artifactId>
+                       <version>1.6.5</version>
+                       <scope>test</scope>
+               </dependency>
+               <dependency>
+                       <groupId>org.powermock</groupId>
+                       <artifactId>powermock-module-junit4</artifactId>
+                       <version>1.6.5</version>
+                       <scope>test</scope>
+               </dependency>
 
                <!-- For security tasks(certificates, signature, keystore) -->
                <dependency>
@@ -70,9 +89,9 @@
                </dependency>
                <!-- For security tasks(certificates, signature, keystore) -->
 
-  </dependencies>
-       
-  <build>
+       </dependencies>
+
+       <build>
                <plugins>
                        <plugin>
                                <inherited>true</inherited>
                                        <overWriteIfNewer>true</overWriteIfNewer>
                                </configuration>
                        </plugin>
-               </plugins>              
+               </plugins>
        </build>
-  
+
 </project>
\ No newline at end of file
diff --git a/cloud/account/src/test/java/org/iotivity/cloud/accountserver/resources/account/AccountResourceTest.java b/cloud/account/src/test/java/org/iotivity/cloud/accountserver/resources/account/AccountResourceTest.java
new file mode 100644 (file)
index 0000000..8195bd2
--- /dev/null
@@ -0,0 +1,391 @@
+/*
+ * //******************************************************************
+ * //
+ * // Copyright 2016 Samsung Electronics All Rights Reserved.
+ * //
+ * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+ * //
+ * // Licensed under the Apache License, Version 2.0 (the "License");
+ * // you may not use this file except in compliance with the License.
+ * // You may obtain a copy of the License at
+ * //
+ * //      http://www.apache.org/licenses/LICENSE-2.0
+ * //
+ * // Unless required by applicable law or agreed to in writing, software
+ * // distributed under the License is distributed on an "AS IS" BASIS,
+ * // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * // See the License for the specific language governing permissions and
+ * // limitations under the License.
+ * //
+ * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+ */
+
+package org.iotivity.cloud.accountserver.resources.account;
+
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.concurrent.CountDownLatch;
+
+import org.iotivity.cloud.accountserver.Constants;
+import org.iotivity.cloud.accountserver.db.AccountDBManager;
+import org.iotivity.cloud.accountserver.db.TokenTable;
+import org.iotivity.cloud.accountserver.db.UserTable;
+import org.iotivity.cloud.accountserver.resources.acl.group.GroupResource;
+import org.iotivity.cloud.accountserver.util.TypeCastingManager;
+import org.iotivity.cloud.base.ServerSystem;
+import org.iotivity.cloud.base.ServerSystem.PersistentPacketReceiver;
+import org.iotivity.cloud.base.device.CoapDevice;
+import org.iotivity.cloud.base.device.Device;
+import org.iotivity.cloud.base.protocols.IRequest;
+import org.iotivity.cloud.base.protocols.IResponse;
+import org.iotivity.cloud.base.protocols.MessageBuilder;
+import org.iotivity.cloud.base.protocols.coap.CoapResponse;
+import org.iotivity.cloud.base.protocols.enums.ContentFormat;
+import org.iotivity.cloud.base.protocols.enums.RequestMethod;
+import org.iotivity.cloud.base.protocols.enums.ResponseStatus;
+import org.iotivity.cloud.util.Cbor;
+import org.iotivity.cloud.util.Log;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+
+import io.netty.channel.Channel;
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.channel.ChannelId;
+import io.netty.util.Attribute;
+
+public class AccountResourceTest {
+    private static final String            REGISTER_URI              = "/.well-known/ocf/account";
+    private static final String            GROUP_URI                 = "/.well-known/ocf/acl/group";
+    private String                         di                        = "B371C481-38E6-4D47-8320-7688D8A5B58C";
+    private String                         authProvider              = "Github";
+    private String                         authCode                  = "7af49183966f84e553dc";
+    String                                 userId                    = "testuser";
+    private CoapDevice                     mockDevice                = mock(
+            CoapDevice.class);
+    private Cbor<HashMap<String, Object>>  mCbor                     = new Cbor<>();
+    IResponse                              res                       = null;
+    ServerSystem                           serverSystem              = new ServerSystem();
+    final CountDownLatch                   latch                     = new CountDownLatch(
+            1);
+    private TypeCastingManager<UserTable>  mUserTableCastingManager  = new TypeCastingManager<>();
+    private TypeCastingManager<TokenTable> mTokenTableCastingManager = new TypeCastingManager<>();
+
+    @Mock
+    ChannelHandlerContext                  ctx;
+
+    @InjectMocks
+    PersistentPacketReceiver               receiver                  = serverSystem.new PersistentPacketReceiver();
+
+    @Before
+    public void setUp() throws Exception {
+        // create log file
+        Log.createfile();
+        // add resource
+        serverSystem.addResource(new AccountResource());
+        serverSystem.addResource(new GroupResource());
+        MockitoAnnotations.initMocks(this);
+        ChannelId channelId = mock(ChannelId.class);
+        // inject mocked coapDevice into the api
+        Channel channel = mock(Channel.class);
+        Attribute<Device> attribute = mock(Attribute.class);
+        Mockito.doReturn(channel).when(ctx).channel();
+        Mockito.doReturn(attribute).when(channel).attr(Mockito.any());
+        Mockito.doReturn(mockDevice).when(attribute).get();
+        Mockito.doReturn(channelId).when(channel).id();
+        Mockito.doReturn(
+                "0000000141f3edcfc2c3000000000001d0000000000000000000000000000000000000")
+                .when(channelId).asLongText();
+        Mockito.doAnswer(new Answer<Object>() {
+            @Override
+            public CoapResponse answer(InvocationOnMock invocation)
+                    throws Throwable {
+                Object[] args = invocation.getArguments();
+                CoapResponse resp = (CoapResponse) args[0];
+                System.out.println(
+                        "\t----Exception responsestatus : " + resp.getStatus());
+                res = resp;
+                latch.countDown();
+                return null;
+            }
+        }).when(channel).writeAndFlush(Mockito.any());
+        // callback mock
+        Mockito.doAnswer(new Answer<Object>() {
+            @Override
+            public CoapResponse answer(InvocationOnMock invocation)
+                    throws Throwable {
+                Object[] args = invocation.getArguments();
+                CoapResponse resp = (CoapResponse) args[0];
+                System.out
+                        .println("\t----payload : " + resp.getPayloadString());
+                System.out
+                        .println("\t----responsestatus : " + resp.getStatus());
+                res = resp;
+                return resp;
+            }
+        }).when(mockDevice).sendResponse(Mockito.anyObject());
+        receiver.channelActive(ctx);
+    }
+
+    @After
+    public void end() throws Exception {
+        receiver.channelInactive(ctx);
+    }
+
+    @Test
+    public void testSignUpOnDefaultRequestReceived() throws Exception {
+        System.out.println("\t--------------Sign Up Test------------");
+        signUp(di, authProvider, authCode);
+        assertTrue(methodCheck(res, ResponseStatus.CHANGED));
+        assertTrue(hashmapCheck(res, "accesstoken"));
+        assertTrue(hashmapCheck(res, "refreshtoken"));
+        assertTrue(hashmapCheck(res, "tokentype"));
+        assertTrue(hashmapCheck(res, "uid"));
+    }
+
+    @Test
+    public void testSignUpwithWrongAuthCodeOnDefaultRequestReceived()
+            throws Exception {
+        System.out.println(
+                "\t--------------Sign Up with Wrong AuthCode Test------------");
+        String wrongAuthCode = "5fc4fcf376f8d7087a3a";
+        signUp(di, authProvider, wrongAuthCode);
+        assertTrue(methodCheck(res, ResponseStatus.INTERNAL_SERVER_ERROR));
+    }
+
+    @Test
+    public void testSignUpNullAuthProviderOnDefaultRequestReceived()
+            throws Exception {
+        System.out.println(
+                "\t--------------Sign Up Null AuthProvider Test------------");
+        signUp(di, null, authCode);
+        assertTrue(methodCheck(res, ResponseStatus.PRECONDITION_FAILED));
+    }
+
+    @Test
+    public void testSignUpNullAuthCodeOnDefaultRequestReceived()
+            throws Exception {
+        System.out.println(
+                "\t--------------Sign Up with Null AuthCode Test------------");
+        signUp(di, authProvider, null);
+        assertTrue(methodCheck(res, ResponseStatus.PRECONDITION_FAILED));
+    }
+
+    @Test
+    public void testSignUpNullDiOnDefaultRequestReceived() throws Exception {
+        System.out.println(
+                "\t--------------Sign Up with Null DeviceId Test------------");
+        signUp(null, authProvider, authCode);
+        assertTrue(methodCheck(res, ResponseStatus.PRECONDITION_FAILED));
+    }
+
+    @Test
+    public void testSignUpInvalidMethodOnDefaultRequestReceived()
+            throws Exception {
+        System.out.println(
+                "\t--------------Sign Up with Invalid Method (GET) Test------------");
+        signUpInvalidMethod(di, authProvider, authCode);
+        assertTrue(methodCheck(res, ResponseStatus.BAD_REQUEST));
+    }
+
+    @Test
+    public void testDeleteDeviceOnDefaultRequestReceived() throws Exception {
+        System.out.println(
+                "\t--------------Delete Device from all Groups Test------------");
+        // register the token table and user table to the DB
+        String uuid = "u0001";
+        HashMap<String, Object> tokenInfo = mTokenTableCastingManager
+                .convertObjectToMap(makeTokenTable(uuid));
+        HashMap<String, Object> userInfo = mUserTableCastingManager
+                .convertObjectToMap(makeUserTable(uuid));
+        AccountDBManager.getInstance()
+                .insertAndReplaceRecord(Constants.TOKEN_TABLE, tokenInfo);
+        AccountDBManager.getInstance().insertRecord(Constants.USER_TABLE,
+                userInfo);
+        createDefaultGroup(uuid);
+        shareDevice(ctx, di);
+        deleteDevice(di);
+        assertTrue(methodCheck(res, ResponseStatus.DELETED));
+    }
+
+    // @Test
+    public void testGetUserInfoUsingUuidOnDefaultRequestReceived()
+            throws Exception {
+        System.out.println(
+                "\t--------------Sign Up with Invalid Method (GET) Test------------");
+        // register the token table and user table to the DB
+        String uuid = "u0001Get";
+        HashMap<String, Object> tokenInfo = mTokenTableCastingManager
+                .convertObjectToMap(makeTokenTable(uuid));
+        HashMap<String, Object> userInfo = mUserTableCastingManager
+                .convertObjectToMap(makeUserTable(uuid));
+        AccountDBManager.getInstance()
+                .insertAndReplaceRecord(Constants.TOKEN_TABLE, tokenInfo);
+        AccountDBManager.getInstance().insertRecord(Constants.USER_TABLE,
+                userInfo);
+        getUserInfoUsingUuid(uuid);
+        assertTrue(methodCheck(res, ResponseStatus.CONTENT));
+    }
+
+    public void getUserInfoUsingUuid(String uuid) throws Exception {
+        System.out.println("-----Get User Info : " + uuid);
+        IRequest request = null;
+        request = getUserInfoUsingUuidRequest(uuid);
+        receiver.channelRead(ctx, request);
+    }
+
+    public IRequest getUserInfoUsingUuidRequest(String uuid) {
+        IRequest request = MessageBuilder.createRequest(RequestMethod.GET,
+                REGISTER_URI, "uid=" + uuid);
+        return request;
+    }
+
+    public void createDefaultGroup(String uuid) throws Exception {
+        System.out.println("-----Create Default Group");
+        IRequest request = null;
+        request = createDefaultGroupRequest(uuid);
+        receiver.channelRead(ctx, request);
+    }
+
+    public void deleteDevice(String di) throws Exception {
+        System.out.println("-----Delete Device");
+        IRequest request = null;
+        request = deleteDeviceRequest(di);
+        receiver.channelRead(ctx, request);
+    }
+
+    public void signUp(String di, String authProvider, String authCode)
+            throws Exception {
+        System.out.println("-----Sign Up");
+        IRequest request = null;
+        request = signUpRequest(di, authProvider, authCode);
+        receiver.channelRead(ctx, request);
+    }
+
+    public void signUpInvalidMethod(String di, String authProvider,
+            String authCode) throws Exception {
+        System.out.println("-----Sign Up Invalid RequestMethod");
+        IRequest request = null;
+        request = signUpInvalidMethodRequest(di, authProvider, authCode);
+        receiver.channelRead(ctx, request);
+    }
+
+    public void shareDevice(ChannelHandlerContext ctx, String deviceId)
+            throws Exception {
+        System.out.println("-----Share Device");
+        IRequest request = null;
+        request = createShareDeviceRequest(deviceId);
+        receiver.channelRead(ctx, request);
+    }
+
+    public IRequest deleteDeviceRequest(String deviceId) {
+        IRequest request = MessageBuilder.createRequest(RequestMethod.DELETE,
+                REGISTER_URI, "di=" + deviceId + ";uid=u0001");
+        return request;
+    }
+
+    public IRequest createDefaultGroupRequest(String uuid) {
+        IRequest request = null;
+        HashMap<String, String> payloadData = new HashMap<String, String>();
+        payloadData.put("gmid", uuid);
+        payloadData.put("gtype", "Private");
+        Cbor<HashMap<String, String>> cbor = new Cbor<HashMap<String, String>>();
+        request = MessageBuilder.createRequest(RequestMethod.POST, GROUP_URI,
+                null, ContentFormat.APPLICATION_CBOR,
+                cbor.encodingPayloadToCbor(payloadData));
+        return request;
+    }
+
+    public IRequest createShareDeviceRequest(String deviceId) {
+        IRequest request = null;
+        HashMap<String, Object> payloadData = new HashMap<String, Object>();
+        ArrayList<String> diList = new ArrayList<>();
+        diList.add(deviceId);
+        payloadData.put("dilist", diList);
+        Cbor<HashMap<String, Object>> cbor = new Cbor<HashMap<String, Object>>();
+        request = MessageBuilder.createRequest(RequestMethod.POST,
+                GROUP_URI + "/" + "u0001", null, ContentFormat.APPLICATION_CBOR,
+                cbor.encodingPayloadToCbor(payloadData));
+        return request;
+    }
+
+    public IRequest signUpRequest(String deviceId, String authProvider,
+            String authCode) {
+        IRequest request = null;
+        HashMap<String, String> payloadData = new HashMap<String, String>();
+        payloadData.put("authcode", authCode);
+        payloadData.put("authprovider", authProvider);
+        payloadData.put("di", deviceId);
+        Cbor<HashMap<String, String>> cbor = new Cbor<HashMap<String, String>>();
+        request = MessageBuilder.createRequest(RequestMethod.POST, REGISTER_URI,
+                null, ContentFormat.APPLICATION_CBOR,
+                cbor.encodingPayloadToCbor(payloadData));
+        return request;
+    }
+
+    public IRequest signUpInvalidMethodRequest(String deviceId,
+            String authProvider, String authCode) {
+        IRequest request = null;
+        HashMap<String, String> payloadData = new HashMap<String, String>();
+        payloadData.put("authcode", authCode);
+        payloadData.put("authprovider", authProvider);
+        payloadData.put("di", deviceId);
+        Cbor<HashMap<String, String>> cbor = new Cbor<HashMap<String, String>>();
+        request = MessageBuilder.createRequest(RequestMethod.GET, REGISTER_URI,
+                null, ContentFormat.APPLICATION_CBOR,
+                cbor.encodingPayloadToCbor(payloadData));
+        return request;
+    }
+
+    public boolean hashmapCheck(IResponse response, String propertyName) {
+        HashMap<String, Object> payloadData = mCbor
+                .parsePayloadFromCbor(response.getPayload(), HashMap.class);
+        if (payloadData.containsKey(propertyName))
+            return true;
+        else
+            return false;
+    }
+
+    public boolean methodCheck(IResponse response,
+            ResponseStatus responseStatus) {
+        if (responseStatus == response.getStatus())
+            return true;
+        else
+            return false;
+    }
+
+    private TokenTable makeTokenTable(String uuid) {
+        TokenTable tokenInfo = new TokenTable();
+        tokenInfo.setUuid(uuid);
+        tokenInfo.setDid(di);
+        tokenInfo.setAccesstoken("at0001");
+        tokenInfo.setRefreshtoken("rt0001");
+        tokenInfo.setProvider(authProvider);
+        tokenInfo.setExpiredtime(-1);
+        Date currentTime = new Date();
+        DateFormat transFormat = new SimpleDateFormat("yyyyMMddkkmm");
+        tokenInfo.setIssuedtime(transFormat.format(currentTime));
+        return tokenInfo;
+    }
+
+    private UserTable makeUserTable(String uuid) {
+        UserTable userInfo = new UserTable();
+        userInfo.setUuid(uuid);
+        userInfo.setProvider(authProvider);
+        userInfo.setUserid("userId");
+        return userInfo;
+    }
+
+}
diff --git a/cloud/account/src/test/java/org/iotivity/cloud/accountserver/resources/account/session/SessionResourceTest.java b/cloud/account/src/test/java/org/iotivity/cloud/accountserver/resources/account/session/SessionResourceTest.java
new file mode 100644 (file)
index 0000000..579e6be
--- /dev/null
@@ -0,0 +1,404 @@
+/*
+ * //******************************************************************
+ * //
+ * // Copyright 2016 Samsung Electronics All Rights Reserved.
+ * //
+ * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+ * //
+ * // Licensed under the Apache License, Version 2.0 (the "License");
+ * // you may not use this file except in compliance with the License.
+ * // You may obtain a copy of the License at
+ * //
+ * //      http://www.apache.org/licenses/LICENSE-2.0
+ * //
+ * // Unless required by applicable law or agreed to in writing, software
+ * // distributed under the License is distributed on an "AS IS" BASIS,
+ * // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * // See the License for the specific language governing permissions and
+ * // limitations under the License.
+ * //
+ * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+ */
+
+package org.iotivity.cloud.accountserver.resources.account.session;
+
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.concurrent.CountDownLatch;
+
+import org.iotivity.cloud.accountserver.Constants;
+import org.iotivity.cloud.accountserver.db.AccountDBManager;
+import org.iotivity.cloud.accountserver.db.TokenTable;
+import org.iotivity.cloud.accountserver.db.UserTable;
+import org.iotivity.cloud.accountserver.util.TypeCastingManager;
+import org.iotivity.cloud.base.ServerSystem;
+import org.iotivity.cloud.base.ServerSystem.PersistentPacketReceiver;
+import org.iotivity.cloud.base.device.CoapDevice;
+import org.iotivity.cloud.base.device.Device;
+import org.iotivity.cloud.base.protocols.IRequest;
+import org.iotivity.cloud.base.protocols.IResponse;
+import org.iotivity.cloud.base.protocols.MessageBuilder;
+import org.iotivity.cloud.base.protocols.coap.CoapResponse;
+import org.iotivity.cloud.base.protocols.enums.ContentFormat;
+import org.iotivity.cloud.base.protocols.enums.RequestMethod;
+import org.iotivity.cloud.base.protocols.enums.ResponseStatus;
+import org.iotivity.cloud.util.Cbor;
+import org.iotivity.cloud.util.Log;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+
+import io.netty.channel.Channel;
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.channel.ChannelId;
+import io.netty.util.Attribute;
+
+public class SessionResourceTest {
+    private final String                   DEFAULT_AUTH_LOGIN        = "/.well-known/ocf/account/session";
+    private final String                   DEFAULT_AUTH_LOGOUT       = "/.well-known/ocf/account/session";
+    private String                         di                        = "d0001";
+    private String                         accessToken               = "5f5536c896da7dd437316585b86ef9dd03441c40";
+    private String                         refreshToken              = "rt0001";
+    private TypeCastingManager<UserTable>  mUserTableCastingManager  = new TypeCastingManager<>();
+    private TypeCastingManager<TokenTable> mTokenTableCastingManager = new TypeCastingManager<>();
+    ServerSystem                           serverSystem              = new ServerSystem();
+    final CountDownLatch                   latch                     = new CountDownLatch(
+            1);
+    private String                         uuid                      = "bc38f243-aab5-44d3-8eb9-4a54ebbaf359";
+    private String                         authProvider              = "github";
+    private CoapDevice                     mockDevice                = Mockito
+            .mock(CoapDevice.class);
+    private Cbor<HashMap<String, Object>>  mCbor                     = new Cbor<>();
+    IResponse                              res                       = null;
+
+    @Mock
+    ChannelHandlerContext                  ctx;
+
+    @InjectMocks
+    PersistentPacketReceiver               receiver                  = serverSystem.new PersistentPacketReceiver();
+
+    @Before
+    public void setUp() throws Exception {
+        // create log file
+        Log.createfile();
+        // add resource
+        serverSystem.addResource(new SessionResource());
+        MockitoAnnotations.initMocks(this);
+        ChannelId channelId = mock(ChannelId.class);
+        // inject mocked coapDevice into the api
+        Channel channel = mock(Channel.class);
+        Attribute<Device> attribute = mock(Attribute.class);
+        Mockito.doReturn(channel).when(ctx).channel();
+        Mockito.doReturn(attribute).when(channel).attr(Mockito.any());
+        Mockito.doReturn(mockDevice).when(attribute).get();
+        Mockito.doReturn(channelId).when(channel).id();
+        Mockito.doReturn(
+                "0000000141f3edcfc2c3000000000001d0000000000000000000000000000000000000")
+                .when(channelId).asLongText();
+        // register the token table and user table to the DB
+        HashMap<String, Object> tokenInfo = mTokenTableCastingManager
+                .convertObjectToMap(makeTokenTable());
+        HashMap<String, Object> userInfo = mUserTableCastingManager
+                .convertObjectToMap(makeUserTable());
+        AccountDBManager.getInstance()
+                .insertAndReplaceRecord(Constants.TOKEN_TABLE, tokenInfo);
+        AccountDBManager.getInstance().insertRecord(Constants.USER_TABLE,
+                userInfo);
+        // response handler mock
+        Mockito.doAnswer(new Answer<Object>() {
+            @Override
+            public CoapResponse answer(InvocationOnMock invocation)
+                    throws Throwable {
+
+                Object[] args = invocation.getArguments();
+                CoapResponse resp = (CoapResponse) args[0];
+                System.out.println(
+                        "\t----------payload : " + resp.getPayloadString());
+                System.out.println("\t---------method : " + resp.getMethod());
+                res = resp;
+                latch.countDown();
+                return resp;
+            }
+        }).when(mockDevice).sendResponse(Mockito.anyObject());
+        // exception handler mock
+        Mockito.doAnswer(new Answer<Object>() {
+            @Override
+            public CoapResponse answer(InvocationOnMock invocation)
+                    throws Throwable {
+                Object[] args = invocation.getArguments();
+                CoapResponse resp = (CoapResponse) args[0];
+                System.out.println("\t----exception response status : "
+                        + resp.getStatus());
+                res = resp;
+                latch.countDown();
+                return null;
+            }
+        }).when(channel).writeAndFlush(Mockito.any());
+    }
+
+    @After
+    public void endTest() {
+        AccountDBManager.getInstance().deleteRecord(Constants.TOKEN_TABLE,
+                mTokenTableCastingManager.convertObjectToMap(makeTokenTable()));
+        AccountDBManager.getInstance().deleteRecord(Constants.USER_TABLE,
+                mUserTableCastingManager.convertObjectToMap(makeUserTable()));
+    }
+
+    @Test
+    public void testSignInOnDefaultRequestReceived() throws Exception {
+        System.out.println("\t--------------Sign In Test------------");
+        SignIn(di, accessToken);
+        assertTrue(hashmapCheck(res, "expiresin"));
+        assertTrue(methodCheck(res, ResponseStatus.CHANGED));
+    }
+
+    @Test
+    public void testSignInWithInvalidMethodOnDefaultRequestReceived()
+            throws Exception {
+        System.out.println(
+                "\t--------------Sign In With Invalid RequestMethod Test------------");
+        SignInWithInvalidMethod(di, accessToken);
+        assertTrue(methodCheck(res, ResponseStatus.BAD_REQUEST));
+    }
+
+    @Test
+    public void testWrongAccessTokenSignInOnDefaultRequestReceived()
+            throws Exception {
+        System.out.println(
+                "\t--------------Wrong AccessToken Sign In Test------------");
+        String accessTokenNotStored = "5689c70ffa245effc563017fee36d250";
+        // sign in request
+        SignIn(di, accessTokenNotStored);
+        assertTrue(methodCheck(res, ResponseStatus.UNAUTHORIZED));
+    }
+
+    @Test
+    public void testInvalidDeviceIdSignInOnDefaultRequestReceived()
+            throws Exception {
+        System.out.println(
+                "\t--------------Invalid DeviceId Sign In Test------------");
+        String diNotStored = "F371C481-38E6-4D47-8320-7688D8A5B58C";
+        SignIn(diNotStored, accessToken);
+        assertTrue(methodCheck(res, ResponseStatus.UNAUTHORIZED));
+    }
+
+    @Test
+    public void testSignOutOnDefaultRequestReceived() throws Exception {
+        System.out.println("\t--------------Sign Out Test------------");
+        SignOut(di, accessToken);
+        assertTrue(methodCheck(res, ResponseStatus.CHANGED));
+    }
+
+    @Test
+    public void testSignInWithNullPayloadOnDefaultRequestReceived()
+            throws Exception {
+        System.out.println(
+                "\t--------------Sign In With Null Payload Test------------");
+        SignInWithNullPayload();
+        assertTrue(methodCheck(res, ResponseStatus.BAD_REQUEST));
+    }
+
+    @Test
+    public void testSignOutWithNullPayloadOnDefaultRequestReceived()
+            throws Exception {
+        System.out.println(
+                "\t--------------Sign Out With Null Payload Test------------");
+        // sign out request
+        SignOutWithNullPayload();
+        assertTrue(methodCheck(res, ResponseStatus.BAD_REQUEST));
+    }
+
+    @Test
+    public void testSignInWithBlankHashMapPayloadOnDefaultRequestReceived()
+            throws Exception {
+        System.out.println(
+                "\t--------------Sign In With Blank HashMap Payload Test------------");
+        SignInWithBlankHashMapPayload();
+        assertTrue(methodCheck(res, ResponseStatus.PRECONDITION_FAILED));
+    }
+
+    @Test
+    public void testSignOutWithBlankHashMapPayloadOnDefaultRequestReceived()
+            throws Exception {
+        System.out.println(
+                "\t--------------Sign Out With Blank HashMap Test------------");
+        SignOutWithBlankHashMapPayload();
+        assertTrue(methodCheck(res, ResponseStatus.PRECONDITION_FAILED));
+    }
+
+    public void SignInWithInvalidMethod(String di, String accessToken)
+            throws Exception {
+        System.out.println("-----Sign In With Invalid Method (GET)");
+        IRequest request = null;
+        request = SignInWithInvalidMethodRequest(di, accessToken);
+        receiver.channelRead(ctx, request);
+    }
+
+    public void SignIn(String di, String accessToken) throws Exception {
+        System.out.println("-----Sign In");
+        IRequest request = null;
+        request = SignInRequest(di, accessToken);
+        receiver.channelRead(ctx, request);
+    }
+
+    public void SignInWithBlankHashMapPayload() throws Exception {
+        System.out.println("-----Sign In With Blank Hashmap Payload");
+        IRequest request = null;
+        request = SignInBlankHashmapPayloadRequest();
+        receiver.channelRead(ctx, request);
+    }
+
+    public void SignInWithNullPayload() throws Exception {
+        System.out.println("-----Sign In With Null Payload");
+        IRequest request = null;
+        request = SignInNullPayloadRequest();
+        receiver.channelRead(ctx, request);
+    }
+
+    public void SignOut(String di, String accessToken) throws Exception {
+        System.out.println("-----Sign Out");
+        IRequest request = null;
+        request = SignOutRequest(di, accessToken);
+        receiver.channelRead(ctx, request);
+    }
+
+    public void SignOutWithBlankHashMapPayload() throws Exception {
+        System.out.println("-----Sign Out With Blank Hashmap Payload");
+        IRequest request = null;
+        request = SignOutBlankHashmapPayloadRequest();
+        receiver.channelRead(ctx, request);
+    }
+
+    public void SignOutWithNullPayload() throws Exception {
+        System.out.println("-----Sign Out With Null Payload");
+        IRequest request = null;
+        request = SignOutNullPayloadRequest();
+        receiver.channelRead(ctx, request);
+    }
+
+    public IRequest SignInNullPayloadRequest() {
+        IRequest request = null;
+        request = MessageBuilder.createRequest(RequestMethod.POST,
+                DEFAULT_AUTH_LOGIN, null);
+        return request;
+    }
+
+    public IRequest SignInBlankHashmapPayloadRequest() {
+        IRequest request = null;
+        HashMap<String, Object> payloadData = new HashMap<String, Object>();
+        Cbor<HashMap<String, Object>> cbor = new Cbor<HashMap<String, Object>>();
+        request = MessageBuilder.createRequest(RequestMethod.POST,
+                DEFAULT_AUTH_LOGIN, null, ContentFormat.APPLICATION_CBOR,
+                cbor.encodingPayloadToCbor(payloadData));
+        return request;
+    }
+
+    public IRequest SignOutNullPayloadRequest() {
+        IRequest request = null;
+        request = MessageBuilder.createRequest(RequestMethod.POST,
+                DEFAULT_AUTH_LOGOUT, null);
+        return request;
+    }
+
+    public IRequest SignOutBlankHashmapPayloadRequest() {
+        IRequest request = null;
+        HashMap<String, Object> payloadData = new HashMap<String, Object>();
+        Cbor<HashMap<String, Object>> cbor = new Cbor<HashMap<String, Object>>();
+        request = MessageBuilder.createRequest(RequestMethod.POST,
+                DEFAULT_AUTH_LOGOUT, null, ContentFormat.APPLICATION_CBOR,
+                cbor.encodingPayloadToCbor(payloadData));
+        return request;
+    }
+
+    public IRequest SignInWithInvalidMethodRequest(String deviceId,
+            String accessToken) {
+        IRequest request = null;
+        HashMap<String, Object> payloadData = new HashMap<String, Object>();
+        payloadData.put("accesstoken", accessToken);
+        payloadData.put("status", true);
+        payloadData.put("di", deviceId);
+        Cbor<HashMap<String, Object>> cbor = new Cbor<HashMap<String, Object>>();
+        request = MessageBuilder.createRequest(RequestMethod.GET,
+                DEFAULT_AUTH_LOGIN, null, ContentFormat.APPLICATION_CBOR,
+                cbor.encodingPayloadToCbor(payloadData));
+        return request;
+    }
+
+    public IRequest SignInRequest(String deviceId, String accessToken) {
+        IRequest request = null;
+        HashMap<String, Object> payloadData = new HashMap<String, Object>();
+        payloadData.put("accesstoken", accessToken);
+        payloadData.put("login", true);
+        payloadData.put("di", deviceId);
+        payloadData.put("uid", uuid);
+        Cbor<HashMap<String, Object>> cbor = new Cbor<HashMap<String, Object>>();
+        request = MessageBuilder.createRequest(RequestMethod.POST,
+                DEFAULT_AUTH_LOGIN, null, ContentFormat.APPLICATION_CBOR,
+                cbor.encodingPayloadToCbor(payloadData));
+        return request;
+    }
+
+    public IRequest SignOutRequest(String deviceId, String accessToken) {
+        IRequest request = null;
+        HashMap<String, Object> payloadData = new HashMap<String, Object>();
+        payloadData.put("accesstoken", accessToken);
+        payloadData.put("login", false);
+        payloadData.put("di", deviceId);
+        payloadData.put("uid", uuid);
+        Cbor<HashMap<String, Object>> cbor = new Cbor<HashMap<String, Object>>();
+        request = MessageBuilder.createRequest(RequestMethod.POST,
+                DEFAULT_AUTH_LOGOUT, null, ContentFormat.APPLICATION_CBOR,
+                cbor.encodingPayloadToCbor(payloadData));
+        return request;
+    }
+
+    public boolean hashmapCheck(IResponse response, String propertyName) {
+        HashMap<String, Object> payloadData = mCbor
+                .parsePayloadFromCbor(response.getPayload(), HashMap.class);
+        if (payloadData.get(propertyName) != null)
+            return true;
+        else
+            return false;
+    }
+
+    public boolean methodCheck(IResponse response,
+            ResponseStatus responseStatus) {
+        if (responseStatus == response.getStatus())
+            return true;
+        else
+            return false;
+    }
+
+    private TokenTable makeTokenTable() {
+        TokenTable tokenInfo = new TokenTable();
+        tokenInfo.setUuid(uuid);
+        tokenInfo.setDid(di);
+        tokenInfo.setAccesstoken(accessToken);
+        tokenInfo.setRefreshtoken(refreshToken);
+        tokenInfo.setProvider(authProvider);
+        tokenInfo.setExpiredtime(-1);
+        Date currentTime = new Date();
+        DateFormat transFormat = new SimpleDateFormat("yyyyMMddkkmm");
+        tokenInfo.setIssuedtime(transFormat.format(currentTime));
+        return tokenInfo;
+    }
+
+    private UserTable makeUserTable() {
+        UserTable userInfo = new UserTable();
+        userInfo.setUuid(uuid);
+        userInfo.setProvider(authProvider);
+        userInfo.setUserid("userId");
+        return userInfo;
+    }
+}
diff --git a/cloud/account/src/test/java/org/iotivity/cloud/accountserver/resources/acl/group/GroupResourceTest.java b/cloud/account/src/test/java/org/iotivity/cloud/accountserver/resources/acl/group/GroupResourceTest.java
new file mode 100644 (file)
index 0000000..3a94776
--- /dev/null
@@ -0,0 +1,383 @@
+
+/*
+ * //******************************************************************
+ * //
+ * // Copyright 2016 Samsung Electronics All Rights Reserved.
+ * //
+ * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+ * //
+ * // Licensed under the Apache License, Version 2.0 (the "License");
+ * // you may not use this file except in compliance with the License.
+ * // You may obtain a copy of the License at
+ * //
+ * //      http://www.apache.org/licenses/LICENSE-2.0
+ * //
+ * // Unless required by applicable law or agreed to in writing, software
+ * // distributed under the License is distributed on an "AS IS" BASIS,
+ * // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * // See the License for the specific language governing permissions and
+ * // limitations under the License.
+ * //
+ * //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+ */
+package org.iotivity.cloud.accountserver.resources.acl.group;
+
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.concurrent.CountDownLatch;
+
+import org.iotivity.cloud.accountserver.db.TokenTable;
+import org.iotivity.cloud.accountserver.db.UserTable;
+import org.iotivity.cloud.accountserver.util.TypeCastingManager;
+import org.iotivity.cloud.base.ServerSystem;
+import org.iotivity.cloud.base.ServerSystem.PersistentPacketReceiver;
+import org.iotivity.cloud.base.device.CoapDevice;
+import org.iotivity.cloud.base.device.Device;
+import org.iotivity.cloud.base.protocols.IRequest;
+import org.iotivity.cloud.base.protocols.IResponse;
+import org.iotivity.cloud.base.protocols.MessageBuilder;
+import org.iotivity.cloud.base.protocols.coap.CoapRequest;
+import org.iotivity.cloud.base.protocols.coap.CoapResponse;
+import org.iotivity.cloud.base.protocols.enums.ContentFormat;
+import org.iotivity.cloud.base.protocols.enums.Observe;
+import org.iotivity.cloud.base.protocols.enums.RequestMethod;
+import org.iotivity.cloud.base.protocols.enums.ResponseStatus;
+import org.iotivity.cloud.util.Cbor;
+import org.iotivity.cloud.util.Log;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+
+import io.netty.channel.Channel;
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.channel.ChannelId;
+import io.netty.util.Attribute;
+
+public class GroupResourceTest {
+    private static final String            GROUP_URI                 = "/.well-known/ocf/acl/group";
+    private String                         di                        = "d0001";
+    private String                         accessToken               = "5f5536c896da7dd437316585b86ef9dd03441c40";
+    private String                         refreshToken              = "rt0001";
+    private String                         gid                       = null;
+    private TypeCastingManager<UserTable>  mUserTableCastingManager  = new TypeCastingManager<>();
+    private TypeCastingManager<TokenTable> mTokenTableCastingManager = new TypeCastingManager<>();
+    ServerSystem                           serverSystem              = new ServerSystem();
+    final CountDownLatch                   latch                     = new CountDownLatch(
+            1);
+    private String                         uuid                      = "bc38f243-aab5-44d3-8eb9-4a54ebbaf359";
+    private String                         authProvider              = "github";
+    private CoapDevice                     mockDevice                = Mockito
+            .mock(CoapDevice.class);
+    private Cbor<HashMap<String, Object>>  mCbor                     = new Cbor<>();
+    IResponse                              res                       = null;
+    IResponse                              resObserver               = null;
+
+    @Mock
+    ChannelHandlerContext                  ctx;
+
+    @InjectMocks
+    PersistentPacketReceiver               receiver                  = serverSystem.new PersistentPacketReceiver();
+
+    @Before
+    public void setUp() throws Exception {
+        // create log file
+        Log.createfile();
+        // add resource
+        serverSystem.addResource(new GroupResource());
+        MockitoAnnotations.initMocks(this);
+        ChannelId channelId = mock(ChannelId.class);
+        // inject mocked coapDevice into the api
+        Channel channel = mock(Channel.class);
+        Attribute<Device> attribute = mock(Attribute.class);
+        Mockito.doReturn(channel).when(ctx).channel();
+        Mockito.doReturn(attribute).when(channel).attr(Mockito.any());
+        Mockito.doReturn(mockDevice).when(attribute).get();
+        Mockito.doReturn(channelId).when(channel).id();
+        Mockito.doReturn(
+                "0000000141f3edcfc2c3000000000001d0000000000000000000000000000000000000")
+                .when(channelId).asLongText();
+        Mockito.doAnswer(new Answer<Object>() {
+            @Override
+            public CoapResponse answer(InvocationOnMock invocation)
+                    throws Throwable {
+                Object[] args = invocation.getArguments();
+                CoapResponse resp = (CoapResponse) args[0];
+                System.out.println(
+                        "\t----------payload : " + resp.getPayloadString());
+                System.out.println("\t---------method : " + resp.getStatus());
+                res = resp;
+                HashMap<String, Object> payloadData = mCbor
+                        .parsePayloadFromCbor(resp.getPayload(), HashMap.class);
+                if (payloadData.containsKey("gid")) {
+                    gid = (String) payloadData.get("gid");
+                }
+                latch.countDown();
+                return resp;
+            }
+        }).when(mockDevice).sendResponse(Mockito.anyObject());
+    }
+
+    @Test
+    public void testCreateGroup() throws Exception {
+        System.out.println("\t--------------Create Group Test------------");
+        createGroup(ctx, uuid + "create", "Public");
+        assertTrue(methodCheck(res, ResponseStatus.CHANGED));
+        assertTrue(hashmapCheck(res, "gid"));
+
+    }
+
+    @Test
+    public void testFindMyGroup() throws Exception {
+        System.out.println("\t--------------Find My Group Test------------");
+        String uuid = this.uuid + "find";
+        createGroup(ctx, uuid, "Public");
+        findGroup(ctx, uuid);
+        assertTrue(methodCheck(res, ResponseStatus.CONTENT));
+        assertTrue(hashmapCheck(res, "gidlist"));
+    }
+
+    @Test
+    public void testDeleteGroup() throws Exception {
+        System.out.println("\t--------------Delete Group Test------------");
+        String uuid = this.uuid + "delete";
+        createGroup(ctx, uuid, "Public");
+        deleteGroup(ctx, uuid);
+        System.out.println("\t--------res : " + res.getStatus());
+        assertTrue(methodCheck(res, ResponseStatus.DELETED));
+    }
+
+    @Test
+    public void testJoinToinvitedGroup() throws Exception {
+        System.out.println(
+                "\t--------------Join to invited group Test------------");
+        String uuid = this.uuid + "join";
+        createGroup(ctx, uuid, "Public");
+        joinGroup(ctx, "u0002");
+        assertTrue(methodCheck(res, ResponseStatus.CHANGED));
+    }
+
+    @Test
+    public void testObserveGroup() throws Exception {
+        System.out.println("\t--------------Observe Group Test------------");
+        String uuid = this.uuid + "obs";
+        createGroup(ctx, uuid, "Public");
+        observeGroup(ctx, uuid);
+        assertTrue(methodCheck(res, ResponseStatus.CONTENT));
+        assertTrue(hashmapCheck(res, "gid"));
+        assertTrue(hashmapCheck(res, "gmid"));
+        assertTrue(hashmapCheck(res, "midlist"));
+        assertTrue(hashmapCheck(res, "dilist"));
+    }
+
+    @Test
+    public void testShareDeviceIntoGroup() throws Exception {
+        System.out.println(
+                "\t--------------Share device into group Test------------");
+        String uuid = this.uuid + "share";
+        createGroup(ctx, uuid, "Public");
+        shareDevice(ctx, "d0002");
+        assertTrue(methodCheck(res, ResponseStatus.CHANGED));
+    }
+
+    @Test
+    public void testShareDeviceNotification() throws Exception {
+        System.out.println(
+                "\t--------------Share device Notification into group Test------------");
+        String uuid = this.uuid + "share";
+        String uuidGuest = "u0002guest";
+        ChannelHandlerContext ctxGuest = mock(ChannelHandlerContext.class);
+        ChannelId channelIdGuest = mock(ChannelId.class);
+        CoapDevice mockDeviceGuest = mock(CoapDevice.class);
+        // inject mocked coapDevice into the api
+        Channel channelGuest = mock(Channel.class);
+        Attribute<Device> attributeGuest = mock(Attribute.class);
+        Mockito.doReturn(channelGuest).when(ctxGuest).channel();
+        Mockito.doReturn(attributeGuest).when(channelGuest).attr(Mockito.any());
+        Mockito.doReturn(mockDeviceGuest).when(attributeGuest).get();
+        Mockito.doReturn(channelIdGuest).when(channelGuest).id();
+        Mockito.doReturn(
+                "0000000141f3edcfc2c3000000000001d0000000000000000000000000000000000001")
+                .when(channelIdGuest).asLongText();
+        Mockito.doAnswer(new Answer<Object>() {
+            @Override
+            public CoapResponse answer(InvocationOnMock invocation)
+                    throws Throwable {
+                Object[] args = invocation.getArguments();
+                CoapResponse resp = (CoapResponse) args[0];
+                System.out.println("\t----------new member payload : "
+                        + resp.getPayloadString());
+                System.out.println(
+                        "\t---------new member method : " + resp.getStatus());
+                resObserver = resp;
+                return resp;
+            }
+        }).when(mockDeviceGuest).sendResponse(Mockito.anyObject());
+        createGroup(ctx, uuid, "Public");
+        joinGroup(ctxGuest, uuidGuest);
+        observeGroup(ctxGuest, uuidGuest);
+        shareDevice(ctx, "d0002");
+        // assertion for the group master
+        assertTrue(methodCheck(res, ResponseStatus.CHANGED));
+        // assertion for the observer
+        assertTrue(methodCheck(resObserver, ResponseStatus.CONTENT));
+
+    }
+
+    public void shareDevice(ChannelHandlerContext ctx, String deviceId)
+            throws Exception {
+        System.out.println("-----Share Device");
+        IRequest request = null;
+        request = createShareDeviceRequest(deviceId);
+        receiver.channelRead(ctx, request);
+    }
+
+    public IRequest createShareDeviceRequest(String deviceId) {
+        IRequest request = null;
+        HashMap<String, Object> payloadData = new HashMap<String, Object>();
+        ArrayList<String> diList = new ArrayList<>();
+        diList.add(deviceId);
+        payloadData.put("dilist", diList);
+        Cbor<HashMap<String, Object>> cbor = new Cbor<HashMap<String, Object>>();
+        request = MessageBuilder.createRequest(RequestMethod.POST,
+                GROUP_URI + "/" + gid, null, ContentFormat.APPLICATION_CBOR,
+                cbor.encodingPayloadToCbor(payloadData));
+        return request;
+    }
+
+    public void createGroup(ChannelHandlerContext ctx, String gmid,
+            String gtype) throws Exception {
+        System.out.println("-----Create Group");
+        IRequest request = null;
+        request = createGroupRequest(gmid, gtype);
+        receiver.channelRead(ctx, request);
+    }
+
+    public void findGroup(ChannelHandlerContext ctx, String uuid)
+            throws Exception {
+        System.out.println("-----Find Group");
+        IRequest request = null;
+        request = findGroupRequest(uuid);
+        receiver.channelRead(ctx, request);
+    }
+
+    public void observeGroup(ChannelHandlerContext ctx, String uuid)
+            throws Exception {
+        System.out.println("-----Observe Group");
+        IRequest request = null;
+        request = observeGroupRequest(uuid);
+        receiver.channelRead(ctx, request);
+    }
+
+    public void joinGroup(ChannelHandlerContext ctx, String uuid)
+            throws Exception {
+        System.out.println("-----Join Group");
+        IRequest request = null;
+        request = joinGroupRequest(uuid);
+        receiver.channelRead(ctx, request);
+    }
+
+    public void deleteGroup(ChannelHandlerContext ctx, String uuid)
+            throws Exception {
+        System.out.println("-----Delete Group");
+        IRequest request = null;
+        request = deleteGroupRequest(uuid);
+        receiver.channelRead(ctx, request);
+    }
+
+    public IRequest deleteGroupRequest(String uuid) {
+        IRequest request = null;
+        request = MessageBuilder.createRequest(RequestMethod.DELETE, GROUP_URI,
+                "gid=" + gid + ";" + "gmid=" + uuid);
+        return request;
+    }
+
+    public IRequest findGroupRequest(String uuid) {
+        IRequest request = null;
+        request = MessageBuilder.createRequest(RequestMethod.GET, GROUP_URI,
+                "mid=" + uuid);
+        return request;
+    }
+
+    public IRequest observeGroupRequest(String uuid) {
+        IRequest request = null;
+        request = MessageBuilder.createRequest(RequestMethod.GET,
+                GROUP_URI + "/" + gid, "mid=" + uuid);
+        ((CoapRequest) request).setObserve(Observe.SUBSCRIBE);
+        return request;
+    }
+
+    public IRequest joinGroupRequest(String uuid) {
+        IRequest request = null;
+        HashMap<String, Object> payloadData = new HashMap<String, Object>();
+        ArrayList<String> midList = new ArrayList<>();
+        midList.add(uuid);
+        payloadData.put("midlist", midList);
+        Cbor<HashMap<String, Object>> cbor = new Cbor<HashMap<String, Object>>();
+        request = MessageBuilder.createRequest(RequestMethod.POST,
+                GROUP_URI + "/" + gid, null, ContentFormat.APPLICATION_CBOR,
+                cbor.encodingPayloadToCbor(payloadData));
+        return request;
+    }
+
+    public IRequest createGroupRequest(String uuid, String gtype) {
+        IRequest request = null;
+        HashMap<String, Object> payloadData = new HashMap<String, Object>();
+        payloadData.put("gmid", uuid);
+        payloadData.put("gtype", gtype);
+        Cbor<HashMap<String, Object>> cbor = new Cbor<HashMap<String, Object>>();
+        request = MessageBuilder.createRequest(RequestMethod.POST, GROUP_URI,
+                null, ContentFormat.APPLICATION_CBOR,
+                cbor.encodingPayloadToCbor(payloadData));
+        return request;
+    }
+
+    public boolean hashmapCheck(IResponse response, String propertyName) {
+        HashMap<String, Object> payloadData = mCbor
+                .parsePayloadFromCbor(response.getPayload(), HashMap.class);
+        if (payloadData.containsKey(propertyName))
+            return true;
+        else
+            return false;
+    }
+
+    public boolean methodCheck(IResponse response,
+            ResponseStatus responseStatus) {
+        if (responseStatus == response.getStatus())
+            return true;
+        else
+            return false;
+    }
+
+    private TokenTable makeTokenTable() {
+        TokenTable tokenInfo = new TokenTable();
+        tokenInfo.setUuid(uuid);
+        tokenInfo.setDid(di);
+        tokenInfo.setAccesstoken(accessToken);
+        tokenInfo.setRefreshtoken(refreshToken);
+        tokenInfo.setProvider(authProvider);
+        tokenInfo.setExpiredtime(-1);
+        Date currentTime = new Date();
+        DateFormat transFormat = new SimpleDateFormat("yyyyMMddkkmm");
+        tokenInfo.setIssuedtime(transFormat.format(currentTime));
+        return tokenInfo;
+    }
+
+    private UserTable makeUserTable() {
+        UserTable userInfo = new UserTable();
+        userInfo.setUuid(uuid);
+        userInfo.setProvider(authProvider);
+        userInfo.setUserid("userId");
+        return userInfo;
+    }
+}