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()))
56 virtual void TearDown()
70 class EasysetupEnrolleeTest : public TestWithMock
73 EasysetupEnrolleeTest() = default;
74 ~EasysetupEnrolleeTest() = default;
76 static void discoveredResource(std::shared_ptr<OC::OCResource>)
78 std::cout << __func__ << std::endl;
81 static void onGetStatus(std::shared_ptr< GetEnrolleeStatus >)
83 std::cout << __func__ << std::endl;
86 static void onGetConfiguration(std::shared_ptr< GetConfigurationStatus >)
88 std::cout << __func__ << std::endl;
91 static void deviceProvisioningStatusCallback(std::shared_ptr< DevicePropProvisioningStatus >)
93 std::cout << __func__ << std::endl;
96 static void cloudProvisioningStatusCallback(std::shared_ptr< CloudPropProvisioningStatus >)
98 std::cout << __func__ << std::endl;
101 static void WiFiProvCbInApp(ESWiFiProvData *)
103 std::cout << __func__ << std::endl;
106 static void DevConfProvCbInApp(ESDevConfProvData *)
108 std::cout << __func__ << std::endl;
111 static void CloudDataCbInApp(ESCloudProvData *)
113 std::cout << __func__ << std::endl;
116 ESResult startEnrollee()
118 ESResourceMask resourcemMask = (ESResourceMask)(ES_WIFI_RESOURCE |
120 ES_DEVCONF_RESOURCE);
121 ESProvisioningCallbacks callbacks;
122 callbacks.WiFiProvCb = &EasysetupEnrolleeTest::WiFiProvCbInApp;
123 callbacks.DevConfProvCb = &EasysetupEnrolleeTest::DevConfProvCbInApp;
124 callbacks.CloudDataProvCb = &EasysetupEnrolleeTest::CloudDataCbInApp;
126 return ESInitEnrollee(false, resourcemMask, callbacks);
129 ESResult setDeviceProperty()
131 ESDeviceProperty deviceProperty = {
132 {{WIFI_11G, WiFi_EOF}, WIFI_5G}, {"Test Device"}
135 return ESSetDeviceProperty(&deviceProperty);
142 TestWithMock::SetUp();
144 if (g_isStartedStack == false)
146 if (OCInit(NULL, 0, OC_SERVER) != OC_STACK_OK)
148 printf("OCStack init error!!\n");
152 g_isStartedStack = true;
158 TestWithMock::TearDown();
163 TEST_F(EasysetupEnrolleeTest, ESInitEnrolleeSuccess)
165 ESResult ret = startEnrollee();
166 EXPECT_EQ(ret, ES_OK);
167 ESTerminateEnrollee();
170 TEST_F(EasysetupEnrolleeTest, ESInitEnrolleeFailedByWiFiCbIsNull)
172 ESResourceMask resourcemMask = (ESResourceMask)(ES_WIFI_RESOURCE |
174 ES_DEVCONF_RESOURCE);
175 ESProvisioningCallbacks callbacks;
176 callbacks.WiFiProvCb = NULL;
177 callbacks.DevConfProvCb = &EasysetupEnrolleeTest::DevConfProvCbInApp;
178 callbacks.CloudDataProvCb = &EasysetupEnrolleeTest::CloudDataCbInApp;
180 ESResult ret = ESInitEnrollee(false, resourcemMask, callbacks);
181 EXPECT_EQ(ret, ES_ERROR);
182 ESTerminateEnrollee();
185 TEST_F(EasysetupEnrolleeTest, ESInitEnrolleeFailedByDevConfCbIsNull)
187 ESResourceMask resourcemMask = (ESResourceMask)(ES_WIFI_RESOURCE |
189 ES_DEVCONF_RESOURCE);
190 ESProvisioningCallbacks callbacks;
191 callbacks.WiFiProvCb = &EasysetupEnrolleeTest::WiFiProvCbInApp;
192 callbacks.DevConfProvCb = NULL;
193 callbacks.CloudDataProvCb = &EasysetupEnrolleeTest::CloudDataCbInApp;
195 ESResult ret = ESInitEnrollee(false, resourcemMask, callbacks);
196 EXPECT_EQ(ret, ES_ERROR);
197 ESTerminateEnrollee();
200 TEST_F(EasysetupEnrolleeTest, ESInitEnrolleeFailedByCloudCbIsNull)
202 ESResourceMask resourcemMask = (ESResourceMask)(ES_WIFI_RESOURCE |
204 ES_DEVCONF_RESOURCE);
205 ESProvisioningCallbacks callbacks;
206 callbacks.WiFiProvCb = &EasysetupEnrolleeTest::WiFiProvCbInApp;
207 callbacks.DevConfProvCb = &EasysetupEnrolleeTest::DevConfProvCbInApp;
208 callbacks.CloudDataProvCb = NULL;
210 ESResult ret = ESInitEnrollee(false, resourcemMask, callbacks);
211 EXPECT_EQ(ret, ES_ERROR);
212 ESTerminateEnrollee();
215 TEST_F(EasysetupEnrolleeTest, FindProvisioningResourceAtEnrolleeWithSuccess)
217 mocks.ExpectCallFunc(discoveredResource).Do(
218 [](std::shared_ptr<OC::OCResource> resource)
222 std::cout<<"DISCOVERED Resource:"<<std::endl;
223 // Get the resource host address
224 std::string uri = resource->uri();
225 std::cout << "\tURI of the resource: " << uri << std::endl;
226 } catch (OCException &e)
228 std::cout << e.reason() << std::endl;
233 ESResult ret = startEnrollee();
235 g_mediatorSimul.discoverRemoteEnrollee(discoveredResource);
237 std::unique_lock< std::mutex > lock{ mutexForCondition };
238 responseCon.wait_for(lock, g_waitForResponse);
240 EXPECT_EQ(ret, ES_OK);
242 ESTerminateEnrollee();
245 TEST_F(EasysetupEnrolleeTest, SetDevicePropertyWithSuccess)
247 ESResult ret = startEnrollee();
248 ret = setDeviceProperty();
249 EXPECT_EQ(ret, ES_OK);
250 ESTerminateEnrollee();
253 TEST_F(EasysetupEnrolleeTest, SetProvStatusWithSuccess)
255 ESResult ret = startEnrollee();
256 ret = ESSetState(ES_STATE_CONNECTED_TO_ENROLLER);
257 EXPECT_EQ(ret, ES_OK);
258 ESTerminateEnrollee();
261 TEST_F(EasysetupEnrolleeTest, SetErrorCodeWithSuccess)
263 ESResult ret = startEnrollee();
264 ret = ESSetErrorCode(ES_ERRCODE_PW_WRONG);
265 EXPECT_EQ(ret, ES_OK);
266 ESTerminateEnrollee();
269 TEST_F(EasysetupEnrolleeTest, DevicePropertyIsWellConstructedInResponsePayload)
271 bool isWellConstructed = false;
272 mocks.ExpectCallFunc(onGetConfiguration).Do(
273 [& isWellConstructed](std::shared_ptr< GetConfigurationStatus > status)
275 if(status->getESResult() == ES_OK)
277 EnrolleeConf conf = status->getEnrolleeConf();
278 if(conf.getWiFiModes().at(0) == WIFI_11G &&
279 conf.getWiFiFreq() == WIFI_5G &&
280 !strcmp(conf.getDeviceName().c_str(), "Test Device"))
282 isWellConstructed = true;
286 ESResult ret = startEnrollee();
287 ret = setDeviceProperty();
289 g_mediatorSimul.getConfiguration(onGetConfiguration);
291 std::unique_lock< std::mutex > lock{ mutexForCondition };
292 responseCon.wait_for(lock, g_waitForResponse);
294 EXPECT_EQ(ret, ES_OK);
296 ESTerminateEnrollee();
299 TEST_F(EasysetupEnrolleeTest, ProvisioningPropertiesIsWellConstructedInResponsePayload)
301 bool isWellConstructed = false;
302 mocks.ExpectCallFunc(onGetStatus).Do(
303 [& isWellConstructed](std::shared_ptr< GetEnrolleeStatus > status)
305 if(status->getESResult() == ES_OK)
307 EnrolleeStatus enrolleeStatus = status->getEnrolleeStatus();
310 if(enrolleeStatus.getProvStatus() == ES_STATE_CONNECTED_TO_ENROLLER &&
311 enrolleeStatus.getLastErrCode() == ES_ERRCODE_NO_INTERNETCONNECTION)
313 isWellConstructed = true;
317 ESResult ret = startEnrollee();
318 ret = setDeviceProperty();
319 ret = ESSetState(ES_STATE_CONNECTED_TO_ENROLLER);
320 ret = ESSetErrorCode(ES_ERRCODE_NO_INTERNETCONNECTION);
322 g_mediatorSimul.getStatus(onGetStatus);
324 std::unique_lock< std::mutex > lock{ mutexForCondition };
325 responseCon.wait_for(lock, g_waitForResponse);
327 EXPECT_EQ(ret, ES_OK);
329 ESTerminateEnrollee();
332 TEST_F(EasysetupEnrolleeTest, WiFiAndDevConfProperiesProvisionedWithSuccess)
334 int cntForReceivedCallbackWithSuccess = 0;
336 mocks.OnCallFunc(deviceProvisioningStatusCallback).Do(
337 [& cntForReceivedCallbackWithSuccess](std::shared_ptr< DevicePropProvisioningStatus > status)
339 if(status->getESResult() == ES_OK)
340 cntForReceivedCallbackWithSuccess++;
343 mocks.OnCallFunc(WiFiProvCbInApp).Do(
344 [& cntForReceivedCallbackWithSuccess](ESWiFiProvData *data)
346 if(!strcmp(data->ssid, "Iotivity_SSID") &&
347 !strcmp(data->pwd, "Iotivity_PWD") &&
348 data->authtype == WPA2_PSK &&
349 data->enctype == TKIP_AES)
351 cntForReceivedCallbackWithSuccess++;
354 mocks.OnCallFunc(DevConfProvCbInApp).Do(
355 [& cntForReceivedCallbackWithSuccess](ESDevConfProvData *data)
357 if(!strcmp(data->language, "korean") &&
358 !strcmp(data->country, "Korea"))
360 cntForReceivedCallbackWithSuccess++;
366 g_mediatorSimul.provisionDeviceProperties(deviceProvisioningStatusCallback);
368 std::unique_lock< std::mutex > lock{ mutexForCondition };
369 responseCon.wait_for(lock, g_waitForResponse);
371 EXPECT_EQ(cntForReceivedCallbackWithSuccess, 3);
373 ESTerminateEnrollee();
376 TEST_F(EasysetupEnrolleeTest, CloudServerProperiesProvisionedWithSuccess)
378 int cntForReceivedCallbackWithSuccess = 0;
380 mocks.OnCallFunc(cloudProvisioningStatusCallback).Do(
381 [& cntForReceivedCallbackWithSuccess](std::shared_ptr< CloudPropProvisioningStatus > status)
384 if(status->getESResult() == ES_OK)
386 cntForReceivedCallbackWithSuccess++;
390 mocks.OnCallFunc(CloudDataCbInApp).Do(
391 [& cntForReceivedCallbackWithSuccess](ESCloudProvData *data)
393 if(!strcmp(data->authCode, "authCode") &&
394 !strcmp(data->authProvider, "authProvider") &&
395 !strcmp(data->ciServer, "ciServer"))
397 cntForReceivedCallbackWithSuccess++;
403 g_mediatorSimul.provisionCloudProperties(cloudProvisioningStatusCallback);
405 std::unique_lock< std::mutex > lock{ mutexForCondition };
406 responseCon.wait_for(lock, g_waitForResponse);
408 EXPECT_EQ(cntForReceivedCallbackWithSuccess, 3);
410 ESTerminateEnrollee();