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 "oxmmanufacturercert.h"
33 #include "securevirtualresourcetypes.h"
34 #include "provisioningdatabasemanager.h"
35 #ifdef _ENABLE_MULTIPLE_OWNER_
36 #include "multipleownershiptransfermanager.h"
37 #endif //_ENABLE_MULTIPLE_OWNER_
38 #include "srmutility.h"
39 #include "doxmresource.h"
41 #include "pmutility.h"
45 TEST(JustWorksOxMTest, NullParam)
47 OTMContext_t* otmCtx = NULL;
48 OCStackResult res = OC_STACK_ERROR;
49 uint8_t *payloadRes = NULL;
52 //LoadSecretJustWorksCallback always returns OC_STACK_OK.
53 res = LoadSecretJustWorksCallback(otmCtx);
54 EXPECT_TRUE(OC_STACK_OK == res);
56 res = CreateSecureSessionJustWorksCallback(otmCtx);
57 EXPECT_TRUE(OC_STACK_INVALID_PARAM == res);
59 res = CreateJustWorksSelectOxmPayload(otmCtx, &payloadRes, &size);
60 EXPECT_TRUE(OC_STACK_INVALID_PARAM == res);
62 res = CreateJustWorksOwnerTransferPayload(otmCtx, &payloadRes, &size);
63 EXPECT_TRUE(OC_STACK_INVALID_PARAM == res);
66 otmCtx2.selectedDeviceInfo = NULL;
68 //LoadSecretJustWorksCallback always returns OC_STACK_OK.
69 res = LoadSecretJustWorksCallback(&otmCtx2);
70 EXPECT_TRUE(OC_STACK_OK == res);
72 res = CreateSecureSessionJustWorksCallback(&otmCtx2);
73 EXPECT_TRUE(OC_STACK_INVALID_PARAM == res);
75 res = CreateJustWorksSelectOxmPayload(&otmCtx2, &payloadRes, &size);
76 EXPECT_TRUE(OC_STACK_INVALID_PARAM == res);
78 res = CreateJustWorksOwnerTransferPayload(&otmCtx2, &payloadRes, &size);
79 EXPECT_TRUE(OC_STACK_INVALID_PARAM == res);
82 TEST(RandomPinOxMTest, NullParam)
84 OTMContext_t* otmCtx = NULL;
85 OCStackResult res = OC_STACK_ERROR;
86 uint8_t *payloadRes = NULL;
89 //LoadSecretJustWorksCallback always returns OC_STACK_OK.
90 res = InputPinCodeCallback(otmCtx);
91 EXPECT_TRUE(OC_STACK_INVALID_PARAM == res);
93 res = CreateSecureSessionRandomPinCallback(otmCtx);
94 EXPECT_TRUE(OC_STACK_INVALID_PARAM == res);
96 res = CreatePinBasedSelectOxmPayload(otmCtx, &payloadRes, &size);
97 EXPECT_TRUE(OC_STACK_INVALID_PARAM == res);
99 res = CreatePinBasedOwnerTransferPayload(otmCtx, &payloadRes, &size);
100 EXPECT_TRUE(OC_STACK_INVALID_PARAM == res);
102 OTMContext_t otmCtx2;
103 otmCtx2.selectedDeviceInfo = NULL;
105 //LoadSecretJustWorksCallback always returns OC_STACK_OK.
106 res = InputPinCodeCallback(&otmCtx2);
107 EXPECT_TRUE(OC_STACK_INVALID_PARAM == res);
109 res = CreateSecureSessionRandomPinCallback(&otmCtx2);
110 EXPECT_TRUE(OC_STACK_INVALID_PARAM == res);
112 res = CreatePinBasedSelectOxmPayload(&otmCtx2, &payloadRes, &size);
113 EXPECT_TRUE(OC_STACK_INVALID_PARAM == res);
115 res = CreatePinBasedOwnerTransferPayload(&otmCtx2, &payloadRes, &size);
116 EXPECT_TRUE(OC_STACK_INVALID_PARAM == res);
119 TEST(ManufacturerCertOxMTest, NullParam)
121 OTMContext_t* otmCtx = NULL;
122 OCStackResult res = OC_STACK_ERROR;
123 uint8_t *payloadRes = NULL;
126 res = PrepareMCertificateCallback(otmCtx);
127 EXPECT_TRUE(OC_STACK_INVALID_PARAM == res);
129 res = CreateSecureSessionMCertificateCallback(otmCtx);
130 EXPECT_TRUE(OC_STACK_INVALID_PARAM == res);
132 res = CreateMCertificateBasedSelectOxmPayload(otmCtx, &payloadRes, &size);
133 EXPECT_TRUE(OC_STACK_INVALID_PARAM == res);
135 res = CreateMCertificateBasedOwnerTransferPayload(otmCtx, &payloadRes, &size);
136 EXPECT_TRUE(OC_STACK_INVALID_PARAM == res);
138 OTMContext_t otmCtx2;
139 otmCtx2.selectedDeviceInfo = NULL;
141 res = InputPinCodeCallback(&otmCtx2);
142 EXPECT_TRUE(OC_STACK_INVALID_PARAM == res);
144 res = CreateSecureSessionMCertificateCallback(&otmCtx2);
145 EXPECT_TRUE(OC_STACK_INVALID_PARAM == res);
147 res = CreateMCertificateBasedSelectOxmPayload(&otmCtx2, &payloadRes, &size);
148 EXPECT_TRUE(OC_STACK_INVALID_PARAM == res);
150 res = CreateMCertificateBasedOwnerTransferPayload(&otmCtx2, &payloadRes, &size);
151 EXPECT_TRUE(OC_STACK_INVALID_PARAM == res);
154 /****************************************
155 * Test the OTM modules with sample server
156 ****************************************/
157 #define TAG "JUSTWORKS_UNITTEST"
158 #define OTM_TIMEOUT 5
159 #define DISCOVERY_TIMEOUT 5
161 #define SVR_DB_PATH "oic_svr_db_client.dat"
162 #define UT_PATH "resource/csdk/security/provisioning/unittest"
166 static uint8_t DEFAULT_SVR_DB[] = {
167 0xBF, 0x63, 0x61, 0x63, 0x6C, 0x59, 0x02, 0x79, 0xA4, 0x66, 0x61, 0x63, 0x6C, 0x69, 0x73, 0x74,
168 0xA1, 0x64, 0x61, 0x63, 0x65, 0x73, 0x83, 0xA3, 0x6B, 0x73, 0x75, 0x62, 0x6A, 0x65, 0x63, 0x74,
169 0x75, 0x75, 0x69, 0x64, 0x61, 0x2A, 0x69, 0x72, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x73,
170 0x83, 0xA4, 0x64, 0x68, 0x72, 0x65, 0x66, 0x68, 0x2F, 0x6F, 0x69, 0x63, 0x2F, 0x72, 0x65, 0x73,
171 0x62, 0x72, 0x74, 0x81, 0x6A, 0x6F, 0x69, 0x63, 0x2E, 0x77, 0x6B, 0x2E, 0x72, 0x65, 0x73, 0x62,
172 0x69, 0x66, 0x81, 0x69, 0x6F, 0x69, 0x63, 0x2E, 0x69, 0x66, 0x2E, 0x6C, 0x6C, 0x63, 0x72, 0x65,
173 0x6C, 0x60, 0xA4, 0x64, 0x68, 0x72, 0x65, 0x66, 0x66, 0x2F, 0x6F, 0x69, 0x63, 0x2F, 0x64, 0x62,
174 0x72, 0x74, 0x81, 0x68, 0x6F, 0x69, 0x63, 0x2E, 0x77, 0x6B, 0x2E, 0x64, 0x62, 0x69, 0x66, 0x82,
175 0x6F, 0x6F, 0x69, 0x63, 0x2E, 0x69, 0x66, 0x2E, 0x62, 0x61, 0x73, 0x65, 0x6C, 0x69, 0x6E, 0x65,
176 0x68, 0x6F, 0x69, 0x63, 0x2E, 0x69, 0x66, 0x2E, 0x72, 0x63, 0x72, 0x65, 0x6C, 0x60, 0xA4, 0x64,
177 0x68, 0x72, 0x65, 0x66, 0x66, 0x2F, 0x6F, 0x69, 0x63, 0x2F, 0x70, 0x62, 0x72, 0x74, 0x81, 0x68,
178 0x6F, 0x69, 0x63, 0x2E, 0x77, 0x6B, 0x2E, 0x70, 0x62, 0x69, 0x66, 0x82, 0x6F, 0x6F, 0x69, 0x63,
179 0x2E, 0x69, 0x66, 0x2E, 0x62, 0x61, 0x73, 0x65, 0x6C, 0x69, 0x6E, 0x65, 0x68, 0x6F, 0x69, 0x63,
180 0x2E, 0x69, 0x66, 0x2E, 0x72, 0x63, 0x72, 0x65, 0x6C, 0x60, 0x6A, 0x70, 0x65, 0x72, 0x6D, 0x69,
181 0x73, 0x73, 0x69, 0x6F, 0x6E, 0x02, 0xA3, 0x6B, 0x73, 0x75, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x75,
182 0x75, 0x69, 0x64, 0x61, 0x2A, 0x69, 0x72, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x73, 0x82,
183 0xA4, 0x64, 0x68, 0x72, 0x65, 0x66, 0x6D, 0x2F, 0x6F, 0x69, 0x63, 0x2F, 0x73, 0x65, 0x63, 0x2F,
184 0x64, 0x6F, 0x78, 0x6D, 0x62, 0x72, 0x74, 0x81, 0x6A, 0x6F, 0x69, 0x63, 0x2E, 0x72, 0x2E, 0x64,
185 0x6F, 0x78, 0x6D, 0x62, 0x69, 0x66, 0x81, 0x6F, 0x6F, 0x69, 0x63, 0x2E, 0x69, 0x66, 0x2E, 0x62,
186 0x61, 0x73, 0x65, 0x6C, 0x69, 0x6E, 0x65, 0x63, 0x72, 0x65, 0x6C, 0x60, 0xA4, 0x64, 0x68, 0x72,
187 0x65, 0x66, 0x6E, 0x2F, 0x6F, 0x69, 0x63, 0x2F, 0x73, 0x65, 0x63, 0x2F, 0x70, 0x73, 0x74, 0x61,
188 0x74, 0x62, 0x72, 0x74, 0x81, 0x6B, 0x6F, 0x69, 0x63, 0x2E, 0x72, 0x2E, 0x70, 0x73, 0x74, 0x61,
189 0x74, 0x62, 0x69, 0x66, 0x81, 0x6F, 0x6F, 0x69, 0x63, 0x2E, 0x69, 0x66, 0x2E, 0x62, 0x61, 0x73,
190 0x65, 0x6C, 0x69, 0x6E, 0x65, 0x63, 0x72, 0x65, 0x6C, 0x60, 0x6A, 0x70, 0x65, 0x72, 0x6D, 0x69,
191 0x73, 0x73, 0x69, 0x6F, 0x6E, 0x02, 0xA3, 0x6B, 0x73, 0x75, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x75,
192 0x75, 0x69, 0x64, 0x61, 0x2A, 0x69, 0x72, 0x65, 0x73, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x73, 0x82,
193 0xA4, 0x64, 0x68, 0x72, 0x65, 0x66, 0x6E, 0x2F, 0x6F, 0x69, 0x63, 0x2F, 0x73, 0x65, 0x63, 0x2F,
194 0x70, 0x63, 0x6F, 0x6E, 0x66, 0x62, 0x72, 0x74, 0x81, 0x6B, 0x6F, 0x69, 0x63, 0x2E, 0x72, 0x2E,
195 0x70, 0x63, 0x6F, 0x6E, 0x66, 0x62, 0x69, 0x66, 0x81, 0x6F, 0x6F, 0x69, 0x63, 0x2E, 0x69, 0x66,
196 0x2E, 0x62, 0x61, 0x73, 0x65, 0x6C, 0x69, 0x6E, 0x65, 0x63, 0x72, 0x65, 0x6C, 0x60, 0xA4, 0x64,
197 0x68, 0x72, 0x65, 0x66, 0x71, 0x2F, 0x6F, 0x69, 0x63, 0x2F, 0x73, 0x65, 0x63, 0x2F, 0x64, 0x70,
198 0x61, 0x69, 0x72, 0x69, 0x6E, 0x67, 0x62, 0x72, 0x74, 0x81, 0x6E, 0x6F, 0x69, 0x63, 0x2E, 0x72,
199 0x2E, 0x64, 0x70, 0x61, 0x69, 0x72, 0x69, 0x6E, 0x67, 0x62, 0x69, 0x66, 0x81, 0x6F, 0x6F, 0x69,
200 0x63, 0x2E, 0x69, 0x66, 0x2E, 0x62, 0x61, 0x73, 0x65, 0x6C, 0x69, 0x6E, 0x65, 0x63, 0x72, 0x65,
201 0x6C, 0x60, 0x6A, 0x70, 0x65, 0x72, 0x6D, 0x69, 0x73, 0x73, 0x69, 0x6F, 0x6E, 0x02, 0x6A, 0x72,
202 0x6F, 0x77, 0x6E, 0x65, 0x72, 0x75, 0x75, 0x69, 0x64, 0x78, 0x24, 0x36, 0x31, 0x36, 0x34, 0x36,
203 0x64, 0x36, 0x39, 0x2D, 0x36, 0x65, 0x34, 0x34, 0x2D, 0x36, 0x35, 0x37, 0x36, 0x2D, 0x36, 0x39,
204 0x36, 0x33, 0x2D, 0x36, 0x35, 0x35, 0x35, 0x37, 0x35, 0x36, 0x39, 0x36, 0x34, 0x33, 0x30, 0x62,
205 0x72, 0x74, 0x81, 0x69, 0x6F, 0x69, 0x63, 0x2E, 0x72, 0x2E, 0x61, 0x63, 0x6C, 0x62, 0x69, 0x66,
206 0x81, 0x6F, 0x6F, 0x69, 0x63, 0x2E, 0x69, 0x66, 0x2E, 0x62, 0x61, 0x73, 0x65, 0x6C, 0x69, 0x6E,
207 0x65, 0x65, 0x70, 0x73, 0x74, 0x61, 0x74, 0x58, 0x9D, 0xA9, 0x64, 0x69, 0x73, 0x6F, 0x70, 0xF5,
208 0x6A, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x75, 0x75, 0x69, 0x64, 0x78, 0x24, 0x36, 0x31, 0x36,
209 0x34, 0x36, 0x64, 0x36, 0x39, 0x2D, 0x36, 0x65, 0x34, 0x34, 0x2D, 0x36, 0x35, 0x37, 0x36, 0x2D,
210 0x36, 0x39, 0x36, 0x33, 0x2D, 0x36, 0x35, 0x35, 0x35, 0x37, 0x35, 0x36, 0x39, 0x36, 0x34, 0x33,
211 0x30, 0x62, 0x63, 0x6D, 0x00, 0x62, 0x74, 0x6D, 0x00, 0x62, 0x6F, 0x6D, 0x03, 0x62, 0x73, 0x6D,
212 0x03, 0x6A, 0x72, 0x6F, 0x77, 0x6E, 0x65, 0x72, 0x75, 0x75, 0x69, 0x64, 0x78, 0x24, 0x36, 0x31,
213 0x36, 0x34, 0x36, 0x64, 0x36, 0x39, 0x2D, 0x36, 0x65, 0x34, 0x34, 0x2D, 0x36, 0x35, 0x37, 0x36,
214 0x2D, 0x36, 0x39, 0x36, 0x33, 0x2D, 0x36, 0x35, 0x35, 0x35, 0x37, 0x35, 0x36, 0x39, 0x36, 0x34,
215 0x33, 0x30, 0x62, 0x72, 0x74, 0x81, 0x6B, 0x6F, 0x69, 0x63, 0x2E, 0x72, 0x2E, 0x70, 0x73, 0x74,
216 0x61, 0x74, 0x62, 0x69, 0x66, 0x81, 0x6F, 0x6F, 0x69, 0x63, 0x2E, 0x69, 0x66, 0x2E, 0x62, 0x61,
217 0x73, 0x65, 0x6C, 0x69, 0x6E, 0x65, 0x64, 0x64, 0x6F, 0x78, 0x6D, 0x58, 0xE8, 0xAA, 0x64, 0x6F,
218 0x78, 0x6D, 0x73, 0x81, 0x00, 0x66, 0x6F, 0x78, 0x6D, 0x73, 0x65, 0x6C, 0x00, 0x63, 0x73, 0x63,
219 0x74, 0x01, 0x65, 0x6F, 0x77, 0x6E, 0x65, 0x64, 0xF5, 0x6A, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65,
220 0x75, 0x75, 0x69, 0x64, 0x78, 0x24, 0x36, 0x31, 0x36, 0x34, 0x36, 0x64, 0x36, 0x39, 0x2D, 0x36,
221 0x65, 0x34, 0x34, 0x2D, 0x36, 0x35, 0x37, 0x36, 0x2D, 0x36, 0x39, 0x36, 0x33, 0x2D, 0x36, 0x35,
222 0x35, 0x35, 0x37, 0x35, 0x36, 0x39, 0x36, 0x34, 0x33, 0x30, 0x6C, 0x64, 0x65, 0x76, 0x6F, 0x77,
223 0x6E, 0x65, 0x72, 0x75, 0x75, 0x69, 0x64, 0x78, 0x24, 0x36, 0x31, 0x36, 0x34, 0x36, 0x64, 0x36,
224 0x39, 0x2D, 0x36, 0x65, 0x34, 0x34, 0x2D, 0x36, 0x35, 0x37, 0x36, 0x2D, 0x36, 0x39, 0x36, 0x33,
225 0x2D, 0x36, 0x35, 0x35, 0x35, 0x37, 0x35, 0x36, 0x39, 0x36, 0x34, 0x33, 0x30, 0x6A, 0x72, 0x6F,
226 0x77, 0x6E, 0x65, 0x72, 0x75, 0x75, 0x69, 0x64, 0x78, 0x24, 0x36, 0x31, 0x36, 0x34, 0x36, 0x64,
227 0x36, 0x39, 0x2D, 0x36, 0x65, 0x34, 0x34, 0x2D, 0x36, 0x35, 0x37, 0x36, 0x2D, 0x36, 0x39, 0x36,
228 0x33, 0x2D, 0x36, 0x35, 0x35, 0x35, 0x37, 0x35, 0x36, 0x39, 0x36, 0x34, 0x33, 0x30, 0x72, 0x78,
229 0x2E, 0x6F, 0x72, 0x67, 0x2E, 0x69, 0x6F, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x2E, 0x64, 0x70,
230 0x63, 0xF4, 0x62, 0x72, 0x74, 0x81, 0x6A, 0x6F, 0x69, 0x63, 0x2E, 0x72, 0x2E, 0x64, 0x6F, 0x78,
231 0x6D, 0x62, 0x69, 0x66, 0x81, 0x6F, 0x6F, 0x69, 0x63, 0x2E, 0x69, 0x66, 0x2E, 0x62, 0x61, 0x73,
232 0x65, 0x6C, 0x69, 0x6E, 0x65, 0xFF
235 static bool g_doneCB;
236 static bool g_callbackResult;
237 static pid_t g_myPID1;
238 static pid_t g_myPID2;
240 static const char* g_otmCtx = "Test User Context";
241 static OCProvisionDev_t* g_unownedDevices = NULL;
242 static OCProvisionDev_t* g_ownedDevices = NULL;
243 #ifdef _ENABLE_MULTIPLE_OWNER_
244 static OCProvisionDev_t* g_motEnabledDevices = NULL;
245 static OCProvisionDev_t* g_multiplOwnedDevices = NULL;
246 #endif //_ENABLE_MULTIPLE_OWNER_
248 static void GetCurrentWorkingDirectory(char* buf, size_t bufsize)
250 char cwd[1024] = {0};
251 const char* unittest_path = "resource/csdk/security/provisioning/unittest";
252 if(getcwd(cwd, sizeof(cwd)) != NULL)
254 if(strstr(cwd, unittest_path) == NULL)
256 #if defined __linux__
258 snprintf(buf, bufsize, "%s/out/linux/x86_64/release/%s/", cwd, unittest_path);
259 snprintf(buf, bufsize, "%s/out/linux/x86_64/release/%s/", cwd, unittest_path);
261 snprintf(buf, bufsize, "%s/out/linux/x86/release/%s/", cwd, unittest_path);
262 snprintf(buf, bufsize, "%s/out/linux/x86/release/%s/", cwd, unittest_path);
264 #endif //defined __linux__
268 snprintf(buf, bufsize, "%s/", cwd);
273 static FILE* fopen_prvnMng(const char* path, const char* mode)
275 (void)path; // unused |path| parameter
277 // input |g_svr_db_fname| internally by force, not using |path| parameter
278 // because |OCPersistentStorage::open| is called |OCPersistentStorage| internally
279 // with its own |SVR_DB_FILE_NAME|
280 char cwd[1024] = {0};
281 char svr_db_path[1024] = {0};
282 GetCurrentWorkingDirectory(cwd, sizeof(cwd));
283 snprintf(svr_db_path, sizeof(svr_db_path), "%s%s", cwd, SVR_DB_PATH);
284 return fopen(svr_db_path, mode);
287 // callback function(s) for provisioning client using C-level provisioning API
288 static void ownershipTransferCB(void* ctx, int UNUSED1, OCProvisionResult_t* UNUSED2, bool hasError)
296 OIC_LOG_V(INFO, TAG, "Ownership Transfer SUCCEEDED - ctx: %s", (char*) ctx);
300 OIC_LOG_V(ERROR, TAG, "Ownership Transfer FAILED - ctx: %s", (char*) ctx);
302 g_callbackResult = !hasError;
306 #ifdef _ENABLE_MULTIPLE_OWNER_
307 static void updateDoxmForMOTCB(void* ctx, int nOfRes, OCProvisionResult_t* arr, bool hasError)
311 OIC_LOG_V(INFO, TAG, "POST 'doxm' SUCCEEDED - ctx: %s", (char*) ctx);
315 OIC_LOG_V(ERROR, TAG, "POST 'doxm' FAILED - ctx: %s", (char*) ctx);
317 g_callbackResult = !hasError;
321 static void provisionPreconfiguredPinCB(void* ctx, int nOfRes, OCProvisionResult_t* arr, bool hasError)
325 OIC_LOG_V(INFO, TAG, "Provision Preconfigured-PIN SUCCEEDED - ctx: %s", (char*) ctx);
329 OIC_LOG_V(ERROR, TAG, "Provision Preconfigured-PIN FAILED - ctx: %s", (char*) ctx);
331 g_callbackResult = !hasError;
334 #endif //_ENABLE_MULTIPLE_OWNER_
336 // callback function(s) for provisioning client using C-level provisioning API
337 static void removeDeviceCB(void* ctx, int UNUSED1, OCProvisionResult_t* UNUSED2, bool hasError)
345 OIC_LOG_V(INFO, TAG, "Remove device request SUCCEEDED - ctx: %s", (char*) ctx);
349 OIC_LOG_V(ERROR, TAG, "Remove device request FAILED - ctx: %s", (char*) ctx);
351 g_callbackResult = !hasError;
356 static int waitCallbackRet(void)
358 struct timespec timeout;
360 timeout.tv_nsec = 100000000L;
362 for(long long i=0; !g_doneCB && OTM_TIMEOUT * 100000000L * 1000L > i; ++i)
364 nanosleep(&timeout, NULL);
365 if(OC_STACK_OK != OCProcess())
367 OIC_LOG(ERROR, TAG, "OCStack process error");
375 static void RemoveUnknownDeviceFromDevList(OCProvisionDev_t* devList)
379 memset(uuid1.id, 0x11, sizeof(uuid1.id));
380 memset(uuid2.id, 0x22, sizeof(uuid2.id));
382 OCProvisionDev_t* unknowDev = NULL;
383 OCProvisionDev_t* tempDev1 = NULL;
384 OCProvisionDev_t* tempDev2 =NULL;
385 LL_FOREACH_SAFE(devList, tempDev1, tempDev2)
388 if(!(memcmp(tempDev1->doxm->deviceID.id, uuid1.id, sizeof(uuid1.id)) == 0 ||
389 memcmp(tempDev1->doxm->deviceID.id, uuid2.id, sizeof(uuid2.id)) == 0))
391 LL_DELETE(devList, tempDev1);
392 LL_APPEND(unknowDev, tempDev1);
395 OCDeleteDiscoveredDevices(unknowDev);
398 TEST(InitForOTM, NullParam)
400 OCStackResult result = OC_STACK_ERROR;
402 OTMCallbackData_t otmcb;
403 otmcb.loadSecretCB = LoadSecretJustWorksCallback;
404 otmcb.createSecureSessionCB = CreateSecureSessionJustWorksCallback;
405 otmcb.createSelectOxmPayloadCB = CreateJustWorksSelectOxmPayload;
406 otmcb.createOwnerTransferPayloadCB = CreateJustWorksOwnerTransferPayload;
408 static OCPersistentStorage pstStr;
409 pstStr.open = fopen_prvnMng;
411 pstStr.write = fwrite;
412 pstStr.close = fclose;
413 pstStr.unlink = unlink;
415 //Get current path to execute the sample server.
416 char cwd[1024] = {0};
417 char server1_path[1024] = {0};
418 char server2_path[1024] = {0};
419 char pdb_path[1024] = {0};
420 char del_cmd[1024] = {0};
421 char svrdb_path[1024] = {0};
424 GetCurrentWorkingDirectory(cwd, sizeof(cwd));
425 EXPECT_TRUE(0 < strlen(cwd));
427 //Delete previous PDB, if exist.
428 GetCurrentWorkingDirectory(cwd, sizeof(cwd));
429 snprintf(del_cmd, sizeof(del_cmd), "rm -rf %stest.db", cwd);
432 //Delete previous SVR DB, if exist.
433 snprintf(del_cmd, sizeof(del_cmd), "rm -rf %s%s", cwd, SVR_DB_PATH);
436 //Generate default SVR DB.
437 snprintf(svrdb_path, sizeof(svrdb_path), "%s%s", cwd, SVR_DB_PATH);
438 fp = fopen(svrdb_path, "w");
441 size_t numberItems = fwrite(DEFAULT_SVR_DB, 1, sizeof(DEFAULT_SVR_DB), fp);
443 ASSERT_TRUE(sizeof(DEFAULT_SVR_DB) == numberItems);
446 //Execute sample server to perform ownership transfer
449 if(0 == (g_myPID1 = fork()))
451 snprintf(server1_path, sizeof(server1_path), "%ssample_server1", cwd);
452 status1 = system(server1_path);
455 if(0 == (g_myPID2 = fork()))
457 snprintf(server2_path, sizeof(server2_path), "%ssample_server2", cwd);
458 status2= system(server2_path);
462 //Waiting for sample server initialization.
465 // register the persistent storage handler for SVR
466 result = OCRegisterPersistentStorageHandler(&pstStr);
467 EXPECT_EQ(OC_STACK_OK, result);
469 // initialize OC stack and provisioning manager
470 result = OCInit(NULL, 0, OC_CLIENT_SERVER);
471 EXPECT_EQ(OC_STACK_OK, result);
473 //initialize Provisioning DB Manager
475 snprintf(pdb_path, sizeof(pdb_path), "%stest.db", cwd);
476 result = OCInitPM(pdb_path);
477 EXPECT_EQ(OC_STACK_OK, result);
479 // register callback function(s) for Justworks OxM
480 result = OCSetOwnerTransferCallbackData(OIC_JUST_WORKS, &otmcb);
481 EXPECT_EQ(OC_STACK_OK, result);
484 g_callbackResult = false;
487 TEST(PerformSecureResourceDiscovery, NullParam)
489 OCStackResult result = OC_STACK_ERROR;
490 OCProvisionDev_t* foundDevice = NULL;
493 ConvertStrToUuid("11111111-1111-1111-1111-111111111111", &uuid);
495 OIC_LOG(INFO, TAG, "Discovering Owned/Unowned Device using multicast\n");
496 result = OCDiscoverSingleDevice(DISCOVERY_TIMEOUT, &uuid, &foundDevice);
497 EXPECT_EQ(OC_STACK_OK, result);
499 int NumOfFoundDevice = 0;
500 OCProvisionDev_t* tempDev = foundDevice;
504 tempDev = tempDev->next;
506 PMDeleteDeviceList(foundDevice);
508 EXPECT_EQ(true, NumOfFoundDevice > 0);
511 TEST(PerformUnownedDeviceDiscovery, NullParam)
513 OCStackResult result = OC_STACK_ERROR;
515 OIC_LOG(INFO, TAG, "Discovering Only Unowned Devices on Network..\n");
516 result = OCDiscoverUnownedDevices(DISCOVERY_TIMEOUT, &g_unownedDevices);
517 EXPECT_EQ(OC_STACK_OK, result);
519 RemoveUnknownDeviceFromDevList(g_unownedDevices);
521 int NumOfUnownDevice = 0;
522 OCProvisionDev_t* tempDev = g_unownedDevices;
526 tempDev = tempDev->next;
529 //if two more devices are running on the subnet,
530 //stop the unittest process in order to prevent unittest failure.
531 if(2 < NumOfUnownDevice)
533 printf("%c[1;33;40m ******************************************************************\n", 0x1B);
534 printf("%c[1;33;40m [%d] devices are running on the your sub-network.\n", 0x1B, NumOfUnownDevice);
535 printf("%c[1;33;40m Please turn off the other devices, and then try once again.\n", 0x1B);
536 printf("%c[1;33;40m ******************************************************************", 0x1B);
537 printf("%c[1;0;40m \n", 0x1B);
539 OCStackResult result = OCStop();
540 EXPECT_EQ(OC_STACK_OK, result);
542 PMDeleteDeviceList(g_unownedDevices);
543 PMDeleteDeviceList(g_ownedDevices);
545 EXPECT_EQ(OC_STACK_OK, result);
547 kill(g_myPID2, SIGKILL);
548 kill(g_myPID1, SIGKILL);
550 int interpreter_res1 = system("pkill -f \"sample_server1\"");
551 EXPECT_TRUE(0 <= interpreter_res1);
552 int interpreter_res2 = system("pkill -f \"sample_server2\"");
553 EXPECT_TRUE(0 <= interpreter_res2);
558 EXPECT_EQ(2, NumOfUnownDevice);
561 TEST(PerformJustWorksOxM, NullParam)
563 OCStackResult result = OC_STACK_ERROR;
565 OIC_LOG(INFO, TAG, "Try Ownership Transfer for Unowned Devices...\n");
566 result = OCDoOwnershipTransfer((void*)g_otmCtx, g_unownedDevices, ownershipTransferCB);
567 EXPECT_EQ(OC_STACK_OK, result);
569 if(waitCallbackRet()) // input |g_doneCB| flag implicitly
571 OIC_LOG(ERROR, TAG, "OCProvisionCredentials callback error");
574 OIC_LOG(INFO, TAG, "Registered Discovered Unowned Device...\n");
576 EXPECT_EQ(true, g_callbackResult);
577 EXPECT_EQ(true, g_doneCB);
581 TEST(PerformOwnedDeviceDiscovery, NullParam)
583 OCStackResult result = OC_STACK_ERROR;
585 OIC_LOG(INFO, TAG, "Discovering Only Owned Devices on Network..\n");
586 result = OCDiscoverOwnedDevices(DISCOVERY_TIMEOUT, &g_ownedDevices);
587 EXPECT_EQ(OC_STACK_OK, result);
589 RemoveUnknownDeviceFromDevList(g_ownedDevices);
591 int NumOfOwnDevice = 0;
592 OCProvisionDev_t* tempDev = g_ownedDevices;
596 tempDev = tempDev->next;
599 EXPECT_EQ(2 , NumOfOwnDevice);
602 TEST(PerformLinkDevices, NullParam)
605 OCStackResult result = OC_STACK_ERROR;
606 result = GetDoxmDeviceID(&myUuid);
607 EXPECT_EQ(OC_STACK_OK, result);
609 //Extract target device except PT to perform link devices.
610 OCProvisionDev_t* dev1 = NULL;
611 OCProvisionDev_t* dev2 = NULL;
612 OCProvisionDev_t* tempDev = g_ownedDevices;
616 if(memcmp(tempDev->doxm->deviceID.id, myUuid.id, UUID_LENGTH) != 0)
622 else if(NULL == dev2)
628 tempDev = tempDev->next;
630 EXPECT_TRUE(NULL != dev1);
631 EXPECT_TRUE(NULL != dev2);
633 // TODO: Pairwise provisioning (Cred & ACL)
634 // TODO: This part will be updated after ACL and credential data-structure is updated.
636 EXPECT_EQ(OC_STACK_OK, result);
639 TEST(PerformUnlinkDevices, NullParam)
641 OCStackResult result = OC_STACK_OK;
643 // TODO: Unlink devices
644 // TODO: This part will be updated after ACL and credential data-structure is updated.
646 EXPECT_EQ(OC_STACK_OK, result);
649 #ifdef _ENABLE_MULTIPLE_OWNER_
650 TEST(RegisterPreconfiguredPIN, NullParam)
652 OCStackResult result = SetPreconfigPin("12341234", strlen("12341234"));
653 EXPECT_EQ(OC_STACK_OK, result);
656 TEST(EnableMOT, NullParam)
658 OCStackResult result = OC_STACK_OK;
660 if(NULL == g_ownedDevices)
662 OIC_LOG(INFO, TAG, "Discovering Only Owned Devices on Network..\n");
663 result = OCDiscoverOwnedDevices(DISCOVERY_TIMEOUT, &g_ownedDevices);
664 EXPECT_EQ(OC_STACK_OK, result);
665 RemoveUnknownDeviceFromDevList(g_ownedDevices);
667 EXPECT_NE((OCProvisionDev_t*)NULL, g_ownedDevices);
670 result = OCChangeMOTMode(NULL, g_ownedDevices, OIC_MULTIPLE_OWNER_ENABLE, updateDoxmForMOTCB);
671 EXPECT_EQ(OC_STACK_OK, result);
672 if(waitCallbackRet()) // input |g_doneCB| flag implicitly
674 OIC_LOG(ERROR, TAG, "OCChangeMOTMode callback error");
678 EXPECT_TRUE(g_callbackResult);
681 TEST(DiscoverMOTEnabledDevices, NullParam)
683 OCStackResult result = OC_STACK_OK;
685 if(g_motEnabledDevices)
687 PMDeleteDeviceList(g_motEnabledDevices);
690 OIC_LOG(INFO, TAG, "Discovering MOT Enabled Devices on Network..\n");
691 result = OCDiscoverMultipleOwnerEnabledDevices(DISCOVERY_TIMEOUT, &g_motEnabledDevices);
692 EXPECT_EQ(OC_STACK_OK, result);
693 RemoveUnknownDeviceFromDevList(g_motEnabledDevices);
694 EXPECT_NE((OCProvisionDev_t*)NULL, g_motEnabledDevices);
697 TEST(ProvisonPreconfiguredPIN, NullParam)
699 OCStackResult result = OC_STACK_OK;
702 result = OCProvisionPreconfigPin(NULL, g_motEnabledDevices, "12341234", strlen("12341234"), provisionPreconfiguredPinCB);
703 EXPECT_EQ(OC_STACK_OK, result);
704 if(waitCallbackRet()) // input |g_doneCB| flag implicitly
706 OIC_LOG(ERROR, TAG, "OCProvisionPreconfigPin callback error");
710 EXPECT_EQ(true, g_callbackResult);
713 TEST(SelectMOTMethod, NullParam)
715 OCStackResult result = OC_STACK_OK;
718 result = OCSelectMOTMethod(NULL, g_motEnabledDevices, OIC_PRECONFIG_PIN, updateDoxmForMOTCB);
719 EXPECT_EQ(OC_STACK_OK, result);
720 if(waitCallbackRet()) // input |g_doneCB| flag implicitly
722 OIC_LOG(ERROR, TAG, "OCSelectMOTMethod callback error");
726 EXPECT_EQ(true, g_callbackResult);
729 // TODO: Need to new server to perform MOT
731 TEST(PerformMOT, NullParam)
733 OCStackResult result = OC_STACK_OK;
736 result = OCDoMultipleOwnershipTransfer(NULL, g_motEnabledDevices, ownershipTransferCB);
737 EXPECT_EQ(OC_STACK_OK, result);
738 if(waitCallbackRet()) // input |g_doneCB| flag implicitly
740 OIC_LOG(ERROR, TAG, "OCDoMultipleOwnershipTransfer callback error");
743 EXPECT_EQ(true, g_callbackResult);
746 TEST(DiscoverMultipleOwnedDevices, NullParam)
748 OCStackResult result = OC_STACK_OK;
750 if(g_multiplOwnedDevices)
752 PMDeleteDeviceList(g_multiplOwnedDevices);
755 OIC_LOG(INFO, TAG, "Discovering MOT Enabled Devices on Network..\n");
756 result = OCDiscoverMultipleOwnedDevices(DISCOVERY_TIMEOUT, &g_multiplOwnedDevices);
757 EXPECT_EQ(OC_STACK_OK, result);
758 RemoveUnknownDeviceFromDevList(g_multiplOwnedDevices);
759 EXPECT_TRUE(NULL != g_multiplOwnedDevices);
762 #endif //_ENABLE_MULTIPLE_OWNER_
764 TEST(PerformRemoveDevice, NullParam)
767 OCStackResult result = OC_STACK_ERROR;
768 result = GetDoxmDeviceID(&myUuid);
769 EXPECT_EQ(OC_STACK_OK, result);
771 //Extract target device except PT to perform remove device.
772 OCProvisionDev_t* removeDev = g_ownedDevices;
775 if(memcmp(removeDev->doxm->deviceID.id, myUuid.id, UUID_LENGTH) != 0)
779 removeDev = removeDev->next;
781 EXPECT_TRUE(NULL != removeDev);
784 g_callbackResult = false;
786 result = OCRemoveDevice((void*)g_otmCtx, DISCOVERY_TIMEOUT, removeDev, removeDeviceCB);
787 EXPECT_EQ(OC_STACK_OK, result);
788 EXPECT_EQ(true, g_callbackResult);
789 EXPECT_EQ(true, g_doneCB);
792 TEST(FinalizeOTMTest, NullParam)
794 OCStackResult result = OCStop();
795 EXPECT_EQ(OC_STACK_OK, result);
797 PMDeleteDeviceList(g_unownedDevices);
798 PMDeleteDeviceList(g_ownedDevices);
800 EXPECT_EQ(OC_STACK_OK, result);
802 kill(g_myPID2, SIGKILL);
803 kill(g_myPID1, SIGKILL);
805 int interpreter_res1 = system("pkill -f \"sample_server1\"");
806 EXPECT_TRUE(0 <= interpreter_res1);
807 int interpreter_res2 = system("pkill -f \"sample_server2\"");
808 EXPECT_TRUE(0 <= interpreter_res2);