When build with TEST keyword, unit test of RH is executed.
Fixed bug about late timing of resource discovery.
Change-Id: I43bba1a80cd20e78126887fd5dbd232458ada971
Signed-off-by: jyong2.kim <jyong2.kim@samsung.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/5177
Tested-by: jenkins-iotivity <jenkins-iotivity@opendaylight.org>
Reviewed-by: Uze Choi <uzchoi@samsung.com>
namespace
{
- std::string HOSTING_INTERFACETYPE = "oic.r.resourcehosting";
- std::string TEST_ATT_KEY = "Temperature";
- bool isDeleted = false;
- void onDestroy()
+ const std::string HOSTING_RESOURCE_TYPE = "oic.r.resourcehosting";
+ const std::string TEST_ATT_KEY = "Temperature";
+
+ bool isStarted = false;
+ bool isFinished = false;
+
+ ResourceEncapsulationTestSimulator testObject;
+ RCSRemoteResourceObject::Ptr remoteObject;
+
+ HostingObject::Ptr instance;
+ RCSRemoteResourceObject::Ptr discoveredResource;
+
+ void onDestroy(){ }
+ void onDiscoveryResource(RCSRemoteResourceObject::Ptr){ }
+ void onUpdatedCache(const RCSResourceAttributes &) { }
+
+ void setup()
{
- isDeleted = true;
+ if(!isStarted)
+ {
+ testObject.defaultRunSimulator();
+ remoteObject = testObject.getRemoteResource();
+
+ instance = HostingObject::createHostingObject(
+ remoteObject, &onDestroy);
+
+ testObject.getResourceServer()->setAttribute(
+ "Temperature", RCSResourceAttributes::Value((int)0));
+
+ isStarted = true;
+ }
}
- void onDiscoveryResource(RCSRemoteResourceObject::Ptr){ }
- void onUpdatedCache(const RCSResourceAttributes &) { }
+ void tearDown()
+ {
+ if(isFinished)
+ {
+ testObject.destroy();
+ instance.reset();
+ isStarted = false;
+ }
+ }
}
class HostingObjectTest : public TestWithMock
{
public:
- ResourceEncapsulationTestSimulator::Ptr testObject;
- RCSRemoteResourceObject::Ptr remoteObject;
-
std::mutex mutexForCondition;
std::condition_variable responseCon;
void SetUp()
{
TestWithMock::SetUp();
-
- testObject = std::make_shared<ResourceEncapsulationTestSimulator>();
- testObject->defaultRunSimulator();
- remoteObject = testObject->getRemoteResource();
-
- isDeleted = false;
+ setup();
}
void TearDown()
{
TestWithMock::TearDown();
-
- if(remoteObject.use_count() > 0)
- {
- if(remoteObject->isCaching())
- {
- remoteObject->stopCaching();
- }
- if(remoteObject->isMonitoring())
- {
- remoteObject->stopMonitoring();
- }
- }
- testObject->destroy();
+ tearDown();
}
public:
TEST_F(HostingObjectTest, startCachingAtInitialize)
{
- HostingObject::Ptr instance = HostingObject::createHostingObject(
- remoteObject, &onDestroy);
-
EXPECT_TRUE(remoteObject->isCaching());
}
TEST_F(HostingObjectTest, startMonitoringAtInitialize)
{
- HostingObject::Ptr instance = HostingObject::createHostingObject(
- remoteObject, onDestroy);
-
ASSERT_TRUE(remoteObject->isMonitoring());
}
TEST_F(HostingObjectTest, getRemoteResourceisValid)
{
- HostingObject::Ptr instance = HostingObject::createHostingObject(
- remoteObject, onDestroy);
-
ASSERT_EQ(remoteObject->getUri(), instance->getRemoteResource()->getUri());
}
TEST_F(HostingObjectTest, createMirroredServer)
{
- int waitForResponse = 2000;
+ int waitForResponse = 1000;
std::string uri = "";
- HostingObject::Ptr instance = HostingObject::createHostingObject(remoteObject, onDestroy);
- waitForCondition();
- testObject->getResourceServer()->
- setAttribute(TEST_ATT_KEY, RCSResourceAttributes::Value(int(10)));
-
std::unique_ptr<RCSDiscoveryManager::DiscoveryTask> discoveryTask = { };
+ waitForCondition(waitForResponse);
mocks.OnCallFunc(onDiscoveryResource).Do(
- [this, &uri, &discoveryTask](RCSRemoteResourceObject::Ptr ptr)
+ [this, &uri, &discoveryTask, &testObject, &discoveredResource]
+ (RCSRemoteResourceObject::Ptr ptr)
{
- if(ptr->getUri() == testObject->getHostedServerUri())
+ if(ptr->getUri() == testObject.getHostedServerUri())
{
uri = ptr->getUri();
+ discoveredResource = ptr;
discoveryTask->cancel();
notifyCondition();
}
});
discoveryTask = RCSDiscoveryManager::getInstance()->discoverResourceByType(
- RCSAddress::multicast(), HOSTING_INTERFACETYPE, onDiscoveryResource);
+ RCSAddress::multicast(), "/oic/res", HOSTING_RESOURCE_TYPE, onDiscoveryResource);
waitForCondition(waitForResponse);
- EXPECT_EQ(testObject->getHostedServerUri(), uri);
+ EXPECT_EQ(testObject.getHostedServerUri(), uri);
}
TEST_F(HostingObjectTest, UpdateCachedDataWhenChangedOriginResource)
{
int waitForResponse = 1000;
- HostingObject::Ptr instance = HostingObject::createHostingObject(remoteObject, onDestroy);
- std::this_thread::sleep_for(std::chrono::milliseconds {waitForResponse});
-
- std::unique_ptr<RCSDiscoveryManager::DiscoveryTask> discoveryTask = { };
- RCSRemoteResourceObject::Ptr discoveredResource = { };
-
- mocks.OnCallFunc(onDiscoveryResource).Do(
- [this, &discoveredResource, &discoveryTask](RCSRemoteResourceObject::Ptr ptr)
- {
- if(ptr->getUri() == testObject->getHostedServerUri())
- {
- discoveredResource = ptr;
- discoveryTask->cancel();
- notifyCondition();
- }
- });
-
- discoveryTask = RCSDiscoveryManager::getInstance()->discoverResourceByType(
- RCSAddress::multicast(), HOSTING_INTERFACETYPE, onDiscoveryResource);
- waitForCondition(waitForResponse);
-
RCSResourceAttributes::Value result = { };
+
mocks.OnCallFunc(onUpdatedCache).Do(
[this, &result](const RCSResourceAttributes & att)
{
std::this_thread::sleep_for(std::chrono::milliseconds {waitForResponse});
RCSResourceAttributes::Value settingValue = 10;
- testObject->getResourceServer()->setAttribute(TEST_ATT_KEY, settingValue);
+ testObject.getResourceServer()->setAttribute(TEST_ATT_KEY, settingValue);
waitForCondition(waitForResponse);
+ isFinished = true;
+
EXPECT_EQ(result.toString(), settingValue.toString());
}
#include "UnitTestHelper.h"
#include "ResourceEncapsulationTestSimulator.h"
-#include "OCResourceRequest.h"
#include "RequestObject.h"
-#include "RCSRequest.h"
using namespace testing;
using namespace OIC::Service;
namespace
{
- void setRequestCB(
- const RCSResourceAttributes &, int,
- const RCSRequest &, RequestObject::Ptr) { }
+ bool isStarted = false;
+ bool isFinished = false;
+
+ ResourceEncapsulationTestSimulator testObject;
+ RCSRemoteResourceObject::Ptr remoteObject;
+
+ void setRequestCB(const RCSResourceAttributes &, int, const RCSRequest &, RequestObject::Ptr)
+ {
+ }
+
+ void setup()
+ {
+ if(!isStarted)
+ {
+ testObject.defaultRunSimulator();
+ remoteObject = testObject.getRemoteResource();
+
+ isStarted = true;
+ }
+ }
+
+ void tearDown()
+ {
+ if(isFinished)
+ {
+ testObject.destroy();
+ isStarted = false;
+ }
+ }
}
class RequestObjectTest : public TestWithMock
{
public:
- ResourceEncapsulationTestSimulator::Ptr testObject;
- RCSResourceObject::Ptr server;
- RCSRemoteResourceObject::Ptr remoteObject;
-
- RCSResourceAttributes attr;
-
std::mutex mutexForCondition;
std::condition_variable responseCon;
void SetUp()
{
TestWithMock::SetUp();
-
- testObject = std::make_shared<ResourceEncapsulationTestSimulator>();
- testObject->defaultRunSimulator();
- remoteObject = testObject->getRemoteResource();
+ setup();
}
void TearDown()
{
TestWithMock::TearDown();
- if(remoteObject)
- {
- if(remoteObject->isCaching())
- {
- remoteObject->stopCaching();
- }
- if(remoteObject->isMonitoring())
- {
- remoteObject->stopMonitoring();
- }
- }
- testObject->destroy();
+ tearDown();
}
public:
RCSResourceAttributes att;
std::shared_ptr<OC::OCResourceRequest> request;
- RequestObject::invokeRequest(remoteObject, RCSRequest(testObject->getResourceServer(), request),
+ RequestObject::invokeRequest(remoteObject, RCSRequest(testObject.getResourceServer(), request),
RequestObject::RequestMethod::Set, att, setRequestCB);
waitForCondition();
#include "UnitTestHelper.h"
-#include "RCSResourceObject.h"
+#include "OCPlatform.h"
#include "RCSDiscoveryManager.h"
#include "RCSRemoteResourceObject.h"
+#include "RCSResourceObject.h"
#include "RCSResourceAttributes.h"
#include "RCSAddress.h"
using namespace OIC::Service;
class ResourceEncapsulationTestSimulator
- : public std::enable_shared_from_this<ResourceEncapsulationTestSimulator>
{
public:
- typedef std::shared_ptr<ResourceEncapsulationTestSimulator> Ptr;
-
RCSResourceObject::Ptr server;
RCSRemoteResourceObject::Ptr remoteResource;
{ }
private:
- void onDiscoveryResource_Impl(RCSRemoteResourceObject::Ptr resourceObject)
+ void onDiscoveryResource(RCSRemoteResourceObject::Ptr resourceObject)
{
if (remoteResource != nullptr)
{
}
remoteResource = resourceObject;
+ discoveryTask->cancel();
mutexForDiscovery.unlock();
}
- static void onDiscoveryResource(RCSRemoteResourceObject::Ptr resourceObject,
- std::weak_ptr<ResourceEncapsulationTestSimulator> rPtr)
- {
- std::shared_ptr<ResourceEncapsulationTestSimulator> ptr = rPtr.lock();
- if (ptr != nullptr)
- {
- ptr->onDiscoveryResource_Impl(resourceObject);
- }
- }
void waitForDiscovery()
{
std::chrono::milliseconds interval(100);
{
while((remoteResource && !remoteResource.unique()) || (server && !server.unique()))
{
- std::this_thread::sleep_for(std::chrono::milliseconds{ 100 });
+ std::this_thread::sleep_for(std::chrono::milliseconds{ 1000 });
}
}
waitForDiscovery();
}
- void createResource()
+ void createResource(std::string postUri = "")
{
- server = RCSResourceObject::Builder(RESOURCEURI, RESOURCETYPE, RESOURCEINTERFACE)
- .setDiscoverable(true).setObservable(true).build();
- server->setAttribute(ATTR_KEY, ATTR_VALUE);
+ HOSTED_RESOURCEURI = HOSTED_RESOURCEURI + postUri;
+ server = RCSResourceObject::Builder(HOSTED_RESOURCEURI + "/hosting",
+ RESOURCETYPE, RESOURCEINTERFACE).
+ setDiscoverable(true).setObservable(true).build();
+ server->setAttribute(ATTR_KEY, RCSResourceAttributes::Value(ATTR_VALUE));
}
void discoveryResource()
{
discoveryTask = RCSDiscoveryManager::getInstance()->discoverResourceByType(
RCSAddress::multicast(), MULTICASTURI, resourceType,
- std::bind(onDiscoveryResource, std::placeholders::_1,
- std::weak_ptr<ResourceEncapsulationTestSimulator>(shared_from_this())));
+ std::bind(
+ &ResourceEncapsulationTestSimulator::onDiscoveryResource,
+ this, std::placeholders::_1));
mutexForDiscovery.lock();
}
catch(std::exception & e)
{
return remoteResource;
}
-
- void ChangeAttributeValue()
- {
- std::chrono::milliseconds interval(100);
- if (server != nullptr)
- server->setAttribute(ATTR_KEY, ATTR_VALUE + 10);
- std::this_thread::sleep_for(interval);
- }
-
- void ChangeResourceState()
- {
- std::chrono::milliseconds interval(400);
- if (server != nullptr)
- server = nullptr;
- std::this_thread::sleep_for(interval);
- }
};
namespace
{
+ bool isStarted = false;
+ bool isFinished = false;
+
+ ResourceEncapsulationTestSimulator testObject;
+
void onDiscoveryResource(RCSRemoteResourceObject::Ptr) { }
}
void SetUp()
{
TestWithMock::SetUp();
+ if(!isStarted)
+ {
+ testObject.createResource("1");
+
+ isStarted = true;
+ }
}
void TearDown()
{
TestWithMock::TearDown();
- if (ResourceHosting::getInstance())
+ if(isFinished)
{
- ResourceHosting::getInstance()->stopHosting();
+ testObject.destroy();
+ isStarted = false;
}
-
}
public:
EXPECT_EQ(ResourceHosting::getInstance(), ResourceHosting::getInstance());
}
-TEST_F(ResourceHostingTest, HostingFoundBeforeMakeOriginServer)
+TEST_F(ResourceHostingTest, startHosting)
{
- ResourceEncapsulationTestSimulator::Ptr testObject
- = std::make_shared<ResourceEncapsulationTestSimulator>();
- testObject->createResource();
-
- ResourceHosting::getInstance()->startHosting();
- std::this_thread::sleep_for(std::chrono::milliseconds{1000});
+ try
+ {
+ ResourceHosting::getInstance()->startHosting();
+ } catch (...)
+ {
+ FAIL() << "Non-Expected Exception";
+ }
+}
+TEST_F(ResourceHostingTest, HostingFoundBeforeMakeOriginServer)
+{
std::string uri = "";
+ testObject.getResourceServer()->setAttribute(
+ "Temperature", RCSResourceAttributes::Value((int)0));
+ waitForCondition();
+
mocks.OnCallFunc(onDiscoveryResource).Do(
[this, &uri, &testObject](RCSRemoteResourceObject::Ptr ptr)
{
- if(ptr->getUri() == testObject->getHostedServerUri())
+ if(ptr->getUri() == testObject.getHostedServerUri())
{
uri = ptr->getUri();
discoveryTask->cancel();
discoveryTask = RCSDiscoveryManager::getInstance()->discoverResourceByType(
RCSAddress::multicast(), "oic.r.resourcehosting", onDiscoveryResource);
- waitForCondition(2000);
+ waitForCondition();
- std::string mirroredUri = { testObject->getHostedServerUri() };
-
- testObject->destroy();
+ std::string mirroredUri = { testObject.getHostedServerUri() };
ASSERT_EQ(mirroredUri, uri);
}
-TEST_F(ResourceHostingTest, startHosting)
-{
- ResourceEncapsulationTestSimulator::Ptr testObject
- = std::make_shared<ResourceEncapsulationTestSimulator>();
- testObject->createResource();
-
- ResourceHosting::getInstance()->startHosting();
- std::this_thread::sleep_for(std::chrono::milliseconds{1000});
-
- testObject->destroy();
-}
TEST_F(ResourceHostingTest, stopHosting)
{
- ResourceEncapsulationTestSimulator::Ptr testObject
- = std::make_shared<ResourceEncapsulationTestSimulator>();
- testObject->createResource();
-
- ResourceHosting::getInstance()->startHosting();
- std::this_thread::sleep_for(std::chrono::milliseconds{1000});
-
- testObject->destroy();
-
ResourceHosting::getInstance()->stopHosting();
+ isFinished = true;
}
env.AppendTarget('hosting_test')
hosting_test_env.InstallTarget(hosting_test, 'hosting_test')
-#target_os = env.get('TARGET_OS')
-#if target_os == 'linux':
-# from tools.scons.RunTest import *
-# run_test(hosting_test_env,
-# '',
-# 'service/resource-hosting/unittest/hosting_test')
\ No newline at end of file
+if env.get('TEST') == '1':
+ target_os = env.get('TARGET_OS')
+ if target_os == 'linux':
+ from tools.scons.RunTest import *
+ run_test(hosting_test_env, '', 'service/resource-hosting/unittest/hosting_test')
\ No newline at end of file