1 //******************************************************************
3 // Copyright 2015 Samsung Electronics All Rights Reserved.
5 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
7 // Licensed under the Apache License, Version 2.0 (the "License");
8 // you may not use this file except in compliance with the License.
9 // You may obtain a copy of the License at
11 // http://www.apache.org/licenses/LICENSE-2.0
13 // Unless required by applicable law or agreed to in writing, software
14 // distributed under the License is distributed on an "AS IS" BASIS,
15 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 // See the License for the specific language governing permissions and
17 // limitations under the License.
19 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
23 #include "ResourceEncapsulationTestSimulator.h"
24 #include "HostingObject.h"
26 #include "RCSDiscoveryManager.h"
28 using namespace testing;
29 using namespace OIC::Service;
33 bool isDeleted = false;
34 void onDestroy(std::weak_ptr<HostingObject> rPtr)
36 HostingObject::Ptr ptr = rPtr.lock();
40 void onDiscoveryResource(RCSRemoteResourceObject::Ptr){ }
42 void onUpdatedCache(const RCSResourceAttributes &) { }
45 class HostingObjectTest : public TestWithMock
48 ResourceEncapsulationTestSimulator::Ptr testObject;
49 RCSRemoteResourceObject::Ptr remoteObject;
51 std::mutex mutexForCondition;
52 std::condition_variable responseCon;
58 TestWithMock::SetUp();
60 testObject = std::make_shared<ResourceEncapsulationTestSimulator>();
61 testObject->defaultRunSimulator();
62 remoteObject = testObject->getRemoteResource();
69 TestWithMock::TearDown();
71 if(remoteObject.use_count() > 0)
73 if(remoteObject->isCaching())
75 remoteObject->stopCaching();
77 if(remoteObject->isMonitoring())
79 remoteObject->stopMonitoring();
82 testObject->destroy();
86 void waitForCondition(int waitingTime = 1000)
88 std::unique_lock< std::mutex > lock{ mutexForCondition };
89 responseCon.wait_for(lock, std::chrono::milliseconds{ waitingTime });
92 void notifyCondition()
94 responseCon.notify_all();
99 TEST_F(HostingObjectTest, startCachingAtInitialize)
101 HostingObject::Ptr instance = std::make_shared<HostingObject>();
102 instance->initializeHostingObject(
103 remoteObject, std::bind(onDestroy, std::weak_ptr<HostingObject>(instance)));
105 EXPECT_TRUE(remoteObject->isCaching());
108 TEST_F(HostingObjectTest, startMonitoringAtInitialize)
110 HostingObject::Ptr instance = std::make_shared<HostingObject>();
111 instance->initializeHostingObject(
112 remoteObject, std::bind(onDestroy, std::weak_ptr<HostingObject>(instance)));
114 ASSERT_TRUE(remoteObject->isMonitoring());
117 TEST_F(HostingObjectTest, getRemoteResourceisValid)
119 HostingObject::Ptr instance = std::make_shared<HostingObject>();
120 instance->initializeHostingObject(
121 remoteObject, std::bind(onDestroy, std::weak_ptr<HostingObject>(instance)));
123 ASSERT_EQ(remoteObject->getUri(), instance->getRemoteResource()->getUri());
126 TEST_F(HostingObjectTest, createMirroredServer)
128 int waitForResponse = 1000;
129 std::string uri = "";
131 HostingObject::Ptr instance = std::make_shared<HostingObject>();
132 instance->initializeHostingObject(
133 remoteObject, std::bind(onDestroy, std::weak_ptr<HostingObject>(instance)));
134 std::this_thread::sleep_for(std::chrono::milliseconds {waitForResponse});
136 std::unique_ptr<RCSDiscoveryManager::DiscoveryTask> discoveryTask = { };
138 mocks.OnCallFunc(onDiscoveryResource).Do(
139 [this, &uri, &discoveryTask](RCSRemoteResourceObject::Ptr ptr)
141 if(ptr->getUri() == testObject->getHostedServerUri())
144 discoveryTask->cancel();
149 discoveryTask = RCSDiscoveryManager::getInstance()->discoverResourceByType(
150 RCSAddress::multicast(), "resource.hosting", onDiscoveryResource);
151 waitForCondition(waitForResponse);
153 EXPECT_EQ(testObject->getHostedServerUri(), uri);
156 TEST_F(HostingObjectTest, UpdateCachedDataWhenChangedOriginResource)
158 int waitForResponse = 1000;
159 HostingObject::Ptr instance = std::make_shared<HostingObject>();
160 instance->initializeHostingObject(
161 remoteObject, std::bind(onDestroy, std::weak_ptr<HostingObject>(instance)));
162 std::this_thread::sleep_for(std::chrono::milliseconds {waitForResponse});
164 std::unique_ptr<RCSDiscoveryManager::DiscoveryTask> discoveryTask = { };
165 RCSRemoteResourceObject::Ptr discoveredResource = { };
167 mocks.OnCallFunc(onDiscoveryResource).Do(
168 [this, &discoveredResource, &discoveryTask](RCSRemoteResourceObject::Ptr ptr)
170 if(ptr->getUri() == testObject->getHostedServerUri())
172 discoveredResource = ptr;
173 discoveryTask->cancel();
178 discoveryTask = RCSDiscoveryManager::getInstance()->discoverResourceByType(
179 RCSAddress::multicast(), "resource.hosting", onDiscoveryResource);
180 waitForCondition(waitForResponse);
182 RCSResourceAttributes::Value result = { };
183 mocks.OnCallFunc(onUpdatedCache).Do(
184 [this, &result](const RCSResourceAttributes & att)
186 result = att.at("Temperature");
190 discoveredResource->startCaching(onUpdatedCache);
191 std::this_thread::sleep_for(std::chrono::milliseconds {waitForResponse});
193 RCSResourceAttributes::Value settingValue = 10;
194 testObject->getResourceServer()->setAttribute("Temperature", settingValue);
195 waitForCondition(waitForResponse);
197 EXPECT_EQ(result.toString(), settingValue.toString());