• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2020-2022 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 "example.h"
17 #include <stdint.h>
18 #include <ohos_init.h>
19 #include <securec.h>
20 #include <los_base.h>
21 #include <cmsis_os.h>
22 #include <samgr_maintenance.h>
23 #include "iunknown.h"
24 #include "feature.h"
25 #include "service.h"
26 #include "samgr_lite.h"
27 #include "time_adapter.h"
28 
29 #define WAIT_FEATURE_PROC 1000
30 
31 enum MessageId {
32     MSG_PROC,
33     MSG_TIME_PROC,
34 };
35 
36 struct Payload {
37     int id;
38     const char *name;
39     int value;
40 };
41 
42 typedef struct DemoApi {
43     INHERIT_IUNKNOWN;
44     BOOL (*AsyncCall)(IUnknown *iUnknown, const char *buff);
45     BOOL (*AsyncTimeCall)(IUnknown *iUnknown);
46     BOOL (*SyncCall)(IUnknown *iUnknown, struct Payload *payload);
47     BOOL (*AsyncCallBack)(IUnknown *iUnknown, const char *buff, Handler handler);
48 } DemoApi;
49 
50 typedef struct DemoFeature {
51     INHERIT_FEATURE;
52     INHERIT_IUNKNOWNENTRY(DemoApi);
53     Identity identity;
54 } DemoFeature;
55 
56 static BOOL AsyncCall(IUnknown *iUnknown, const char *body);
57 static BOOL AsyncTimeCall(IUnknown *iUnknown);
58 static BOOL SyncCall(IUnknown *iUnknown, struct Payload *payload);
59 static BOOL AsyncCallBack(IUnknown *iUnknown, const char *body, Handler handler);
60 static const char *FEATURE_GetName(Feature *feature);
61 static void FEATURE_OnInitialize(Feature *feature, Service *parent, Identity identity);
62 static void FEATURE_OnStop(Feature *feature, Identity identity);
63 static BOOL FEATURE_OnMessage(Feature *feature, Request *request);
64 static DemoFeature g_example = {
65     .GetName = FEATURE_GetName,
66     .OnInitialize = FEATURE_OnInitialize,
67     .OnStop = FEATURE_OnStop,
68     .OnMessage = FEATURE_OnMessage,
69     DEFAULT_IUNKNOWN_ENTRY_BEGIN,
70     .AsyncCall = AsyncCall,
71     .AsyncTimeCall = AsyncTimeCall,
72     .SyncCall = SyncCall,
73     .AsyncCallBack = AsyncCallBack,
74     DEFAULT_IUNKNOWN_ENTRY_END,
75     .identity = {-1, -1, NULL},
76 };
77 static uint32_t g_regStep = 0;
78 
FEATURE_GetName(Feature * feature)79 static const char *FEATURE_GetName(Feature *feature)
80 {
81     (void)feature;
82     return EXAMPLE_FEATURE;
83 }
84 
FEATURE_OnInitialize(Feature * feature,Service * parent,Identity identity)85 static void FEATURE_OnInitialize(Feature *feature, Service *parent, Identity identity)
86 {
87     DemoFeature *demoFeature = (DemoFeature *)feature;
88     demoFeature->identity = identity;
89     printf("[Register Test][TaskID:%u][Step:%u][Reg Finish S:%s, F:%s]Time: %llu!\n",
90            (int)osThreadGetId(), g_regStep++, parent->GetName(parent), feature->GetName(feature),
91            SAMGR_GetProcessTime());
92 }
93 
FEATURE_OnStop(Feature * feature,Identity identity)94 static void FEATURE_OnStop(Feature *feature, Identity identity)
95 {
96     (void)feature;
97     (void)identity;
98     g_example.identity.queueId = NULL;
99     g_example.identity.featureId = -1;
100     g_example.identity.serviceId = -1;
101 }
102 
103 static volatile uint32 g_asyncStep = 0;
104 
FEATURE_OnMessage(Feature * feature,Request * request)105 static BOOL FEATURE_OnMessage(Feature *feature, Request *request)
106 {
107     (void)feature;
108     if (request->msgId == MSG_PROC) {
109         printf("[LPC Test][TaskID:%u][Step:%u][OnMessage: S:%s, F:%s] msgId<MSG_PROC> %s \n",
110                (int)osThreadGetId(), g_asyncStep++, EXAMPLE_SERVICE, feature->GetName(feature),
111                (char *)request->data);
112         Response response = {.data = "Yes, you did!", .len = 0};
113         SAMGR_SendResponse(request, &response);
114         return TRUE;
115     } else {
116         if (request->msgId == MSG_TIME_PROC) {
117             LOS_Msleep(WAIT_FEATURE_PROC * 11); // sleep 11 seconds
118             printf("[LPC Test][TaskID:%u][OnMessage: S:%s, F:%s] Time Message Get Value<%s>!",
119                 (int)osThreadGetId(), EXAMPLE_SERVICE, feature->GetName(feature),
120                 request->msgValue ? "TRUE" : "FALSE");
121             AsyncTimeCall(GET_IUNKNOWN(g_example));
122             return FALSE;
123         }
124     }
125     printf("[LPC Test][TaskID:%u][Step:%u][OnMessage S:%s, F:%s] Inner Error! \n",
126            (int)osThreadGetId(), g_asyncStep++, EXAMPLE_SERVICE, feature->GetName(feature));
127     return FALSE;
128 }
129 
SyncCall(IUnknown * iUnknown,struct Payload * payload)130 static BOOL SyncCall(IUnknown *iUnknown, struct Payload *payload)
131 {
132     (void)iUnknown;
133     if (payload != NULL && payload->id >= 0 && payload->name != NULL) {
134         printf("[LPC Test][TaskID:%u][Step:%u][SyncCall API] Id:%d, name:%s, value:%d \n",
135                (int)osThreadGetId(), g_asyncStep++, payload->id, payload->name, payload->value);
136         return TRUE;
137     }
138     printf("[LPC Test][TaskID:%u][Step:%u][SyncCall API] Input Error! \n", (int)osThreadGetId(), g_asyncStep++);
139     return FALSE;
140 }
141 
AsyncCall(IUnknown * iUnknown,const char * body)142 static BOOL AsyncCall(IUnknown *iUnknown, const char *body)
143 {
144     Request request = {.msgId = MSG_PROC, .msgValue = 0};
145     request.len = (uint32_t)(strlen(body) + 1);
146     request.data = malloc(request.len);
147     if (request.data == NULL) {
148         return FALSE;
149     }
150     if (strcpy_s(request.data, request.len, body) != EOK) {
151         free(request.data);
152         return FALSE;
153     }
154     DemoFeature *feature = GET_OBJECT(iUnknown, DemoFeature, iUnknown);
155     printf("[LPC Test][TaskID:%u][Step:%u][AsyncCall API] Send request! \n", (int)osThreadGetId(), g_asyncStep++);
156     return SAMGR_SendRequest(&feature->identity, &request, NULL);
157 }
158 
AsyncTimeCall(IUnknown * iUnknown)159 static BOOL AsyncTimeCall(IUnknown *iUnknown)
160 {
161     static int8 cnt = 0;
162     cnt = (cnt + 1) % 2; // mod 2 to get async status
163     Request request = {.msgId = MSG_TIME_PROC, .msgValue = cnt};
164     DemoFeature *feature = GET_OBJECT(iUnknown, DemoFeature, iUnknown);
165     return SAMGR_SendRequest(&feature->identity, &request, NULL);
166 }
167 
AsyncCallBack(IUnknown * iUnknown,const char * body,Handler handler)168 static BOOL AsyncCallBack(IUnknown *iUnknown, const char *body, Handler handler)
169 {
170     Request request = {.msgId = MSG_PROC, .msgValue = 0};
171     request.len = (uint32_t)(strlen(body) + 1);
172     request.data = malloc(request.len);
173     if (request.data == NULL) {
174         return FALSE;
175     }
176     if (strcpy_s(request.data, request.len, body) != EOK) {
177         free(request.data);
178         return FALSE;
179     }
180     DemoFeature *feature = GET_OBJECT(iUnknown, DemoFeature, iUnknown);
181     printf("[LPC Test][TaskID:%u][Step:%u][AsyncCallBack API] Send request! \n",
182            (int)osThreadGetId(), g_asyncStep++);
183     return SAMGR_SendRequest(&feature->identity, &request, handler);
184 }
185 
Init(void)186 static void Init(void)
187 {
188     SAMGR_GetInstance()->RegisterFeature(EXAMPLE_SERVICE, (Feature *)&g_example);
189     SAMGR_GetInstance()->RegisterFeatureApi(EXAMPLE_SERVICE, EXAMPLE_FEATURE, GET_IUNKNOWN(g_example));
190     printf("[Register Test][TaskID:%u][Step:%u][Reg S:%s, F:%s]Time: %llu!\n",
191            (int)osThreadGetId(), g_regStep++, EXAMPLE_SERVICE, EXAMPLE_FEATURE, SAMGR_GetProcessTime());
192 }
193 
194 SYSEX_FEATURE_INIT(Init);
195 
196 static uint32_t g_discoverStep = 0;
197 
CASE_GetIUnknown(void)198 static DemoApi *CASE_GetIUnknown(void)
199 {
200     DemoApi *demoApi = NULL;
201     printf("[Discover Test][TaskID:%u][Step:%u][GetIUnknown S:%s, F:%s]: BEGIN\n",
202            (int)osThreadGetId(), g_discoverStep++, EXAMPLE_SERVICE, EXAMPLE_FEATURE);
203     IUnknown *iUnknown = SAMGR_GetInstance()->GetFeatureApi(EXAMPLE_SERVICE, EXAMPLE_FEATURE);
204     if (iUnknown == NULL) {
205         printf("[Discover Test][TaskID:%u][Step:%u][GetFeatureApi S:%s, F:%s]Error is NULL!\n",
206                (int)osThreadGetId(), g_discoverStep++, EXAMPLE_SERVICE, EXAMPLE_FEATURE);
207         goto END;
208     }
209     int result = iUnknown->QueryInterface(iUnknown, DEFAULT_VERSION, (void **)&demoApi);
210     if (result != 0 || demoApi == NULL) {
211         printf("[Discover Test][TaskID:%u][Step:%u][QueryInterface S:%s, F:%s]Error is NULL!\n",
212                (int)osThreadGetId(), g_discoverStep++, EXAMPLE_SERVICE, EXAMPLE_FEATURE);
213         goto END;
214     }
215     printf("[Discover Test][TaskID:%u][Step:%u][GetIUnknown S:%s, F:%s]Success\n",
216            (int)osThreadGetId(), g_discoverStep++, EXAMPLE_SERVICE, EXAMPLE_FEATURE);
217 END:
218     printf("[Discover Test][TaskID:%u][Step:%u][GetIUnknown S:%s, F:%s]: END\n",
219            (int)osThreadGetId(), g_discoverStep++, EXAMPLE_SERVICE, EXAMPLE_FEATURE);
220     return demoApi;
221 }
222 
CASE_SyncCall(DemoApi * demoApi)223 static void CASE_SyncCall(DemoApi *demoApi)
224 {
225     if (demoApi->SyncCall == NULL) {
226         return;
227     }
228     printf("[LPC Test][TaskID:%u][Step:%u][SyncCall]: BEGIN! \n", (int)osThreadGetId(), g_asyncStep++);
229     struct Payload payload = {
230         .id = 0,
231         .name = "I want to sync call good result!",
232         .value = 1
233     };
234     if (!demoApi->SyncCall((IUnknown *)demoApi, &payload)) {
235         printf("[LPC Test][TaskID:%u][Step:%u][SyncCall]Error return false! \n",
236                (int)osThreadGetId(), g_asyncStep++);
237         goto END;
238     }
239     printf("[LPC Test][TaskID:%u][Step:%u][SyncCall]Success!\n",
240            (int)osThreadGetId(), g_asyncStep++);
241 END:
242     printf("[LPC Test][TaskID:%u][Step:%u][SyncCall]: END\n",
243            (int)osThreadGetId(), g_asyncStep++);
244 }
245 
246 
CASE_AsyncCall(DemoApi * demoApi)247 static void CASE_AsyncCall(DemoApi *demoApi)
248 {
249     if (demoApi->AsyncCall == NULL) {
250         return;
251     }
252     printf("[LPC Test][TaskID:%u][Step:%u][AsyncCall]: BEGIN! \n", (int)osThreadGetId(), g_asyncStep++);
253     uint32 count = g_asyncStep;
254     demoApi->AsyncCall((IUnknown *)demoApi, "I want to async call good result!");
255     LOS_Msleep(WAIT_FEATURE_PROC);
256     if (count == g_asyncStep) {
257         printf("[LPC Test][TaskID:%u][Step:%u][AsyncCall] result is failed! \n", (int)osThreadGetId(),
258                g_asyncStep++);
259         goto END;
260     }
261     printf("[LPC Test][TaskID:%u][Step:%u][AsyncCall]Success! \n", (int)osThreadGetId(), g_asyncStep++);
262 END:
263     printf("[LPC Test][TaskID:%u][Step:%u][AsyncCall]: END! \n", (int)osThreadGetId(), g_asyncStep++);
264 }
265 
CASE_AsyncTimeCall(DemoApi * demoApi)266 static void CASE_AsyncTimeCall(DemoApi *demoApi)
267 {
268     if (demoApi->AsyncCall == NULL) {
269         return;
270     }
271     demoApi->AsyncTimeCall((IUnknown *)demoApi);
272 }
273 
AsyncHandler(const Request * request,const Response * response)274 static void AsyncHandler(const Request *request, const Response *response)
275 {
276     (void)request;
277     printf("[LPC Test][TaskID:%u][Step:%u][AsyncCallBack]Success! Response:%s \n",
278            (int)osThreadGetId(), g_asyncStep++, (char *)response->data);
279     printf("[LPC Test][TaskID:%u][Step:%u][AsyncCallBack]: END! \n", (int)osThreadGetId(), g_asyncStep++);
280 }
281 
CASE_AsyncCallBack(DemoApi * demoApi)282 static void CASE_AsyncCallBack(DemoApi *demoApi)
283 {
284     if (demoApi->AsyncCallBack == NULL) {
285         return;
286     }
287     printf("[LPC Test][TaskID:%u][Step:%u][AsyncCallBack]: BEGIN! \n", (int)osThreadGetId(), g_asyncStep++);
288     demoApi->AsyncCallBack((IUnknown *)demoApi, "I want to async call callback good result!", AsyncHandler);
289     printf("[LPC Test][TaskID:%u][Step:%u][AsyncCallBack]Wait for response! \n",
290            (int)osThreadGetId(), g_asyncStep++);
291 }
292 
CASE_ReleaseIUnknown(DemoApi * demoApi)293 static void CASE_ReleaseIUnknown(DemoApi *demoApi)
294 {
295     printf("[Discover Test][TaskID:%u][Step:%u][ReleaseIUnknown S:%s, F:%s]: BEGIN\n",
296            (int)osThreadGetId(), g_discoverStep++, EXAMPLE_SERVICE, EXAMPLE_FEATURE);
297     int32 ref = demoApi->Release((IUnknown *)demoApi);
298     if (ref <= 0) {
299         printf("[Discover Test][TaskID:%u][Step:%u][ReleaseIUnknown S:%s, F:%s]Error ref is %d!\n",
300                (int)osThreadGetId(), g_discoverStep++, EXAMPLE_SERVICE, EXAMPLE_FEATURE, ref);
301         goto END;
302     }
303     printf("[Discover Test][TaskID:%u][Step:%u][ReleaseIUnknown S:%s, F:%s]Success\n",
304            (int)osThreadGetId(), g_discoverStep++, EXAMPLE_SERVICE, EXAMPLE_FEATURE);
305 END:
306     printf("[Discover Test][TaskID:%u][Step:%u][ReleaseIUnknown S:%s, F:%s]: END\n",
307            (int)osThreadGetId(), g_discoverStep++, EXAMPLE_SERVICE, EXAMPLE_FEATURE);
308 }
309 
RunTestCase(void)310 static void RunTestCase(void)
311 {
312     DemoApi *demoApi = CASE_GetIUnknown();
313     CASE_SyncCall(demoApi);
314     CASE_AsyncCall(demoApi);
315     CASE_AsyncCallBack(demoApi);
316     CASE_AsyncTimeCall(demoApi);
317     CASE_ReleaseIUnknown(demoApi);
318 }
319 
320 LAYER_INITCALL_DEF(RunTestCase, test, "test");
321