blob: 0d8c141582cb3a6f7de2b62972627256445aafec [file] [log] [blame]
Michael Butler6e492a62020-12-10 15:38:45 -08001/*
2 * Copyright (C) 2020 The Android Open Source Project
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 "MockDevice.h"
18#include "MockPreparedModel.h"
19
20#include <android/hardware/neuralnetworks/1.2/IDevice.h>
21#include <gmock/gmock.h>
22#include <gtest/gtest.h>
23#include <nnapi/IDevice.h>
24#include <nnapi/TypeUtils.h>
25#include <nnapi/Types.h>
26#include <nnapi/hal/1.2/Device.h>
27
28#include <functional>
29#include <memory>
30#include <string>
31
32namespace android::hardware::neuralnetworks::V1_2::utils {
33namespace {
34
35using ::testing::_;
36using ::testing::Invoke;
37using ::testing::InvokeWithoutArgs;
38
39const nn::Model kSimpleModel = {
40 .main = {.operands = {{.type = nn::OperandType::TENSOR_FLOAT32,
41 .dimensions = {1},
42 .lifetime = nn::Operand::LifeTime::SUBGRAPH_INPUT},
43 {.type = nn::OperandType::TENSOR_FLOAT32,
44 .dimensions = {1},
45 .lifetime = nn::Operand::LifeTime::SUBGRAPH_OUTPUT}},
46 .operations = {{.type = nn::OperationType::RELU, .inputs = {0}, .outputs = {1}}},
47 .inputIndexes = {0},
48 .outputIndexes = {1}}};
49
50const std::string kName = "Google-MockV1";
51const std::string kInvalidName = "";
52const sp<V1_2::IDevice> kInvalidDevice;
53constexpr V1_0::PerformanceInfo kNoPerformanceInfo = {
54 .execTime = std::numeric_limits<float>::max(),
55 .powerUsage = std::numeric_limits<float>::max()};
56
57template <typename... Args>
58auto makeCallbackReturn(Args&&... args) {
59 return [argPack = std::make_tuple(std::forward<Args>(args)...)](const auto& cb) {
60 std::apply(cb, argPack);
61 return Void();
62 };
63}
64
65sp<MockDevice> createMockDevice() {
66 const auto mockDevice = MockDevice::create();
67
68 // Setup default actions for each relevant call.
69 const auto getVersionString_ret = makeCallbackReturn(V1_0::ErrorStatus::NONE, kName);
70 const auto getType_ret = makeCallbackReturn(V1_0::ErrorStatus::NONE, V1_2::DeviceType::OTHER);
71 const auto getSupportedExtensions_ret =
72 makeCallbackReturn(V1_0::ErrorStatus::NONE, hidl_vec<V1_2::Extension>{});
73 const auto getNumberOfCacheFilesNeeded_ret = makeCallbackReturn(
74 V1_0::ErrorStatus::NONE, nn::kMaxNumberOfCacheFiles, nn::kMaxNumberOfCacheFiles);
75 const auto getCapabilities_ret = makeCallbackReturn(
76 V1_0::ErrorStatus::NONE,
77 V1_2::Capabilities{
78 .relaxedFloat32toFloat16PerformanceScalar = kNoPerformanceInfo,
79 .relaxedFloat32toFloat16PerformanceTensor = kNoPerformanceInfo,
80 });
81
82 // Setup default actions for each relevant call.
83 ON_CALL(*mockDevice, getVersionString(_)).WillByDefault(Invoke(getVersionString_ret));
84 ON_CALL(*mockDevice, getType(_)).WillByDefault(Invoke(getType_ret));
85 ON_CALL(*mockDevice, getSupportedExtensions(_))
86 .WillByDefault(Invoke(getSupportedExtensions_ret));
87 ON_CALL(*mockDevice, getNumberOfCacheFilesNeeded(_))
88 .WillByDefault(Invoke(getNumberOfCacheFilesNeeded_ret));
89 ON_CALL(*mockDevice, getCapabilities_1_2(_)).WillByDefault(Invoke(getCapabilities_ret));
90
91 // Ensure that older calls are not used.
92 EXPECT_CALL(*mockDevice, getCapabilities(_)).Times(0);
93 EXPECT_CALL(*mockDevice, getCapabilities_1_1(_)).Times(0);
94 EXPECT_CALL(*mockDevice, getSupportedOperations(_, _)).Times(0);
95 EXPECT_CALL(*mockDevice, getSupportedOperations_1_1(_, _)).Times(0);
96 EXPECT_CALL(*mockDevice, prepareModel(_, _)).Times(0);
97 EXPECT_CALL(*mockDevice, prepareModel_1_1(_, _, _)).Times(0);
98
99 // These EXPECT_CALL(...).Times(testing::AnyNumber()) calls are to suppress warnings on the
100 // uninteresting methods calls.
101 EXPECT_CALL(*mockDevice, getVersionString(_)).Times(testing::AnyNumber());
102 EXPECT_CALL(*mockDevice, getType(_)).Times(testing::AnyNumber());
103 EXPECT_CALL(*mockDevice, getSupportedExtensions(_)).Times(testing::AnyNumber());
104 EXPECT_CALL(*mockDevice, getNumberOfCacheFilesNeeded(_)).Times(testing::AnyNumber());
105 EXPECT_CALL(*mockDevice, getCapabilities_1_2(_)).Times(testing::AnyNumber());
106
107 return mockDevice;
108}
109
110auto makePreparedModelReturn(V1_0::ErrorStatus launchStatus, V1_0::ErrorStatus returnStatus,
111 const sp<MockPreparedModel>& preparedModel) {
112 return [launchStatus, returnStatus, preparedModel](
113 const V1_2::Model& /*model*/, V1_1::ExecutionPreference /*preference*/,
114 const hardware::hidl_vec<hardware::hidl_handle>& /*modelCache*/,
115 const hardware::hidl_vec<hardware::hidl_handle>& /*dataCache*/,
116 const CacheToken& /*token*/, const sp<V1_2::IPreparedModelCallback>& cb)
117 -> hardware::Return<V1_0::ErrorStatus> {
118 cb->notify_1_2(returnStatus, preparedModel).isOk();
119 return launchStatus;
120 };
121}
122auto makePreparedModelFromCacheReturn(V1_0::ErrorStatus launchStatus,
123 V1_0::ErrorStatus returnStatus,
124 const sp<MockPreparedModel>& preparedModel) {
125 return [launchStatus, returnStatus, preparedModel](
126 const hardware::hidl_vec<hardware::hidl_handle>& /*modelCache*/,
127 const hardware::hidl_vec<hardware::hidl_handle>& /*dataCache*/,
128 const CacheToken& /*token*/, const sp<V1_2::IPreparedModelCallback>& cb)
129 -> hardware::Return<V1_0::ErrorStatus> {
130 cb->notify_1_2(returnStatus, preparedModel).isOk();
131 return launchStatus;
132 };
133}
134
135std::function<hardware::Status()> makeTransportFailure(status_t status) {
136 return [status] { return hardware::Status::fromStatusT(status); };
137}
138
139const auto makeGeneralTransportFailure = makeTransportFailure(NO_MEMORY);
140const auto makeDeadObjectFailure = makeTransportFailure(DEAD_OBJECT);
141
142} // namespace
143
144TEST(DeviceTest, invalidName) {
145 // run test
146 const auto device = MockDevice::create();
147 const auto result = Device::create(kInvalidName, device);
148
149 // verify result
150 ASSERT_FALSE(result.has_value());
151 EXPECT_EQ(result.error().code, nn::ErrorStatus::INVALID_ARGUMENT);
152}
153
154TEST(DeviceTest, invalidDevice) {
155 // run test
156 const auto result = Device::create(kName, kInvalidDevice);
157
158 // verify result
159 ASSERT_FALSE(result.has_value());
160 EXPECT_EQ(result.error().code, nn::ErrorStatus::INVALID_ARGUMENT);
161}
162
163TEST(DeviceTest, getVersionStringError) {
164 // setup call
165 const auto mockDevice = createMockDevice();
166 const auto ret = makeCallbackReturn(V1_0::ErrorStatus::GENERAL_FAILURE, "");
167 EXPECT_CALL(*mockDevice, getVersionString(_)).Times(1).WillOnce(Invoke(ret));
168
169 // run test
170 const auto result = Device::create(kName, mockDevice);
171
172 // verify result
173 ASSERT_FALSE(result.has_value());
174 EXPECT_EQ(result.error().code, nn::ErrorStatus::GENERAL_FAILURE);
175}
176
177TEST(DeviceTest, getVersionStringTransportFailure) {
178 // setup call
179 const auto mockDevice = createMockDevice();
180 EXPECT_CALL(*mockDevice, getVersionString(_))
181 .Times(1)
182 .WillOnce(InvokeWithoutArgs(makeGeneralTransportFailure));
183
184 // run test
185 const auto result = Device::create(kName, mockDevice);
186
187 // verify result
188 ASSERT_FALSE(result.has_value());
189 EXPECT_EQ(result.error().code, nn::ErrorStatus::GENERAL_FAILURE);
190}
191
192TEST(DeviceTest, getVersionStringDeadObject) {
193 // setup call
194 const auto mockDevice = createMockDevice();
195 EXPECT_CALL(*mockDevice, getVersionString(_))
196 .Times(1)
197 .WillOnce(InvokeWithoutArgs(makeDeadObjectFailure));
198
199 // run test
200 const auto result = Device::create(kName, mockDevice);
201
202 // verify result
203 ASSERT_FALSE(result.has_value());
204 EXPECT_EQ(result.error().code, nn::ErrorStatus::DEAD_OBJECT);
205}
206
207TEST(DeviceTest, getTypeError) {
208 // setup call
209 const auto mockDevice = createMockDevice();
210 const auto ret =
211 makeCallbackReturn(V1_0::ErrorStatus::GENERAL_FAILURE, V1_2::DeviceType::OTHER);
212 EXPECT_CALL(*mockDevice, getType(_)).Times(1).WillOnce(Invoke(ret));
213
214 // run test
215 const auto result = Device::create(kName, mockDevice);
216
217 // verify result
218 ASSERT_FALSE(result.has_value());
219 EXPECT_EQ(result.error().code, nn::ErrorStatus::GENERAL_FAILURE);
220}
221
222TEST(DeviceTest, getTypeTransportFailure) {
223 // setup call
224 const auto mockDevice = createMockDevice();
225 EXPECT_CALL(*mockDevice, getType(_))
226 .Times(1)
227 .WillOnce(InvokeWithoutArgs(makeGeneralTransportFailure));
228
229 // run test
230 const auto result = Device::create(kName, mockDevice);
231
232 // verify result
233 ASSERT_FALSE(result.has_value());
234 EXPECT_EQ(result.error().code, nn::ErrorStatus::GENERAL_FAILURE);
235}
236
237TEST(DeviceTest, getTypeDeadObject) {
238 // setup call
239 const auto mockDevice = createMockDevice();
240 EXPECT_CALL(*mockDevice, getType(_))
241 .Times(1)
242 .WillOnce(InvokeWithoutArgs(makeDeadObjectFailure));
243
244 // run test
245 const auto result = Device::create(kName, mockDevice);
246
247 // verify result
248 ASSERT_FALSE(result.has_value());
249 EXPECT_EQ(result.error().code, nn::ErrorStatus::DEAD_OBJECT);
250}
251
252TEST(DeviceTest, getSupportedExtensionsError) {
253 // setup call
254 const auto mockDevice = createMockDevice();
255 const auto ret =
256 makeCallbackReturn(V1_0::ErrorStatus::GENERAL_FAILURE, hidl_vec<V1_2::Extension>{});
257 EXPECT_CALL(*mockDevice, getSupportedExtensions(_)).Times(1).WillOnce(Invoke(ret));
258
259 // run test
260 const auto result = Device::create(kName, mockDevice);
261
262 // verify result
263 ASSERT_FALSE(result.has_value());
264 EXPECT_EQ(result.error().code, nn::ErrorStatus::GENERAL_FAILURE);
265}
266
267TEST(DeviceTest, getSupportedExtensionsTransportFailure) {
268 // setup call
269 const auto mockDevice = createMockDevice();
270 EXPECT_CALL(*mockDevice, getSupportedExtensions(_))
271 .Times(1)
272 .WillOnce(InvokeWithoutArgs(makeGeneralTransportFailure));
273
274 // run test
275 const auto result = Device::create(kName, mockDevice);
276
277 // verify result
278 ASSERT_FALSE(result.has_value());
279 EXPECT_EQ(result.error().code, nn::ErrorStatus::GENERAL_FAILURE);
280}
281
282TEST(DeviceTest, getSupportedExtensionsDeadObject) {
283 // setup call
284 const auto mockDevice = createMockDevice();
285 EXPECT_CALL(*mockDevice, getSupportedExtensions(_))
286 .Times(1)
287 .WillOnce(InvokeWithoutArgs(makeDeadObjectFailure));
288
289 // run test
290 const auto result = Device::create(kName, mockDevice);
291
292 // verify result
293 ASSERT_FALSE(result.has_value());
294 EXPECT_EQ(result.error().code, nn::ErrorStatus::DEAD_OBJECT);
295}
296
297TEST(DeviceTest, getNumberOfCacheFilesNeededError) {
298 // setup call
299 const auto mockDevice = createMockDevice();
300 const auto ret = makeCallbackReturn(V1_0::ErrorStatus::GENERAL_FAILURE,
301 nn::kMaxNumberOfCacheFiles, nn::kMaxNumberOfCacheFiles);
302 EXPECT_CALL(*mockDevice, getNumberOfCacheFilesNeeded(_)).Times(1).WillOnce(Invoke(ret));
303
304 // run test
305 const auto result = Device::create(kName, mockDevice);
306
307 // verify result
308 ASSERT_FALSE(result.has_value());
309 EXPECT_EQ(result.error().code, nn::ErrorStatus::GENERAL_FAILURE);
310}
311
312TEST(DeviceTest, dataCacheFilesExceedsSpecifiedMax) {
313 // setup test
314 const auto mockDevice = createMockDevice();
315 const auto ret = makeCallbackReturn(V1_0::ErrorStatus::NONE, nn::kMaxNumberOfCacheFiles + 1,
316 nn::kMaxNumberOfCacheFiles);
317 EXPECT_CALL(*mockDevice, getNumberOfCacheFilesNeeded(_)).Times(1).WillOnce(Invoke(ret));
318
319 // run test
320 const auto result = Device::create(kName, mockDevice);
321
322 // verify result
323 ASSERT_FALSE(result.has_value());
324 EXPECT_EQ(result.error().code, nn::ErrorStatus::GENERAL_FAILURE);
325}
326
327TEST(DeviceTest, modelCacheFilesExceedsSpecifiedMax) {
328 // setup test
329 const auto mockDevice = createMockDevice();
330 const auto ret = makeCallbackReturn(V1_0::ErrorStatus::NONE, nn::kMaxNumberOfCacheFiles,
331 nn::kMaxNumberOfCacheFiles + 1);
332 EXPECT_CALL(*mockDevice, getNumberOfCacheFilesNeeded(_)).Times(1).WillOnce(Invoke(ret));
333
334 // run test
335 const auto result = Device::create(kName, mockDevice);
336
337 // verify result
338 ASSERT_FALSE(result.has_value());
339 EXPECT_EQ(result.error().code, nn::ErrorStatus::GENERAL_FAILURE);
340}
341
342TEST(DeviceTest, getNumberOfCacheFilesNeededTransportFailure) {
343 // setup call
344 const auto mockDevice = createMockDevice();
345 EXPECT_CALL(*mockDevice, getNumberOfCacheFilesNeeded(_))
346 .Times(1)
347 .WillOnce(InvokeWithoutArgs(makeGeneralTransportFailure));
348
349 // run test
350 const auto result = Device::create(kName, mockDevice);
351
352 // verify result
353 ASSERT_FALSE(result.has_value());
354 EXPECT_EQ(result.error().code, nn::ErrorStatus::GENERAL_FAILURE);
355}
356
357TEST(DeviceTest, getNumberOfCacheFilesNeededDeadObject) {
358 // setup call
359 const auto mockDevice = createMockDevice();
360 EXPECT_CALL(*mockDevice, getNumberOfCacheFilesNeeded(_))
361 .Times(1)
362 .WillOnce(InvokeWithoutArgs(makeDeadObjectFailure));
363
364 // run test
365 const auto result = Device::create(kName, mockDevice);
366
367 // verify result
368 ASSERT_FALSE(result.has_value());
369 EXPECT_EQ(result.error().code, nn::ErrorStatus::DEAD_OBJECT);
370}
371
372TEST(DeviceTest, getCapabilitiesError) {
373 // setup call
374 const auto mockDevice = createMockDevice();
375 const auto ret = makeCallbackReturn(
376 V1_0::ErrorStatus::GENERAL_FAILURE,
377 V1_2::Capabilities{
378 .relaxedFloat32toFloat16PerformanceScalar = kNoPerformanceInfo,
379 .relaxedFloat32toFloat16PerformanceTensor = kNoPerformanceInfo,
380 });
381 EXPECT_CALL(*mockDevice, getCapabilities_1_2(_)).Times(1).WillOnce(Invoke(ret));
382
383 // run test
384 const auto result = Device::create(kName, mockDevice);
385
386 // verify result
387 ASSERT_FALSE(result.has_value());
388 EXPECT_EQ(result.error().code, nn::ErrorStatus::GENERAL_FAILURE);
389}
390
391TEST(DeviceTest, getCapabilitiesTransportFailure) {
392 // setup call
393 const auto mockDevice = createMockDevice();
394 EXPECT_CALL(*mockDevice, getCapabilities_1_2(_))
395 .Times(1)
396 .WillOnce(InvokeWithoutArgs(makeGeneralTransportFailure));
397
398 // run test
399 const auto result = Device::create(kName, mockDevice);
400
401 // verify result
402 ASSERT_FALSE(result.has_value());
403 EXPECT_EQ(result.error().code, nn::ErrorStatus::GENERAL_FAILURE);
404}
405
406TEST(DeviceTest, getCapabilitiesDeadObject) {
407 // setup call
408 const auto mockDevice = createMockDevice();
409 EXPECT_CALL(*mockDevice, getCapabilities_1_2(_))
410 .Times(1)
411 .WillOnce(InvokeWithoutArgs(makeDeadObjectFailure));
412
413 // run test
414 const auto result = Device::create(kName, mockDevice);
415
416 // verify result
417 ASSERT_FALSE(result.has_value());
418 EXPECT_EQ(result.error().code, nn::ErrorStatus::DEAD_OBJECT);
419}
420
421TEST(DeviceTest, linkToDeathError) {
422 // setup call
423 const auto mockDevice = createMockDevice();
424 const auto ret = []() -> Return<bool> { return false; };
425 EXPECT_CALL(*mockDevice, linkToDeathRet()).Times(1).WillOnce(InvokeWithoutArgs(ret));
426
427 // run test
428 const auto result = Device::create(kName, mockDevice);
429
430 // verify result
431 ASSERT_FALSE(result.has_value());
432 EXPECT_EQ(result.error().code, nn::ErrorStatus::GENERAL_FAILURE);
433}
434
435TEST(DeviceTest, linkToDeathTransportFailure) {
436 // setup call
437 const auto mockDevice = createMockDevice();
438 EXPECT_CALL(*mockDevice, linkToDeathRet())
439 .Times(1)
440 .WillOnce(InvokeWithoutArgs(makeGeneralTransportFailure));
441
442 // run test
443 const auto result = Device::create(kName, mockDevice);
444
445 // verify result
446 ASSERT_FALSE(result.has_value());
447 EXPECT_EQ(result.error().code, nn::ErrorStatus::GENERAL_FAILURE);
448}
449
450TEST(DeviceTest, linkToDeathDeadObject) {
451 // setup call
452 const auto mockDevice = createMockDevice();
453 EXPECT_CALL(*mockDevice, linkToDeathRet())
454 .Times(1)
455 .WillOnce(InvokeWithoutArgs(makeDeadObjectFailure));
456
457 // run test
458 const auto result = Device::create(kName, mockDevice);
459
460 // verify result
461 ASSERT_FALSE(result.has_value());
462 EXPECT_EQ(result.error().code, nn::ErrorStatus::DEAD_OBJECT);
463}
464
465TEST(DeviceTest, getName) {
466 // setup call
467 const auto mockDevice = createMockDevice();
468 const auto device = Device::create(kName, mockDevice).value();
469
470 // run test
471 const auto& name = device->getName();
472
473 // verify result
474 EXPECT_EQ(name, kName);
475}
476
477TEST(DeviceTest, getFeatureLevel) {
478 // setup call
479 const auto mockDevice = createMockDevice();
480 const auto device = Device::create(kName, mockDevice).value();
481
482 // run test
483 const auto featureLevel = device->getFeatureLevel();
484
485 // verify result
Michael Butler60a7b862021-11-17 16:33:35 -0800486 EXPECT_EQ(featureLevel, nn::kVersionFeatureLevel3);
Michael Butler6e492a62020-12-10 15:38:45 -0800487}
488
489TEST(DeviceTest, getCachedData) {
490 // setup call
491 const auto mockDevice = createMockDevice();
492 EXPECT_CALL(*mockDevice, getVersionString(_)).Times(1);
493 EXPECT_CALL(*mockDevice, getType(_)).Times(1);
494 EXPECT_CALL(*mockDevice, getSupportedExtensions(_)).Times(1);
495 EXPECT_CALL(*mockDevice, getNumberOfCacheFilesNeeded(_)).Times(1);
496 EXPECT_CALL(*mockDevice, getCapabilities_1_2(_)).Times(1);
497
498 const auto result = Device::create(kName, mockDevice);
499 ASSERT_TRUE(result.has_value())
500 << "Failed with " << result.error().code << ": " << result.error().message;
501 const auto& device = result.value();
502
503 // run test and verify results
504 EXPECT_EQ(device->getVersionString(), device->getVersionString());
505 EXPECT_EQ(device->getType(), device->getType());
506 EXPECT_EQ(device->getSupportedExtensions(), device->getSupportedExtensions());
507 EXPECT_EQ(device->getNumberOfCacheFilesNeeded(), device->getNumberOfCacheFilesNeeded());
508 EXPECT_EQ(device->getCapabilities(), device->getCapabilities());
509}
510
511TEST(DeviceTest, wait) {
512 // setup call
513 const auto mockDevice = createMockDevice();
514 const auto ret = []() -> Return<void> { return {}; };
515 EXPECT_CALL(*mockDevice, ping()).Times(1).WillOnce(InvokeWithoutArgs(ret));
516 const auto device = Device::create(kName, mockDevice).value();
517
518 // run test
519 const auto result = device->wait();
520
521 // verify result
522 ASSERT_TRUE(result.has_value())
523 << "Failed with " << result.error().code << ": " << result.error().message;
524}
525
526TEST(DeviceTest, waitTransportFailure) {
527 // setup call
528 const auto mockDevice = createMockDevice();
529 EXPECT_CALL(*mockDevice, ping())
530 .Times(1)
531 .WillOnce(InvokeWithoutArgs(makeGeneralTransportFailure));
532 const auto device = Device::create(kName, mockDevice).value();
533
534 // run test
535 const auto result = device->wait();
536
537 // verify result
538 ASSERT_FALSE(result.has_value());
539 EXPECT_EQ(result.error().code, nn::ErrorStatus::GENERAL_FAILURE);
540}
541
542TEST(DeviceTest, waitDeadObject) {
543 // setup call
544 const auto mockDevice = createMockDevice();
545 EXPECT_CALL(*mockDevice, ping()).Times(1).WillOnce(InvokeWithoutArgs(makeDeadObjectFailure));
546 const auto device = Device::create(kName, mockDevice).value();
547
548 // run test
549 const auto result = device->wait();
550
551 // verify result
552 ASSERT_FALSE(result.has_value());
553 EXPECT_EQ(result.error().code, nn::ErrorStatus::DEAD_OBJECT);
554}
555
556TEST(DeviceTest, getSupportedOperations) {
557 // setup call
558 const auto mockDevice = createMockDevice();
559 const auto device = Device::create(kName, mockDevice).value();
560 const auto ret = [](const auto& model, const auto& cb) {
561 cb(V1_0::ErrorStatus::NONE, std::vector<bool>(model.operations.size(), true));
562 return hardware::Void();
563 };
564 EXPECT_CALL(*mockDevice, getSupportedOperations_1_2(_, _)).Times(1).WillOnce(Invoke(ret));
565
566 // run test
567 const auto result = device->getSupportedOperations(kSimpleModel);
568
569 // verify result
570 ASSERT_TRUE(result.has_value())
571 << "Failed with " << result.error().code << ": " << result.error().message;
572 const auto& supportedOperations = result.value();
573 EXPECT_EQ(supportedOperations.size(), kSimpleModel.main.operations.size());
574 EXPECT_THAT(supportedOperations, Each(testing::IsTrue()));
575}
576
577TEST(DeviceTest, getSupportedOperationsError) {
578 // setup call
579 const auto mockDevice = createMockDevice();
580 const auto device = Device::create(kName, mockDevice).value();
581 const auto ret = [](const auto& /*model*/, const auto& cb) {
582 cb(V1_0::ErrorStatus::GENERAL_FAILURE, {});
583 return hardware::Void();
584 };
585 EXPECT_CALL(*mockDevice, getSupportedOperations_1_2(_, _)).Times(1).WillOnce(Invoke(ret));
586
587 // run test
588 const auto result = device->getSupportedOperations(kSimpleModel);
589
590 // verify result
591 ASSERT_FALSE(result.has_value());
592 EXPECT_EQ(result.error().code, nn::ErrorStatus::GENERAL_FAILURE);
593}
594
595TEST(DeviceTest, getSupportedOperationsTransportFailure) {
596 // setup call
597 const auto mockDevice = createMockDevice();
598 const auto device = Device::create(kName, mockDevice).value();
599 EXPECT_CALL(*mockDevice, getSupportedOperations_1_2(_, _))
600 .Times(1)
601 .WillOnce(InvokeWithoutArgs(makeGeneralTransportFailure));
602
603 // run test
604 const auto result = device->getSupportedOperations(kSimpleModel);
605
606 // verify result
607 ASSERT_FALSE(result.has_value());
608 EXPECT_EQ(result.error().code, nn::ErrorStatus::GENERAL_FAILURE);
609}
610
611TEST(DeviceTest, getSupportedOperationsDeadObject) {
612 // setup call
613 const auto mockDevice = createMockDevice();
614 const auto device = Device::create(kName, mockDevice).value();
615 EXPECT_CALL(*mockDevice, getSupportedOperations_1_2(_, _))
616 .Times(1)
617 .WillOnce(InvokeWithoutArgs(makeDeadObjectFailure));
618
619 // run test
620 const auto result = device->getSupportedOperations(kSimpleModel);
621
622 // verify result
623 ASSERT_FALSE(result.has_value());
624 EXPECT_EQ(result.error().code, nn::ErrorStatus::DEAD_OBJECT);
625}
626
627TEST(DeviceTest, prepareModel) {
628 // setup call
629 const auto mockDevice = createMockDevice();
630 const auto device = Device::create(kName, mockDevice).value();
631 const auto mockPreparedModel = MockPreparedModel::create();
632 EXPECT_CALL(*mockDevice, prepareModel_1_2(_, _, _, _, _, _))
633 .Times(1)
634 .WillOnce(Invoke(makePreparedModelReturn(V1_0::ErrorStatus::NONE,
635 V1_0::ErrorStatus::NONE, mockPreparedModel)));
636
637 // run test
638 const auto result = device->prepareModel(kSimpleModel, nn::ExecutionPreference::DEFAULT,
Miao Wangb5c8a822021-10-26 20:03:05 +0000639 nn::Priority::DEFAULT, {}, {}, {}, {}, {}, {});
Michael Butler6e492a62020-12-10 15:38:45 -0800640
641 // verify result
642 ASSERT_TRUE(result.has_value())
643 << "Failed with " << result.error().code << ": " << result.error().message;
644 EXPECT_NE(result.value(), nullptr);
645}
646
647TEST(DeviceTest, prepareModelLaunchError) {
648 // setup call
649 const auto mockDevice = createMockDevice();
650 const auto device = Device::create(kName, mockDevice).value();
651 EXPECT_CALL(*mockDevice, prepareModel_1_2(_, _, _, _, _, _))
652 .Times(1)
653 .WillOnce(Invoke(makePreparedModelReturn(V1_0::ErrorStatus::GENERAL_FAILURE,
654 V1_0::ErrorStatus::GENERAL_FAILURE, nullptr)));
655
656 // run test
657 const auto result = device->prepareModel(kSimpleModel, nn::ExecutionPreference::DEFAULT,
Miao Wangb5c8a822021-10-26 20:03:05 +0000658 nn::Priority::DEFAULT, {}, {}, {}, {}, {}, {});
Michael Butler6e492a62020-12-10 15:38:45 -0800659
660 // verify result
661 ASSERT_FALSE(result.has_value());
662 EXPECT_EQ(result.error().code, nn::ErrorStatus::GENERAL_FAILURE);
663}
664
665TEST(DeviceTest, prepareModelReturnError) {
666 // setup call
667 const auto mockDevice = createMockDevice();
668 const auto device = Device::create(kName, mockDevice).value();
669 EXPECT_CALL(*mockDevice, prepareModel_1_2(_, _, _, _, _, _))
670 .Times(1)
671 .WillOnce(Invoke(makePreparedModelReturn(V1_0::ErrorStatus::NONE,
672 V1_0::ErrorStatus::GENERAL_FAILURE, nullptr)));
673
674 // run test
675 const auto result = device->prepareModel(kSimpleModel, nn::ExecutionPreference::DEFAULT,
Miao Wangb5c8a822021-10-26 20:03:05 +0000676 nn::Priority::DEFAULT, {}, {}, {}, {}, {}, {});
Michael Butler6e492a62020-12-10 15:38:45 -0800677
678 // verify result
679 ASSERT_FALSE(result.has_value());
680 EXPECT_EQ(result.error().code, nn::ErrorStatus::GENERAL_FAILURE);
681}
682
683TEST(DeviceTest, prepareModelNullptrError) {
684 // setup call
685 const auto mockDevice = createMockDevice();
686 const auto device = Device::create(kName, mockDevice).value();
687 EXPECT_CALL(*mockDevice, prepareModel_1_2(_, _, _, _, _, _))
688 .Times(1)
689 .WillOnce(Invoke(makePreparedModelReturn(V1_0::ErrorStatus::NONE,
690 V1_0::ErrorStatus::NONE, nullptr)));
691
692 // run test
693 const auto result = device->prepareModel(kSimpleModel, nn::ExecutionPreference::DEFAULT,
Miao Wangb5c8a822021-10-26 20:03:05 +0000694 nn::Priority::DEFAULT, {}, {}, {}, {}, {}, {});
Michael Butler6e492a62020-12-10 15:38:45 -0800695
696 // verify result
697 ASSERT_FALSE(result.has_value());
698 EXPECT_EQ(result.error().code, nn::ErrorStatus::GENERAL_FAILURE);
699}
700
701TEST(DeviceTest, prepareModelTransportFailure) {
702 // setup call
703 const auto mockDevice = createMockDevice();
704 const auto device = Device::create(kName, mockDevice).value();
705 EXPECT_CALL(*mockDevice, prepareModel_1_2(_, _, _, _, _, _))
706 .Times(1)
707 .WillOnce(InvokeWithoutArgs(makeGeneralTransportFailure));
708
709 // run test
710 const auto result = device->prepareModel(kSimpleModel, nn::ExecutionPreference::DEFAULT,
Miao Wangb5c8a822021-10-26 20:03:05 +0000711 nn::Priority::DEFAULT, {}, {}, {}, {}, {}, {});
Michael Butler6e492a62020-12-10 15:38:45 -0800712
713 // verify result
714 ASSERT_FALSE(result.has_value());
715 EXPECT_EQ(result.error().code, nn::ErrorStatus::GENERAL_FAILURE);
716}
717
718TEST(DeviceTest, prepareModelDeadObject) {
719 // setup call
720 const auto mockDevice = createMockDevice();
721 const auto device = Device::create(kName, mockDevice).value();
722 EXPECT_CALL(*mockDevice, prepareModel_1_2(_, _, _, _, _, _))
723 .Times(1)
724 .WillOnce(InvokeWithoutArgs(makeDeadObjectFailure));
725
726 // run test
727 const auto result = device->prepareModel(kSimpleModel, nn::ExecutionPreference::DEFAULT,
Miao Wangb5c8a822021-10-26 20:03:05 +0000728 nn::Priority::DEFAULT, {}, {}, {}, {}, {}, {});
Michael Butler6e492a62020-12-10 15:38:45 -0800729
730 // verify result
731 ASSERT_FALSE(result.has_value());
732 EXPECT_EQ(result.error().code, nn::ErrorStatus::DEAD_OBJECT);
733}
734
735TEST(DeviceTest, prepareModelAsyncCrash) {
736 // setup test
737 const auto mockDevice = createMockDevice();
738 const auto device = Device::create(kName, mockDevice).value();
739 const auto ret = [&mockDevice]() -> hardware::Return<V1_0::ErrorStatus> {
740 mockDevice->simulateCrash();
741 return V1_0::ErrorStatus::NONE;
742 };
743 EXPECT_CALL(*mockDevice, prepareModel_1_2(_, _, _, _, _, _))
744 .Times(1)
745 .WillOnce(InvokeWithoutArgs(ret));
746
747 // run test
748 const auto result = device->prepareModel(kSimpleModel, nn::ExecutionPreference::DEFAULT,
Miao Wangb5c8a822021-10-26 20:03:05 +0000749 nn::Priority::DEFAULT, {}, {}, {}, {}, {}, {});
Michael Butler6e492a62020-12-10 15:38:45 -0800750
751 // verify result
752 ASSERT_FALSE(result.has_value());
753 EXPECT_EQ(result.error().code, nn::ErrorStatus::DEAD_OBJECT);
754}
755
756TEST(DeviceTest, prepareModelFromCache) {
757 // setup call
758 const auto mockDevice = createMockDevice();
759 const auto device = Device::create(kName, mockDevice).value();
760 const auto mockPreparedModel = MockPreparedModel::create();
761 EXPECT_CALL(*mockDevice, prepareModelFromCache(_, _, _, _))
762 .Times(1)
763 .WillOnce(Invoke(makePreparedModelFromCacheReturn(
764 V1_0::ErrorStatus::NONE, V1_0::ErrorStatus::NONE, mockPreparedModel)));
765
766 // run test
767 const auto result = device->prepareModelFromCache({}, {}, {}, {});
768
769 // verify result
770 ASSERT_TRUE(result.has_value())
771 << "Failed with " << result.error().code << ": " << result.error().message;
772 EXPECT_NE(result.value(), nullptr);
773}
774
Lev Proleev7b0b5462021-03-08 10:46:33 +0000775TEST(DeviceTest, prepareModelFromCacheLaunchError) {
Michael Butler6e492a62020-12-10 15:38:45 -0800776 // setup call
777 const auto mockDevice = createMockDevice();
778 const auto device = Device::create(kName, mockDevice).value();
779 EXPECT_CALL(*mockDevice, prepareModelFromCache(_, _, _, _))
780 .Times(1)
781 .WillOnce(Invoke(makePreparedModelFromCacheReturn(V1_0::ErrorStatus::GENERAL_FAILURE,
782 V1_0::ErrorStatus::GENERAL_FAILURE,
783 nullptr)));
784
785 // run test
786 const auto result = device->prepareModelFromCache({}, {}, {}, {});
787
788 // verify result
789 ASSERT_FALSE(result.has_value());
790 EXPECT_EQ(result.error().code, nn::ErrorStatus::GENERAL_FAILURE);
791}
792
Lev Proleev7b0b5462021-03-08 10:46:33 +0000793TEST(DeviceTest, prepareModelFromCacheReturnError) {
794 // setup call
795 const auto mockDevice = createMockDevice();
796 const auto device = Device::create(kName, mockDevice).value();
797 EXPECT_CALL(*mockDevice, prepareModelFromCache(_, _, _, _))
798 .Times(1)
799 .WillOnce(Invoke(makePreparedModelFromCacheReturn(
800 V1_0::ErrorStatus::NONE, V1_0::ErrorStatus::GENERAL_FAILURE, nullptr)));
801
802 // run test
803 const auto result = device->prepareModelFromCache({}, {}, {}, {});
804
805 // verify result
806 ASSERT_FALSE(result.has_value());
807 EXPECT_EQ(result.error().code, nn::ErrorStatus::GENERAL_FAILURE);
808}
809
Michael Butler6e492a62020-12-10 15:38:45 -0800810TEST(DeviceTest, prepareModelFromCacheNullptrError) {
811 // setup call
812 const auto mockDevice = createMockDevice();
813 const auto device = Device::create(kName, mockDevice).value();
814 EXPECT_CALL(*mockDevice, prepareModelFromCache(_, _, _, _))
815 .Times(1)
816 .WillOnce(Invoke(makePreparedModelFromCacheReturn(V1_0::ErrorStatus::NONE,
817 V1_0::ErrorStatus::NONE, nullptr)));
818
819 // run test
820 const auto result = device->prepareModelFromCache({}, {}, {}, {});
821
822 // verify result
823 ASSERT_FALSE(result.has_value());
824 EXPECT_EQ(result.error().code, nn::ErrorStatus::GENERAL_FAILURE);
825}
826
827TEST(DeviceTest, prepareModelFromCacheTransportFailure) {
828 // setup call
829 const auto mockDevice = createMockDevice();
830 const auto device = Device::create(kName, mockDevice).value();
831 EXPECT_CALL(*mockDevice, prepareModelFromCache(_, _, _, _))
832 .Times(1)
833 .WillOnce(InvokeWithoutArgs(makeGeneralTransportFailure));
834
835 // run test
836 const auto result = device->prepareModelFromCache({}, {}, {}, {});
837
838 // verify result
839 ASSERT_FALSE(result.has_value());
840 EXPECT_EQ(result.error().code, nn::ErrorStatus::GENERAL_FAILURE);
841}
842
843TEST(DeviceTest, prepareModelFromCacheDeadObject) {
844 // setup call
845 const auto mockDevice = createMockDevice();
846 const auto device = Device::create(kName, mockDevice).value();
847 EXPECT_CALL(*mockDevice, prepareModelFromCache(_, _, _, _))
848 .Times(1)
849 .WillOnce(InvokeWithoutArgs(makeDeadObjectFailure));
850
851 // run test
852 const auto result = device->prepareModelFromCache({}, {}, {}, {});
853
854 // verify result
855 ASSERT_FALSE(result.has_value());
856 EXPECT_EQ(result.error().code, nn::ErrorStatus::DEAD_OBJECT);
857}
858
859TEST(DeviceTest, prepareModelFromCacheAsyncCrash) {
860 // setup test
861 const auto mockDevice = createMockDevice();
862 const auto device = Device::create(kName, mockDevice).value();
863 const auto ret = [&mockDevice]() -> hardware::Return<V1_0::ErrorStatus> {
864 mockDevice->simulateCrash();
865 return V1_0::ErrorStatus::NONE;
866 };
867 EXPECT_CALL(*mockDevice, prepareModelFromCache(_, _, _, _))
868 .Times(1)
869 .WillOnce(InvokeWithoutArgs(ret));
870
871 // run test
872 const auto result = device->prepareModelFromCache({}, {}, {}, {});
873
874 // verify result
875 ASSERT_FALSE(result.has_value());
876 EXPECT_EQ(result.error().code, nn::ErrorStatus::DEAD_OBJECT);
877}
878
879TEST(DeviceTest, allocateNotSupported) {
880 // setup call
881 const auto mockDevice = createMockDevice();
882 const auto device = Device::create(kName, mockDevice).value();
883
884 // run test
885 const auto result = device->allocate({}, {}, {}, {});
886
887 // verify result
888 ASSERT_FALSE(result.has_value());
889 EXPECT_EQ(result.error().code, nn::ErrorStatus::GENERAL_FAILURE);
890}
891
892} // namespace android::hardware::neuralnetworks::V1_2::utils