1 /*
2 * Copyright (C) 2019 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 // This file tests that various abnormal uses of ANeuralNetworks*_free() don't crash.
18 //
19 // Limitation: It doesn't set various combinations of properties on objects before
20 // freeing those objects.
21
22 #include <gtest/gtest.h>
23
24 #include <vector>
25
26 #include "NeuralNetworks.h"
27
28 namespace {
29
createUnfinishedModel()30 ANeuralNetworksModel* createUnfinishedModel() {
31 ANeuralNetworksModel* model = nullptr;
32 EXPECT_EQ(ANeuralNetworksModel_create(&model), ANEURALNETWORKS_NO_ERROR);
33
34 uint32_t dimensions[] = {1};
35 ANeuralNetworksOperandType type = {
36 .type = ANEURALNETWORKS_TENSOR_FLOAT32, .dimensionCount = 1, .dimensions = dimensions};
37 EXPECT_EQ(ANeuralNetworksModel_addOperand(model, &type), ANEURALNETWORKS_NO_ERROR);
38 EXPECT_EQ(ANeuralNetworksModel_addOperand(model, &type), ANEURALNETWORKS_NO_ERROR);
39
40 const uint32_t inList[]{0};
41 const uint32_t outList[]{1};
42 EXPECT_EQ(
43 ANeuralNetworksModel_addOperation(model, ANEURALNETWORKS_FLOOR, 1, inList, 1, outList),
44 ANEURALNETWORKS_NO_ERROR);
45 EXPECT_EQ(ANeuralNetworksModel_identifyInputsAndOutputs(model, 1, inList, 1, outList),
46 ANEURALNETWORKS_NO_ERROR);
47
48 return model;
49 }
50
createFinishedModel()51 ANeuralNetworksModel* createFinishedModel() {
52 ANeuralNetworksModel* const model = createUnfinishedModel();
53 EXPECT_EQ(ANeuralNetworksModel_finish(model), ANEURALNETWORKS_NO_ERROR);
54 return model;
55 }
56
createDeviceList()57 std::vector<ANeuralNetworksDevice*> createDeviceList() {
58 std::vector<ANeuralNetworksDevice*> devices;
59
60 uint32_t numDevices = 0;
61 EXPECT_EQ(ANeuralNetworks_getDeviceCount(&numDevices), ANEURALNETWORKS_NO_ERROR);
62 for (uint32_t devIndex = 0; devIndex < numDevices; ++devIndex) {
63 ANeuralNetworksDevice* device = nullptr;
64 const int getDeviceStatus = ANeuralNetworks_getDevice(devIndex, &device);
65 EXPECT_EQ(getDeviceStatus, ANEURALNETWORKS_NO_ERROR);
66 if (getDeviceStatus == ANEURALNETWORKS_NO_ERROR) {
67 devices.push_back(device);
68 }
69 }
70
71 return devices;
72 }
73
TEST(Free,Null)74 TEST(Free, Null) {
75 ANeuralNetworksBurst_free(nullptr);
76 ANeuralNetworksCompilation_free(nullptr);
77 ANeuralNetworksEvent_free(nullptr);
78 ANeuralNetworksExecution_free(nullptr);
79 ANeuralNetworksMemory_free(nullptr);
80 ANeuralNetworksModel_free(nullptr);
81 }
82
TEST(Free,UnfinishedModel)83 TEST(Free, UnfinishedModel) {
84 ANeuralNetworksModel* const model = createUnfinishedModel();
85 ANeuralNetworksModel_free(model);
86 }
87
TEST(Free,UnfinishedCompilation)88 TEST(Free, UnfinishedCompilation) {
89 ANeuralNetworksModel* const model = createFinishedModel();
90
91 ANeuralNetworksCompilation* compilation = nullptr;
92 ASSERT_EQ(ANeuralNetworksCompilation_create(model, &compilation), ANEURALNETWORKS_NO_ERROR);
93 ANeuralNetworksCompilation_free(compilation);
94
95 ANeuralNetworksModel_free(model);
96 }
97
TEST(Free,UnfinishedCompilationForDevices)98 TEST(Free, UnfinishedCompilationForDevices) {
99 ANeuralNetworksModel* const model = createFinishedModel();
100
101 const auto devices = createDeviceList();
102
103 ANeuralNetworksCompilation* compilation = nullptr;
104 ASSERT_EQ(ANeuralNetworksCompilation_createForDevices(model, devices.data(), devices.size(),
105 &compilation),
106 ANEURALNETWORKS_NO_ERROR);
107 ANeuralNetworksCompilation_free(compilation);
108
109 ANeuralNetworksModel_free(model);
110 }
111
TEST(Free,UnscheduledExecution)112 TEST(Free, UnscheduledExecution) {
113 ANeuralNetworksModel* const model = createFinishedModel();
114
115 ANeuralNetworksCompilation* compilation = nullptr;
116 ASSERT_EQ(ANeuralNetworksCompilation_create(model, &compilation), ANEURALNETWORKS_NO_ERROR);
117 ASSERT_EQ(ANeuralNetworksCompilation_finish(compilation), ANEURALNETWORKS_NO_ERROR);
118
119 ANeuralNetworksExecution* execution = nullptr;
120 ASSERT_EQ(ANeuralNetworksExecution_create(compilation, &execution), ANEURALNETWORKS_NO_ERROR);
121 ANeuralNetworksExecution_free(execution);
122
123 ANeuralNetworksCompilation_free(compilation);
124
125 ANeuralNetworksModel_free(model);
126 }
127
128 } // namespace
129