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 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
21 #include <gtest/gtest.h>
22 #include <HippoMocks/hippomocks.h>
25 #include <condition_variable>
29 #include "ESMediatorSimulator.h"
30 #include "easysetup.h"
36 std::atomic_bool g_isStartedStack(false);
38 std::chrono::milliseconds g_waitForResponse(1000);
40 std::condition_variable responseCon;
41 std::mutex mutexForCondition;
43 ESMediatorSimulator g_mediatorSimul;
46 class TestWithMock: public testing::Test
52 virtual ~TestWithMock() noexcept(noexcept(std::declval<Test>().~Test())) {}
54 virtual void TearDown() {
67 class EasysetupEnrolleeTest : public TestWithMock
70 EasysetupEnrolleeTest() = default;
71 ~EasysetupEnrolleeTest() = default;
73 static void discoveredResource(std::shared_ptr<OC::OCResource>)
75 std::cout << __func__ << std::endl;
78 static void onGetStatus(std::shared_ptr< GetEnrolleeStatus >)
80 std::cout << __func__ << std::endl;
83 static void onGetConfiguration(std::shared_ptr< GetConfigurationStatus >)
85 std::cout << __func__ << std::endl;
88 static void deviceProvisioningStatusCallback(std::shared_ptr< DevicePropProvisioningStatus >)
90 std::cout << __func__ << std::endl;
93 static void cloudProvisioningStatusCallback(std::shared_ptr< CloudPropProvisioningStatus >)
95 std::cout << __func__ << std::endl;
98 static void WiFiProvCbInApp(ESWiFiProvData *)
100 std::cout << __func__ << std::endl;
103 static void DevConfProvCbInApp(ESDevConfProvData *)
105 std::cout << __func__ << std::endl;
108 static void CloudDataCbInApp(ESCloudProvData *)
110 std::cout << __func__ << std::endl;
113 ESResult startEnrollee()
115 ESResourceMask resourcemMask = (ESResourceMask)(ES_WIFI_RESOURCE |
117 ES_DEVCONF_RESOURCE);
118 ESProvisioningCallbacks callbacks;
119 callbacks.WiFiProvCb = &EasysetupEnrolleeTest::WiFiProvCbInApp;
120 callbacks.DevConfProvCb = &EasysetupEnrolleeTest::DevConfProvCbInApp;
121 callbacks.CloudDataProvCb = &EasysetupEnrolleeTest::CloudDataCbInApp;
123 return ESInitEnrollee(false, resourcemMask, callbacks);
126 ESResult setDeviceProperty()
128 ESDeviceProperty deviceProperty = {
129 {{WIFI_11G, WiFi_EOF}, WIFI_5G}, {"Test Device"}
132 return ESSetDeviceProperty(&deviceProperty);
139 TestWithMock::SetUp();
141 if (g_isStartedStack == false)
143 if (OCInit(NULL, 0, OC_SERVER) != OC_STACK_OK)
145 printf("OCStack init error!!\n");
149 g_isStartedStack = true;
155 TestWithMock::TearDown();
160 TEST_F(EasysetupEnrolleeTest, ESInitEnrolleeSuccess)
162 ESResult ret = startEnrollee();
163 EXPECT_EQ(ret, ES_OK);
164 ESTerminateEnrollee();
167 TEST_F(EasysetupEnrolleeTest, ESInitEnrolleeFailedByWiFiCbIsNull)
169 ESResourceMask resourcemMask = (ESResourceMask)(ES_WIFI_RESOURCE |
171 ES_DEVCONF_RESOURCE);
172 ESProvisioningCallbacks callbacks;
173 callbacks.WiFiProvCb = NULL;
174 callbacks.DevConfProvCb = &EasysetupEnrolleeTest::DevConfProvCbInApp;
175 callbacks.CloudDataProvCb = &EasysetupEnrolleeTest::CloudDataCbInApp;
177 ESResult ret = ESInitEnrollee(false, resourcemMask, callbacks);
178 EXPECT_EQ(ret, ES_ERROR);
179 ESTerminateEnrollee();
182 TEST_F(EasysetupEnrolleeTest, ESInitEnrolleeFailedByDevConfCbIsNull)
184 ESResourceMask resourcemMask = (ESResourceMask)(ES_WIFI_RESOURCE |
186 ES_DEVCONF_RESOURCE);
187 ESProvisioningCallbacks callbacks;
188 callbacks.WiFiProvCb = &EasysetupEnrolleeTest::WiFiProvCbInApp;
189 callbacks.DevConfProvCb = NULL;
190 callbacks.CloudDataProvCb = &EasysetupEnrolleeTest::CloudDataCbInApp;
192 ESResult ret = ESInitEnrollee(false, resourcemMask, callbacks);
193 EXPECT_EQ(ret, ES_ERROR);
194 ESTerminateEnrollee();
197 TEST_F(EasysetupEnrolleeTest, ESInitEnrolleeFailedByCloudCbIsNull)
199 ESResourceMask resourcemMask = (ESResourceMask)(ES_WIFI_RESOURCE |
201 ES_DEVCONF_RESOURCE);
202 ESProvisioningCallbacks callbacks;
203 callbacks.WiFiProvCb = &EasysetupEnrolleeTest::WiFiProvCbInApp;
204 callbacks.DevConfProvCb = &EasysetupEnrolleeTest::DevConfProvCbInApp;
205 callbacks.CloudDataProvCb = NULL;
207 ESResult ret = ESInitEnrollee(false, resourcemMask, callbacks);
208 EXPECT_EQ(ret, ES_ERROR);
209 ESTerminateEnrollee();
212 TEST_F(EasysetupEnrolleeTest, FindProvisioningResourceAtEnrolleeWithSuccess)
214 mocks.ExpectCallFunc(discoveredResource).Do(
215 [](std::shared_ptr<OC::OCResource> resource)
219 std::cout<<"DISCOVERED Resource:"<<std::endl;
220 // Get the resource host address
221 std::string uri = resource->uri();
222 std::cout << "\tURI of the resource: " << uri << std::endl;
223 } catch (OCException &e)
225 std::cout << e.reason() << std::endl;
230 ESResult ret = startEnrollee();
232 g_mediatorSimul.discoverRemoteEnrollee(discoveredResource);
234 std::unique_lock< std::mutex > lock{ mutexForCondition };
235 responseCon.wait_for(lock, g_waitForResponse);
237 EXPECT_EQ(ret, ES_OK);
239 ESTerminateEnrollee();
242 TEST_F(EasysetupEnrolleeTest, SetDevicePropertyWithSuccess)
244 ESResult ret = startEnrollee();
245 ret = setDeviceProperty();
246 EXPECT_EQ(ret, ES_OK);
247 ESTerminateEnrollee();
250 TEST_F(EasysetupEnrolleeTest, SetProvStatusWithSuccess)
252 ESResult ret = startEnrollee();
253 ret = ESSetState(ES_STATE_CONNECTED_TO_ENROLLER);
254 EXPECT_EQ(ret, ES_OK);
255 ESTerminateEnrollee();
258 TEST_F(EasysetupEnrolleeTest, SetErrorCodeWithSuccess)
260 ESResult ret = startEnrollee();
261 ret = ESSetErrorCode(ES_ERRCODE_PW_WRONG);
262 EXPECT_EQ(ret, ES_OK);
263 ESTerminateEnrollee();
266 TEST_F(EasysetupEnrolleeTest, DevicePropertyIsWellConstructedInResponsePayload)
268 bool isWellConstructed = false;
269 mocks.ExpectCallFunc(onGetConfiguration).Do(
270 [& isWellConstructed](std::shared_ptr< GetConfigurationStatus > status)
272 if(status->getESResult() == ES_OK)
274 EnrolleeConf conf = status->getEnrolleeConf();
275 if(conf.getWiFiModes().at(0) == WIFI_11G &&
276 conf.getWiFiFreq() == WIFI_5G &&
277 !strcmp(conf.getDeviceName().c_str(), "Test Device"))
279 isWellConstructed = true;
283 ESResult ret = startEnrollee();
284 ret = setDeviceProperty();
286 g_mediatorSimul.getConfiguration(onGetConfiguration);
288 std::unique_lock< std::mutex > lock{ mutexForCondition };
289 responseCon.wait_for(lock, g_waitForResponse);
291 EXPECT_EQ(ret, ES_OK);
293 ESTerminateEnrollee();
296 TEST_F(EasysetupEnrolleeTest, ProvisioningPropertiesIsWellConstructedInResponsePayload)
298 bool isWellConstructed = false;
299 mocks.ExpectCallFunc(onGetStatus).Do(
300 [& isWellConstructed](std::shared_ptr< GetEnrolleeStatus > status)
302 if(status->getESResult() == ES_OK)
304 EnrolleeStatus enrolleeStatus = status->getEnrolleeStatus();
306 if(enrolleeStatus.getProvStatus() == ES_STATE_CONNECTED_TO_ENROLLER &&
307 enrolleeStatus.getLastErrCode() == ES_ERRCODE_NO_INTERNETCONNECTION)
308 isWellConstructed = true;
311 ESResult ret = startEnrollee();
312 ret = setDeviceProperty();
313 ret = ESSetState(ES_STATE_CONNECTED_TO_ENROLLER);
314 ret = ESSetErrorCode(ES_ERRCODE_NO_INTERNETCONNECTION);
316 g_mediatorSimul.getStatus(onGetStatus);
318 std::unique_lock< std::mutex > lock{ mutexForCondition };
319 responseCon.wait_for(lock, g_waitForResponse);
321 EXPECT_EQ(ret, ES_OK);
323 ESTerminateEnrollee();
326 TEST_F(EasysetupEnrolleeTest, WiFiAndDevConfProperiesProvisionedWithSuccess)
328 int cntForReceivedCallbackWithSuccess = 0;
330 mocks.OnCallFunc(deviceProvisioningStatusCallback).Do(
331 [& cntForReceivedCallbackWithSuccess](std::shared_ptr< DevicePropProvisioningStatus > status)
333 if(status->getESResult() == ES_OK)
334 cntForReceivedCallbackWithSuccess++;
337 mocks.OnCallFunc(WiFiProvCbInApp).Do(
338 [& cntForReceivedCallbackWithSuccess](ESWiFiProvData *data)
340 if(!strcmp(data->ssid, "Iotivity_SSID") &&
341 !strcmp(data->pwd, "Iotivity_PWD") &&
342 data->authtype == WPA2_PSK &&
343 data->enctype == TKIP_AES)
344 cntForReceivedCallbackWithSuccess++;
346 mocks.OnCallFunc(DevConfProvCbInApp).Do(
347 [& cntForReceivedCallbackWithSuccess](ESDevConfProvData *data)
349 if(!strcmp(data->language, "korean") &&
350 !strcmp(data->country, "Korea"))
351 cntForReceivedCallbackWithSuccess++;
356 g_mediatorSimul.provisionDeviceProperties(deviceProvisioningStatusCallback);
358 std::unique_lock< std::mutex > lock{ mutexForCondition };
359 responseCon.wait_for(lock, g_waitForResponse);
361 EXPECT_EQ(cntForReceivedCallbackWithSuccess, 3);
363 ESTerminateEnrollee();
366 TEST_F(EasysetupEnrolleeTest, CloudServerProperiesProvisionedWithSuccess)
368 int cntForReceivedCallbackWithSuccess = 0;
370 mocks.OnCallFunc(cloudProvisioningStatusCallback).Do(
371 [& cntForReceivedCallbackWithSuccess](std::shared_ptr< CloudPropProvisioningStatus > status)
374 if(status->getESResult() == ES_OK)
375 cntForReceivedCallbackWithSuccess++;
378 mocks.OnCallFunc(CloudDataCbInApp).Do(
379 [& cntForReceivedCallbackWithSuccess](ESCloudProvData *data)
381 if(!strcmp(data->authCode, "authCode") &&
382 !strcmp(data->authProvider, "authProvider") &&
383 !strcmp(data->ciServer, "ciServer"))
384 cntForReceivedCallbackWithSuccess++;
389 g_mediatorSimul.provisionCloudProperties(cloudProvisioningStatusCallback);
391 std::unique_lock< std::mutex > lock{ mutexForCondition };
392 responseCon.wait_for(lock, g_waitForResponse);
394 EXPECT_EQ(cntForReceivedCallbackWithSuccess, 3);
396 ESTerminateEnrollee();