• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023 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 "gtest/gtest.h"
17 #include <inttypes.h>
18 #include <random>
19 #include <securec.h>
20 #include "include/c_api/context_c.h"
21 #include "include/c_api/model_c.h"
22 #include "include/c_api/types_c.h"
23 #include "include/c_api/status_c.h"
24 #include "include/c_api/data_type_c.h"
25 #include "include/c_api/tensor_c.h"
26 #include "include/c_api/format_c.h"
27 #include "../utils/model_utils.h"
28 #include "../utils/common.h"
29 
30 class MSLiteTest: public testing::Test {
31   protected:
SetUpTestCase(void)32     static void SetUpTestCase(void) {}
TearDownTestCase(void)33     static void TearDownTestCase(void) {}
SetUp()34     virtual void SetUp() {}
TearDown()35     virtual void TearDown() {}
36 };
37 
38 std::string g_testFilesDir = "/data/test/resource/";
39 
40 /*
41  * @tc.name: Context_Create
42  * @tc.desc: Verify the return context of the OH_AI_ContextCreate function.
43  * @tc.type: FUNC
44  */
45 HWTEST(MSLiteTest, Context_Create, testing::ext::TestSize.Level0) {
46     printf("==========Init Context==========\n");
47     OH_AI_ContextHandle context = OH_AI_ContextCreate();
48     ASSERT_NE(context, nullptr);
49 }
50 
51 /*
52  * @tc.name: Context_Destroy
53  * @tc.desc: Verify the OH_AI_ContextDestroy function.
54  * @tc.type: FUNC
55  */
56 HWTEST(MSLiteTest, Context_Destroy, testing::ext::TestSize.Level0) {
57     printf("==========Init Context==========\n");
58     OH_AI_ContextHandle context = OH_AI_ContextCreate();
59     ASSERT_NE(context, nullptr);
60     OH_AI_ContextDestroy(&context);
61     ASSERT_EQ(context, nullptr);
62 }
63 
64 /*
65  * @tc.name: Context_Thread_Num
66  * @tc.desc: Verify the OH_AI_ContextSetThreadNum/OH_AI_ContextGetThreadNum function.
67  * @tc.type: FUNC
68  */
69 HWTEST(MSLiteTest, Context_Thread_Num, testing::ext::TestSize.Level0) {
70     printf("==========Init Context==========\n");
71     OH_AI_ContextHandle context = OH_AI_ContextCreate();
72     ASSERT_NE(context, nullptr);
73     OH_AI_ContextSetThreadNum(context, 2);
74     auto thread_num = OH_AI_ContextGetThreadNum(context);
75     printf("==========thread_num: %d\n", thread_num);
76     ASSERT_EQ(thread_num, 2);
77 }
78 
79 /*
80  * @tc.name: Context_Thread_Affinity
81  * @tc.desc: Verify the OH_AI_ContextSetThreadAffinityMode/OH_AI_ContextGetThreadAffinityMode function.
82  * @tc.type: FUNC
83  */
84 HWTEST(MSLiteTest, Context_Thread_Affinity, testing::ext::TestSize.Level0) {
85     printf("==========Init Context==========\n");
86     OH_AI_ContextHandle context = OH_AI_ContextCreate();
87     ASSERT_NE(context, nullptr);
88     OH_AI_ContextSetThreadNum(context, 4);
89     auto thread_num = OH_AI_ContextGetThreadNum(context);
90     printf("==========thread_num: %d\n", thread_num);
91     ASSERT_EQ(thread_num, 4);
92 
93     OH_AI_ContextSetThreadAffinityMode(context, 2);
94     int thread_affinity_mode = OH_AI_ContextGetThreadAffinityMode(context);
95     printf("==========thread_affinity_mode:%d\n", thread_affinity_mode);
96     ASSERT_EQ(thread_affinity_mode, 2);
97 }
98 
99 /*
100  * @tc.name: Context_Thread_Affinity_Corelist
101  * @tc.desc: Verify the OH_AI_ContextSetThreadAffinityCoreList/OH_AI_ContextGetThreadAffinityCoreList function.
102  * @tc.type: FUNC
103  */
104 HWTEST(MSLiteTest, Context_Thread_Affinity_Corelist, testing::ext::TestSize.Level0) {
105     printf("==========Init Context==========\n");
106     OH_AI_ContextHandle context = OH_AI_ContextCreate();
107     ASSERT_NE(context, nullptr);
108     OH_AI_ContextSetThreadNum(context, 4);
109     auto thread_num = OH_AI_ContextGetThreadNum(context);
110     printf("==========thread_num: %d\n", thread_num);
111     ASSERT_EQ(thread_num, 4);
112 
113     constexpr size_t coreNum = 4;
114     int32_t coreList[coreNum] = {0, 1, 2, 3};
115     OH_AI_ContextSetThreadAffinityCoreList(context, coreList, coreNum);
116     size_t retCoreNum;
117     const int32_t *retCoreList = nullptr;
118     retCoreList = OH_AI_ContextGetThreadAffinityCoreList(context, &retCoreNum);
119     ASSERT_EQ(retCoreNum, coreNum);
120     for (size_t i = 0; i < retCoreNum; i++) {
121         printf("==========retCoreList:%d\n", retCoreList[i]);
122         ASSERT_EQ(retCoreList[i], coreList[i]);
123     }
124 }
125 
126 /*
127  * @tc.name: Context_Enable_Parallel
128  * @tc.desc: Verify the OH_AI_ContextSetEnableParallel/OH_AI_ContextGetEnableParallel function.
129  * @tc.type: FUNC
130  */
131 HWTEST(MSLiteTest, Context_Enable_Parallel, testing::ext::TestSize.Level0) {
132     printf("==========Init Context==========\n");
133     OH_AI_ContextHandle context = OH_AI_ContextCreate();
134     ASSERT_NE(context, nullptr);
135     OH_AI_ContextSetThreadNum(context, 4);
136     auto thread_num = OH_AI_ContextGetThreadNum(context);
137     printf("==========thread_num: %d\n", thread_num);
138     ASSERT_EQ(thread_num, 4);
139 
140     OH_AI_ContextSetEnableParallel(context, true);
141     bool isParallel = OH_AI_ContextGetEnableParallel(context);
142     printf("==========isParallel:%d\n", isParallel);
143     ASSERT_EQ(isParallel, true);
144 
145     AddContextDeviceCPU(context);
146     printf("==========Create model==========\n");
147     OH_AI_ModelHandle model = OH_AI_ModelCreate();
148     ASSERT_NE(model, nullptr);
149     ModelPredict(model, context, "ml_face_isface", {}, false, true, false);
150 }
151 
152 /*
153  * @tc.name: Context_Enable_FP16
154  * @tc.desc: Verify the OH_AI_DeviceInfoSetEnableFP16/OH_AI_DeviceInfoGetEnableFP16 function.
155  * @tc.type: FUNC
156  */
157 HWTEST(MSLiteTest, Context_Enable_FP16, testing::ext::TestSize.Level0) {
158     printf("==========Init Context==========\n");
159     OH_AI_ContextHandle context = OH_AI_ContextCreate();
160     ASSERT_NE(context, nullptr);
161 
162     OH_AI_DeviceInfoHandle cpu_device_info = OH_AI_DeviceInfoCreate(OH_AI_DEVICETYPE_CPU);
163     ASSERT_NE(cpu_device_info, nullptr);
164     OH_AI_DeviceInfoSetEnableFP16(cpu_device_info, true);
165     bool isFp16 = OH_AI_DeviceInfoGetEnableFP16(cpu_device_info);
166     printf("==========isFp16:%d\n", isFp16);
167     ASSERT_EQ(isFp16, true);
168 
169     OH_AI_ContextAddDeviceInfo(context, cpu_device_info);
170 
171     printf("==========Create model==========\n");
172     OH_AI_ModelHandle model = OH_AI_ModelCreate();
173     ASSERT_NE(model, nullptr);
174     ModelPredict(model, context, "ml_face_isface", {}, false, true, false);
175 }
176 
177 /*
178  * @tc.name: Context_Provider
179  * @tc.desc: Verify the OH_AI_DeviceInfoSetProvider/OH_AI_DeviceInfoGetProvider function.
180  * @tc.type: FUNC
181  */
182 HWTEST(MSLiteTest, Context_Provider, testing::ext::TestSize.Level0) {
183     printf("==========Init Context==========\n");
184     OH_AI_ContextHandle context = OH_AI_ContextCreate();
185     ASSERT_NE(context, nullptr);
186 
187     OH_AI_DeviceInfoHandle cpu_device_info = OH_AI_DeviceInfoCreate(OH_AI_DEVICETYPE_CPU);
188     ASSERT_NE(cpu_device_info, nullptr);
189     OH_AI_DeviceInfoSetProvider(cpu_device_info, "vendor_new");
190     ASSERT_EQ(strcmp(OH_AI_DeviceInfoGetProvider(cpu_device_info), "vendor_new"), 0);
191 
192     OH_AI_ContextAddDeviceInfo(context, cpu_device_info);
193 
194     printf("==========Create model==========\n");
195     OH_AI_ModelHandle model = OH_AI_ModelCreate();
196     ASSERT_NE(model, nullptr);
197     ModelPredict(model, context, "ml_face_isface", {}, false, true, false);
198 }
199 
200 /*
201  * @tc.name: Context_Provider_Device
202  * @tc.desc: Verify the OH_AI_DeviceInfoSetProviderDevice/OH_AI_DeviceInfoGetProviderDevice function.
203  * @tc.type: FUNC
204  */
205 HWTEST(MSLiteTest, Context_Provider_Device, testing::ext::TestSize.Level0) {
206     printf("==========Init Context==========\n");
207     OH_AI_ContextHandle context = OH_AI_ContextCreate();
208     ASSERT_NE(context, nullptr);
209 
210     OH_AI_DeviceInfoHandle cpu_device_info = OH_AI_DeviceInfoCreate(OH_AI_DEVICETYPE_CPU);
211     ASSERT_NE(cpu_device_info, nullptr);
212     OH_AI_DeviceInfoSetProviderDevice(cpu_device_info, "cpu_new");
213     ASSERT_EQ(strcmp(OH_AI_DeviceInfoGetProviderDevice(cpu_device_info), "cpu_new"), 0);
214 
215     OH_AI_ContextAddDeviceInfo(context, cpu_device_info);
216 
217     printf("==========Create model==========\n");
218     OH_AI_ModelHandle model = OH_AI_ModelCreate();
219     ASSERT_NE(model, nullptr);
220     ModelPredict(model, context, "ml_face_isface", {}, false, true, false);
221 }
222 
223 /*
224  * @tc.name: Context_Device
225  * @tc.desc: Verify the OH_AI_DeviceInfoCreate/OH_AI_DeviceInfoDestroy function.
226  * @tc.type: FUNC
227  */
228 HWTEST(MSLiteTest, Context_Device, testing::ext::TestSize.Level0) {
229     OH_AI_DeviceInfoHandle cpu_device_info = OH_AI_DeviceInfoCreate(OH_AI_DEVICETYPE_CPU);
230     ASSERT_NE(cpu_device_info, nullptr);
231     OH_AI_DeviceType device_type = OH_AI_DeviceInfoGetDeviceType(cpu_device_info);
232     printf("==========device_type:%d\n", device_type);
233     ASSERT_EQ(device_type, OH_AI_DEVICETYPE_CPU);
234 
235     OH_AI_DeviceInfoDestroy(&cpu_device_info);
236     ASSERT_EQ(cpu_device_info, nullptr);
237 }
238 
239 /*
240  * @tc.name: Context_Kirin_Frequency
241  * @tc.desc: Verify the OH_AI_DeviceInfoSetFrequency/OH_AI_DeviceInfoGetFrequency function.
242  * @tc.type: FUNC
243  */
244 HWTEST(MSLiteTest, Context_Kirin_Frequency, testing::ext::TestSize.Level0) {
245     printf("==========Init Context==========\n");
246     OH_AI_ContextHandle context = OH_AI_ContextCreate();
247     ASSERT_NE(context, nullptr);
248 
249     OH_AI_DeviceInfoHandle npu_device_info = OH_AI_DeviceInfoCreate(OH_AI_DEVICETYPE_KIRIN_NPU);
250     ASSERT_NE(npu_device_info, nullptr);
251     OH_AI_DeviceInfoSetFrequency(npu_device_info, 1);
252     int frequency = OH_AI_DeviceInfoGetFrequency(npu_device_info);
253     printf("==========frequency:%d\n", frequency);
254     ASSERT_EQ(frequency, 1);
255     OH_AI_ContextAddDeviceInfo(context, npu_device_info);
256 
257     OH_AI_ContextDestroy(&context);
258     ASSERT_EQ(context, nullptr);
259 }
260 
261 /*
262  * @tc.name: Model_BuildByBuffer
263  * @tc.desc: Verify the OH_AI_ModelBuild function.
264  * @tc.type: FUNC
265  */
266 HWTEST(MSLiteTest, Model_BuildByBuffer, testing::ext::TestSize.Level0) {
267     printf("==========Init Context==========\n");
268     OH_AI_ContextHandle context = OH_AI_ContextCreate();
269     ASSERT_NE(context, nullptr);
270 
271     AddContextDeviceCPU(context);
272     printf("==========Create model==========\n");
273     OH_AI_ModelHandle model = OH_AI_ModelCreate();
274     ASSERT_NE(model, nullptr);
275     ModelPredict(model, context, "ml_face_isface", {}, true, true, false);
276 }
277 
278 /*
279  * @tc.name: Model_GetOutputs
280  * @tc.desc: Verify the OH_AI_ModelGetOutputs/OH_AI_ModelGetInputs function.
281  * @tc.type: FUNC
282  */
283 HWTEST(MSLiteTest, Model_GetOutputs, testing::ext::TestSize.Level0) {
284     printf("==========Init Context==========\n");
285     OH_AI_ContextHandle context = OH_AI_ContextCreate();
286     ASSERT_NE(context, nullptr);
287 
288     AddContextDeviceCPU(context);
289     printf("==========Create model==========\n");
290     OH_AI_ModelHandle model = OH_AI_ModelCreate();
291     ASSERT_NE(model, nullptr);
292     printf("==========Model build==========\n");
293     OH_AI_ModelBuildFromFile(model, "/data/test/resource/ml_face_isface.ms", OH_AI_MODELTYPE_MINDIR, context);
294 
295     printf("==========Model Predict==========\n");
296     OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
297     OH_AI_TensorHandleArray output;
298     FillInputsData(inputs, "ml_face_isface", false);
299     OH_AI_Status ret = OH_AI_ModelPredict(model, inputs, &output, nullptr, nullptr);
300     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
301 
302     printf("==========GetOutput==========\n");
303     OH_AI_TensorHandleArray outputs = OH_AI_ModelGetOutputs(model);
304     for (size_t i = 0; i < outputs.handle_num; ++i) {
305         OH_AI_TensorHandle tensor = outputs.handle_list[i];
306         int64_t elementNum = OH_AI_TensorGetElementNum(tensor);
307         printf("Tensor name: %s, elements num: %" PRId64 ".\n", OH_AI_TensorGetName(tensor), elementNum);
308         float *outputData = reinterpret_cast<float *>(OH_AI_TensorGetMutableData(tensor));
309         printf("output data is:");
310         constexpr int printNum = 20;
311         for (int j = 0; j < elementNum && j <= printNum; ++j) {
312             printf("%f ", outputData[j]);
313         }
314         printf("\n");
315         printf("==========compFp32WithTData==========\n");
316         std::string expectedDataFile = g_testFilesDir + "ml_face_isface" + std::to_string(i) + ".output";
317         bool result = compFp32WithTData(outputData, expectedDataFile, 0.01, 0.01, false);
318         EXPECT_EQ(result, true);
319     }
320 }
321 
322 /*
323  * @tc.name: Model_Resize
324  * @tc.desc: Verify the OH_AI_ModelResize function.
325  * @tc.type: FUNC
326  */
327 HWTEST(MSLiteTest, Model_Resize, testing::ext::TestSize.Level0) {
328     printf("==========Init Context==========\n");
329     OH_AI_ContextHandle context = OH_AI_ContextCreate();
330     ASSERT_NE(context, nullptr);
331 
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_ocr_cn", {4, {1, 32, 512, 1}}, false, true, false);
337 }
338 
339 /*
340  * @tc.name: Model_GetInputByTensorName
341  * @tc.desc: Verify the OH_AI_ModelGetInputByTensorName function.
342  * @tc.type: FUNC
343  */
344 HWTEST(MSLiteTest, Model_GetInputByTensorName, testing::ext::TestSize.Level0) {
345     printf("==========ReadFile==========\n");
346     size_t size1;
347     size_t *ptrSize1 = &size1;
348     const char *imagePath = "/data/test/resource/ml_face_isface.input";
349     char *imageBuf = ReadFile(imagePath, ptrSize1);
350     ASSERT_NE(imageBuf, nullptr);
351 
352     printf("==========Init Context==========\n");
353     OH_AI_ContextHandle context = OH_AI_ContextCreate();
354     ASSERT_NE(context, nullptr);
355     AddContextDeviceCPU(context);
356     printf("==========Create model==========\n");
357     OH_AI_ModelHandle model = OH_AI_ModelCreate();
358     ASSERT_NE(model, nullptr);
359     printf("==========Build model==========\n");
360     OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/resource/ml_face_isface.ms", OH_AI_MODELTYPE_MINDIR,
361                                                 context);
362     printf("==========build model return code:%d\n", ret);
363     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
364 
365     printf("==========GetInputs==========\n");
366     OH_AI_TensorHandle tensor = OH_AI_ModelGetInputByTensorName(model, "data");
367     ASSERT_NE(tensor, nullptr);
368     int64_t elementNum = OH_AI_TensorGetElementNum(tensor);
369     printf("Tensor name: %s, elements num: %" PRId64 ".\n", OH_AI_TensorGetName(tensor), elementNum);
370     float *inputData = reinterpret_cast<float *>(OH_AI_TensorGetMutableData(tensor));
371     ASSERT_NE(inputData, nullptr);
372     printf("==========Transpose==========\n");
373     size_t shapeNum;
374     const int64_t *shape = OH_AI_TensorGetShape(tensor, &shapeNum);
375     auto imageBufNhwc = new char[size1];
376     PackNCHWToNHWCFp32(imageBuf, imageBufNhwc, shape[0], shape[1] * shape[2], shape[3]);
377     errno_t mRet = memcpy_s(inputData, size1, imageBufNhwc, size1);
378     if (mRet != EOK) {
379         printf("memcpy_s failed, ret: %d\n", mRet);
380     }
381     printf("input data is:");
382     constexpr int printNum = 20;
383     for (int j = 0; j < elementNum && j <= printNum; ++j) {
384         printf("%f ", inputData[j]);
385     }
386     printf("\n");
387 
388     printf("==========Model Predict==========\n");
389     OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
390     ASSERT_NE(inputs.handle_list, nullptr);
391     OH_AI_TensorHandleArray outputs;
392     ret = OH_AI_ModelPredict(model, inputs, &outputs, nullptr, nullptr);
393     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
394     CompareResult(outputs, "ml_face_isface");
395     delete[] imageBuf;
396     OH_AI_ModelDestroy(&model);
397 }
398 
399 /*
400  * @tc.name: Model_GetOutputByTensorName
401  * @tc.desc: Verify the OH_AI_ModelGetOutputByTensorName function.
402  * @tc.type: FUNC
403  */
404 HWTEST(MSLiteTest, Model_GetOutputByTensorName, testing::ext::TestSize.Level0) {
405     printf("==========Init Context==========\n");
406     OH_AI_ContextHandle context = OH_AI_ContextCreate();
407     ASSERT_NE(context, nullptr);
408     AddContextDeviceCPU(context);
409     printf("==========Create model==========\n");
410     OH_AI_ModelHandle model = OH_AI_ModelCreate();
411     ASSERT_NE(model, nullptr);
412     printf("==========Build model==========\n");
413     OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/resource/ml_face_isface.ms", OH_AI_MODELTYPE_MINDIR,
414                                                 context);
415     printf("==========build model return code:%d\n", ret);
416     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
417 
418     printf("==========GetInputs==========\n");
419     OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
420     ASSERT_NE(inputs.handle_list, nullptr);
421     FillInputsData(inputs, "ml_face_isface", true);
422     printf("==========Model Predict==========\n");
423     OH_AI_TensorHandleArray outputs;
424     ret = OH_AI_ModelPredict(model, inputs, &outputs, nullptr, nullptr);
425     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
426 
427     printf("==========GetOutput==========\n");
428     OH_AI_TensorHandle tensor = OH_AI_ModelGetOutputByTensorName(model, "prob");
429     ASSERT_NE(tensor, nullptr);
430     int64_t elementNum = OH_AI_TensorGetElementNum(tensor);
431     printf("Tensor name: %s, elements num: %" PRId64 ".\n", OH_AI_TensorGetName(tensor), elementNum);
432     float *outputData = reinterpret_cast<float *>(OH_AI_TensorGetMutableData(tensor));
433     printf("output data is:");
434     constexpr int printNum = 20;
435     for (int j = 0; j < elementNum && j <= printNum; ++j) {
436         printf("%f ", outputData[j]);
437     }
438     printf("\n");
439     printf("==========compFp32WithTData==========\n");
440     bool result = compFp32WithTData(outputData, g_testFilesDir + "ml_face_isface0.output", 0.01, 0.01, false);
441     EXPECT_EQ(result, true);
442     OH_AI_ModelDestroy(&model);
443 }
444 
445 /*
446  * @tc.name: TrainCfg_CreateDestroy
447  * @tc.desc: Verify the OH_AI_TrainCfgCreate/OH_AI_TrainCfgDestroy function.
448  * @tc.type: FUNC
449  */
450 HWTEST(MSLiteTest, TrainCfg_CreateDestroy, testing::ext::TestSize.Level0) {
451     OH_AI_TrainCfgHandle trainCfg = OH_AI_TrainCfgCreate();
452     ASSERT_NE(trainCfg, nullptr);
453 
454     OH_AI_TrainCfgDestroy(&trainCfg);
455     ASSERT_EQ(trainCfg, nullptr);
456 }
457 
458 /*
459  * @tc.name: TrainCfg_LossName
460  * @tc.desc: Verify the OH_AI_TrainCfgSetLossName/OH_AI_TrainCfgGetLossName function.
461  * @tc.type: FUNC
462  */
463 HWTEST(MSLiteTest, TrainCfg_LossName, testing::ext::TestSize.Level0) {
464     OH_AI_TrainCfgHandle trainCfg = OH_AI_TrainCfgCreate();
465     ASSERT_NE(trainCfg, nullptr);
466     std::vector<std::string> set_train_cfg_loss_name = {"loss_fct"};
467     char **setLossName = TransStrVectorToCharArrays(set_train_cfg_loss_name);
468     OH_AI_TrainCfgSetLossName(trainCfg, const_cast<const char **>(setLossName), set_train_cfg_loss_name.size());
469 
470     size_t getNum = 0;
471     char **getLossName = OH_AI_TrainCfgGetLossName(trainCfg, &getNum);
472     printf("trainCfg loss name: ");
473     for (size_t i = 0; i < getNum; i++) {
474         printf("%s ", getLossName[i]);
475     }
476     printf("\n");
477     ASSERT_EQ(strcmp(getLossName[0], "loss_fct"), 0);
478 
479     for (size_t i = 0; i < getNum; i++) {
480         free(setLossName[i]);
481         free(getLossName[i]);
482     }
483     free(setLossName);
484     free(getLossName);
485     OH_AI_TrainCfgDestroy(&trainCfg);
486 }
487 
488 /*
489  * @tc.name: TrainCfg_OptimizationLevel
490  * @tc.desc: Verify the OH_AI_TrainCfgSetOptimizationLevel/OH_AI_TrainCfgGetOptimizationLevel function.
491  * @tc.type: FUNC
492  */
493 HWTEST(MSLiteTest, TrainCfg_OptimizationLevel, testing::ext::TestSize.Level0) {
494     OH_AI_TrainCfgHandle trainCfg = OH_AI_TrainCfgCreate();
495     ASSERT_NE(trainCfg, nullptr);
496 
497     OH_AI_OptimizationLevel optim_level = OH_AI_KO2;
498     OH_AI_TrainCfgSetOptimizationLevel(trainCfg, optim_level);
499     OH_AI_OptimizationLevel get_optim_level = OH_AI_TrainCfgGetOptimizationLevel(trainCfg);
500     ASSERT_EQ(get_optim_level, OH_AI_KO2);
501 
502     OH_AI_TrainCfgDestroy(&trainCfg);
503     ASSERT_EQ(trainCfg, nullptr);
504 }
505 
506 /*
507  * @tc.name: Model_TrainModelBuild
508  * @tc.desc: Verify the OH_AI_TrainModelBuild function.
509  * @tc.type: FUNC
510  */
511 HWTEST(MSLiteTest, Model_TrainModelBuild, testing::ext::TestSize.Level0) {
512     printf("==========OH_AI_ContextCreate==========\n");
513     OH_AI_ContextHandle context = OH_AI_ContextCreate();
514     ASSERT_NE(context, nullptr);
515     AddContextDeviceCPU(context);
516     printf("==========OH_AI_ModelCreate==========\n");
517     OH_AI_ModelHandle model = OH_AI_ModelCreate();
518     ASSERT_NE(model, nullptr);
519 
520     printf("==========OH_AI_RunStep==========\n");
521     ModelTrain(model, context, "lenet_train", {}, true, false, false);
522     printf("==========OH_AI_ExportModel==========\n");
523     auto status = OH_AI_ExportModel(model, OH_AI_MODELTYPE_MINDIR, "/data/test/resource/lenet_train_infer.ms",
524                                     OH_AI_NO_QUANT, true, nullptr, 0);
525     ASSERT_EQ(status, OH_AI_STATUS_SUCCESS);
526     OH_AI_ModelDestroy(&model);
527 
528     printf("==========OH_AI_ModelCreate2==========\n");
529     context = OH_AI_ContextCreate();
530     ASSERT_NE(context, nullptr);
531     AddContextDeviceCPU(context);
532     OH_AI_ModelHandle model2 = OH_AI_ModelCreate();
533     ASSERT_NE(model2, nullptr);
534     printf("==========ModelPredict==========\n");
535     ModelPredict(model2, context, "lenet_train_infer", {}, true, false, true);
536 }
537 
538 /*
539  * @tc.name: Model_LearningRate
540  * @tc.desc: Verify the OH_AI_ModelGetLearningRate/OH_AI_ModelSetLearningRate function.
541  * @tc.type: FUNC
542  */
543 HWTEST(MSLiteTest, Model_LearningRate, testing::ext::TestSize.Level0) {
544     printf("==========OH_AI_ContextCreate==========\n");
545     OH_AI_ContextHandle context = OH_AI_ContextCreate();
546     ASSERT_NE(context, nullptr);
547     AddContextDeviceCPU(context);
548     printf("==========OH_AI_ModelCreate==========\n");
549     OH_AI_ModelHandle model = OH_AI_ModelCreate();
550     ASSERT_NE(model, nullptr);
551 
552     printf("==========OH_AI_TrainCfgCreate==========\n");
553     OH_AI_TrainCfgHandle train_cfg = OH_AI_TrainCfgCreate();
554     ASSERT_NE(train_cfg, nullptr);
555     printf("==========OH_AI_TrainModelBuildFromFile==========\n");
556     auto status = OH_AI_TrainModelBuildFromFile(model, "/data/test/resource/lenet_train.ms", OH_AI_MODELTYPE_MINDIR,
557                                                 context, train_cfg);
558     ASSERT_EQ(status, OH_AI_STATUS_SUCCESS);
559 
560     auto learing_rate = OH_AI_ModelGetLearningRate(model);
561     printf("learing_rate: %f\n", learing_rate);
562     status = OH_AI_ModelSetLearningRate(model, 0.01f);
563     ASSERT_EQ(status, OH_AI_STATUS_SUCCESS);
564     learing_rate = OH_AI_ModelGetLearningRate(model);
565     printf("get_learing_rate: %f", learing_rate);
566     ASSERT_EQ(learing_rate, 0.01f);
567 
568     printf("==========GetInputs==========\n");
569     OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
570     ASSERT_NE(inputs.handle_list, nullptr);
571     FillInputsData(inputs, "lenet_train", false);
572     status = OH_AI_ModelSetTrainMode(model, true);
573     ASSERT_EQ(status, OH_AI_STATUS_SUCCESS);
574     printf("==========Model RunStep==========\n");
575     status = OH_AI_RunStep(model, nullptr, nullptr);
576     ASSERT_EQ(status, OH_AI_STATUS_SUCCESS);
577 
578     OH_AI_ModelDestroy(&model);
579 }
580 
581 /*
582  * @tc.name: Model_UpdateWeights
583  * @tc.desc: Verify the OH_AI_ModelUpdateWeights function.
584  * @tc.type: FUNC
585  */
586 HWTEST(MSLiteTest, Model_UpdateWeights, testing::ext::TestSize.Level0) {
587     printf("==========OH_AI_ContextCreate==========\n");
588     OH_AI_ContextHandle context = OH_AI_ContextCreate();
589     ASSERT_NE(context, nullptr);
590     AddContextDeviceCPU(context);
591     printf("==========OH_AI_ModelCreate==========\n");
592     OH_AI_ModelHandle model = OH_AI_ModelCreate();
593     ASSERT_NE(model, nullptr);
594 
595     printf("==========OH_AI_TrainCfgCreate==========\n");
596     OH_AI_TrainCfgHandle train_cfg = OH_AI_TrainCfgCreate();
597     ASSERT_NE(train_cfg, nullptr);
598     printf("==========OH_AI_TrainModelBuildFromFile==========\n");
599     auto status = OH_AI_TrainModelBuildFromFile(model, "/data/test/resource/lenet_train.ms", OH_AI_MODELTYPE_MINDIR,
600                                                 context, train_cfg);
601     ASSERT_EQ(status, OH_AI_STATUS_SUCCESS);
602 
__anonbd24530d0102(size_t size, void *data) 603     auto genRandomData = [](size_t size, void *data) {
604         auto generator = std::uniform_real_distribution<float>(0.0f, 1.0f);
605         std::mt19937 randomEngine;
606         size_t elementsNum = size / sizeof(float);
607         (void)std::generate_n(static_cast<float *>(data), elementsNum,
608                               [&]() { return static_cast<float>(generator(randomEngine)); });
609     };
610     std::vector<OH_AI_TensorHandle> vec_inputs;
611     constexpr size_t createShapeNum = 1;
612     int64_t createShape[createShapeNum] = {10};
613     OH_AI_TensorHandle tensor = OH_AI_TensorCreate("fc3.bias", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, createShape,
614                                                    createShapeNum, nullptr, 0);
615     ASSERT_NE(tensor, nullptr);
616     genRandomData(OH_AI_TensorGetDataSize(tensor), OH_AI_TensorGetMutableData(tensor));
617     vec_inputs.push_back(tensor);
618 
619     OH_AI_TensorHandleArray update_weights = {1, vec_inputs.data()};
620     status = OH_AI_ModelUpdateWeights(model, update_weights);
621     ASSERT_EQ(status, OH_AI_STATUS_SUCCESS);
622     printf("==========GetInputs==========\n");
623     OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
624     ASSERT_NE(inputs.handle_list, nullptr);
625     FillInputsData(inputs, "lenet_train", false);
626     status = OH_AI_ModelSetTrainMode(model, true);
627     ASSERT_EQ(status, OH_AI_STATUS_SUCCESS);
628     printf("==========Model RunStep==========\n");
629     status = OH_AI_RunStep(model, nullptr, nullptr);
630     ASSERT_EQ(status, OH_AI_STATUS_SUCCESS);
631 
632     OH_AI_ModelDestroy(&model);
633 }
634 
635 /*
636  * @tc.name: Model_GetWeights
637  * @tc.desc: Verify the OH_AI_ModelGetWeights function.
638  * @tc.type: FUNC
639  */
640 HWTEST(MSLiteTest, Model_GetWeights, testing::ext::TestSize.Level0) {
641     printf("==========OH_AI_ContextCreate==========\n");
642     OH_AI_ContextHandle context = OH_AI_ContextCreate();
643     ASSERT_NE(context, nullptr);
644     AddContextDeviceCPU(context);
645     printf("==========OH_AI_ModelCreate==========\n");
646     OH_AI_ModelHandle model = OH_AI_ModelCreate();
647     ASSERT_NE(model, nullptr);
648     printf("==========OH_AI_TrainCfgCreate==========\n");
649     OH_AI_TrainCfgHandle train_cfg = OH_AI_TrainCfgCreate();
650     ASSERT_NE(train_cfg, nullptr);
651     printf("==========OH_AI_TrainModelBuildFromFile==========\n");
652     auto status = OH_AI_TrainModelBuildFromFile(model, "/data/test/resource/lenet_train.ms", OH_AI_MODELTYPE_MINDIR,
653                                                 context, train_cfg);
654     ASSERT_EQ(status, OH_AI_STATUS_SUCCESS);
655     OH_AI_TensorHandleArray get_update_weights = OH_AI_ModelGetWeights(model);
656     for (size_t i = 0; i < get_update_weights.handle_num; ++i) {
657         OH_AI_TensorHandle weights_tensor = get_update_weights.handle_list[i];
658         if (strcmp(OH_AI_TensorGetName(weights_tensor), "fc3.bias") == 0) {
659             float *inputData = reinterpret_cast<float *>(OH_AI_TensorGetMutableData(weights_tensor));
660             printf("fc3.bias: %f", inputData[0]);
661         }
662     }
__anonbd24530d0302(size_t size, void *data) 663     auto genRandomData = [](size_t size, void *data) {
664         auto generator = std::uniform_real_distribution<float>(0.0f, 1.0f);
665         std::mt19937 randomEngine;
666         size_t elementsNum = size / sizeof(float);
667         (void)std::generate_n(static_cast<float *>(data), elementsNum,
668                               [&]() { return static_cast<float>(generator(randomEngine)); });
669     };
670     std::vector<OH_AI_TensorHandle> vec_inputs;
671     constexpr size_t createShapeNum = 1;
672     int64_t createShape[createShapeNum] = {10};
673     OH_AI_TensorHandle tensor = OH_AI_TensorCreate("fc3.bias", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, createShape,
674                                                    createShapeNum, nullptr, 0);
675     ASSERT_NE(tensor, nullptr);
676     genRandomData(OH_AI_TensorGetDataSize(tensor), OH_AI_TensorGetMutableData(tensor));
677     vec_inputs.push_back(tensor);
678     OH_AI_TensorHandleArray update_weights = {1, vec_inputs.data()};
679     status = OH_AI_ModelUpdateWeights(model, update_weights);
680     ASSERT_EQ(status, OH_AI_STATUS_SUCCESS);
681     printf("==========GetInputs==========\n");
682     OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
683     ASSERT_NE(inputs.handle_list, nullptr);
684     FillInputsData(inputs, "lenet_train", false);
685     status = OH_AI_ModelSetTrainMode(model, true);
686     ASSERT_EQ(status, OH_AI_STATUS_SUCCESS);
687     printf("==========Model RunStep==========\n");
688     status = OH_AI_RunStep(model, nullptr, nullptr);
689     ASSERT_EQ(status, OH_AI_STATUS_SUCCESS);
690     printf("==========OH_AI_ExportModel==========\n");
691     status = OH_AI_ExportModel(model, OH_AI_MODELTYPE_MINDIR, "/data/test/resource/lenet_train_infer.ms",
692                                OH_AI_NO_QUANT, true, nullptr, 0);
693     ASSERT_EQ(status, OH_AI_STATUS_SUCCESS);
694     OH_AI_TensorHandleArray export_update_weights = OH_AI_ModelGetWeights(model);
695     for (size_t i = 0; i < export_update_weights.handle_num; ++i) {
696         OH_AI_TensorHandle weights_tensor = export_update_weights.handle_list[i];
697         if (strcmp(OH_AI_TensorGetName(weights_tensor), "fc3.bias") == 0) {
698             float *inputData = reinterpret_cast<float *>(OH_AI_TensorGetMutableData(weights_tensor));
699             printf("fc3.bias: %f", inputData[0]);
700         }
701     }
702 
703     OH_AI_ModelDestroy(&model);
704 }
705 
706 /*
707  * @tc.name: Model_SetupVirtualBatch
708  * @tc.desc: Verify the OH_AI_ModelSetupVirtualBatch/OH_AI_ExportModelBuffer function.
709  * @tc.type: FUNC
710  */
711 HWTEST(MSLiteTest, Model_SetupVirtualBatch, testing::ext::TestSize.Level0) {
712     printf("==========OH_AI_ContextCreate==========\n");
713     OH_AI_ContextHandle context = OH_AI_ContextCreate();
714     ASSERT_NE(context, nullptr);
715     AddContextDeviceCPU(context);
716     printf("==========OH_AI_ModelCreate==========\n");
717     OH_AI_ModelHandle model = OH_AI_ModelCreate();
718     ASSERT_NE(model, nullptr);
719     printf("==========OH_AI_TrainCfgCreate==========\n");
720     OH_AI_TrainCfgHandle train_cfg = OH_AI_TrainCfgCreate();
721     ASSERT_NE(train_cfg, nullptr);
722 
723     printf("==========OH_AI_TrainModelBuildFromFile==========\n");
724     auto status = OH_AI_TrainModelBuildFromFile(model, "/data/test/resource/lenet_train.ms", OH_AI_MODELTYPE_MINDIR,
725                                                 context, train_cfg);
726     ASSERT_EQ(status, OH_AI_STATUS_SUCCESS);
727     status = OH_AI_ModelSetupVirtualBatch(model, 2, -1.0f, -1.0f);
728     ASSERT_EQ(status, OH_AI_STATUS_SUCCESS);
729     printf("==========GetInputs==========\n");
730     OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
731     ASSERT_NE(inputs.handle_list, nullptr);
732     FillInputsData(inputs, "lenet_train", false);
733     status = OH_AI_ModelSetTrainMode(model, true);
734     ASSERT_EQ(status, OH_AI_STATUS_SUCCESS);
735     bool trainMode = OH_AI_ModelGetTrainMode(model);
736     printf("get train mode: %d\n", trainMode);
737     ASSERT_EQ(trainMode, true);
738 
739     printf("==========Model RunStep==========\n");
740     status = OH_AI_RunStep(model, nullptr, nullptr);
741     ASSERT_EQ(status, OH_AI_STATUS_SUCCESS);
742     printf("==========OH_AI_ExportModelBuffer==========\n");
743     char *modelBuffer;
744     size_t modelSize = 0;
745     status = OH_AI_ExportModelBuffer(model, OH_AI_MODELTYPE_MINDIR, &modelBuffer, &modelSize, OH_AI_NO_QUANT, true,
746                                      nullptr, 0);
747     printf("export model buffer size: %zu\n", modelSize);
748     ASSERT_EQ(status, OH_AI_STATUS_SUCCESS);
749     ASSERT_NE(modelBuffer, nullptr);
750 
751     OH_AI_ModelDestroy(&model);
752     free(modelBuffer);
753 }
754 
755 /*
756  * @tc.name: Model_ExportWeights
757  * @tc.desc: Verify the OH_AI_ExportWeightsCollaborateWithMicro function.
758  * @tc.type: FUNC
759  */
760 HWTEST(MSLiteTest, Model_ExportWeights, testing::ext::TestSize.Level0) {
761     printf("==========OH_AI_ContextCreate==========\n");
762     OH_AI_ContextHandle context = OH_AI_ContextCreate();
763     ASSERT_NE(context, nullptr);
764     AddContextDeviceCPU(context);
765     printf("==========OH_AI_ModelCreate==========\n");
766     OH_AI_ModelHandle model = OH_AI_ModelCreate();
767     ASSERT_NE(model, nullptr);
768     printf("==========OH_AI_TrainCfgCreate==========\n");
769     OH_AI_TrainCfgHandle train_cfg = OH_AI_TrainCfgCreate();
770     ASSERT_NE(train_cfg, nullptr);
771 
772     printf("==========OH_AI_TrainModelBuildFromFile==========\n");
773     auto status = OH_AI_TrainModelBuildFromFile(model, "/data/test/resource/xiaoyi_train_codegen.ms",
774                                                 OH_AI_MODELTYPE_MINDIR, context, train_cfg);
775     ASSERT_EQ(status, OH_AI_STATUS_SUCCESS);
776     printf("==========OH_AI_ExportModel==========\n");
777     status = OH_AI_ExportModel(model, OH_AI_MODELTYPE_MINDIR, "/data/test/resource/xiaoyi_train_codegen_gru_model1.ms",
778                                OH_AI_NO_QUANT, true, nullptr, 0);
779     ASSERT_EQ(status, OH_AI_STATUS_SUCCESS);
780     status = OH_AI_ExportWeightsCollaborateWithMicro(model, OH_AI_MODELTYPE_MINDIR,
781                                                      "/data/test/resource/xiaoyi_train_codegen_net1.bin", true, true,
782                                                      nullptr, 0);
783     ASSERT_EQ(status, OH_AI_STATUS_SUCCESS);
784     status = OH_AI_ExportWeightsCollaborateWithMicro(model, OH_AI_MODELTYPE_MINDIR,
785                                                      "/data/test/resource/xiaoyi_train_codegen_net1_fp32.bin", true,
786                                                      false, nullptr, 0);
787     ASSERT_EQ(status, OH_AI_STATUS_SUCCESS);
788 
789     OH_AI_ModelDestroy(&model);
790 }
791 
792 /*
793  * @tc.name: Tensor_Create
794  * @tc.desc: Verify the OH_AI_TensorCreate function.
795  * @tc.type: FUNC
796  */
797 HWTEST(MSLiteTest, Tensor_Create, testing::ext::TestSize.Level0) {
798     printf("==========Init Context==========\n");
799     OH_AI_ContextHandle context = OH_AI_ContextCreate();
800     ASSERT_NE(context, nullptr);
801     AddContextDeviceCPU(context);
802     printf("==========Create model==========\n");
803     OH_AI_ModelHandle model = OH_AI_ModelCreate();
804     ASSERT_NE(model, nullptr);
805     printf("==========Build model==========\n");
806     OH_AI_Status ret = OH_AI_ModelBuildFromFile(model, "/data/test/resource/ml_face_isface.ms", OH_AI_MODELTYPE_MINDIR,
807                                                 context);
808     printf("==========build model return code:%d\n", ret);
809     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
810     printf("==========GetInputs==========\n");
811     constexpr size_t createShapeNum = 4;
812     int64_t createShape[createShapeNum] = {1, 48, 48, 3};
813     OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, createShape,
814                                                    createShapeNum, nullptr, 0);
815     ASSERT_NE(tensor, nullptr);
816     OH_AI_TensorHandleArray inputs = OH_AI_ModelGetInputs(model);
817     inputs.handle_list[0] = tensor;
818     FillInputsData(inputs, "ml_face_isface", true);
819     printf("==========Model Predict==========\n");
820     OH_AI_TensorHandleArray outputs;
821     ret = OH_AI_ModelPredict(model, inputs, &outputs, nullptr, nullptr);
822     ASSERT_EQ(ret, OH_AI_STATUS_SUCCESS);
823     CompareResult(outputs, "ml_face_isface");
824     OH_AI_ModelDestroy(&model);
825 }
826 
827 /*
828  * @tc.name: Tensor_Destroy
829  * @tc.desc: Verify the OH_AI_TensorDestroy function.
830  * @tc.type: FUNC
831  */
832 HWTEST(MSLiteTest, Tensor_Destroy, testing::ext::TestSize.Level0) {
833     printf("==========ReadFile==========\n");
834     size_t size1;
835     size_t *ptrSize1 = &size1;
836     const char *imagePath = "/data/test/resource/ml_face_isface.input";
837     char *imageBuf = ReadFile(imagePath, ptrSize1);
838     ASSERT_NE(imageBuf, nullptr);
839     printf("==========OH_AI_TensorCreate==========\n");
840     constexpr size_t createShapeNum = 4;
841     int64_t createShape[createShapeNum] = {1, 48, 48, 3};
842     OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, createShape,
843                                                    createShapeNum, imageBuf, size1);
844     ASSERT_NE(tensor, nullptr);
845     delete[] imageBuf;
846     OH_AI_TensorDestroy(&tensor);
847     ASSERT_EQ(tensor, nullptr);
848 }
849 
850 /*
851  * @tc.name: Tensor_Clone
852  * @tc.desc: Verify the OH_AI_TensorClone function.
853  * @tc.type: FUNC
854  */
855 HWTEST(MSLiteTest, Tensor_Clone, testing::ext::TestSize.Level0) {
856     printf("==========ReadFile==========\n");
857     size_t size1;
858     size_t *ptrSize1 = &size1;
859     const char *imagePath = "/data/test/resource/ml_face_isface.input";
860     char *imageBuf = ReadFile(imagePath, ptrSize1);
861     ASSERT_NE(imageBuf, nullptr);
862     printf("==========OH_AI_TensorCreate==========\n");
863     constexpr size_t createShapeNum = 4;
864     int64_t createShape[createShapeNum] = {1, 48, 48, 3};
865     OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, createShape,
866                                                    createShapeNum, imageBuf, size1);
867     ASSERT_NE(tensor, nullptr);
868     OH_AI_TensorHandle clone = OH_AI_TensorClone(tensor);
869     ASSERT_NE(clone, nullptr);
870     ASSERT_EQ(strcmp(OH_AI_TensorGetName(clone), "data_duplicate"), 0);
871     delete[] imageBuf;
872     OH_AI_TensorDestroy(&tensor);
873     OH_AI_TensorDestroy(&clone);
874 }
875 
876 /*
877  * @tc.name: Tensor_GetName
878  * @tc.desc: Verify the OH_AI_TensorGetName function.
879  * @tc.type: FUNC
880  */
881 HWTEST(MSLiteTest, Tensor_GetName, testing::ext::TestSize.Level0) {
882     printf("==========ReadFile==========\n");
883     size_t size1;
884     size_t *ptrSize1 = &size1;
885     const char *imagePath = "/data/test/resource/ml_face_isface.input";
886     char *imageBuf = ReadFile(imagePath, ptrSize1);
887     ASSERT_NE(imageBuf, nullptr);
888     printf("==========OH_AI_TensorCreate==========\n");
889     constexpr size_t createShapeNum = 4;
890     int64_t createShape[createShapeNum] = {1, 48, 48, 3};
891     OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, createShape,
892                                                    createShapeNum, imageBuf, size1);
893     ASSERT_NE(tensor, nullptr);
894     const char *tensorName = OH_AI_TensorGetName(tensor);
895     ASSERT_EQ(strcmp(tensorName, "data"), 0);
896     delete[] imageBuf;
897     OH_AI_TensorDestroy(&tensor);
898 }
899 
900 /*
901  * @tc.name: Tensor_SetName
902  * @tc.desc: Verify the OH_AI_TensorSetName function.
903  * @tc.type: FUNC
904  */
905 HWTEST(MSLiteTest, Tensor_SetName, testing::ext::TestSize.Level0) {
906     printf("==========ReadFile==========\n");
907     size_t size1;
908     size_t *ptrSize1 = &size1;
909     const char *imagePath = "/data/test/resource/ml_face_isface.input";
910     char *imageBuf = ReadFile(imagePath, ptrSize1);
911     ASSERT_NE(imageBuf, nullptr);
912     printf("==========OH_AI_TensorCreate==========\n");
913     constexpr size_t createShapeNum = 4;
914     int64_t createShape[createShapeNum] = {1, 48, 48, 3};
915     OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, createShape,
916                                                    createShapeNum, imageBuf, size1);
917     ASSERT_NE(tensor, nullptr);
918     OH_AI_TensorSetName(tensor, "new_data");
919     const char *tensorName = OH_AI_TensorGetName(tensor);
920     ASSERT_EQ(strcmp(tensorName, "new_data"), 0);
921     delete[] imageBuf;
922     OH_AI_TensorDestroy(&tensor);
923 }
924 
925 /*
926  * @tc.name: Tensor_GetDataType
927  * @tc.desc: Verify the OH_AI_TensorGetDataType function.
928  * @tc.type: FUNC
929  */
930 HWTEST(MSLiteTest, Tensor_GetDataType, testing::ext::TestSize.Level0) {
931     printf("==========ReadFile==========\n");
932     size_t size1;
933     size_t *ptrSize1 = &size1;
934     const char *imagePath = "/data/test/resource/ml_face_isface.input";
935     char *imageBuf = ReadFile(imagePath, ptrSize1);
936     ASSERT_NE(imageBuf, nullptr);
937     printf("==========OH_AI_TensorCreate==========\n");
938     constexpr size_t createShapeNum = 4;
939     int64_t createShape[createShapeNum] = {1, 48, 48, 3};
940     OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, createShape,
941                                                    createShapeNum, imageBuf, size1);
942     ASSERT_NE(tensor, nullptr);
943     OH_AI_DataType data_type = OH_AI_TensorGetDataType(tensor);
944     ASSERT_EQ(data_type, OH_AI_DATATYPE_NUMBERTYPE_FLOAT32);
945     delete[] imageBuf;
946     OH_AI_TensorDestroy(&tensor);
947 }
948 
949 /*
950  * @tc.name: Tensor_SetDataType
951  * @tc.desc: Verify the OH_AI_TensorSetDataType function.
952  * @tc.type: FUNC
953  */
954 HWTEST(MSLiteTest, Tensor_SetDataType, testing::ext::TestSize.Level0) {
955     printf("==========ReadFile==========\n");
956     size_t size1;
957     size_t *ptrSize1 = &size1;
958     const char *imagePath = "/data/test/resource/ml_face_isface.input";
959     char *imageBuf = ReadFile(imagePath, ptrSize1);
960     ASSERT_NE(imageBuf, nullptr);
961     printf("==========OH_AI_TensorCreate==========\n");
962     constexpr size_t createShapeNum = 4;
963     int64_t createShape[createShapeNum] = {1, 48, 48, 3};
964     OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, createShape,
965                                                    createShapeNum, imageBuf, size1);
966     ASSERT_NE(tensor, nullptr);
967     OH_AI_TensorSetDataType(tensor, OH_AI_DATATYPE_NUMBERTYPE_FLOAT16);
968     OH_AI_DataType data_type = OH_AI_TensorGetDataType(tensor);
969     ASSERT_EQ(data_type, OH_AI_DATATYPE_NUMBERTYPE_FLOAT16);
970     delete[] imageBuf;
971     OH_AI_TensorDestroy(&tensor);
972 }
973 
974 /*
975  * @tc.name: Tensor_GetShape
976  * @tc.desc: Verify the OH_AI_TensorGetShape function.
977  * @tc.type: FUNC
978  */
979 HWTEST(MSLiteTest, Tensor_GetShape, testing::ext::TestSize.Level0) {
980     printf("==========ReadFile==========\n");
981     size_t size1;
982     size_t *ptrSize1 = &size1;
983     const char *imagePath = "/data/test/resource/ml_face_isface.input";
984     char *imageBuf = ReadFile(imagePath, ptrSize1);
985     ASSERT_NE(imageBuf, nullptr);
986     printf("==========OH_AI_TensorCreate==========\n");
987     constexpr size_t createShapeNum = 4;
988     int64_t createShape[createShapeNum] = {1, 48, 48, 3};
989     OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, createShape,
990                                                    createShapeNum, imageBuf, size1);
991     ASSERT_NE(tensor, nullptr);
992     size_t retShapeNum;
993     const int64_t *retShape = OH_AI_TensorGetShape(tensor, &retShapeNum);
994     ASSERT_EQ(retShapeNum, createShapeNum);
995     for (size_t i = 0; i < retShapeNum; i++) {
996         ASSERT_EQ(retShape[i], createShape[i]);
997     }
998     delete[] imageBuf;
999     OH_AI_TensorDestroy(&tensor);
1000 }
1001 
1002 /*
1003  * @tc.name: Tensor_SetShape
1004  * @tc.desc: Verify the OH_AI_TensorSetShape function.
1005  * @tc.type: FUNC
1006  */
1007 HWTEST(MSLiteTest, Tensor_SetShape, testing::ext::TestSize.Level0) {
1008     printf("==========ReadFile==========\n");
1009     size_t size1;
1010     size_t *ptrSize1 = &size1;
1011     const char *imagePath = "/data/test/resource/ml_face_isface.input";
1012     char *imageBuf = ReadFile(imagePath, ptrSize1);
1013     ASSERT_NE(imageBuf, nullptr);
1014     printf("==========OH_AI_TensorCreate==========\n");
1015     constexpr size_t createShapeNum = 4;
1016     int64_t createShape[createShapeNum] = {1, 48, 48, 3};
1017     OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, createShape,
1018                                                    createShapeNum, imageBuf, size1);
1019     ASSERT_NE(tensor, nullptr);
1020     size_t retShapeNum;
1021     const int64_t *retShape = OH_AI_TensorGetShape(tensor, &retShapeNum);
1022     ASSERT_EQ(retShapeNum, createShapeNum);
1023     for (size_t i = 0; i < retShapeNum; i++) {
1024         ASSERT_EQ(retShape[i], createShape[i]);
1025     }
1026     constexpr size_t newShapeNum = 4;
1027     int64_t newShape[newShapeNum] = {1, 32, 32, 1};
1028     OH_AI_TensorSetShape(tensor, newShape, newShapeNum);
1029     size_t newRetShapeNum;
1030     const int64_t *newRetShape = OH_AI_TensorGetShape(tensor, &newRetShapeNum);
1031     ASSERT_EQ(newRetShapeNum, newShapeNum);
1032     for (size_t i = 0; i < newRetShapeNum; i++) {
1033         ASSERT_EQ(newRetShape[i], newShape[i]);
1034     }
1035     delete[] imageBuf;
1036     OH_AI_TensorDestroy(&tensor);
1037 }
1038 
1039 /*
1040  * @tc.name: Tensor_GetFormat
1041  * @tc.desc: Verify the OH_AI_TensorGetFormat function.
1042  * @tc.type: FUNC
1043  */
1044 HWTEST(MSLiteTest, Tensor_GetFormat, testing::ext::TestSize.Level0) {
1045     printf("==========ReadFile==========\n");
1046     size_t size1;
1047     size_t *ptrSize1 = &size1;
1048     const char *imagePath = "/data/test/resource/ml_face_isface.input";
1049     char *imageBuf = ReadFile(imagePath, ptrSize1);
1050     ASSERT_NE(imageBuf, nullptr);
1051     printf("==========OH_AI_TensorCreate==========\n");
1052     constexpr size_t createShapeNum = 4;
1053     int64_t createShape[createShapeNum] = {1, 48, 48, 3};
1054     OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, createShape,
1055                                                    createShapeNum, imageBuf, size1);
1056     ASSERT_NE(tensor, nullptr);
1057     OH_AI_Format data_format = OH_AI_TensorGetFormat(tensor);
1058     ASSERT_EQ(data_format, OH_AI_FORMAT_NHWC);
1059     delete[] imageBuf;
1060     OH_AI_TensorDestroy(&tensor);
1061 }
1062 
1063 /*
1064  * @tc.name: Tensor_SetFormat
1065  * @tc.desc: Verify the OH_AI_TensorSetFormat function.
1066  * @tc.type: FUNC
1067  */
1068 HWTEST(MSLiteTest, Tensor_SetFormat, testing::ext::TestSize.Level0) {
1069     printf("==========ReadFile==========\n");
1070     size_t size1;
1071     size_t *ptrSize1 = &size1;
1072     const char *imagePath = "/data/test/resource/ml_face_isface.input";
1073     char *imageBuf = ReadFile(imagePath, ptrSize1);
1074     ASSERT_NE(imageBuf, nullptr);
1075     printf("==========OH_AI_TensorCreate==========\n");
1076     constexpr size_t createShapeNum = 4;
1077     int64_t createShape[createShapeNum] = {1, 48, 48, 3};
1078     OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, createShape,
1079                                                    createShapeNum, imageBuf, size1);
1080     ASSERT_NE(tensor, nullptr);
1081     OH_AI_TensorSetFormat(tensor, OH_AI_FORMAT_NCHW);
1082     OH_AI_Format data_format = OH_AI_TensorGetFormat(tensor);
1083     ASSERT_EQ(data_format, OH_AI_FORMAT_NCHW);
1084     delete[] imageBuf;
1085     OH_AI_TensorDestroy(&tensor);
1086 }
1087 
1088 /*
1089  * @tc.name: Tensor_GetData
1090  * @tc.desc: Verify the OH_AI_TensorGetData function.
1091  * @tc.type: FUNC
1092  */
1093 HWTEST(MSLiteTest, Tensor_GetData, testing::ext::TestSize.Level0) {
1094     printf("==========ReadFile==========\n");
1095     size_t size1;
1096     size_t *ptrSize1 = &size1;
1097     const char *imagePath = "/data/test/resource/ml_face_isface.input";
1098     char *imageBuf = ReadFile(imagePath, ptrSize1);
1099     ASSERT_NE(imageBuf, nullptr);
1100     printf("==========OH_AI_TensorCreate==========\n");
1101     constexpr size_t createShapeNum = 4;
1102     int64_t createShape[createShapeNum] = {1, 48, 48, 3};
1103     OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, createShape,
1104                                                    createShapeNum, imageBuf, size1);
1105     ASSERT_NE(tensor, nullptr);
1106     const float *retData = static_cast<const float *>(OH_AI_TensorGetData(tensor));
1107     ASSERT_NE(retData, nullptr);
1108     printf("return data is: ");
1109     constexpr int printNum = 20;
1110     for (int i = 0; i < printNum; ++i) {
1111         printf("%f ", retData[i]);
1112     }
1113     printf("\n");
1114     delete[] imageBuf;
1115     OH_AI_TensorDestroy(&tensor);
1116 }
1117 
1118 /*
1119  * @tc.name: Tensor_SetData
1120  * @tc.desc: Verify the OH_AI_TensorSetData function.
1121  * @tc.type: FUNC
1122  */
1123 HWTEST(MSLiteTest, Tensor_SetData, testing::ext::TestSize.Level0) {
1124     printf("==========ReadFile==========\n");
1125     size_t size1;
1126     size_t *ptrSize1 = &size1;
1127     const char *imagePath = "/data/test/resource/ml_face_isface.input";
1128     char *imageBuf = ReadFile(imagePath, ptrSize1);
1129     ASSERT_NE(imageBuf, nullptr);
1130     printf("==========OH_AI_TensorCreate==========\n");
1131     constexpr size_t createShapeNum = 4;
1132     int64_t createShape[createShapeNum] = {1, 48, 48, 3};
1133     OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, createShape,
1134                                                    createShapeNum, imageBuf, size1);
1135     ASSERT_NE(tensor, nullptr);
1136     constexpr size_t dataLen = 6;
1137     float data[dataLen] = {1, 2, 3, 4, 5, 6};
1138     OH_AI_TensorSetData(tensor, data);
1139     const float *retData = static_cast<const float *>(OH_AI_TensorGetData(tensor));
1140     ASSERT_NE(retData, nullptr);
1141     printf("return data is:");
1142     for (size_t i = 0; i < dataLen; i++) {
1143         ASSERT_EQ(retData[i], data[i]);
1144         printf("%f ", retData[i]);
1145     }
1146     printf("\n");
1147     delete[] imageBuf;
1148     OH_AI_TensorDestroy(&tensor);
1149 }
1150 
1151 /*
1152  * @tc.name: Tensor_SetUserData
1153  * @tc.desc: Verify the OH_AI_TensorSetData function.
1154  * @tc.type: FUNC
1155  */
1156 HWTEST(MSLiteTest, Tensor_SetUserData, testing::ext::TestSize.Level0) {
1157     printf("==========ReadFile==========\n");
1158     size_t size1;
1159     size_t *ptrSize1 = &size1;
1160     const char *imagePath = "/data/test/resource/ml_face_isface.input";
1161     char *imageBuf = ReadFile(imagePath, ptrSize1);
1162     ASSERT_NE(imageBuf, nullptr);
1163     printf("==========OH_AI_TensorCreate==========\n");
1164     constexpr size_t createShapeNum = 4;
1165     int64_t createShape[createShapeNum] = {1, 48, 48, 3};
1166     OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, createShape,
1167                                                    createShapeNum, imageBuf, size1);
1168     ASSERT_NE(tensor, nullptr);
1169     float *inputData = reinterpret_cast<float *>(OH_AI_TensorGetMutableData(tensor));
1170     constexpr size_t dataLen = 6;
1171     float data[dataLen] = {1, 2, 3, 4, 5, 6};
1172     for (size_t i = 0; i < dataLen; i++) {
1173         inputData[i] = data[i];
1174     }
1175 
1176     OH_AI_TensorSetUserData(tensor, inputData, size1);
1177     const float *retData = static_cast<const float *>(OH_AI_TensorGetData(tensor));
1178     ASSERT_NE(retData, nullptr);
1179     printf("return data is:");
1180     for (size_t i = 0; i < dataLen; i++) {
1181         ASSERT_EQ(retData[i], data[i]);
1182         printf("%f ", retData[i]);
1183     }
1184     printf("\n");
1185     delete[] imageBuf;
1186     OH_AI_TensorDestroy(&tensor);
1187 }
1188 
1189 /*
1190  * @tc.name: Tensor_GetElementNum
1191  * @tc.desc: Verify the OH_AI_TensorGetElementNum function.
1192  * @tc.type: FUNC
1193  */
1194 HWTEST(MSLiteTest, Tensor_GetElementNum, testing::ext::TestSize.Level0) {
1195     printf("==========ReadFile==========\n");
1196     size_t size1;
1197     size_t *ptrSize1 = &size1;
1198     const char *imagePath = "/data/test/resource/ml_face_isface.input";
1199     char *imageBuf = ReadFile(imagePath, ptrSize1);
1200     ASSERT_NE(imageBuf, nullptr);
1201     printf("==========OH_AI_TensorCreate==========\n");
1202     constexpr size_t createShapeNum = 4;
1203     int64_t createShape[createShapeNum] = {1, 48, 48, 3};
1204     OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, createShape,
1205                                                    createShapeNum, imageBuf, size1);
1206     ASSERT_NE(tensor, nullptr);
1207     int64_t elementNum = OH_AI_TensorGetElementNum(tensor);
1208     printf("Tensor name: %s, elements num: %" PRId64 ".\n", OH_AI_TensorGetName(tensor), elementNum);
1209     ASSERT_EQ(elementNum, 6912);
1210     delete[] imageBuf;
1211     OH_AI_TensorDestroy(&tensor);
1212 }
1213 
1214 /*
1215  * @tc.name: Tensor_GetDataSize
1216  * @tc.desc: Verify the OH_AI_TensorGetDataSize function.
1217  * @tc.type: FUNC
1218  */
1219 HWTEST(MSLiteTest, Tensor_GetDataSize, testing::ext::TestSize.Level0) {
1220     printf("==========ReadFile==========\n");
1221     size_t size1;
1222     size_t *ptrSize1 = &size1;
1223     const char *imagePath = "/data/test/resource/ml_face_isface.input";
1224     char *imageBuf = ReadFile(imagePath, ptrSize1);
1225     ASSERT_NE(imageBuf, nullptr);
1226     printf("==========OH_AI_TensorCreate==========\n");
1227     constexpr size_t createShapeNum = 4;
1228     int64_t createShape[createShapeNum] = {1, 48, 48, 3};
1229     OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, createShape,
1230                                                    createShapeNum, imageBuf, size1);
1231     ASSERT_NE(tensor, nullptr);
1232     size_t dataSize = OH_AI_TensorGetDataSize(tensor);
1233     printf("Tensor data size: %zu.\n", dataSize);
1234     ASSERT_EQ(dataSize, 6912 * sizeof(float));
1235     delete[] imageBuf;
1236     OH_AI_TensorDestroy(&tensor);
1237 }
1238 
1239 /*
1240  * @tc.name: Tensor_GetMutableData
1241  * @tc.desc: Verify the OH_AI_TensorGetMutableData function.
1242  * @tc.type: FUNC
1243  */
1244 HWTEST(MSLiteTest, Tensor_GetMutableData, testing::ext::TestSize.Level0) {
1245     printf("==========ReadFile==========\n");
1246     size_t size1;
1247     size_t *ptrSize1 = &size1;
1248     const char *imagePath = "/data/test/resource/ml_face_isface.input";
1249     char *imageBuf = ReadFile(imagePath, ptrSize1);
1250     ASSERT_NE(imageBuf, nullptr);
1251     printf("==========OH_AI_TensorCreate==========\n");
1252     constexpr size_t createShapeNum = 4;
1253     int64_t createShape[createShapeNum] = {1, 48, 48, 3};
1254     OH_AI_TensorHandle tensor = OH_AI_TensorCreate("data", OH_AI_DATATYPE_NUMBERTYPE_FLOAT32, createShape,
1255                                                    createShapeNum, imageBuf, size1);
1256     ASSERT_NE(tensor, nullptr);
1257     float *inputData = reinterpret_cast<float *>(OH_AI_TensorGetMutableData(tensor));
1258     ASSERT_NE(inputData, nullptr);
1259     delete[] imageBuf;
1260     OH_AI_TensorDestroy(&tensor);
1261 }
1262