1 //******************************************************************
3 // Copyright 2016 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 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
22 #include <condition_variable>
24 #include "RemoteSceneList.h"
26 #include "UnitTestHelper.h"
27 #include "SceneCommons.h"
28 #include "SceneList.h"
29 #include "RCSResourceObject.h"
30 #include "RCSRemoteResourceObject.h"
31 #include "OCPlatform.h"
32 #include "RCSDiscoveryManager.h"
33 #include "RCSAddress.h"
36 using namespace OIC::Service;
39 constexpr int DEFAULT_WAITTIME = 2000;
41 constexpr char RESOURCE_URI[]{ "/a/light" };
42 constexpr char RESOURCE_TYPE[]{ "core.light" };
43 constexpr char KEY[]{ "power" };
44 constexpr char VALUE[]{ "off" };
46 static int lightNum = 0;
48 SceneList* g_sceneList = SceneList::getInstance();
49 RCSRemoteResourceObject::Ptr pListResource = nullptr;
50 RemoteSceneList::Ptr pSceneList = nullptr;
51 RemoteSceneCollection::Ptr pSceneCollection = nullptr;
52 RemoteScene::Ptr pScene = nullptr;
53 RemoteSceneAction::Ptr pSceneAction = nullptr;
54 RCSRemoteResourceObject::Ptr pLightResource = nullptr;
56 void discoverSceneListServer()
58 if(pListResource == nullptr)
60 std::vector< std::string > vecRT{ SCENE_LIST_RT };
61 std::vector< std::string > vecIF{ OC_RSRVD_INTERFACE_DEFAULT, OC::BATCH_INTERFACE };
63 pListResource = SceneUtils::createRCSResourceObject(
64 "coap://" + SceneUtils::getNetAddress() + SCENE_LIST_URI,
65 SCENE_CONNECTIVITY, vecRT, vecIF);
69 class RemoteSceneActionTest : public TestWithMock
74 TestWithMock::SetUp();
76 g_sceneList->getName();
77 discoverSceneListServer();
79 if(pSceneList == nullptr)
81 RemoteSceneList::createInstance(pListResource, std::bind(
82 &RemoteSceneActionTest::onRemoteSceneListCreated, this,
83 placeholders::_1, placeholders::_2));
88 if(pSceneCollection == nullptr)
90 pSceneList->addNewSceneCollection(std::bind(
91 &RemoteSceneActionTest::onRemoteSceneCollectionCreated, this,
92 placeholders::_1, placeholders::_2));
99 pSceneCollection->addNewScene("Test Scene", std::bind(
100 &RemoteSceneActionTest::onRemoteSceneCreated, this,
101 placeholders::_1, placeholders::_2));
107 void createLightServer()
109 if(pLightResource != nullptr)
114 RCSResourceObject::Ptr pResource = RCSResourceObject::Builder(
115 RESOURCE_URI, RESOURCE_TYPE, DEFAULT_INTERFACE).build();
116 pResource->setAttribute(KEY, RCSResourceAttributes::Value(VALUE));
119 = SceneUtils::createRCSResourceObject(
120 "coap://" + SceneUtils::getNetAddress() + RESOURCE_URI
121 + "/" + std::to_string(lightNum++),
122 (OCConnectivityType)(CT_ADAPTER_IP|CT_IP_USE_V4),
123 pResource->getTypes(), pResource->getInterfaces());
126 void waitForCallback(int waitingTime = DEFAULT_WAITTIME)
128 std::unique_lock< std::mutex > lock{ mutex };
129 cond.wait_for(lock, std::chrono::milliseconds{ waitingTime });
133 bool executionSucceeded;
134 std::condition_variable cond;
137 void onRemoteSceneListCreated(RemoteSceneList::Ptr remoteSceneList, int)
139 pSceneList = std::move(remoteSceneList);
143 void onRemoteSceneCollectionCreated(RemoteSceneCollection::Ptr remoteSceneCol, int)
145 pSceneCollection = remoteSceneCol;
149 void onRemoteSceneCreated(RemoteScene::Ptr remoteScene, int)
151 pScene = remoteScene;
155 void onRemoteSceneActionCreated(RemoteSceneAction::Ptr remoteSceneAction, int)
157 pSceneAction = remoteSceneAction;
161 void onActionUpdated(int)
167 TEST_F(RemoteSceneActionTest, createSceneAction)
171 if(pSceneAction == nullptr)
173 pScene->addNewSceneAction(pLightResource, KEY, RCSResourceAttributes::Value(VALUE),
174 std::bind(&RemoteSceneActionTest::onRemoteSceneActionCreated, this,
175 placeholders::_1, placeholders::_2));
179 ASSERT_NE(nullptr, pSceneAction);
182 TEST_F(RemoteSceneActionTest, createSceneActionWithEmptyRCSRemoteResourceObjectPtr)
184 ASSERT_THROW(pScene->addNewSceneAction(nullptr, KEY, RCSResourceAttributes::Value(VALUE),
185 std::bind(&RemoteSceneActionTest::onRemoteSceneActionCreated, this,
186 placeholders::_1, placeholders::_2)), RCSInvalidParameterException);
189 TEST_F(RemoteSceneActionTest, getAllRemoteSceneActions)
193 if(pSceneAction == nullptr)
195 pScene->addNewSceneAction(pLightResource, KEY, RCSResourceAttributes::Value(VALUE),
196 std::bind(&RemoteSceneActionTest::onRemoteSceneActionCreated, this,
197 placeholders::_1, placeholders::_2));
201 vector< RemoteSceneAction::Ptr > actions
202 = pScene->getRemoteSceneActions();
204 ASSERT_EQ((unsigned int)1, actions.size());
205 ASSERT_TRUE(actions.at(0)->getExecutionParameter().contains(KEY));
206 ASSERT_EQ(VALUE, actions.at(0)->getExecutionParameter().at(KEY).get< string >());
209 TEST_F(RemoteSceneActionTest, getRemoteSceneAction)
213 if(pSceneAction == nullptr)
215 pScene->addNewSceneAction(pLightResource, KEY, RCSResourceAttributes::Value(VALUE),
216 std::bind(&RemoteSceneActionTest::onRemoteSceneActionCreated, this,
217 placeholders::_1, placeholders::_2));
221 RemoteSceneAction::Ptr action = pScene->getRemoteSceneAction(pLightResource);
223 ASSERT_TRUE(action->getExecutionParameter().contains(KEY));
224 ASSERT_EQ(VALUE, action->getExecutionParameter().at(KEY).get< string >());
227 TEST_F(RemoteSceneActionTest, updateSceneAction)
231 if(pSceneAction == nullptr)
233 pScene->addNewSceneAction(pLightResource, KEY, RCSResourceAttributes::Value(VALUE),
234 std::bind(&RemoteSceneActionTest::onRemoteSceneActionCreated, this,
235 placeholders::_1, placeholders::_2));
239 pSceneAction->resetExecutionParameter(
240 KEY, RCSResourceAttributes::Value("on"), std::bind(&RemoteSceneActionTest::onActionUpdated, this,
245 ASSERT_EQ("on", pSceneAction->getExecutionParameter().at(KEY).get< string >());