Add unitTest for RCSDiscoveryManager.
authordoil.kwon <doil.kwon@samsung.com>
Thu, 17 Sep 2015 06:11:05 +0000 (15:11 +0900)
committerMadan Lanka <lanka.madan@samsung.com>
Thu, 17 Sep 2015 07:50:19 +0000 (07:50 +0000)
Change the class name "DiscoveryTask" to "RCSDiscoveryTask".

Add handling about move operator and copy operator and move constructor and copy constructor for "RCSDiscoveryTask" class.

Modify Sconscript to build RCSDiscoveryManager UnitTest.

Change-Id: If409727bab435f38dd1ef4846880bf1a0bab827a
Signed-off-by: doil.kwon <doil.kwon@samsung.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/2623
Tested-by: jenkins-iotivity <jenkins-iotivity@opendaylight.org>
Reviewed-by: Madan Lanka <lanka.madan@samsung.com>
service/resource-encapsulation/SConscript
service/resource-encapsulation/include/RCSDiscoveryManager.h
service/resource-encapsulation/include/RCSDiscoveryManagerImpl.h
service/resource-encapsulation/src/resourceClient/RCSDiscoveryManager.cpp
service/resource-encapsulation/src/resourceClient/RCSDiscoveryManagerImpl.cpp
service/resource-encapsulation/src/resourceClient/unittests/DiscoveryManagerTest.cpp [new file with mode: 0644]
service/resource-encapsulation/src/resourceClient/unittests/SConscript [new file with mode: 0644]
service/resource-encapsulation/unittests/ResourceClientTest.cpp

index e6c3f32..62265f4 100644 (file)
@@ -113,10 +113,12 @@ resourceClient_env.UserInstallTargetHeader('include/RCSResponse.h', 'service/res
 SConscript('examples/SConscript')
 
 ######################################################################
-# Build UnitTests Resource Client , resourceCache and resourceBroker
+# Build UnitTests Resource Client , resourceCache and resourceBroker and 
+# DiscoveryManager
 ################################################ ######################
 if target_os == 'linux':
     SConscript('unittests/SConscript')
     SConscript('src/resourceCache/unittests/SConscript')
     SConscript('src/resourceBroker/unittest/SConscript')
+    SConscript('src/resourceClient/unittests/SConscript')
 
index bb9bd64..c0cd3c4 100755 (executable)
@@ -40,14 +40,24 @@ namespace OIC
         class RCSRemoteResourceObject;
         class RCSAddress;
 
-        class DiscoveryTask
+        class RCSDiscoveryTask
         {
             public:
 
-                DiscoveryTask(unsigned int id) : m_id{ id } {};
                 void cancel();
                 bool isCanceled();
-                ~DiscoveryTask();
+                ~RCSDiscoveryTask();
+
+            public:
+
+                RCSDiscoveryTask(const RCSDiscoveryTask&) = delete;
+                RCSDiscoveryTask(RCSDiscoveryTask&&) = delete;
+                RCSDiscoveryTask& operator = (const RCSDiscoveryTask&) const = delete;
+                RCSDiscoveryTask& operator = (RCSDiscoveryTask&&) const = delete;
+
+            private:
+
+                explicit RCSDiscoveryTask(unsigned int id) : m_id{ id } {};
             private:
 
                 unsigned int m_id;
@@ -91,7 +101,7 @@ namespace OIC
                  * @see RCSAddress
                  *
                  */
-                std::unique_ptr<DiscoveryTask> discoverResource(const RCSAddress& address,
+                std::unique_ptr<RCSDiscoveryTask> discoverResource(const RCSAddress& address,
                         ResourceDiscoveredCallback cb);
 
                 /**
@@ -108,7 +118,7 @@ namespace OIC
                  * @see RCSAddress
                  *
                  */
-                std::unique_ptr<DiscoveryTask> discoverResource(const RCSAddress& address,
+                std::unique_ptr<RCSDiscoveryTask> discoverResource(const RCSAddress& address,
                         const std::string& relativeURI, ResourceDiscoveredCallback cb);
 
                 /**
@@ -125,7 +135,7 @@ namespace OIC
                  * @see RCSAddress
                  *
                  */
-                std::unique_ptr<DiscoveryTask> discoverResourceByType(const RCSAddress& address,
+                std::unique_ptr<RCSDiscoveryTask> discoverResourceByType(const RCSAddress& address,
                         const std::string& resourceType, ResourceDiscoveredCallback cb);
 
                 /**
@@ -143,7 +153,7 @@ namespace OIC
                  * @see RCSAddress
                  *
                  */
-                std::unique_ptr<DiscoveryTask>  discoverResourceByType(const RCSAddress& address,
+                std::unique_ptr<RCSDiscoveryTask>  discoverResourceByType(const RCSAddress& address,
                         const std::string& relativeURI, const std::string& resourceType,
                         ResourceDiscoveredCallback cb);
 
@@ -152,7 +162,7 @@ namespace OIC
                 RCSDiscoveryManager() = default;
                 ~RCSDiscoveryManager()= default;;
 
-                friend class DiscoveryTask;
+                friend class RCSDiscoveryTask;
         };
     }
 }
index 0d69301..64cdd75 100755 (executable)
@@ -50,7 +50,7 @@ namespace OIC
         class RCSDiscoveryManager;
         class PrimitiveResource;
         class RCSAddress;
-        class DiscoveryTask;
+        class RCSDiscoveryTask;
         class DiscoverRequestInfo
         {
             public:
@@ -93,7 +93,7 @@ namespace OIC
 
             public:
 
-                std::unique_ptr<DiscoveryTask> startDiscovery(const RCSAddress& address,
+                std::unique_ptr<RCSDiscoveryTask> startDiscovery(const RCSAddress& address,
                         const std::string& relativeURI,const std::string& resourceType,
                         RCSDiscoveryManager::ResourceDiscoveredCallback cb);
 
index 6bfdd30..979aef6 100755 (executable)
@@ -30,33 +30,33 @@ namespace OIC {
             return &instance;
         }
 
-        std::unique_ptr<DiscoveryTask> RCSDiscoveryManager::discoverResource(const RCSAddress& address,
+        std::unique_ptr<RCSDiscoveryTask> RCSDiscoveryManager::discoverResource(const RCSAddress& address,
                 ResourceDiscoveredCallback cb) {
             return discoverResourceByType(address, OC_RSRVD_WELL_KNOWN_URI, "",
                     std::move(cb));
         }
 
-        std::unique_ptr<DiscoveryTask> RCSDiscoveryManager::discoverResource(const RCSAddress& address,
+        std::unique_ptr<RCSDiscoveryTask> RCSDiscoveryManager::discoverResource(const RCSAddress& address,
                 const std::string& relativeURI, ResourceDiscoveredCallback cb) {
             return discoverResourceByType(address, relativeURI, "", std::move(cb));
         }
 
-        std::unique_ptr<DiscoveryTask> RCSDiscoveryManager::discoverResourceByType(
+        std::unique_ptr<RCSDiscoveryTask> RCSDiscoveryManager::discoverResourceByType(
                 const RCSAddress& address, const std::string& resourceType, ResourceDiscoveredCallback cb) {
             return discoverResourceByType(address, OC_RSRVD_WELL_KNOWN_URI,
                     resourceType, std::move(cb));
         }
 
-        std::unique_ptr<DiscoveryTask> RCSDiscoveryManager::discoverResourceByType(
+        std::unique_ptr<RCSDiscoveryTask> RCSDiscoveryManager::discoverResourceByType(
                 const RCSAddress& address, const std::string& relativeURI,
                 const std::string& resourceType, ResourceDiscoveredCallback cb) {
            return RCSDiscoveryManagerImpl::getInstance()->startDiscovery(address,
                    relativeURI, resourceType, std::move(cb));
         }
-        DiscoveryTask::~DiscoveryTask(){
+        RCSDiscoveryTask::~RCSDiscoveryTask(){
             cancel();
         }
-        bool DiscoveryTask::isCanceled() {
+        bool RCSDiscoveryTask::isCanceled() {
             auto it = RCSDiscoveryManagerImpl::getInstance();
 
             if(it->m_discoveryMap.find(m_id) == it->m_discoveryMap.end())
@@ -66,7 +66,7 @@ namespace OIC {
             return false;
         }
 
-        void DiscoveryTask::cancel(){
+        void RCSDiscoveryTask::cancel(){
             RCSDiscoveryManagerImpl::getInstance()->m_discoveryMap.erase(m_id);
         }
     }
index 28be1fa..b55e557 100755 (executable)
@@ -73,7 +73,7 @@ namespace OIC
             }
         }
 
-        std::unique_ptr<DiscoveryTask> RCSDiscoveryManagerImpl::startDiscovery(const RCSAddress& address,
+        std::unique_ptr<RCSDiscoveryTask> RCSDiscoveryManagerImpl::startDiscovery(const RCSAddress& address,
                 const std::string& relativeURI, const std::string& resourceType,
                 RCSDiscoveryManager::ResourceDiscoveredCallback cb)
         {
@@ -98,7 +98,7 @@ namespace OIC
                     discoveryItem.m_relativeUri + "?rt=" +discoveryItem.m_resourceType,
                     OCConnectivityType::CT_DEFAULT, discoveryItem.m_findCB);
 
-            return std::unique_ptr<DiscoveryTask>(new DiscoveryTask(discoverID));
+            return std::unique_ptr<RCSDiscoveryTask>(new RCSDiscoveryTask(discoverID));
         }
 
         void RCSDiscoveryManagerImpl::initializedDiscoveryEnvironment()
diff --git a/service/resource-encapsulation/src/resourceClient/unittests/DiscoveryManagerTest.cpp b/service/resource-encapsulation/src/resourceClient/unittests/DiscoveryManagerTest.cpp
new file mode 100644 (file)
index 0000000..b28e2de
--- /dev/null
@@ -0,0 +1,130 @@
+//******************************************************************
+//
+// 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 <unistd.h>
+#include "OCPlatform.h"
+#include "UnitTestHelper.h"
+#include "RCSRemoteResourceObject.h"
+#include "RCSDiscoveryManager.h"
+#include "RCSResourceObject.h"
+#include "PrimitiveResource.h"
+
+using namespace OIC::Service;
+using namespace OC::OCPlatform;
+
+constexpr char RESOURCEURI[]{ "/a/TemperatureSensor" };
+constexpr char RESOURCETYPE[]{ "Resource.Hosting" };
+constexpr char RESOURCEINTERFACE[]{ "oic.if.baseline" };
+constexpr int RCSDiscoveryTaskDELAYTIME = 7;
+
+class DiscoveryManagerTest: public TestWithMock
+{
+public:
+
+    RCSResourceObject::Ptr server;
+    RCSRemoteResourceObject::Ptr object;
+    std::unique_ptr<RCSDiscoveryTask> discoveryTask;
+
+public:
+
+    void startDiscovery()
+    {
+        const std::string uri  = "/oic/res";
+        const std::string type = "Resource.Hosting";
+        discoveryTask = RCSDiscoveryManager::getInstance()->discoverResourceByType(RCSAddress::multicast(),
+                 uri, type, &resourceDiscovered);
+    }
+
+    void cancelDiscovery()
+    {
+        discoveryTask->cancel();
+    }
+
+    void createResource()
+    {
+        server = RCSResourceObject::Builder(RESOURCEURI, RESOURCETYPE, RESOURCEINTERFACE).build();
+    }
+
+    void waitForRCSDiscoveryTask()
+    {
+        sleep(RCSDiscoveryTaskDELAYTIME);
+    }
+
+    static void resourceDiscovered(std::shared_ptr< RCSRemoteResourceObject >) {}
+
+};
+
+TEST_F(DiscoveryManagerTest, resourceIsNotSupportedPresenceBeforeDiscovering)
+{
+    createResource();
+
+    mocks.ExpectCallFunc(resourceDiscovered);
+
+    startDiscovery();
+    waitForRCSDiscoveryTask();
+}
+
+TEST_F(DiscoveryManagerTest, resourceIsSupportedPresenceBeforeDiscovering)
+{
+    startPresence(10);
+    createResource();
+
+    mocks.ExpectCallFunc(resourceDiscovered);
+
+    startDiscovery();
+    waitForRCSDiscoveryTask();
+}
+
+TEST_F(DiscoveryManagerTest, resourceIsNotSupportedPresenceAfterDiscovering)
+{
+    mocks.ExpectCallFunc(resourceDiscovered);
+
+    startDiscovery();
+    createResource();
+    waitForRCSDiscoveryTask();
+}
+
+TEST_F(DiscoveryManagerTest, resourceIsSupportedPresenceAndAfterDiscovering)
+{
+    mocks.ExpectCallFunc(resourceDiscovered);
+
+    startPresence(10);
+    startDiscovery();
+    createResource();
+    waitForRCSDiscoveryTask();
+}
+
+TEST_F(DiscoveryManagerTest, cancelRCSDiscoveryTaskAfterDiscoveryResource)
+{
+    startDiscovery();
+    cancelDiscovery();
+
+    mocks.NeverCallFunc(resourceDiscovered);
+
+    sleep(3);
+    createResource();
+
+}
+
+TEST_F(DiscoveryManagerTest, cancelRCSDiscoveryTaskNotStartDiscoveryResource)
+{
+    startDiscovery();
+    cancelDiscovery();
+    cancelDiscovery();
+}
diff --git a/service/resource-encapsulation/src/resourceClient/unittests/SConscript b/service/resource-encapsulation/src/resourceClient/unittests/SConscript
new file mode 100644 (file)
index 0000000..badcff0
--- /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.
+#
+#-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+
+##
+# ResourceClient Unit Test build script
+##
+import os
+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'])
+
+# Add third party libraries
+lib_env = env.Clone()
+SConscript(env.get('SRC_DIR') + '/service/third_party_libs.scons', 'lib_env')
+
+target_os = env.get('TARGET_OS')
+if target_os == 'linux':
+        # Verify that 'google unit test' library is installed.  If not,
+        # get it and install it
+        SConscript(env.get('SRC_DIR') + '/extlibs/gtest/SConscript')
+
+        # Verify that 'hippomocks' mocking code is installed.  If not,
+        # get it and install it
+        SConscript(env.get('SRC_DIR') + '/extlibs/hippomocks.scons')
+
+DiscoveryManager_gtest_env = lib_env.Clone()
+
+######################################################################
+#unit test setting
+######################################################################
+src_dir = lib_env.get('SRC_DIR')
+gtest_dir = src_dir + '/extlibs/gtest/gtest-1.7.0'
+
+######################################################################
+# Build flags
+######################################################################
+gtest = File(gtest_dir + '/lib/.libs/libgtest.a')
+gtest_main = File(gtest_dir + '/lib/.libs/libgtest_main.a')
+
+DiscoveryManager_gtest_env.AppendUnique(
+        CPPPATH = [
+                src_dir + '/extlibs/hippomocks-master',
+                src_dir + '/extlibs/gtest/gtest-1.7.0/include',
+                '../../src/common/utils/include',
+                '../../src/serverBuilder/include',
+                '../../src/common/primitiveResource/include',
+                '../../common/utils/include/',
+                '../../../include/',
+                '../../common/primitiveResource/include',
+                '../../../../../resource/include',
+                '../../common/expiryTimer/include'
+        ])
+
+if target_os not in ['windows', 'winrt']:
+        DiscoveryManager_gtest_env.AppendUnique(CXXFLAGS = ['-std=c++0x', '-Wall'])
+        if target_os != 'android':
+                DiscoveryManager_gtest_env.AppendUnique(CXXFLAGS = ['-pthread'])
+                DiscoveryManager_gtest_env.AppendUnique(LIBS = ['pthread'])
+
+DiscoveryManager_gtest_env.PrependUnique(LIBS = [
+    'rcs_client',
+    'rcs_server',
+    'rcs_common',
+    'oc',
+    'octbstack',
+    'oc_logger',
+    'oc_logger_core',
+    'connectivity_abstraction',
+    gtest,
+    gtest_main])
+
+DiscoveryManager_gtest_env.AppendUnique(LIBS = ['dl'])
+
+######################################################################
+# Build Test
+######################################################################
+DiscoveryManager_gtest_src = env.Glob('./*.cpp')
+
+DiscoveryManager_test = DiscoveryManager_gtest_env.Program('DiscoveryManagerTest', DiscoveryManager_gtest_src)
+Alias("DiscoveryManagerTest", DiscoveryManager_test)
+env.AppendTarget('DiscoveryManager_test')
+
+if env.get('TEST') == '1':
+    target_os = env.get('TARGET_OS')
+    if target_os == 'linux':
+        from tools.scons.RunTest import *
+        run_test(DiscoveryManager_gtest_env, '',
+                'service/resource-encapsulation/src/resourceClient/DiscoveryManagerTest')
index 08b58cd..cf0a443 100644 (file)
@@ -104,8 +104,8 @@ private:
         {
             const std::string uri  = "/oic/res";
             const std::string type = "Resource.Hosting";
-            RCSDiscoveryManager::getInstance()->discoverResourceByType(RCSAddress::multicast(),
-                     uri, type, std::bind(resourceDiscovered, this, finished,
+            auto discoveryTask = RCSDiscoveryManager::getInstance()->discoverResourceByType(
+                RCSAddress::multicast(), uri, type, std::bind(resourceDiscovered, this, finished,
                            std::placeholders::_1));
             Wait(1000);
         }