Merge branch 'upstream' into tizen
[platform/upstream/iotivity.git] / service / scene-manager / unittests / RemoteSceneActionTest.cpp
1 //******************************************************************
2 //
3 // Copyright 2016 Samsung Electronics All Rights Reserved.
4 //
5 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
6 //
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
10 //
11 //      http://www.apache.org/licenses/LICENSE-2.0
12 //
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.
18 //
19 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
20
21 #include <mutex>
22 #include <condition_variable>
23
24 #include "RemoteSceneList.h"
25
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
33 using namespace std;
34 using namespace OIC::Service;
35 using namespace OC;
36
37 constexpr int DEFAULT_WAITTIME = 2000;
38
39 constexpr char RESOURCE_URI[]{ "/a/light" };
40 constexpr char RESOURCE_TYPE[]{ "core.light" };
41 constexpr char KEY[]{ "power" };
42 constexpr char VALUE[]{ "off" };
43
44 static int lightNum = 0;
45
46 RCSRemoteResourceObject::Ptr pListResource;
47 RemoteSceneList::Ptr pSceneList;
48 RemoteSceneCollection::Ptr pSceneCollection;
49 RemoteScene::Ptr pScene;
50 RemoteSceneAction::Ptr pSceneAction;
51 RCSRemoteResourceObject::Ptr pLightResource;
52 std::condition_variable cond;
53 std::mutex g_mutex;
54
55 void onRemoteSceneListCreated(RemoteSceneList::Ptr remoteSceneList, int)
56 {
57     pSceneList = std::move(remoteSceneList);
58     cond.notify_all();
59 }
60
61 void onRemoteSceneCollectionCreated(RemoteSceneCollection::Ptr remoteSceneCol, int)
62 {
63     pSceneCollection = remoteSceneCol;
64     cond.notify_all();
65 }
66
67 void onRemoteSceneCreated(RemoteScene::Ptr remoteScene, int)
68 {
69     pScene = remoteScene;
70     cond.notify_all();
71 }
72
73 void onRemoteSceneActionCreated(RemoteSceneAction::Ptr remoteSceneAction, int)
74 {
75     pSceneAction = remoteSceneAction;
76     cond.notify_all();
77 }
78
79 void onActionUpdated(int)
80 {
81     cond.notify_all();
82 }
83 void createListServer()
84 {
85     std::vector< std::string > vecRT{ SCENE_LIST_RT };
86     std::vector< std::string > vecIF{ OC_RSRVD_INTERFACE_DEFAULT, OC::BATCH_INTERFACE };
87
88     pListResource = SceneUtils::createRCSResourceObject(
89         "coap://" + SceneUtils::getNetAddress() + SCENE_LIST_URI,
90         SCENE_CONNECTIVITY, vecRT, vecIF);
91 }
92
93 void waitForCallback(int waitingTime = DEFAULT_WAITTIME)
94 {
95     std::unique_lock< std::mutex > lock{ g_mutex };
96     cond.wait_for(lock, std::chrono::milliseconds{ waitingTime });
97 }
98
99 void setup()
100 {
101     SceneList::getInstance()->getName();
102     createListServer();
103
104     RemoteSceneList::createInstance(pListResource, onRemoteSceneListCreated);
105
106     waitForCallback();
107
108     pSceneList->addNewSceneCollection(onRemoteSceneCollectionCreated);
109
110     waitForCallback();
111
112     pSceneCollection->addNewScene("Test Scene", onRemoteSceneCreated);
113
114     waitForCallback();
115 }
116
117
118 class RemoteSceneActionTest : public TestWithMock
119 {
120 protected:
121     void SetUp()
122     {
123         TestWithMock::SetUp();
124     }
125
126     void createLightServer()
127     {
128         RCSResourceObject::Ptr pResource = RCSResourceObject::Builder(
129             RESOURCE_URI, RESOURCE_TYPE, DEFAULT_INTERFACE).build();
130         pResource->setAttribute(KEY, RCSResourceAttributes::Value(VALUE));
131
132         pLightResource
133             = SceneUtils::createRCSResourceObject(
134             "coap://" + SceneUtils::getNetAddress() + RESOURCE_URI
135             + "/" + std::to_string(lightNum++),
136             SCENE_CONNECTIVITY, pResource->getTypes(), pResource->getInterfaces());
137     }
138 };
139
140 TEST_F(RemoteSceneActionTest, createSceneAction)
141 {
142     setup();
143     createLightServer();
144
145     pScene->addNewSceneAction(pLightResource, KEY, RCSResourceAttributes::Value(VALUE),
146         onRemoteSceneActionCreated);
147
148     waitForCallback();
149
150     ASSERT_NE(nullptr, pSceneAction);
151 }
152
153 TEST_F(RemoteSceneActionTest, createSceneActionWithEmptyRCSRemoteResourceObjectPtr)
154 {
155     ASSERT_THROW(pScene->addNewSceneAction(nullptr, KEY, RCSResourceAttributes::Value(VALUE),
156         onRemoteSceneActionCreated), RCSInvalidParameterException);
157 }
158
159 TEST_F(RemoteSceneActionTest, getAllRemoteSceneActions)
160 {
161     setup();
162     createLightServer();
163
164     pScene->addNewSceneAction(pLightResource, KEY, RCSResourceAttributes::Value(VALUE),
165         onRemoteSceneActionCreated);
166
167     waitForCallback();
168
169     vector< RemoteSceneAction::Ptr > actions
170         = pScene->getRemoteSceneActions();
171
172     ASSERT_EQ((unsigned int)1, actions.size());
173     ASSERT_TRUE(actions.at(0)->getExecutionParameter().contains(KEY));
174     ASSERT_EQ(VALUE, actions.at(0)->getExecutionParameter().at(KEY).get< string >());
175 }
176
177 TEST_F(RemoteSceneActionTest, getRemoteSceneAction)
178 {
179     createLightServer();
180
181     pScene->addNewSceneAction(pLightResource, KEY, RCSResourceAttributes::Value(VALUE),
182         onRemoteSceneActionCreated);
183
184     waitForCallback();
185
186     RemoteSceneAction::Ptr action = pScene->getRemoteSceneAction(pLightResource);
187
188     ASSERT_TRUE(action->getExecutionParameter().contains(KEY));
189     ASSERT_EQ(VALUE, action->getExecutionParameter().at(KEY).get< string >());
190 }
191
192 TEST_F(RemoteSceneActionTest, updateSceneAction)
193 {
194     createLightServer();
195
196     pScene->addNewSceneAction(pLightResource, KEY, RCSResourceAttributes::Value(VALUE),
197         onRemoteSceneActionCreated);
198
199     waitForCallback();
200
201     pSceneAction->resetExecutionParameter(
202         KEY, RCSResourceAttributes::Value("on"), onActionUpdated);
203
204     waitForCallback();
205
206     ASSERT_EQ("on", pSceneAction->getExecutionParameter().at(KEY).get< string >());
207 }