1 /*
2 * Copyright (c) 2020-2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include <stdlib.h>
17 #include <string.h>
18 #include "cmsis_os.h"
19 #include "securec.h"
20 #include "hctest.h"
21 #include "samgr_lite.h"
22
23 #define OPER_INTERVAL 200 // 200 ms
24 #define PRESSURE_BASE (1024 * 10)
25
26 enum MessageId {
27 MSG_NO, // receiver does not send response
28 MSG_RT, // receiver send response
29 MSG_FW, // receiver forward message
30 };
31
32 struct Payload {
33 int id;
34 const char *name;
35 int value;
36 };
37
38 typedef struct DemoApi {
39 INHERIT_IUNKNOWN;
40 uint32 *(*SAMGR_SendSharedRequestProxy)(const Identity *identity, const Request *request, uint32 *token,
41 Handler handler);
42 int32 (*SAMGR_SendSharedDirectRequestProxy)(const Identity *id, const Request *req, const Response *resp,
43 uint32 **ref, Handler handler);
44 } DemoApi;
45
46 typedef struct DemoFeature {
47 INHERIT_FEATURE;
48 INHERIT_IUNKNOWNENTRY(DemoApi);
49 Identity identity;
50 int featureCalledCount;
51 BOOL featureStatus;
52 char *latestRequest;
53 } DemoFeature;
54
55 typedef struct DefaultFeatureApi {
56 INHERIT_IUNKNOWN;
57 } DefaultFeatureApi;
58
59 typedef struct ExampleService {
60 INHERIT_SERVICE;
61 INHERIT_IUNKNOWNENTRY(DefaultFeatureApi);
62 Identity identity;
63 } ExampleService;
64
SAMGR_SendSharedRequestProxy(const Identity * identity,const Request * request,uint32 * token,Handler handler)65 static uint32 *SAMGR_SendSharedRequestProxy(const Identity *identity, const Request *request, uint32 *token,
66 Handler handler)
67 {
68 return SAMGR_SendSharedRequest(identity, request, token, handler);
69 }
70
SAMGR_SendSharedDirectRequestProxy(const Identity * id,const Request * req,const Response * resp,uint32 ** ref,Handler handler)71 static int32 SAMGR_SendSharedDirectRequestProxy(const Identity *id, const Request *req, const Response *resp,
72 uint32 **ref, Handler handler)
73 {
74 return SAMGR_SendSharedDirectRequest(id, req, resp, ref, handler);
75 }
76
GetName(Service * service)77 static const char *GetName(Service *service)
78 {
79 (void)service;
80 return "S_sendShareReq";
81 }
82
Initialize(Service * service,Identity identity)83 static BOOL Initialize(Service *service, Identity identity)
84 {
85 ExampleService *example = (ExampleService *)service;
86 example->identity = identity;
87 return TRUE;
88 }
89
MessageHandle(Service * service,Request * msg)90 static BOOL MessageHandle(Service *service, Request *msg)
91 {
92 (void)service;
93 (void)msg;
94 return FALSE;
95 }
96
GetTaskConfig(Service * service)97 static TaskConfig GetTaskConfig(Service *service)
98 {
99 (void)service;
100 TaskConfig config = {LEVEL_HIGH, PRI_ABOVE_NORMAL, 0x800, 20, SHARED_TASK};
101 return config;
102 }
103
104 static ExampleService g_service = {
105 .GetName = GetName,
106 .Initialize = Initialize,
107 .MessageHandle = MessageHandle,
108 .GetTaskConfig = GetTaskConfig,
109 .ref = 1,
110 .iUnknown = {
111 DEFAULT_IUNKNOWN_IMPL,
112 }
113 };
114
FEATURE_GetName(Feature * feature)115 static const char *FEATURE_GetName(Feature *feature)
116 {
117 (void)feature;
118 return "feature01";
119 }
120
FEATURE_GetName02(Feature * feature)121 static const char *FEATURE_GetName02(Feature *feature)
122 {
123 (void)feature;
124 return "feature02";
125 }
126
FEATURE_GetName03(Feature * feature)127 static const char *FEATURE_GetName03(Feature *feature)
128 {
129 (void)feature;
130 return "feature03";
131 }
132
FEATURE_OnInitialize(Feature * feature,Service * parent,Identity identity)133 static void FEATURE_OnInitialize(Feature *feature, Service *parent, Identity identity)
134 {
135 DemoFeature *demoFeature = (DemoFeature *)feature;
136 demoFeature->identity = identity;
137 (void)parent;
138 }
139
FEATURE_OnStop(Feature * feature,Identity identity)140 static void FEATURE_OnStop(Feature *feature, Identity identity)
141 {
142 (void)feature;
143 (void)identity;
144 }
145
FEATURE_OnMessage(Feature * feature,Request * request)146 static BOOL FEATURE_OnMessage(Feature *feature, Request *request)
147 {
148 DemoFeature *demoFeature = (DemoFeature *)feature;
149 demoFeature->featureCalledCount++;
150 demoFeature->latestRequest = (char *)request->data;
151
152 demoFeature->featureStatus = TRUE;
153 return TRUE;
154 }
155
FEATURE_OnMessage02(Feature * feature,Request * request)156 static BOOL FEATURE_OnMessage02(Feature *feature, Request *request)
157 {
158 int32 returnCode = 0;
159 DemoFeature *demoFeature = (DemoFeature *)feature;
160 demoFeature->featureCalledCount++;
161
162 if (demoFeature->latestRequest != NULL) {
163 free(demoFeature->latestRequest);
164 }
165 int requestLen;
166 if (request->len > 0) {
167 requestLen = request->len;
168 } else {
169 requestLen = strlen((char *)request->data) + 1;
170 }
171 demoFeature->latestRequest = (char *)malloc(requestLen * sizeof(char));
172 if (demoFeature->latestRequest == NULL) {
173 TEST_FAIL();
174 }
175 errno_t error = strcpy_s(demoFeature->latestRequest, requestLen, (char *)request->data);
176 if (error != EOK) {
177 TEST_FAIL();
178 }
179
180 switch (request->msgId) {
181 case MSG_NO:
182 returnCode = 0;
183 break;
184 case MSG_RT:
185 {
186 Response response = {
187 .data = "Yes, you did!",
188 .len = 0,
189 };
190 returnCode = SAMGR_SendResponse(request, &response);
191 };
192 break;
193 case MSG_FW:
194 {
195 returnCode = 0;
196 };
197 break;
198 }
199 demoFeature->featureStatus = ((returnCode == 0) ? TRUE : FALSE);
200 return demoFeature->featureStatus;
201 }
202
FEATURE_OnMessage03(Feature * feature,Request * request)203 static BOOL FEATURE_OnMessage03(Feature *feature, Request *request)
204 {
205 int32 returnCode = 0;
206 DemoFeature *demoFeature = (DemoFeature *)feature;
207 demoFeature->featureCalledCount++;
208
209 if (demoFeature->latestRequest != NULL) {
210 free(demoFeature->latestRequest);
211 }
212 int requestLen;
213 if (request->len > 0) {
214 requestLen = request->len;
215 } else {
216 requestLen = strlen((char *)request->data) + 1;
217 }
218 demoFeature->latestRequest = (char *)malloc(requestLen * sizeof(char));
219 if (demoFeature->latestRequest == NULL) {
220 TEST_FAIL();
221 }
222 errno_t error = strcpy_s(demoFeature->latestRequest, requestLen, (char *)request->data);
223 if (error != EOK) {
224 TEST_FAIL();
225 }
226
227 switch (request->msgId) {
228 case MSG_NO:
229 returnCode = 0;
230 break;
231 case MSG_RT:
232 {
233 Response response = {
234 .data = "Yes, you did!",
235 .len = 0,
236 };
237 returnCode = SAMGR_SendResponse(request, &response);
238 };
239 break;
240 case MSG_FW:
241 {
242 returnCode = 0;
243 };
244 break;
245 }
246 demoFeature->featureStatus = ((returnCode == 0) ? TRUE : FALSE);
247 return demoFeature->featureStatus;
248 }
249
250 static DemoFeature g_feature = {
251 .GetName = FEATURE_GetName,
252 .OnInitialize = FEATURE_OnInitialize,
253 .OnStop = FEATURE_OnStop,
254 .OnMessage = FEATURE_OnMessage,
255 .ref = 1,
256 .iUnknown = {
257 DEFAULT_IUNKNOWN_IMPL,
258 .SAMGR_SendSharedRequestProxy = SAMGR_SendSharedRequestProxy,
259 .SAMGR_SendSharedDirectRequestProxy = SAMGR_SendSharedDirectRequestProxy,
260 },
261 .identity = {-1, -1, NULL},
262 .featureCalledCount = 0,
263 .featureStatus = TRUE,
264 .latestRequest = NULL,
265 };
266 static DemoFeature g_feature02 = {
267 .GetName = FEATURE_GetName02,
268 .OnInitialize = FEATURE_OnInitialize,
269 .OnStop = FEATURE_OnStop,
270 .OnMessage = FEATURE_OnMessage02,
271 .ref = 0,
272 .iUnknown = {
273 DEFAULT_IUNKNOWN_IMPL,
274 .SAMGR_SendSharedRequestProxy = SAMGR_SendSharedRequestProxy,
275 .SAMGR_SendSharedDirectRequestProxy = SAMGR_SendSharedDirectRequestProxy,
276 },
277 .identity = {-1, 1, NULL},
278 .featureCalledCount = 0,
279 .featureStatus = TRUE,
280 .latestRequest = NULL,
281 };
282 static DemoFeature g_feature03 = {
283 .GetName = FEATURE_GetName03,
284 .OnInitialize = FEATURE_OnInitialize,
285 .OnStop = FEATURE_OnStop,
286 .OnMessage = FEATURE_OnMessage03,
287 .ref = 0,
288 .iUnknown = {
289 DEFAULT_IUNKNOWN_IMPL,
290 .SAMGR_SendSharedRequestProxy = SAMGR_SendSharedRequestProxy,
291 .SAMGR_SendSharedDirectRequestProxy = SAMGR_SendSharedDirectRequestProxy,
292 },
293 .identity = {-1, 2, NULL},
294 .featureCalledCount = 0,
295 .featureStatus = TRUE,
296 .latestRequest = NULL,
297 };
298
ServiceInit(void)299 static void ServiceInit(void)
300 {
301 BOOL result = SAMGR_GetInstance()->RegisterService((Service *)&g_service);
302 if (result == FALSE) {
303 printf("[hctest]E RegisterService failed.\n");
304 }
305 }
306 SYSEX_SERVICE_INIT(ServiceInit);
307
FeatureInit(void)308 static void FeatureInit(void)
309 {
310 BOOL result1 = SAMGR_GetInstance()->RegisterDefaultFeatureApi("S_sendShareReq", GET_IUNKNOWN(g_feature));
311
312 BOOL result2 = SAMGR_GetInstance()->RegisterFeature("S_sendShareReq", (Feature *)&g_feature02);
313 BOOL result3 = SAMGR_GetInstance()->RegisterFeatureApi("S_sendShareReq", "feature02",
314 GET_IUNKNOWN(g_feature02));
315
316 BOOL result4 = SAMGR_GetInstance()->RegisterFeature("S_sendShareReq", (Feature *)&g_feature03);
317 BOOL result5 = SAMGR_GetInstance()->RegisterFeatureApi("S_sendShareReq", "feature03",
318 GET_IUNKNOWN(g_feature03));
319 if (result1 == FALSE || result2 == FALSE || result3 == FALSE || result4 == FALSE || result5 == FALSE) {
320 printf("[hctest]E failed to register feature or api.\n");
321 }
322 }
323 SYSEX_FEATURE_INIT(FeatureInit);
324
GetIUnknown(const char * serviceName,const char * featureName)325 static DemoApi *GetIUnknown(const char *serviceName, const char *featureName)
326 {
327 DemoApi *demoApi = NULL;
328 IUnknown *iUnknown = SAMGR_GetInstance()->GetFeatureApi(serviceName, featureName);
329 if (iUnknown == NULL) {
330 printf("[hctest]failed to GetFeatureApi.\n");
331 return NULL;
332 }
333 int result = iUnknown->QueryInterface(iUnknown, 0, (void **)&demoApi);
334 if (result == 0 && demoApi != NULL) {
335 return demoApi;
336 } else {
337 printf("[hctest]failed to QueryInterface.\n");
338 return NULL;
339 }
340 }
341
ReleaseIUnknown(DemoApi * demoApi)342 static void ReleaseIUnknown(DemoApi *demoApi)
343 {
344 demoApi->Release((IUnknown *)demoApi);
345 }
346
DemoHandlerAndCheck(const Request * request,const Response * response)347 static void DemoHandlerAndCheck(const Request *request, const Response *response)
348 {
349 char *requestData = "I wanna async call good result!";
350 TEST_ASSERT_EQUAL_INT(strcmp((char *)request->data, requestData), 0);
351
352 char *responseData = "Yes, you did!";
353 TEST_ASSERT_EQUAL_INT(strcmp((char *)response->data, responseData), 0);
354 }
355
356 LITE_TEST_SUIT(test, samgr, SendSharedRequestTestSuite);
357
SendSharedRequestTestSuiteSetUp(void)358 static BOOL SendSharedRequestTestSuiteSetUp(void)
359 {
360 osDelay(OPER_INTERVAL);
361 return TRUE;
362 }
363
SendSharedRequestTestSuiteTearDown(void)364 static BOOL SendSharedRequestTestSuiteTearDown(void)
365 {
366 return TRUE;
367 }
368
369 /**
370 * @tc.number : DMSLite_SAMGR_SendSharedRequest_0010
371 * @tc.name : Feature can send a message by SendSharedRequest
372 * @tc.desc : [C- SOFTWARE -0200]
373 */
374 LITE_TEST_CASE(SendSharedRequestTestSuite, testSendSharedRequest0010, Function | MediumTest | Level2)
375 {
376 DemoApi *demoApi = GetIUnknown("S_sendShareReq", "feature02");
377 if (demoApi == NULL) {
378 TEST_FAIL();
379 }
380 Request request = {.msgId = MSG_RT, .msgValue = 0};
381 char *body = "I wanna async call good result!";
382 request.len = (int16)(strlen(body) + 1);
383 request.data = malloc(request.len);
384 if (request.data == NULL) {
385 TEST_FAIL();
386 }
387 strcpy_s(request.data, request.len, body);
388
389 IUnknown *iUnknown = SAMGR_GetInstance()->GetFeatureApi("S_sendShareReq", "feature03");
390 if (iUnknown == NULL) {
391 TEST_FAIL();
392 }
393 DemoFeature *feature = GET_OBJECT(iUnknown, DemoFeature, iUnknown);
394
395 feature->featureCalledCount = 0;
396 uint32 *token = NULL;
397 token = demoApi->SAMGR_SendSharedRequestProxy(&feature->identity, &request, token, DemoHandlerAndCheck);
398
399 osDelay(OPER_INTERVAL);
400 TEST_ASSERT_EQUAL_INT(feature->featureCalledCount, 1);
401 TEST_ASSERT_EQUAL_INT(strcmp(feature->latestRequest, body), 0);
402
403 ReleaseIUnknown(demoApi);
404 }
405
406 /**
407 * @tc.number : DMSLite_SAMGR_SendSharedDirectRequest_0010
408 * @tc.name : Feature can send a message by SendSharedDirectRequest
409 * @tc.desc : [C- SOFTWARE -0200]
410 */
411 LITE_TEST_CASE(SendSharedRequestTestSuite, testSendSharedDirectRequest0010, Function | MediumTest | Level2)
412 {
413 DemoApi *demoApi = GetIUnknown("S_sendShareReq", "feature02");
414 if (demoApi == NULL) {
415 TEST_FAIL();
416 }
417 Request request = {.msgId = MSG_RT, .msgValue = 0};
418 char *body = "I wanna async call good result!";
419 request.len = (int16)(strlen(body) + 1);
420 request.data = malloc(request.len);
421 if (request.data == NULL) {
422 TEST_FAIL();
423 }
424 strcpy_s(request.data, request.len, body);
425
426 IUnknown *iUnknown = SAMGR_GetInstance()->GetFeatureApi("S_sendShareReq", "feature03");
427 if (iUnknown == NULL) {
428 TEST_FAIL();
429 }
430 DemoFeature *feature = GET_OBJECT(iUnknown, DemoFeature, iUnknown);
431
432 feature->featureCalledCount = 0;
433 Response response = {
434 .data = "Yes, you did!",
435 .len = 0,
436 };
437 uint32 *token = NULL;
438 int32 result = demoApi->SAMGR_SendSharedDirectRequestProxy(&feature->identity, &request, &response,
439 &token, DemoHandlerAndCheck);
440 TEST_ASSERT_EQUAL_INT(result, 0);
441
442 osDelay(OPER_INTERVAL);
443 TEST_ASSERT_EQUAL_INT(feature->featureCalledCount, 0);
444
445 ReleaseIUnknown(demoApi);
446 }
447
448 RUN_TEST_SUITE(SendSharedRequestTestSuite);