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>
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')
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;
* @see RCSAddress
*
*/
- std::unique_ptr<DiscoveryTask> discoverResource(const RCSAddress& address,
+ std::unique_ptr<RCSDiscoveryTask> discoverResource(const RCSAddress& address,
ResourceDiscoveredCallback cb);
/**
* @see RCSAddress
*
*/
- std::unique_ptr<DiscoveryTask> discoverResource(const RCSAddress& address,
+ std::unique_ptr<RCSDiscoveryTask> discoverResource(const RCSAddress& address,
const std::string& relativeURI, ResourceDiscoveredCallback cb);
/**
* @see RCSAddress
*
*/
- std::unique_ptr<DiscoveryTask> discoverResourceByType(const RCSAddress& address,
+ std::unique_ptr<RCSDiscoveryTask> discoverResourceByType(const RCSAddress& address,
const std::string& resourceType, ResourceDiscoveredCallback cb);
/**
* @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);
RCSDiscoveryManager() = default;
~RCSDiscoveryManager()= default;;
- friend class DiscoveryTask;
+ friend class RCSDiscoveryTask;
};
}
}
class RCSDiscoveryManager;
class PrimitiveResource;
class RCSAddress;
- class DiscoveryTask;
+ class RCSDiscoveryTask;
class DiscoverRequestInfo
{
public:
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);
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())
return false;
}
- void DiscoveryTask::cancel(){
+ void RCSDiscoveryTask::cancel(){
RCSDiscoveryManagerImpl::getInstance()->m_discoveryMap.erase(m_id);
}
}
}
}
- 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)
{
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()
--- /dev/null
+//******************************************************************
+//
+// 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();
+}
--- /dev/null
+#******************************************************************
+#
+# 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')
{
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);
}