• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 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 <thread>
17 #include <inttypes.h>
18 #include <securec.h>
19 #include "ohos_common.h"
20 #include "gtest/gtest.h"
21 #include "include/c_api/context_c.h"
22 #include "include/c_api/model_c.h"
23 #include "include/c_api/types_c.h"
24 #include "include/c_api/status_c.h"
25 #include "include/c_api/data_type_c.h"
26 #include "include/c_api/tensor_c.h"
27 #include "include/c_api/format_c.h"
28 
29 using namespace testing::ext;
30 
31 class MSLiteTest: public testing::Test {
32 protected:
SetUpTestCase(void)33   static void SetUpTestCase(void) {}
TearDownTestCase(void)34   static void TearDownTestCase(void) {}
SetUp()35   virtual void SetUp() {}
TearDown()36   virtual void TearDown() {}
37 };
38 
39 // function before callback
PrintBeforeCallback(const OH_AI_TensorHandleArray inputs,const OH_AI_TensorHandleArray outputs,const OH_AI_CallBackParam kernel_Info)40 bool PrintBeforeCallback(const OH_AI_TensorHandleArray inputs, const OH_AI_TensorHandleArray outputs,
41                          const OH_AI_CallBackParam kernel_Info) {
42     std::cout << "Before forwarding " << kernel_Info.node_name << " " << kernel_Info.node_type << std::endl;
43     return true;
44 }
45 
46 // function after callback
PrintAfterCallback(const OH_AI_TensorHandleArray inputs,const OH_AI_TensorHandleArray outputs,const OH_AI_CallBackParam kernel_Info)47 bool PrintAfterCallback(const OH_AI_TensorHandleArray inputs, const OH_AI_TensorHandleArray outputs,
48                         const OH_AI_CallBackParam kernel_Info) {
49     std::cout << "After forwarding " << kernel_Info.node_name << " " << kernel_Info.node_type << std::endl;
50     return true;
51 }
52 
53 // add cpu device info
AddContextDeviceCPU(OH_AI_ContextHandle context)54 void AddContextDeviceCPU(OH_AI_ContextHandle context) {
55     OH_AI_DeviceInfoHandle cpu_device_info = OH_AI_DeviceInfoCreate(OH_AI_DEVICETYPE_CPU);
56     ASSERT_NE(cpu_device_info, nullptr);
57     OH_AI_DeviceType device_type = OH_AI_DeviceInfoGetDeviceType(cpu_device_info);
58     printf("==========device_type:%d\n", device_type);
59     ASSERT_EQ(device_type, OH_AI_DEVICETYPE_CPU);
60     OH_AI_ContextAddDeviceInfo(context, cpu_device_info);
61 }
62 
63 // fill data to inputs tensor
FillInputsData(OH_AI_TensorHandleArray inputs,string model_name,bool is_transpose)64 void FillInputsData(OH_AI_TensorHandleArray inputs, string model_name, bool is_transpose) {
65     for (size_t i = 0; i < inputs.handle_num; ++i) {
66         printf("==========ReadFile==========\n");
67         size_t size1;
68         size_t *ptr_size1 = &size1;
69         string input_data_path = "/data/test/" + model_name + "_" + std::to_string(i) + ".input";
70         const char *imagePath = input_data_path.c_str();
71         char *imageBuf = ReadFile(imagePath, ptr_size1);
72         ASSERT_NE(imageBuf, nullptr);
73         OH_AI_TensorHandle tensor = inputs.handle_list[i];
74         int64_t element_num = OH_AI_TensorGetElementNum(tensor);
75         printf("Tensor name: %s. \n", OH_AI_TensorGetName(tensor));
76         float *input_data = reinterpret_cast<float *>(OH_AI_TensorGetMutableData(inputs.handle_list[i]));
77         ASSERT_NE(input_data, nullptr);
78         if (is_transpose) {
79             printf("==========Transpose==========\n");
80             size_t shape_num;
81             const int64_t *shape = OH_AI_TensorGetShape(tensor, &shape_num);
82             auto imageBuf_nhwc = new char[size1];
83             PackNCHWToNHWCFp32(imageBuf, imageBuf_nhwc, shape[0], shape[1] * shape[2], shape[3]);
84             memcpy_s(input_data, size1, imageBuf_nhwc, size1);
85         } else {
86             memcpy_s(input_data, size1, imageBuf, size1);
87         }
88         printf("input data after filling is: ");
89         for (int j = 0; j < element_num && j <= 20; ++j) {
90             printf("%f ", input_data[j]);
91         }
92         printf("\n");
93         delete[] imageBuf;
94     }
95 }
96 
97 // compare result after predict
CompareResult(OH_AI_TensorHandleArray outputs,string model_name)98 void CompareResult(OH_AI_TensorHandleArray outputs, string model_name) {
99     printf("==========GetOutput==========\n");
100     for (size_t i = 0; i < outputs.handle_num; ++i) {
101         OH_AI_TensorHandle tensor = outputs.handle_list[i];
102         int64_t element_num = OH_AI_TensorGetElementNum(tensor);
103         printf("Tensor name: %s .\n", OH_AI_TensorGetName(tensor));
104         float *output_data = reinterpret_cast<float *>(OH_AI_TensorGetMutableData(tensor));
105         printf("output data is:");
106         for (int j = 0; j < element_num && j <= 20; ++j) {
107             printf("%f ", output_data[j]);
108         }
109         printf("\n");
110         printf("==========compFp32WithTData==========\n");
111         string output_file = "/data/test/" + model_name + std::to_string(i) + ".output";
112         bool result = compFp32WithTData(output_data, output_file, 0.01, 0.01, false);
113         EXPECT_EQ(result, true);
114     }
115 }
116 
117 // model build and predict
ModelPredict(OH_AI_ModelHandle model,OH_AI_ContextHandle context,string model_name,OH_AI_ShapeInfo shape_infos,bool build_by_graph,bool is_transpose,bool is_callback)118 void ModelPredict(OH_AI_ModelHandle model, OH_AI_ContextHandle context, string model_name,
119             OH_AI_ShapeInfo shape_infos, bool build_by_graph, bool is_transpose, bool is_callback) {
120     string model_path = "/data/test/" + model_name + ".ms";
121     const char *graphPath = model_path.c_str();
122     OH_AI_Status ret = OH_AI_STATUS_SUCCESS;
123     if (build_by_graph) {
124         printf("==========Build model by graphBuf==========\n");
125         size_t size;
126         size_t *ptr_size = &size;
127         char *graphBuf = ReadFile(graphPath, ptr_size);
128         ASSERT_NE(graphBuf, nullptr);
129         ret = OH_AI_ModelBuild(model, graphBuf, size, OH_AI_MODELTYPE_MINDIR, context);
130     } else {
131         printf("==========Build model==========\n");
132         ret = OH_AI_ModelBuildFromFile(model, graphPath, OH_AI_MODELTYPE_MINDIR, context);
133     }
134     printf("==========build model return code:%d\n", ret);
135     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
136     printf("==========GetInputs==========\n");
137     OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
138     ASSERT_NE(inputs.handle_list, nullptr);
139     if (shape_infos.shape_num != NULL) {
140         printf("==========Resizes==========\n");
141         OH_AI_Status resize_ret = OH_AI_ModelResize(model, inputs, &shape_infos, inputs.handle_num);
142         printf("==========Resizes return code:%d\n", resize_ret);
143         ASSERT_EQ(resize_ret, OH_AI_STATUS_SUCCESS);
144     }
145     FillInputsData(inputs, model_name, is_transpose);
146     OH_AI_TensorHandleArray outputs;
147     OH_AI_Status predict_ret = OH_AI_STATUS_SUCCESS;
148     if (is_callback) {
149         printf("==========Model Predict Callback==========\n");
150         OH_AI_KernelCallBack before_call_back = PrintBeforeCallback;
151         OH_AI_KernelCallBack after_call_back = PrintAfterCallback;
152         predict_ret = OH_AI_ModelPredict(model, inputs, &outputs, before_call_back, after_call_back);
153     }else {
154         printf("==========Model Predict==========\n");
155         predict_ret = OH_AI_ModelPredict(model, inputs, &outputs, nullptr, nullptr);
156     }
157     ASSERT_EQ(predict_ret, OH_AI_STATUS_SUCCESS);
158     CompareResult(outputs, model_name);
159     OH_AI_ModelDestroy(&model);
160 }
161 
162 // predict on cpu
Predict_CPU()163 void Predict_CPU() {
164     printf("==========Init Context==========\n");
165     OH_AI_ContextHandle context = OH_AI_ContextCreate();
166     ASSERT_NE(context, nullptr);
167     AddContextDeviceCPU(context);
168     printf("==========Create model==========\n");
169     OH_AI_ModelHandle model = OH_AI_ModelCreate();
170     ASSERT_NE(model, nullptr);
171     ModelPredict(model, context, "ml_face_isface", {}, false, true, false);
172 }
173 
174 // 正常场景:Context设置CPU,默认场景,不设置线程绑核
175 HWTEST(MSLiteTest, OHOS_Context_CPU_0001, Function | MediumTest | Level1) {
176     printf("==========Init Context==========\n");
177     OH_AI_ContextHandle context = OH_AI_ContextCreate();
178     ASSERT_NE(context, nullptr);
179     AddContextDeviceCPU(context);
180     printf("==========Create model==========\n");
181     OH_AI_ModelHandle model = OH_AI_ModelCreate();
182     ASSERT_NE(model, nullptr);
183     ModelPredict(model, context, "ml_face_isface", {}, false, true, false);
184 }
185 
186 // 正常场景:Context设置CPU,4线程
187 HWTEST(MSLiteTest, OHOS_Context_CPU_0002, Function | MediumTest | Level1) {
188     printf("==========Init Context==========\n");
189     OH_AI_ContextHandle context = OH_AI_ContextCreate();
190     ASSERT_NE(context, nullptr);
191     OH_AI_ContextSetThreadNum(context, 4);
192     int32_t thread_num = OH_AI_ContextGetThreadNum(context);
193     printf("==========thread_num:%d\n", thread_num);
194     ASSERT_EQ(thread_num, 4);
195     AddContextDeviceCPU(context);
196     printf("==========Create model==========\n");
197     OH_AI_ModelHandle model = OH_AI_ModelCreate();
198     ASSERT_NE(model, nullptr);
199     ModelPredict(model, context, "ml_face_isface", {}, false, true, false);
200 }
201 
202 // 正常场景:Context设置CPU,2线程
203 HWTEST(MSLiteTest, OHOS_Context_CPU_0003, Function | MediumTest | Level1) {
204     printf("==========Init Context==========\n");
205     OH_AI_ContextHandle context = OH_AI_ContextCreate();
206     ASSERT_NE(context, nullptr);
207     OH_AI_ContextSetThreadNum(context, 2);
208     int32_t thread_num = OH_AI_ContextGetThreadNum(context);
209     printf("==========thread_num:%d\n", thread_num);
210     ASSERT_EQ(thread_num, 2);
211     AddContextDeviceCPU(context);
212     printf("==========Create model==========\n");
213     OH_AI_ModelHandle model = OH_AI_ModelCreate();
214     ASSERT_NE(model, nullptr);
215     ModelPredict(model, context, "ml_face_isface", {}, false, true, false);
216 }
217 
218 // 正常场景:Context设置CPU,1线程
219 HWTEST(MSLiteTest, OHOS_Context_CPU_0004, Function | MediumTest | Level1) {
220     printf("==========Init Context==========\n");
221     OH_AI_ContextHandle context = OH_AI_ContextCreate();
222     ASSERT_NE(context, nullptr);
223     OH_AI_ContextSetThreadNum(context, 1);
224     int32_t thread_num = OH_AI_ContextGetThreadNum(context);
225     printf("==========thread_num:%d\n", thread_num);
226     ASSERT_EQ(thread_num, 1);
227     AddContextDeviceCPU(context);
228     printf("==========Create model==========\n");
229     OH_AI_ModelHandle model = OH_AI_ModelCreate();
230     ASSERT_NE(model, nullptr);
231     ModelPredict(model, context, "ml_face_isface", {}, false, true, false);
232 }
233 
234 // 异常场景:Context设置CPU,0线程
235 HWTEST(MSLiteTest, OHOS_Context_CPU_0005, Function | MediumTest | Level1) {
236     printf("==========Init Context==========\n");
237     OH_AI_ContextHandle context = OH_AI_ContextCreate();
238     ASSERT_NE(context, nullptr);
239     OH_AI_ContextSetThreadNum(context, 0);
240     int32_t thread_num = OH_AI_ContextGetThreadNum(context);
241     printf("==========thread_num:%d\n", thread_num);
242     ASSERT_EQ(thread_num, 0);
243     AddContextDeviceCPU(context);
244     printf("==========Create model==========\n");
245     OH_AI_ModelHandle model = OH_AI_ModelCreate();
246     ASSERT_NE(model, nullptr);
247     printf("==========Build model==========\n");
248     OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface.ms", OH_AI_MODELTYPE_MINDIR, context);
249     printf("==========build model return code:%d\n", ret);
250     ASSERT_EQ(ret, OH_AI_STATUS_LITE_NOT_SUPPORT);
251     OH_AI_ModelDestroy(&model);
252 }
253 
254 // 正常场景:Context设置CPU,不绑核
255 HWTEST(MSLiteTest, OHOS_Context_CPU_0006, Function | MediumTest | Level1) {
256     printf("==========Init Context==========\n");
257     OH_AI_ContextHandle context = OH_AI_ContextCreate();
258     ASSERT_NE(context, nullptr);
259     OH_AI_ContextSetThreadNum(context, 4);
260     int32_t thread_num = OH_AI_ContextGetThreadNum(context);
261     printf("==========thread_num:%d\n", thread_num);
262     ASSERT_EQ(thread_num, 4);
263     OH_AI_ContextSetThreadAffinityMode(context, 0);
264     int thread_affinity_mode = OH_AI_ContextGetThreadAffinityMode(context);
265     printf("==========thread_affinity_mode:%d\n", thread_affinity_mode);
266     ASSERT_EQ(thread_affinity_mode, 0);
267     AddContextDeviceCPU(context);
268     printf("==========Create model==========\n");
269     OH_AI_ModelHandle model = OH_AI_ModelCreate();
270     ASSERT_NE(model, nullptr);
271     ModelPredict(model, context, "ml_face_isface", {}, false, true, false);
272 }
273 
274 // 正常场景:Context设置CPU,绑大核
275 HWTEST(MSLiteTest, OHOS_Context_CPU_0007, Function | MediumTest | Level1) {
276     printf("==========Init Context==========\n");
277     OH_AI_ContextHandle context = OH_AI_ContextCreate();
278     ASSERT_NE(context, nullptr);
279     OH_AI_ContextSetThreadNum(context, 4);
280     int32_t thread_num = OH_AI_ContextGetThreadNum(context);
281     printf("==========thread_num:%d\n", thread_num);
282     ASSERT_EQ(thread_num, 4);
283     OH_AI_ContextSetThreadAffinityMode(context, 1);
284     int thread_affinity_mode = OH_AI_ContextGetThreadAffinityMode(context);
285     printf("==========thread_affinity_mode:%d\n", thread_affinity_mode);
286     ASSERT_EQ(thread_affinity_mode, 1);
287     AddContextDeviceCPU(context);
288     printf("==========Create model==========\n");
289     OH_AI_ModelHandle model = OH_AI_ModelCreate();
290     ASSERT_NE(model, nullptr);
291     ModelPredict(model, context, "ml_face_isface", {}, false, true, false);
292 }
293 
294 // 正常场景:Context设置CPU,绑中核
295 HWTEST(MSLiteTest, OHOS_Context_CPU_0008, Function | MediumTest | Level1) {
296     printf("==========Init Context==========\n");
297     OH_AI_ContextHandle context = OH_AI_ContextCreate();
298     ASSERT_NE(context, nullptr);
299     OH_AI_ContextSetThreadNum(context, 4);
300     int32_t thread_num = OH_AI_ContextGetThreadNum(context);
301     printf("==========thread_num:%d\n", thread_num);
302     ASSERT_EQ(thread_num, 4);
303     OH_AI_ContextSetThreadAffinityMode(context, 2);
304     int thread_affinity_mode = OH_AI_ContextGetThreadAffinityMode(context);
305     printf("==========thread_affinity_mode:%d\n", thread_affinity_mode);
306     ASSERT_EQ(thread_affinity_mode, 2);
307     AddContextDeviceCPU(context);
308     printf("==========Create model==========\n");
309     OH_AI_ModelHandle model = OH_AI_ModelCreate();
310     ASSERT_NE(model, nullptr);
311     ModelPredict(model, context, "ml_face_isface", {}, false, true, false);
312 }
313 
314 // 异常场景:Context设置CPU,绑核失败
315 HWTEST(MSLiteTest, OHOS_Context_CPU_0009, Function | MediumTest | Level1) {
316     printf("==========Init Context==========\n");
317     OH_AI_ContextHandle context = OH_AI_ContextCreate();
318     ASSERT_NE(context, nullptr);
319     OH_AI_ContextSetThreadNum(context, 4);
320     int32_t thread_num = OH_AI_ContextGetThreadNum(context);
321     printf("==========thread_num:%d\n", thread_num);
322     ASSERT_EQ(thread_num, 4);
323     OH_AI_ContextSetThreadAffinityMode(context, 3);
324     int thread_affinity_mode = OH_AI_ContextGetThreadAffinityMode(context);
325     printf("==========thread_affinity_mode:%d\n", thread_affinity_mode);
326     ASSERT_EQ(thread_affinity_mode, 3);
327     AddContextDeviceCPU(context);
328     printf("==========Create model==========\n");
329     OH_AI_ModelHandle model = OH_AI_ModelCreate();
330     ASSERT_NE(model, nullptr);
331     printf("==========Build model==========\n");
332     OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface.ms", OH_AI_MODELTYPE_MINDIR, context);
333     printf("==========build model return code:%d\n", ret);
334     ASSERT_EQ(ret, OH_AI_STATUS_LITE_NULLPTR);
335     OH_AI_ModelDestroy(&model);
336 }
337 
338 // 正常场景:Context设置CPU,绑核列表{0,1,2,3}
339 HWTEST(MSLiteTest, OHOS_Context_CPU_0010, Function | MediumTest | Level1) {
340     printf("==========Init Context==========\n");
341     OH_AI_ContextHandle context = OH_AI_ContextCreate();
342     ASSERT_NE(context, nullptr);
343     OH_AI_ContextSetThreadNum(context, 4);
344     int32_t thread_num = OH_AI_ContextGetThreadNum(context);
345     printf("==========thread_num:%d\n", thread_num);
346     ASSERT_EQ(thread_num, 4);
347     constexpr size_t core_num = 4;
348     int32_t core_list[core_num] = {0, 1, 2, 3};
349     OH_AI_ContextSetThreadAffinityCoreList(context, core_list, core_num);
350     size_t ret_core_num;
351     const int32_t *ret_core_list = nullptr;
352     ret_core_list = OH_AI_ContextGetThreadAffinityCoreList(context, &ret_core_num);
353     ASSERT_EQ(ret_core_num, core_num);
354     for (size_t i = 0; i < ret_core_num; i++) {
355         printf("==========ret_core_list:%d\n", ret_core_list[i]);
356         ASSERT_EQ(ret_core_list[i], core_list[i]);
357     }
358     AddContextDeviceCPU(context);
359     printf("==========Create model==========\n");
360     OH_AI_ModelHandle model = OH_AI_ModelCreate();
361     ASSERT_NE(model, nullptr);
362     ModelPredict(model, context, "ml_face_isface", {}, false, true, false);
363 }
364 
365 // 正常场景:Context设置CPU,绑核列表和模式同时开启
366 HWTEST(MSLiteTest, OHOS_Context_CPU_0011, Function | MediumTest | Level1) {
367     printf("==========Init Context==========\n");
368     OH_AI_ContextHandle context = OH_AI_ContextCreate();
369     ASSERT_NE(context, nullptr);
370     OH_AI_ContextSetThreadNum(context, 4);
371     int32_t thread_num = OH_AI_ContextGetThreadNum(context);
372     printf("==========thread_num:%d\n", thread_num);
373     ASSERT_EQ(thread_num, 4);
374     OH_AI_ContextSetThreadAffinityMode(context, 1);
375     int thread_affinity_mode = OH_AI_ContextGetThreadAffinityMode(context);
376     printf("==========thread_affinity_mode:%d\n", thread_affinity_mode);
377     constexpr size_t core_num = 4;
378     int32_t core_list[core_num] = {0, 1, 3, 4};
379     OH_AI_ContextSetThreadAffinityCoreList(context, core_list, core_num);
380     size_t ret_core_num;
381     const int32_t *ret_core_list = nullptr;
382     ret_core_list = OH_AI_ContextGetThreadAffinityCoreList(context, &ret_core_num);
383     ASSERT_EQ(ret_core_num, core_num);
384     for (size_t i = 0; i < ret_core_num; i++) {
385         printf("==========ret_core_list:%d\n", ret_core_list[i]);
386         ASSERT_EQ(ret_core_list[i], core_list[i]);
387     }
388     AddContextDeviceCPU(context);
389     printf("==========Create model==========\n");
390     OH_AI_ModelHandle model = OH_AI_ModelCreate();
391     ASSERT_NE(model, nullptr);
392     ModelPredict(model, context, "ml_face_isface", {}, false, true, false);
393 }
394 
395 // 正常场景:Context设置CPU,开启并行
396 HWTEST(MSLiteTest, OHOS_Context_CPU_0012, Function | MediumTest | Level1) {
397     printf("==========Init Context==========\n");
398     OH_AI_ContextHandle context = OH_AI_ContextCreate();
399     ASSERT_NE(context, nullptr);
400     OH_AI_ContextSetThreadNum(context, 4);
401     int32_t thread_num = OH_AI_ContextGetThreadNum(context);
402     printf("==========thread_num:%d\n", thread_num);
403     ASSERT_EQ(thread_num, 4);
404     OH_AI_ContextSetEnableParallel(context, true);
405     bool is_parallel = OH_AI_ContextGetEnableParallel(context);
406     printf("==========is_parallel:%d\n", is_parallel);
407     ASSERT_EQ(is_parallel, true);
408     AddContextDeviceCPU(context);
409     printf("==========Create model==========\n");
410     OH_AI_ModelHandle model = OH_AI_ModelCreate();
411     ASSERT_NE(model, nullptr);
412     ModelPredict(model, context, "ml_face_isface", {}, false, true, false);
413 }
414 
415 // 正常场景:Context设置CPU,关闭并行
416 HWTEST(MSLiteTest, OHOS_Context_CPU_0013, Function | MediumTest | Level1) {
417     printf("==========Init Context==========\n");
418     OH_AI_ContextHandle context = OH_AI_ContextCreate();
419     ASSERT_NE(context, nullptr);
420     OH_AI_ContextSetThreadNum(context, 4);
421     int32_t thread_num = OH_AI_ContextGetThreadNum(context);
422     printf("==========thread_num:%d\n", thread_num);
423     ASSERT_EQ(thread_num, 4);
424     OH_AI_ContextSetEnableParallel(context, false);
425     bool is_parallel = OH_AI_ContextGetEnableParallel(context);
426     printf("==========is_parallel:%d\n", is_parallel);
427     ASSERT_EQ(is_parallel, false);
428     AddContextDeviceCPU(context);
429     printf("==========Create model==========\n");
430     OH_AI_ModelHandle model = OH_AI_ModelCreate();
431     ASSERT_NE(model, nullptr);
432     ModelPredict(model, context, "ml_face_isface", {}, false, true, false);
433 }
434 
435 // 正常场景:Context设置CPU,开启fp16
436 HWTEST(MSLiteTest, OHOS_Context_CPU_0014, Function | MediumTest | Level1) {
437     printf("==========Init Context==========\n");
438     OH_AI_ContextHandle context = OH_AI_ContextCreate();
439     ASSERT_NE(context, nullptr);
440     OH_AI_DeviceInfoHandle cpu_device_info = OH_AI_DeviceInfoCreate(OH_AI_DEVICETYPE_CPU);
441     ASSERT_NE(cpu_device_info, nullptr);
442     OH_AI_DeviceInfoSetEnableFP16(cpu_device_info, true);
443     bool is_fp16 = OH_AI_DeviceInfoGetEnableFP16(cpu_device_info);
444     printf("==========is_fp16:%d\n", is_fp16);
445     ASSERT_EQ(is_fp16, true);
446     OH_AI_ContextAddDeviceInfo(context, cpu_device_info);
447     printf("==========Create model==========\n");
448     OH_AI_ModelHandle model = OH_AI_ModelCreate();
449     ASSERT_NE(model, nullptr);
450     ModelPredict(model, context, "ml_face_isface", {}, false, true, false);
451 }
452 
453 // 正常场景:Context设置CPU,关闭fp16
454 HWTEST(MSLiteTest, OHOS_Context_CPU_0015, Function | MediumTest | Level1) {
455     printf("==========Init Context==========\n");
456     OH_AI_ContextHandle context = OH_AI_ContextCreate();
457     ASSERT_NE(context, nullptr);
458     OH_AI_DeviceInfoHandle cpu_device_info = OH_AI_DeviceInfoCreate(OH_AI_DEVICETYPE_CPU);
459     ASSERT_NE(cpu_device_info, nullptr);
460     OH_AI_DeviceInfoSetEnableFP16(cpu_device_info, false);
461     bool is_fp16 = OH_AI_DeviceInfoGetEnableFP16(cpu_device_info);
462     printf("==========is_fp16:%d\n", is_fp16);
463     ASSERT_EQ(is_fp16, false);
464     OH_AI_ContextAddDeviceInfo(context, cpu_device_info);
465     printf("==========Create model==========\n");
466     OH_AI_ModelHandle model = OH_AI_ModelCreate();
467     ASSERT_NE(model, nullptr);
468     ModelPredict(model, context, "ml_face_isface", {}, false, true, false);
469 }
470 
471 // 正常场景:Context设置CPU,设置厂商名称
472 HWTEST(MSLiteTest, OHOS_Context_CPU_0016, Function | MediumTest | Level1) {
473     printf("==========Init Context==========\n");
474     OH_AI_ContextHandle context = OH_AI_ContextCreate();
475     ASSERT_NE(context, nullptr);
476     OH_AI_DeviceInfoHandle cpu_device_info = OH_AI_DeviceInfoCreate(OH_AI_DEVICETYPE_CPU);
477     ASSERT_NE(cpu_device_info, nullptr);
478     OH_AI_DeviceInfoSetProvider(cpu_device_info, "vendor_new");
479     ASSERT_EQ(strcmp(OH_AI_DeviceInfoGetProvider(cpu_device_info), "vendor_new"), 0);
480     OH_AI_ContextAddDeviceInfo(context, cpu_device_info);
481     printf("==========Create model==========\n");
482     OH_AI_ModelHandle model = OH_AI_ModelCreate();
483     ASSERT_NE(model, nullptr);
484     ModelPredict(model, context, "ml_face_isface", {}, false, true, false);
485 }
486 
487 // 正常场景:Context设置CPU,设置厂商设备类型
488 HWTEST(MSLiteTest, OHOS_Context_CPU_0017, Function | MediumTest | Level1) {
489     printf("==========Init Context==========\n");
490     OH_AI_ContextHandle context = OH_AI_ContextCreate();
491     ASSERT_NE(context, nullptr);
492     OH_AI_DeviceInfoHandle cpu_device_info = OH_AI_DeviceInfoCreate(OH_AI_DEVICETYPE_CPU);
493     ASSERT_NE(cpu_device_info, nullptr);
494     OH_AI_DeviceInfoSetProviderDevice(cpu_device_info, "cpu_new");
495     ASSERT_EQ(strcmp(OH_AI_DeviceInfoGetProviderDevice(cpu_device_info), "cpu_new"), 0);
496     OH_AI_ContextAddDeviceInfo(context, cpu_device_info);
497     printf("==========Create model==========\n");
498     OH_AI_ModelHandle model = OH_AI_ModelCreate();
499     ASSERT_NE(model, nullptr);
500     ModelPredict(model, context, "ml_face_isface", {}, false, true, false);
501 }
502 
503 // 正常场景:Context设置CPU,销毁MSDeviceInfo
504 HWTEST(MSLiteTest, OHOS_Context_CPU_0018, Function | MediumTest | Level1) {
505     printf("==========Init Context==========\n");
506     OH_AI_ContextHandle context = OH_AI_ContextCreate();
507     ASSERT_NE(context, nullptr);
508     OH_AI_DeviceInfoHandle cpu_device_info = OH_AI_DeviceInfoCreate(OH_AI_DEVICETYPE_CPU);
509     ASSERT_NE(cpu_device_info, nullptr);
510     OH_AI_DeviceType device_type = OH_AI_DeviceInfoGetDeviceType(cpu_device_info);
511     printf("==========device_type:%d\n", device_type);
512     ASSERT_EQ(device_type, OH_AI_DEVICETYPE_CPU);
513     OH_AI_ContextAddDeviceInfo(context, cpu_device_info);
514     OH_AI_DeviceInfoDestroy(&cpu_device_info);
515     ASSERT_EQ(cpu_device_info, nullptr);
516 }
517 
518 // 正常场景:Context设置CPU,销毁OH_AI_Context
519 HWTEST(MSLiteTest, OHOS_Context_CPU_0019, Function | MediumTest | Level1) {
520     printf("==========Init Context==========\n");
521     OH_AI_ContextHandle context = OH_AI_ContextCreate();
522     ASSERT_NE(context, nullptr);
523     OH_AI_DeviceInfoHandle cpu_device_info = OH_AI_DeviceInfoCreate(OH_AI_DEVICETYPE_CPU);
524     ASSERT_NE(cpu_device_info, nullptr);
525     OH_AI_DeviceType device_type = OH_AI_DeviceInfoGetDeviceType(cpu_device_info);
526     printf("==========device_type:%d\n", device_type);
527     ASSERT_EQ(device_type, OH_AI_DEVICETYPE_CPU);
528     OH_AI_ContextAddDeviceInfo(context, cpu_device_info);
529     OH_AI_ContextDestroy(&context);
530     ASSERT_EQ(context, nullptr);
531 }
532 
533 // 异常场景:Context不设置device info
534 HWTEST(MSLiteTest, OHOS_Context_CPU_0020, Function | MediumTest | Level1) {
535     printf("==========Init Context==========\n");
536     OH_AI_ContextHandle context = OH_AI_ContextCreate();
537     ASSERT_NE(context, nullptr);
538     printf("==========Create model==========\n");
539     OH_AI_ModelHandle model = OH_AI_ModelCreate();
540     ASSERT_NE(model, nullptr);
541     printf("==========Build model==========\n");
542     OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface.ms", OH_AI_MODELTYPE_MINDIR, context);
543     printf("==========build model return code:%d\n", ret);
544     ASSERT_EQ(ret, OH_AI_STATUS_LITE_NULLPTR);
545     OH_AI_ModelDestroy(&model);
546 }
547 
548  // 正常场景:Context设置NPU,频率为1
549  HWTEST(MSLiteTest, OHOS_Context_NPU_0002, Function | MediumTest | Level1) {
550      printf("==========Init Context==========\n");
551      OH_AI_ContextHandle context = OH_AI_ContextCreate();
552      ASSERT_NE(context, nullptr);
553      OH_AI_DeviceInfoHandle npu_device_info = OH_AI_DeviceInfoCreate(OH_AI_DEVICETYPE_KIRIN_NPU);
554      ASSERT_NE(npu_device_info, nullptr);
555      OH_AI_DeviceInfoSetFrequency(npu_device_info, 1);
556      int frequency = OH_AI_DeviceInfoGetFrequency(npu_device_info);
557      ASSERT_EQ(frequency, 1);
558      OH_AI_ContextAddDeviceInfo(context, npu_device_info);
559      printf("==========Create model==========\n");
560      OH_AI_ModelHandle model = OH_AI_ModelCreate();
561      ASSERT_NE(model, nullptr);
562  }
563 
564 // 正常场景:ModelBuild,调用指针方法
565 HWTEST(MSLiteTest, OHOS_Model_Build_0001, Function | MediumTest | Level1) {
566     printf("==========Init Context==========\n");
567     OH_AI_ContextHandle context = OH_AI_ContextCreate();
568     ASSERT_NE(context, nullptr);
569     AddContextDeviceCPU(context);
570     printf("==========Create model==========\n");
571     OH_AI_ModelHandle model = OH_AI_ModelCreate();
572     ASSERT_NE(model, nullptr);
573     ModelPredict(model, context, "ml_face_isface", {}, true, true, false);
574 }
575 
576 // 异常场景:ModelBuild,model_data指向的不是模型数据
577 HWTEST(MSLiteTest, OHOS_Model_Build_0002, Function | MediumTest | Level1) {
578     printf("==========ReadFile==========\n");
579     size_t size1;
580     size_t *ptr_size1 = &size1;
581     const char *imagePath = "/data/test/ml_face_isface.input";
582     char *imageBuf = ReadFile(imagePath, ptr_size1);
583     ASSERT_NE(imageBuf, nullptr);
584     printf("==========Init Context==========\n");
585     OH_AI_ContextHandle context = OH_AI_ContextCreate();
586     ASSERT_NE(context, nullptr);
587     AddContextDeviceCPU(context);
588     printf("==========Create model==========\n");
589     OH_AI_ModelHandle model = OH_AI_ModelCreate();
590     ASSERT_NE(model, nullptr);
591     printf("==========Build model==========\n");
592     OH_AI_Status ret = OH_AI_ModelBuild(model, imageBuf, size1, OH_AI_MODELTYPE_MINDIR, context);
593     printf("==========build model return code:%d\n", ret);
594     ASSERT_EQ(ret, OH_AI_STATUS_LITE_ERROR);
595     delete[] imageBuf;
596     OH_AI_ModelDestroy(&model);
597 }
598 
599 // 异常场景:ModelBuild,model_data为空
600 HWTEST(MSLiteTest, OHOS_Model_Build_0003, Function | MediumTest | Level1) {
601     printf("==========Init Context==========\n");
602     OH_AI_ContextHandle context = OH_AI_ContextCreate();
603     ASSERT_NE(context, nullptr);
604     AddContextDeviceCPU(context);
605     printf("==========Create model==========\n");
606     OH_AI_ModelHandle model = OH_AI_ModelCreate();
607     ASSERT_NE(model, nullptr);
608     printf("==========Build model==========\n");
609     OH_AI_Status ret = OH_AI_ModelBuild(model, nullptr, 0, OH_AI_MODELTYPE_MINDIR, context);
610     printf("==========build model return code:%d\n", ret);
611     ASSERT_EQ(ret, OH_AI_STATUS_LITE_NULLPTR);
612     OH_AI_ModelDestroy(&model);
613 }
614 
615 // 异常场景:ModelBuild,data_size为0
616 HWTEST(MSLiteTest, OHOS_Model_Build_0004, Function | MediumTest | Level1) {
617     printf("==========ReadFile==========\n");
618     size_t size;
619     size_t *ptr_size = &size;
620     const char *graphPath = "/data/test/ml_face_isface.ms";
621     char *graphBuf = ReadFile(graphPath, ptr_size);
622     ASSERT_NE(graphBuf, nullptr);
623     printf("==========Init Context==========\n");
624     OH_AI_ContextHandle context = OH_AI_ContextCreate();
625     ASSERT_NE(context, nullptr);
626     AddContextDeviceCPU(context);
627     printf("==========Create model==========\n");
628     OH_AI_ModelHandle model = OH_AI_ModelCreate();
629     ASSERT_NE(model, nullptr);
630     printf("==========Build model==========\n");
631     OH_AI_Status ret = OH_AI_ModelBuild(model, graphBuf, 0, OH_AI_MODELTYPE_MINDIR, context);
632     printf("==========build model return code:%d\n", ret);
633     ASSERT_EQ(ret, OH_AI_STATUS_LITE_ERROR);
634     delete[] graphBuf;
635     OH_AI_ModelDestroy(&model);
636 }
637 
638 // 异常场景:ModelBuild,读取路径方法,且路径不是模型数据路径
639 HWTEST(MSLiteTest, OHOS_Model_Build_0005, Function | MediumTest | Level1) {
640     printf("==========Init Context==========\n");
641     OH_AI_ContextHandle context = OH_AI_ContextCreate();
642     ASSERT_NE(context, nullptr);
643     AddContextDeviceCPU(context);
644     printf("==========Create model==========\n");
645     OH_AI_ModelHandle model = OH_AI_ModelCreate();
646     ASSERT_NE(model, nullptr);
647     printf("==========Build model==========\n");
648     OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface.input", OH_AI_MODELTYPE_MINDIR, context);
649     printf("==========build model return code:%d\n", ret);
650     ASSERT_EQ(ret, OH_AI_STATUS_LITE_ERROR);
651     OH_AI_ModelDestroy(&model);
652 }
653 
654 // 异常场景:ModelBuild,读取路径方法,路径为空
655 HWTEST(MSLiteTest, OHOS_Model_Build_0006, Function | MediumTest | Level1) {
656     printf("==========Init Context==========\n");
657     OH_AI_ContextHandle context = OH_AI_ContextCreate();
658     ASSERT_NE(context, nullptr);
659     AddContextDeviceCPU(context);
660     printf("==========Create model==========\n");
661     OH_AI_ModelHandle model = OH_AI_ModelCreate();
662     ASSERT_NE(model, nullptr);
663     printf("==========Build model==========\n");
664     OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "", OH_AI_MODELTYPE_MINDIR, context);
665     printf("==========build model return code:%d\n", ret);
666     ASSERT_EQ(ret, OH_AI_STATUS_LITE_ERROR);
667     OH_AI_ModelDestroy(&model);
668 }
669 
670 // 异常场景:ModelBuild,model_type不支持
671 HWTEST(MSLiteTest, OHOS_Model_Build_0007, Function | MediumTest | Level1) {
672     printf("==========Init Context==========\n");
673     OH_AI_ContextHandle context = OH_AI_ContextCreate();
674     ASSERT_NE(context, nullptr);
675     AddContextDeviceCPU(context);
676     printf("==========Create model==========\n");
677     OH_AI_ModelHandle model = OH_AI_ModelCreate();
678     ASSERT_NE(model, nullptr);
679     printf("==========Build model==========\n");
680     OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface.ms", OH_AI_MODELTYPE_INVALID, context);
681     printf("==========build model return code:%d\n", ret);
682     ASSERT_EQ(ret, OH_AI_STATUS_LITE_PARAM_INVALID);
683     OH_AI_ModelDestroy(&model);
684 }
685 
686 // 异常场景:ModelBuild,model_context为空
687 HWTEST(MSLiteTest, OHOS_Model_Build_0008, Function | MediumTest | Level1) {
688     printf("==========Init Context==========\n");
689     OH_AI_ContextHandle context = OH_AI_ContextCreate();
690     ASSERT_NE(context, nullptr);
691     AddContextDeviceCPU(context);
692     printf("==========Create model==========\n");
693     OH_AI_ModelHandle model = OH_AI_ModelCreate();
694     ASSERT_NE(model, nullptr);
695     printf("==========Build model==========\n");
696     OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface.ms", OH_AI_MODELTYPE_MINDIR, nullptr);
697     printf("==========build model return code:%d\n", ret);
698     ASSERT_EQ(ret, OH_AI_STATUS_LITE_NULLPTR);
699     OH_AI_ModelDestroy(&model);
700 }
701 
702 // 正常场景:ModelBuild,调用GetOutputs获取输出
703 HWTEST(MSLiteTest, OHOS_Model_Build_0009, Function | MediumTest | Level1) {
704     printf("==========Init Context==========\n");
705     OH_AI_ContextHandle context = OH_AI_ContextCreate();
706     ASSERT_NE(context, nullptr);
707     AddContextDeviceCPU(context);
708     printf("==========Create model==========\n");
709     OH_AI_ModelHandle model = OH_AI_ModelCreate();
710     ASSERT_NE(model, nullptr);
711     printf("==========Model build==========\n");
712     OH_AI_ModelBuildFromFile(model,"/data/test/ml_face_isface.ms", OH_AI_MODELTYPE_MINDIR, context);
713     printf("==========Model Predict==========\n");
714     OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
715     OH_AI_TensorHandleArray output;
716     FillInputsData(inputs,"ml_face_isface",false);
717     OH_AI_Status ret = OH_AI_ModelPredict(model, inputs, &output, nullptr, nullptr);
718     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
719     printf("==========GetOutput==========\n");
720     OH_AI_TensorHandleArray outputs = OH_AI_ModelGetOutputs(model);
721     for (size_t i = 0; i < outputs.handle_num; ++i) {
722         OH_AI_TensorHandle tensor = outputs.handle_list[i];
723         int64_t element_num = OH_AI_TensorGetElementNum(tensor);
724         printf("Tensor name: %s, elements num: %" PRId64 ".\n", OH_AI_TensorGetName(tensor), element_num);
725         float *output_data = reinterpret_cast<float *>(OH_AI_TensorGetMutableData(tensor));
726         printf("output data is:");
727         for (int j = 0; j < element_num && j <= 20; ++j) {
728             printf("%f ", output_data[j]);
729         }
730         printf("\n");
731         printf("==========compFp32WithTData==========\n");
732         string expectedDataFile = "/data/test/ml_face_isface" + std::to_string(i) + ".output";
733         bool result = compFp32WithTData(output_data, expectedDataFile, 0.01, 0.01, false);
734         EXPECT_EQ(result, true);
735     }
736 }
737 
738 // 正常场景:ModelResize,shape与之前一致
739 HWTEST(MSLiteTest, OHOS_Model_Resize_0001, Function | MediumTest | Level1) {
740     printf("==========Init Context==========\n");
741     OH_AI_ContextHandle context = OH_AI_ContextCreate();
742     ASSERT_NE(context, nullptr);
743     AddContextDeviceCPU(context);
744     printf("==========Create model==========\n");
745     OH_AI_ModelHandle model = OH_AI_ModelCreate();
746     ASSERT_NE(model, nullptr);
747     ModelPredict(model, context, "ml_ocr_cn", {4, {1, 32, 512, 1}}, false, true, false);
748 }
749 
750 // 正常场景:ModelResize,shape与之前不一致
751 HWTEST(MSLiteTest, OHOS_Model_Resize_0002, Function | MediumTest | Level1) {
752     printf("==========Init Context==========\n");
753     OH_AI_ContextHandle context = OH_AI_ContextCreate();
754     ASSERT_NE(context, nullptr);
755     AddContextDeviceCPU(context);
756     printf("==========Create model==========\n");
757     OH_AI_ModelHandle model = OH_AI_ModelCreate();
758     ASSERT_NE(model, nullptr);
759     printf("==========Build model==========\n");
760     OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_ocr_cn.ms", OH_AI_MODELTYPE_MINDIR, context);
761     printf("==========build model return code:%d\n", ret);
762     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
763     printf("==========GetInputs==========\n");
764     OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
765     ASSERT_NE(inputs.handle_list, nullptr);
766     printf("==========Resizes==========\n");
767     OH_AI_ShapeInfo shape_infos = {4, {1, 64, 256, 1}};
768     OH_AI_Status resize_ret = OH_AI_ModelResize(model, inputs, &shape_infos, inputs.handle_num);
769     printf("==========Resizes return code:%d\n", resize_ret);
770     ASSERT_EQ(resize_ret, OH_AI_STATUS_SUCCESS);
771     FillInputsData(inputs, "ml_ocr_cn", false);
772     OH_AI_TensorHandleArray outputs;
773     printf("==========Model Predict==========\n");
774     OH_AI_Status predict_ret = OH_AI_ModelPredict(model, inputs, &outputs, nullptr, nullptr);
775     ASSERT_EQ(predict_ret, OH_AI_STATUS_SUCCESS);
776 }
777 
778 // 异常场景:ModelResize,shape为三维
779 HWTEST(MSLiteTest, OHOS_Model_Resize_0003, Function | MediumTest | Level1) {
780     printf("==========Init Context==========\n");
781     OH_AI_ContextHandle context = OH_AI_ContextCreate();
782     ASSERT_NE(context, nullptr);
783     AddContextDeviceCPU(context);
784     printf("==========Create model==========\n");
785     OH_AI_ModelHandle model = OH_AI_ModelCreate();
786     ASSERT_NE(model, nullptr);
787     printf("==========Build model==========\n");
788     OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_ocr_cn.ms", OH_AI_MODELTYPE_MINDIR, context);
789     printf("==========build model return code:%d\n", ret);
790     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
791     printf("==========GetInputs==========\n");
792     OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
793     ASSERT_NE(inputs.handle_list, nullptr);
794     printf("==========Resizes==========\n");
795     OH_AI_ShapeInfo shape_infos = {4, {1, 32, 1}};
796     ret = OH_AI_ModelResize(model, inputs, &shape_infos, inputs.handle_num);
797     printf("==========Resizes return code:%d\n", ret);
798     ASSERT_EQ(ret, OH_AI_STATUS_LITE_ERROR);
799     OH_AI_ModelDestroy(&model);
800 }
801 
802 // 异常场景:ModelResize,shape值有负数
803 HWTEST(MSLiteTest, OHOS_Model_Resize_0004, Function | MediumTest | Level1) {
804     printf("==========Init Context==========\n");
805     OH_AI_ContextHandle context = OH_AI_ContextCreate();
806     ASSERT_NE(context, nullptr);
807     AddContextDeviceCPU(context);
808     printf("==========Create model==========\n");
809     OH_AI_ModelHandle model = OH_AI_ModelCreate();
810     ASSERT_NE(model, nullptr);
811     printf("==========Build model==========\n");
812     OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_ocr_cn.ms", OH_AI_MODELTYPE_MINDIR, context);
813     printf("==========build model return code:%d\n", ret);
814     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
815     printf("==========GetInputs==========\n");
816     OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
817     ASSERT_NE(inputs.handle_list, nullptr);
818     printf("==========Resizes==========\n");
819     OH_AI_ShapeInfo shape_infos = {4, {1, -32, 32, 1}};
820     ret = OH_AI_ModelResize(model, inputs, &shape_infos, inputs.handle_num);
821     printf("==========Resizes return code:%d\n", ret);
822     ASSERT_EQ(ret, OH_AI_STATUS_LITE_ERROR);
823     OH_AI_ModelDestroy(&model);
824 }
825 
826 // 异常场景:ModelResize,不支持resize的模型
827 HWTEST(MSLiteTest, OHOS_Model_Resize_0005, Function | MediumTest | Level1) {
828     printf("==========Init Context==========\n");
829     OH_AI_ContextHandle context = OH_AI_ContextCreate();
830     ASSERT_NE(context, nullptr);
831     AddContextDeviceCPU(context);
832     printf("==========Create model==========\n");
833     OH_AI_ModelHandle model = OH_AI_ModelCreate();
834     ASSERT_NE(model, nullptr);
835     printf("==========Build model==========\n");
836     OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface.ms", OH_AI_MODELTYPE_MINDIR, context);
837     printf("==========build model return code:%d\n", ret);
838     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
839     printf("==========GetInputs==========\n");
840     OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
841     ASSERT_NE(inputs.handle_list, nullptr);
842     printf("==========Resizes==========\n");
843     OH_AI_ShapeInfo shape_infos = {4, {1, 96, 96, 1}};
844     ret = OH_AI_ModelResize(model, inputs, &shape_infos, inputs.handle_num);
845     printf("==========Resizes return code:%d\n", ret);
846     ASSERT_EQ(ret, OH_AI_STATUS_LITE_ERROR);
847     OH_AI_ModelDestroy(&model);
848 }
849 
850 // 正常场景:ModelPredict
851 HWTEST(MSLiteTest, OHOS_Model_Predict_0001, Function | MediumTest | Level1) {
852     printf("==========Init Context==========\n");
853     OH_AI_ContextHandle context = OH_AI_ContextCreate();
854     ASSERT_NE(context, nullptr);
855     AddContextDeviceCPU(context);
856     printf("==========Create model==========\n");
857     OH_AI_ModelHandle model = OH_AI_ModelCreate();
858     ASSERT_NE(model, nullptr);
859     ModelPredict(model, context, "ml_face_isface", {}, false, true, false);
860 }
861 
862 // 异常场景:ModelPredict,model被销毁
863 HWTEST(MSLiteTest, OHOS_Model_Predict_0002, Function | MediumTest | Level1) {
864     printf("==========Init Context==========\n");
865     OH_AI_ContextHandle context = OH_AI_ContextCreate();
866     ASSERT_NE(context, nullptr);
867     AddContextDeviceCPU(context);
868     printf("==========Create model==========\n");
869     OH_AI_ModelHandle model = OH_AI_ModelCreate();
870     ASSERT_NE(model, nullptr);
871     printf("==========Build model==========\n");
872     OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface.ms", OH_AI_MODELTYPE_MINDIR, context);
873     printf("==========build model return code:%d\n", ret);
874     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
875     printf("==========GetInputs==========\n");
876     OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
877     ASSERT_NE(inputs.handle_list, nullptr);
878     FillInputsData(inputs, "ml_face_isface", true);
879     printf("==========Model Predict==========\n");
880     OH_AI_TensorHandleArray outputs;
881     OH_AI_ModelDestroy(&model);
882     ret = OH_AI_ModelPredict(model, inputs, &outputs, nullptr, nullptr);
883     printf("==========Model Predict return code:%d\n", ret);
884     ASSERT_EQ(ret, OH_AI_STATUS_LITE_NULLPTR);
885 }
886 
887 // 异常场景:ModelPredict,input为空
888 HWTEST(MSLiteTest, OHOS_Model_Predict_0003, Function | MediumTest | Level1) {
889     printf("==========Init Context==========\n");
890     OH_AI_ContextHandle context = OH_AI_ContextCreate();
891     ASSERT_NE(context, nullptr);
892     AddContextDeviceCPU(context);
893     printf("==========Create model==========\n");
894     OH_AI_ModelHandle model = OH_AI_ModelCreate();
895     ASSERT_NE(model, nullptr);
896     printf("==========Build model==========\n");
897     OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface.ms", OH_AI_MODELTYPE_MINDIR, context);
898     printf("==========build model return code:%d\n", ret);
899     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
900     printf("==========Model Predict==========\n");
901     OH_AI_TensorHandleArray inputs;
902     OH_AI_TensorHandleArray outputs;
903     ret = OH_AI_ModelPredict(model, inputs, &outputs, nullptr, nullptr);
904     printf("==========Model Predict return code:%d\n", ret);
905     ASSERT_EQ(ret, OH_AI_STATUS_LITE_ERROR);
906     OH_AI_ModelDestroy(&model);
907 }
908 
909 // 正常场景:ModelPredict,传入回调函数
910 HWTEST(MSLiteTest, OHOS_Model_Predict_0004, Function | MediumTest | Level1) {
911     printf("==========Init Context==========\n");
912     OH_AI_ContextHandle context = OH_AI_ContextCreate();
913     ASSERT_NE(context, nullptr);
914     AddContextDeviceCPU(context);
915     printf("==========Create model==========\n");
916     OH_AI_ModelHandle model = OH_AI_ModelCreate();
917     ASSERT_NE(model, nullptr);
918     ModelPredict(model, context, "ml_face_isface", {}, false, true, true);
919 }
920 
921 // 正常场景:ModelGetInputByTensorName
922 HWTEST(MSLiteTest, OHOS_Model_GetInputByTensorName_0001, Function | MediumTest | Level1) {
923     printf("==========ReadFile==========\n");
924     size_t size1;
925     size_t *ptr_size1 = &size1;
926     const char *imagePath = "/data/test/ml_face_isface.input";
927     char *imageBuf = ReadFile(imagePath, ptr_size1);
928     ASSERT_NE(imageBuf, nullptr);
929     printf("==========Init Context==========\n");
930     OH_AI_ContextHandle context = OH_AI_ContextCreate();
931     ASSERT_NE(context, nullptr);
932     AddContextDeviceCPU(context);
933     printf("==========Create model==========\n");
934     OH_AI_ModelHandle model = OH_AI_ModelCreate();
935     ASSERT_NE(model, nullptr);
936     printf("==========Build model==========\n");
937     OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface.ms", OH_AI_MODELTYPE_MINDIR, context);
938     printf("==========build model return code:%d\n", ret);
939     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
940     printf("==========GetInputs==========\n");
941     OH_AI_TensorHandle tensor = OH_AI_ModelGetInputByTensorName(model, "data");
942     ASSERT_NE(tensor, nullptr);
943     int64_t element_num = OH_AI_TensorGetElementNum(tensor);
944     printf("Tensor name: %s, elements num: %" PRId64 ".\n", OH_AI_TensorGetName(tensor), element_num);
945     float *input_data = reinterpret_cast<float *>(OH_AI_TensorGetMutableData(tensor));
946     ASSERT_NE(input_data, nullptr);
947     printf("==========Transpose==========\n");
948     size_t shape_num;
949     const int64_t *shape = OH_AI_TensorGetShape(tensor, &shape_num);
950     auto imageBuf_nhwc = new char[size1];
951     PackNCHWToNHWCFp32(imageBuf, imageBuf_nhwc, shape[0], shape[1] * shape[2], shape[3]);
952     memcpy_s(input_data, size1, imageBuf_nhwc, size1);
953     printf("input data is:");
954     for (int j = 0; j < element_num && j <= 20; ++j) {
955         printf("%f ", input_data[j]);
956     }
957     printf("\n");
958     printf("==========Model Predict==========\n");
959     OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
960     ASSERT_NE(inputs.handle_list, nullptr);
961     OH_AI_TensorHandleArray outputs;
962     ret = OH_AI_ModelPredict(model, inputs, &outputs, nullptr, nullptr);
963     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
964     CompareResult(outputs, "ml_face_isface");
965     delete[] imageBuf;
966     OH_AI_ModelDestroy(&model);
967 }
968 
969 // 异常场景:ModelGetInputByTensorName,名称不存在
970 HWTEST(MSLiteTest, OHOS_Model_GetInputByTensorName_0002, Function | MediumTest | Level1) {
971     printf("==========Init Context==========\n");
972     OH_AI_ContextHandle context = OH_AI_ContextCreate();
973     ASSERT_NE(context, nullptr);
974     AddContextDeviceCPU(context);
975     printf("==========Create model==========\n");
976     OH_AI_ModelHandle model = OH_AI_ModelCreate();
977     ASSERT_NE(model, nullptr);
978     printf("==========Build model==========\n");
979     OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface.ms", OH_AI_MODELTYPE_MINDIR, context);
980     printf("==========build model return code:%d\n", ret);
981     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
982     printf("==========GetInputs==========\n");
983     OH_AI_TensorHandle tensor = OH_AI_ModelGetInputByTensorName(model, "aaa");
984     ASSERT_EQ(tensor, nullptr);
985     OH_AI_ModelDestroy(&model);
986 }
987 
988 // 正常场景:ModelGetOutputByTensorName
989 HWTEST(MSLiteTest, OHOS_Model_GetOutputByTensorName_0001, Function | MediumTest | Level1) {
990     printf("==========Init Context==========\n");
991     OH_AI_ContextHandle context = OH_AI_ContextCreate();
992     ASSERT_NE(context, nullptr);
993     AddContextDeviceCPU(context);
994     printf("==========Create model==========\n");
995     OH_AI_ModelHandle model = OH_AI_ModelCreate();
996     ASSERT_NE(model, nullptr);
997     printf("==========Build model==========\n");
998     OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface.ms", OH_AI_MODELTYPE_MINDIR, context);
999     printf("==========build model return code:%d\n", ret);
1000     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1001     printf("==========GetInputs==========\n");
1002     OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
1003     ASSERT_NE(inputs.handle_list, nullptr);
1004     FillInputsData(inputs, "ml_face_isface", true);
1005     printf("==========Model Predict==========\n");
1006     OH_AI_TensorHandleArray outputs;
1007     ret = OH_AI_ModelPredict(model, inputs, &outputs, nullptr, nullptr);
1008     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1009     printf("==========GetOutput==========\n");
1010     OH_AI_TensorHandle tensor = OH_AI_ModelGetOutputByTensorName(model, "prob");
1011     ASSERT_NE(tensor, nullptr);
1012     int64_t element_num = OH_AI_TensorGetElementNum(tensor);
1013     printf("Tensor name: %s, elements num: %" PRId64 ".\n", OH_AI_TensorGetName(tensor), element_num);
1014     float *output_data = reinterpret_cast<float *>(OH_AI_TensorGetMutableData(tensor));
1015     printf("output data is:");
1016     for (int j = 0; j < element_num && j <= 20; ++j) {
1017         printf("%f ", output_data[j]);
1018     }
1019     printf("\n");
1020     printf("==========compFp32WithTData==========\n");
1021     bool result = compFp32WithTData(output_data, "/data/test/ml_face_isface0.output", 0.01, 0.01, false);
1022     EXPECT_EQ(result, true);
1023     OH_AI_ModelDestroy(&model);
1024 }
1025 
1026 // 异常场景:ModelGetOutputByTensorName,名称不存在
1027 HWTEST(MSLiteTest, OHOS_Model_GetOutputByTensorName_0002, Function | MediumTest | Level1) {
1028     printf("==========Init Context==========\n");
1029     OH_AI_ContextHandle context = OH_AI_ContextCreate();
1030     ASSERT_NE(context, nullptr);
1031     AddContextDeviceCPU(context);
1032     printf("==========Create model==========\n");
1033     OH_AI_ModelHandle model = OH_AI_ModelCreate();
1034     ASSERT_NE(model, nullptr);
1035     printf("==========Build model==========\n");
1036     OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface.ms", OH_AI_MODELTYPE_MINDIR, context);
1037     printf("==========build model return code:%d\n", ret);
1038     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1039     printf("==========GetInputs==========\n");
1040     OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
1041     ASSERT_NE(inputs.handle_list, nullptr);
1042     FillInputsData(inputs, "ml_face_isface", true);
1043     printf("==========Model Predict==========\n");
1044     OH_AI_TensorHandleArray outputs;
1045     ret = OH_AI_ModelPredict(model, inputs, &outputs, nullptr, nullptr);
1046     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1047     printf("==========GetOutput==========\n");
1048     OH_AI_TensorHandle tensor = OH_AI_ModelGetOutputByTensorName(model, "aaa");
1049     ASSERT_EQ(tensor, nullptr);
1050     OH_AI_ModelDestroy(&model);
1051 }
1052 
1053 // 正常场景:MSTensorCreate,创建tensor
1054 HWTEST(MSLiteTest, OHOS_Tensor_Create_0001, Function | MediumTest | Level1) {
1055     printf("==========Init Context==========\n");
1056     OH_AI_ContextHandle context = OH_AI_ContextCreate();
1057     ASSERT_NE(context, nullptr);
1058     AddContextDeviceCPU(context);
1059     printf("==========Create model==========\n");
1060     OH_AI_ModelHandle model = OH_AI_ModelCreate();
1061     ASSERT_NE(model, nullptr);
1062     printf("==========Build model==========\n");
1063     OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface.ms", OH_AI_MODELTYPE_MINDIR, context);
1064     printf("==========build model return code:%d\n", ret);
1065     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1066     printf("==========GetInputs==========\n");
1067     constexpr size_t create_shape_num = 4;
1068     int64_t create_shape[create_shape_num] = {1, 48, 48, 3};
1069     OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, create_shape,
1070                             create_shape_num, nullptr, 0);
1071     ASSERT_NE(tensor, nullptr);
1072     OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
1073     inputs.handle_list[0] = tensor;
1074     FillInputsData(inputs, "ml_face_isface", true);
1075     printf("==========Model Predict==========\n");
1076     OH_AI_TensorHandleArray outputs;
1077     ret = OH_AI_ModelPredict(model, inputs, &outputs, nullptr, nullptr);
1078     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1079     CompareResult(outputs, "ml_face_isface");
1080     OH_AI_ModelDestroy(&model);
1081 }
1082 
1083 // 正常场景:MSTensorDestroy,销毁tensor
1084 HWTEST(MSLiteTest, OHOS_Tensor_Create_0002, Function | MediumTest | Level1) {
1085     printf("==========ReadFile==========\n");
1086     size_t size1;
1087     size_t *ptr_size1 = &size1;
1088     const char *imagePath = "/data/test/ml_face_isface.input";
1089     char *imageBuf = ReadFile(imagePath, ptr_size1);
1090     ASSERT_NE(imageBuf, nullptr);
1091     printf("==========OH_AI_TensorCreate==========\n");
1092     constexpr size_t create_shape_num = 4;
1093     int64_t create_shape[create_shape_num] = {1, 48, 48, 3};
1094     OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, create_shape,
1095                                            create_shape_num, imageBuf, size1);
1096     ASSERT_NE(tensor, nullptr);
1097     delete[] imageBuf;
1098     OH_AI_TensorDestroy(&tensor);
1099     ASSERT_EQ(tensor, nullptr);
1100 }
1101 
1102 // 正常场景:MSTensorGetName,获取tensor名称
1103 HWTEST(MSLiteTest, OHOS_Tensor_Create_0003, Function | MediumTest | Level1) {
1104     printf("==========ReadFile==========\n");
1105     size_t size1;
1106     size_t *ptr_size1 = &size1;
1107     const char *imagePath = "/data/test/ml_face_isface.input";
1108     char *imageBuf = ReadFile(imagePath, ptr_size1);
1109     ASSERT_NE(imageBuf, nullptr);
1110     printf("==========OH_AI_TensorCreate==========\n");
1111     constexpr size_t create_shape_num = 4;
1112     int64_t create_shape[create_shape_num] = {1, 48, 48, 3};
1113     OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, create_shape,
1114                                             create_shape_num, imageBuf, size1);
1115     ASSERT_NE(tensor, nullptr);
1116     const char *tensor_name = OH_AI_TensorGetName(tensor);
1117     ASSERT_EQ(strcmp(tensor_name, "data"), 0);
1118     delete[] imageBuf;
1119     OH_AI_TensorDestroy(&tensor);
1120 }
1121 
1122 // 正常场景:MSTensorGetName,设置tensor名称
1123 HWTEST(MSLiteTest, OHOS_Tensor_Create_0004, Function | MediumTest | Level1) {
1124     printf("==========ReadFile==========\n");
1125     size_t size1;
1126     size_t *ptr_size1 = &size1;
1127     const char *imagePath = "/data/test/ml_face_isface.input";
1128     char *imageBuf = ReadFile(imagePath, ptr_size1);
1129     ASSERT_NE(imageBuf, nullptr);
1130     printf("==========OH_AI_TensorCreate==========\n");
1131     constexpr size_t create_shape_num = 4;
1132     int64_t create_shape[create_shape_num] = {1, 48, 48, 3};
1133     OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, create_shape,
1134                                            create_shape_num, imageBuf, size1);
1135     ASSERT_NE(tensor, nullptr);
1136     OH_AI_TensorSetName(tensor, "new_data");
1137     const char *tensor_name = OH_AI_TensorGetName(tensor);
1138     ASSERT_EQ(strcmp(tensor_name, "new_data"), 0);
1139     delete[] imageBuf;
1140     OH_AI_TensorDestroy(&tensor);
1141 }
1142 
1143 // 正常场景:MSTensorGetDataType,获取tensor数据类型
1144 HWTEST(MSLiteTest, OHOS_Tensor_Create_0005, Function | MediumTest | Level1) {
1145     printf("==========ReadFile==========\n");
1146     size_t size1;
1147     size_t *ptr_size1 = &size1;
1148     const char *imagePath = "/data/test/ml_face_isface.input";
1149     char *imageBuf = ReadFile(imagePath, ptr_size1);
1150     ASSERT_NE(imageBuf, nullptr);
1151     printf("==========OH_AI_TensorCreate==========\n");
1152     constexpr size_t create_shape_num = 4;
1153     int64_t create_shape[create_shape_num] = {1, 48, 48, 3};
1154     OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, create_shape,
1155                                            create_shape_num, imageBuf, size1);
1156     ASSERT_NE(tensor, nullptr);
1157     OH_AI_DataType data_type = OH_AI_TensorGetDataType(tensor);
1158     ASSERT_EQ(data_type, OH_AI_DATATYPE_NUMBERTYPE_FLOAT32);
1159     delete[] imageBuf;
1160     OH_AI_TensorDestroy(&tensor);
1161 }
1162 
1163 // 正常场景:MSTensorSetDataType,设置tensor数据类型
1164 HWTEST(MSLiteTest, OHOS_Tensor_Create_0006, Function | MediumTest | Level1) {
1165     printf("==========ReadFile==========\n");
1166     size_t size1;
1167     size_t *ptr_size1 = &size1;
1168     const char *imagePath = "/data/test/ml_face_isface.input";
1169     char *imageBuf = ReadFile(imagePath, ptr_size1);
1170     ASSERT_NE(imageBuf, nullptr);
1171     printf("==========OH_AI_TensorCreate==========\n");
1172     constexpr size_t create_shape_num = 4;
1173     int64_t create_shape[create_shape_num] = {1, 48, 48, 3};
1174     OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, create_shape,
1175                                            create_shape_num, imageBuf, size1);
1176     ASSERT_NE(tensor, nullptr);
1177     OH_AI_TensorSetDataType(tensor, OH_AI_DATATYPE_NUMBERTYPE_FLOAT16);
1178     OH_AI_DataType data_type = OH_AI_TensorGetDataType(tensor);
1179     ASSERT_EQ(data_type, OH_AI_DATATYPE_NUMBERTYPE_FLOAT16);
1180     delete[] imageBuf;
1181     OH_AI_TensorDestroy(&tensor);
1182 }
1183 
1184 // 正常场景:MSTensorGetShape,获取tensor维度
1185 HWTEST(MSLiteTest, OHOS_Tensor_Create_0007, Function | MediumTest | Level1) {
1186     printf("==========ReadFile==========\n");
1187     size_t size1;
1188     size_t *ptr_size1 = &size1;
1189     const char *imagePath = "/data/test/ml_face_isface.input";
1190     char *imageBuf = ReadFile(imagePath, ptr_size1);
1191     ASSERT_NE(imageBuf, nullptr);
1192     printf("==========OH_AI_TensorCreate==========\n");
1193     constexpr size_t create_shape_num = 4;
1194     int64_t create_shape[create_shape_num] = {1, 48, 48, 3};
1195     OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, create_shape,
1196                                             create_shape_num, imageBuf, size1);
1197     ASSERT_NE(tensor, nullptr);
1198     size_t ret_shape_num;
1199     const int64_t *ret_shape = OH_AI_TensorGetShape(tensor, &ret_shape_num);
1200     ASSERT_EQ(ret_shape_num, create_shape_num);
1201     for (size_t i = 0; i < ret_shape_num; i++) {
1202         ASSERT_EQ(ret_shape[i], create_shape[i]);
1203     }
1204     delete[] imageBuf;
1205     OH_AI_TensorDestroy(&tensor);
1206 }
1207 
1208 // 正常场景:MSTensorSetShape,设置tensor维度
1209 HWTEST(MSLiteTest, OHOS_Tensor_Create_0008, Function | MediumTest | Level1) {
1210     printf("==========ReadFile==========\n");
1211     size_t size1;
1212     size_t *ptr_size1 = &size1;
1213     const char *imagePath = "/data/test/ml_face_isface.input";
1214     char *imageBuf = ReadFile(imagePath, ptr_size1);
1215     ASSERT_NE(imageBuf, nullptr);
1216     printf("==========OH_AI_TensorCreate==========\n");
1217     constexpr size_t create_shape_num = 4;
1218     int64_t create_shape[create_shape_num] = {1, 48, 48, 3};
1219     OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, create_shape,
1220                                            create_shape_num, imageBuf, size1);
1221     ASSERT_NE(tensor, nullptr);
1222     size_t ret_shape_num;
1223     const int64_t *ret_shape = OH_AI_TensorGetShape(tensor, &ret_shape_num);
1224     ASSERT_EQ(ret_shape_num, create_shape_num);
1225     for (size_t i = 0; i < ret_shape_num; i++) {
1226         ASSERT_EQ(ret_shape[i], create_shape[i]);
1227     }
1228     constexpr size_t new_shape_num = 4;
1229     int64_t new_shape[new_shape_num] = {1, 32, 32, 1};
1230     OH_AI_TensorSetShape(tensor, new_shape, new_shape_num);
1231     size_t new_ret_shape_num;
1232     const int64_t *new_ret_shape = OH_AI_TensorGetShape(tensor, &new_ret_shape_num);
1233     ASSERT_EQ(new_ret_shape_num, new_shape_num);
1234     for (size_t i = 0; i < new_ret_shape_num; i++) {
1235         ASSERT_EQ(new_ret_shape[i], new_shape[i]);
1236     }
1237     delete[] imageBuf;
1238     OH_AI_TensorDestroy(&tensor);
1239 }
1240 
1241 // 正常场景:MSTensorGetFormat,获取tensor格式
1242 HWTEST(MSLiteTest, OHOS_Tensor_Create_0009, Function | MediumTest | Level1) {
1243     printf("==========ReadFile==========\n");
1244     size_t size1;
1245     size_t *ptr_size1 = &size1;
1246     const char *imagePath = "/data/test/ml_face_isface.input";
1247     char *imageBuf = ReadFile(imagePath, ptr_size1);
1248     ASSERT_NE(imageBuf, nullptr);
1249     printf("==========OH_AI_TensorCreate==========\n");
1250     constexpr size_t create_shape_num = 4;
1251     int64_t create_shape[create_shape_num] = {1, 48, 48, 3};
1252     OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, create_shape,
1253                                            create_shape_num, imageBuf, size1);
1254     ASSERT_NE(tensor, nullptr);
1255     OH_AI_Format data_format = OH_AI_TensorGetFormat(tensor);
1256     ASSERT_EQ(data_format, OH_AI_FORMAT_NCHW);
1257     delete[] imageBuf;
1258     OH_AI_TensorDestroy(&tensor);
1259 }
1260 
1261 // 正常场景:MSTensorSetFormat,设置tensor格式
1262 HWTEST(MSLiteTest, OHOS_Tensor_Create_0010, Function | MediumTest | Level1) {
1263     printf("==========ReadFile==========\n");
1264     size_t size1;
1265     size_t *ptr_size1 = &size1;
1266     const char *imagePath = "/data/test/ml_face_isface.input";
1267     char *imageBuf = ReadFile(imagePath, ptr_size1);
1268     ASSERT_NE(imageBuf, nullptr);
1269     printf("==========OH_AI_TensorCreate==========\n");
1270     constexpr size_t create_shape_num = 4;
1271     int64_t create_shape[create_shape_num] = {1, 48, 48, 3};
1272     OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, create_shape,
1273                                            create_shape_num, imageBuf, size1);
1274     ASSERT_NE(tensor, nullptr);
1275     OH_AI_TensorSetFormat(tensor, OH_AI_FORMAT_NHWC);
1276     OH_AI_Format data_format = OH_AI_TensorGetFormat(tensor);
1277     ASSERT_EQ(data_format, OH_AI_FORMAT_NHWC);
1278     delete[] imageBuf;
1279     OH_AI_TensorDestroy(&tensor);
1280 }
1281 
1282 // 正常场景:MSTensorGetData,获取tensor数据
1283 HWTEST(MSLiteTest, OHOS_Tensor_Create_0011, Function | MediumTest | Level1) {
1284     printf("==========ReadFile==========\n");
1285     size_t size1;
1286     size_t *ptr_size1 = &size1;
1287     const char *imagePath = "/data/test/ml_face_isface.input";
1288     char *imageBuf = ReadFile(imagePath, ptr_size1);
1289     ASSERT_NE(imageBuf, nullptr);
1290     printf("==========OH_AI_TensorCreate==========\n");
1291     constexpr size_t create_shape_num = 4;
1292     int64_t create_shape[create_shape_num] = {1, 48, 48, 3};
1293     OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, create_shape,
1294                                            create_shape_num, imageBuf, size1);
1295     ASSERT_NE(tensor, nullptr);
1296     const float *ret_data = static_cast<const float *>(OH_AI_TensorGetData(tensor));
1297     ASSERT_NE(ret_data, nullptr);
1298     printf("return data is:");
1299     for (int i = 0; i < 20; ++i) {
1300         printf("%f ", ret_data[i]);
1301     }
1302     printf("\n");
1303     delete[] imageBuf;
1304     OH_AI_TensorDestroy(&tensor);
1305 }
1306 
1307 // 正常场景:MSTensorSetData,设置tensor数据
1308 HWTEST(MSLiteTest, OHOS_Tensor_Create_0012, Function | MediumTest | Level1) {
1309     printf("==========ReadFile==========\n");
1310     size_t size1;
1311     size_t *ptr_size1 = &size1;
1312     const char *imagePath = "/data/test/ml_face_isface.input";
1313     char *imageBuf = ReadFile(imagePath, ptr_size1);
1314     ASSERT_NE(imageBuf, nullptr);
1315     printf("==========OH_AI_TensorCreate==========\n");
1316     constexpr size_t create_shape_num = 4;
1317     int64_t create_shape[create_shape_num] = {1, 48, 48, 3};
1318     OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, create_shape,
1319                                            create_shape_num, imageBuf, size1);
1320     ASSERT_NE(tensor, nullptr);
1321     constexpr size_t data_len = 6;
1322     float data[data_len] = {1, 2, 3, 4, 5, 6};
1323     OH_AI_TensorSetData(tensor, data);
1324     const float *ret_data = static_cast<const float *>(OH_AI_TensorGetData(tensor));
1325     ASSERT_NE(ret_data, nullptr);
1326     printf("return data is:");
1327     for (size_t i = 0; i < data_len; i++) {
1328         ASSERT_EQ(ret_data[i], data[i]);
1329         printf("%f ", ret_data[i]);
1330     }
1331     printf("\n");
1332     delete[] imageBuf;
1333     OH_AI_TensorDestroy(&tensor);
1334 }
1335 
1336 // 正常场景:MSTensorGetElementNum,获取tensor元素
1337 HWTEST(MSLiteTest, OHOS_Tensor_Create_0013, Function | MediumTest | Level1) {
1338     printf("==========ReadFile==========\n");
1339     size_t size1;
1340     size_t *ptr_size1 = &size1;
1341     const char *imagePath = "/data/test/ml_face_isface.input";
1342     char *imageBuf = ReadFile(imagePath, ptr_size1);
1343     ASSERT_NE(imageBuf, nullptr);
1344     printf("==========OH_AI_TensorCreate==========\n");
1345     constexpr size_t create_shape_num = 4;
1346     int64_t create_shape[create_shape_num] = {1, 48, 48, 3};
1347     OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, create_shape,
1348                                            create_shape_num, imageBuf, size1);
1349     ASSERT_NE(tensor, nullptr);
1350     int64_t element_num = OH_AI_TensorGetElementNum(tensor);
1351     printf("Tensor name: %s, elements num: %" PRId64 ".\n", OH_AI_TensorGetName(tensor), element_num);
1352     ASSERT_EQ(element_num, 6912);
1353     delete[] imageBuf;
1354     OH_AI_TensorDestroy(&tensor);
1355 }
1356 
1357 // 正常场景:MSTensorGetDataSize,获取tensor大小
1358 HWTEST(MSLiteTest, OHOS_Tensor_Create_0014, Function | MediumTest | Level1) {
1359     printf("==========ReadFile==========\n");
1360     size_t size1;
1361     size_t *ptr_size1 = &size1;
1362     const char *imagePath = "/data/test/ml_face_isface.input";
1363     char *imageBuf = ReadFile(imagePath, ptr_size1);
1364     ASSERT_NE(imageBuf, nullptr);
1365     printf("==========OH_AI_TensorCreate==========\n");
1366     constexpr size_t create_shape_num = 4;
1367     int64_t create_shape[create_shape_num] = {1, 48, 48, 3};
1368     OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, create_shape,
1369                                            create_shape_num, imageBuf, size1);
1370     ASSERT_NE(tensor, nullptr);
1371     size_t data_size = OH_AI_TensorGetDataSize(tensor);
1372     printf("Tensor data size: %zu.\n", data_size);
1373     ASSERT_EQ(data_size, 6912 * sizeof(float));
1374     delete[] imageBuf;
1375     OH_AI_TensorDestroy(&tensor);
1376 }
1377 
1378 // 正常场景:MSTensorGetMutableData,获取tensor可变数据指针
1379 HWTEST(MSLiteTest, OHOS_Tensor_Create_0015, Function | MediumTest | Level1) {
1380     printf("==========ReadFile==========\n");
1381     size_t size1;
1382     size_t *ptr_size1 = &size1;
1383     const char *imagePath = "/data/test/ml_face_isface.input";
1384     char *imageBuf = ReadFile(imagePath, ptr_size1);
1385     ASSERT_NE(imageBuf, nullptr);
1386     printf("==========OH_AI_TensorCreate==========\n");
1387     constexpr size_t create_shape_num = 4;
1388     int64_t create_shape[create_shape_num] = {1, 48, 48, 3};
1389     OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, create_shape,
1390                                            create_shape_num, imageBuf, size1);
1391     ASSERT_NE(tensor, nullptr);
1392     float *input_data = reinterpret_cast<float *>(OH_AI_TensorGetMutableData(tensor));
1393     ASSERT_NE(input_data, nullptr);
1394     delete[] imageBuf;
1395     OH_AI_TensorDestroy(&tensor);
1396 }
1397 
1398 // 正常场景:MSTensorClone,拷贝tensor
1399 HWTEST(MSLiteTest, OHOS_Tensor_Create_0016, Function | MediumTest | Level1) {
1400     printf("==========ReadFile==========\n");
1401     size_t size1;
1402     size_t *ptr_size1 = &size1;
1403     const char *imagePath = "/data/test/ml_face_isface.input";
1404     char *imageBuf = ReadFile(imagePath, ptr_size1);
1405     ASSERT_NE(imageBuf, nullptr);
1406     printf("==========OH_AI_TensorCreate==========\n");
1407     constexpr size_t create_shape_num = 4;
1408     int64_t create_shape[create_shape_num] = {1, 48, 48, 3};
1409     OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, create_shape,
1410                                            create_shape_num, imageBuf, size1);
1411     ASSERT_NE(tensor, nullptr);
1412     OH_AI_TensorHandle clone = OH_AI_TensorClone(tensor);
1413     ASSERT_NE(clone, nullptr);
1414     ASSERT_EQ(strcmp(OH_AI_TensorGetName(clone), "data_duplicate"), 0);
1415     delete[] imageBuf;
1416     OH_AI_TensorDestroy(&tensor);
1417     OH_AI_TensorDestroy(&clone);
1418 }
1419 
1420 // 正常场景:单输入模型
1421 HWTEST(MSLiteTest, OHOS_Input_0001, Function | MediumTest | Level1) {
1422     printf("==========Init Context==========\n");
1423     OH_AI_ContextHandle context = OH_AI_ContextCreate();
1424     ASSERT_NE(context, nullptr);
1425     AddContextDeviceCPU(context);
1426     printf("==========Create model==========\n");
1427     OH_AI_ModelHandle model = OH_AI_ModelCreate();
1428     ASSERT_NE(model, nullptr);
1429     ModelPredict(model, context, "ml_face_isface", {}, false, true, false);
1430 }
1431 
1432 
1433 // 正常场景:量化模型
1434 HWTEST(MSLiteTest, OHOS_Input_0004, Function | MediumTest | Level1) {
1435     printf("==========Init Context==========\n");
1436     OH_AI_ContextHandle context = OH_AI_ContextCreate();
1437     ASSERT_NE(context, nullptr);
1438     AddContextDeviceCPU(context);
1439     printf("==========Create model==========\n");
1440     OH_AI_ModelHandle model = OH_AI_ModelCreate();
1441     ASSERT_NE(model, nullptr);
1442     ModelPredict(model, context, "ml_face_isface", {}, false, true, false);
1443 }
1444 
1445 // 正常场景:循环多次执行推理流程
1446 HWTEST(MSLiteTest, OHOS_Multiple_0001, Function | MediumTest | Level1) {
1447     for (size_t num = 0; num < 50; ++num) {
1448         Predict_CPU();
1449     }
1450 }
1451 
1452 // 正常场景:Model创建一次,Build一次,Predict多次
1453 HWTEST(MSLiteTest, OHOS_Multiple_0003, Function | MediumTest | Level1) {
1454     printf("==========Init Context==========\n");
1455     OH_AI_ContextHandle context = OH_AI_ContextCreate();
1456     ASSERT_NE(context, nullptr);
1457     AddContextDeviceCPU(context);
1458     printf("==========Create model==========\n");
1459     OH_AI_ModelHandle model = OH_AI_ModelCreate();
1460     ASSERT_NE(model, nullptr);
1461     printf("==========Build model==========\n");
1462     OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface.ms", OH_AI_MODELTYPE_MINDIR, context);
1463     printf("==========build model return code:%d\n", ret);
1464     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1465     printf("==========GetInputs==========\n");
1466     OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
1467     ASSERT_NE(inputs.handle_list, nullptr);
1468     FillInputsData(inputs, "ml_face_isface", true);
1469     OH_AI_TensorHandleArray outputs;
1470     for (size_t i = 0; i < 50; ++i) {
1471         printf("==========Model Predict==========\n");
1472         OH_AI_Status predict_ret = OH_AI_ModelPredict(model, inputs, &outputs, nullptr, nullptr);
1473         ASSERT_EQ(predict_ret, OH_AI_STATUS_SUCCESS);
1474     }
1475     CompareResult(outputs, "ml_face_isface");
1476     OH_AI_ModelDestroy(&model);
1477 }
1478 
1479 // 正常场景:多次创建和销毁Model
1480 HWTEST(MSLiteTest, OHOS_Multiple_0004, Function | MediumTest | Level1) {
1481     for (size_t i = 0; i < 50; ++i) {
1482         printf("==========Init Context==========\n");
1483         OH_AI_ContextHandle context = OH_AI_ContextCreate();
1484         ASSERT_NE(context, nullptr);
1485         AddContextDeviceCPU(context);
1486         printf("==========Create model==========\n");
1487         OH_AI_ModelHandle model = OH_AI_ModelCreate();
1488         ASSERT_NE(model, nullptr);
1489         printf("==========Build model==========\n");
1490         OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface.ms", OH_AI_MODELTYPE_MINDIR, context);
1491         printf("==========build model return code:%d\n", ret);
1492         ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1493         printf("==========Build model==========\n");
1494         OH_AI_ModelDestroy(&model);
1495     }
1496 }
1497 
1498 // 正常场景:两个模型都在CPU上并行推理
1499 HWTEST(MSLiteTest, OHOS_Parallel_0001, Function | MediumTest | Level1) {
1500     std::cout << "run start" << std::endl;
1501     std::thread t1(Predict_CPU);
1502     std::cout << "1111111111111" << std::endl;
1503     std::thread t2(Predict_CPU);
1504     std::cout << "2222222222222" << std::endl;
1505     t1.join();
1506     t2.join();
1507 }
1508 
1509 // 正常场景:r1.3转换的模型在r1.5上推理
1510 HWTEST(MSLiteTest, OHOS_Compatible_0001, Function | MediumTest | Level1) {
1511     printf("==========Init Context==========\n");
1512     OH_AI_ContextHandle context = OH_AI_ContextCreate();
1513     ASSERT_NE(context, nullptr);
1514     AddContextDeviceCPU(context);
1515     printf("==========Create model==========\n");
1516     OH_AI_ModelHandle model = OH_AI_ModelCreate();
1517     ASSERT_NE(model, nullptr);
1518     printf("==========Build model==========\n");
1519     OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface_r13.ms",
1520         OH_AI_MODELTYPE_MINDIR, context);
1521     printf("==========build model return code:%d\n", ret);
1522     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1523     printf("==========GetInputs==========\n");
1524     OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
1525     ASSERT_NE(inputs.handle_list, nullptr);
1526     FillInputsData(inputs, "ml_face_isface", true);
1527     printf("==========Model Predict==========\n");
1528     OH_AI_TensorHandleArray outputs;
1529     ret = OH_AI_ModelPredict(model, inputs, &outputs, nullptr, nullptr);
1530     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1531     CompareResult(outputs, "ml_face_isface");
1532     OH_AI_ModelDestroy(&model);
1533 }