xref: /aosp_15_r20/external/executorch/backends/xnnpack/test/runtime/test_xnnexecutor.cpp (revision 523fa7a60841cd1ecfb9cc4201f1ca8b03ed023a)
1 /*
2  * Copyright (c) Meta Platforms, Inc. and affiliates.
3  * All rights reserved.
4  *
5  * This source code is licensed under the BSD-style license found in the
6  * LICENSE file in the root directory of this source tree.
7  */
8 
9 #include <executorch/backends/xnnpack/runtime/XNNExecutor.h>
10 #include <executorch/runtime/core/exec_aten/testing_util/tensor_factory.h>
11 #include <gtest/gtest.h>
12 #include <xnnpack.h>
13 
14 using executorch::backends::xnnpack::delegate::XNNExecutor;
15 using executorch::runtime::Error;
16 using executorch::runtime::EValue;
17 using executorch::runtime::testing::TensorFactory;
18 
TEST(XNNExecutorTest,ArgumentWithTooManyDimensions)19 TEST(XNNExecutorTest, ArgumentWithTooManyDimensions) {
20   XNNExecutor executor;
21   xnn_subgraph_t subgraph = nullptr;
22   xnn_runtime_t rt = nullptr;
23   et_pal_init();
24   ASSERT_EQ(xnn_initialize(nullptr), xnn_status_success);
25   ASSERT_EQ(xnn_create_subgraph(2, 0, &subgraph), xnn_status_success);
26   std::unique_ptr<xnn_subgraph, decltype(&xnn_delete_subgraph)> auto_subgraph(
27       subgraph, xnn_delete_subgraph);
28 
29   auto input_id = XNN_INVALID_VALUE_ID;
30   std::vector<size_t> dims = {
31       1,
32   };
33   ASSERT_EQ(
34       xnn_status_success,
35       xnn_define_quantized_tensor_value(
36           subgraph,
37           xnn_datatype_qint8,
38           0,
39           1,
40           dims.size(),
41           dims.data(),
42           nullptr,
43           /*external_id=*/0,
44           /*flags=*/XNN_VALUE_FLAG_EXTERNAL_INPUT,
45           &input_id));
46   ASSERT_NE(input_id, XNN_INVALID_VALUE_ID);
47 
48   auto output_id = XNN_INVALID_VALUE_ID;
49   ASSERT_EQ(
50       xnn_status_success,
51       xnn_define_quantized_tensor_value(
52           subgraph,
53           xnn_datatype_qint8,
54           0,
55           1,
56           dims.size(),
57           dims.data(),
58           nullptr,
59           /*external_id=*/0,
60           /*flags=*/XNN_VALUE_FLAG_EXTERNAL_OUTPUT,
61           &output_id));
62   ASSERT_NE(output_id, XNN_INVALID_VALUE_ID);
63 
64   ASSERT_EQ(
65       xnn_status_success,
66       xnn_define_clamp(subgraph, 1, 2, input_id, output_id, 0));
67 
68   ASSERT_EQ(xnn_create_runtime(subgraph, &rt), xnn_status_success);
69   EXPECT_EQ(
70       executor.initialize(
71           rt,
72           {
73               0,
74           },
75           {
76               1,
77           }),
78       Error::Ok);
79   TensorFactory<executorch::aten::ScalarType::Int> tf;
80   auto input_tensor = tf.make({1, 1, 1, 1, 1, 1, 1, 1, 1}, {42});
81   ASSERT_EQ(input_tensor.dim(), 9);
82   auto output_tensor = tf.make(
83       {
84           1,
85       },
86       {
87           1,
88       });
89   EValue input_ev(input_tensor);
90   EValue output_ev(output_tensor);
91   std::array<EValue*, 2> args = {&input_ev, &output_ev};
92   // Check for invalid number of dimensions should fail without stack overflow.
93   EXPECT_EQ(executor.prepare_args(args.data()), Error::InvalidArgument);
94 }
95