xref: /aosp_15_r20/external/ComputeLibrary/tests/validation/fixtures/UNIT/TensorPackFixture.h (revision c217d954acce2dbc11938adb493fc0abd69584f3)
1 /*
2  * Copyright (c) 2021 Arm Limited.
3  *
4  * SPDX-License-Identifier: MIT
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a copy
7  * of this software and associated documentation files (the "Software"), to
8  * deal in the Software without restriction, including without limitation the
9  * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10  * sell copies of the Software, and to permit persons to whom the Software is
11  * furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included in all
14  * copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22  * SOFTWARE.
23  */
24 #ifndef ARM_COMPUTE_TEST_UNIT_TENSORPACK_FIXTURE
25 #define ARM_COMPUTE_TEST_UNIT_TENSORPACK_FIXTURE
26 
27 #include "arm_compute/Acl.hpp"
28 #include "tests/framework/Asserts.h"
29 #include "tests/framework/Fixture.h"
30 #include "tests/framework/Macros.h"
31 #include "tests/validation/Validation.h"
32 
33 namespace arm_compute
34 {
35 namespace test
36 {
37 namespace validation
38 {
39 /** Test case for AclCreateTensorPack
40  *
41  * Validate that AclCreateTensorPack behaves as expected with invalid context
42  *
43  * Test Steps:
44  *  - Call AclCreateTensorPack with an invalid context
45  *  - Confirm that AclInvalidArgument is reported
46  *  - Confirm that the tensor pack is still nullptr
47  */
48 class CreateTensorPackWithInvalidContextFixture : public framework::Fixture
49 {
50 public:
setup()51     void setup()
52     {
53         AclTensorPack pack = nullptr;
54         ARM_COMPUTE_ASSERT(AclCreateTensorPack(&pack, nullptr) == AclStatus::AclInvalidArgument);
55         ARM_COMPUTE_ASSERT(pack == nullptr);
56     };
57 };
58 
59 /** Test case for AclDestroyTensorPack
60  *
61  * Validate that AclDestroyTensorPack behaves as expected when an invalid tensor pack is given
62  *
63  * Test Steps:
64  *  - Call AclDestroyTensorPack with null tensor pack
65  *  - Confirm that AclInvalidArgument is reported
66  *  - Call AclDestroyTensorPack on empty array
67  *  - Confirm that AclInvalidArgument is reported
68  *  - Call AclDestroyTensorPack on an ACL object other than AclTensorPack
69  *  - Confirm that AclInvalidArgument is reported
70  *  - Confirm that tensor pack is still nullptr
71  */
72 template <acl::Target Target>
73 class DestroyInvalidTensorPackFixture : public framework::Fixture
74 {
75 public:
setup()76     void setup()
77     {
78         acl::Context ctx(Target);
79 
80         std::array<char, 256> empty_array{};
81         AclTensorPack pack = nullptr;
82 
83         ARM_COMPUTE_ASSERT(AclDestroyTensorPack(pack) == AclStatus::AclInvalidArgument);
84         ARM_COMPUTE_ASSERT(AclDestroyTensorPack(reinterpret_cast<AclTensorPack>(ctx.get())) == AclStatus::AclInvalidArgument);
85         ARM_COMPUTE_ASSERT(AclDestroyTensorPack(reinterpret_cast<AclTensorPack>(empty_array.data())) == AclStatus::AclInvalidArgument);
86         ARM_COMPUTE_ASSERT(pack == nullptr);
87     };
88 };
89 
90 /** Test case for AclPackTensor
91  *
92  * Validate that AclPackTensor behaves as expected when an invalid is being passed for packing
93  *
94  * Test Steps:
95  *  - Create a valid TensorPack
96  *  - Try to pack an empty object
97  *  - Confirm that AclInvalidArgument is reported
98  *  - Try to pack another API object other than tensor
99  *  - Confirm that AclInvalidArgument is reported
100  */
101 template <acl::Target Target>
102 class AddInvalidObjectToTensorPackFixture : public framework::Fixture
103 {
104 public:
setup()105     void setup()
106     {
107         auto err = acl::StatusCode::Success;
108 
109         acl::Context ctx(Target, &err);
110         ARM_COMPUTE_ASSERT(err == acl::StatusCode::Success);
111 
112         acl::TensorPack pack(ctx, &err);
113         ARM_COMPUTE_ASSERT(err == acl::StatusCode::Success);
114 
115         auto status = AclPackTensor(pack.get(),
116                                     reinterpret_cast<AclTensor>(ctx.get()),
117                                     AclTensorSlot::AclSrc);
118         ARM_COMPUTE_ASSERT(status == AclInvalidArgument);
119 
120         status = AclPackTensor(pack.get(), nullptr, AclTensorSlot::AclSrc);
121         ARM_COMPUTE_ASSERT(status == AclInvalidArgument);
122     };
123 };
124 
125 /** Test case for AclPackTensor
126  *
127  * Validate that a tensor can be added successfully to the TensorPack
128  *
129  * Test Steps:
130  *  - Create a valid tensor pack
131  *  - Create a valid tensor
132  *  - Add tensor to the tensor pack
133  *  - Confirm that AclSuccess is returned
134  */
135 template <acl::Target Target>
136 class SimpleTensorPackFixture : public framework::Fixture
137 {
138 public:
setup()139     void setup()
140     {
141         acl::Context    ctx(Target);
142         acl::TensorPack pack(ctx);
143         acl::Tensor     t(ctx, acl::TensorDescriptor({ 3, 3, 5, 7 }, acl::DataType::Float32));
144 
145         ARM_COMPUTE_ASSERT(pack.add(t, AclTensorSlot::AclSrc) == acl::StatusCode::Success);
146     };
147 };
148 
149 /** Test case for AclPackTensor
150  *
151  * Validate that multiple tensor can be added successfully to the TensorPack
152  *
153  * Test Steps:
154  *  - Create a valid tensor pack
155  *  - Create a list of valid tensors
156  *  - Add tensors to the tensor pack
157  *  - Confirm that AclSuccess is returned
158  */
159 template <acl::Target Target>
160 class MultipleTensorsInPackFixture : public framework::Fixture
161 {
162 public:
setup()163     void setup()
164     {
165         acl::Context    ctx(Target);
166         acl::TensorPack pack(ctx);
167 
168         const acl::TensorDescriptor desc(acl::TensorDescriptor({ 3, 3, 5, 7 }, acl::DataType::Float32));
169         const size_t                num_tensors = 256;
170 
171         std::vector<acl::Tensor> tensors;
172         for(unsigned int i = 0; i < num_tensors; ++i)
173         {
174             auto err = acl::StatusCode::Success;
175             tensors.emplace_back(acl::Tensor(ctx, desc, &err));
176             ARM_COMPUTE_ASSERT(err == acl::StatusCode::Success);
177             ARM_COMPUTE_ASSERT(pack.add(tensors.back(), static_cast<int32_t>(AclTensorSlot::AclSrcVec) + i) == acl::StatusCode::Success);
178         }
179     };
180 };
181 } // namespace validation
182 } // namespace test
183 } // namespace arm_compute
184 #endif /* ARM_COMPUTE_TEST_UNIT_TENSORPACK_FIXTURE */
185