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