• 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 "iunknown.h"
23 #include "feature.h"
24 #include "service.h"
25 #include "samgr_lite.h"
26 #include "time_adapter.h"
27 
28 typedef struct DefaultFeatureApi {
29     INHERIT_IUNKNOWN;
30     void (*SyncCall)(IUnknown *iUnknown);
31 } DefaultFeatureApi;
32 
33 typedef struct ExampleService {
34     INHERIT_SERVICE;
35     INHERIT_IUNKNOWNENTRY(DefaultFeatureApi);
36     Identity identity;
37 } ExampleService;
38 
GetName(Service * service)39 static const char *GetName(Service *service)
40 {
41     (void)service;
42     return EXAMPLE_SERVICE;
43 }
44 
45 static uint32_t g_regStep = 0;
46 
Initialize(Service * service,Identity identity)47 static BOOL Initialize(Service *service, Identity identity)
48 {
49     ExampleService *example = (ExampleService *)service;
50     example->identity = identity;
51     printf("[Register Test][TaskID:%u][Step:%u][Reg Finish S:%s]Time: %llu!\n",
52            (int)osThreadGetId(), g_regStep++, service->GetName(service), SAMGR_GetProcessTime());
53     return TRUE;
54 }
55 
MessageHandle(Service * service,Request * msg)56 static BOOL MessageHandle(Service *service, Request *msg)
57 {
58     printf("[LPC Test][TaskID:%u] msgId<%d>: %s \n", (int)osThreadGetId(), msg->msgId, (char *)msg->data);
59     (void)service;
60     return FALSE;
61 }
62 
GetTaskConfig(Service * service)63 static TaskConfig GetTaskConfig(Service *service)
64 {
65     (void)service;
66     TaskConfig config = {LEVEL_HIGH, PRI_BELOW_NORMAL,
67                          0x800, 20, SHARED_TASK};
68     return config;
69 }
70 
71 static volatile uint32 g_asyncStep = 0;
72 
SyncCall(IUnknown * iUnknown)73 static void SyncCall(IUnknown *iUnknown)
74 {
75     (void)iUnknown;
76     printf("[LPC Test][TaskID:%u][Step:%u][SyncCall API] Default Success!\n", (int)osThreadGetId(),
77            g_asyncStep++);
78 }
79 
80 static ExampleService g_example = {
81     .GetName = GetName,
82     .Initialize = Initialize,
83     .MessageHandle = MessageHandle,
84     .GetTaskConfig = GetTaskConfig,
85     DEFAULT_IUNKNOWN_ENTRY_BEGIN,
86     .SyncCall = SyncCall,
87     DEFAULT_IUNKNOWN_ENTRY_END,
88 };
89 
Init(void)90 static void Init(void)
91 {
92     SAMGR_GetInstance()->RegisterService((Service *)&g_example);
93     SAMGR_GetInstance()->RegisterDefaultFeatureApi(EXAMPLE_SERVICE, GET_IUNKNOWN(g_example));
94     printf("[Register Test][TaskID:%u][Step:%u][Reg S:%s]Time: %llu!\n",
95            (int)osThreadGetId(), g_regStep++, EXAMPLE_SERVICE, SAMGR_GetProcessTime());
96 }
97 
98 SYSEX_SERVICE_INIT(Init);
99 
100 static uint32_t g_discoverStep = 0;
101 
CASE_GetIUnknown(void)102 static DefaultFeatureApi *CASE_GetIUnknown(void)
103 {
104     DefaultFeatureApi *demoApi = NULL;
105     printf("[Discover Test][TaskID:%u][Step:%u][GetIUnknown S:%s]: BEGIN\n",
106            (int)osThreadGetId(), g_discoverStep++, EXAMPLE_SERVICE);
107     IUnknown *iUnknown = SAMGR_GetInstance()->GetDefaultFeatureApi(EXAMPLE_SERVICE);
108     if (iUnknown == NULL) {
109         printf("[Discover Test][TaskID:%u][Step:%u][GetDefaultFeatureApi S:%s]Error is NULL!\n",
110                (int)osThreadGetId(), g_discoverStep++, EXAMPLE_SERVICE);
111         goto END;
112     }
113     int result = iUnknown->QueryInterface(iUnknown, DEFAULT_VERSION, (void **)&demoApi);
114     if (result != 0 || demoApi == NULL) {
115         printf("[Discover Test][TaskID:%u][Step:%u][QueryInterface S:%s]Error is NULL!\n",
116                (int)osThreadGetId(), g_discoverStep++, EXAMPLE_SERVICE);
117         goto END;
118     }
119     printf("[Discover Test][TaskID:%u][Step:%u][GetIUnknown S:%s]Success\n",
120            (int)osThreadGetId(), g_discoverStep++, EXAMPLE_SERVICE);
121 END:
122     printf("[Discover Test][TaskID:%u][Step:%u][GetIUnknown S:%s]: END\n",
123            (int)osThreadGetId(), g_discoverStep++, EXAMPLE_SERVICE);
124     return demoApi;
125 }
126 
CASE_SyncCall(DefaultFeatureApi * defaultApi)127 static void CASE_SyncCall(DefaultFeatureApi *defaultApi)
128 {
129     printf("[LPC Test][TaskID:%u][Step:%u][DefaultFeature SyncCall]: BEGIN\n", (int)osThreadGetId(),
130            g_asyncStep++);
131     defaultApi->SyncCall((IUnknown *)defaultApi);
132     printf("[LPC Test][TaskID:%u][Step:%u][DefaultFeature SyncCall]: END\n", (int)osThreadGetId(),
133            g_asyncStep++);
134 }
135 
CASE_ReleaseIUnknown(DefaultFeatureApi * demoApi)136 static void CASE_ReleaseIUnknown(DefaultFeatureApi *demoApi)
137 {
138     printf("[Discover Test][TaskID:%u][Step:%u][ReleaseIUnknown S:%s]: BEGIN\n",
139            (int)osThreadGetId(), g_discoverStep++, EXAMPLE_SERVICE);
140     int32 ref = demoApi->Release((IUnknown *)demoApi);
141     if (ref <= 0) {
142         printf("[Discover Test][TaskID:%u][Step:%u][ReleaseIUnknown S:%s]Error ref is %d!\n",
143                (int)osThreadGetId(), g_discoverStep++, EXAMPLE_SERVICE, ref);
144         goto END;
145     }
146     printf("[Discover Test][TaskID:%u][Step:%u][ReleaseIUnknown S:%s]Success\n",
147            (int)osThreadGetId(), g_discoverStep++, EXAMPLE_SERVICE);
148 END:
149     printf("[Discover Test][TaskID:%u][Step:%u][ReleaseIUnknown S:%s]: END\n",
150            (int)osThreadGetId(), g_discoverStep++, EXAMPLE_SERVICE);
151 }
152 
CASE_RegisterInvalidService(void)153 static void CASE_RegisterInvalidService(void)
154 {
155     Service service = {.GetName = NULL, .GetTaskConfig = NULL, .Initialize = NULL, .MessageHandle = NULL};
156     BOOL ret = SAMGR_GetInstance()->RegisterService(&service);
157     printf("Register Invalid Service %s\n", ret ? "TRUE" : "FALSE");
158 
159     Feature feature = {.GetName = NULL, .OnInitialize = NULL, .OnMessage = NULL, .OnStop = NULL};
160     ret = SAMGR_GetInstance()->RegisterFeature(EXAMPLE_SERVICE, &feature);
161     printf("Register Invalid Feature %s\n", ret ? "TRUE" : "FALSE");
162 
163     IUnknownEntry entry = {
164         .ver = DEFAULT_VERSION,
165         .ref = 1,
166         .iUnknown = {
167             .QueryInterface = NULL,
168             .Release = NULL,
169             .AddRef = NULL
170         }
171     };
172     ret = SAMGR_GetInstance()->RegisterDefaultFeatureApi(EXAMPLE_SERVICE, GET_IUNKNOWN(entry));
173     printf("Register Invalid Default Api %s\n", ret ? "TRUE" : "FALSE");
174 
175     ret = SAMGR_GetInstance()->RegisterFeatureApi(EXAMPLE_SERVICE, EXAMPLE_FEATURE "2", GET_IUNKNOWN(entry));
176     printf("Register Invalid " EXAMPLE_FEATURE "2 Api %s\n", ret ? "TRUE" : "FALSE");
177 }
178 
RunTestCase(void)179 static void RunTestCase(void)
180 {
181     DefaultFeatureApi *defaultApi = CASE_GetIUnknown();
182     CASE_RegisterInvalidService();
183     CASE_SyncCall(defaultApi);
184     CASE_ReleaseIUnknown(defaultApi);
185 }
186 
187 LAYER_INITCALL_DEF(RunTestCase, test, "test");
188