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 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
21 #include "UnitTestHelper.h"
23 #include "RCSRemoteResourceObject.h"
24 #include "RCSDiscoveryManager.h"
25 #include "RCSResourceObject.h"
26 #include "RCSAddress.h"
28 #include "OCPlatform.h"
30 #include <condition_variable>
33 using namespace OIC::Service;
34 using namespace OC::OCPlatform;
36 constexpr char RESOURCEURI[]{ "/a/TemperatureSensor" };
37 constexpr char SECOND_RESOURCEURI[]{ "/a/Light" };
38 constexpr char RESOURCETYPE[]{ "resource.type" };
39 constexpr char SECOND_RESOURCETYPE[]{ "resource.type.second" };
40 constexpr char RESOURCEINTERFACE[]{ "oic.if.baseline" };
41 constexpr int DEFAULT_DISCOVERYTASK_DELAYTIME = 3000;
43 void resourceDiscoveredForTwoTimesCall(RCSRemoteResourceObject::Ptr) {}
44 void resourceDiscoveredForCall(RCSRemoteResourceObject::Ptr) {}
45 void resourceDiscoveredForNeverCall(RCSRemoteResourceObject::Ptr) {}
47 class DiscoveryManagerTest: public TestWithMock
51 typedef std::unique_ptr<RCSDiscoveryManager::DiscoveryTask> DiscoveryTaskPtr;
52 typedef std::function< void(std::shared_ptr< RCSRemoteResourceObject >) >
53 ResourceDiscoveredCallback;
56 static DiscoveryTaskPtr discoverResource(ResourceDiscoveredCallback cb)
58 const std::string uri = "/oic/res";
59 return RCSDiscoveryManager::getInstance()->discoverResourceByType(RCSAddress::multicast(),
60 uri, RESOURCETYPE, cb);
65 discoveryTask = discoverResource(resourceDiscoveredForCall);
68 void cancelDiscovery()
70 discoveryTask->cancel();
75 return discoveryTask->isCanceled();
80 server = RCSResourceObject::Builder(RESOURCEURI, RESOURCETYPE, RESOURCEINTERFACE).build();
83 void createSecondResource()
85 secondServer = RCSResourceObject::Builder(SECOND_RESOURCEURI, SECOND_RESOURCETYPE, RESOURCEINTERFACE).build();
93 void waitForDiscoveryTask(int waitingTime = DEFAULT_DISCOVERYTASK_DELAYTIME)
95 std::unique_lock< std::mutex > lock{ mutex };
96 cond.wait_for(lock, std::chrono::milliseconds{ waitingTime });
101 std::condition_variable cond;
103 RCSResourceObject::Ptr server;
104 RCSResourceObject::Ptr secondServer;
105 RCSRemoteResourceObject::Ptr object;
106 DiscoveryTaskPtr discoveryTask;
109 TEST_F(DiscoveryManagerTest, resourceIsNotSupportedPresenceBeforeDiscovering)
113 mocks.ExpectCallFunc(resourceDiscoveredForCall).Do(
114 [this](RCSRemoteResourceObject::Ptr){ proceed();});
117 waitForDiscoveryTask();
120 TEST_F(DiscoveryManagerTest, resourceIsSupportedPresenceBeforeDiscovering)
125 mocks.ExpectCallFunc(resourceDiscoveredForCall).Do(
126 [this](RCSRemoteResourceObject::Ptr){ proceed();});
129 waitForDiscoveryTask();
133 TEST_F(DiscoveryManagerTest, resourceIsNotSupportedPresenceAfterDiscovering)
135 mocks.ExpectCallFunc(resourceDiscoveredForCall).Do(
136 [this](RCSRemoteResourceObject::Ptr){ proceed();});
140 waitForDiscoveryTask();
143 TEST_F(DiscoveryManagerTest, resourceIsSupportedPresenceAndAfterDiscovering)
145 mocks.ExpectCallFunc(resourceDiscoveredForCall).Do(
146 [this](RCSRemoteResourceObject::Ptr){ proceed();});
151 waitForDiscoveryTask();
155 TEST_F(DiscoveryManagerTest, discoveryRequestByMultipleResourceTypesAndFindResourceOfOneResourceType)
157 std::vector<std::string> resourceTypes{RESOURCETYPE, SECOND_RESOURCETYPE};
158 const std::string uri = "/oic/res";
160 createSecondResource();
162 mocks.ExpectCallFunc(resourceDiscoveredForCall).Do(
163 [this](RCSRemoteResourceObject::Ptr){ proceed();});
165 RCSDiscoveryManager::getInstance()->discoverResourceByTypes(RCSAddress::multicast(),
166 uri, resourceTypes, resourceDiscoveredForCall);
168 waitForDiscoveryTask();
171 TEST_F(DiscoveryManagerTest, discoveryRequestByMultipleResourceTypesAndFindResourcesOfTwoResourceTypes)
173 std::vector<std::string> resourceTypes{RESOURCETYPE, SECOND_RESOURCETYPE};
174 const std::string uri = "/oic/res";
175 unsigned int callTimes = 0;
178 createSecondResource();
180 mocks.OnCallFunc(resourceDiscoveredForTwoTimesCall).Do(
181 [this, &callTimes](RCSRemoteResourceObject::Ptr){
183 if (callTimes == 2) proceed();
187 RCSDiscoveryManager::getInstance()->discoverResourceByTypes(RCSAddress::multicast(),
188 uri, resourceTypes, resourceDiscoveredForTwoTimesCall);
190 waitForDiscoveryTask();
192 EXPECT_EQ(resourceTypes.size(), callTimes);
195 TEST_F(DiscoveryManagerTest, cancelDiscoveryTaskAfterDiscoveryResource)
200 mocks.NeverCallFunc(resourceDiscoveredForCall);
202 waitForDiscoveryTask();
206 TEST_F(DiscoveryManagerTest, cancelDiscoveryTaskNotStartDiscoveryResource)
213 TEST_F(DiscoveryManagerTest, isCanceledAfterCancelDiscoveryTask)
218 ASSERT_TRUE(isCanceled());
221 TEST_F(DiscoveryManagerTest, multipleDiscoveryRequestAndCancelJustOneDiscoveryRequest)
223 DiscoveryTaskPtr canceledTask = discoverResource(resourceDiscoveredForCall);
224 DiscoveryTaskPtr notCanceledTask_1 = discoverResource(resourceDiscoveredForCall);
225 DiscoveryTaskPtr notCanceledTask_2 = discoverResource(resourceDiscoveredForCall);
227 canceledTask->cancel();
229 ASSERT_TRUE(canceledTask->isCanceled());
230 ASSERT_FALSE(notCanceledTask_1->isCanceled());
231 ASSERT_FALSE(notCanceledTask_2->isCanceled());
234 TEST_F(DiscoveryManagerTest, equalDiscoveryRequestsAndCancelJustOneRequest)
236 mocks.ExpectCallFunc(resourceDiscoveredForCall).Do(
237 [this](RCSRemoteResourceObject::Ptr){ proceed();});
239 mocks.NeverCallFunc(resourceDiscoveredForNeverCall);
241 DiscoveryTaskPtr notCanceledTask = discoverResource(resourceDiscoveredForCall);
242 DiscoveryTaskPtr canceledTask = discoverResource(resourceDiscoveredForNeverCall);
243 canceledTask->cancel();
246 waitForDiscoveryTask();