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 "SceneList.h"
25 #include "RCSResourceObject.h"
26 #include "RCSRemoteResourceObject.h"
27 #include "SceneCommons.h"
28 #include "OCPlatform.h"
30 #include <condition_variable>
35 using namespace OIC::Service;
38 typedef std::function<void (int)> ExecuteCallback;
40 constexpr char RESOURCE_URI[]{ "/a/light" };
41 constexpr char RESOURCE_TYPE[]{ "core.light" };
42 constexpr char RESOURCE_URI2[]{ "/a/fan" };
43 constexpr char RESOURCE_TYPE2[]{ "core.fan" };
44 constexpr char KEY[]{ "power" };
45 constexpr char VALUE[]{ "off" };
46 constexpr char KEY_2[]{ "state" };
47 constexpr char VALUE_2[]{ "100" };
49 class SceneTest: public TestWithMock
54 TestWithMock::SetUp();
55 pSceneList = SceneList::getInstance();
57 void waitForCb(int watingTime)
59 std::unique_lock< std::mutex > lock{ mutex };
60 cond.wait_for(lock, std::chrono::milliseconds{ watingTime });
66 void createSceneCollection()
68 pSceneCollection = pSceneList->addNewSceneCollection();
72 pScene1 = pSceneCollection->addNewScene("SceneTestName_1");
73 pScene2 = pSceneCollection->addNewScene("SceneTestName_2");
75 void createServer(const std::string& resourceUri1, const std::string& resourceUri2)
77 auto pResource1 = RCSResourceObject::Builder(
78 resourceUri1, RESOURCE_TYPE, DEFAULT_INTERFACE).build();
79 pResource1->setAttribute(KEY, VALUE);
81 auto ocResourcePtr = OC::OCPlatform::constructResourceObject(
82 "coap://" + SceneUtils::getNetAddress(), resourceUri1,
83 OCConnectivityType::CT_ADAPTER_IP, false,
84 pResource1->getTypes(), pResource1->getInterfaces());
85 pRemoteResource1 = RCSRemoteResourceObject::fromOCResource(ocResourcePtr);
87 auto pResource2 = RCSResourceObject::Builder(
88 resourceUri2, RESOURCE_TYPE2, DEFAULT_INTERFACE).build();
89 pResource2->setAttribute(KEY_2, VALUE_2);
91 ocResourcePtr = OC::OCPlatform::constructResourceObject(
92 "coap://" + SceneUtils::getNetAddress(), resourceUri2,
93 OCConnectivityType::CT_ADAPTER_IP, false,
94 pResource2->getTypes(), pResource2->getInterfaces());
95 pRemoteResource2 = RCSRemoteResourceObject::fromOCResource(ocResourcePtr);
99 SceneList* pSceneList;
100 shared_ptr<SceneCollection> pSceneCollection;
101 shared_ptr<Scene> pScene1;
102 shared_ptr<Scene> pScene2;
103 RCSRemoteResourceObject::Ptr pRemoteResource1;
104 RCSRemoteResourceObject::Ptr pRemoteResource2;
107 std::condition_variable cond;
110 void executeCallback(int /*code*/) {};
112 TEST_F(SceneTest, createSceneInstance)
114 createSceneCollection();
116 ASSERT_EQ("SceneTestName_1", pScene1->getName());
117 ASSERT_EQ("SceneTestName_2", pScene2->getName());
120 TEST_F(SceneTest, createSceneInstanceByEmptyName)
122 createSceneCollection();
123 ASSERT_THROW(pSceneCollection->addNewScene(""), RCSInvalidParameterException);
126 TEST_F(SceneTest, getSceneInstanceBySceneName)
128 createSceneCollection();
130 auto scene = pSceneCollection->getScene("SceneTestName_2");
131 EXPECT_EQ("SceneTestName_2", scene->getName());
134 TEST_F(SceneTest, getAllSceneInstance)
136 createSceneCollection();
139 vector<string> sceneNames{"SceneTestName_1", "SceneTestName_2"};
140 auto scenes = pSceneCollection->getScenes();
143 for(const auto &it : scenes)
145 for (const auto &name : sceneNames)
157 TEST_F(SceneTest, getSceneActionUsingRemoteResource)
159 createServer(RESOURCE_URI, RESOURCE_URI2);
160 createSceneCollection();
163 auto pSceneAction1 = pScene1->addNewSceneAction(pRemoteResource1, KEY, VALUE);
164 pSceneAction1->resetExecutionParameter(KEY_2, VALUE_2);
166 ASSERT_EQ(pScene1->getSceneAction(pRemoteResource1)->getExecutionParameter(),
167 pSceneAction1->getExecutionParameter());
170 TEST_F(SceneTest, getSceneActions)
172 createServer("/a/testuri1_1", "/a/testuri1_2");
173 createSceneCollection();
176 auto pSceneAction1 = pScene1->addNewSceneAction(pRemoteResource1, KEY, VALUE);
177 auto pSceneAction2 = pScene1->addNewSceneAction(pRemoteResource2, KEY, VALUE);
179 for(const auto & it : pScene1->getSceneActions())
181 ASSERT_EQ(it->getExecutionParameter(), pSceneAction1->getExecutionParameter());
185 TEST_F(SceneTest, executeScene)
187 mocks.ExpectCallFunc(executeCallback).Do([this](int){ proceed(); });
189 createServer("/a/testuri2_1", "/a/testuri2_2");
190 createSceneCollection();
192 pScene1->addNewSceneAction(pRemoteResource1, KEY, "on");
193 pScene1->addNewSceneAction(pRemoteResource2, KEY_2, VALUE_2);
195 pScene1->execute(executeCallback);
199 TEST_F(SceneTest, executeSceneUsingEmptyCallback)
201 createServer("/a/testuri3_1", "/a/testuri3_2");
202 createSceneCollection();
204 pScene1->addNewSceneAction(pRemoteResource1, KEY, "on");
205 pScene1->addNewSceneAction(pRemoteResource2, KEY_2, VALUE_2);
207 ASSERT_THROW(pScene1->execute(nullptr), RCSInvalidParameterException);