Add Scene Manager Local-side Unittest & Fixed Logic Bug
authorChaJiwon <jw_wonny.cha@samsung.com>
Fri, 26 Feb 2016 12:33:37 +0000 (21:33 +0900)
committerUze Choi <uzchoi@samsung.com>
Mon, 29 Feb 2016 02:39:48 +0000 (02:39 +0000)
- Add Unittest
- Scene : fix addNewSceneActon logic

Change-Id: Ib687abf3852652b6a57cabaedb5cd9ebe9fb7c39
Signed-off-by: ChaJiWon <jw_wonny.cha@samsung.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/5231
Tested-by: jenkins-iotivity <jenkins-iotivity@opendaylight.org>
Reviewed-by: Uze Choi <uzchoi@samsung.com>
service/scene-manager/SConscript
service/scene-manager/sampleapp/linux/SConscript
service/scene-manager/unittests/SConscript [new file with mode: 0755]
service/scene-manager/unittests/SceneActionTest.cpp [new file with mode: 0755]
service/scene-manager/unittests/SceneCollectionTest.cpp [new file with mode: 0755]
service/scene-manager/unittests/SceneListTest.cpp [new file with mode: 0755]
service/scene-manager/unittests/SceneTest.cpp [new file with mode: 0755]

index 2765c0c..9348578 100755 (executable)
@@ -48,6 +48,7 @@ scenemanager_env.AppendUnique(CPPPATH = ['../resource-encapsulation/include'])
 scenemanager_env.AppendUnique(CPPPATH = ['../resource-encapsulation/src/common/primitiveResource/include'])
 scenemanager_env.AppendUnique(CPPPATH = ['../resource-encapsulation/src/common/expiryTimer/include'])
 
+
 scenemanager_env.PrependUnique(LIBS = [
     'rcs_client',
     'rcs_server',
@@ -67,13 +68,15 @@ if target_os not in ['darwin', 'ios', 'windows', 'winrt']:
 
 if target_os == 'linux':
     scenemanager_env.AppendUnique(LIBS = ['pthread'])
+    
 
 if target_os == 'android':
     scenemanager_env.AppendUnique(CXXFLAGS = ['-frtti', '-fexceptions'])
     scenemanager_env.AppendUnique(LIBS = ['gnustl_shared','log'])
 
-    if not env.get('RELEASE'):
-        scenemanager_env.AppendUnique(LIBS = ['log'])
+if not env.get('RELEASE'):
+    scenemanager_env.PrependUnique(LIBS = ['gcov'])
+    scenemanager_env.AppendUnique(CXXFLAGS = ['--coverage'])
 
 ######################################################################
 # Source files and Targets
@@ -98,8 +101,8 @@ scenemanager_env.UserInstallTargetHeader('include/RemoteScene.h', 'service/scene
 scenemanager_env.UserInstallTargetHeader('include/RemoteSceneAction.h', 'service/scene-manager', 'RemoteSceneAction.h')
 
 # Go to build Unit test
-#if target_os == 'linux':
-#    SConscript('src/unittest/SConscript')
+if target_os == 'linux':
+    SConscript('unittests/SConscript')
 
 # Go to build sample apps
 SConscript('sampleapp/SConscript')
index 0332fb6..6946510 100755 (executable)
@@ -36,6 +36,9 @@ if env.get('SECURED') == '1':
 if 'rt' in scenemanager_sample_env.get('LIBS'):
     scenemanager_sample_env.Append(LIBS = ['rt'])
 
+if not env.get('RELEASE'):
+    scenemanager_sample_env.PrependUnique(LIBS = ['gcov'])
+    scenemanager_sample_env.AppendUnique(CXXFLAGS = ['--coverage'])
 ####################################################################
 # Source files and Targets
 ######################################################################
diff --git a/service/scene-manager/unittests/SConscript b/service/scene-manager/unittests/SConscript
new file mode 100755 (executable)
index 0000000..a0a41d0
--- /dev/null
@@ -0,0 +1,112 @@
+#******************************************************************
+#
+# Copyright 2015 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.
+#
+#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+
+##
+# SceneManager Unit Test build script
+##
+
+Import('env')
+
+if env.get('RELEASE'):
+    env.AppendUnique(CCFLAGS = ['-Os'])
+    env.AppendUnique(CPPDEFINES = ['NDEBUG'])
+else:
+    env.AppendUnique(CCFLAGS = ['-g'])
+
+if env.get('LOGGING'):
+    env.AppendUnique(CPPDEFINES = ['TB_LOG'])
+
+lib_env = env.Clone()
+SConscript(env.get('SRC_DIR') + '/service/third_party_libs.scons', 'lib_env')
+
+######################################################################
+#unit test setting
+######################################################################
+src_dir = lib_env.get('SRC_DIR')
+gtest_dir = src_dir + '/extlibs/gtest/gtest-1.7.0'
+
+scene_test_env = lib_env.Clone()
+target_os = env.get('TARGET_OS')
+
+######################################################################
+# Build flags
+######################################################################
+GTest = File(gtest_dir + '/lib/.libs/libgtest.a')
+GTest_Main = File(gtest_dir + '/lib/.libs/libgtest_main.a')
+
+#scene_test_env.AppendUnique(LIBPATH = [gtest_dir + '/lib/.libs'])
+scene_test_env.AppendUnique(LIBPATH = [lib_env.get('BUILD_DIR')])
+scene_test_env.AppendUnique(LIBS = [
+    'scene_manager', 'rcs_server', 'rcs_client','rcs_common',
+    'oc', 'octbstack', 'oc_logger', 'connectivity_abstraction', 'coap',
+    GTest_Main, GTest])
+
+if target_os not in ['windows', 'winrt']:
+    scene_test_env.AppendUnique(CXXFLAGS = ['-O2', '-g', '-Wall', '-fmessage-length=0', '-std=c++0x'])
+
+if target_os == 'linux':
+    scene_test_env.AppendUnique(CXXFLAGS = ['-pthread'])
+    scene_test_env.AppendUnique(LIBS = ['pthread'])
+
+if not env.get('RELEASE'):
+    scene_test_env.PrependUnique(LIBS = ['gcov'])
+    scene_test_env.AppendUnique(CXXFLAGS = ['--coverage'])
+
+scene_test_env.PrependUnique(CPPPATH = [ src_dir + '/extlibs/hippomocks-master',
+                             gtest_dir + '/include'])
+scene_test_env.AppendUnique(CPPPATH = ['../include'])
+scene_test_env.AppendUnique(CPPPATH = ['../src'])
+scene_test_env.AppendUnique(CPPPATH = ['../../resource-encapsulation/include'])
+scene_test_env.AppendUnique(CPPPATH = ['../../resource-encapsulation/src/common/primitiveResource/include'])
+scene_test_env.AppendUnique(CPPPATH = ['../../resource-encapsulation/src/common/utils/include'])
+######################################################################
+# Build Test
+######################################################################
+
+scene_list_test_src = env.Glob('./SceneListTest.cpp')
+scene_list_test = scene_test_env.Program('scene_list_test', scene_list_test_src)
+Alias("scene_list_test", scene_list_test)
+env.AppendTarget('scene_list_test')
+scene_test_env.InstallTarget(scene_list_test, 'scene_list_test')
+
+scene_collection_test_src = env.Glob('./SceneCollectionTest.cpp')
+scene_collection_test = scene_test_env.Program('scene_collection_test', scene_collection_test_src)
+Alias("scene_collection_test", scene_collection_test)
+env.AppendTarget('scene_collection_test')
+scene_test_env.InstallTarget(scene_collection_test, 'scene_collection_test')
+
+scene_test_src = env.Glob('./SceneTest.cpp')
+scene_test = scene_test_env.Program('scene_test', scene_test_src)
+Alias("scene_test", scene_test)
+env.AppendTarget('scene_test')
+scene_test_env.InstallTarget(scene_test, 'scene_test')
+
+scene_action_test_src = env.Glob('./SceneActionTest.cpp')
+scene_action_test = scene_test_env.Program('scene_action_test', scene_action_test_src)
+Alias("scene_action_test", scene_action_test)
+env.AppendTarget('scene_action_test')
+scene_test_env.InstallTarget(scene_action_test, 'scene_action_test')
+
+#target_os = env.get('TARGET_OS')
+#if target_os == 'linux':
+#        from tools.scons.RunTest import *
+#        run_test(scene_test_env,
+#                 '',
+#                 'service/scene-manager/unittest/scene_test')
diff --git a/service/scene-manager/unittests/SceneActionTest.cpp b/service/scene-manager/unittests/SceneActionTest.cpp
new file mode 100755 (executable)
index 0000000..dd57a88
--- /dev/null
@@ -0,0 +1,159 @@
+//******************************************************************
+//
+// Copyright 2015 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.
+//
+//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+
+#include "UnitTestHelper.h"
+
+#include "SceneList.h"
+#include "RCSResourceObject.h"
+#include "RCSRemoteResourceObject.h"
+#include "SceneCommons.h"
+#include "OCPlatform.h"
+
+using namespace std;
+using namespace OIC::Service;
+using namespace OC;
+
+typedef std::function<void (int)> ExecuteCallback;
+
+constexpr char RESOURCE_URI[]{ "/a/light" };
+constexpr char RESOURCE_TYPE[]{ "core.light" };
+constexpr char RESOURCE_URI2[]{ "/a/fan" };
+constexpr char RESOURCE_TYPE2[]{ "core.fan" };
+constexpr char KEY[]{ "power" };
+constexpr char VALUE[]{ "off" };
+constexpr char KEY_2[]{ "state" };
+constexpr char VALUE_2[]{ "100" };
+
+class SceneActionTest: public TestWithMock
+{
+protected:
+    void SetUp()
+    {
+        TestWithMock::SetUp();
+        pSceneList = SceneList::getInstance();
+    }
+
+    void createServer(const std::string& resourceUri1, const std::string& resourceUri2)
+    {
+        auto pResource1 = RCSResourceObject::Builder(
+                resourceUri1, RESOURCE_TYPE, DEFAULT_INTERFACE).build();
+        pResource1->setAttribute(KEY, VALUE);
+
+        auto ocResourcePtr = OC::OCPlatform::constructResourceObject(
+                "coap://" + SceneUtils::getNetAddress(), resourceUri1,
+                OCConnectivityType::CT_ADAPTER_IP, false,
+                pResource1->getTypes(), pResource1->getInterfaces());
+        pRemoteResource1 = RCSRemoteResourceObject::fromOCResource(ocResourcePtr);
+
+        auto pResource2 = RCSResourceObject::Builder(
+                resourceUri2, RESOURCE_TYPE2, DEFAULT_INTERFACE).build();
+        pResource2->setAttribute(KEY_2, VALUE_2);
+
+        ocResourcePtr = OC::OCPlatform::constructResourceObject(
+                        "coap://" + SceneUtils::getNetAddress(), resourceUri2,
+                        OCConnectivityType::CT_ADAPTER_IP, false,
+                        pResource2->getTypes(), pResource2->getInterfaces());
+        pRemoteResource2 = RCSRemoteResourceObject::fromOCResource(ocResourcePtr);
+    }
+
+    void createSceneCollectionAndScene()
+    {
+        auto pSceneCollection = pSceneList->addNewSceneCollection();
+        pScene1 = pSceneCollection->addNewScene("SceneTestName_1");
+    }
+
+    void createSceneAction()
+    {
+        pSceneAction1 = pScene1->addNewSceneAction(pRemoteResource1, KEY, VALUE);
+        pSceneAction2 = pScene1->addNewSceneAction(pRemoteResource2, KEY_2, VALUE_2);
+    }
+
+public:
+    SceneList* pSceneList;
+    shared_ptr<Scene> pScene1;
+    shared_ptr<Scene> pScene2;
+    shared_ptr<SceneAction> pSceneAction1;
+    shared_ptr<SceneAction> pSceneAction2;
+    RCSRemoteResourceObject::Ptr pRemoteResource1;
+    RCSRemoteResourceObject::Ptr pRemoteResource2;
+
+private:
+    std::condition_variable cond;
+    std::mutex mutex;
+};
+
+TEST_F(SceneActionTest, createSceneActionByEmptyRCSRemoteResourceObjectPtr)
+{
+    createServer("/a/testuri1_1", "/a/testuri1_2");
+    createSceneCollectionAndScene();
+    ASSERT_THROW(pScene1->addNewSceneAction(
+            nullptr, KEY, VALUE), RCSInvalidParameterException);
+}
+
+TEST_F(SceneActionTest, createSceneActionByAlreadyExistedRCSRemoteResourceObjectPtr)
+{
+    createServer("/a/testuri2_1", "/a/testuri2_2");
+    createSceneCollectionAndScene();
+    createSceneAction();
+    ASSERT_THROW(pScene1->addNewSceneAction(
+            pRemoteResource1, KEY, "off"), Scene::InvalidAddMemberRequestException);
+}
+
+TEST_F(SceneActionTest, getSceneActionInstance)
+{
+    createServer("/a/testuri3_1", "/a/testuri3_2");
+    createSceneCollectionAndScene();
+    createSceneAction();
+
+    for(const auto &it : pSceneAction1->getExecutionParameter())
+    {
+        ASSERT_EQ(it.key(), KEY);
+        ASSERT_EQ(it.value(), VALUE);
+    }
+
+    for(const auto &it: pSceneAction2->getExecutionParameter())
+    {
+        ASSERT_EQ(it.key(), KEY_2);
+        ASSERT_EQ(it.value(), VALUE_2);
+    }
+}
+
+TEST_F(SceneActionTest, updateSceneAction)
+{
+    createServer("/a/testuri4_1", "/a/testuri4_2");
+    createSceneCollectionAndScene();
+    createSceneAction();
+
+    pSceneAction1->setExecutionParameter(KEY, "off");
+    for(const auto &it : pSceneAction1->getExecutionParameter())
+    {
+        ASSERT_EQ(it.key(), KEY);
+        ASSERT_EQ(it.value(), "off");
+    }
+}
+
+TEST_F(SceneActionTest, getRemoteResourceObject)
+{
+    createServer("/a/testuri5_1", "/a/testuri5_2");
+    createSceneCollectionAndScene();
+    createSceneAction();
+
+    ASSERT_EQ(pSceneAction1->getRemoteResourceObject(), pRemoteResource1);
+}
diff --git a/service/scene-manager/unittests/SceneCollectionTest.cpp b/service/scene-manager/unittests/SceneCollectionTest.cpp
new file mode 100755 (executable)
index 0000000..7c73246
--- /dev/null
@@ -0,0 +1,79 @@
+//******************************************************************
+//
+// Copyright 2015 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.
+//
+//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+
+#include "UnitTestHelper.h"
+
+#include "SceneList.h"
+#include "OCPlatform.h"
+
+using namespace std;
+using namespace OIC::Service;
+using namespace OC;
+
+class SceneCollectionTest: public TestWithMock
+{
+protected:
+    void SetUp()
+    {
+        TestWithMock::SetUp();
+        pSceneList = SceneList::getInstance();
+    }
+
+public:
+    SceneList* pSceneList;
+    std::shared_ptr<SceneCollection> pSceneCollection;
+};
+
+TEST_F(SceneCollectionTest, createSceneCollectionInstanceAndSceneCollectionResource)
+{
+    bool isNullPtr = false;
+    pSceneCollection = pSceneList->addNewSceneCollection();
+
+    if(pSceneCollection->getId() == "")
+    {
+        isNullPtr = true;
+    }
+
+    EXPECT_FALSE(isNullPtr);
+}
+
+TEST_F(SceneCollectionTest, getSceneCollectionInstanceAndSceneCollectionResource)
+{
+    auto sceneCollections = pSceneList->getSceneCollections();
+    bool isNullPtr = false;
+
+    for(const auto &it : sceneCollections)
+    {
+        if(it->getId() == "")
+        {
+            isNullPtr = true;
+        }
+        ASSERT_FALSE(isNullPtr);
+    }
+}
+
+TEST_F(SceneCollectionTest, setAndGetSceneCollectionResourceName)
+{
+    pSceneCollection = pSceneList->addNewSceneCollection();
+    pSceneCollection->setName("Kitchen");
+    auto sceneCollectionName = pSceneCollection->getName();
+
+    EXPECT_EQ("Kitchen", sceneCollectionName);
+}
diff --git a/service/scene-manager/unittests/SceneListTest.cpp b/service/scene-manager/unittests/SceneListTest.cpp
new file mode 100755 (executable)
index 0000000..36cb9a9
--- /dev/null
@@ -0,0 +1,49 @@
+//******************************************************************
+//
+// Copyright 2015 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.
+//
+//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+
+#include "UnitTestHelper.h"
+
+#include "SceneList.h"
+
+using namespace std;
+using namespace OIC::Service;
+using namespace OC;
+
+class SceneListTest: public TestWithMock
+{
+protected:
+    void SetUp()
+    {
+        TestWithMock::SetUp();
+    }
+};
+
+TEST_F(SceneListTest, sceneListInstance)
+{
+    EXPECT_EQ(SceneList::getInstance(), SceneList::getInstance());
+}
+
+TEST_F(SceneListTest, setAndGetSceneListResourceName)
+{
+    SceneList::getInstance()->setName("House");
+    auto sceneListName = SceneList::getInstance()->getName();
+
+    EXPECT_EQ("House", sceneListName);
+}
diff --git a/service/scene-manager/unittests/SceneTest.cpp b/service/scene-manager/unittests/SceneTest.cpp
new file mode 100755 (executable)
index 0000000..ce280e5
--- /dev/null
@@ -0,0 +1,205 @@
+//******************************************************************
+//
+// Copyright 2015 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.
+//
+//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+
+#include "UnitTestHelper.h"
+
+#include "SceneList.h"
+
+#include "RCSResourceObject.h"
+#include "RCSRemoteResourceObject.h"
+#include "SceneCommons.h"
+#include "OCPlatform.h"
+
+#include <condition_variable>
+#include <mutex>
+#include <iostream>
+
+using namespace std;
+using namespace OIC::Service;
+using namespace OC;
+
+typedef std::function<void (int)> ExecuteCallback;
+
+constexpr char RESOURCE_URI[]{ "/a/light" };
+constexpr char RESOURCE_TYPE[]{ "core.light" };
+constexpr char RESOURCE_URI2[]{ "/a/fan" };
+constexpr char RESOURCE_TYPE2[]{ "core.fan" };
+constexpr char KEY[]{ "power" };
+constexpr char VALUE[]{ "off" };
+constexpr char KEY_2[]{ "state" };
+constexpr char VALUE_2[]{ "100" };
+
+class SceneTest: public TestWithMock
+{
+protected:
+    void SetUp()
+    {
+        TestWithMock::SetUp();
+        pSceneList = SceneList::getInstance();
+    }
+    void waitForCb(int watingTime)
+    {
+        std::unique_lock< std::mutex > lock{ mutex };
+        cond.wait_for(lock, std::chrono::milliseconds{ watingTime });
+    }
+    void proceed()
+    {
+        cond.notify_all();
+    }
+    void createSceneCollection()
+    {
+        pSceneCollection = pSceneList->addNewSceneCollection();
+    }
+    void createScene()
+    {
+        pScene1 = pSceneCollection->addNewScene("SceneTestName_1");
+        pScene2 = pSceneCollection->addNewScene("SceneTestName_2");
+    }
+    void createServer(const std::string& resourceUri1, const std::string& resourceUri2)
+    {
+        auto pResource1 = RCSResourceObject::Builder(
+                resourceUri1, RESOURCE_TYPE, DEFAULT_INTERFACE).build();
+        pResource1->setAttribute(KEY, VALUE);
+
+        auto ocResourcePtr = OC::OCPlatform::constructResourceObject(
+                "coap://" + SceneUtils::getNetAddress(), resourceUri1,
+                OCConnectivityType::CT_ADAPTER_IP, false,
+                pResource1->getTypes(), pResource1->getInterfaces());
+        pRemoteResource1 = RCSRemoteResourceObject::fromOCResource(ocResourcePtr);
+
+        auto pResource2 = RCSResourceObject::Builder(
+                resourceUri2, RESOURCE_TYPE2, DEFAULT_INTERFACE).build();
+        pResource2->setAttribute(KEY_2, VALUE_2);
+
+        ocResourcePtr = OC::OCPlatform::constructResourceObject(
+                        "coap://" + SceneUtils::getNetAddress(), resourceUri2,
+                        OCConnectivityType::CT_ADAPTER_IP, false,
+                        pResource2->getTypes(), pResource2->getInterfaces());
+        pRemoteResource2 = RCSRemoteResourceObject::fromOCResource(ocResourcePtr);
+    }
+
+public:
+    SceneList* pSceneList;
+    shared_ptr<SceneCollection> pSceneCollection;
+    shared_ptr<Scene> pScene1;
+    shared_ptr<Scene> pScene2;
+    RCSRemoteResourceObject::Ptr pRemoteResource1;
+    RCSRemoteResourceObject::Ptr pRemoteResource2;
+
+private:
+    std::condition_variable cond;
+    std::mutex mutex;
+};
+void executeCallback(int /*code*/) {};
+
+TEST_F(SceneTest, createSceneInstance)
+{
+    createSceneCollection();
+    createScene();
+    ASSERT_EQ("SceneTestName_1", pScene1->getName());
+    ASSERT_EQ("SceneTestName_2", pScene2->getName());
+}
+
+TEST_F(SceneTest, createSceneInstanceByEmptyName)
+{
+    createSceneCollection();
+    ASSERT_THROW(pSceneCollection->addNewScene(""), RCSInvalidParameterException);
+}
+
+TEST_F(SceneTest, getSceneInstanceBySceneName)
+{
+    createSceneCollection();
+    auto scene = pSceneCollection->getScene("SceneTestName_2");
+    EXPECT_EQ("SceneTestName_2", scene->getName());
+}
+
+TEST_F(SceneTest, getAllSceneInstance)
+{
+    createSceneCollection();
+    createScene();
+
+    vector<string> sceneNames{"SceneTestName_1", "SceneTestName_2"};
+    auto scenes = pSceneCollection->getScenes();
+    int count = 0;
+
+    for(const auto &it : scenes)
+    {
+        ASSERT_EQ(it.first, sceneNames.at(count++));
+    }
+}
+
+TEST_F(SceneTest, getSceneActionUsingRemoteResource)
+{
+    createServer(RESOURCE_URI, RESOURCE_URI2);
+    createSceneCollection();
+    createScene();
+
+    auto pSceneAction1 = pScene1->addNewSceneAction(pRemoteResource1, KEY, VALUE);
+    pSceneAction1->setExecutionParameter(KEY_2, VALUE_2);
+
+    ASSERT_EQ(pScene1->getSceneAction(pRemoteResource1)->getExecutionParameter(),
+            pSceneAction1->getExecutionParameter());
+}
+
+TEST_F(SceneTest, getSceneActions)
+{
+    createServer("/a/testuri1_1", "/a/testuri1_2");
+    createSceneCollection();
+    createScene();
+
+    auto pSceneAction1 = pScene1->addNewSceneAction(pRemoteResource1, KEY, VALUE);
+//    auto pSceneAction2 = pScene1->addNewSceneAction(pRemoteResource2, KEY, VALUE);
+
+    for(const auto & it : pScene1->getSceneActions())
+    {
+        ASSERT_EQ(it->getExecutionParameter(), pSceneAction1->getExecutionParameter());
+    }
+}
+
+TEST_F(SceneTest, executeScene)
+{
+    mocks.ExpectCallFunc(executeCallback).Do([this](int){ proceed(); });
+
+    createServer("/a/testuri2_1", "/a/testuri2_2");
+    createSceneCollection();
+    createScene();
+    pScene1->addNewSceneAction(pRemoteResource1, KEY, "on");
+    pScene1->addNewSceneAction(pRemoteResource2, KEY_2, VALUE_2);
+
+    pScene1->execute(executeCallback);
+    waitForCb(100);
+}
+
+TEST_F(SceneTest, executeSceneUsingEmptyCallback)
+{
+    createServer("/a/testuri3_1", "/a/testuri3_2");
+    createSceneCollection();
+    createScene();
+    pScene1->addNewSceneAction(pRemoteResource1, KEY, "on");
+    pScene1->addNewSceneAction(pRemoteResource2, KEY_2, VALUE_2);
+
+    ASSERT_THROW(pScene1->execute(nullptr), RCSInvalidParameterException);
+}
+
+//TEST_F(SceneTest, executeSceneByNotExistedSceneName)
+//{
+//
+//}
+