• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2024 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 <vector>
17 #include <string>
18 #include <iostream>
19 #include "nncore_utils.h"
20 
21 using namespace testing::ext;
22 using namespace OHOS::NeuralNetworkRuntime::Test;
23 class BroadcastToTest : public testing::Test {};
24 
25 struct BroadcastToModel1 {
26     const std::vector<int32_t> input_shape = {3};
27     const std::vector<int32_t> output_shape = {3, 3};
28     std::vector<int64_t> shapeValue = {3, 3};
29     float inputValue[3] = {1, 2, 3};
30     float outputValue[9] = {0};
31 
32     OHNNOperandTest input = {OH_NN_FLOAT32, OH_NN_TENSOR, input_shape, inputValue, 3*sizeof(float)};
33     OHNNOperandTest output = {OH_NN_FLOAT32, OH_NN_TENSOR, output_shape, outputValue, 9*sizeof(float)};
34     OHNNOperandTest shape = {OH_NN_INT64, OH_NN_BROADCAST_TO_SHAPE, {2}, &shapeValue, 2*sizeof(int64_t)};
35     OHNNGraphArgs graphArgs = {.operationType = OH_NN_OPS_BROADCAST_TO,
36                                .operands = {input, output, shape},
37                                .paramIndices = {2},
38                                .inputIndices = {0},
39                                .outputIndices = {1}};
40 };
41 
42 struct BroadcastToModel2 {
43     const std::vector<int32_t> input_shape = {3};
44     const std::vector<int32_t> output_shape = {2, 2};
45     std::vector<int64_t> shapeValue = {2, 2};
46     float inputValue[3] = {1, 2, 3};
47     float* outputValue = {};
48 
49     OHNNOperandTest input = {OH_NN_FLOAT32, OH_NN_TENSOR, input_shape, inputValue, 3*sizeof(float)};
50     OHNNOperandTest output = {OH_NN_FLOAT32, OH_NN_TENSOR, output_shape, outputValue, 4*sizeof(float)};
51     OHNNOperandTest shape = {OH_NN_INT64, OH_NN_BROADCAST_TO_SHAPE, {2}, &shapeValue, 2*sizeof(int64_t)};
52     OHNNGraphArgs graphArgs = {.operationType = OH_NN_OPS_BROADCAST_TO,
53                                .operands = {input, output, shape},
54                                .paramIndices = {2},
55                                .inputIndices = {0},
56                                .outputIndices = {1}};
57 };
58 
59 struct BroadcastToModel3 {
60     const std::vector<int32_t> input_shape = {3};
61     const std::vector<int32_t> output_shape = {1, 3};
62     std::vector<int64_t> shapeValue = {0, 3};
63     float inputValue[3] = {1, 2, 3};
64     float* outputValue = {};
65 
66     OHNNOperandTest input = {OH_NN_FLOAT32, OH_NN_TENSOR, input_shape, inputValue, 3*sizeof(float)};
67     OHNNOperandTest output = {OH_NN_FLOAT32, OH_NN_TENSOR, output_shape, outputValue, 3*sizeof(float)};
68     OHNNOperandTest shape = {OH_NN_INT64, OH_NN_BROADCAST_TO_SHAPE, {2}, &shapeValue, 2*sizeof(int64_t)};
69     OHNNGraphArgs graphArgs = {.operationType = OH_NN_OPS_BROADCAST_TO,
70                                .operands = {input, output, shape},
71                                .paramIndices = {2},
72                                .inputIndices = {0},
73                                .outputIndices = {1}};
74 };
75 
76 /**
77  * @tc.number : SUB_AI_NNRt_Func_North_BroadcastTo_Build_01
78  * @tc.desc: BroadcastToModel1模型build测试
79  * @tc.type: FUNC
80  */
81 HWTEST_F(BroadcastToTest, SUB_AI_NNRt_Func_North_BroadcastTo_Build_01, Function | MediumTest | Level1)
82 {
83     OH_NNModel *model = OH_NNModel_Construct();
84     EXPECT_NE(nullptr, model);
85 
86     BroadcastToModel1 broadcastToModel;
87     OHNNGraphArgs graphArgs = broadcastToModel.graphArgs;
88     EXPECT_EQ(OH_NN_SUCCESS, BuildSingleOpGraph(model, graphArgs));
89 
90     OH_NNCompilation *compilation = OH_NNCompilation_Construct(model);
91     EXPECT_NE(nullptr, compilation);
92 
93     OHNNCompileParam compileParam{
94         .performanceMode = OH_NN_PERFORMANCE_HIGH,
95         .priority = OH_NN_PRIORITY_HIGH,
96     };
97     EXPECT_EQ(OH_NN_SUCCESS, CompileGraphMock(compilation, compileParam));
98 
99     OH_NNExecutor *executor = OH_NNExecutor_Construct(compilation);
100     EXPECT_NE(nullptr, executor);
101 
102     Free(model, compilation, executor);
103 }
104 
105 /**
106  * @tc.number : SUB_AI_NNRt_Func_North_BroadcastTo_Build_02
107  * @tc.desc: BroadcastToModel2模型build测试
108  * @tc.type: FUNC
109  */
110 HWTEST_F(BroadcastToTest, SUB_AI_NNRt_Func_North_BroadcastTo_Build_02, Function | MediumTest | Level1)
111 {
112     OH_NNModel *model = OH_NNModel_Construct();
113     EXPECT_NE(nullptr, model);
114 
115     BroadcastToModel2 broadcastToModel;
116     OHNNGraphArgs graphArgs = broadcastToModel.graphArgs;
117     EXPECT_EQ(OH_NN_SUCCESS, BuildSingleOpGraph(model, graphArgs));
118 
119     OH_NNCompilation *compilation = OH_NNCompilation_Construct(model);
120     EXPECT_NE(nullptr, compilation);
121 
122     OHNNCompileParam compileParam{
123         .performanceMode = OH_NN_PERFORMANCE_HIGH,
124         .priority = OH_NN_PRIORITY_HIGH,
125     };
126     EXPECT_EQ(OH_NN_SUCCESS, CompileGraphMock(compilation, compileParam));
127 
128     OH_NNExecutor *executor = OH_NNExecutor_Construct(compilation);
129     EXPECT_NE(nullptr, executor);
130 
131     Free(model, compilation, executor);
132 }
133 
134 /**
135  * @tc.number : SUB_AI_NNRt_Func_North_BroadcastTo_Build_03
136  * @tc.desc: BroadcastToModel3模型build测试
137  * @tc.type: FUNC
138  */
139 HWTEST_F(BroadcastToTest, SUB_AI_NNRt_Func_North_BroadcastTo_Build_03, Function | MediumTest | Level1)
140 {
141     OH_NNModel *model = OH_NNModel_Construct();
142     EXPECT_NE(nullptr, model);
143 
144     BroadcastToModel3 broadcastToModel;
145     OHNNGraphArgs graphArgs = broadcastToModel.graphArgs;
146     EXPECT_EQ(OH_NN_SUCCESS, BuildSingleOpGraph(model, graphArgs));
147 
148     OH_NNCompilation *compilation = OH_NNCompilation_Construct(model);
149     EXPECT_NE(nullptr, compilation);
150 
151     OHNNCompileParam compileParam{
152         .performanceMode = OH_NN_PERFORMANCE_HIGH,
153         .priority = OH_NN_PRIORITY_HIGH,
154     };
155     EXPECT_EQ(OH_NN_SUCCESS, CompileGraphMock(compilation, compileParam));
156 
157     OH_NNExecutor *executor = OH_NNExecutor_Construct(compilation);
158     EXPECT_NE(nullptr, executor);
159 
160     Free(model, compilation, executor);
161 }
162 
163 /**
164  * @tc.number : SUB_AI_NNRt_Func_North_BroadcastTo_Build_04
165  * @tc.desc: BroadcastToModel1模型输入Tensor+1进行build测试
166  * @tc.type: FUNC
167  */
168 HWTEST_F(BroadcastToTest, SUB_AI_NNRt_Func_North_BroadcastTo_Build_04, Function | MediumTest | Level2)
169 {
170     OH_NNModel *model = OH_NNModel_Construct();
171     EXPECT_NE(nullptr, model);
172 
173     BroadcastToModel1 broadcastToModel;
174     OHNNGraphArgs graphArgs = broadcastToModel.graphArgs;
175     graphArgs.operands = {broadcastToModel.input, broadcastToModel.input,
176                           broadcastToModel.output, broadcastToModel.shape};
177     graphArgs.inputIndices = {0, 1};
178     graphArgs.outputIndices = {2};
179     graphArgs.paramIndices = {3};
180     EXPECT_EQ(OH_NN_INVALID_PARAMETER, BuildSingleOpGraph(model, graphArgs));
181 
182     Free(model, nullptr, nullptr);
183 }
184 
185 /**
186  * @tc.number : SUB_AI_NNRt_Func_North_BroadcastTo_Build_05
187  * @tc.desc: BroadcastToModel1模型输出Tensor+1进行build测试
188  * @tc.type: FUNC
189  */
190 HWTEST_F(BroadcastToTest, SUB_AI_NNRt_Func_North_BroadcastTo_Build_05, Function | MediumTest | Level2)
191 {
192     OH_NNModel *model = OH_NNModel_Construct();
193     EXPECT_NE(nullptr, model);
194 
195     BroadcastToModel1 broadcastToModel;
196     OHNNGraphArgs graphArgs = broadcastToModel.graphArgs;
197     graphArgs.operands = {broadcastToModel.input, broadcastToModel.output,
198                           broadcastToModel.output, broadcastToModel.shape};
199     graphArgs.inputIndices = {0};
200     graphArgs.outputIndices = {1, 2};
201     graphArgs.paramIndices = {3};
202     EXPECT_EQ(OH_NN_INVALID_PARAMETER, BuildSingleOpGraph(model, graphArgs));
203 
204     Free(model, nullptr, nullptr);
205 }
206 
207 /**
208  * @tc.number : SUB_AI_NNRt_Func_North_BroadcastTo_Build_06
209  * @tc.desc: BroadcastToModel1模型传入非法参数进行build测试
210  * @tc.type: FUNC
211  */
212 HWTEST_F(BroadcastToTest, SUB_AI_NNRt_Func_North_BroadcastTo_Build_06, Function | MediumTest | Level2)
213 {
214     OH_NNModel *model = OH_NNModel_Construct();
215     EXPECT_NE(nullptr, model);
216 
217     BroadcastToModel1 broadcastToModel;
218     OHNNGraphArgs graphArgs = broadcastToModel.graphArgs;
219 
220     int8_t activationValue = OH_NN_FUSED_NONE;
221     OHNNOperandTest activation = {OH_NN_INT8, OH_NN_ADD_ACTIVATIONTYPE, {}, &activationValue, sizeof(int8_t)};
222     graphArgs.operands = {broadcastToModel.input, broadcastToModel.output, broadcastToModel.shape, activation};
223     graphArgs.paramIndices = {2, 3};
224     EXPECT_EQ(OH_NN_INVALID_PARAMETER, BuildSingleOpGraph(model, graphArgs));
225 
226     Free(model, nullptr, nullptr);
227 }
228 
229 /**
230  * @tc.number : SUB_AI_NNRt_Func_North_BroadcastTo_Model_Finish_01
231  * @tc.desc: 模型构图,未添加操作数
232  * @tc.type: FUNC
233  */
234 HWTEST_F(BroadcastToTest, SUB_AI_NNRt_Func_North_BroadcastTo_Model_Finish_01, Function | MediumTest | Level2)
235 {
236     OH_NNModel *model = OH_NNModel_Construct();
237     EXPECT_NE(nullptr, model);
238 
239     OHNNGraphArgs graphArgs;
240     EXPECT_EQ(OH_NN_INVALID_PARAMETER, SingleModelBuildEndStep(model, graphArgs));
241 
242     Free(model, nullptr, nullptr);
243 }
244 
245 /**
246  * @tc.number : SUB_AI_NNRt_Func_North_BroadcastTo_Model_Finish_02
247  * @tc.desc: 模型构图,未设置输入输出
248  * @tc.type: FUNC
249  */
250 HWTEST_F(BroadcastToTest, SUB_AI_NNRt_Func_North_BroadcastTo_Model_Finish_02, Function | MediumTest | Level2)
251 {
252     OH_NNModel *model = OH_NNModel_Construct();
253     EXPECT_NE(nullptr, model);
254 
255     BroadcastToModel1 broadcastToModel;
256     OHNNGraphArgs graphArgs = broadcastToModel.graphArgs;
257     graphArgs.specifyIO = false;
258     EXPECT_EQ(OH_NN_OPERATION_FORBIDDEN, BuildSingleOpGraph(model, graphArgs));
259 
260     Free(model, nullptr, nullptr);
261 }
262 
263 /**
264  * @tc.number : SUB_AI_NNRt_Func_North_BroadcastTo_Model_Finish_03
265  * @tc.desc: 模型构图,设置输入输出,构图成功
266  * @tc.type: FUNC
267  */
268 HWTEST_F(BroadcastToTest, SUB_AI_NNRt_Func_North_BroadcastTo_Model_Finish_03, Function | MediumTest | Level1)
269 {
270     OH_NNModel *model = OH_NNModel_Construct();
271     EXPECT_NE(nullptr, model);
272 
273     BroadcastToModel1 broadcastToModel;
274     OHNNGraphArgs graphArgs = broadcastToModel.graphArgs;
275     EXPECT_EQ(OH_NN_SUCCESS, BuildSingleOpGraph(model, graphArgs));
276 
277     Free(model, nullptr, nullptr);
278 }
279 
280 /**
281  * @tc.number : SUB_AI_NNRt_Func_North_BroadcastTo_Model_SetOperandValue_01
282  * @tc.desc: 设置操作数值,操作数不存在
283  * @tc.type: FUNC
284  */
285 HWTEST_F(BroadcastToTest, SUB_AI_NNRt_Func_North_BroadcastTo_Model_SetOperandValue_01, Function | MediumTest | Level2)
286 {
287     OH_NNModel *model = OH_NNModel_Construct();
288     EXPECT_NE(nullptr, model);
289 
290     BroadcastToModel1 broadcastToModel;
291     OHNNGraphArgs graphArgs = broadcastToModel.graphArgs;
292 
293     NN_TensorDesc* tensorDesc = nullptr;
294     std::vector<NN_TensorDesc*> tensorDescVec;
295 
296     for (size_t i = 0; i < graphArgs.operands.size(); i++) {
297         const OHNNOperandTest &operandTem = graphArgs.operands[i];
298         tensorDesc = createTensorDesc(operandTem.shape.data(),
299                                       (uint32_t) operandTem.shape.size(),
300                                       operandTem.dataType, operandTem.format);
301         tensorDescVec.emplace_back(tensorDesc);
302         EXPECT_EQ(OH_NN_SUCCESS, OH_NNModel_AddTensorToModel(model, tensorDesc));
303         EXPECT_EQ(OH_NN_SUCCESS, OH_NNModel_SetTensorType(model, i, operandTem.type));
304 
305         if (std::find(graphArgs.paramIndices.begin(), graphArgs.paramIndices.end(), i) !=
306             graphArgs.paramIndices.end()) {
307             EXPECT_EQ(OH_NN_INVALID_PARAMETER, OH_NNModel_SetTensorData(
308                 model, 1000+i, operandTem.data, operandTem.length));
309         }
310     }
311 
312     FreeTensorDescVec(tensorDescVec);
313     Free(model, nullptr, nullptr);
314 }
315 
316 /**
317  * @tc.number : SUB_AI_NNRt_Func_North_BroadcastTo_Model_SetOperandValue_02
318  * @tc.desc: 设置操作数值,buffer为nullptr
319  * @tc.type: FUNC
320  */
321 HWTEST_F(BroadcastToTest, SUB_AI_NNRt_Func_North_BroadcastTo_Model_SetOperandValue_02, Function | MediumTest | Level2)
322 {
323     OH_NNModel *model = OH_NNModel_Construct();
324     EXPECT_NE(nullptr, model);
325 
326     BroadcastToModel1 broadcastToModel;
327     OHNNGraphArgs graphArgs = broadcastToModel.graphArgs;
328 
329     NN_TensorDesc* tensorDesc = nullptr;
330     std::vector<NN_TensorDesc*> tensorDescVec;
331 
332     for (size_t i = 0; i < graphArgs.operands.size(); i++) {
333         const OHNNOperandTest &operandTem = graphArgs.operands[i];
334         tensorDesc = createTensorDesc(operandTem.shape.data(),
335                                       (uint32_t) operandTem.shape.size(),
336                                       operandTem.dataType, operandTem.format);
337         tensorDescVec.emplace_back(tensorDesc);
338         EXPECT_EQ(OH_NN_SUCCESS, OH_NNModel_AddTensorToModel(model, tensorDesc));
339         EXPECT_EQ(OH_NN_SUCCESS, OH_NNModel_SetTensorType(model, i, operandTem.type));
340 
341         if (std::find(graphArgs.paramIndices.begin(), graphArgs.paramIndices.end(), i) !=
342             graphArgs.paramIndices.end()) {
343             EXPECT_EQ(OH_NN_INVALID_PARAMETER, OH_NNModel_SetTensorData(model, i, nullptr, operandTem.length));
344         }
345     }
346 
347     FreeTensorDescVec(tensorDescVec);
348     Free(model, nullptr, nullptr);
349 }
350 
351 /**
352  * @tc.number : SUB_AI_NNRt_Func_North_BroadcastTo_Model_SetOperandValue_03
353  * @tc.desc: 设置操作数值,length为0
354  * @tc.type: FUNC
355  */
356 HWTEST_F(BroadcastToTest, SUB_AI_NNRt_Func_North_BroadcastTo_Model_SetOperandValue_03, Function | MediumTest | Level2)
357 {
358     OH_NNModel *model = OH_NNModel_Construct();
359     EXPECT_NE(nullptr, model);
360 
361     BroadcastToModel1 broadcastToModel;
362     OHNNGraphArgs graphArgs = broadcastToModel.graphArgs;
363 
364     NN_TensorDesc* tensorDesc = nullptr;
365     std::vector<NN_TensorDesc*> tensorDescVec;
366 
367     for (size_t i = 0; i < graphArgs.operands.size(); i++) {
368         const OHNNOperandTest &operandTem = graphArgs.operands[i];
369         tensorDesc = createTensorDesc(operandTem.shape.data(),
370                                       (uint32_t) operandTem.shape.size(),
371                                       operandTem.dataType, operandTem.format);
372         tensorDescVec.emplace_back(tensorDesc);
373         EXPECT_EQ(OH_NN_SUCCESS, OH_NNModel_AddTensorToModel(model, tensorDesc));
374         EXPECT_EQ(OH_NN_SUCCESS, OH_NNModel_SetTensorType(model, i, operandTem.type));
375 
376         if (std::find(graphArgs.paramIndices.begin(), graphArgs.paramIndices.end(), i) !=
377             graphArgs.paramIndices.end()) {
378             EXPECT_EQ(OH_NN_INVALID_PARAMETER, OH_NNModel_SetTensorData(model, 1000+i, operandTem.data, 0));
379         }
380     }
381 
382     FreeTensorDescVec(tensorDescVec);
383     Free(model, nullptr, nullptr);
384 }
385 
386 /**
387  * @tc.number : SUB_AI_NNRt_Func_North_BroadcastTo_Model_SpecifyInputsAndOutputs_01
388  * @tc.desc: 设置输入输出,inputIndices为nullptr
389  * @tc.type: FUNC
390  */
391 HWTEST_F(BroadcastToTest, SUB_AI_NNRt_Func_North_BroadcastTo_Model_SpecifyInputsAndOutputs_01,
392          Function | MediumTest | Level2)
393 {
394     OH_NNModel *model = OH_NNModel_Construct();
395     EXPECT_NE(nullptr, model);
396 
397     BroadcastToModel1 broadcastToModel;
398     OHNNGraphArgs graphArgs = broadcastToModel.graphArgs;
399     graphArgs.specifyIO = false;
400     graphArgs.build = false;
401     EXPECT_EQ(OH_NN_SUCCESS, BuildSingleOpGraph(model, graphArgs));
402 
403     auto inputIndices = TransformUInt32Array(graphArgs.inputIndices);
404     auto outputIndices = TransformUInt32Array(graphArgs.outputIndices);
405     EXPECT_EQ(OH_NN_INVALID_PARAMETER, OH_NNModel_SpecifyInputsAndOutputs(model, nullptr, &outputIndices));
406 
407     Free(model, nullptr, nullptr);
408 }
409 
410 /**
411  * @tc.number : SUB_AI_NNRt_Func_North_BroadcastTo_Model_SpecifyInputsAndOutputs_02
412  * @tc.desc: 设置输入输出,inputindices中data为nullptr
413  * @tc.type: FUNC
414  */
415 HWTEST_F(BroadcastToTest, SUB_AI_NNRt_Func_North_BroadcastTo_Model_SpecifyInputsAndOutputs_02,
416          Function | MediumTest | Level2)
417 {
418     OH_NNModel *model = OH_NNModel_Construct();
419     EXPECT_NE(nullptr, model);
420 
421     BroadcastToModel1 broadcastToModel;
422     OHNNGraphArgs graphArgs = broadcastToModel.graphArgs;
423     graphArgs.specifyIO = false;
424     graphArgs.build = false;
425     EXPECT_EQ(OH_NN_SUCCESS, BuildSingleOpGraph(model, graphArgs));
426 
427     auto inputIndices = TransformUInt32Array(graphArgs.inputIndices);
428     auto outputIndices = TransformUInt32Array(graphArgs.outputIndices);
429     inputIndices.data = nullptr;
430     EXPECT_EQ(OH_NN_INVALID_PARAMETER, OH_NNModel_SpecifyInputsAndOutputs(model, &inputIndices, &outputIndices));
431 
432     Free(model, nullptr, nullptr);
433 }
434 
435 /**
436  * @tc.number : SUB_AI_NNRt_Func_North_BroadcastTo_Model_SpecifyInputsAndOutputs_03
437  * @tc.desc: 设置输入输出,inputindices中data对应序号不存在
438  * @tc.type: FUNC
439  */
440 HWTEST_F(BroadcastToTest, SUB_AI_NNRt_Func_North_BroadcastTo_Model_SpecifyInputsAndOutputs_03,
441          Function | MediumTest | Level2)
442 {
443     OH_NNModel *model = OH_NNModel_Construct();
444     EXPECT_NE(nullptr, model);
445 
446     BroadcastToModel1 broadcastToModel;
447     OHNNGraphArgs graphArgs = broadcastToModel.graphArgs;
448     graphArgs.specifyIO = false;
449     graphArgs.build = false;
450     EXPECT_EQ(OH_NN_SUCCESS, BuildSingleOpGraph(model, graphArgs));
451 
452     graphArgs.inputIndices = {100000};
453     auto inputIndices = TransformUInt32Array(graphArgs.inputIndices);
454     auto outputIndices = TransformUInt32Array(graphArgs.outputIndices);
455     EXPECT_EQ(OH_NN_INVALID_PARAMETER, OH_NNModel_SpecifyInputsAndOutputs(model, &inputIndices, &outputIndices));
456 
457     Free(model, nullptr, nullptr);
458 }
459 
460 /**
461  * @tc.number : SUB_AI_NNRt_Func_North_BroadcastTo_Model_SpecifyInputsAndOutputs_04
462  * @tc.desc: 设置输入输出,inputindices中size为0
463  * @tc.type: FUNC
464  */
465 HWTEST_F(BroadcastToTest, SUB_AI_NNRt_Func_North_BroadcastTo_Model_SpecifyInputsAndOutputs_04,
466          Function | MediumTest | Level2)
467 {
468     OH_NNModel *model = OH_NNModel_Construct();
469     EXPECT_NE(nullptr, model);
470 
471     BroadcastToModel1 broadcastToModel;
472     OHNNGraphArgs graphArgs = broadcastToModel.graphArgs;
473     graphArgs.specifyIO = false;
474     graphArgs.build = false;
475     EXPECT_EQ(OH_NN_SUCCESS, BuildSingleOpGraph(model, graphArgs));
476 
477     auto inputIndices = TransformUInt32Array(graphArgs.inputIndices);
478     auto outputIndices = TransformUInt32Array(graphArgs.outputIndices);
479     inputIndices.size = 0;
480     EXPECT_EQ(OH_NN_INVALID_PARAMETER, OH_NNModel_SpecifyInputsAndOutputs(model, &inputIndices, &outputIndices));
481 
482     Free(model, nullptr, nullptr);
483 }
484 
485 /**
486  * @tc.number : SUB_AI_NNRt_Func_North_BroadcastTo_Model_SpecifyInputsAndOutputs_05
487  * @tc.desc: 设置输入输出,outputindices为nullptr
488  * @tc.type: FUNC
489  */
490 HWTEST_F(BroadcastToTest, SUB_AI_NNRt_Func_North_BroadcastTo_Model_SpecifyInputsAndOutputs_05,
491          Function | MediumTest | Level2)
492 {
493     OH_NNModel *model = OH_NNModel_Construct();
494     EXPECT_NE(nullptr, model);
495 
496     BroadcastToModel1 broadcastToModel;
497     OHNNGraphArgs graphArgs = broadcastToModel.graphArgs;
498     graphArgs.specifyIO = false;
499     graphArgs.build = false;
500     EXPECT_EQ(OH_NN_SUCCESS, BuildSingleOpGraph(model, graphArgs));
501 
502     auto inputIndices = TransformUInt32Array(graphArgs.inputIndices);
503     auto outputIndices = TransformUInt32Array(graphArgs.outputIndices);
504     EXPECT_EQ(OH_NN_INVALID_PARAMETER, OH_NNModel_SpecifyInputsAndOutputs(model, &inputIndices, nullptr));
505 
506     Free(model, nullptr, nullptr);
507 }
508 
509 /**
510  * @tc.number : SUB_AI_NNRt_Func_North_BroadcastTo_Model_SpecifyInputsAndOutputs_06
511  * @tc.desc: 设置输入输出,outputindices中data为nullptr
512  * @tc.type: FUNC
513  */
514 HWTEST_F(BroadcastToTest, SUB_AI_NNRt_Func_North_BroadcastTo_Model_SpecifyInputsAndOutputs_06,
515          Function | MediumTest | Level2)
516 {
517     OH_NNModel *model = OH_NNModel_Construct();
518     EXPECT_NE(nullptr, model);
519 
520     BroadcastToModel1 broadcastToModel;
521     OHNNGraphArgs graphArgs = broadcastToModel.graphArgs;
522     graphArgs.specifyIO = false;
523     graphArgs.build = false;
524     EXPECT_EQ(OH_NN_SUCCESS, BuildSingleOpGraph(model, graphArgs));
525 
526     auto inputIndices = TransformUInt32Array(graphArgs.inputIndices);
527     auto outputIndices = TransformUInt32Array(graphArgs.outputIndices);
528     outputIndices.data = nullptr;
529     EXPECT_EQ(OH_NN_INVALID_PARAMETER, OH_NNModel_SpecifyInputsAndOutputs(model, &inputIndices, &outputIndices));
530 
531     Free(model, nullptr, nullptr);
532 }
533 
534 /**
535  * @tc.number : SUB_AI_NNRt_Func_North_BroadcastTo_Model_SpecifyInputsAndOutputs_07
536  * @tc.desc: 设置输入输出,outputindices中data对应序号不存在
537  * @tc.type: FUNC
538  */
539 HWTEST_F(BroadcastToTest, SUB_AI_NNRt_Func_North_BroadcastTo_Model_SpecifyInputsAndOutputs_07,
540          Function | MediumTest | Level2)
541 {
542     OH_NNModel *model = OH_NNModel_Construct();
543     EXPECT_NE(nullptr, model);
544 
545     BroadcastToModel1 broadcastToModel;
546     OHNNGraphArgs graphArgs = broadcastToModel.graphArgs;
547     graphArgs.specifyIO = false;
548     graphArgs.build = false;
549     EXPECT_EQ(OH_NN_SUCCESS, BuildSingleOpGraph(model, graphArgs));
550 
551     graphArgs.outputIndices = {100000};
552     auto inputIndices = TransformUInt32Array(graphArgs.inputIndices);
553     auto outputIndices = TransformUInt32Array(graphArgs.outputIndices);
554     EXPECT_EQ(OH_NN_INVALID_PARAMETER, OH_NNModel_SpecifyInputsAndOutputs(model, &inputIndices, &outputIndices));
555 
556     Free(model, nullptr, nullptr);
557 }
558 
559 /**
560  * @tc.number : SUB_AI_NNRt_Func_North_BroadcastTo_Model_SpecifyInputsAndOutputs_08
561  * @tc.desc: 设置输入输出,outputindices中size为0
562  * @tc.type: FUNC
563  */
564 HWTEST_F(BroadcastToTest, SUB_AI_NNRt_Func_North_BroadcastTo_Model_SpecifyInputsAndOutputs_08,
565          Function | MediumTest | Level2)
566 {
567     OH_NNModel *model = OH_NNModel_Construct();
568     EXPECT_NE(nullptr, model);
569 
570     BroadcastToModel1 broadcastToModel;
571     OHNNGraphArgs graphArgs = broadcastToModel.graphArgs;
572     graphArgs.specifyIO = false;
573     graphArgs.build = false;
574     EXPECT_EQ(OH_NN_SUCCESS, BuildSingleOpGraph(model, graphArgs));
575 
576     auto inputIndices = TransformUInt32Array(graphArgs.inputIndices);
577     auto outputIndices = TransformUInt32Array(graphArgs.outputIndices);
578     outputIndices.size = 0;
579     EXPECT_EQ(OH_NN_INVALID_PARAMETER, OH_NNModel_SpecifyInputsAndOutputs(model, &inputIndices, &outputIndices));
580 
581     Free(model, nullptr, nullptr);
582 }
583 
584 /**
585  * @tc.number : SUB_AI_NNRt_Func_North_BroadcastTo_Model_AddOperation_01
586  * @tc.desc: 添加算子,paramindices为nullptr
587  * @tc.type: FUNC
588  */
589 HWTEST_F(BroadcastToTest, SUB_AI_NNRt_Func_North_BroadcastTo_Model_AddOperation_01, Function | MediumTest | Level2)
590 {
591     OH_NNModel *model = OH_NNModel_Construct();
592     EXPECT_NE(nullptr, model);
593 
594     BroadcastToModel1 broadcastToModel;
595     OHNNGraphArgs graphArgs = broadcastToModel.graphArgs;
596     graphArgs.addOperation = false;
597     graphArgs.specifyIO = false;
598     graphArgs.build = false;
599     EXPECT_EQ(OH_NN_SUCCESS, BuildSingleOpGraph(model, graphArgs));
600 
601     auto inputIndices = TransformUInt32Array(graphArgs.inputIndices);
602     auto outputIndices = TransformUInt32Array(graphArgs.outputIndices);
603     EXPECT_EQ(OH_NN_INVALID_PARAMETER, OH_NNModel_AddOperation(model, graphArgs.operationType,
604                                                                nullptr, &inputIndices, &outputIndices));
605 
606     Free(model, nullptr, nullptr);
607 }
608 
609 /**
610  * @tc.number : SUB_AI_NNRt_Func_North_BroadcastTo_Model_AddOperation_02
611  * @tc.desc: 添加算子,paramindices中data为nullptr
612  * @tc.type: FUNC
613  */
614 HWTEST_F(BroadcastToTest, SUB_AI_NNRt_Func_North_BroadcastTo_Model_AddOperation_02, Function | MediumTest | Level2)
615 {
616     OH_NNModel *model = OH_NNModel_Construct();
617     EXPECT_NE(nullptr, model);
618 
619     BroadcastToModel1 broadcastToModel;
620     OHNNGraphArgs graphArgs = broadcastToModel.graphArgs;
621     graphArgs.addOperation = false;
622     graphArgs.specifyIO = false;
623     graphArgs.build = false;
624     EXPECT_EQ(OH_NN_SUCCESS, BuildSingleOpGraph(model, graphArgs));
625 
626     auto paramIndices = TransformUInt32Array(graphArgs.paramIndices);
627     auto inputIndices = TransformUInt32Array(graphArgs.inputIndices);
628     auto outputIndices = TransformUInt32Array(graphArgs.outputIndices);
629     paramIndices.data = nullptr;
630     EXPECT_EQ(OH_NN_INVALID_PARAMETER, OH_NNModel_AddOperation(model, graphArgs.operationType,
631                                                                &paramIndices, &inputIndices, &outputIndices));
632 
633     Free(model, nullptr, nullptr);
634 }
635 
636 /**
637  * @tc.number : SUB_AI_NNRt_Func_North_BroadcastTo_Model_AddOperation_03
638  * @tc.desc: 添加算子,paramindices中data对应序号不存在
639  * @tc.type: FUNC
640  */
641 HWTEST_F(BroadcastToTest, SUB_AI_NNRt_Func_North_BroadcastTo_Model_AddOperation_03, Function | MediumTest | Level2)
642 {
643     OH_NNModel *model = OH_NNModel_Construct();
644     EXPECT_NE(nullptr, model);
645 
646     BroadcastToModel1 broadcastToModel;
647     OHNNGraphArgs graphArgs = broadcastToModel.graphArgs;
648     graphArgs.addOperation = false;
649     graphArgs.specifyIO = false;
650     graphArgs.build = false;
651     EXPECT_EQ(OH_NN_SUCCESS, BuildSingleOpGraph(model, graphArgs));
652 
653     graphArgs.paramIndices = {100000};
654     auto paramIndices = TransformUInt32Array(graphArgs.paramIndices);
655     auto inputIndices = TransformUInt32Array(graphArgs.inputIndices);
656     auto outputIndices = TransformUInt32Array(graphArgs.outputIndices);
657     EXPECT_EQ(OH_NN_INVALID_PARAMETER, OH_NNModel_AddOperation(model, graphArgs.operationType,
658                                                                &paramIndices, &inputIndices, &outputIndices));
659 
660     Free(model, nullptr, nullptr);
661 }
662 
663 /**
664  * @tc.number : SUB_AI_NNRt_Func_North_BroadcastTo_Model_AddOperation_04
665  * @tc.desc: 添加算子,paramindices中size为0
666  * @tc.type: FUNC
667  */
668 HWTEST_F(BroadcastToTest, SUB_AI_NNRt_Func_North_BroadcastTo_Model_AddOperation_04, Function | MediumTest | Level2)
669 {
670     OH_NNModel *model = OH_NNModel_Construct();
671     EXPECT_NE(nullptr, model);
672 
673     BroadcastToModel1 broadcastToModel;
674     OHNNGraphArgs graphArgs = broadcastToModel.graphArgs;
675     graphArgs.addOperation = false;
676     graphArgs.specifyIO = false;
677     graphArgs.build = false;
678     EXPECT_EQ(OH_NN_SUCCESS, BuildSingleOpGraph(model, graphArgs));
679 
680     auto paramIndices = TransformUInt32Array(graphArgs.paramIndices);
681     auto inputIndices = TransformUInt32Array(graphArgs.inputIndices);
682     auto outputIndices = TransformUInt32Array(graphArgs.outputIndices);
683     paramIndices.size = 0;
684     EXPECT_EQ(OH_NN_INVALID_PARAMETER, OH_NNModel_AddOperation(model, graphArgs.operationType,
685                                                                &paramIndices, &inputIndices, &outputIndices));
686 
687     Free(model, nullptr, nullptr);
688 }
689 
690 /**
691  * @tc.number : SUB_AI_NNRt_Func_North_BroadcastTo_Model_AddOperation_05
692  * @tc.desc: 添加算子,inputindices为nullptr
693  * @tc.type: FUNC
694  */
695 HWTEST_F(BroadcastToTest, SUB_AI_NNRt_Func_North_BroadcastTo_Model_AddOperation_05, Function | MediumTest | Level2)
696 {
697     OH_NNModel *model = OH_NNModel_Construct();
698     EXPECT_NE(nullptr, model);
699 
700     BroadcastToModel1 broadcastToModel;
701     OHNNGraphArgs graphArgs = broadcastToModel.graphArgs;
702     graphArgs.addOperation = false;
703     graphArgs.specifyIO = false;
704     graphArgs.build = false;
705     EXPECT_EQ(OH_NN_SUCCESS, BuildSingleOpGraph(model, graphArgs));
706 
707     auto paramIndices = TransformUInt32Array(graphArgs.paramIndices);
708     auto outputIndices = TransformUInt32Array(graphArgs.outputIndices);
709     EXPECT_EQ(OH_NN_INVALID_PARAMETER, OH_NNModel_AddOperation(model, graphArgs.operationType,
710                                                                &paramIndices, nullptr, &outputIndices));
711 
712     Free(model, nullptr, nullptr);
713 }
714 
715 /**
716  * @tc.number : SUB_AI_NNRt_Func_North_BroadcastTo_Model_AddOperation_06
717  * @tc.desc: 添加算子,inputindices中data为nullptr
718  * @tc.type: FUNC
719  */
720 HWTEST_F(BroadcastToTest, SUB_AI_NNRt_Func_North_BroadcastTo_Model_AddOperation_06, Function | MediumTest | Level2)
721 {
722     OH_NNModel *model = OH_NNModel_Construct();
723     EXPECT_NE(nullptr, model);
724 
725     BroadcastToModel1 broadcastToModel;
726     OHNNGraphArgs graphArgs = broadcastToModel.graphArgs;
727     graphArgs.addOperation = false;
728     graphArgs.specifyIO = false;
729     graphArgs.build = false;
730     EXPECT_EQ(OH_NN_SUCCESS, BuildSingleOpGraph(model, graphArgs));
731 
732     auto paramIndices = TransformUInt32Array(graphArgs.paramIndices);
733     auto inputIndices = TransformUInt32Array(graphArgs.inputIndices);
734     auto outputIndices = TransformUInt32Array(graphArgs.outputIndices);
735     inputIndices.data = nullptr;
736     EXPECT_EQ(OH_NN_INVALID_PARAMETER, OH_NNModel_AddOperation(model, graphArgs.operationType,
737                                                                &paramIndices, &inputIndices, &outputIndices));
738 
739     Free(model, nullptr, nullptr);
740 }
741 
742 /**
743  * @tc.number : SUB_AI_NNRt_Func_North_BroadcastTo_Model_AddOperation_07
744  * @tc.desc: 添加算子,inputindices中data对应序号不存在
745  * @tc.type: FUNC
746  */
747 HWTEST_F(BroadcastToTest, SUB_AI_NNRt_Func_North_BroadcastTo_Model_AddOperation_07, Function | MediumTest | Level2)
748 {
749     OH_NNModel *model = OH_NNModel_Construct();
750     EXPECT_NE(nullptr, model);
751 
752     BroadcastToModel1 broadcastToModel;
753     OHNNGraphArgs graphArgs = broadcastToModel.graphArgs;
754     graphArgs.addOperation = false;
755     graphArgs.specifyIO = false;
756     graphArgs.build = false;
757     EXPECT_EQ(OH_NN_SUCCESS, BuildSingleOpGraph(model, graphArgs));
758 
759     graphArgs.inputIndices = {100000};
760     auto paramIndices = TransformUInt32Array(graphArgs.paramIndices);
761     auto inputIndices = TransformUInt32Array(graphArgs.inputIndices);
762     auto outputIndices = TransformUInt32Array(graphArgs.outputIndices);
763     EXPECT_EQ(OH_NN_INVALID_PARAMETER, OH_NNModel_AddOperation(model, graphArgs.operationType,
764                                                                &paramIndices, &inputIndices, &outputIndices));
765 
766     Free(model, nullptr, nullptr);
767 }
768 
769 /**
770  * @tc.number : SUB_AI_NNRt_Func_North_BroadcastTo_Model_AddOperation_08
771  * @tc.desc: 添加算子,inputindices中size为0
772  * @tc.type: FUNC
773  */
774 HWTEST_F(BroadcastToTest, SUB_AI_NNRt_Func_North_BroadcastTo_Model_AddOperation_08, Function | MediumTest | Level2)
775 {
776     OH_NNModel *model = OH_NNModel_Construct();
777     EXPECT_NE(nullptr, model);
778 
779     BroadcastToModel1 broadcastToModel;
780     OHNNGraphArgs graphArgs = broadcastToModel.graphArgs;
781     graphArgs.addOperation = false;
782     graphArgs.specifyIO = false;
783     graphArgs.build = false;
784     EXPECT_EQ(OH_NN_SUCCESS, BuildSingleOpGraph(model, graphArgs));
785 
786     auto paramIndices = TransformUInt32Array(graphArgs.paramIndices);
787     auto inputIndices = TransformUInt32Array(graphArgs.inputIndices);
788     auto outputIndices = TransformUInt32Array(graphArgs.outputIndices);
789     inputIndices.size = 0;
790     EXPECT_EQ(OH_NN_INVALID_PARAMETER, OH_NNModel_AddOperation(model, graphArgs.operationType,
791                                                                &paramIndices, &inputIndices, &outputIndices));
792 
793     Free(model, nullptr, nullptr);
794 }
795 
796 /**
797  * @tc.number : SUB_AI_NNRt_Func_North_BroadcastTo_Model_AddOperation_09
798  * @tc.desc: 添加算子,outputindices为nullptr
799  * @tc.type: FUNC
800  */
801 HWTEST_F(BroadcastToTest, SUB_AI_NNRt_Func_North_BroadcastTo_Model_AddOperation_09, Function | MediumTest | Level2)
802 {
803     OH_NNModel *model = OH_NNModel_Construct();
804     EXPECT_NE(nullptr, model);
805 
806     BroadcastToModel1 broadcastToModel;
807     OHNNGraphArgs graphArgs = broadcastToModel.graphArgs;
808     graphArgs.addOperation = false;
809     graphArgs.specifyIO = false;
810     graphArgs.build = false;
811     EXPECT_EQ(OH_NN_SUCCESS, BuildSingleOpGraph(model, graphArgs));
812 
813     auto paramIndices = TransformUInt32Array(graphArgs.paramIndices);
814     auto inputIndices = TransformUInt32Array(graphArgs.inputIndices);
815     EXPECT_EQ(OH_NN_INVALID_PARAMETER, OH_NNModel_AddOperation(nullptr, graphArgs.operationType,
816                                                                &paramIndices, &inputIndices, nullptr));
817 
818     Free(model, nullptr, nullptr);
819 }