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 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
24 #include <condition_variable>
26 #include "UnitTestHelper.h"
28 #include "RCSDiscoveryManager.h"
29 #include "RCSRemoteResourceObject.h"
30 #include "RCSResourceAttributes.h"
31 #include "RCSAddress.h"
33 #include "RequestObject.h"
35 using namespace testing;
36 using namespace OIC::Service;
38 class ResourceEncapsulationTestSimulator
39 : public std::enable_shared_from_this<ResourceEncapsulationTestSimulator>
42 typedef std::shared_ptr<ResourceEncapsulationTestSimulator> Ptr;
44 RCSResourceObject::Ptr server;
45 RCSRemoteResourceObject::Ptr remoteResource;
48 std::mutex mutexForDiscovery;
49 std::unique_ptr<RCSDiscoveryManager::DiscoveryTask> discoveryTask;
51 std::string MULTICASTURI;
52 std::string HOSTED_RESOURCEURI;
53 std::string RESOURCEURI;
54 std::string RESOURCETYPE;
55 std::string RESOURCEINTERFACE;
60 ResourceEncapsulationTestSimulator()
61 :server(nullptr), remoteResource(nullptr),
63 MULTICASTURI("/oic/res"),
64 HOSTED_RESOURCEURI("/a/TempHumSensor"),
65 RESOURCEURI("/a/TempHumSensor/hosting"),
66 RESOURCETYPE("resource.hosting"),
67 RESOURCEINTERFACE("oic.if.baseline"),
68 ATTR_KEY("Temperature"),
71 ~ResourceEncapsulationTestSimulator()
75 void onDiscoveryResource_Impl(RCSRemoteResourceObject::Ptr resourceObject)
77 if (remoteResource != nullptr)
82 if (RESOURCEURI.compare(resourceObject->getUri()) != 0)
87 remoteResource = resourceObject;
88 mutexForDiscovery.unlock();
91 static void onDiscoveryResource(RCSRemoteResourceObject::Ptr resourceObject,
92 std::weak_ptr<ResourceEncapsulationTestSimulator> rPtr)
94 std::shared_ptr<ResourceEncapsulationTestSimulator> ptr = rPtr.lock();
97 ptr->onDiscoveryResource_Impl(resourceObject);
100 void waitForDiscovery()
102 std::chrono::milliseconds interval(100);
105 if(mutexForDiscovery.try_lock())
107 mutexForDiscovery.unlock();
110 std::this_thread::sleep_for(interval);
113 void WaitForPtrBeingUnique()
115 while((remoteResource && !remoteResource.unique()) || (server && !server.unique()))
117 std::this_thread::sleep_for(std::chrono::milliseconds{ 100 });
124 if(server.use_count()) server.reset();
125 if(remoteResource.use_count()) remoteResource.reset();
126 WaitForPtrBeingUnique();
128 void defaultRunSimulator()
135 void createResource()
137 server = RCSResourceObject::Builder(RESOURCEURI, RESOURCETYPE, RESOURCEINTERFACE)
138 .setDiscoverable(true).setObservable(true).build();
139 server->setAttribute(ATTR_KEY, ATTR_VALUE);
142 void discoveryResource()
144 discoveryResource(RESOURCETYPE);
147 void discoveryResource(std::string & resourceType)
151 discoveryTask = RCSDiscoveryManager::getInstance()->discoverResourceByType(
152 RCSAddress::multicast(), MULTICASTURI, resourceType,
153 std::bind(onDiscoveryResource, std::placeholders::_1,
154 std::weak_ptr<ResourceEncapsulationTestSimulator>(shared_from_this())));
155 mutexForDiscovery.lock();
157 catch(std::exception & e)
159 std::cout << "exception : " << e.what() << std::endl;
163 std::string getServerUri() const
168 std::string getHostedServerUri() const
170 return HOSTED_RESOURCEURI;
173 RCSResourceObject::Ptr getResourceServer() const
178 RCSRemoteResourceObject::Ptr getRemoteResource() const
180 return remoteResource;
183 void ChangeAttributeValue()
185 std::chrono::milliseconds interval(100);
186 if (server != nullptr)
187 server->setAttribute(ATTR_KEY, ATTR_VALUE + 10);
188 std::this_thread::sleep_for(interval);
191 void ChangeResourceState()
193 std::chrono::milliseconds interval(400);
194 if (server != nullptr)
196 std::this_thread::sleep_for(interval);