From 85678e1a9cff6b41ab1e2bd462520dc9c62ee70a Mon Sep 17 00:00:00 2001 From: Jay Sharma Date: Wed, 15 Jul 2015 15:02:31 +0530 Subject: [PATCH] UnitTest cases for Resource Client with resource manipulation API Change-Id: I224d370e1a3be92d93b6806ed44d8863a99029cb Signed-off-by: Jay Sharma Reviewed-on: https://gerrit.iotivity.org/gerrit/1666 Reviewed-by: Uze Choi Tested-by: Uze Choi --- service/resource-manipulation/SConscript | 17 +- .../unittests/ResourceClient_Test.cpp | 357 +++++++++++++++++++++ service/resource-manipulation/unittests/SConscript | 93 ++++++ 3 files changed, 462 insertions(+), 5 deletions(-) create mode 100644 service/resource-manipulation/unittests/ResourceClient_Test.cpp create mode 100644 service/resource-manipulation/unittests/SConscript diff --git a/service/resource-manipulation/SConscript b/service/resource-manipulation/SConscript index d0ea7ec..2bbc460 100644 --- a/service/resource-manipulation/SConscript +++ b/service/resource-manipulation/SConscript @@ -37,13 +37,13 @@ SConscript('sdk/SConscript') ###################################################################### if env.get('RELEASE'): - env.AppendUnique(CCFLAGS = ['-Os']) - env.AppendUnique(CPPDEFINES = ['NDEBUG']) + env.AppendUnique(CCFLAGS = ['-Os']) + env.AppendUnique(CPPDEFINES = ['NDEBUG']) else: - env.AppendUnique(CCFLAGS = ['-g']) + env.AppendUnique(CCFLAGS = ['-g']) if env.get('LOGGING'): - env.AppendUnique(CPPDEFINES = ['TB_LOG']) + env.AppendUnique(CPPDEFINES = ['TB_LOG']) # Add third party libraries lib_env = env.Clone() @@ -81,5 +81,12 @@ ResourceClientsdk = resourceClient_env.StaticLibrary('ResourceClient', client_sr resourceClient_env.InstallTarget(ResourceClientsdk , 'libResourceClient') -#Go to build sample apps +###################################################################### +# Build Sample App: SampleResourceClient & SampleResourceServer +###################################################################### SConscript('examples/SConscript') +###################################################################### +# Build UnitTests Resource Client +###################################################################### +SConscript('unittests/SConscript') + diff --git a/service/resource-manipulation/unittests/ResourceClient_Test.cpp b/service/resource-manipulation/unittests/ResourceClient_Test.cpp new file mode 100644 index 0000000..7e861ef --- /dev/null +++ b/service/resource-manipulation/unittests/ResourceClient_Test.cpp @@ -0,0 +1,357 @@ +#define private public +#include +#include +#include "ResourceClient.h" +#include "ResourceObject.h" +#include "OCPlatform.h" + +#define RESOURCEURI "/a/TemperatureSensor" +#define RESOURCETYPE "Resource.Hosting" +#define RESOURCEINTERFACE "oic.if.baseline" + +using namespace OIC::Service; +using namespace OC; + +bool cbresult = false; +std::string uri = "/oic/res?rt=Resource.Hosting"; +std::shared_ptr object; +DiscoveryManager *manager = DiscoveryManager::getInstance(); +ResourceState receivedResourceState; +ResourceAttributes receivedResourceAttributes; +ResourceObject::Ptr server; + +void createResource() +{ + server = ResourceObject::Builder(RESOURCEURI, RESOURCETYPE, + RESOURCEINTERFACE).setDiscoverable(true).setObservable(true).build(); + std::cout << "Resource created successfully " << std::endl; + server->setAttribute("Temperature", 0); + PlatformConfig config + { + OC::ServiceType::InProc, ModeType::Client, "0.0.0.0", 0, OC::QualityOfService::LowQos + }; + OCPlatform::Configure(config); +} + +void destroyResource() +{ + server = NULL; +} + +//Callbacks +void onRemoteAttrReceived(const ResourceAttributes &attributes) +{ + cbresult = true; + receivedResourceAttributes = attributes; +} + +void onResourceDiscoveredCallback(std::shared_ptr receivedObject) +{ + std::cout << "Resource discovered" << std::endl; + object = receivedObject; + std::cout << object->getUri() << std::endl; + std::cout << "Resource discovered exited" << std::endl; + EXPECT_TRUE(object != NULL); +} + +void onResourceStateChanged(ResourceState state) +{ + receivedResourceState = state; +} + +void onCacheUpdated(const ResourceAttributes attribute) +{ + receivedResourceAttributes = attribute; +} + +void OnRemoteAttributesSetCallback(const ResourceAttributes &attributes) +{ + cbresult = true; +} + +//Send valid call to discover resource +TEST(ResourceClientTest, testDiscoverResourcePass) +{ + createResource(); + DiscoveryManager *instance = DiscoveryManager::getInstance(); + cbresult = false; + + instance->discoverResource("", uri, CT_DEFAULT, &onResourceDiscoveredCallback); + sleep(2); + EXPECT_TRUE(object != NULL); + destroyResource(); +} + +//Get remote attributes when callback is not NULL +TEST(ResourceClientTest, testGetRemoteAttributesPass) +{ + createResource(); + sleep(2); + cbresult = false; + object->getRemoteAttributes(&onRemoteAttrReceived); + sleep(2); + + EXPECT_TRUE(cbresult); + destroyResource(); +} + +//Set remote attributes when callback is not NULL +TEST(ResourceClientTest, testSetRemoteAttributesPass) +{ + createResource(); + sleep(2); + + cbresult = false; + object->getRemoteAttributes(&onRemoteAttrReceived); + sleep(2); + ResourceAttributes::const_iterator iter = receivedResourceAttributes.begin(); + for (unsigned int i = 0; i < receivedResourceAttributes.size(); ++i) + { + if ( iter->key() == "Temperature") + { + std::cout << "It is there" << std::endl; + receivedResourceAttributes["Temperature"] = 100; + object->setRemoteAttributes(receivedResourceAttributes, &OnRemoteAttributesSetCallback); + } + ++iter; + } + sleep(2); + EXPECT_TRUE(cbresult); + destroyResource(); +} + +//Check value of isWatching +TEST(ResourceClientTest, testIsWatching) +{ + createResource(); + manager->DiscoveryManager::discoverResource("", uri, CT_DEFAULT, &onResourceDiscoveredCallback); + sleep(1); + destroyResource(); + EXPECT_FALSE(object->isWatching()); +} + +//Check value of isCaching +TEST(ResourceClientTest, testIsCaching) +{ + createResource(); + destroyResource(); + EXPECT_FALSE(object->isCaching()); +} + +TEST(ResourceClientTest, testIsObservable) +{ + createResource(); + destroyResource(); + EXPECT_TRUE(object->isObservable()); +} + +//Check value of startWatching for NULL callback +TEST(ResourceClientTest, testStartWatchingFail) +{ + createResource(); + object->m_watchingFlag = false; + object->startWatching(NULL); + EXPECT_TRUE(object->m_watchingFlag); + object->stopWatching(); + destroyResource(); +} + +//Check value of startWatching for non NULL callback +TEST(ResourceClientTest, testStartWatchingPass) +{ + createResource(); + object->startWatching(&onResourceStateChanged); + EXPECT_TRUE(object->m_watchingFlag); + object->stopWatching(); + destroyResource(); +} + +//Stop watching when watching is true +TEST(ResourceClientTest, testStopWatching) +{ + createResource(); + object->startWatching(&onResourceStateChanged); + object->stopWatching(); + EXPECT_FALSE(object->m_watchingFlag); + object->startWatching(&onResourceStateChanged); + destroyResource(); +} + +//Get state of resource +TEST(ResourceClientTest, testGetStatePass) +{ + createResource(); + ResourceState result = object->getState(); + EXPECT_TRUE(result >= ResourceState::NOT_WATCHING && result <= ResourceState::DESTROYED); + destroyResource(); +} + +//Cache ID is not zero +TEST(ResourceClientTest, testStartCachingPass) +{ + createResource(); + object->m_cachingFlag = false; + object->startCaching(); + EXPECT_TRUE(object->m_cachingFlag); + destroyResource(); +} + +TEST(ResourceClientTest, testStopCaching) +{ + createResource(); + object->m_cachingFlag = false; + object->startCaching(); + object->stopCaching(); + EXPECT_FALSE(object->m_cachingFlag); + destroyResource(); +} + +TEST(ResourceClientTest, testRefreshCache) +{ + createResource(); + object->m_cachingFlag = false; + object->startCaching(); + object->refreshCache(); + EXPECT_TRUE(object->getResourceCacheState() == CacheState::UPDATING); + destroyResource(); +} + +//Callback for start caching is not NULL +TEST(ResourceClientTest, testStartCachingCbPass) +{ + createResource(); + object->m_cachingFlag = false; + object->startCaching(&onCacheUpdated); + EXPECT_TRUE(object->m_cachingFlag); + destroyResource(); +} + +//Callback for start caching is NULL +TEST(ResourceClientTest, testStartCachingCbFail) +{ + createResource(); + object->m_cachingFlag = false; + object->startCaching(NULL); + EXPECT_TRUE(object->m_cachingFlag); + destroyResource(); +} + +//Get resource state +TEST(ResourceClientTest, testGetResourceCacheState) +{ + createResource(); + CacheState result = object->getResourceCacheState(); + EXPECT_TRUE(result >= CacheState::READY && result <= CacheState::NONE); + destroyResource(); +} + +//Get cached attributes +TEST(ResourceClientTest, testGetCachedAttributesWithoutCallback) +{ + createResource(); + ResourceAttributes result = object->getCachedAttributes(); + EXPECT_TRUE(result != NULL); + destroyResource(); +} + +//Check with invalid attribute value +TEST(ResourceClientTest, testGetCachedAttributeWithInvalidAttribute) +{ + createResource(); + ResourceAttributes::Value result = object->getCachedAttribute(""); + std::nullptr_t null; + EXPECT_TRUE(result == null); + destroyResource(); +} + +//Get remote attributes when callback is NULL +TEST(ResourceClientTest, testGetRemoteAttributesFail) +{ + createResource(); + cbresult = false; + object->getRemoteAttributes(NULL); + EXPECT_FALSE(cbresult); + destroyResource(); +} + +TEST(ResourceClientTest, testGetUri) +{ + createResource(); + std::string result = object->getUri(); + EXPECT_TRUE(result != NULL); + destroyResource(); +} + +TEST(ResourceClientTest, testGetAddress) +{ + createResource(); + std::string result = object->getAddress(); + EXPECT_TRUE(result != NULL); + destroyResource(); +} + +TEST(ResourceClientTest, testGetTypes) +{ + createResource(); + std::vector < std::string > result = object->getTypes(); + EXPECT_TRUE(result.size() != 0); + destroyResource(); +} + +TEST(ResourceClientTest, testGetInterfaces) +{ + createResource(); + std::vector < std::string > result = object->getInterfaces(); + EXPECT_TRUE(result.size() != 0); + destroyResource(); +} + +//Check with valid attribute value +TEST(ResourceClientTest, testGetCachedAttribute) +{ + createResource(); + ResourceAttributes::Value result = object->getCachedAttribute("Temperature"); + EXPECT_TRUE(result != NULL); + destroyResource(); +} + +//Test getting instance of DiscoveryManager +TEST(ResourceClientTest, testGetInstance) +{ + createResource(); + DiscoveryManager *instance = DiscoveryManager::getInstance(); + EXPECT_TRUE(instance != NULL); + destroyResource(); +} + +//Send empty resource URI +TEST(ResourceClientTest, testDiscoverResourceEmptyResource) +{ + createResource(); + DiscoveryManager *instance = DiscoveryManager::getInstance(); + EXPECT_THROW(instance->discoverResource("", "", CT_DEFAULT, &onResourceDiscoveredCallback), + InvalidParameterException); + destroyResource(); +} + +//Send NULL callback +TEST(ResourceClientTest, testDiscoverResourceEmptyCallback) +{ + createResource(); + DiscoveryManager *instance = DiscoveryManager::getInstance(); + EXPECT_THROW(instance->discoverResource("", uri, CT_DEFAULT, NULL), InvalidParameterException); + destroyResource(); + object->stopWatching(); +} + +//Send invalid ResourceAttributes object to function +TEST(ResourceClientTest, testSetRemoteAttributesInvalidAttributes) +{ + createResource(); + cbresult = false; + ResourceAttributes attr; + //object->getRemoteAttributes(&onRemoteAttrReceived); + object->setRemoteAttributes(attr, &OnRemoteAttributesSetCallback); + EXPECT_FALSE(cbresult); + destroyResource(); +} diff --git a/service/resource-manipulation/unittests/SConscript b/service/resource-manipulation/unittests/SConscript new file mode 100644 index 0000000..4a67e17 --- /dev/null +++ b/service/resource-manipulation/unittests/SConscript @@ -0,0 +1,93 @@ +#****************************************************************** +# +# 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') + +ResourceClient_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') + +ResourceClient_gtest_env.AppendUnique( + CPPPATH = [ + env.get('SRC_DIR')+'/extlibs', + '../include', + '..src/serverBuilder/include/internal', + '../src/serverBuilder/include', + '../src/common/primitiveResource/include', + '../src/common/include/expiryTimer' + ]) + +if target_os not in ['windows', 'winrt']: + ResourceClient_gtest_env.AppendUnique(CXXFLAGS = ['-std=c++0x', '-Wall']) + if target_os != 'android': + ResourceClient_gtest_env.AppendUnique(CXXFLAGS = ['-pthread']) + ResourceClient_gtest_env.AppendUnique(LIBS = ['pthread']) + +ResourceClient_gtest_env.PrependUnique(CPPPATH = [env.get('SRC_DIR')+'/extlibs/hippomocks-master/HippoMocks', gtest_dir + '/include']) +ResourceClient_gtest_env.AppendUnique(LIBPATH = ['/usr/lib/jvm/jdk1.8.0_40/jre/lib/amd64/server/']) +ResourceClient_gtest_env.PrependUnique(LIBS = ['ResourceClient','ResourceCache', 'ResourceBroker', 'ExpiryTimer','server_builder', 'service_common', 'oc','octbstack', 'oc_logger', 'oc_logger_core', 'connectivity_abstraction', gtest, gtest_main]) +ResourceClient_gtest_env.AppendUnique(LIBS = ['dl']) + +###################################################################### +# Build Test +###################################################################### +ResourceClient_gtest_src = env.Glob('./*.cpp') + +ResourceClient_test = ResourceClient_gtest_env.Program('ResourceClient_Test', ResourceClient_gtest_src) +Alias("ResourceClient_Test", ResourceClient_test) +env.AppendTarget('ResourceClient_test') + -- 2.7.4