Imported Upstream version 1.1.0
[platform/upstream/iotivity.git] / service / scene-manager / unittests / SceneActionTest.cpp
1 //******************************************************************
2 //
3 // Copyright 2015 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 <condition_variable>
22 #include "UnitTestHelper.h"
23
24 #include "SceneList.h"
25 #include "RCSResourceObject.h"
26 #include "RCSRemoteResourceObject.h"
27 #include "SceneCommons.h"
28 #include "OCPlatform.h"
29
30 using namespace std;
31 using namespace OIC::Service;
32 using namespace OC;
33
34 typedef std::function<void (int)> ExecuteCallback;
35
36 constexpr char RESOURCE_URI[]{ "/a/light" };
37 constexpr char RESOURCE_TYPE[]{ "core.light" };
38 constexpr char RESOURCE_URI2[]{ "/a/fan" };
39 constexpr char RESOURCE_TYPE2[]{ "core.fan" };
40 constexpr char KEY[]{ "power" };
41 constexpr char VALUE[]{ "on" };
42 constexpr char KEY_2[]{ "state" };
43 constexpr char VALUE_2[]{ "100" };
44
45 class SceneActionTest: public TestWithMock
46 {
47 protected:
48     void SetUp()
49     {
50         TestWithMock::SetUp();
51         pSceneList = SceneList::getInstance();
52     }
53
54     void createServer(const std::string& resourceUri1, const std::string& resourceUri2)
55     {
56         auto pResource1 = RCSResourceObject::Builder(
57                 resourceUri1, RESOURCE_TYPE, DEFAULT_INTERFACE).build();
58         pResource1->setAttribute(KEY, VALUE);
59
60         auto ocResourcePtr = OC::OCPlatform::constructResourceObject(
61                 "coap://" + SceneUtils::getNetAddress(), resourceUri1,
62                 OCConnectivityType::CT_ADAPTER_IP, false,
63                 pResource1->getTypes(), pResource1->getInterfaces());
64         pRemoteResource1 = RCSRemoteResourceObject::fromOCResource(ocResourcePtr);
65
66         auto pResource2 = RCSResourceObject::Builder(
67                 resourceUri2, RESOURCE_TYPE2, DEFAULT_INTERFACE).build();
68         pResource2->setAttribute(KEY_2, VALUE_2);
69
70         ocResourcePtr = OC::OCPlatform::constructResourceObject(
71                         "coap://" + SceneUtils::getNetAddress(), resourceUri2,
72                         OCConnectivityType::CT_ADAPTER_IP, false,
73                         pResource2->getTypes(), pResource2->getInterfaces());
74         pRemoteResource2 = RCSRemoteResourceObject::fromOCResource(ocResourcePtr);
75     }
76
77     void createSceneCollectionAndScene()
78     {
79         auto pSceneCollection = pSceneList->addNewSceneCollection();
80         pScene1 = pSceneCollection->addNewScene("SceneTestName_1");
81     }
82
83     void createSceneAction()
84     {
85         pSceneAction1 = pScene1->addNewSceneAction(pRemoteResource1, KEY, VALUE);
86         pSceneAction2 = pScene1->addNewSceneAction(pRemoteResource2, KEY_2, VALUE_2);
87     }
88
89 public:
90     SceneList* pSceneList;
91     shared_ptr<Scene> pScene1;
92     shared_ptr<Scene> pScene2;
93     shared_ptr<SceneAction> pSceneAction1;
94     shared_ptr<SceneAction> pSceneAction2;
95     RCSRemoteResourceObject::Ptr pRemoteResource1;
96     RCSRemoteResourceObject::Ptr pRemoteResource2;
97
98 private:
99     std::condition_variable cond;
100     std::mutex mutex;
101 };
102
103 TEST_F(SceneActionTest, createSceneActionByEmptyRCSRemoteResourceObjectPtr)
104 {
105     createServer("/a/testuri1_1", "/a/testuri1_2");
106     createSceneCollectionAndScene();
107     ASSERT_THROW(pScene1->addNewSceneAction(
108             nullptr, KEY, VALUE), RCSInvalidParameterException);
109 }
110
111 TEST_F(SceneActionTest, createSceneActionByAlreadyExistedRCSRemoteResourceObjectPtr)
112 {
113     createServer("/a/testuri2_1", "/a/testuri2_2");
114     createSceneCollectionAndScene();
115     createSceneAction();
116     ASSERT_THROW(pScene1->addNewSceneAction(
117             pRemoteResource1, KEY, "off"), RCSBadRequestException);
118 }
119
120 TEST_F(SceneActionTest, getSceneActionInstance)
121 {
122     createServer("/a/testuri3_1", "/a/testuri3_2");
123     createSceneCollectionAndScene();
124     createSceneAction();
125
126     for(const auto &it : pSceneAction1->getExecutionParameter())
127     {
128         ASSERT_EQ(it.key(), KEY);
129         ASSERT_EQ(it.value(), VALUE);
130     }
131
132     for(const auto &it: pSceneAction2->getExecutionParameter())
133     {
134         ASSERT_EQ(it.key(), KEY_2);
135         ASSERT_EQ(it.value(), VALUE_2);
136     }
137 }
138
139 TEST_F(SceneActionTest, updateSceneAction)
140 {
141     createServer("/a/testuri4_1", "/a/testuri4_2");
142     createSceneCollectionAndScene();
143     createSceneAction();
144
145     pSceneAction1->resetExecutionParameter(KEY, "off");
146     for(const auto &it : pSceneAction1->getExecutionParameter())
147     {
148         ASSERT_EQ(it.key(), KEY);
149         ASSERT_EQ(it.value(), "off");
150     }
151 }
152
153 TEST_F(SceneActionTest, getRemoteResourceObject)
154 {
155     createServer("/a/testuri5_1", "/a/testuri5_2");
156     createSceneCollectionAndScene();
157     createSceneAction();
158
159     ASSERT_EQ(pSceneAction1->getRemoteResourceObject(), pRemoteResource1);
160 }