02bbd0e08ae212bcdeba992695c9cab2cafc465c
[platform/core/ml/nnfw.git] / tests / nnfw_api / src / ValidationTestAddSessionPrepared.cc
1 /*
2  * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *    http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #include "fixtures.h"
18 #include "NNPackages.h"
19
20 using ValidationTestAddSessionPrepared = ValidationTestSessionPrepared<NNPackages::ADD>;
21
22 TEST_F(ValidationTestAddSessionPrepared, run)
23 {
24   SetInOutBuffers();
25   _input[0] = 3.0;
26   NNFW_ENSURE_SUCCESS(nnfw_run(_session));
27   ASSERT_FLOAT_EQ(_output[0], 5.0);
28 }
29
30 TEST_F(ValidationTestAddSessionPrepared, run_twice)
31 {
32   SetInOutBuffers();
33   _input[0] = 4.0;
34   NNFW_ENSURE_SUCCESS(nnfw_run(_session));
35   ASSERT_FLOAT_EQ(_output[0], 6.0);
36
37   _input[0] = 5.0f;
38   NNFW_ENSURE_SUCCESS(nnfw_run(_session));
39   ASSERT_FLOAT_EQ(_output[0], 7.0);
40 }
41
42 TEST_F(ValidationTestAddSessionPrepared, run_many_times_dynamic_input)
43 {
44   for (int v = 1; v <= 5; v++) // 5 times with different shapes
45   {
46     nnfw_tensorinfo ti_input = {NNFW_TYPE_TENSOR_FLOAT32, 4, {1, 1, 1, v}};
47     SetInOutBuffersDynamic(&ti_input);
48
49     for (int i = 0; i < v; i++)
50       _input[i] = i * 10.0;
51
52     NNFW_ENSURE_SUCCESS(nnfw_run(_session));
53
54     // Check if the shape inference is correct
55     nnfw_tensorinfo ti_output;
56     ASSERT_EQ(nnfw_output_tensorinfo(_session, 0, &ti_output), NNFW_STATUS_NO_ERROR);
57     EXPECT_EQ(num_elems(&ti_input), num_elems(&ti_output));
58
59     for (int i = 0; i < v; i++)
60       ASSERT_FLOAT_EQ(_output[i], i * 10.0 + 2.0) << "i : " << i;
61   }
62 }
63
64 TEST_F(ValidationTestAddSessionPrepared, run_async)
65 {
66   SetInOutBuffers();
67   _input[0] = 3.0;
68   NNFW_ENSURE_SUCCESS(nnfw_run_async(_session));
69   NNFW_ENSURE_SUCCESS(nnfw_await(_session));
70   ASSERT_FLOAT_EQ(_output[0], 5.0);
71 }
72
73 TEST_F(ValidationTestAddSessionPrepared, set_input_001)
74 {
75   char input[32];
76   ASSERT_EQ(nnfw_set_input(_session, 0, NNFW_TYPE_TENSOR_FLOAT32, input, sizeof(input)),
77             NNFW_STATUS_NO_ERROR);
78 }
79
80 TEST_F(ValidationTestAddSessionPrepared, get_input_size)
81 {
82   uint32_t size = 0;
83   NNFW_ENSURE_SUCCESS(nnfw_input_size(_session, &size));
84   ASSERT_EQ(size, 1);
85 }
86
87 TEST_F(ValidationTestAddSessionPrepared, get_output_size)
88 {
89   uint32_t size = 0;
90   NNFW_ENSURE_SUCCESS(nnfw_output_size(_session, &size));
91   ASSERT_EQ(size, 1);
92 }
93
94 TEST_F(ValidationTestAddSessionPrepared, output_tensorinfo)
95 {
96   nnfw_tensorinfo tensor_info;
97   NNFW_ENSURE_SUCCESS(nnfw_output_tensorinfo(_session, 0, &tensor_info));
98   ASSERT_EQ(tensor_info.rank, 1);
99   ASSERT_EQ(tensor_info.dims[0], 1);
100 }
101
102 TEST_F(ValidationTestAddSessionPrepared, neg_await_without_async_run)
103 {
104   SetInOutBuffers();
105   ASSERT_EQ(nnfw_await(_session), NNFW_STATUS_ERROR);
106 }
107
108 TEST_F(ValidationTestAddSessionPrepared, neg_await_after_sync_run)
109 {
110   SetInOutBuffers();
111   NNFW_ENSURE_SUCCESS(nnfw_run(_session));
112   ASSERT_EQ(nnfw_await(_session), NNFW_STATUS_ERROR);
113 }
114
115 TEST_F(ValidationTestAddSessionPrepared, neg_await_twice)
116 {
117   SetInOutBuffers();
118   NNFW_ENSURE_SUCCESS(nnfw_run_async(_session));
119   NNFW_ENSURE_SUCCESS(nnfw_await(_session));
120   ASSERT_EQ(nnfw_await(_session), NNFW_STATUS_ERROR);
121 }
122
123 TEST_F(ValidationTestAddSessionPrepared, neg_run_during_async_run)
124 {
125   SetInOutBuffers();
126   NNFW_ENSURE_SUCCESS(nnfw_run_async(_session));
127   EXPECT_EQ(nnfw_run(_session), NNFW_STATUS_INVALID_STATE);
128   NNFW_ENSURE_SUCCESS(nnfw_await(_session));
129 }
130
131 TEST_F(ValidationTestAddSessionPrepared, neg_set_input_001)
132 {
133   ASSERT_EQ(nnfw_set_input(_session, 0, NNFW_TYPE_TENSOR_FLOAT32, nullptr, 1), NNFW_STATUS_ERROR);
134 }
135
136 TEST_F(ValidationTestAddSessionPrepared, neg_set_input_002)
137 {
138   char input[1]; // buffer size is too small
139   ASSERT_EQ(nnfw_set_input(_session, 0, NNFW_TYPE_TENSOR_FLOAT32, input, sizeof(input)),
140             NNFW_STATUS_ERROR);
141 }
142
143 TEST_F(ValidationTestAddSessionPrepared, set_output_001)
144 {
145   char buffer[32];
146   ASSERT_EQ(nnfw_set_input(_session, 0, NNFW_TYPE_TENSOR_FLOAT32, buffer, sizeof(buffer)),
147             NNFW_STATUS_NO_ERROR);
148 }
149
150 TEST_F(ValidationTestAddSessionPrepared, neg_set_output_001)
151 {
152   ASSERT_EQ(nnfw_set_output(_session, 0, NNFW_TYPE_TENSOR_FLOAT32, nullptr, 1), NNFW_STATUS_ERROR);
153 }
154
155 TEST_F(ValidationTestAddSessionPrepared, neg_set_output_002)
156 {
157   char input[1]; // buffer size is too small
158   ASSERT_EQ(nnfw_set_output(_session, 0, NNFW_TYPE_TENSOR_FLOAT32, input, sizeof(input)),
159             NNFW_STATUS_ERROR);
160 }
161
162 TEST_F(ValidationTestAddSessionPrepared, neg_get_input_size)
163 {
164   ASSERT_EQ(nnfw_input_size(_session, nullptr), NNFW_STATUS_UNEXPECTED_NULL);
165 }
166
167 TEST_F(ValidationTestAddSessionPrepared, neg_get_output_size)
168 {
169   ASSERT_EQ(nnfw_output_size(_session, nullptr), NNFW_STATUS_UNEXPECTED_NULL);
170 }
171
172 TEST_F(ValidationTestAddSessionPrepared, neg_load_model)
173 {
174   // Load model twice
175   ASSERT_EQ(nnfw_load_model_from_file(
176                 _session, NNPackages::get().getModelAbsolutePath(NNPackages::ADD).c_str()),
177             NNFW_STATUS_INVALID_STATE);
178 }
179
180 TEST_F(ValidationTestAddSessionPrepared, neg_prepare)
181 {
182   // Call Prepare twice
183   ASSERT_EQ(nnfw_prepare(_session), NNFW_STATUS_INVALID_STATE);
184 }
185
186 TEST_F(ValidationTestAddSessionPrepared, neg_run_without_set_output)
187 {
188   uint8_t input[4];
189   NNFW_ENSURE_SUCCESS(nnfw_set_input(_session, 0, NNFW_TYPE_TENSOR_FLOAT32, input, sizeof(input)));
190   // `nnfw_set_output()` is not called
191   ASSERT_EQ(nnfw_run(_session), NNFW_STATUS_ERROR);
192 }
193
194 TEST_F(ValidationTestAddSessionPrepared, neg_internal_set_config)
195 {
196   // All arguments are valid, but the session state is wrong
197   ASSERT_EQ(nnfw_set_config(_session, "TRACE_FILEPATH", ""), NNFW_STATUS_INVALID_STATE);
198   ASSERT_EQ(nnfw_set_config(_session, "GRAPH_DOT_DUMP", "0"), NNFW_STATUS_INVALID_STATE);
199 }
200
201 // TODO Validation check when "nnfw_run" is called without input & output tensor setting