• 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 <random>
18 #include <inttypes.h>
19 #include <securec.h>
20 #include "ohos_common.h"
21 #include "gtest/gtest.h"
22 #include "include/c_api/context_c.h"
23 #include "include/c_api/model_c.h"
24 #include "include/c_api/types_c.h"
25 #include "include/c_api/status_c.h"
26 #include "include/c_api/data_type_c.h"
27 #include "include/c_api/tensor_c.h"
28 #include "include/c_api/format_c.h"
29 
30 using namespace testing::ext;
31 
32 class MSLiteTest: public testing::Test {
33 protected:
SetUpTestCase(void)34   static void SetUpTestCase(void) {}
TearDownTestCase(void)35   static void TearDownTestCase(void) {}
SetUp()36   virtual void SetUp() {}
TearDown()37   virtual void TearDown() {}
38 };
39 
40 // function before callback
PrintBeforeCallback(const OH_AI_TensorHandleArray inputs,const OH_AI_TensorHandleArray outputs,const OH_AI_CallBackParam kernel_Info)41 bool PrintBeforeCallback(const OH_AI_TensorHandleArray inputs, const OH_AI_TensorHandleArray outputs,
42                          const OH_AI_CallBackParam kernel_Info) {
43     std::cout << "Before forwarding " << kernel_Info.node_name << " " << kernel_Info.node_type << std::endl;
44     return true;
45 }
46 
47 // function after callback
PrintAfterCallback(const OH_AI_TensorHandleArray inputs,const OH_AI_TensorHandleArray outputs,const OH_AI_CallBackParam kernel_Info)48 bool PrintAfterCallback(const OH_AI_TensorHandleArray inputs, const OH_AI_TensorHandleArray outputs,
49                         const OH_AI_CallBackParam kernel_Info) {
50     std::cout << "After forwarding " << kernel_Info.node_name << " " << kernel_Info.node_type << std::endl;
51     return true;
52 }
53 
54 // add cpu device info
AddContextDeviceCPU(OH_AI_ContextHandle context)55 void AddContextDeviceCPU(OH_AI_ContextHandle context) {
56     OH_AI_DeviceInfoHandle cpu_device_info = OH_AI_DeviceInfoCreate(OH_AI_DEVICETYPE_CPU);
57     ASSERT_NE(cpu_device_info, nullptr);
58     OH_AI_DeviceType device_type = OH_AI_DeviceInfoGetDeviceType(cpu_device_info);
59     printf("==========device_type:%d\n", device_type);
60     ASSERT_EQ(device_type, OH_AI_DEVICETYPE_CPU);
61     OH_AI_ContextAddDeviceInfo(context, cpu_device_info);
62 }
63 
IsNNRTAvailable()64 bool IsNNRTAvailable() {
65     size_t num = 0;
66     auto desc = OH_AI_GetAllNNRTDeviceDescs(&num);
67     if (desc == nullptr) {
68         return false;
69     }
70     auto type = OH_AI_GetTypeFromNNRTDeviceDesc(desc);
71     if (type != 1) {
72         return false;
73     }
74     OH_AI_DestroyAllNNRTDeviceDescs(&desc);
75     return true;
76 }
77 
IsNPU()78 bool IsNPU() {
79     size_t num = 0;
80     auto desc = OH_AI_GetAllNNRTDeviceDescs(&num);
81     if (desc == nullptr) {
82         return false;
83     }
84     auto name = OH_AI_GetNameFromNNRTDeviceDesc(desc);
85     const std::string npu_name_prefix = "NPU_";
86     if (strncmp(npu_name_prefix.c_str(), name, npu_name_prefix.size()) != 0) {
87         return false;
88     }
89     return true;
90 }
91 
92 // add nnrt device info
AddContextDeviceNNRT(OH_AI_ContextHandle context)93 void AddContextDeviceNNRT(OH_AI_ContextHandle context) {
94     size_t num = 0;
95     auto desc = OH_AI_GetAllNNRTDeviceDescs(&num);
96     if (desc == nullptr) {
97         return;
98     }
99 
100     std::cout << "found " << num << " nnrt devices" << std::endl;
101     auto id = OH_AI_GetDeviceIdFromNNRTDeviceDesc(desc);
102     auto name = OH_AI_GetNameFromNNRTDeviceDesc(desc);
103     auto type = OH_AI_GetTypeFromNNRTDeviceDesc(desc);
104     std::cout << "NNRT device: id = " << id << ", name: " << name << ", type:" << type << std::endl;
105 
106     OH_AI_DeviceInfoHandle nnrt_device_info = OH_AI_DeviceInfoCreate(OH_AI_DEVICETYPE_NNRT);
107     ASSERT_NE(nnrt_device_info, nullptr);
108     OH_AI_DeviceInfoSetDeviceId(nnrt_device_info, id);
109     OH_AI_DestroyAllNNRTDeviceDescs(&desc);
110 
111     OH_AI_DeviceType device_type = OH_AI_DeviceInfoGetDeviceType(nnrt_device_info);
112     printf("==========device_type:%d\n", device_type);
113     ASSERT_EQ(device_type, OH_AI_DEVICETYPE_NNRT);
114 
115     OH_AI_DeviceInfoSetPerformanceMode(nnrt_device_info, OH_AI_PERFORMANCE_MEDIUM);
116     ASSERT_EQ(OH_AI_DeviceInfoGetPerformanceMode(nnrt_device_info), OH_AI_PERFORMANCE_MEDIUM);
117     OH_AI_DeviceInfoSetPriority(nnrt_device_info, OH_AI_PRIORITY_MEDIUM);
118     ASSERT_EQ(OH_AI_DeviceInfoGetPriority(nnrt_device_info), OH_AI_PRIORITY_MEDIUM);
119 
120     OH_AI_ContextAddDeviceInfo(context, nnrt_device_info);
121 }
122 
123 // add nnrt device info by type
AddContextDeviceNNRTByType(OH_AI_ContextHandle context)124 void AddContextDeviceNNRTByType(OH_AI_ContextHandle context) {
125     size_t num = 0;
126     auto desc = OH_AI_GetAllNNRTDeviceDescs(&num);
127     // 返回值desc是NNRTDeviceDesc结构体数组首地址
128     if (desc == nullptr) {
129         return;
130     }
131     // 目前nnrt仅提供了rk3568的驱动,只有cpu一个设备,故不用判断
132     std::cout << "found " << num << " nnrt devices" << std::endl;
133     auto id = OH_AI_GetDeviceIdFromNNRTDeviceDesc(desc);
134     auto name = OH_AI_GetNameFromNNRTDeviceDesc(desc);
135     auto type = OH_AI_GetTypeFromNNRTDeviceDesc(desc);
136     std::cout << "NNRT device: id = " << id << ", name: " << name << ", type:" << type << std::endl;
137 
138     auto nnrt_device_info = OH_AI_CreateNNRTDeviceInfoByType(type);
139     OH_AI_DestroyAllNNRTDeviceDescs(&desc);
140     ASSERT_NE(nnrt_device_info, nullptr);
141 
142     OH_AI_DeviceType device_type = OH_AI_DeviceInfoGetDeviceType(nnrt_device_info);
143     printf("==========device_type:%d\n", device_type);
144     ASSERT_EQ(device_type, OH_AI_DEVICETYPE_NNRT);
145     ASSERT_EQ(OH_AI_DeviceInfoGetDeviceId(nnrt_device_info), id);
146 
147     OH_AI_ContextAddDeviceInfo(context, nnrt_device_info);
148 }
149 
150 // add nnrt device info by name
AddContextDeviceNNRTByName(OH_AI_ContextHandle context)151 void AddContextDeviceNNRTByName(OH_AI_ContextHandle context) {
152     size_t num = 0;
153     auto desc = OH_AI_GetAllNNRTDeviceDescs(&num);
154     // 返回值desc是NNRTDeviceDesc结构体数组首地址
155     if (desc == nullptr) {
156         return;
157     }
158     // 目前nnrt仅提供了rk3568的驱动,只有cpu一个设备,故不用判断
159     std::cout << "found " << num << " nnrt devices" << std::endl;
160     auto id = OH_AI_GetDeviceIdFromNNRTDeviceDesc(desc);
161     auto name = OH_AI_GetNameFromNNRTDeviceDesc(desc);
162     auto type = OH_AI_GetTypeFromNNRTDeviceDesc(desc);
163     std::cout << "NNRT device: id = " << id << ", name: " << name << ", type:" << type << std::endl;
164 
165     auto nnrt_device_info = OH_AI_CreateNNRTDeviceInfoByName(name);
166     OH_AI_DestroyAllNNRTDeviceDescs(&desc);
167     ASSERT_NE(nnrt_device_info, nullptr);
168 
169     OH_AI_DeviceType device_type = OH_AI_DeviceInfoGetDeviceType(nnrt_device_info);
170     printf("==========device_type:%d\n", device_type);
171     ASSERT_EQ(device_type, OH_AI_DEVICETYPE_NNRT);
172     ASSERT_EQ(OH_AI_DeviceInfoGetDeviceId(nnrt_device_info), id);
173 
174     OH_AI_ContextAddDeviceInfo(context, nnrt_device_info);
175 }
176 
177 // fill data to inputs tensor
FillInputsData(OH_AI_TensorHandleArray inputs,string model_name,bool is_transpose)178 void FillInputsData(OH_AI_TensorHandleArray inputs, string model_name, bool is_transpose) {
179     for (size_t i = 0; i < inputs.handle_num; ++i) {
180         printf("==========ReadFile==========\n");
181         size_t size1;
182         size_t *ptr_size1 = &size1;
183         string input_data_path = "/data/test/" + model_name + "_" + std::to_string(i) + ".input";
184         const char *imagePath = input_data_path.c_str();
185         char *imageBuf = ReadFile(imagePath, ptr_size1);
186         ASSERT_NE(imageBuf, nullptr);
187         OH_AI_TensorHandle tensor = inputs.handle_list[i];
188         int64_t element_num = OH_AI_TensorGetElementNum(tensor);
189         printf("Tensor name: %s. \n", OH_AI_TensorGetName(tensor));
190         float *input_data = reinterpret_cast<float *>(OH_AI_TensorGetMutableData(inputs.handle_list[i]));
191         ASSERT_NE(input_data, nullptr);
192         if (is_transpose) {
193             printf("==========Transpose==========\n");
194             size_t shape_num;
195             const int64_t *shape = OH_AI_TensorGetShape(tensor, &shape_num);
196             auto imageBuf_nhwc = new char[size1];
197             PackNCHWToNHWCFp32(imageBuf, imageBuf_nhwc, shape[0], shape[1] * shape[2], shape[3]);
198             memcpy_s(input_data, size1, imageBuf_nhwc, size1);
199             delete[] imageBuf_nhwc;
200         } else {
201             memcpy_s(input_data, size1, imageBuf, size1);
202         }
203         printf("input data after filling is: ");
204         for (int j = 0; j < element_num && j <= 20; ++j) {
205             printf("%f ", input_data[j]);
206         }
207         printf("\n");
208         delete[] imageBuf;
209     }
210 }
211 
212 // compare result after predict
CompareResult(OH_AI_TensorHandleArray outputs,string model_name,float atol=0.01,float rtol=0.01)213 void CompareResult(OH_AI_TensorHandleArray outputs, string model_name, float atol = 0.01, float rtol = 0.01) {
214     printf("==========GetOutput==========\n");
215     for (size_t i = 0; i < outputs.handle_num; ++i) {
216         OH_AI_TensorHandle tensor = outputs.handle_list[i];
217         int64_t element_num = OH_AI_TensorGetElementNum(tensor);
218         printf("Tensor name: %s .\n", OH_AI_TensorGetName(tensor));
219         float *output_data = reinterpret_cast<float *>(OH_AI_TensorGetMutableData(tensor));
220         printf("output data is:");
221         for (int j = 0; j < element_num && j <= 20; ++j) {
222             printf("%f ", output_data[j]);
223         }
224         printf("\n");
225         printf("==========compFp32WithTData==========\n");
226         string output_file = "/data/test/" + model_name + std::to_string(i) + ".output";
227         bool result = compFp32WithTData(output_data, output_file, atol, rtol, false);
228         EXPECT_EQ(result, true);
229     }
230 }
231 
232 // 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)233 void ModelPredict(OH_AI_ModelHandle model, OH_AI_ContextHandle context, string model_name,
234             OH_AI_ShapeInfo shape_infos, bool build_by_graph, bool is_transpose, bool is_callback) {
235     string model_path = "/data/test/" + model_name + ".ms";
236     const char *graphPath = model_path.c_str();
237     OH_AI_Status ret = OH_AI_STATUS_SUCCESS;
238     if (build_by_graph) {
239         printf("==========Build model by graphBuf==========\n");
240         size_t size;
241         size_t *ptr_size = &size;
242         char *graphBuf = ReadFile(graphPath, ptr_size);
243         ASSERT_NE(graphBuf, nullptr);
244         ret = OH_AI_ModelBuild(model, graphBuf, size, OH_AI_MODELTYPE_MINDIR, context);
245         delete[] graphBuf;
246     } else {
247         printf("==========Build model==========\n");
248         ret = OH_AI_ModelBuildFromFile(model, graphPath, OH_AI_MODELTYPE_MINDIR, context);
249     }
250     printf("==========build model return code:%d\n", ret);
251     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
252     printf("==========GetInputs==========\n");
253     OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
254     ASSERT_NE(inputs.handle_list, nullptr);
255     if (shape_infos.shape_num != 0) {
256         printf("==========Resizes==========\n");
257         OH_AI_Status resize_ret = OH_AI_ModelResize(model, inputs, &shape_infos, inputs.handle_num);
258         printf("==========Resizes return code:%d\n", resize_ret);
259         ASSERT_EQ(resize_ret, OH_AI_STATUS_SUCCESS);
260     }
261 
262     FillInputsData(inputs, model_name, is_transpose);
263     OH_AI_TensorHandleArray outputs;
264     OH_AI_Status predict_ret = OH_AI_STATUS_SUCCESS;
265     if (is_callback) {
266         printf("==========Model Predict Callback==========\n");
267         OH_AI_KernelCallBack before_call_back = PrintBeforeCallback;
268         OH_AI_KernelCallBack after_call_back = PrintAfterCallback;
269         predict_ret = OH_AI_ModelPredict(model, inputs, &outputs, before_call_back, after_call_back);
270     }else {
271         printf("==========Model Predict==========\n");
272         predict_ret = OH_AI_ModelPredict(model, inputs, &outputs, nullptr, nullptr);
273     }
274     printf("==========Model Predict End==========\n");
275     ASSERT_EQ(predict_ret, OH_AI_STATUS_SUCCESS);
276     printf("=========CompareResult===========\n");
277     CompareResult(outputs, model_name);
278     printf("=========OH_AI_ModelDestroy===========\n");
279     OH_AI_ModelDestroy(&model);
280     printf("=========OH_AI_ModelDestroy End===========\n");
281 }
282 
283 // predict on cpu
Predict_CPU()284 void Predict_CPU() {
285     printf("==========Init Context==========\n");
286     OH_AI_ContextHandle context = OH_AI_ContextCreate();
287     ASSERT_NE(context, nullptr);
288     AddContextDeviceCPU(context);
289     printf("==========Create model==========\n");
290     OH_AI_ModelHandle model = OH_AI_ModelCreate();
291     ASSERT_NE(model, nullptr);
292     ModelPredict(model, context, "ml_face_isface", {}, false, true, false);
293 }
294 
295 // 正常场景:Context设置CPU,默认场景,不设置线程绑核
296 HWTEST(MSLiteTest, OHOS_Context_CPU_0001, Function | MediumTest | Level1) {
297     printf("==========Init Context==========\n");
298     OH_AI_ContextHandle context = OH_AI_ContextCreate();
299     ASSERT_NE(context, nullptr);
300     AddContextDeviceCPU(context);
301     printf("==========Create model==========\n");
302     OH_AI_ModelHandle model = OH_AI_ModelCreate();
303     ASSERT_NE(model, nullptr);
304     ModelPredict(model, context, "ml_face_isface", {}, false, true, false);
305 }
306 
307 // 正常场景:Context设置CPU,4线程
308 HWTEST(MSLiteTest, OHOS_Context_CPU_0002, Function | MediumTest | Level1) {
309     printf("==========Init Context==========\n");
310     OH_AI_ContextHandle context = OH_AI_ContextCreate();
311     ASSERT_NE(context, nullptr);
312     OH_AI_ContextSetThreadNum(context, 4);
313     int32_t thread_num = OH_AI_ContextGetThreadNum(context);
314     printf("==========thread_num:%d\n", thread_num);
315     ASSERT_EQ(thread_num, 4);
316     AddContextDeviceCPU(context);
317     printf("==========Create model==========\n");
318     OH_AI_ModelHandle model = OH_AI_ModelCreate();
319     ASSERT_NE(model, nullptr);
320     ModelPredict(model, context, "ml_face_isface", {}, false, true, false);
321 }
322 
323 // 正常场景:Context设置CPU,2线程
324 HWTEST(MSLiteTest, OHOS_Context_CPU_0003, Function | MediumTest | Level1) {
325     printf("==========Init Context==========\n");
326     OH_AI_ContextHandle context = OH_AI_ContextCreate();
327     ASSERT_NE(context, nullptr);
328     OH_AI_ContextSetThreadNum(context, 2);
329     int32_t thread_num = OH_AI_ContextGetThreadNum(context);
330     printf("==========thread_num:%d\n", thread_num);
331     ASSERT_EQ(thread_num, 2);
332     AddContextDeviceCPU(context);
333     printf("==========Create model==========\n");
334     OH_AI_ModelHandle model = OH_AI_ModelCreate();
335     ASSERT_NE(model, nullptr);
336     ModelPredict(model, context, "ml_face_isface", {}, false, true, false);
337 }
338 
339 // 正常场景:Context设置CPU,1线程
340 HWTEST(MSLiteTest, OHOS_Context_CPU_0004, Function | MediumTest | Level1) {
341     printf("==========Init Context==========\n");
342     OH_AI_ContextHandle context = OH_AI_ContextCreate();
343     ASSERT_NE(context, nullptr);
344     OH_AI_ContextSetThreadNum(context, 1);
345     int32_t thread_num = OH_AI_ContextGetThreadNum(context);
346     printf("==========thread_num:%d\n", thread_num);
347     ASSERT_EQ(thread_num, 1);
348     AddContextDeviceCPU(context);
349     printf("==========Create model==========\n");
350     OH_AI_ModelHandle model = OH_AI_ModelCreate();
351     ASSERT_NE(model, nullptr);
352     ModelPredict(model, context, "ml_face_isface", {}, false, true, false);
353 }
354 
355 // 异常场景:Context设置CPU,0线程
356 HWTEST(MSLiteTest, OHOS_Context_CPU_0005, Function | MediumTest | Level1) {
357     printf("==========Init Context==========\n");
358     OH_AI_ContextHandle context = OH_AI_ContextCreate();
359     ASSERT_NE(context, nullptr);
360     OH_AI_ContextSetThreadNum(context, 0);
361     int32_t thread_num = OH_AI_ContextGetThreadNum(context);
362     printf("==========thread_num:%d\n", thread_num);
363     ASSERT_EQ(thread_num, 0);
364     AddContextDeviceCPU(context);
365     printf("==========Create model==========\n");
366     OH_AI_ModelHandle model = OH_AI_ModelCreate();
367     ASSERT_NE(model, nullptr);
368     printf("==========Build model==========\n");
369     OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface.ms", OH_AI_MODELTYPE_MINDIR, context);
370     printf("==========build model return code:%d\n", ret);
371     ASSERT_EQ(ret, OH_AI_STATUS_LITE_NOT_SUPPORT);
372     OH_AI_ModelDestroy(&model);
373 }
374 
375 // 正常场景:Context设置CPU,不绑核
376 HWTEST(MSLiteTest, OHOS_Context_CPU_0006, Function | MediumTest | Level1) {
377     printf("==========Init Context==========\n");
378     OH_AI_ContextHandle context = OH_AI_ContextCreate();
379     ASSERT_NE(context, nullptr);
380     OH_AI_ContextSetThreadNum(context, 4);
381     int32_t thread_num = OH_AI_ContextGetThreadNum(context);
382     printf("==========thread_num:%d\n", thread_num);
383     ASSERT_EQ(thread_num, 4);
384     OH_AI_ContextSetThreadAffinityMode(context, 0);
385     int thread_affinity_mode = OH_AI_ContextGetThreadAffinityMode(context);
386     printf("==========thread_affinity_mode:%d\n", thread_affinity_mode);
387     ASSERT_EQ(thread_affinity_mode, 0);
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_0007, 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_ContextSetThreadAffinityMode(context, 1);
405     int thread_affinity_mode = OH_AI_ContextGetThreadAffinityMode(context);
406     printf("==========thread_affinity_mode:%d\n", thread_affinity_mode);
407     ASSERT_EQ(thread_affinity_mode, 1);
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_0008, 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_ContextSetThreadAffinityMode(context, 2);
425     int thread_affinity_mode = OH_AI_ContextGetThreadAffinityMode(context);
426     printf("==========thread_affinity_mode:%d\n", thread_affinity_mode);
427     ASSERT_EQ(thread_affinity_mode, 2);
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,绑核失败
436 HWTEST(MSLiteTest, OHOS_Context_CPU_0009, Function | MediumTest | Level1) {
437     printf("==========Init Context==========\n");
438     OH_AI_ContextHandle context = OH_AI_ContextCreate();
439     ASSERT_NE(context, nullptr);
440     OH_AI_ContextSetThreadNum(context, 4);
441     int32_t thread_num = OH_AI_ContextGetThreadNum(context);
442     printf("==========thread_num:%d\n", thread_num);
443     ASSERT_EQ(thread_num, 4);
444     OH_AI_ContextSetThreadAffinityMode(context, 3);
445     int thread_affinity_mode = OH_AI_ContextGetThreadAffinityMode(context);
446     printf("==========thread_affinity_mode:%d\n", thread_affinity_mode);
447     ASSERT_EQ(thread_affinity_mode, 3);
448     AddContextDeviceCPU(context);
449     printf("==========Create model==========\n");
450     OH_AI_ModelHandle model = OH_AI_ModelCreate();
451     ASSERT_NE(model, nullptr);
452     printf("==========Build model==========\n");
453     OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface.ms", OH_AI_MODELTYPE_MINDIR, context);
454     printf("==========build model return code:%d\n", ret);
455     ASSERT_EQ(ret, OH_AI_STATUS_LITE_NULLPTR);
456     OH_AI_ModelDestroy(&model);
457 }
458 
459 // 正常场景:Context设置CPU,绑核列表{0,1,2,3}
460 HWTEST(MSLiteTest, OHOS_Context_CPU_0010, Function | MediumTest | Level1) {
461     printf("==========Init Context==========\n");
462     OH_AI_ContextHandle context = OH_AI_ContextCreate();
463     ASSERT_NE(context, nullptr);
464     OH_AI_ContextSetThreadNum(context, 4);
465     int32_t thread_num = OH_AI_ContextGetThreadNum(context);
466     printf("==========thread_num:%d\n", thread_num);
467     ASSERT_EQ(thread_num, 4);
468     constexpr size_t core_num = 4;
469     int32_t core_list[core_num] = {0, 1, 2, 3};
470     OH_AI_ContextSetThreadAffinityCoreList(context, core_list, core_num);
471     size_t ret_core_num;
472     const int32_t *ret_core_list = nullptr;
473     ret_core_list = OH_AI_ContextGetThreadAffinityCoreList(context, &ret_core_num);
474     ASSERT_EQ(ret_core_num, core_num);
475     for (size_t i = 0; i < ret_core_num; i++) {
476         printf("==========ret_core_list:%d\n", ret_core_list[i]);
477         ASSERT_EQ(ret_core_list[i], core_list[i]);
478     }
479     AddContextDeviceCPU(context);
480     printf("==========Create model==========\n");
481     OH_AI_ModelHandle model = OH_AI_ModelCreate();
482     ASSERT_NE(model, nullptr);
483     ModelPredict(model, context, "ml_face_isface", {}, false, true, false);
484 }
485 
486 // 正常场景:Context设置CPU,绑核列表和模式同时开启
487 HWTEST(MSLiteTest, OHOS_Context_CPU_0011, Function | MediumTest | Level1) {
488     printf("==========Init Context==========\n");
489     OH_AI_ContextHandle context = OH_AI_ContextCreate();
490     ASSERT_NE(context, nullptr);
491     OH_AI_ContextSetThreadNum(context, 4);
492     int32_t thread_num = OH_AI_ContextGetThreadNum(context);
493     printf("==========thread_num:%d\n", thread_num);
494     ASSERT_EQ(thread_num, 4);
495     OH_AI_ContextSetThreadAffinityMode(context, 1);
496     int thread_affinity_mode = OH_AI_ContextGetThreadAffinityMode(context);
497     printf("==========thread_affinity_mode:%d\n", thread_affinity_mode);
498     constexpr size_t core_num = 4;
499     int32_t core_list[core_num] = {0, 1, 3, 4};
500     OH_AI_ContextSetThreadAffinityCoreList(context, core_list, core_num);
501     size_t ret_core_num;
502     const int32_t *ret_core_list = nullptr;
503     ret_core_list = OH_AI_ContextGetThreadAffinityCoreList(context, &ret_core_num);
504     ASSERT_EQ(ret_core_num, core_num);
505     for (size_t i = 0; i < ret_core_num; i++) {
506         printf("==========ret_core_list:%d\n", ret_core_list[i]);
507         ASSERT_EQ(ret_core_list[i], core_list[i]);
508     }
509     AddContextDeviceCPU(context);
510     printf("==========Create model==========\n");
511     OH_AI_ModelHandle model = OH_AI_ModelCreate();
512     ASSERT_NE(model, nullptr);
513     ModelPredict(model, context, "ml_face_isface", {}, false, true, false);
514 }
515 
516 // 正常场景:Context设置CPU,开启并行
517 HWTEST(MSLiteTest, OHOS_Context_CPU_0012, Function | MediumTest | Level1) {
518     printf("==========Init Context==========\n");
519     OH_AI_ContextHandle context = OH_AI_ContextCreate();
520     ASSERT_NE(context, nullptr);
521     OH_AI_ContextSetThreadNum(context, 4);
522     int32_t thread_num = OH_AI_ContextGetThreadNum(context);
523     printf("==========thread_num:%d\n", thread_num);
524     ASSERT_EQ(thread_num, 4);
525     OH_AI_ContextSetEnableParallel(context, true);
526     bool is_parallel = OH_AI_ContextGetEnableParallel(context);
527     printf("==========is_parallel:%d\n", is_parallel);
528     ASSERT_EQ(is_parallel, true);
529     AddContextDeviceCPU(context);
530     printf("==========Create model==========\n");
531     OH_AI_ModelHandle model = OH_AI_ModelCreate();
532     ASSERT_NE(model, nullptr);
533     ModelPredict(model, context, "ml_face_isface", {}, false, true, false);
534 }
535 
536 // 正常场景:Context设置CPU,关闭并行
537 HWTEST(MSLiteTest, OHOS_Context_CPU_0013, Function | MediumTest | Level1) {
538     printf("==========Init Context==========\n");
539     OH_AI_ContextHandle context = OH_AI_ContextCreate();
540     ASSERT_NE(context, nullptr);
541     OH_AI_ContextSetThreadNum(context, 4);
542     int32_t thread_num = OH_AI_ContextGetThreadNum(context);
543     printf("==========thread_num:%d\n", thread_num);
544     ASSERT_EQ(thread_num, 4);
545     OH_AI_ContextSetEnableParallel(context, false);
546     bool is_parallel = OH_AI_ContextGetEnableParallel(context);
547     printf("==========is_parallel:%d\n", is_parallel);
548     ASSERT_EQ(is_parallel, false);
549     AddContextDeviceCPU(context);
550     printf("==========Create model==========\n");
551     OH_AI_ModelHandle model = OH_AI_ModelCreate();
552     ASSERT_NE(model, nullptr);
553     ModelPredict(model, context, "ml_face_isface", {}, false, true, false);
554 }
555 
556 // 正常场景:Context设置CPU,开启fp16
557 HWTEST(MSLiteTest, OHOS_Context_CPU_0014, Function | MediumTest | Level1) {
558     printf("==========Init Context==========\n");
559     OH_AI_ContextHandle context = OH_AI_ContextCreate();
560     ASSERT_NE(context, nullptr);
561     OH_AI_DeviceInfoHandle cpu_device_info = OH_AI_DeviceInfoCreate(OH_AI_DEVICETYPE_CPU);
562     ASSERT_NE(cpu_device_info, nullptr);
563     OH_AI_DeviceInfoSetEnableFP16(cpu_device_info, true);
564     bool is_fp16 = OH_AI_DeviceInfoGetEnableFP16(cpu_device_info);
565     printf("==========is_fp16:%d\n", is_fp16);
566     ASSERT_EQ(is_fp16, true);
567     OH_AI_ContextAddDeviceInfo(context, cpu_device_info);
568     printf("==========Create model==========\n");
569     OH_AI_ModelHandle model = OH_AI_ModelCreate();
570     ASSERT_NE(model, nullptr);
571     ModelPredict(model, context, "ml_face_isface", {}, false, true, false);
572 }
573 
574 // 正常场景:Context设置CPU,关闭fp16
575 HWTEST(MSLiteTest, OHOS_Context_CPU_0015, Function | MediumTest | Level1) {
576     printf("==========Init Context==========\n");
577     OH_AI_ContextHandle context = OH_AI_ContextCreate();
578     ASSERT_NE(context, nullptr);
579     OH_AI_DeviceInfoHandle cpu_device_info = OH_AI_DeviceInfoCreate(OH_AI_DEVICETYPE_CPU);
580     ASSERT_NE(cpu_device_info, nullptr);
581     OH_AI_DeviceInfoSetEnableFP16(cpu_device_info, false);
582     bool is_fp16 = OH_AI_DeviceInfoGetEnableFP16(cpu_device_info);
583     printf("==========is_fp16:%d\n", is_fp16);
584     ASSERT_EQ(is_fp16, false);
585     OH_AI_ContextAddDeviceInfo(context, cpu_device_info);
586     printf("==========Create model==========\n");
587     OH_AI_ModelHandle model = OH_AI_ModelCreate();
588     ASSERT_NE(model, nullptr);
589     ModelPredict(model, context, "ml_face_isface", {}, false, true, false);
590 }
591 
592 // 正常场景:Context设置CPU,设置厂商名称
593 HWTEST(MSLiteTest, OHOS_Context_CPU_0016, Function | MediumTest | Level1) {
594     printf("==========Init Context==========\n");
595     OH_AI_ContextHandle context = OH_AI_ContextCreate();
596     ASSERT_NE(context, nullptr);
597     OH_AI_DeviceInfoHandle cpu_device_info = OH_AI_DeviceInfoCreate(OH_AI_DEVICETYPE_CPU);
598     ASSERT_NE(cpu_device_info, nullptr);
599     OH_AI_DeviceInfoSetProvider(cpu_device_info, "vendor_new");
600     ASSERT_EQ(strcmp(OH_AI_DeviceInfoGetProvider(cpu_device_info), "vendor_new"), 0);
601     OH_AI_ContextAddDeviceInfo(context, cpu_device_info);
602     printf("==========Create model==========\n");
603     OH_AI_ModelHandle model = OH_AI_ModelCreate();
604     ASSERT_NE(model, nullptr);
605     ModelPredict(model, context, "ml_face_isface", {}, false, true, false);
606 }
607 
608 // 正常场景:Context设置CPU,设置厂商设备类型
609 HWTEST(MSLiteTest, OHOS_Context_CPU_0017, Function | MediumTest | Level1) {
610     printf("==========Init Context==========\n");
611     OH_AI_ContextHandle context = OH_AI_ContextCreate();
612     ASSERT_NE(context, nullptr);
613     OH_AI_DeviceInfoHandle cpu_device_info = OH_AI_DeviceInfoCreate(OH_AI_DEVICETYPE_CPU);
614     ASSERT_NE(cpu_device_info, nullptr);
615     OH_AI_DeviceInfoSetProviderDevice(cpu_device_info, "cpu_new");
616     ASSERT_EQ(strcmp(OH_AI_DeviceInfoGetProviderDevice(cpu_device_info), "cpu_new"), 0);
617     OH_AI_ContextAddDeviceInfo(context, cpu_device_info);
618     printf("==========Create model==========\n");
619     OH_AI_ModelHandle model = OH_AI_ModelCreate();
620     ASSERT_NE(model, nullptr);
621     ModelPredict(model, context, "ml_face_isface", {}, false, true, false);
622 }
623 
624 // 正常场景:Context设置CPU,销毁MSDeviceInfo
625 HWTEST(MSLiteTest, OHOS_Context_CPU_0018, Function | MediumTest | Level1) {
626     printf("==========Init Context==========\n");
627     OH_AI_ContextHandle context = OH_AI_ContextCreate();
628     ASSERT_NE(context, nullptr);
629     OH_AI_DeviceInfoHandle cpu_device_info = OH_AI_DeviceInfoCreate(OH_AI_DEVICETYPE_CPU);
630     ASSERT_NE(cpu_device_info, nullptr);
631     OH_AI_DeviceType device_type = OH_AI_DeviceInfoGetDeviceType(cpu_device_info);
632     printf("==========device_type:%d\n", device_type);
633     ASSERT_EQ(device_type, OH_AI_DEVICETYPE_CPU);
634     OH_AI_ContextAddDeviceInfo(context, cpu_device_info);
635     OH_AI_DeviceInfoDestroy(&cpu_device_info);
636     ASSERT_EQ(cpu_device_info, nullptr);
637 }
638 
639 // 正常场景:Context设置CPU,销毁OH_AI_Context
640 HWTEST(MSLiteTest, OHOS_Context_CPU_0019, Function | MediumTest | Level1) {
641     printf("==========Init Context==========\n");
642     OH_AI_ContextHandle context = OH_AI_ContextCreate();
643     ASSERT_NE(context, nullptr);
644     OH_AI_DeviceInfoHandle cpu_device_info = OH_AI_DeviceInfoCreate(OH_AI_DEVICETYPE_CPU);
645     ASSERT_NE(cpu_device_info, nullptr);
646     OH_AI_DeviceType device_type = OH_AI_DeviceInfoGetDeviceType(cpu_device_info);
647     printf("==========device_type:%d\n", device_type);
648     ASSERT_EQ(device_type, OH_AI_DEVICETYPE_CPU);
649     OH_AI_ContextAddDeviceInfo(context, cpu_device_info);
650     OH_AI_ContextDestroy(&context);
651     ASSERT_EQ(context, nullptr);
652 }
653 
654 // 异常场景:Context不设置device info
655 HWTEST(MSLiteTest, OHOS_Context_CPU_0020, Function | MediumTest | Level1) {
656     printf("==========Init Context==========\n");
657     OH_AI_ContextHandle context = OH_AI_ContextCreate();
658     ASSERT_NE(context, nullptr);
659     printf("==========Create model==========\n");
660     OH_AI_ModelHandle model = OH_AI_ModelCreate();
661     ASSERT_NE(model, nullptr);
662     printf("==========Build model==========\n");
663     OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface.ms", OH_AI_MODELTYPE_MINDIR, context);
664     printf("==========build model return code:%d\n", ret);
665     ASSERT_EQ(ret, OH_AI_STATUS_LITE_NULLPTR);
666     OH_AI_ModelDestroy(&model);
667 }
668 
669  // 正常场景:Context设置NPU,频率为1
670  HWTEST(MSLiteTest, OHOS_Context_NPU_0002, Function | MediumTest | Level1) {
671      printf("==========Init Context==========\n");
672      OH_AI_ContextHandle context = OH_AI_ContextCreate();
673      ASSERT_NE(context, nullptr);
674      OH_AI_DeviceInfoHandle npu_device_info = OH_AI_DeviceInfoCreate(OH_AI_DEVICETYPE_KIRIN_NPU);
675      ASSERT_NE(npu_device_info, nullptr);
676      OH_AI_DeviceInfoSetFrequency(npu_device_info, 1);
677      int frequency = OH_AI_DeviceInfoGetFrequency(npu_device_info);
678      ASSERT_EQ(frequency, 1);
679      OH_AI_ContextAddDeviceInfo(context, npu_device_info);
680      printf("==========Create model==========\n");
681      OH_AI_ModelHandle model = OH_AI_ModelCreate();
682      ASSERT_NE(model, nullptr);
683  }
684 
685 // 正常场景:ModelBuild,调用指针方法
686 HWTEST(MSLiteTest, OHOS_Model_Build_0001, Function | MediumTest | Level1) {
687     printf("==========Init Context==========\n");
688     OH_AI_ContextHandle context = OH_AI_ContextCreate();
689     ASSERT_NE(context, nullptr);
690     AddContextDeviceCPU(context);
691     printf("==========Create model==========\n");
692     OH_AI_ModelHandle model = OH_AI_ModelCreate();
693     ASSERT_NE(model, nullptr);
694     ModelPredict(model, context, "ml_face_isface", {}, true, true, false);
695 }
696 
697 // 异常场景:ModelBuild,model_data指向的不是模型数据
698 HWTEST(MSLiteTest, OHOS_Model_Build_0002, Function | MediumTest | Level1) {
699     printf("==========ReadFile==========\n");
700     size_t size1;
701     size_t *ptr_size1 = &size1;
702     const char *imagePath = "/data/test/ml_face_isface.input";
703     char *imageBuf = ReadFile(imagePath, ptr_size1);
704     ASSERT_NE(imageBuf, nullptr);
705     printf("==========Init Context==========\n");
706     OH_AI_ContextHandle context = OH_AI_ContextCreate();
707     ASSERT_NE(context, nullptr);
708     AddContextDeviceCPU(context);
709     printf("==========Create model==========\n");
710     OH_AI_ModelHandle model = OH_AI_ModelCreate();
711     ASSERT_NE(model, nullptr);
712     printf("==========Build model==========\n");
713     OH_AI_Status ret = OH_AI_ModelBuild(model, imageBuf, size1, OH_AI_MODELTYPE_MINDIR, context);
714     printf("==========build model return code:%d\n", ret);
715     ASSERT_EQ(ret, OH_AI_STATUS_LITE_ERROR);
716     delete[] imageBuf;
717     OH_AI_ModelDestroy(&model);
718 }
719 
720 // 异常场景:ModelBuild,model_data为空
721 HWTEST(MSLiteTest, OHOS_Model_Build_0003, Function | MediumTest | Level1) {
722     printf("==========Init Context==========\n");
723     OH_AI_ContextHandle context = OH_AI_ContextCreate();
724     ASSERT_NE(context, nullptr);
725     AddContextDeviceCPU(context);
726     printf("==========Create model==========\n");
727     OH_AI_ModelHandle model = OH_AI_ModelCreate();
728     ASSERT_NE(model, nullptr);
729     printf("==========Build model==========\n");
730     OH_AI_Status ret = OH_AI_ModelBuild(model, nullptr, 0, OH_AI_MODELTYPE_MINDIR, context);
731     printf("==========build model return code:%d\n", ret);
732     ASSERT_EQ(ret, OH_AI_STATUS_LITE_NULLPTR);
733     OH_AI_ModelDestroy(&model);
734 }
735 
736 // 异常场景:ModelBuild,data_size为0
737 HWTEST(MSLiteTest, OHOS_Model_Build_0004, Function | MediumTest | Level1) {
738     printf("==========ReadFile==========\n");
739     size_t size;
740     size_t *ptr_size = &size;
741     const char *graphPath = "/data/test/ml_face_isface.ms";
742     char *graphBuf = ReadFile(graphPath, ptr_size);
743     ASSERT_NE(graphBuf, nullptr);
744     printf("==========Init Context==========\n");
745     OH_AI_ContextHandle context = OH_AI_ContextCreate();
746     ASSERT_NE(context, nullptr);
747     AddContextDeviceCPU(context);
748     printf("==========Create model==========\n");
749     OH_AI_ModelHandle model = OH_AI_ModelCreate();
750     ASSERT_NE(model, nullptr);
751     printf("==========Build model==========\n");
752     OH_AI_Status ret = OH_AI_ModelBuild(model, graphBuf, 0, OH_AI_MODELTYPE_MINDIR, context);
753     printf("==========build model return code:%d\n", ret);
754     ASSERT_EQ(ret, OH_AI_STATUS_LITE_ERROR);
755     delete[] graphBuf;
756     OH_AI_ModelDestroy(&model);
757 }
758 
759 // 异常场景:ModelBuild,读取路径方法,且路径不是模型数据路径
760 HWTEST(MSLiteTest, OHOS_Model_Build_0005, Function | MediumTest | Level1) {
761     printf("==========Init Context==========\n");
762     OH_AI_ContextHandle context = OH_AI_ContextCreate();
763     ASSERT_NE(context, nullptr);
764     AddContextDeviceCPU(context);
765     printf("==========Create model==========\n");
766     OH_AI_ModelHandle model = OH_AI_ModelCreate();
767     ASSERT_NE(model, nullptr);
768     printf("==========Build model==========\n");
769     OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface.input", OH_AI_MODELTYPE_MINDIR, context);
770     printf("==========build model return code:%d\n", ret);
771     ASSERT_EQ(ret, OH_AI_STATUS_LITE_ERROR);
772     OH_AI_ModelDestroy(&model);
773 }
774 
775 // 异常场景:ModelBuild,读取路径方法,路径为空
776 HWTEST(MSLiteTest, OHOS_Model_Build_0006, Function | MediumTest | Level1) {
777     printf("==========Init Context==========\n");
778     OH_AI_ContextHandle context = OH_AI_ContextCreate();
779     ASSERT_NE(context, nullptr);
780     AddContextDeviceCPU(context);
781     printf("==========Create model==========\n");
782     OH_AI_ModelHandle model = OH_AI_ModelCreate();
783     ASSERT_NE(model, nullptr);
784     printf("==========Build model==========\n");
785     OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "", OH_AI_MODELTYPE_MINDIR, context);
786     printf("==========build model return code:%d\n", ret);
787     ASSERT_EQ(ret, OH_AI_STATUS_LITE_ERROR);
788     OH_AI_ModelDestroy(&model);
789 }
790 
791 // 异常场景:ModelBuild,model_type不支持
792 HWTEST(MSLiteTest, OHOS_Model_Build_0007, Function | MediumTest | Level1) {
793     printf("==========Init Context==========\n");
794     OH_AI_ContextHandle context = OH_AI_ContextCreate();
795     ASSERT_NE(context, nullptr);
796     AddContextDeviceCPU(context);
797     printf("==========Create model==========\n");
798     OH_AI_ModelHandle model = OH_AI_ModelCreate();
799     ASSERT_NE(model, nullptr);
800     printf("==========Build model==========\n");
801     OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface.ms", OH_AI_MODELTYPE_INVALID, context);
802     printf("==========build model return code:%d\n", ret);
803     ASSERT_EQ(ret, OH_AI_STATUS_LITE_PARAM_INVALID);
804     OH_AI_ModelDestroy(&model);
805 }
806 
807 // 异常场景:ModelBuild,model_context为空
808 HWTEST(MSLiteTest, OHOS_Model_Build_0008, Function | MediumTest | Level1) {
809     printf("==========Init Context==========\n");
810     OH_AI_ContextHandle context = OH_AI_ContextCreate();
811     ASSERT_NE(context, nullptr);
812     AddContextDeviceCPU(context);
813     printf("==========Create model==========\n");
814     OH_AI_ModelHandle model = OH_AI_ModelCreate();
815     ASSERT_NE(model, nullptr);
816     printf("==========Build model==========\n");
817     OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface.ms", OH_AI_MODELTYPE_MINDIR, nullptr);
818     printf("==========build model return code:%d\n", ret);
819     ASSERT_EQ(ret, OH_AI_STATUS_LITE_NULLPTR);
820     OH_AI_ModelDestroy(&model);
821 }
822 
823 // 正常场景:ModelBuild,调用GetOutputs获取输出
824 HWTEST(MSLiteTest, OHOS_Model_Build_0009, Function | MediumTest | Level1) {
825     printf("==========Init Context==========\n");
826     OH_AI_ContextHandle context = OH_AI_ContextCreate();
827     ASSERT_NE(context, nullptr);
828     AddContextDeviceCPU(context);
829     printf("==========Create model==========\n");
830     OH_AI_ModelHandle model = OH_AI_ModelCreate();
831     ASSERT_NE(model, nullptr);
832     printf("==========Model build==========\n");
833     OH_AI_ModelBuildFromFile(model,"/data/test/ml_face_isface.ms", OH_AI_MODELTYPE_MINDIR, context);
834     printf("==========Model Predict==========\n");
835     OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
836     OH_AI_TensorHandleArray output;
837     FillInputsData(inputs,"ml_face_isface",false);
838     OH_AI_Status ret = OH_AI_ModelPredict(model, inputs, &output, nullptr, nullptr);
839     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
840     printf("==========GetOutput==========\n");
841     OH_AI_TensorHandleArray outputs = OH_AI_ModelGetOutputs(model);
842     for (size_t i = 0; i < outputs.handle_num; ++i) {
843         OH_AI_TensorHandle tensor = outputs.handle_list[i];
844         int64_t element_num = OH_AI_TensorGetElementNum(tensor);
845         printf("Tensor name: %s, elements num: %" PRId64 ".\n", OH_AI_TensorGetName(tensor), element_num);
846         float *output_data = reinterpret_cast<float *>(OH_AI_TensorGetMutableData(tensor));
847         printf("output data is:");
848         for (int j = 0; j < element_num && j <= 20; ++j) {
849             printf("%f ", output_data[j]);
850         }
851         printf("\n");
852         printf("==========compFp32WithTData==========\n");
853         string expectedDataFile = "/data/test/ml_face_isface" + std::to_string(i) + ".output";
854         bool result = compFp32WithTData(output_data, expectedDataFile, 0.01, 0.01, false);
855         EXPECT_EQ(result, true);
856     }
857 }
858 
859 // 正常场景:ModelResize,shape与之前一致
860 HWTEST(MSLiteTest, OHOS_Model_Resize_0001, Function | MediumTest | Level1) {
861     printf("==========Init Context==========\n");
862     OH_AI_ContextHandle context = OH_AI_ContextCreate();
863     ASSERT_NE(context, nullptr);
864     AddContextDeviceCPU(context);
865     printf("==========Create model==========\n");
866     OH_AI_ModelHandle model = OH_AI_ModelCreate();
867     ASSERT_NE(model, nullptr);
868     ModelPredict(model, context, "ml_ocr_cn", {4, {1, 32, 512, 1}}, false, true, false);
869 }
870 
871 // 正常场景:ModelResize,shape与之前不一致
872 HWTEST(MSLiteTest, OHOS_Model_Resize_0002, Function | MediumTest | Level1) {
873     printf("==========Init Context==========\n");
874     OH_AI_ContextHandle context = OH_AI_ContextCreate();
875     ASSERT_NE(context, nullptr);
876     AddContextDeviceCPU(context);
877     printf("==========Create model==========\n");
878     OH_AI_ModelHandle model = OH_AI_ModelCreate();
879     ASSERT_NE(model, nullptr);
880     printf("==========Build model==========\n");
881     OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_ocr_cn.ms", OH_AI_MODELTYPE_MINDIR, context);
882     printf("==========build model return code:%d\n", ret);
883     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
884     printf("==========GetInputs==========\n");
885     OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
886     ASSERT_NE(inputs.handle_list, nullptr);
887     printf("==========Resizes==========\n");
888     OH_AI_ShapeInfo shape_infos = {4, {1, 64, 256, 1}};
889     OH_AI_Status resize_ret = OH_AI_ModelResize(model, inputs, &shape_infos, inputs.handle_num);
890     printf("==========Resizes return code:%d\n", resize_ret);
891     ASSERT_EQ(resize_ret, OH_AI_STATUS_SUCCESS);
892     FillInputsData(inputs, "ml_ocr_cn", false);
893     OH_AI_TensorHandleArray outputs;
894     printf("==========Model Predict==========\n");
895     OH_AI_Status predict_ret = OH_AI_ModelPredict(model, inputs, &outputs, nullptr, nullptr);
896     ASSERT_EQ(predict_ret, OH_AI_STATUS_SUCCESS);
897 }
898 
899 // 异常场景:ModelResize,shape为三维
900 HWTEST(MSLiteTest, OHOS_Model_Resize_0003, Function | MediumTest | Level1) {
901     printf("==========Init Context==========\n");
902     OH_AI_ContextHandle context = OH_AI_ContextCreate();
903     ASSERT_NE(context, nullptr);
904     AddContextDeviceCPU(context);
905     printf("==========Create model==========\n");
906     OH_AI_ModelHandle model = OH_AI_ModelCreate();
907     ASSERT_NE(model, nullptr);
908     printf("==========Build model==========\n");
909     OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_ocr_cn.ms", OH_AI_MODELTYPE_MINDIR, context);
910     printf("==========build model return code:%d\n", ret);
911     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
912     printf("==========GetInputs==========\n");
913     OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
914     ASSERT_NE(inputs.handle_list, nullptr);
915     printf("==========Resizes==========\n");
916     OH_AI_ShapeInfo shape_infos = {4, {1, 32, 1}};
917     ret = OH_AI_ModelResize(model, inputs, &shape_infos, inputs.handle_num);
918     printf("==========Resizes return code:%d\n", ret);
919     ASSERT_EQ(ret, OH_AI_STATUS_LITE_ERROR);
920     OH_AI_ModelDestroy(&model);
921 }
922 
923 // 异常场景:ModelResize,shape值有负数
924 HWTEST(MSLiteTest, OHOS_Model_Resize_0004, Function | MediumTest | Level1) {
925     printf("==========Init Context==========\n");
926     OH_AI_ContextHandle context = OH_AI_ContextCreate();
927     ASSERT_NE(context, nullptr);
928     AddContextDeviceCPU(context);
929     printf("==========Create model==========\n");
930     OH_AI_ModelHandle model = OH_AI_ModelCreate();
931     ASSERT_NE(model, nullptr);
932     printf("==========Build model==========\n");
933     OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_ocr_cn.ms", OH_AI_MODELTYPE_MINDIR, context);
934     printf("==========build model return code:%d\n", ret);
935     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
936     printf("==========GetInputs==========\n");
937     OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
938     ASSERT_NE(inputs.handle_list, nullptr);
939     printf("==========Resizes==========\n");
940     OH_AI_ShapeInfo shape_infos = {4, {1, -32, 32, 1}};
941     ret = OH_AI_ModelResize(model, inputs, &shape_infos, inputs.handle_num);
942     printf("==========Resizes return code:%d\n", ret);
943     ASSERT_EQ(ret, OH_AI_STATUS_LITE_ERROR);
944     OH_AI_ModelDestroy(&model);
945 }
946 
947 // 异常场景:ModelResize,不支持resize的模型
948 HWTEST(MSLiteTest, OHOS_Model_Resize_0005, Function | MediumTest | Level1) {
949     printf("==========Init Context==========\n");
950     OH_AI_ContextHandle context = OH_AI_ContextCreate();
951     ASSERT_NE(context, nullptr);
952     AddContextDeviceCPU(context);
953     printf("==========Create model==========\n");
954     OH_AI_ModelHandle model = OH_AI_ModelCreate();
955     ASSERT_NE(model, nullptr);
956     printf("==========Build model==========\n");
957     OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface.ms", OH_AI_MODELTYPE_MINDIR, context);
958     printf("==========build model return code:%d\n", ret);
959     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
960     printf("==========GetInputs==========\n");
961     OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
962     ASSERT_NE(inputs.handle_list, nullptr);
963     printf("==========Resizes==========\n");
964     OH_AI_ShapeInfo shape_infos = {4, {1, 96, 96, 1}};
965     ret = OH_AI_ModelResize(model, inputs, &shape_infos, inputs.handle_num);
966     printf("==========Resizes return code:%d\n", ret);
967     ASSERT_EQ(ret, OH_AI_STATUS_LITE_ERROR);
968     OH_AI_ModelDestroy(&model);
969 }
970 
971 // 正常场景:ModelPredict
972 HWTEST(MSLiteTest, OHOS_Model_Predict_0001, Function | MediumTest | Level1) {
973     printf("==========Init Context==========\n");
974     OH_AI_ContextHandle context = OH_AI_ContextCreate();
975     ASSERT_NE(context, nullptr);
976     AddContextDeviceCPU(context);
977     printf("==========Create model==========\n");
978     OH_AI_ModelHandle model = OH_AI_ModelCreate();
979     ASSERT_NE(model, nullptr);
980     ModelPredict(model, context, "ml_face_isface", {}, false, true, false);
981 }
982 
983 // 异常场景:ModelPredict,model被销毁
984 HWTEST(MSLiteTest, OHOS_Model_Predict_0002, Function | MediumTest | Level1) {
985     printf("==========Init Context==========\n");
986     OH_AI_ContextHandle context = OH_AI_ContextCreate();
987     ASSERT_NE(context, nullptr);
988     AddContextDeviceCPU(context);
989     printf("==========Create model==========\n");
990     OH_AI_ModelHandle model = OH_AI_ModelCreate();
991     ASSERT_NE(model, nullptr);
992     printf("==========Build model==========\n");
993     OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface.ms", OH_AI_MODELTYPE_MINDIR, context);
994     printf("==========build model return code:%d\n", ret);
995     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
996     printf("==========GetInputs==========\n");
997     OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
998     ASSERT_NE(inputs.handle_list, nullptr);
999     FillInputsData(inputs, "ml_face_isface", true);
1000     printf("==========Model Predict==========\n");
1001     OH_AI_TensorHandleArray outputs;
1002     OH_AI_ModelDestroy(&model);
1003     ret = OH_AI_ModelPredict(model, inputs, &outputs, nullptr, nullptr);
1004     printf("==========Model Predict return code:%d\n", ret);
1005     ASSERT_EQ(ret, OH_AI_STATUS_LITE_NULLPTR);
1006 }
1007 
1008 // 异常场景:ModelPredict,input为空
1009 HWTEST(MSLiteTest, OHOS_Model_Predict_0003, Function | MediumTest | Level1) {
1010     printf("==========Init Context==========\n");
1011     OH_AI_ContextHandle context = OH_AI_ContextCreate();
1012     ASSERT_NE(context, nullptr);
1013     AddContextDeviceCPU(context);
1014     printf("==========Create model==========\n");
1015     OH_AI_ModelHandle model = OH_AI_ModelCreate();
1016     ASSERT_NE(model, nullptr);
1017     printf("==========Build model==========\n");
1018     OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface.ms", OH_AI_MODELTYPE_MINDIR, context);
1019     printf("==========build model return code:%d\n", ret);
1020     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1021     printf("==========Model Predict==========\n");
1022     OH_AI_TensorHandleArray inputs;
1023     OH_AI_TensorHandleArray outputs;
1024     ret = OH_AI_ModelPredict(model, inputs, &outputs, nullptr, nullptr);
1025     printf("==========Model Predict return code:%d\n", ret);
1026     ASSERT_EQ(ret, OH_AI_STATUS_LITE_ERROR);
1027     OH_AI_ModelDestroy(&model);
1028 }
1029 
1030 // 正常场景:ModelPredict,传入回调函数
1031 HWTEST(MSLiteTest, OHOS_Model_Predict_0004, Function | MediumTest | Level1) {
1032     printf("==========Init Context==========\n");
1033     OH_AI_ContextHandle context = OH_AI_ContextCreate();
1034     ASSERT_NE(context, nullptr);
1035     AddContextDeviceCPU(context);
1036     printf("==========Create model==========\n");
1037     OH_AI_ModelHandle model = OH_AI_ModelCreate();
1038     ASSERT_NE(model, nullptr);
1039     ModelPredict(model, context, "ml_face_isface", {}, false, true, true);
1040 }
1041 
1042 // 正常场景:ModelGetInputByTensorName
1043 HWTEST(MSLiteTest, OHOS_Model_GetInputByTensorName_0001, Function | MediumTest | Level1) {
1044     printf("==========ReadFile==========\n");
1045     size_t size1;
1046     size_t *ptr_size1 = &size1;
1047     const char *imagePath = "/data/test/ml_face_isface.input";
1048     char *imageBuf = ReadFile(imagePath, ptr_size1);
1049     ASSERT_NE(imageBuf, nullptr);
1050     printf("==========Init Context==========\n");
1051     OH_AI_ContextHandle context = OH_AI_ContextCreate();
1052     ASSERT_NE(context, nullptr);
1053     AddContextDeviceCPU(context);
1054     printf("==========Create model==========\n");
1055     OH_AI_ModelHandle model = OH_AI_ModelCreate();
1056     ASSERT_NE(model, nullptr);
1057     printf("==========Build model==========\n");
1058     OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface.ms", OH_AI_MODELTYPE_MINDIR, context);
1059     printf("==========build model return code:%d\n", ret);
1060     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1061     printf("==========GetInputs==========\n");
1062     OH_AI_TensorHandle tensor = OH_AI_ModelGetInputByTensorName(model, "data");
1063     ASSERT_NE(tensor, nullptr);
1064     int64_t element_num = OH_AI_TensorGetElementNum(tensor);
1065     printf("Tensor name: %s, elements num: %" PRId64 ".\n", OH_AI_TensorGetName(tensor), element_num);
1066     float *input_data = reinterpret_cast<float *>(OH_AI_TensorGetMutableData(tensor));
1067     ASSERT_NE(input_data, nullptr);
1068     printf("==========Transpose==========\n");
1069     size_t shape_num;
1070     const int64_t *shape = OH_AI_TensorGetShape(tensor, &shape_num);
1071     auto imageBuf_nhwc = new char[size1];
1072     PackNCHWToNHWCFp32(imageBuf, imageBuf_nhwc, shape[0], shape[1] * shape[2], shape[3]);
1073     memcpy_s(input_data, size1, imageBuf_nhwc, size1);
1074     printf("input data is:");
1075     for (int j = 0; j < element_num && j <= 20; ++j) {
1076         printf("%f ", input_data[j]);
1077     }
1078     printf("\n");
1079     printf("==========Model Predict==========\n");
1080     OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
1081     ASSERT_NE(inputs.handle_list, nullptr);
1082     OH_AI_TensorHandleArray outputs;
1083     ret = OH_AI_ModelPredict(model, inputs, &outputs, nullptr, nullptr);
1084     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1085     CompareResult(outputs, "ml_face_isface");
1086     delete[] imageBuf;
1087     OH_AI_ModelDestroy(&model);
1088 }
1089 
1090 // 异常场景:ModelGetInputByTensorName,名称不存在
1091 HWTEST(MSLiteTest, OHOS_Model_GetInputByTensorName_0002, Function | MediumTest | Level1) {
1092     printf("==========Init Context==========\n");
1093     OH_AI_ContextHandle context = OH_AI_ContextCreate();
1094     ASSERT_NE(context, nullptr);
1095     AddContextDeviceCPU(context);
1096     printf("==========Create model==========\n");
1097     OH_AI_ModelHandle model = OH_AI_ModelCreate();
1098     ASSERT_NE(model, nullptr);
1099     printf("==========Build model==========\n");
1100     OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface.ms", OH_AI_MODELTYPE_MINDIR, context);
1101     printf("==========build model return code:%d\n", ret);
1102     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1103     printf("==========GetInputs==========\n");
1104     OH_AI_TensorHandle tensor = OH_AI_ModelGetInputByTensorName(model, "aaa");
1105     ASSERT_EQ(tensor, nullptr);
1106     OH_AI_ModelDestroy(&model);
1107 }
1108 
1109 // 正常场景:ModelGetOutputByTensorName
1110 HWTEST(MSLiteTest, OHOS_Model_GetOutputByTensorName_0001, Function | MediumTest | Level1) {
1111     printf("==========Init Context==========\n");
1112     OH_AI_ContextHandle context = OH_AI_ContextCreate();
1113     ASSERT_NE(context, nullptr);
1114     AddContextDeviceCPU(context);
1115     printf("==========Create model==========\n");
1116     OH_AI_ModelHandle model = OH_AI_ModelCreate();
1117     ASSERT_NE(model, nullptr);
1118     printf("==========Build model==========\n");
1119     OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface.ms", OH_AI_MODELTYPE_MINDIR, context);
1120     printf("==========build model return code:%d\n", ret);
1121     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1122     printf("==========GetInputs==========\n");
1123     OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
1124     ASSERT_NE(inputs.handle_list, nullptr);
1125     FillInputsData(inputs, "ml_face_isface", true);
1126     printf("==========Model Predict==========\n");
1127     OH_AI_TensorHandleArray outputs;
1128     ret = OH_AI_ModelPredict(model, inputs, &outputs, nullptr, nullptr);
1129     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1130     printf("==========GetOutput==========\n");
1131     OH_AI_TensorHandle tensor = OH_AI_ModelGetOutputByTensorName(model, "prob");
1132     ASSERT_NE(tensor, nullptr);
1133     int64_t element_num = OH_AI_TensorGetElementNum(tensor);
1134     printf("Tensor name: %s, elements num: %" PRId64 ".\n", OH_AI_TensorGetName(tensor), element_num);
1135     float *output_data = reinterpret_cast<float *>(OH_AI_TensorGetMutableData(tensor));
1136     printf("output data is:");
1137     for (int j = 0; j < element_num && j <= 20; ++j) {
1138         printf("%f ", output_data[j]);
1139     }
1140     printf("\n");
1141     printf("==========compFp32WithTData==========\n");
1142     bool result = compFp32WithTData(output_data, "/data/test/ml_face_isface0.output", 0.01, 0.01, false);
1143     EXPECT_EQ(result, true);
1144     OH_AI_ModelDestroy(&model);
1145 }
1146 
1147 // 异常场景:ModelGetOutputByTensorName,名称不存在
1148 HWTEST(MSLiteTest, OHOS_Model_GetOutputByTensorName_0002, Function | MediumTest | Level1) {
1149     printf("==========Init Context==========\n");
1150     OH_AI_ContextHandle context = OH_AI_ContextCreate();
1151     ASSERT_NE(context, nullptr);
1152     AddContextDeviceCPU(context);
1153     printf("==========Create model==========\n");
1154     OH_AI_ModelHandle model = OH_AI_ModelCreate();
1155     ASSERT_NE(model, nullptr);
1156     printf("==========Build model==========\n");
1157     OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface.ms", OH_AI_MODELTYPE_MINDIR, context);
1158     printf("==========build model return code:%d\n", ret);
1159     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1160     printf("==========GetInputs==========\n");
1161     OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
1162     ASSERT_NE(inputs.handle_list, nullptr);
1163     FillInputsData(inputs, "ml_face_isface", true);
1164     printf("==========Model Predict==========\n");
1165     OH_AI_TensorHandleArray outputs;
1166     ret = OH_AI_ModelPredict(model, inputs, &outputs, nullptr, nullptr);
1167     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1168     printf("==========GetOutput==========\n");
1169     OH_AI_TensorHandle tensor = OH_AI_ModelGetOutputByTensorName(model, "aaa");
1170     ASSERT_EQ(tensor, nullptr);
1171     OH_AI_ModelDestroy(&model);
1172 }
1173 
1174 // 正常场景:MSTensorCreate,创建tensor
1175 HWTEST(MSLiteTest, OHOS_Tensor_Create_0001, Function | MediumTest | Level1) {
1176     printf("==========Init Context==========\n");
1177     OH_AI_ContextHandle context = OH_AI_ContextCreate();
1178     ASSERT_NE(context, nullptr);
1179     AddContextDeviceCPU(context);
1180     printf("==========Create model==========\n");
1181     OH_AI_ModelHandle model = OH_AI_ModelCreate();
1182     ASSERT_NE(model, nullptr);
1183     printf("==========Build model==========\n");
1184     OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface.ms", OH_AI_MODELTYPE_MINDIR, context);
1185     printf("==========build model return code:%d\n", ret);
1186     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1187     printf("==========GetInputs==========\n");
1188     constexpr size_t create_shape_num = 4;
1189     int64_t create_shape[create_shape_num] = {1, 48, 48, 3};
1190     OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, create_shape,
1191                             create_shape_num, nullptr, 0);
1192     ASSERT_NE(tensor, nullptr);
1193     OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
1194     inputs.handle_list[0] = tensor;
1195     FillInputsData(inputs, "ml_face_isface", true);
1196     printf("==========Model Predict==========\n");
1197     OH_AI_TensorHandleArray outputs;
1198     ret = OH_AI_ModelPredict(model, inputs, &outputs, nullptr, nullptr);
1199     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1200     CompareResult(outputs, "ml_face_isface");
1201     OH_AI_ModelDestroy(&model);
1202 }
1203 
1204 // 正常场景:MSTensorDestroy,销毁tensor
1205 HWTEST(MSLiteTest, OHOS_Tensor_Create_0002, Function | MediumTest | Level1) {
1206     printf("==========ReadFile==========\n");
1207     size_t size1;
1208     size_t *ptr_size1 = &size1;
1209     const char *imagePath = "/data/test/ml_face_isface.input";
1210     char *imageBuf = ReadFile(imagePath, ptr_size1);
1211     ASSERT_NE(imageBuf, nullptr);
1212     printf("==========OH_AI_TensorCreate==========\n");
1213     constexpr size_t create_shape_num = 4;
1214     int64_t create_shape[create_shape_num] = {1, 48, 48, 3};
1215     OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, create_shape,
1216                                            create_shape_num, imageBuf, size1);
1217     ASSERT_NE(tensor, nullptr);
1218     delete[] imageBuf;
1219     OH_AI_TensorDestroy(&tensor);
1220     ASSERT_EQ(tensor, nullptr);
1221 }
1222 
1223 // 正常场景:MSTensorGetName,获取tensor名称
1224 HWTEST(MSLiteTest, OHOS_Tensor_Create_0003, Function | MediumTest | Level1) {
1225     printf("==========ReadFile==========\n");
1226     size_t size1;
1227     size_t *ptr_size1 = &size1;
1228     const char *imagePath = "/data/test/ml_face_isface.input";
1229     char *imageBuf = ReadFile(imagePath, ptr_size1);
1230     ASSERT_NE(imageBuf, nullptr);
1231     printf("==========OH_AI_TensorCreate==========\n");
1232     constexpr size_t create_shape_num = 4;
1233     int64_t create_shape[create_shape_num] = {1, 48, 48, 3};
1234     OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, create_shape,
1235                                             create_shape_num, imageBuf, size1);
1236     ASSERT_NE(tensor, nullptr);
1237     const char *tensor_name = OH_AI_TensorGetName(tensor);
1238     ASSERT_EQ(strcmp(tensor_name, "data"), 0);
1239     delete[] imageBuf;
1240     OH_AI_TensorDestroy(&tensor);
1241 }
1242 
1243 // 正常场景:MSTensorGetName,设置tensor名称
1244 HWTEST(MSLiteTest, OHOS_Tensor_Create_0004, Function | MediumTest | Level1) {
1245     printf("==========ReadFile==========\n");
1246     size_t size1;
1247     size_t *ptr_size1 = &size1;
1248     const char *imagePath = "/data/test/ml_face_isface.input";
1249     char *imageBuf = ReadFile(imagePath, ptr_size1);
1250     ASSERT_NE(imageBuf, nullptr);
1251     printf("==========OH_AI_TensorCreate==========\n");
1252     constexpr size_t create_shape_num = 4;
1253     int64_t create_shape[create_shape_num] = {1, 48, 48, 3};
1254     OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, create_shape,
1255                                            create_shape_num, imageBuf, size1);
1256     ASSERT_NE(tensor, nullptr);
1257     OH_AI_TensorSetName(tensor, "new_data");
1258     const char *tensor_name = OH_AI_TensorGetName(tensor);
1259     ASSERT_EQ(strcmp(tensor_name, "new_data"), 0);
1260     delete[] imageBuf;
1261     OH_AI_TensorDestroy(&tensor);
1262 }
1263 
1264 // 正常场景:MSTensorGetDataType,获取tensor数据类型
1265 HWTEST(MSLiteTest, OHOS_Tensor_Create_0005, Function | MediumTest | Level1) {
1266     printf("==========ReadFile==========\n");
1267     size_t size1;
1268     size_t *ptr_size1 = &size1;
1269     const char *imagePath = "/data/test/ml_face_isface.input";
1270     char *imageBuf = ReadFile(imagePath, ptr_size1);
1271     ASSERT_NE(imageBuf, nullptr);
1272     printf("==========OH_AI_TensorCreate==========\n");
1273     constexpr size_t create_shape_num = 4;
1274     int64_t create_shape[create_shape_num] = {1, 48, 48, 3};
1275     OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, create_shape,
1276                                            create_shape_num, imageBuf, size1);
1277     ASSERT_NE(tensor, nullptr);
1278     OH_AI_DataType data_type = OH_AI_TensorGetDataType(tensor);
1279     ASSERT_EQ(data_type, OH_AI_DATATYPE_NUMBERTYPE_FLOAT32);
1280     delete[] imageBuf;
1281     OH_AI_TensorDestroy(&tensor);
1282 }
1283 
1284 // 正常场景:MSTensorSetDataType,设置tensor数据类型
1285 HWTEST(MSLiteTest, OHOS_Tensor_Create_0006, Function | MediumTest | Level1) {
1286     printf("==========ReadFile==========\n");
1287     size_t size1;
1288     size_t *ptr_size1 = &size1;
1289     const char *imagePath = "/data/test/ml_face_isface.input";
1290     char *imageBuf = ReadFile(imagePath, ptr_size1);
1291     ASSERT_NE(imageBuf, nullptr);
1292     printf("==========OH_AI_TensorCreate==========\n");
1293     constexpr size_t create_shape_num = 4;
1294     int64_t create_shape[create_shape_num] = {1, 48, 48, 3};
1295     OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, create_shape,
1296                                            create_shape_num, imageBuf, size1);
1297     ASSERT_NE(tensor, nullptr);
1298     OH_AI_TensorSetDataType(tensor, OH_AI_DATATYPE_NUMBERTYPE_FLOAT16);
1299     OH_AI_DataType data_type = OH_AI_TensorGetDataType(tensor);
1300     ASSERT_EQ(data_type, OH_AI_DATATYPE_NUMBERTYPE_FLOAT16);
1301     delete[] imageBuf;
1302     OH_AI_TensorDestroy(&tensor);
1303 }
1304 
1305 // 正常场景:MSTensorGetShape,获取tensor维度
1306 HWTEST(MSLiteTest, OHOS_Tensor_Create_0007, Function | MediumTest | Level1) {
1307     printf("==========ReadFile==========\n");
1308     size_t size1;
1309     size_t *ptr_size1 = &size1;
1310     const char *imagePath = "/data/test/ml_face_isface.input";
1311     char *imageBuf = ReadFile(imagePath, ptr_size1);
1312     ASSERT_NE(imageBuf, nullptr);
1313     printf("==========OH_AI_TensorCreate==========\n");
1314     constexpr size_t create_shape_num = 4;
1315     int64_t create_shape[create_shape_num] = {1, 48, 48, 3};
1316     OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, create_shape,
1317                                             create_shape_num, imageBuf, size1);
1318     ASSERT_NE(tensor, nullptr);
1319     size_t ret_shape_num;
1320     const int64_t *ret_shape = OH_AI_TensorGetShape(tensor, &ret_shape_num);
1321     ASSERT_EQ(ret_shape_num, create_shape_num);
1322     for (size_t i = 0; i < ret_shape_num; i++) {
1323         ASSERT_EQ(ret_shape[i], create_shape[i]);
1324     }
1325     delete[] imageBuf;
1326     OH_AI_TensorDestroy(&tensor);
1327 }
1328 
1329 // 正常场景:MSTensorSetShape,设置tensor维度
1330 HWTEST(MSLiteTest, OHOS_Tensor_Create_0008, Function | MediumTest | Level1) {
1331     printf("==========ReadFile==========\n");
1332     size_t size1;
1333     size_t *ptr_size1 = &size1;
1334     const char *imagePath = "/data/test/ml_face_isface.input";
1335     char *imageBuf = ReadFile(imagePath, ptr_size1);
1336     ASSERT_NE(imageBuf, nullptr);
1337     printf("==========OH_AI_TensorCreate==========\n");
1338     constexpr size_t create_shape_num = 4;
1339     int64_t create_shape[create_shape_num] = {1, 48, 48, 3};
1340     OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, create_shape,
1341                                            create_shape_num, imageBuf, size1);
1342     ASSERT_NE(tensor, nullptr);
1343     size_t ret_shape_num;
1344     const int64_t *ret_shape = OH_AI_TensorGetShape(tensor, &ret_shape_num);
1345     ASSERT_EQ(ret_shape_num, create_shape_num);
1346     for (size_t i = 0; i < ret_shape_num; i++) {
1347         ASSERT_EQ(ret_shape[i], create_shape[i]);
1348     }
1349     constexpr size_t new_shape_num = 4;
1350     int64_t new_shape[new_shape_num] = {1, 32, 32, 1};
1351     OH_AI_TensorSetShape(tensor, new_shape, new_shape_num);
1352     size_t new_ret_shape_num;
1353     const int64_t *new_ret_shape = OH_AI_TensorGetShape(tensor, &new_ret_shape_num);
1354     ASSERT_EQ(new_ret_shape_num, new_shape_num);
1355     for (size_t i = 0; i < new_ret_shape_num; i++) {
1356         ASSERT_EQ(new_ret_shape[i], new_shape[i]);
1357     }
1358     delete[] imageBuf;
1359     OH_AI_TensorDestroy(&tensor);
1360 }
1361 
1362 // 正常场景:MSTensorGetFormat,获取tensor格式
1363 HWTEST(MSLiteTest, OHOS_Tensor_Create_0009, Function | MediumTest | Level1) {
1364     printf("==========ReadFile==========\n");
1365     size_t size1;
1366     size_t *ptr_size1 = &size1;
1367     const char *imagePath = "/data/test/ml_face_isface.input";
1368     char *imageBuf = ReadFile(imagePath, ptr_size1);
1369     ASSERT_NE(imageBuf, nullptr);
1370     printf("==========OH_AI_TensorCreate==========\n");
1371     constexpr size_t create_shape_num = 4;
1372     int64_t create_shape[create_shape_num] = {1, 48, 48, 3};
1373     OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, create_shape,
1374                                            create_shape_num, imageBuf, size1);
1375     ASSERT_NE(tensor, nullptr);
1376     OH_AI_Format data_format = OH_AI_TensorGetFormat(tensor);
1377     ASSERT_EQ(data_format, OH_AI_FORMAT_NCHW);
1378     delete[] imageBuf;
1379     OH_AI_TensorDestroy(&tensor);
1380 }
1381 
1382 // 正常场景:MSTensorSetFormat,设置tensor格式
1383 HWTEST(MSLiteTest, OHOS_Tensor_Create_0010, Function | MediumTest | Level1) {
1384     printf("==========ReadFile==========\n");
1385     size_t size1;
1386     size_t *ptr_size1 = &size1;
1387     const char *imagePath = "/data/test/ml_face_isface.input";
1388     char *imageBuf = ReadFile(imagePath, ptr_size1);
1389     ASSERT_NE(imageBuf, nullptr);
1390     printf("==========OH_AI_TensorCreate==========\n");
1391     constexpr size_t create_shape_num = 4;
1392     int64_t create_shape[create_shape_num] = {1, 48, 48, 3};
1393     OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, create_shape,
1394                                            create_shape_num, imageBuf, size1);
1395     ASSERT_NE(tensor, nullptr);
1396     OH_AI_TensorSetFormat(tensor, OH_AI_FORMAT_NHWC);
1397     OH_AI_Format data_format = OH_AI_TensorGetFormat(tensor);
1398     ASSERT_EQ(data_format, OH_AI_FORMAT_NHWC);
1399     delete[] imageBuf;
1400     OH_AI_TensorDestroy(&tensor);
1401 }
1402 
1403 // 正常场景:MSTensorGetData,获取tensor数据
1404 HWTEST(MSLiteTest, OHOS_Tensor_Create_0011, Function | MediumTest | Level1) {
1405     printf("==========ReadFile==========\n");
1406     size_t size1;
1407     size_t *ptr_size1 = &size1;
1408     const char *imagePath = "/data/test/ml_face_isface.input";
1409     char *imageBuf = ReadFile(imagePath, ptr_size1);
1410     ASSERT_NE(imageBuf, nullptr);
1411     printf("==========OH_AI_TensorCreate==========\n");
1412     constexpr size_t create_shape_num = 4;
1413     int64_t create_shape[create_shape_num] = {1, 48, 48, 3};
1414     OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, create_shape,
1415                                            create_shape_num, imageBuf, size1);
1416     ASSERT_NE(tensor, nullptr);
1417     const float *ret_data = static_cast<const float *>(OH_AI_TensorGetData(tensor));
1418     ASSERT_NE(ret_data, nullptr);
1419     printf("return data is:");
1420     for (int i = 0; i < 20; ++i) {
1421         printf("%f ", ret_data[i]);
1422     }
1423     printf("\n");
1424     delete[] imageBuf;
1425     OH_AI_TensorDestroy(&tensor);
1426 }
1427 
1428 // 正常场景:MSTensorSetData,设置tensor数据
1429 HWTEST(MSLiteTest, OHOS_Tensor_Create_0012, Function | MediumTest | Level1) {
1430     printf("==========ReadFile==========\n");
1431     size_t size1;
1432     size_t *ptr_size1 = &size1;
1433     const char *imagePath = "/data/test/ml_face_isface.input";
1434     char *imageBuf = ReadFile(imagePath, ptr_size1);
1435     ASSERT_NE(imageBuf, nullptr);
1436     printf("==========OH_AI_TensorCreate==========\n");
1437     constexpr size_t create_shape_num = 4;
1438     int64_t create_shape[create_shape_num] = {1, 48, 48, 3};
1439     OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, create_shape,
1440                                            create_shape_num, imageBuf, size1);
1441     ASSERT_NE(tensor, nullptr);
1442     constexpr size_t data_len = 6;
1443     float data[data_len] = {1, 2, 3, 4, 5, 6};
1444     OH_AI_TensorSetData(tensor, data);
1445     const float *ret_data = static_cast<const float *>(OH_AI_TensorGetData(tensor));
1446     ASSERT_NE(ret_data, nullptr);
1447     printf("return data is:");
1448     for (size_t i = 0; i < data_len; i++) {
1449         ASSERT_EQ(ret_data[i], data[i]);
1450         printf("%f ", ret_data[i]);
1451     }
1452     printf("\n");
1453     delete[] imageBuf;
1454     OH_AI_TensorDestroy(&tensor);
1455 }
1456 
1457 // 正常场景:MSTensorGetElementNum,获取tensor元素
1458 HWTEST(MSLiteTest, OHOS_Tensor_Create_0013, Function | MediumTest | Level1) {
1459     printf("==========ReadFile==========\n");
1460     size_t size1;
1461     size_t *ptr_size1 = &size1;
1462     const char *imagePath = "/data/test/ml_face_isface.input";
1463     char *imageBuf = ReadFile(imagePath, ptr_size1);
1464     ASSERT_NE(imageBuf, nullptr);
1465     printf("==========OH_AI_TensorCreate==========\n");
1466     constexpr size_t create_shape_num = 4;
1467     int64_t create_shape[create_shape_num] = {1, 48, 48, 3};
1468     OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, create_shape,
1469                                            create_shape_num, imageBuf, size1);
1470     ASSERT_NE(tensor, nullptr);
1471     int64_t element_num = OH_AI_TensorGetElementNum(tensor);
1472     printf("Tensor name: %s, elements num: %" PRId64 ".\n", OH_AI_TensorGetName(tensor), element_num);
1473     ASSERT_EQ(element_num, 6912);
1474     delete[] imageBuf;
1475     OH_AI_TensorDestroy(&tensor);
1476 }
1477 
1478 // 正常场景:MSTensorGetDataSize,获取tensor大小
1479 HWTEST(MSLiteTest, OHOS_Tensor_Create_0014, Function | MediumTest | Level1) {
1480     printf("==========ReadFile==========\n");
1481     size_t size1;
1482     size_t *ptr_size1 = &size1;
1483     const char *imagePath = "/data/test/ml_face_isface.input";
1484     char *imageBuf = ReadFile(imagePath, ptr_size1);
1485     ASSERT_NE(imageBuf, nullptr);
1486     printf("==========OH_AI_TensorCreate==========\n");
1487     constexpr size_t create_shape_num = 4;
1488     int64_t create_shape[create_shape_num] = {1, 48, 48, 3};
1489     OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, create_shape,
1490                                            create_shape_num, imageBuf, size1);
1491     ASSERT_NE(tensor, nullptr);
1492     size_t data_size = OH_AI_TensorGetDataSize(tensor);
1493     printf("Tensor data size: %zu.\n", data_size);
1494     ASSERT_EQ(data_size, 6912 * sizeof(float));
1495     delete[] imageBuf;
1496     OH_AI_TensorDestroy(&tensor);
1497 }
1498 
1499 // 正常场景:MSTensorGetMutableData,获取tensor可变数据指针
1500 HWTEST(MSLiteTest, OHOS_Tensor_Create_0015, Function | MediumTest | Level1) {
1501     printf("==========ReadFile==========\n");
1502     size_t size1;
1503     size_t *ptr_size1 = &size1;
1504     const char *imagePath = "/data/test/ml_face_isface.input";
1505     char *imageBuf = ReadFile(imagePath, ptr_size1);
1506     ASSERT_NE(imageBuf, nullptr);
1507     printf("==========OH_AI_TensorCreate==========\n");
1508     constexpr size_t create_shape_num = 4;
1509     int64_t create_shape[create_shape_num] = {1, 48, 48, 3};
1510     OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, create_shape,
1511                                            create_shape_num, imageBuf, size1);
1512     ASSERT_NE(tensor, nullptr);
1513     float *input_data = reinterpret_cast<float *>(OH_AI_TensorGetMutableData(tensor));
1514     ASSERT_NE(input_data, nullptr);
1515     delete[] imageBuf;
1516     OH_AI_TensorDestroy(&tensor);
1517 }
1518 
1519 // 正常场景:MSTensorClone,拷贝tensor
1520 HWTEST(MSLiteTest, OHOS_Tensor_Create_0016, Function | MediumTest | Level1) {
1521     printf("==========ReadFile==========\n");
1522     size_t size1;
1523     size_t *ptr_size1 = &size1;
1524     const char *imagePath = "/data/test/ml_face_isface.input";
1525     char *imageBuf = ReadFile(imagePath, ptr_size1);
1526     ASSERT_NE(imageBuf, nullptr);
1527     printf("==========OH_AI_TensorCreate==========\n");
1528     constexpr size_t create_shape_num = 4;
1529     int64_t create_shape[create_shape_num] = {1, 48, 48, 3};
1530     OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, create_shape,
1531                                            create_shape_num, imageBuf, size1);
1532     ASSERT_NE(tensor, nullptr);
1533     OH_AI_TensorHandle clone = OH_AI_TensorClone(tensor);
1534     ASSERT_NE(clone, nullptr);
1535     ASSERT_EQ(strcmp(OH_AI_TensorGetName(clone), "data_duplicate"), 0);
1536     delete[] imageBuf;
1537     OH_AI_TensorDestroy(&tensor);
1538     OH_AI_TensorDestroy(&clone);
1539 }
1540 
1541 // 正常场景:单输入模型
1542 HWTEST(MSLiteTest, OHOS_Input_0001, Function | MediumTest | Level1) {
1543     printf("==========Init Context==========\n");
1544     OH_AI_ContextHandle context = OH_AI_ContextCreate();
1545     ASSERT_NE(context, nullptr);
1546     AddContextDeviceCPU(context);
1547     printf("==========Create model==========\n");
1548     OH_AI_ModelHandle model = OH_AI_ModelCreate();
1549     ASSERT_NE(model, nullptr);
1550     ModelPredict(model, context, "ml_face_isface", {}, false, true, false);
1551 }
1552 
1553 // 正常场景:多输入模型
1554 HWTEST(MSLiteTest, OHOS_Input_0002, Function | MediumTest | Level1) {
1555     printf("==========Init Context==========\n");
1556     OH_AI_ContextHandle context = OH_AI_ContextCreate();
1557     ASSERT_NE(context, nullptr);
1558     AddContextDeviceCPU(context);
1559     printf("==========Create model==========\n");
1560     OH_AI_ModelHandle model = OH_AI_ModelCreate();
1561     ASSERT_NE(model, nullptr);
1562     printf("==========Build model==========\n");
1563     OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_headpose_pb2tflite.ms",
1564         OH_AI_MODELTYPE_MINDIR, context);
1565     printf("==========build model return code:%d\n", ret);
1566     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1567     printf("==========GetInputs==========\n");
1568     OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
1569     ASSERT_NE(inputs.handle_list, nullptr);
1570     FillInputsData(inputs, "ml_headpose_pb2tflite", false);
1571     printf("==========Model Predict==========\n");
1572     OH_AI_TensorHandleArray outputs;
1573     ret = OH_AI_ModelPredict(model, inputs, &outputs, nullptr, nullptr);
1574     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1575     CompareResult(outputs, "ml_headpose_pb2tflite", 0.02, 0.02);
1576     OH_AI_ModelDestroy(&model);
1577 }
1578 
1579 // 正常场景:输入为uint8模型
1580 HWTEST(MSLiteTest, OHOS_Input_0003, Function | MediumTest | Level1) {
1581     printf("==========ReadFile==========\n");
1582     size_t size1;
1583     size_t *ptr_size1 = &size1;
1584     const char *imagePath = "/data/test/aiy_vision_classifier_plants_V1_3.input";
1585     char *imageBuf = ReadFile(imagePath, ptr_size1);
1586     ASSERT_NE(imageBuf, nullptr);
1587     printf("==========Init Context==========\n");
1588     OH_AI_ContextHandle context = OH_AI_ContextCreate();
1589     ASSERT_NE(context, nullptr);
1590     AddContextDeviceCPU(context);
1591     printf("==========Create model==========\n");
1592     OH_AI_ModelHandle model = OH_AI_ModelCreate();
1593     ASSERT_NE(model, nullptr);
1594     printf("==========Build model==========\n");
1595     OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/aiy_vision_classifier_plants_V1_3.ms", OH_AI_MODELTYPE_MINDIR,
1596                                    context);
1597     printf("==========build model return code:%d\n", ret);
1598     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1599     printf("==========GetInputs==========\n");
1600     OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
1601     ASSERT_NE(inputs.handle_list, nullptr);
1602     for (size_t i = 0; i < inputs.handle_num; ++i) {
1603         OH_AI_TensorHandle tensor = inputs.handle_list[i];
1604         int64_t element_num = OH_AI_TensorGetElementNum(tensor);
1605         printf("Tensor name: %s, elements num: %" PRId64 ".\n", OH_AI_TensorGetName(tensor), element_num);
1606         void *input_data = OH_AI_TensorGetMutableData(inputs.handle_list[i]);
1607         ASSERT_NE(input_data, nullptr);
1608         memcpy(input_data, imageBuf, size1);
1609     }
1610     printf("==========Model Predict==========\n");
1611     OH_AI_TensorHandleArray outputs;
1612     ret = OH_AI_ModelPredict(model, inputs, &outputs, nullptr, nullptr);
1613     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1614     printf("==========GetOutput==========\n");
1615     for (size_t i = 0; i < outputs.handle_num; ++i) {
1616         OH_AI_TensorHandle tensor = outputs.handle_list[i];
1617         int64_t element_num = OH_AI_TensorGetElementNum(tensor);
1618         printf("Tensor name: %s, elements num: %" PRId64 ".\n", OH_AI_TensorGetName(tensor), element_num);
1619         uint8_t *output_data = reinterpret_cast<uint8_t *>(OH_AI_TensorGetMutableData(tensor));
1620         printf("output data is:");
1621         for (int j = 0; j < element_num && j <= 20; ++j) {
1622             printf("%d ", output_data[j]);
1623         }
1624         printf("\n");
1625         printf("==========compFp32WithTData==========\n");
1626         string expectedDataFile = "/data/test/aiy_vision_classifier_plants_V1_3" + std::to_string(i) + ".output";
1627         bool result = compUint8WithTData(output_data, expectedDataFile, 0.01, 0.01, false);
1628         EXPECT_EQ(result, true);
1629     }
1630     delete[] imageBuf;
1631     OH_AI_ModelDestroy(&model);
1632 }
1633 
1634 // 正常场景:量化模型
1635 HWTEST(MSLiteTest, OHOS_Input_0004, Function | MediumTest | Level1) {
1636     printf("==========Init Context==========\n");
1637     OH_AI_ContextHandle context = OH_AI_ContextCreate();
1638     ASSERT_NE(context, nullptr);
1639     AddContextDeviceCPU(context);
1640     printf("==========Create model==========\n");
1641     OH_AI_ModelHandle model = OH_AI_ModelCreate();
1642     ASSERT_NE(model, nullptr);
1643     ModelPredict(model, context, "ml_face_isface", {}, false, true, false);
1644 }
1645 
1646 // 正常场景:循环多次执行推理流程
1647 HWTEST(MSLiteTest, OHOS_Multiple_0001, Function | MediumTest | Level1) {
1648     for (size_t num = 0; num < 50; ++num) {
1649         Predict_CPU();
1650     }
1651 }
1652 
1653 // 异常场景:Model创建一次,Build多次
1654 HWTEST(MSLiteTest, OHOS_Multiple_0002, Function | MediumTest | Level1) {
1655     printf("==========Init Context==========\n");
1656     OH_AI_ContextHandle context = OH_AI_ContextCreate();
1657     ASSERT_NE(context, nullptr);
1658     AddContextDeviceCPU(context);
1659     printf("==========Create model==========\n");
1660     OH_AI_ModelHandle model = OH_AI_ModelCreate();
1661     ASSERT_NE(model, nullptr);
1662     printf("==========Build model==========\n");
1663     int ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface.ms", OH_AI_MODELTYPE_MINDIR, context);
1664     printf("==========build model return code:%d\n", ret);
1665     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1666     printf("==========Build model==========\n");
1667     int ret2 = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface.ms", OH_AI_MODELTYPE_MINDIR, context);
1668     printf("==========build model return code:%d\n", ret2);
1669     ASSERT_EQ(ret2, OH_AI_STATUS_SUCCESS);
1670     OH_AI_ModelDestroy(&model);
1671 }
1672 
1673 // 正常场景:Model创建一次,Build一次,Predict多次
1674 HWTEST(MSLiteTest, OHOS_Multiple_0003, Function | MediumTest | Level1) {
1675     printf("==========Init Context==========\n");
1676     OH_AI_ContextHandle context = OH_AI_ContextCreate();
1677     ASSERT_NE(context, nullptr);
1678     AddContextDeviceCPU(context);
1679     printf("==========Create model==========\n");
1680     OH_AI_ModelHandle model = OH_AI_ModelCreate();
1681     ASSERT_NE(model, nullptr);
1682     printf("==========Build model==========\n");
1683     OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface.ms", OH_AI_MODELTYPE_MINDIR, context);
1684     printf("==========build model return code:%d\n", ret);
1685     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1686     printf("==========GetInputs==========\n");
1687     OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
1688     ASSERT_NE(inputs.handle_list, nullptr);
1689     FillInputsData(inputs, "ml_face_isface", true);
1690     OH_AI_TensorHandleArray outputs;
1691     for (size_t i = 0; i < 50; ++i) {
1692         printf("==========Model Predict==========\n");
1693         OH_AI_Status predict_ret = OH_AI_ModelPredict(model, inputs, &outputs, nullptr, nullptr);
1694         ASSERT_EQ(predict_ret, OH_AI_STATUS_SUCCESS);
1695     }
1696     CompareResult(outputs, "ml_face_isface");
1697     OH_AI_ModelDestroy(&model);
1698 }
1699 
1700 // 正常场景:多次创建和销毁Model
1701 HWTEST(MSLiteTest, OHOS_Multiple_0004, Function | MediumTest | Level1) {
1702     for (size_t i = 0; i < 50; ++i) {
1703         printf("==========Init Context==========\n");
1704         OH_AI_ContextHandle context = OH_AI_ContextCreate();
1705         ASSERT_NE(context, nullptr);
1706         AddContextDeviceCPU(context);
1707         printf("==========Create model==========\n");
1708         OH_AI_ModelHandle model = OH_AI_ModelCreate();
1709         ASSERT_NE(model, nullptr);
1710         printf("==========Build model==========\n");
1711         OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface.ms", OH_AI_MODELTYPE_MINDIR, context);
1712         printf("==========build model return code:%d\n", ret);
1713         ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1714         printf("==========Build model==========\n");
1715         OH_AI_ModelDestroy(&model);
1716     }
1717 }
1718 
1719 // 正常场景:两个模型都在CPU上并行推理
1720 HWTEST(MSLiteTest, OHOS_Parallel_0001, Function | MediumTest | Level1) {
1721     std::cout << "run start" << std::endl;
1722     std::thread t1(Predict_CPU);
1723     std::cout << "1111111111111" << std::endl;
1724     std::thread t2(Predict_CPU);
1725     std::cout << "2222222222222" << std::endl;
1726     t1.join();
1727     t2.join();
1728 }
1729 
1730 // 正常场景:r1.3转换的模型在r1.5上推理
1731 HWTEST(MSLiteTest, OHOS_Compatible_0001, Function | MediumTest | Level1) {
1732     printf("==========Init Context==========\n");
1733     OH_AI_ContextHandle context = OH_AI_ContextCreate();
1734     ASSERT_NE(context, nullptr);
1735     AddContextDeviceCPU(context);
1736     printf("==========Create model==========\n");
1737     OH_AI_ModelHandle model = OH_AI_ModelCreate();
1738     ASSERT_NE(model, nullptr);
1739     printf("==========Build model==========\n");
1740     OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface_r13.ms",
1741         OH_AI_MODELTYPE_MINDIR, context);
1742     printf("==========build model return code:%d\n", ret);
1743     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1744     printf("==========GetInputs==========\n");
1745     OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
1746     ASSERT_NE(inputs.handle_list, nullptr);
1747     FillInputsData(inputs, "ml_face_isface", true);
1748     printf("==========Model Predict==========\n");
1749     OH_AI_TensorHandleArray outputs;
1750     ret = OH_AI_ModelPredict(model, inputs, &outputs, nullptr, nullptr);
1751     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1752     CompareResult(outputs, "ml_face_isface");
1753     OH_AI_ModelDestroy(&model);
1754 }
1755 
1756 
1757 // 正常场景:离线模型支持NNRT后端,单模型输入
1758 HWTEST(MSLiteTest, OHOS_OfflineModel_0001, Function | MediumTest | Level1) {
1759     if (!IsNNRTAvailable()) {
1760         printf("NNRt is not available, skip this test");
1761         return;
1762     }
1763 
1764     printf("==========Init Context==========\n");
1765     OH_AI_ContextHandle context = OH_AI_ContextCreate();
1766     ASSERT_NE(context, nullptr);
1767     AddContextDeviceNNRT(context);
1768     printf("==========Create model==========\n");
1769     OH_AI_ModelHandle model = OH_AI_ModelCreate();
1770     ASSERT_NE(model, nullptr);
1771     printf("==========Build model==========\n");
1772     OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface_offline_model.ms",
1773         OH_AI_MODELTYPE_MINDIR, context);
1774     printf("==========build model return code:%d\n", ret);
1775     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1776     printf("==========GetInputs==========\n");
1777     OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
1778     ASSERT_NE(inputs.handle_list, nullptr);
1779     FillInputsData(inputs, "ml_face_isface", true);
1780     printf("==========Model Predict==========\n");
1781     OH_AI_TensorHandleArray outputs;
1782     ret = OH_AI_ModelPredict(model, inputs, &outputs, nullptr, nullptr);
1783     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1784     CompareResult(outputs, "ml_face_isface");
1785     OH_AI_ModelDestroy(&model);
1786 }
1787 
1788 // 正常场景:离线模型支持NNRT后端,多输入模型
1789 HWTEST(MSLiteTest, OHOS_OfflineModel_0002, Function | MediumTest | Level1) {
1790     if (!IsNNRTAvailable()) {
1791         printf("NNRt is not available, skip this test");
1792         return;
1793     }
1794 
1795     printf("==========Init Context==========\n");
1796     OH_AI_ContextHandle context = OH_AI_ContextCreate();
1797     ASSERT_NE(context, nullptr);
1798     AddContextDeviceNNRT(context);
1799     printf("==========Create model==========\n");
1800     OH_AI_ModelHandle model = OH_AI_ModelCreate();
1801     ASSERT_NE(model, nullptr);
1802     printf("==========Build model==========\n");
1803     OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_headpose_pb2tflite_offline_model.ms",
1804         OH_AI_MODELTYPE_MINDIR, context);
1805     printf("==========build model return code:%d\n", ret);
1806     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1807     printf("==========GetInputs==========\n");
1808     OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
1809     ASSERT_NE(inputs.handle_list, nullptr);
1810     FillInputsData(inputs, "ml_headpose_pb2tflite", false);
1811     printf("==========Model Predict==========\n");
1812     OH_AI_TensorHandleArray outputs;
1813     ret = OH_AI_ModelPredict(model, inputs, &outputs, nullptr, nullptr);
1814     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1815     CompareResult(outputs, "ml_headpose_pb2tflite", 0.02, 0.02);
1816     OH_AI_ModelDestroy(&model);
1817 }
1818 
1819 
1820 // 正常场景:离线模型支持NNRT后端,Model创建一次,Build一次,Predict多次
1821 HWTEST(MSLiteTest, OHOS_OfflineModel_0004, Function | MediumTest | Level1) {
1822     if (!IsNNRTAvailable()) {
1823         printf("NNRt is not available, skip this test");
1824         return;
1825     }
1826 
1827     printf("==========Init Context==========\n");
1828     OH_AI_ContextHandle context = OH_AI_ContextCreate();
1829     ASSERT_NE(context, nullptr);
1830     AddContextDeviceNNRT(context);
1831     printf("==========Create model==========\n");
1832     OH_AI_ModelHandle model = OH_AI_ModelCreate();
1833     ASSERT_NE(model, nullptr);
1834     printf("==========Build model==========\n");
1835     OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface_offline_model.ms", OH_AI_MODELTYPE_MINDIR, context);
1836     printf("==========build model return code:%d\n", ret);
1837     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1838     printf("==========GetInputs==========\n");
1839     OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
1840     ASSERT_NE(inputs.handle_list, nullptr);
1841     FillInputsData(inputs, "ml_face_isface", true);
1842     OH_AI_TensorHandleArray outputs;
1843     for (size_t i = 0; i < 50; ++i) {
1844         printf("==========Model Predict==========\n");
1845         OH_AI_Status predict_ret = OH_AI_ModelPredict(model, inputs, &outputs, nullptr, nullptr);
1846         ASSERT_EQ(predict_ret, OH_AI_STATUS_SUCCESS);
1847     }
1848     CompareResult(outputs, "ml_face_isface");
1849     OH_AI_ModelDestroy(&model);
1850 }
1851 
1852 
1853 // 正常场景:离线模型支持NNRT后端,Model创建一次,Build多次
1854 HWTEST(MSLiteTest, OHOS_OfflineModel_0005, Function | MediumTest | Level1) {
1855     if (!IsNNRTAvailable()) {
1856         printf("NNRt is not available, skip this test");
1857         return;
1858     }
1859 
1860     printf("==========Init Context==========\n");
1861     OH_AI_ContextHandle context = OH_AI_ContextCreate();
1862     ASSERT_NE(context, nullptr);
1863     AddContextDeviceNNRT(context);
1864     printf("==========Create model==========\n");
1865     OH_AI_ModelHandle model = OH_AI_ModelCreate();
1866     ASSERT_NE(model, nullptr);
1867     printf("==========Build model==========\n");
1868     int ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface_offline_model.ms", OH_AI_MODELTYPE_MINDIR, context);
1869     printf("==========build model return code:%d\n", ret);
1870     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1871     printf("==========Build model==========\n");
1872     int ret2 = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface_offline_model.ms", OH_AI_MODELTYPE_MINDIR, context);
1873     printf("==========build model return code:%d\n", ret2);
1874     ASSERT_EQ(ret2, OH_AI_STATUS_SUCCESS);
1875     OH_AI_ModelDestroy(&model);
1876 }
1877 
1878 
1879 // 异常场景:离线模型支持NNRT后端,ModelPredict,input为空
1880 HWTEST(MSLiteTest, OHOS_OfflineModel_0006, Function | MediumTest | Level1) {
1881     if (!IsNNRTAvailable()) {
1882         printf("NNRt is not available, skip this test");
1883         return;
1884     }
1885 
1886     printf("==========Init Context==========\n");
1887     OH_AI_ContextHandle context = OH_AI_ContextCreate();
1888     ASSERT_NE(context, nullptr);
1889     AddContextDeviceNNRT(context);
1890     printf("==========Create model==========\n");
1891     OH_AI_ModelHandle model = OH_AI_ModelCreate();
1892     ASSERT_NE(model, nullptr);
1893     printf("==========Build model==========\n");
1894     OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface_offline_model.ms", OH_AI_MODELTYPE_MINDIR, context);
1895     printf("==========build model return code:%d\n", ret);
1896     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1897     printf("==========Model Predict==========\n");
1898     OH_AI_TensorHandleArray inputs;
1899     OH_AI_TensorHandleArray outputs;
1900     ret = OH_AI_ModelPredict(model, inputs, &outputs, nullptr, nullptr);
1901     printf("==========Model Predict return code:%d\n", ret);
1902     ASSERT_EQ(ret, OH_AI_STATUS_LITE_ERROR);
1903     OH_AI_ModelDestroy(&model);
1904 }
1905 
1906 
1907 // 异常场景:非离线模型支持NNRT后端,ms模型未转换为NNRT后端模型
1908 HWTEST(MSLiteTest, OHOS_OfflineModel_0007, Function | MediumTest | Level1) {
1909     if (!IsNNRTAvailable()) {
1910         printf("NNRt is not available, skip this test");
1911         return;
1912     }
1913 
1914     printf("==========Init Context==========\n");
1915     OH_AI_ContextHandle context = OH_AI_ContextCreate();
1916     ASSERT_NE(context, nullptr);
1917     AddContextDeviceNNRT(context);
1918     AddContextDeviceCPU(context);  // nnrt算子支持有限,加cpu设备走异构推理
1919     printf("==========Create model==========\n");
1920     OH_AI_ModelHandle model = OH_AI_ModelCreate();
1921     ASSERT_NE(model, nullptr);
1922     ModelPredict(model, context, "ml_face_isface", {}, false, true, false);
1923 }
1924 
1925 // 正常场景:覆盖模型ml_ocr_cn
1926 HWTEST(MSLiteTest, OHOS_OfflineModel_0008, Function | MediumTest | Level1) {
1927     if (!IsNNRTAvailable()) {
1928         printf("NNRt is not available, skip this test");
1929         return;
1930     }
1931 
1932     printf("==========Init Context==========\n");
1933     OH_AI_ContextHandle context = OH_AI_ContextCreate();
1934     ASSERT_NE(context, nullptr);
1935     AddContextDeviceNNRT(context);
1936     printf("==========Create model==========\n");
1937     OH_AI_ModelHandle model = OH_AI_ModelCreate();
1938     ASSERT_NE(model, nullptr);
1939     printf("==========Build model==========\n");
1940     OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_ocr_cn_offline_model.ms",
1941         OH_AI_MODELTYPE_MINDIR, context);
1942     printf("==========build model return code:%d\n", ret);
1943     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1944     printf("==========GetInputs==========\n");
1945     OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
1946     ASSERT_NE(inputs.handle_list, nullptr);
1947     FillInputsData(inputs, "ml_ocr_cn", false);
1948     printf("==========Model Predict==========\n");
1949     OH_AI_TensorHandleArray outputs;
1950     ret = OH_AI_ModelPredict(model, inputs, &outputs, nullptr, nullptr);
1951     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1952     CompareResult(outputs, "ml_ocr_cn");
1953     OH_AI_ModelDestroy(&model);
1954 }
1955 
1956 // 正常场景:离线模型覆盖NPU
1957 HWTEST(MSLiteTest, OHOS_OfflineModel_0009, Function | MediumTest | Level1) {
1958     if (!IsNPU()) {
1959         printf("NNRt is not NPU, skip this test");
1960         return;
1961     }
1962 
1963     printf("==========Init Context==========\n");
1964     OH_AI_ContextHandle context = OH_AI_ContextCreate();
1965     ASSERT_NE(context, nullptr);
1966     AddContextDeviceNNRT(context);
1967     printf("==========Create model==========\n");
1968     OH_AI_ModelHandle model = OH_AI_ModelCreate();
1969     ASSERT_NE(model, nullptr);
1970     printf("==========Build model==========\n");
1971     OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/tinynet.om.ms",
1972         OH_AI_MODELTYPE_MINDIR, context);
1973     printf("==========build model return code:%d\n", ret);
1974     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1975     printf("==========GetInputs==========\n");
1976     OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
1977     ASSERT_NE(inputs.handle_list, nullptr);
1978     for (size_t i = 0; i < inputs.handle_num; ++i) {
1979         OH_AI_TensorHandle tensor = inputs.handle_list[i];
1980         float *input_data = reinterpret_cast<float *>(OH_AI_TensorGetMutableData(tensor));
1981         size_t element_num = OH_AI_TensorGetElementNum(tensor);
1982         std::random_device rd;
1983         std::mt19937 gen(rd());
1984         std::uniform_real_distribution<float> dis(0.0f,1.0f);
1985         for (int z=0;z<element_num;z++) {
1986             input_data[z] = dis(gen);
1987         }
1988     }
1989     printf("==========Model Predict==========\n");
1990     OH_AI_TensorHandleArray outputs;
1991     ret = OH_AI_ModelPredict(model, inputs, &outputs, nullptr, nullptr);
1992     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
1993     OH_AI_ModelDestroy(&model);
1994 }
1995 
1996 // 正常场景:delegate异构,使用低级接口创建nnrt device info,选取第一个NNRT设备
1997 HWTEST(MSLiteTest, OHOS_NNRT_0001, Function | MediumTest | Level1) {
1998     printf("==========Init Context==========\n");
1999     OH_AI_ContextHandle context = OH_AI_ContextCreate();
2000     ASSERT_NE(context, nullptr);
2001     AddContextDeviceNNRT(context);
2002     AddContextDeviceCPU(context);
2003     printf("==========Create model==========\n");
2004     OH_AI_ModelHandle model = OH_AI_ModelCreate();
2005     ASSERT_NE(model, nullptr);
2006     printf("==========Build model==========\n");
2007     OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface.ms",
2008         OH_AI_MODELTYPE_MINDIR, context);
2009     printf("==========build model return code:%d\n", ret);
2010     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
2011     printf("==========GetInputs==========\n");
2012     OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
2013     ASSERT_NE(inputs.handle_list, nullptr);
2014     FillInputsData(inputs, "ml_face_isface", true);
2015     printf("==========Model Predict==========\n");
2016     OH_AI_TensorHandleArray outputs;
2017     ret = OH_AI_ModelPredict(model, inputs, &outputs, nullptr, nullptr);
2018     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
2019     CompareResult(outputs, "ml_face_isface");
2020     OH_AI_ModelDestroy(&model);
2021 }
2022 
2023 //  正常场景:delegate异构,使用高级接口创建nnrt device info,根据类型确定NNRT设备
2024 HWTEST(MSLiteTest, OHOS_NNRT_0002, Function | MediumTest | Level1) {
2025     printf("==========Init Context==========\n");
2026     OH_AI_ContextHandle context = OH_AI_ContextCreate();
2027     ASSERT_NE(context, nullptr);
2028     AddContextDeviceNNRTByType(context);
2029     AddContextDeviceCPU(context);
2030     printf("==========Create model==========\n");
2031     OH_AI_ModelHandle model = OH_AI_ModelCreate();
2032     ASSERT_NE(model, nullptr);
2033     printf("==========Build model==========\n");
2034     OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface.ms",
2035         OH_AI_MODELTYPE_MINDIR, context);
2036     printf("==========build model return code:%d\n", ret);
2037     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
2038     printf("==========GetInputs==========\n");
2039     OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
2040     ASSERT_NE(inputs.handle_list, nullptr);
2041     FillInputsData(inputs, "ml_face_isface", true);
2042     printf("==========Model Predict==========\n");
2043     OH_AI_TensorHandleArray outputs;
2044     ret = OH_AI_ModelPredict(model, inputs, &outputs, nullptr, nullptr);
2045     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
2046     CompareResult(outputs, "ml_face_isface");
2047     OH_AI_ModelDestroy(&model);
2048 }
2049 
2050 // 正常场景:delegate异构,使用高级接口创建nnrt device info,根据名称确定NNRT设备
2051 HWTEST(MSLiteTest, OHOS_NNRT_0003, Function | MediumTest | Level1) {
2052     printf("==========Init Context==========\n");
2053     OH_AI_ContextHandle context = OH_AI_ContextCreate();
2054     ASSERT_NE(context, nullptr);
2055     AddContextDeviceNNRTByName(context);
2056     AddContextDeviceCPU(context);
2057     printf("==========Create model==========\n");
2058     OH_AI_ModelHandle model = OH_AI_ModelCreate();
2059     ASSERT_NE(model, nullptr);
2060     printf("==========Build model==========\n");
2061     OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_face_isface.ms",
2062         OH_AI_MODELTYPE_MINDIR, context);
2063     printf("==========build model return code:%d\n", ret);
2064     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
2065     printf("==========GetInputs==========\n");
2066     OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
2067     ASSERT_NE(inputs.handle_list, nullptr);
2068     FillInputsData(inputs, "ml_face_isface", true);
2069     printf("==========Model Predict==========\n");
2070     OH_AI_TensorHandleArray outputs;
2071     ret = OH_AI_ModelPredict(model, inputs, &outputs, nullptr, nullptr);
2072     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
2073     CompareResult(outputs, "ml_face_isface");
2074     OH_AI_ModelDestroy(&model);
2075 }
2076 
2077 // 正常场景:delegate异构,使用高低级接口创建nnrt device info,多输入单输出
2078 HWTEST(MSLiteTest, OHOS_NNRT_0004, Function | MediumTest | Level1) {
2079     printf("==========Init Context==========\n");
2080     OH_AI_ContextHandle context = OH_AI_ContextCreate();
2081     ASSERT_NE(context, nullptr);
2082     AddContextDeviceNNRT(context);
2083     AddContextDeviceCPU(context);
2084     printf("==========Create model==========\n");
2085     OH_AI_ModelHandle model = OH_AI_ModelCreate();
2086     ASSERT_NE(model, nullptr);
2087     printf("==========Build model==========\n");
2088     OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/ml_headpose_pb2tflite.ms",
2089         OH_AI_MODELTYPE_MINDIR, context);
2090     printf("==========build model return code:%d\n", ret);
2091     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
2092     printf("==========GetInputs==========\n");
2093     OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
2094     ASSERT_NE(inputs.handle_list, nullptr);
2095     FillInputsData(inputs, "ml_headpose_pb2tflite", false);
2096     printf("==========Model Predict==========\n");
2097     OH_AI_TensorHandleArray outputs;
2098     ret = OH_AI_ModelPredict(model, inputs, &outputs, nullptr, nullptr);
2099     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
2100     CompareResult(outputs, "ml_headpose_pb2tflite", 0.02, 0.02);
2101     OH_AI_ModelDestroy(&model);
2102 }
2103 
2104