1 /* *****************************************************************
3 * Copyright 2015 Samsung Electronics All Rights Reserved.
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 * *****************************************************************/
23 #include "gtest/gtest.h"
27 #include "oic_malloc.h"
28 #include "oic_string.h"
29 #include "ocprovisioningmanager.h"
30 #include "oxmjustworks.h"
31 #include "oxmrandompin.h"
32 #include "securevirtualresourcetypes.h"
33 #include "provisioningdatabasemanager.h"
34 #ifdef _ENABLE_MULTIPLE_OWNER_
35 #include "multipleownershiptransfermanager.h"
36 #endif //_ENABLE_MULTIPLE_OWNER_
37 #include "srmutility.h"
38 #include "doxmresource.h"
40 #include "pmutility.h"
44 TEST(JustWorksOxMTest, NullParam)
46 OTMContext_t* otmCtx = NULL;
47 OCStackResult res = OC_STACK_ERROR;
48 uint8_t *payloadRes = NULL;
51 //LoadSecretJustWorksCallback always returns OC_STACK_OK.
52 res = LoadSecretJustWorksCallback(otmCtx);
53 EXPECT_TRUE(OC_STACK_OK == res);
55 res = CreateSecureSessionJustWorksCallback(otmCtx);
56 EXPECT_TRUE(OC_STACK_INVALID_PARAM == res);
58 res = CreateJustWorksSelectOxmPayload(otmCtx, &payloadRes, &size);
59 EXPECT_TRUE(OC_STACK_INVALID_PARAM == res);
61 res = CreateJustWorksOwnerTransferPayload(otmCtx, &payloadRes, &size);
62 EXPECT_TRUE(OC_STACK_INVALID_PARAM == res);
65 otmCtx2.selectedDeviceInfo = NULL;
67 //LoadSecretJustWorksCallback always returns OC_STACK_OK.
68 res = LoadSecretJustWorksCallback(&otmCtx2);
69 EXPECT_TRUE(OC_STACK_OK == res);
71 res = CreateSecureSessionJustWorksCallback(&otmCtx2);
72 EXPECT_TRUE(OC_STACK_INVALID_PARAM == res);
74 res = CreateJustWorksSelectOxmPayload(&otmCtx2, &payloadRes, &size);
75 EXPECT_TRUE(OC_STACK_INVALID_PARAM == res);
77 res = CreateJustWorksOwnerTransferPayload(&otmCtx2, &payloadRes, &size);
78 EXPECT_TRUE(OC_STACK_INVALID_PARAM == res);
81 TEST(RandomPinOxMTest, NullParam)
83 OTMContext_t* otmCtx = NULL;
84 OCStackResult res = OC_STACK_ERROR;
85 uint8_t *payloadRes = NULL;
88 //LoadSecretJustWorksCallback always returns OC_STACK_OK.
89 res = InputPinCodeCallback(otmCtx);
90 EXPECT_TRUE(OC_STACK_INVALID_PARAM == res);
92 res = CreateSecureSessionRandomPinCallback(otmCtx);
93 EXPECT_TRUE(OC_STACK_INVALID_PARAM == res);
95 res = CreatePinBasedSelectOxmPayload(otmCtx, &payloadRes, &size);
96 EXPECT_TRUE(OC_STACK_INVALID_PARAM == res);
98 res = CreatePinBasedOwnerTransferPayload(otmCtx, &payloadRes, &size);
99 EXPECT_TRUE(OC_STACK_INVALID_PARAM == res);
101 OTMContext_t otmCtx2;
102 otmCtx2.selectedDeviceInfo = NULL;
104 //LoadSecretJustWorksCallback always returns OC_STACK_OK.
105 res = InputPinCodeCallback(&otmCtx2);
106 EXPECT_TRUE(OC_STACK_INVALID_PARAM == res);
108 res = CreateSecureSessionRandomPinCallback(&otmCtx2);
109 EXPECT_TRUE(OC_STACK_INVALID_PARAM == res);
111 res = CreatePinBasedSelectOxmPayload(&otmCtx2, &payloadRes, &size);
112 EXPECT_TRUE(OC_STACK_INVALID_PARAM == res);
114 res = CreatePinBasedOwnerTransferPayload(&otmCtx2, &payloadRes, &size);
115 EXPECT_TRUE(OC_STACK_INVALID_PARAM == res);
119 /****************************************
120 * Test the OTM modules with sample server
121 ****************************************/
122 #define TAG "JUSTWORKS_UNITTEST"
123 #define OTM_TIMEOUT 5
124 #define DISCOVERY_TIMEOUT 5
126 #define SVR_DB_PATH "oic_svr_db_client.dat"
127 #define UT_PATH "resource/csdk/security/provisioning/unittest"
131 static uint8_t DEFAULT_SVR_DB[] = {
132 0xBF, 0x63, 0x61, 0x63, 0x6C, 0x59, 0x02, 0x79, 0xA4, 0x66, 0x61, 0x63, 0x6C, 0x69, 0x73, 0x74,
133 0xA1, 0x64, 0x61, 0x63, 0x65, 0x73, 0x83, 0xA3, 0x6B, 0x73, 0x75, 0x62, 0x6A, 0x65, 0x63, 0x74,
134 0x75, 0x75, 0x69, 0x64, 0x61, 0x2A, 0x69, 0x72, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x73,
135 0x83, 0xA4, 0x64, 0x68, 0x72, 0x65, 0x66, 0x68, 0x2F, 0x6F, 0x69, 0x63, 0x2F, 0x72, 0x65, 0x73,
136 0x62, 0x72, 0x74, 0x81, 0x6A, 0x6F, 0x69, 0x63, 0x2E, 0x77, 0x6B, 0x2E, 0x72, 0x65, 0x73, 0x62,
137 0x69, 0x66, 0x81, 0x69, 0x6F, 0x69, 0x63, 0x2E, 0x69, 0x66, 0x2E, 0x6C, 0x6C, 0x63, 0x72, 0x65,
138 0x6C, 0x60, 0xA4, 0x64, 0x68, 0x72, 0x65, 0x66, 0x66, 0x2F, 0x6F, 0x69, 0x63, 0x2F, 0x64, 0x62,
139 0x72, 0x74, 0x81, 0x68, 0x6F, 0x69, 0x63, 0x2E, 0x77, 0x6B, 0x2E, 0x64, 0x62, 0x69, 0x66, 0x82,
140 0x6F, 0x6F, 0x69, 0x63, 0x2E, 0x69, 0x66, 0x2E, 0x62, 0x61, 0x73, 0x65, 0x6C, 0x69, 0x6E, 0x65,
141 0x68, 0x6F, 0x69, 0x63, 0x2E, 0x69, 0x66, 0x2E, 0x72, 0x63, 0x72, 0x65, 0x6C, 0x60, 0xA4, 0x64,
142 0x68, 0x72, 0x65, 0x66, 0x66, 0x2F, 0x6F, 0x69, 0x63, 0x2F, 0x70, 0x62, 0x72, 0x74, 0x81, 0x68,
143 0x6F, 0x69, 0x63, 0x2E, 0x77, 0x6B, 0x2E, 0x70, 0x62, 0x69, 0x66, 0x82, 0x6F, 0x6F, 0x69, 0x63,
144 0x2E, 0x69, 0x66, 0x2E, 0x62, 0x61, 0x73, 0x65, 0x6C, 0x69, 0x6E, 0x65, 0x68, 0x6F, 0x69, 0x63,
145 0x2E, 0x69, 0x66, 0x2E, 0x72, 0x63, 0x72, 0x65, 0x6C, 0x60, 0x6A, 0x70, 0x65, 0x72, 0x6D, 0x69,
146 0x73, 0x73, 0x69, 0x6F, 0x6E, 0x02, 0xA3, 0x6B, 0x73, 0x75, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x75,
147 0x75, 0x69, 0x64, 0x61, 0x2A, 0x69, 0x72, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x73, 0x82,
148 0xA4, 0x64, 0x68, 0x72, 0x65, 0x66, 0x6D, 0x2F, 0x6F, 0x69, 0x63, 0x2F, 0x73, 0x65, 0x63, 0x2F,
149 0x64, 0x6F, 0x78, 0x6D, 0x62, 0x72, 0x74, 0x81, 0x6A, 0x6F, 0x69, 0x63, 0x2E, 0x72, 0x2E, 0x64,
150 0x6F, 0x78, 0x6D, 0x62, 0x69, 0x66, 0x81, 0x6F, 0x6F, 0x69, 0x63, 0x2E, 0x69, 0x66, 0x2E, 0x62,
151 0x61, 0x73, 0x65, 0x6C, 0x69, 0x6E, 0x65, 0x63, 0x72, 0x65, 0x6C, 0x60, 0xA4, 0x64, 0x68, 0x72,
152 0x65, 0x66, 0x6E, 0x2F, 0x6F, 0x69, 0x63, 0x2F, 0x73, 0x65, 0x63, 0x2F, 0x70, 0x73, 0x74, 0x61,
153 0x74, 0x62, 0x72, 0x74, 0x81, 0x6B, 0x6F, 0x69, 0x63, 0x2E, 0x72, 0x2E, 0x70, 0x73, 0x74, 0x61,
154 0x74, 0x62, 0x69, 0x66, 0x81, 0x6F, 0x6F, 0x69, 0x63, 0x2E, 0x69, 0x66, 0x2E, 0x62, 0x61, 0x73,
155 0x65, 0x6C, 0x69, 0x6E, 0x65, 0x63, 0x72, 0x65, 0x6C, 0x60, 0x6A, 0x70, 0x65, 0x72, 0x6D, 0x69,
156 0x73, 0x73, 0x69, 0x6F, 0x6E, 0x02, 0xA3, 0x6B, 0x73, 0x75, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x75,
157 0x75, 0x69, 0x64, 0x61, 0x2A, 0x69, 0x72, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x73, 0x82,
158 0xA4, 0x64, 0x68, 0x72, 0x65, 0x66, 0x6E, 0x2F, 0x6F, 0x69, 0x63, 0x2F, 0x73, 0x65, 0x63, 0x2F,
159 0x70, 0x63, 0x6F, 0x6E, 0x66, 0x62, 0x72, 0x74, 0x81, 0x6B, 0x6F, 0x69, 0x63, 0x2E, 0x72, 0x2E,
160 0x70, 0x63, 0x6F, 0x6E, 0x66, 0x62, 0x69, 0x66, 0x81, 0x6F, 0x6F, 0x69, 0x63, 0x2E, 0x69, 0x66,
161 0x2E, 0x62, 0x61, 0x73, 0x65, 0x6C, 0x69, 0x6E, 0x65, 0x63, 0x72, 0x65, 0x6C, 0x60, 0xA4, 0x64,
162 0x68, 0x72, 0x65, 0x66, 0x71, 0x2F, 0x6F, 0x69, 0x63, 0x2F, 0x73, 0x65, 0x63, 0x2F, 0x64, 0x70,
163 0x61, 0x69, 0x72, 0x69, 0x6E, 0x67, 0x62, 0x72, 0x74, 0x81, 0x6E, 0x6F, 0x69, 0x63, 0x2E, 0x72,
164 0x2E, 0x64, 0x70, 0x61, 0x69, 0x72, 0x69, 0x6E, 0x67, 0x62, 0x69, 0x66, 0x81, 0x6F, 0x6F, 0x69,
165 0x63, 0x2E, 0x69, 0x66, 0x2E, 0x62, 0x61, 0x73, 0x65, 0x6C, 0x69, 0x6E, 0x65, 0x63, 0x72, 0x65,
166 0x6C, 0x60, 0x6A, 0x70, 0x65, 0x72, 0x6D, 0x69, 0x73, 0x73, 0x69, 0x6F, 0x6E, 0x02, 0x6A, 0x72,
167 0x6F, 0x77, 0x6E, 0x65, 0x72, 0x75, 0x75, 0x69, 0x64, 0x78, 0x24, 0x36, 0x31, 0x36, 0x34, 0x36,
168 0x64, 0x36, 0x39, 0x2D, 0x36, 0x65, 0x34, 0x34, 0x2D, 0x36, 0x35, 0x37, 0x36, 0x2D, 0x36, 0x39,
169 0x36, 0x33, 0x2D, 0x36, 0x35, 0x35, 0x35, 0x37, 0x35, 0x36, 0x39, 0x36, 0x34, 0x33, 0x30, 0x62,
170 0x72, 0x74, 0x81, 0x69, 0x6F, 0x69, 0x63, 0x2E, 0x72, 0x2E, 0x61, 0x63, 0x6C, 0x62, 0x69, 0x66,
171 0x81, 0x6F, 0x6F, 0x69, 0x63, 0x2E, 0x69, 0x66, 0x2E, 0x62, 0x61, 0x73, 0x65, 0x6C, 0x69, 0x6E,
172 0x65, 0x65, 0x70, 0x73, 0x74, 0x61, 0x74, 0x58, 0x9D, 0xA9, 0x64, 0x69, 0x73, 0x6F, 0x70, 0xF5,
173 0x6A, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x75, 0x75, 0x69, 0x64, 0x78, 0x24, 0x36, 0x31, 0x36,
174 0x34, 0x36, 0x64, 0x36, 0x39, 0x2D, 0x36, 0x65, 0x34, 0x34, 0x2D, 0x36, 0x35, 0x37, 0x36, 0x2D,
175 0x36, 0x39, 0x36, 0x33, 0x2D, 0x36, 0x35, 0x35, 0x35, 0x37, 0x35, 0x36, 0x39, 0x36, 0x34, 0x33,
176 0x30, 0x62, 0x63, 0x6D, 0x00, 0x62, 0x74, 0x6D, 0x00, 0x62, 0x6F, 0x6D, 0x03, 0x62, 0x73, 0x6D,
177 0x03, 0x6A, 0x72, 0x6F, 0x77, 0x6E, 0x65, 0x72, 0x75, 0x75, 0x69, 0x64, 0x78, 0x24, 0x36, 0x31,
178 0x36, 0x34, 0x36, 0x64, 0x36, 0x39, 0x2D, 0x36, 0x65, 0x34, 0x34, 0x2D, 0x36, 0x35, 0x37, 0x36,
179 0x2D, 0x36, 0x39, 0x36, 0x33, 0x2D, 0x36, 0x35, 0x35, 0x35, 0x37, 0x35, 0x36, 0x39, 0x36, 0x34,
180 0x33, 0x30, 0x62, 0x72, 0x74, 0x81, 0x6B, 0x6F, 0x69, 0x63, 0x2E, 0x72, 0x2E, 0x70, 0x73, 0x74,
181 0x61, 0x74, 0x62, 0x69, 0x66, 0x81, 0x6F, 0x6F, 0x69, 0x63, 0x2E, 0x69, 0x66, 0x2E, 0x62, 0x61,
182 0x73, 0x65, 0x6C, 0x69, 0x6E, 0x65, 0x64, 0x64, 0x6F, 0x78, 0x6D, 0x58, 0xE8, 0xAA, 0x64, 0x6F,
183 0x78, 0x6D, 0x73, 0x81, 0x00, 0x66, 0x6F, 0x78, 0x6D, 0x73, 0x65, 0x6C, 0x00, 0x63, 0x73, 0x63,
184 0x74, 0x01, 0x65, 0x6F, 0x77, 0x6E, 0x65, 0x64, 0xF5, 0x6A, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65,
185 0x75, 0x75, 0x69, 0x64, 0x78, 0x24, 0x36, 0x31, 0x36, 0x34, 0x36, 0x64, 0x36, 0x39, 0x2D, 0x36,
186 0x65, 0x34, 0x34, 0x2D, 0x36, 0x35, 0x37, 0x36, 0x2D, 0x36, 0x39, 0x36, 0x33, 0x2D, 0x36, 0x35,
187 0x35, 0x35, 0x37, 0x35, 0x36, 0x39, 0x36, 0x34, 0x33, 0x30, 0x6C, 0x64, 0x65, 0x76, 0x6F, 0x77,
188 0x6E, 0x65, 0x72, 0x75, 0x75, 0x69, 0x64, 0x78, 0x24, 0x36, 0x31, 0x36, 0x34, 0x36, 0x64, 0x36,
189 0x39, 0x2D, 0x36, 0x65, 0x34, 0x34, 0x2D, 0x36, 0x35, 0x37, 0x36, 0x2D, 0x36, 0x39, 0x36, 0x33,
190 0x2D, 0x36, 0x35, 0x35, 0x35, 0x37, 0x35, 0x36, 0x39, 0x36, 0x34, 0x33, 0x30, 0x6A, 0x72, 0x6F,
191 0x77, 0x6E, 0x65, 0x72, 0x75, 0x75, 0x69, 0x64, 0x78, 0x24, 0x36, 0x31, 0x36, 0x34, 0x36, 0x64,
192 0x36, 0x39, 0x2D, 0x36, 0x65, 0x34, 0x34, 0x2D, 0x36, 0x35, 0x37, 0x36, 0x2D, 0x36, 0x39, 0x36,
193 0x33, 0x2D, 0x36, 0x35, 0x35, 0x35, 0x37, 0x35, 0x36, 0x39, 0x36, 0x34, 0x33, 0x30, 0x72, 0x78,
194 0x2E, 0x6F, 0x72, 0x67, 0x2E, 0x69, 0x6F, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x2E, 0x64, 0x70,
195 0x63, 0xF4, 0x62, 0x72, 0x74, 0x81, 0x6A, 0x6F, 0x69, 0x63, 0x2E, 0x72, 0x2E, 0x64, 0x6F, 0x78,
196 0x6D, 0x62, 0x69, 0x66, 0x81, 0x6F, 0x6F, 0x69, 0x63, 0x2E, 0x69, 0x66, 0x2E, 0x62, 0x61, 0x73,
197 0x65, 0x6C, 0x69, 0x6E, 0x65, 0xFF
200 static bool g_doneCB;
201 static bool g_callbackResult;
202 static pid_t g_myPID1;
203 static pid_t g_myPID2;
205 static const char* g_otmCtx = "Test User Context";
206 static OCProvisionDev_t* g_unownedDevices = NULL;
207 static OCProvisionDev_t* g_ownedDevices = NULL;
208 #ifdef _ENABLE_MULTIPLE_OWNER_
209 static OCProvisionDev_t* g_motEnabledDevices = NULL;
210 static OCProvisionDev_t* g_multiplOwnedDevices = NULL;
211 #endif //_ENABLE_MULTIPLE_OWNER_
213 static void GetCurrentWorkingDirectory(char* buf, size_t bufsize)
215 char cwd[1024] = {0};
216 const char* unittest_path = "resource/csdk/security/provisioning/unittest";
217 if(getcwd(cwd, sizeof(cwd)) != NULL)
219 if(strstr(cwd, unittest_path) == NULL)
221 #if defined __linux__
223 snprintf(buf, bufsize, "%s/out/linux/x86_64/release/%s/", cwd, unittest_path);
224 snprintf(buf, bufsize, "%s/out/linux/x86_64/release/%s/", cwd, unittest_path);
226 snprintf(buf, bufsize, "%s/out/linux/x86/release/%s/", cwd, unittest_path);
227 snprintf(buf, bufsize, "%s/out/linux/x86/release/%s/", cwd, unittest_path);
229 #endif //defined __linux__
233 snprintf(buf, bufsize, "%s/", cwd);
238 static FILE* fopen_prvnMng(const char* path, const char* mode)
240 (void)path; // unused |path| parameter
242 // input |g_svr_db_fname| internally by force, not using |path| parameter
243 // because |OCPersistentStorage::open| is called |OCPersistentStorage| internally
244 // with its own |SVR_DB_FILE_NAME|
245 char cwd[1024] = {0};
246 char svr_db_path[1024] = {0};
247 GetCurrentWorkingDirectory(cwd, sizeof(cwd));
248 snprintf(svr_db_path, sizeof(svr_db_path), "%s%s", cwd, SVR_DB_PATH);
249 return fopen(svr_db_path, mode);
252 // callback function(s) for provisioning client using C-level provisioning API
253 static void ownershipTransferCB(void* ctx, int UNUSED1, OCProvisionResult_t* UNUSED2, bool hasError)
261 OIC_LOG_V(INFO, TAG, "Ownership Transfer SUCCEEDED - ctx: %s", (char*) ctx);
265 OIC_LOG_V(ERROR, TAG, "Ownership Transfer FAILED - ctx: %s", (char*) ctx);
267 g_callbackResult = !hasError;
271 #ifdef _ENABLE_MULTIPLE_OWNER_
272 static void updateDoxmForMOTCB(void* ctx, int nOfRes, OCProvisionResult_t* arr, bool hasError)
276 OIC_LOG_V(INFO, TAG, "POST 'doxm' SUCCEEDED - ctx: %s", (char*) ctx);
280 OIC_LOG_V(ERROR, TAG, "POST 'doxm' FAILED - ctx: %s", (char*) ctx);
282 g_callbackResult = !hasError;
286 static void provisionPreconfiguredPinCB(void* ctx, int nOfRes, OCProvisionResult_t* arr, bool hasError)
290 OIC_LOG_V(INFO, TAG, "Provision Preconfigured-PIN SUCCEEDED - ctx: %s", (char*) ctx);
294 OIC_LOG_V(ERROR, TAG, "Provision Preconfigured-PIN FAILED - ctx: %s", (char*) ctx);
296 g_callbackResult = !hasError;
299 #endif //_ENABLE_MULTIPLE_OWNER_
301 // callback function(s) for provisioning client using C-level provisioning API
302 static void removeDeviceCB(void* ctx, int UNUSED1, OCProvisionResult_t* UNUSED2, bool hasError)
310 OIC_LOG_V(INFO, TAG, "Remove device request SUCCEEDED - ctx: %s", (char*) ctx);
314 OIC_LOG_V(ERROR, TAG, "Remove device request FAILED - ctx: %s", (char*) ctx);
316 g_callbackResult = !hasError;
321 static int waitCallbackRet(void)
323 struct timespec timeout;
325 timeout.tv_nsec = 100000000L;
327 for(long long i=0; !g_doneCB && OTM_TIMEOUT * 100000000L * 1000L > i; ++i)
329 nanosleep(&timeout, NULL);
330 if(OC_STACK_OK != OCProcess())
332 OIC_LOG(ERROR, TAG, "OCStack process error");
340 static void RemoveUnknownDeviceFromDevList(OCProvisionDev_t* devList)
344 memset(uuid1.id, 0x11, sizeof(uuid1.id));
345 memset(uuid2.id, 0x22, sizeof(uuid2.id));
347 OCProvisionDev_t* unknowDev = NULL;
348 OCProvisionDev_t* tempDev1 = NULL;
349 OCProvisionDev_t* tempDev2 =NULL;
350 LL_FOREACH_SAFE(devList, tempDev1, tempDev2)
353 if(!(memcmp(tempDev1->doxm->deviceID.id, uuid1.id, sizeof(uuid1.id)) == 0 ||
354 memcmp(tempDev1->doxm->deviceID.id, uuid2.id, sizeof(uuid2.id)) == 0))
356 LL_DELETE(devList, tempDev1);
357 LL_APPEND(unknowDev, tempDev1);
360 OCDeleteDiscoveredDevices(unknowDev);
363 TEST(InitForOTM, NullParam)
365 OCStackResult result = OC_STACK_ERROR;
367 OTMCallbackData_t otmcb;
368 otmcb.loadSecretCB = LoadSecretJustWorksCallback;
369 otmcb.createSecureSessionCB = CreateSecureSessionJustWorksCallback;
370 otmcb.createSelectOxmPayloadCB = CreateJustWorksSelectOxmPayload;
371 otmcb.createOwnerTransferPayloadCB = CreateJustWorksOwnerTransferPayload;
373 static OCPersistentStorage pstStr;
374 pstStr.open = fopen_prvnMng;
376 pstStr.write = fwrite;
377 pstStr.close = fclose;
378 pstStr.unlink = unlink;
380 //Get current path to execute the sample server.
381 char cwd[1024] = {0};
382 char server1_path[1024] = {0};
383 char server2_path[1024] = {0};
384 char pdb_path[1024] = {0};
385 char del_cmd[1024] = {0};
386 char svrdb_path[1024] = {0};
389 GetCurrentWorkingDirectory(cwd, sizeof(cwd));
390 EXPECT_TRUE(0 < strlen(cwd));
392 //Delete previous PDB, if exist.
393 GetCurrentWorkingDirectory(cwd, sizeof(cwd));
394 snprintf(del_cmd, sizeof(del_cmd), "rm -rf %stest.db", cwd);
397 //Delete previous SVR DB, if exist.
398 snprintf(del_cmd, sizeof(del_cmd), "rm -rf %s%s", cwd, SVR_DB_PATH);
401 //Generate default SVR DB.
402 snprintf(svrdb_path, sizeof(svrdb_path), "%s%s", cwd, SVR_DB_PATH);
403 fp = fopen(svrdb_path, "w");
406 size_t numberItems = fwrite(DEFAULT_SVR_DB, 1, sizeof(DEFAULT_SVR_DB), fp);
408 ASSERT_TRUE(sizeof(DEFAULT_SVR_DB) == numberItems);
411 //Execute sample server to perform ownership transfer
414 if(0 == (g_myPID1 = fork()))
416 snprintf(server1_path, sizeof(server1_path), "%ssample_server1", cwd);
417 status1 = system(server1_path);
420 if(0 == (g_myPID2 = fork()))
422 snprintf(server2_path, sizeof(server2_path), "%ssample_server2", cwd);
423 status2= system(server2_path);
427 //Waiting for sample server initialization.
430 // register the persistent storage handler for SVR
431 result = OCRegisterPersistentStorageHandler(&pstStr);
432 EXPECT_EQ(OC_STACK_OK, result);
434 // initialize OC stack and provisioning manager
435 result = OCInit(NULL, 0, OC_CLIENT_SERVER);
436 EXPECT_EQ(OC_STACK_OK, result);
438 //initialize Provisioning DB Manager
440 snprintf(pdb_path, sizeof(pdb_path), "%stest.db", cwd);
441 result = OCInitPM(pdb_path);
442 EXPECT_EQ(OC_STACK_OK, result);
444 // register callback function(s) for Justworks OxM
445 result = OCSetOwnerTransferCallbackData(OIC_JUST_WORKS, &otmcb);
446 EXPECT_EQ(OC_STACK_OK, result);
449 g_callbackResult = false;
452 TEST(PerformSecureResourceDiscovery, NullParam)
454 OCStackResult result = OC_STACK_ERROR;
455 OCProvisionDev_t* foundDevice = NULL;
458 ConvertStrToUuid("11111111-1111-1111-1111-111111111111", &uuid);
460 OIC_LOG(INFO, TAG, "Discovering Owned/Unowned Device using multicast\n");
461 result = OCDiscoverSingleDevice(DISCOVERY_TIMEOUT, &uuid, &foundDevice);
462 EXPECT_EQ(OC_STACK_OK, result);
464 int NumOfFoundDevice = 0;
465 OCProvisionDev_t* tempDev = foundDevice;
469 tempDev = tempDev->next;
471 PMDeleteDeviceList(foundDevice);
473 EXPECT_EQ(true, NumOfFoundDevice > 0);
476 TEST(PerformUnownedDeviceDiscovery, NullParam)
478 OCStackResult result = OC_STACK_ERROR;
480 OIC_LOG(INFO, TAG, "Discovering Only Unowned Devices on Network..\n");
481 result = OCDiscoverUnownedDevices(DISCOVERY_TIMEOUT, &g_unownedDevices);
482 EXPECT_EQ(OC_STACK_OK, result);
484 RemoveUnknownDeviceFromDevList(g_unownedDevices);
486 int NumOfUnownDevice = 0;
487 OCProvisionDev_t* tempDev = g_unownedDevices;
491 tempDev = tempDev->next;
494 //if two more devices are running on the subnet,
495 //stop the unittest process in order to prevent unittest failure.
496 if(2 < NumOfUnownDevice)
498 printf("%c[1;33;40m ******************************************************************\n", 0x1B);
499 printf("%c[1;33;40m [%d] devices are running on the your sub-network.\n", 0x1B, NumOfUnownDevice);
500 printf("%c[1;33;40m Please turn off the other devices, and then try once again.\n", 0x1B);
501 printf("%c[1;33;40m ******************************************************************", 0x1B);
502 printf("%c[1;0;40m \n", 0x1B);
504 OCStackResult result = OCStop();
505 EXPECT_EQ(OC_STACK_OK, result);
507 PMDeleteDeviceList(g_unownedDevices);
508 PMDeleteDeviceList(g_ownedDevices);
510 EXPECT_EQ(OC_STACK_OK, result);
512 kill(g_myPID2, SIGKILL);
513 kill(g_myPID1, SIGKILL);
515 int interpreter_res1 = system("pkill -f \"sample_server1\"");
516 EXPECT_TRUE(0 <= interpreter_res1);
517 int interpreter_res2 = system("pkill -f \"sample_server2\"");
518 EXPECT_TRUE(0 <= interpreter_res2);
523 EXPECT_EQ(2, NumOfUnownDevice);
526 TEST(PerformJustWorksOxM, NullParam)
528 OCStackResult result = OC_STACK_ERROR;
530 OIC_LOG(INFO, TAG, "Try Ownership Transfer for Unowned Devices...\n");
531 result = OCDoOwnershipTransfer((void*)g_otmCtx, g_unownedDevices, ownershipTransferCB);
532 EXPECT_EQ(OC_STACK_OK, result);
534 if(waitCallbackRet()) // input |g_doneCB| flag implicitly
536 OIC_LOG(ERROR, TAG, "OCProvisionCredentials callback error");
539 OIC_LOG(INFO, TAG, "Registered Discovered Unowned Device...\n");
541 EXPECT_EQ(true, g_callbackResult);
542 EXPECT_EQ(true, g_doneCB);
546 TEST(PerformOwnedDeviceDiscovery, NullParam)
548 OCStackResult result = OC_STACK_ERROR;
550 OIC_LOG(INFO, TAG, "Discovering Only Owned Devices on Network..\n");
551 result = OCDiscoverOwnedDevices(DISCOVERY_TIMEOUT, &g_ownedDevices);
552 EXPECT_EQ(OC_STACK_OK, result);
554 RemoveUnknownDeviceFromDevList(g_ownedDevices);
556 int NumOfOwnDevice = 0;
557 OCProvisionDev_t* tempDev = g_ownedDevices;
561 tempDev = tempDev->next;
564 EXPECT_EQ(2 , NumOfOwnDevice);
567 TEST(PerformLinkDevices, NullParam)
570 OCStackResult result = OC_STACK_ERROR;
571 result = GetDoxmDeviceID(&myUuid);
572 EXPECT_EQ(OC_STACK_OK, result);
574 //Extract target device except PT to perform link devices.
575 OCProvisionDev_t* dev1 = NULL;
576 OCProvisionDev_t* dev2 = NULL;
577 OCProvisionDev_t* tempDev = g_ownedDevices;
581 if(memcmp(tempDev->doxm->deviceID.id, myUuid.id, UUID_LENGTH) != 0)
587 else if(NULL == dev2)
593 tempDev = tempDev->next;
595 EXPECT_TRUE(NULL != dev1);
596 EXPECT_TRUE(NULL != dev2);
598 // TODO: Pairwise provisioning (Cred & ACL)
599 // TODO: This part will be updated after ACL and credential data-structure is updated.
601 EXPECT_EQ(OC_STACK_OK, result);
604 TEST(PerformUnlinkDevices, NullParam)
606 OCStackResult result = OC_STACK_OK;
608 // TODO: Unlink devices
609 // TODO: This part will be updated after ACL and credential data-structure is updated.
611 EXPECT_EQ(OC_STACK_OK, result);
614 #ifdef _ENABLE_MULTIPLE_OWNER_
615 TEST(RegisterPreconfiguredPIN, NullParam)
617 OCStackResult result = SetPreconfigPin("12341234", strlen("12341234"));
618 EXPECT_EQ(OC_STACK_OK, result);
621 TEST(EnableMOT, NullParam)
623 OCStackResult result = OC_STACK_OK;
625 if(NULL == g_ownedDevices)
627 OIC_LOG(INFO, TAG, "Discovering Only Owned Devices on Network..\n");
628 result = OCDiscoverOwnedDevices(DISCOVERY_TIMEOUT, &g_ownedDevices);
629 EXPECT_EQ(OC_STACK_OK, result);
630 RemoveUnknownDeviceFromDevList(g_ownedDevices);
632 EXPECT_NE((OCProvisionDev_t*)NULL, g_ownedDevices);
635 result = MOTChangeMode(NULL, g_ownedDevices, OIC_MULTIPLE_OWNER_ENABLE, updateDoxmForMOTCB);
636 EXPECT_EQ(OC_STACK_OK, result);
637 if(waitCallbackRet()) // input |g_doneCB| flag implicitly
639 OIC_LOG(ERROR, TAG, "OCChangeMOTMode callback error");
643 EXPECT_TRUE(g_callbackResult);
646 TEST(DiscoverMOTEnabledDevices, NullParam)
648 OCStackResult result = OC_STACK_OK;
650 if(g_motEnabledDevices)
652 PMDeleteDeviceList(g_motEnabledDevices);
655 OIC_LOG(INFO, TAG, "Discovering MOT Enabled Devices on Network..\n");
656 result = OCDiscoverMultipleOwnerEnabledDevices(DISCOVERY_TIMEOUT, &g_motEnabledDevices);
657 EXPECT_EQ(OC_STACK_OK, result);
658 RemoveUnknownDeviceFromDevList(g_motEnabledDevices);
659 EXPECT_NE((OCProvisionDev_t*)NULL, g_motEnabledDevices);
662 TEST(ProvisonPreconfiguredPIN, NullParam)
664 OCStackResult result = OC_STACK_OK;
667 result = OCProvisionPreconfPin(NULL, g_motEnabledDevices, "12341234", strlen("12341234"), provisionPreconfiguredPinCB);
668 EXPECT_EQ(OC_STACK_OK, result);
669 if(waitCallbackRet()) // input |g_doneCB| flag implicitly
671 OIC_LOG(ERROR, TAG, "OCProvisionPreconfPin callback error");
675 EXPECT_EQ(true, g_callbackResult);
678 TEST(SelectMOTMethod, NullParam)
680 OCStackResult result = OC_STACK_OK;
683 result = MOTSelectMOTMethod(NULL, g_motEnabledDevices, OIC_PRECONFIG_PIN, updateDoxmForMOTCB);
684 EXPECT_EQ(OC_STACK_OK, result);
685 if(waitCallbackRet()) // input |g_doneCB| flag implicitly
687 OIC_LOG(ERROR, TAG, "OCSelectMOTMethod callback error");
691 EXPECT_EQ(true, g_callbackResult);
694 // TODO: Need to new server to perform MOT
696 TEST(PerformMOT, NullParam)
698 OCStackResult result = OC_STACK_OK;
701 result = OCDoMultipleOwnershipTransfer(NULL, g_motEnabledDevices, ownershipTransferCB);
702 EXPECT_EQ(OC_STACK_OK, result);
703 if(waitCallbackRet()) // input |g_doneCB| flag implicitly
705 OIC_LOG(ERROR, TAG, "OCDoMultipleOwnershipTransfer callback error");
708 EXPECT_EQ(true, g_callbackResult);
711 TEST(DiscoverMultipleOwnedDevices, NullParam)
713 OCStackResult result = OC_STACK_OK;
715 if(g_multiplOwnedDevices)
717 PMDeleteDeviceList(g_multiplOwnedDevices);
720 OIC_LOG(INFO, TAG, "Discovering MOT Enabled Devices on Network..\n");
721 result = OCDiscoverMultipleOwnedDevices(DISCOVERY_TIMEOUT, &g_multiplOwnedDevices);
722 EXPECT_EQ(OC_STACK_OK, result);
723 RemoveUnknownDeviceFromDevList(g_multiplOwnedDevices);
724 EXPECT_TRUE(NULL != g_multiplOwnedDevices);
727 #endif //_ENABLE_MULTIPLE_OWNER_
729 TEST(PerformRemoveDevice, NullParam)
732 OCStackResult result = OC_STACK_ERROR;
733 result = GetDoxmDeviceID(&myUuid);
734 EXPECT_EQ(OC_STACK_OK, result);
736 //Extract target device except PT to perform remove device.
737 OCProvisionDev_t* removeDev = g_ownedDevices;
740 if(memcmp(removeDev->doxm->deviceID.id, myUuid.id, UUID_LENGTH) != 0)
744 removeDev = removeDev->next;
746 EXPECT_TRUE(NULL != removeDev);
749 g_callbackResult = false;
751 result = OCRemoveDevice((void*)g_otmCtx, DISCOVERY_TIMEOUT, removeDev, removeDeviceCB);
752 EXPECT_EQ(OC_STACK_OK, result);
753 EXPECT_EQ(true, g_callbackResult);
754 EXPECT_EQ(true, g_doneCB);
757 TEST(FinalizeOTMTest, NullParam)
759 OCStackResult result = OCStop();
760 EXPECT_EQ(OC_STACK_OK, result);
762 PMDeleteDeviceList(g_unownedDevices);
763 PMDeleteDeviceList(g_ownedDevices);
765 EXPECT_EQ(OC_STACK_OK, result);
767 kill(g_myPID2, SIGKILL);
768 kill(g_myPID1, SIGKILL);
770 int interpreter_res1 = system("pkill -f \"sample_server1\"");
771 EXPECT_TRUE(0 <= interpreter_res1);
772 int interpreter_res2 = system("pkill -f \"sample_server2\"");
773 EXPECT_TRUE(0 <= interpreter_res2);