• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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);