41029b753cead1f9673deba0a63081412500edfe
[platform/upstream/iotivity.git] / service / resource-encapsulation / src / resourceCache / unittests / DataCacheTest.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 <iostream>
22 #include <gtest/gtest.h>
23 #include <HippoMocks/hippomocks.h>
24
25 #include "ResourceCacheManager.h"
26 #include "DataCache.h"
27 #include "RCSResourceAttributes.h"
28 #include "ResponseStatement.h"
29 #include "UnitTestHelper.h"
30
31 using namespace OIC::Service;
32
33 class DataCacheTest : public TestWithMock
34 {
35     public:
36         typedef std::function <
37         void(const OIC::Service::HeaderOptions &, const OIC::Service::ResponseStatement &,
38              int) > GetCallback;
39
40         typedef std::function <
41         void(const OIC::Service::HeaderOptions &, const OIC::Service::ResponseStatement &, int,
42              int) > ObserveCallback;
43     public:
44         std::shared_ptr<DataCache> cacheHandler;
45         PrimitiveResource::Ptr pResource;
46         CacheCB cb;
47         CacheID id;
48
49     protected:
50         virtual void SetUp()
51         {
52             TestWithMock::SetUp();
53             pResource = PrimitiveResource::Ptr(mocks.Mock< PrimitiveResource >(), [](PrimitiveResource *) {});
54
55             mocks.OnCall(pResource.get(), PrimitiveResource::isObservable).Return(false);
56             cacheHandler.reset(new DataCache());
57             cb = ([](std::shared_ptr<PrimitiveResource >, const RCSResourceAttributes &)->OCStackResult {return OC_STACK_OK;});
58         }
59
60         virtual void TearDown()
61         {
62             cacheHandler.reset();
63             pResource.reset();
64             TestWithMock::TearDown();
65         }
66 };
67
68 TEST_F(DataCacheTest, initializeDataCache_normalCase)
69 {
70
71     mocks.ExpectCall(pResource.get(), PrimitiveResource::requestGet);
72     mocks.ExpectCall(pResource.get(), PrimitiveResource::isObservable).Return(true);
73     mocks.ExpectCall(pResource.get(), PrimitiveResource::requestObserve);
74     mocks.OnCall(pResource.get(), PrimitiveResource::cancelObserve);
75
76     cacheHandler->initializeDataCache(pResource);
77 }
78
79 TEST_F(DataCacheTest, initializeDataCache_normalCaseObservable)
80 {
81
82     mocks.OnCall(pResource.get(), PrimitiveResource::requestGet).Do(
83         [](GetCallback callback)
84     {
85         OIC::Service::HeaderOptions hos;
86
87         OIC::Service::RCSResourceAttributes attr;
88         OIC::Service::ResponseStatement rep(attr);
89         callback(hos, rep, OC_STACK_OK);
90         return;
91     }
92     );
93     mocks.OnCall(pResource.get(), PrimitiveResource::isObservable).Return(true);
94     mocks.OnCall(pResource.get(), PrimitiveResource::requestObserve).Do(
95         [](ObserveCallback callback)
96     {
97         OIC::Service::HeaderOptions hos;
98         OIC::Service::RCSResourceAttributes attr;
99         OIC::Service::ResponseStatement rep(attr);
100         int seq = 0;
101         callback(hos, rep, OC_STACK_OK, seq);
102         return;
103     }
104     );
105     mocks.OnCall(pResource.get(), PrimitiveResource::cancelObserve);
106
107     cacheHandler->initializeDataCache(pResource);
108 }
109
110 TEST_F(DataCacheTest, initializeDataCache_normalCaseNonObservable)
111 {
112
113     mocks.OnCall(pResource.get(), PrimitiveResource::requestGet).Do(
114         [](GetCallback callback)
115     {
116         OIC::Service::HeaderOptions hos;
117
118         OIC::Service::RCSResourceAttributes attr;
119         OIC::Service::ResponseStatement rep(attr);
120         callback(hos, rep, OC_STACK_OK);
121         return;
122     }
123     );
124     mocks.OnCall(pResource.get(), PrimitiveResource::isObservable).Return(false);
125     mocks.OnCall(pResource.get(), PrimitiveResource::cancelObserve);
126
127     cacheHandler->initializeDataCache(pResource);
128
129     sleep(3);
130 }
131
132 TEST_F(DataCacheTest, initializeDataCache_normalCaseTimeOut)
133 {
134
135     mocks.ExpectCall(pResource.get(), PrimitiveResource::requestGet);
136     mocks.ExpectCall(pResource.get(), PrimitiveResource::isObservable).Return(true);
137     mocks.ExpectCall(pResource.get(), PrimitiveResource::requestObserve);
138     mocks.OnCall(pResource.get(), PrimitiveResource::cancelObserve);
139
140     cacheHandler->initializeDataCache(pResource);
141
142     sleep(3);
143 }
144
145 TEST_F(DataCacheTest, addSubscriber_normalCase)
146 {
147
148     mocks.ExpectCall(pResource.get(), PrimitiveResource::requestGet);
149     mocks.ExpectCall(pResource.get(), PrimitiveResource::isObservable).Return(true);
150     mocks.ExpectCall(pResource.get(), PrimitiveResource::requestObserve);
151     mocks.OnCall(pResource.get(), PrimitiveResource::cancelObserve);
152
153     cacheHandler->initializeDataCache(pResource);
154     REPORT_FREQUENCY rf = REPORT_FREQUENCY::UPTODATE;
155     long reportTime = 1l;
156
157     ASSERT_NE(cacheHandler->addSubscriber(cb, rf, reportTime), 0);
158 }
159
160 TEST_F(DataCacheTest, deleteSubsciber_normalCase)
161 {
162
163     mocks.ExpectCall(pResource.get(), PrimitiveResource::requestGet);
164     mocks.ExpectCall(pResource.get(), PrimitiveResource::isObservable).Return(true);
165     mocks.ExpectCall(pResource.get(), PrimitiveResource::requestObserve);
166     mocks.OnCall(pResource.get(), PrimitiveResource::cancelObserve);
167
168     cacheHandler->initializeDataCache(pResource);
169
170     REPORT_FREQUENCY rf = REPORT_FREQUENCY::UPTODATE;
171     long reportTime = 1l;
172
173     id = cacheHandler->addSubscriber(cb, rf, reportTime);
174
175     ASSERT_NE(cacheHandler->deleteSubscriber(id), 0);
176 }
177
178 TEST_F(DataCacheTest, getCacheState_normalCase)
179 {
180
181     mocks.ExpectCall(pResource.get(), PrimitiveResource::requestGet);
182     mocks.ExpectCall(pResource.get(), PrimitiveResource::isObservable).Return(true);
183     mocks.ExpectCall(pResource.get(), PrimitiveResource::requestObserve);
184     mocks.OnCall(pResource.get(), PrimitiveResource::cancelObserve);
185
186     cacheHandler->initializeDataCache(pResource);
187
188     ASSERT_EQ(cacheHandler->getCacheState(), CACHE_STATE::READY_YET);
189 }
190
191 TEST_F(DataCacheTest, getCachedData_normalCase)
192 {
193
194     mocks.ExpectCall(pResource.get(), PrimitiveResource::requestGet);
195     mocks.ExpectCall(pResource.get(), PrimitiveResource::isObservable).Return(true);
196     mocks.ExpectCall(pResource.get(), PrimitiveResource::requestObserve);
197     mocks.OnCall(pResource.get(), PrimitiveResource::cancelObserve);
198
199     cacheHandler->initializeDataCache(pResource);
200
201     ASSERT_EQ(cacheHandler->getCachedData(), RCSResourceAttributes());
202 }
203
204 TEST_F(DataCacheTest, getPrimitiveResource_normalCase)
205 {
206
207     mocks.ExpectCall(pResource.get(), PrimitiveResource::requestGet);
208     mocks.ExpectCall(pResource.get(), PrimitiveResource::isObservable).Return(true);
209     mocks.ExpectCall(pResource.get(), PrimitiveResource::requestObserve);
210     mocks.OnCall(pResource.get(), PrimitiveResource::cancelObserve);
211
212     cacheHandler->initializeDataCache(pResource);
213
214     ASSERT_EQ(cacheHandler->getPrimitiveResource(), pResource);
215 }
216
217 TEST_F(DataCacheTest, requestGet_normalCase)
218 {
219
220     mocks.ExpectCall(pResource.get(), PrimitiveResource::requestGet);
221     mocks.ExpectCall(pResource.get(), PrimitiveResource::isObservable).Return(true);
222     mocks.ExpectCall(pResource.get(), PrimitiveResource::requestObserve);
223     mocks.ExpectCall(pResource.get(), PrimitiveResource::requestGet);
224     mocks.OnCall(pResource.get(), PrimitiveResource::cancelObserve);
225
226     cacheHandler->initializeDataCache(pResource);
227
228     cacheHandler->requestGet();
229 }
230
231 TEST_F(DataCacheTest, isEmptySubscriber_normalCase)
232 {
233
234     mocks.ExpectCall(pResource.get(), PrimitiveResource::requestGet);
235     mocks.ExpectCall(pResource.get(), PrimitiveResource::isObservable).Return(true);
236     mocks.ExpectCall(pResource.get(), PrimitiveResource::requestObserve);
237     mocks.OnCall(pResource.get(), PrimitiveResource::cancelObserve);
238
239     cacheHandler->initializeDataCache(pResource);
240
241     ASSERT_EQ(cacheHandler->isEmptySubscriber(), true);
242 }
243
244 TEST_F(DataCacheTest, requestGet_normalCasetest)
245 {
246
247     mocks.ExpectCall(pResource.get(), PrimitiveResource::requestGet);
248     mocks.OnCall(pResource.get(), PrimitiveResource::isObservable).Return(true);
249     mocks.ExpectCall(pResource.get(), PrimitiveResource::requestObserve);
250     mocks.OnCall(pResource.get(), PrimitiveResource::requestGet).Do(
251         [](GetCallback callback)
252     {
253         OIC::Service::HeaderOptions hos;
254         OIC::Service::RCSResourceAttributes attr;
255         OIC::Service::ResponseStatement rep(attr);
256         callback(hos, rep, OC_STACK_OK);
257         return;
258     });
259     mocks.OnCall(pResource.get(), PrimitiveResource::cancelObserve);
260
261     cacheHandler->initializeDataCache(pResource);
262
263     cacheHandler->requestGet();
264 }