Home | History | Annotate | Download | only in test
      1 /*
      2  * Copyright (C) 2017 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 "NeuralNetworks.h"
     18 #include "NeuralNetworksOEM.h"
     19 
     20 #include <android/sharedmem.h>
     21 #include <gtest/gtest.h>
     22 #include <string>
     23 #include <sys/mman.h>
     24 
     25 
     26 // This file tests all the validations done by the Neural Networks API.
     27 
     28 namespace {
     29 class ValidationTest : public ::testing::Test {
     30 protected:
     31     virtual void SetUp() {}
     32 };
     33 
     34 class ValidationTestModel : public ValidationTest {
     35 protected:
     36     virtual void SetUp() {
     37         ValidationTest::SetUp();
     38         ASSERT_EQ(ANeuralNetworksModel_create(&mModel), ANEURALNETWORKS_NO_ERROR);
     39     }
     40     virtual void TearDown() {
     41         ANeuralNetworksModel_free(mModel);
     42         ValidationTest::TearDown();
     43     }
     44     ANeuralNetworksModel* mModel = nullptr;
     45 };
     46 
     47 class ValidationTestIdentify : public ValidationTestModel {
     48     virtual void SetUp() {
     49         ValidationTestModel::SetUp();
     50 
     51         uint32_t dimensions[]{1};
     52         ANeuralNetworksOperandType tensorType{.type = ANEURALNETWORKS_TENSOR_FLOAT32,
     53                                               .dimensionCount = 1,
     54                                               .dimensions = dimensions};
     55         ANeuralNetworksOperandType scalarType{.type = ANEURALNETWORKS_INT32,
     56                                               .dimensionCount = 0,
     57                                               .dimensions = nullptr};
     58         ASSERT_EQ(ANeuralNetworksModel_addOperand(mModel, &tensorType), ANEURALNETWORKS_NO_ERROR);
     59         ASSERT_EQ(ANeuralNetworksModel_addOperand(mModel, &tensorType), ANEURALNETWORKS_NO_ERROR);
     60         ASSERT_EQ(ANeuralNetworksModel_addOperand(mModel, &scalarType), ANEURALNETWORKS_NO_ERROR);
     61         ASSERT_EQ(ANeuralNetworksModel_addOperand(mModel, &tensorType), ANEURALNETWORKS_NO_ERROR);
     62         uint32_t inList[3]{0, 1, 2};
     63         uint32_t outList[1]{3};
     64         ASSERT_EQ(ANeuralNetworksModel_addOperation(mModel, ANEURALNETWORKS_ADD, 3, inList, 1,
     65                                                     outList),
     66                   ANEURALNETWORKS_NO_ERROR);
     67     }
     68     virtual void TearDown() {
     69         ValidationTestModel::TearDown();
     70     }
     71 };
     72 
     73 class ValidationTestCompilation : public ValidationTestModel {
     74 protected:
     75     virtual void SetUp() {
     76         ValidationTestModel::SetUp();
     77 
     78         uint32_t dimensions[]{1};
     79         ANeuralNetworksOperandType tensorType{.type = ANEURALNETWORKS_TENSOR_FLOAT32,
     80                                               .dimensionCount = 1,
     81                                               .dimensions = dimensions};
     82         ANeuralNetworksOperandType scalarType{.type = ANEURALNETWORKS_INT32,
     83                                               .dimensionCount = 0,
     84                                               .dimensions = nullptr};
     85 
     86         ASSERT_EQ(ANeuralNetworksModel_addOperand(mModel, &tensorType), ANEURALNETWORKS_NO_ERROR);
     87         ASSERT_EQ(ANeuralNetworksModel_addOperand(mModel, &tensorType), ANEURALNETWORKS_NO_ERROR);
     88         ASSERT_EQ(ANeuralNetworksModel_addOperand(mModel, &scalarType), ANEURALNETWORKS_NO_ERROR);
     89         ASSERT_EQ(ANeuralNetworksModel_addOperand(mModel, &tensorType), ANEURALNETWORKS_NO_ERROR);
     90         uint32_t inList[3]{0, 1, 2};
     91         uint32_t outList[1]{3};
     92         ASSERT_EQ(ANeuralNetworksModel_addOperation(mModel, ANEURALNETWORKS_ADD, 3, inList, 1,
     93                                                     outList),
     94                   ANEURALNETWORKS_NO_ERROR);
     95         ASSERT_EQ(ANeuralNetworksModel_identifyInputsAndOutputs(mModel, 3, inList, 1, outList),
     96                   ANEURALNETWORKS_NO_ERROR);
     97         ASSERT_EQ(ANeuralNetworksModel_finish(mModel), ANEURALNETWORKS_NO_ERROR);
     98 
     99         ASSERT_EQ(ANeuralNetworksCompilation_create(mModel, &mCompilation),
    100                   ANEURALNETWORKS_NO_ERROR);
    101     }
    102     virtual void TearDown() {
    103         ANeuralNetworksCompilation_free(mCompilation);
    104         ValidationTestModel::TearDown();
    105     }
    106     ANeuralNetworksCompilation* mCompilation = nullptr;
    107 };
    108 
    109 class ValidationTestExecution : public ValidationTestCompilation {
    110 protected:
    111     virtual void SetUp() {
    112         ValidationTestCompilation::SetUp();
    113 
    114         ASSERT_EQ(ANeuralNetworksCompilation_finish(mCompilation), ANEURALNETWORKS_NO_ERROR);
    115 
    116         ASSERT_EQ(ANeuralNetworksExecution_create(mCompilation, &mExecution),
    117                   ANEURALNETWORKS_NO_ERROR);
    118     }
    119     virtual void TearDown() {
    120         ANeuralNetworksExecution_free(mExecution);
    121         ValidationTestCompilation::TearDown();
    122     }
    123     ANeuralNetworksExecution* mExecution = nullptr;
    124 };
    125 
    126 TEST_F(ValidationTest, CreateModel) {
    127     EXPECT_EQ(ANeuralNetworksModel_create(nullptr), ANEURALNETWORKS_UNEXPECTED_NULL);
    128 }
    129 
    130 TEST_F(ValidationTestModel, AddOperand) {
    131     ANeuralNetworksOperandType floatType{
    132                 .type = ANEURALNETWORKS_FLOAT32, .dimensionCount = 0, .dimensions = nullptr};
    133     EXPECT_EQ(ANeuralNetworksModel_addOperand(nullptr, &floatType),
    134               ANEURALNETWORKS_UNEXPECTED_NULL);
    135     EXPECT_EQ(ANeuralNetworksModel_addOperand(mModel, nullptr), ANEURALNETWORKS_UNEXPECTED_NULL);
    136 
    137     ANeuralNetworksOperandType quant8TypeInvalidScale{
    138                 .type = ANEURALNETWORKS_TENSOR_QUANT8_ASYMM,
    139                 .dimensionCount = 0,
    140                 .dimensions = nullptr,
    141                 // Scale has to be non-negative
    142                 .scale = -1.0f,
    143                 .zeroPoint = 0,
    144               };
    145     EXPECT_EQ(ANeuralNetworksModel_addOperand(mModel, &quant8TypeInvalidScale),
    146               ANEURALNETWORKS_BAD_DATA);
    147 
    148     ANeuralNetworksOperandType quant8TypeInvalidZeroPoint{
    149                 .type = ANEURALNETWORKS_TENSOR_QUANT8_ASYMM,
    150                 .dimensionCount = 0,
    151                 .dimensions = nullptr,
    152                 .scale = 1.0f,
    153                 // zeroPoint has to be in [0, 255]
    154                 .zeroPoint = -1,
    155               };
    156     EXPECT_EQ(ANeuralNetworksModel_addOperand(mModel, &quant8TypeInvalidZeroPoint),
    157               ANEURALNETWORKS_BAD_DATA);
    158 
    159     uint32_t dim = 2;
    160     ANeuralNetworksOperandType invalidScalarType{
    161                 .type = ANEURALNETWORKS_INT32,
    162                 // scalar types can only 0 dimensions.
    163                 .dimensionCount = 1,
    164                 .dimensions = &dim,
    165               };
    166     EXPECT_EQ(ANeuralNetworksModel_addOperand(mModel, &invalidScalarType),
    167               ANEURALNETWORKS_BAD_DATA);
    168 
    169     ANeuralNetworksModel_finish(mModel);
    170     // This should fail, as the model is already finished.
    171     EXPECT_EQ(ANeuralNetworksModel_addOperand(mModel, &floatType),
    172               ANEURALNETWORKS_BAD_STATE);
    173 }
    174 
    175 TEST_F(ValidationTestModel, SetOptionalOperand) {
    176     ANeuralNetworksOperandType floatType{
    177                 .type = ANEURALNETWORKS_FLOAT32, .dimensionCount = 0, .dimensions = nullptr};
    178     EXPECT_EQ(ANeuralNetworksModel_addOperand(mModel, &floatType), ANEURALNETWORKS_NO_ERROR);
    179 
    180     EXPECT_EQ(ANeuralNetworksModel_setOperandValue(mModel, 0, nullptr, 0),
    181               ANEURALNETWORKS_NO_ERROR);
    182 }
    183 
    184 TEST_F(ValidationTestModel, SetOperandValue) {
    185     ANeuralNetworksOperandType floatType{
    186                 .type = ANEURALNETWORKS_FLOAT32, .dimensionCount = 0, .dimensions = nullptr};
    187     EXPECT_EQ(ANeuralNetworksModel_addOperand(mModel, &floatType), ANEURALNETWORKS_NO_ERROR);
    188 
    189     char buffer[20];
    190     EXPECT_EQ(ANeuralNetworksModel_setOperandValue(nullptr, 0, buffer, sizeof(buffer)),
    191               ANEURALNETWORKS_UNEXPECTED_NULL);
    192     EXPECT_EQ(ANeuralNetworksModel_setOperandValue(mModel, 0, nullptr, sizeof(buffer)),
    193               ANEURALNETWORKS_UNEXPECTED_NULL);
    194 
    195     // This should fail, since buffer is not the size of a float32.
    196     EXPECT_EQ(ANeuralNetworksModel_setOperandValue(mModel, 0, buffer, sizeof(buffer)),
    197               ANEURALNETWORKS_BAD_DATA);
    198 
    199     // This should succeed.
    200     EXPECT_EQ(ANeuralNetworksModel_setOperandValue(mModel, 0, buffer, sizeof(float)),
    201               ANEURALNETWORKS_NO_ERROR);
    202 
    203     // This should fail, as this operand does not exist.
    204     EXPECT_EQ(ANeuralNetworksModel_setOperandValue(mModel, 1, buffer, sizeof(float)),
    205               ANEURALNETWORKS_BAD_DATA);
    206 
    207     ANeuralNetworksModel_finish(mModel);
    208     // This should fail, as the model is already finished.
    209     EXPECT_EQ(ANeuralNetworksModel_setOperandValue(mModel, 0, buffer, sizeof(float)),
    210               ANEURALNETWORKS_BAD_STATE);
    211 }
    212 
    213 TEST_F(ValidationTestModel, SetOperandValueFromMemory) {
    214     uint32_t dimensions[]{1};
    215     ANeuralNetworksOperandType floatType{
    216                 .type = ANEURALNETWORKS_TENSOR_FLOAT32,
    217                 .dimensionCount = 1,
    218                 .dimensions = dimensions};
    219     EXPECT_EQ(ANeuralNetworksModel_addOperand(mModel, &floatType), ANEURALNETWORKS_NO_ERROR);
    220 
    221     const size_t memorySize = 20;
    222     int memoryFd = ASharedMemory_create("nnMemory", memorySize);
    223     ASSERT_GT(memoryFd, 0);
    224 
    225     ANeuralNetworksMemory* memory;
    226     EXPECT_EQ(ANeuralNetworksMemory_createFromFd(memorySize, PROT_READ | PROT_WRITE,
    227                                                  memoryFd, 0, &memory),
    228               ANEURALNETWORKS_NO_ERROR);
    229 
    230     EXPECT_EQ(ANeuralNetworksModel_setOperandValueFromMemory(nullptr, 0,
    231                                                              memory, 0, sizeof(float)),
    232               ANEURALNETWORKS_UNEXPECTED_NULL);
    233     EXPECT_EQ(ANeuralNetworksModel_setOperandValueFromMemory(mModel, 0,
    234                                                              nullptr, 0, sizeof(float)),
    235               ANEURALNETWORKS_UNEXPECTED_NULL);
    236 
    237     // This should fail, since the operand does not exist.
    238     EXPECT_EQ(ANeuralNetworksModel_setOperandValueFromMemory(mModel, -1,
    239                                                              memory, 0, sizeof(float)),
    240               ANEURALNETWORKS_BAD_DATA);
    241 
    242     // This should fail, since memory is not the size of a float32.
    243     EXPECT_EQ(ANeuralNetworksModel_setOperandValueFromMemory(mModel, 0,
    244                                                              memory, 0, memorySize),
    245               ANEURALNETWORKS_BAD_DATA);
    246 
    247     // This should fail, as this operand does not exist.
    248     EXPECT_EQ(ANeuralNetworksModel_setOperandValueFromMemory(mModel, 1,
    249                                                              memory, 0, sizeof(float)),
    250               ANEURALNETWORKS_BAD_DATA);
    251 
    252     // This should fail, since offset is larger than memorySize.
    253     EXPECT_EQ(ANeuralNetworksModel_setOperandValueFromMemory(mModel, 0,
    254                                                              memory, memorySize + 1,
    255                                                              sizeof(float)),
    256               ANEURALNETWORKS_BAD_DATA);
    257 
    258     // This should fail, since requested size is larger than the memory.
    259     EXPECT_EQ(ANeuralNetworksModel_setOperandValueFromMemory(mModel, 0,
    260                                                              memory, memorySize - 3,
    261                                                              sizeof(float)),
    262               ANEURALNETWORKS_BAD_DATA);
    263 
    264     ANeuralNetworksModel_finish(mModel);
    265     // This should fail, as the model is already finished.
    266     EXPECT_EQ(ANeuralNetworksModel_setOperandValueFromMemory(mModel, 0,
    267                                                              memory, 0,
    268                                                              sizeof(float)),
    269               ANEURALNETWORKS_BAD_STATE);
    270 }
    271 
    272 
    273 TEST_F(ValidationTestModel, AddOEMOperand) {
    274     ANeuralNetworksOperandType OEMScalarType{
    275                 .type = ANEURALNETWORKS_OEM_SCALAR, .dimensionCount = 0, .dimensions = nullptr};
    276     EXPECT_EQ(ANeuralNetworksModel_addOperand(mModel, &OEMScalarType), ANEURALNETWORKS_NO_ERROR);
    277     char buffer[20];
    278     EXPECT_EQ(ANeuralNetworksModel_setOperandValue(mModel, 0, buffer, sizeof(buffer)),
    279               ANEURALNETWORKS_NO_ERROR);
    280 
    281     const size_t kByteSizeOfOEMTensor = 4;
    282     uint32_t dimensions[]{kByteSizeOfOEMTensor};
    283     ANeuralNetworksOperandType OEMTensorType{
    284                 .type = ANEURALNETWORKS_TENSOR_OEM_BYTE,
    285                 .dimensionCount = 1,
    286                 .dimensions = dimensions};
    287     EXPECT_EQ(ANeuralNetworksModel_addOperand(mModel, &OEMTensorType), ANEURALNETWORKS_NO_ERROR);
    288     EXPECT_EQ(ANeuralNetworksModel_setOperandValue(mModel, 1, buffer, kByteSizeOfOEMTensor),
    289               ANEURALNETWORKS_NO_ERROR);
    290 
    291     ANeuralNetworksModel_finish(mModel);
    292     // This should fail, as the model is already finished.
    293     EXPECT_EQ(ANeuralNetworksModel_addOperand(mModel, &OEMTensorType), ANEURALNETWORKS_BAD_STATE);
    294 }
    295 
    296 TEST_F(ValidationTestModel, AddOperation) {
    297     uint32_t input = 0;
    298     uint32_t output = 0;
    299     EXPECT_EQ(ANeuralNetworksModel_addOperation(nullptr, ANEURALNETWORKS_AVERAGE_POOL_2D, 1, &input,
    300                                                 1, &output),
    301               ANEURALNETWORKS_UNEXPECTED_NULL);
    302     EXPECT_EQ(ANeuralNetworksModel_addOperation(mModel, ANEURALNETWORKS_AVERAGE_POOL_2D, 0, nullptr,
    303                                                 1, &output),
    304               ANEURALNETWORKS_UNEXPECTED_NULL);
    305     EXPECT_EQ(ANeuralNetworksModel_addOperation(mModel, ANEURALNETWORKS_AVERAGE_POOL_2D, 1, &input,
    306                                                 0, nullptr),
    307               ANEURALNETWORKS_UNEXPECTED_NULL);
    308 
    309     ANeuralNetworksOperationType invalidOp = -1;
    310     EXPECT_EQ(ANeuralNetworksModel_addOperation(mModel, invalidOp, 1, &input,
    311                                                 1, &output),
    312               ANEURALNETWORKS_BAD_DATA);
    313 
    314     ANeuralNetworksModel_finish(mModel);
    315     // This should fail, as the model is already finished.
    316     EXPECT_EQ(ANeuralNetworksModel_addOperation(mModel, ANEURALNETWORKS_AVERAGE_POOL_2D, 1, &input,
    317                                                 1, &output),
    318               ANEURALNETWORKS_BAD_STATE);
    319 }
    320 
    321 TEST_F(ValidationTestModel, IdentifyInputsAndOutputs) {
    322     uint32_t input = 0;
    323     uint32_t output = 0;
    324     EXPECT_EQ(ANeuralNetworksModel_identifyInputsAndOutputs(nullptr, 1, &input, 1, &output),
    325               ANEURALNETWORKS_UNEXPECTED_NULL);
    326     EXPECT_EQ(ANeuralNetworksModel_identifyInputsAndOutputs(mModel, 0, nullptr, 1, &output),
    327               ANEURALNETWORKS_UNEXPECTED_NULL);
    328     EXPECT_EQ(ANeuralNetworksModel_identifyInputsAndOutputs(mModel, 1, &input, 0, nullptr),
    329               ANEURALNETWORKS_UNEXPECTED_NULL);
    330 
    331     ANeuralNetworksModel_finish(mModel);
    332     // This should fail, as the model is already finished.
    333     EXPECT_EQ(ANeuralNetworksModel_identifyInputsAndOutputs(mModel, 1, &input, 1, &output),
    334               ANEURALNETWORKS_BAD_STATE);
    335 }
    336 
    337 TEST_F(ValidationTestModel, RelaxComputationFloat32toFloat16) {
    338     EXPECT_EQ(ANeuralNetworksModel_relaxComputationFloat32toFloat16(nullptr, true),
    339               ANEURALNETWORKS_UNEXPECTED_NULL);
    340 
    341     ANeuralNetworksModel_finish(mModel);
    342     // This should fail, as the model is already finished.
    343     EXPECT_EQ(ANeuralNetworksModel_relaxComputationFloat32toFloat16(mModel, true),
    344               ANEURALNETWORKS_BAD_STATE);
    345     EXPECT_EQ(ANeuralNetworksModel_relaxComputationFloat32toFloat16(mModel, false),
    346               ANEURALNETWORKS_BAD_STATE);
    347 }
    348 
    349 TEST_F(ValidationTestModel, Finish) {
    350     EXPECT_EQ(ANeuralNetworksModel_finish(nullptr), ANEURALNETWORKS_UNEXPECTED_NULL);
    351     EXPECT_EQ(ANeuralNetworksModel_finish(mModel), ANEURALNETWORKS_NO_ERROR);
    352     EXPECT_EQ(ANeuralNetworksModel_finish(mModel), ANEURALNETWORKS_BAD_STATE);
    353 }
    354 
    355 TEST_F(ValidationTestModel, CreateCompilation) {
    356     ANeuralNetworksCompilation* compilation = nullptr;
    357     EXPECT_EQ(ANeuralNetworksCompilation_create(nullptr, &compilation),
    358               ANEURALNETWORKS_UNEXPECTED_NULL);
    359     EXPECT_EQ(ANeuralNetworksCompilation_create(mModel, nullptr), ANEURALNETWORKS_UNEXPECTED_NULL);
    360     EXPECT_EQ(ANeuralNetworksCompilation_create(mModel, &compilation), ANEURALNETWORKS_BAD_STATE);
    361 }
    362 
    363 TEST_F(ValidationTestIdentify, Ok) {
    364     uint32_t inList[3]{0, 1, 2};
    365     uint32_t outList[1]{3};
    366 
    367     ASSERT_EQ(ANeuralNetworksModel_identifyInputsAndOutputs(mModel, 3, inList, 1, outList),
    368               ANEURALNETWORKS_NO_ERROR);
    369 
    370     ASSERT_EQ(ANeuralNetworksModel_finish(mModel), ANEURALNETWORKS_NO_ERROR);
    371 }
    372 
    373 TEST_F(ValidationTestIdentify, InputIsOutput) {
    374     uint32_t inList[3]{0, 1, 2};
    375     uint32_t outList[2]{3, 0};
    376 
    377     ASSERT_EQ(ANeuralNetworksModel_identifyInputsAndOutputs(mModel, 3, inList, 2, outList),
    378               ANEURALNETWORKS_BAD_DATA);
    379 }
    380 
    381 TEST_F(ValidationTestIdentify, OutputIsInput) {
    382     uint32_t inList[4]{0, 1, 2, 3};
    383     uint32_t outList[1]{3};
    384 
    385     ASSERT_EQ(ANeuralNetworksModel_identifyInputsAndOutputs(mModel, 4, inList, 1, outList),
    386               ANEURALNETWORKS_BAD_DATA);
    387 }
    388 
    389 TEST_F(ValidationTestIdentify, DuplicateInputs) {
    390     uint32_t inList[4]{0, 1, 2, 0};
    391     uint32_t outList[1]{3};
    392 
    393     ASSERT_EQ(ANeuralNetworksModel_identifyInputsAndOutputs(mModel, 4, inList, 1, outList),
    394               ANEURALNETWORKS_BAD_DATA);
    395 }
    396 
    397 TEST_F(ValidationTestIdentify, DuplicateOutputs) {
    398     uint32_t inList[3]{0, 1, 2};
    399     uint32_t outList[2]{3, 3};
    400 
    401     ASSERT_EQ(ANeuralNetworksModel_identifyInputsAndOutputs(mModel, 3, inList, 2, outList),
    402               ANEURALNETWORKS_BAD_DATA);
    403 }
    404 
    405 TEST_F(ValidationTestCompilation, SetPreference) {
    406     EXPECT_EQ(ANeuralNetworksCompilation_setPreference(nullptr, ANEURALNETWORKS_PREFER_LOW_POWER),
    407               ANEURALNETWORKS_UNEXPECTED_NULL);
    408 
    409     EXPECT_EQ(ANeuralNetworksCompilation_setPreference(mCompilation, 40), ANEURALNETWORKS_BAD_DATA);
    410 }
    411 
    412 TEST_F(ValidationTestCompilation, CreateExecution) {
    413     ANeuralNetworksExecution* execution = nullptr;
    414     EXPECT_EQ(ANeuralNetworksExecution_create(nullptr, &execution),
    415               ANEURALNETWORKS_UNEXPECTED_NULL);
    416     EXPECT_EQ(ANeuralNetworksExecution_create(mCompilation, nullptr),
    417               ANEURALNETWORKS_UNEXPECTED_NULL);
    418     EXPECT_EQ(ANeuralNetworksExecution_create(mCompilation, &execution),
    419               ANEURALNETWORKS_BAD_STATE);
    420 }
    421 
    422 TEST_F(ValidationTestCompilation, Finish) {
    423     EXPECT_EQ(ANeuralNetworksCompilation_finish(nullptr), ANEURALNETWORKS_UNEXPECTED_NULL);
    424     EXPECT_EQ(ANeuralNetworksCompilation_finish(mCompilation), ANEURALNETWORKS_NO_ERROR);
    425     EXPECT_EQ(ANeuralNetworksCompilation_setPreference(mCompilation,
    426                                                        ANEURALNETWORKS_PREFER_FAST_SINGLE_ANSWER),
    427               ANEURALNETWORKS_BAD_STATE);
    428     EXPECT_EQ(ANeuralNetworksCompilation_finish(mCompilation), ANEURALNETWORKS_BAD_STATE);
    429 }
    430 
    431 TEST_F(ValidationTestExecution, SetInput) {
    432     ANeuralNetworksExecution* execution;
    433     EXPECT_EQ(ANeuralNetworksExecution_create(mCompilation, &execution), ANEURALNETWORKS_NO_ERROR);
    434 
    435     char buffer[20];
    436     EXPECT_EQ(ANeuralNetworksExecution_setInput(nullptr, 0, nullptr, buffer, sizeof(float)),
    437               ANEURALNETWORKS_UNEXPECTED_NULL);
    438     EXPECT_EQ(ANeuralNetworksExecution_setInput(execution, 0, nullptr, nullptr, sizeof(float)),
    439               ANEURALNETWORKS_UNEXPECTED_NULL);
    440 
    441     // This should fail, since memory is not the size of a float32.
    442     EXPECT_EQ(ANeuralNetworksExecution_setInput(execution, 0, nullptr, buffer, 20),
    443               ANEURALNETWORKS_BAD_DATA);
    444 
    445     // This should fail, as this operand does not exist.
    446     EXPECT_EQ(ANeuralNetworksExecution_setInput(execution, 999, nullptr, buffer, sizeof(float)),
    447               ANEURALNETWORKS_BAD_DATA);
    448 
    449     // This should fail, as this operand does not exist.
    450     EXPECT_EQ(ANeuralNetworksExecution_setInput(execution, -1, nullptr, buffer, sizeof(float)),
    451               ANEURALNETWORKS_BAD_DATA);
    452 }
    453 
    454 TEST_F(ValidationTestExecution, SetOutput) {
    455     ANeuralNetworksExecution* execution;
    456     EXPECT_EQ(ANeuralNetworksExecution_create(mCompilation, &execution), ANEURALNETWORKS_NO_ERROR);
    457 
    458     char buffer[20];
    459     EXPECT_EQ(ANeuralNetworksExecution_setOutput(nullptr, 0, nullptr, buffer, sizeof(float)),
    460               ANEURALNETWORKS_UNEXPECTED_NULL);
    461     EXPECT_EQ(ANeuralNetworksExecution_setOutput(execution, 0, nullptr, nullptr, sizeof(float)),
    462               ANEURALNETWORKS_UNEXPECTED_NULL);
    463 
    464     // This should fail, since memory is not the size of a float32.
    465     EXPECT_EQ(ANeuralNetworksExecution_setOutput(execution, 0, nullptr, buffer, 20),
    466               ANEURALNETWORKS_BAD_DATA);
    467 
    468     // This should fail, as this operand does not exist.
    469     EXPECT_EQ(ANeuralNetworksExecution_setOutput(execution, 999, nullptr, buffer, sizeof(float)),
    470               ANEURALNETWORKS_BAD_DATA);
    471 
    472     // This should fail, as this operand does not exist.
    473     EXPECT_EQ(ANeuralNetworksExecution_setOutput(execution, -1, nullptr, buffer, sizeof(float)),
    474               ANEURALNETWORKS_BAD_DATA);
    475 }
    476 
    477 TEST_F(ValidationTestExecution, SetInputFromMemory) {
    478     ANeuralNetworksExecution* execution;
    479     EXPECT_EQ(ANeuralNetworksExecution_create(mCompilation, &execution), ANEURALNETWORKS_NO_ERROR);
    480 
    481     const size_t memorySize = 20;
    482     int memoryFd = ASharedMemory_create("nnMemory", memorySize);
    483     ASSERT_GT(memoryFd, 0);
    484 
    485     ANeuralNetworksMemory* memory;
    486     EXPECT_EQ(ANeuralNetworksMemory_createFromFd(memorySize, PROT_READ | PROT_WRITE,
    487                                                  memoryFd, 0, &memory),
    488               ANEURALNETWORKS_NO_ERROR);
    489 
    490     EXPECT_EQ(ANeuralNetworksExecution_setInputFromMemory(nullptr, 0, nullptr,
    491                                                           memory, 0, sizeof(float)),
    492               ANEURALNETWORKS_UNEXPECTED_NULL);
    493     EXPECT_EQ(ANeuralNetworksExecution_setInputFromMemory(execution, 0, nullptr,
    494                                                           nullptr, 0, sizeof(float)),
    495               ANEURALNETWORKS_UNEXPECTED_NULL);
    496 
    497     // This should fail, since the operand does not exist.
    498     EXPECT_EQ(ANeuralNetworksExecution_setInputFromMemory(execution, 999, nullptr,
    499                                                           memory, 0, sizeof(float)),
    500               ANEURALNETWORKS_BAD_DATA);
    501 
    502     // This should fail, since the operand does not exist.
    503     EXPECT_EQ(ANeuralNetworksExecution_setInputFromMemory(execution, -1, nullptr,
    504                                                           memory, 0, sizeof(float)),
    505               ANEURALNETWORKS_BAD_DATA);
    506 
    507     // This should fail, since memory is not the size of a float32.
    508     EXPECT_EQ(ANeuralNetworksExecution_setInputFromMemory(execution, 0, nullptr,
    509                                                           memory, 0, memorySize),
    510               ANEURALNETWORKS_BAD_DATA);
    511 
    512     // This should fail, since offset is larger than memorySize.
    513     EXPECT_EQ(ANeuralNetworksExecution_setInputFromMemory(execution, 0, nullptr,
    514                                                           memory, memorySize + 1, sizeof(float)),
    515               ANEURALNETWORKS_BAD_DATA);
    516 
    517     // This should fail, since requested size is larger than the memory.
    518     EXPECT_EQ(ANeuralNetworksExecution_setInputFromMemory(execution, 0, nullptr,
    519                                                           memory, memorySize - 3, sizeof(float)),
    520               ANEURALNETWORKS_BAD_DATA);
    521 }
    522 
    523 TEST_F(ValidationTestExecution, SetOutputFromMemory) {
    524     ANeuralNetworksExecution* execution;
    525     EXPECT_EQ(ANeuralNetworksExecution_create(mCompilation, &execution), ANEURALNETWORKS_NO_ERROR);
    526 
    527     const size_t memorySize = 20;
    528     int memoryFd = ASharedMemory_create("nnMemory", memorySize);
    529     ASSERT_GT(memoryFd, 0);
    530 
    531     ANeuralNetworksMemory* memory;
    532     EXPECT_EQ(ANeuralNetworksMemory_createFromFd(memorySize, PROT_READ | PROT_WRITE,
    533                                                  memoryFd, 0, &memory),
    534               ANEURALNETWORKS_NO_ERROR);
    535 
    536     EXPECT_EQ(ANeuralNetworksExecution_setOutputFromMemory(nullptr, 0, nullptr,
    537                                                            memory, 0, sizeof(float)),
    538               ANEURALNETWORKS_UNEXPECTED_NULL);
    539     EXPECT_EQ(ANeuralNetworksExecution_setOutputFromMemory(execution, 0, nullptr,
    540                                                            nullptr, 0, sizeof(float)),
    541               ANEURALNETWORKS_UNEXPECTED_NULL);
    542 
    543     // This should fail, since the operand does not exist.
    544     EXPECT_EQ(ANeuralNetworksExecution_setOutputFromMemory(execution, 999, nullptr,
    545                                                            memory, 0, sizeof(float)),
    546               ANEURALNETWORKS_BAD_DATA);
    547 
    548     // This should fail, since the operand does not exist.
    549     EXPECT_EQ(ANeuralNetworksExecution_setOutputFromMemory(execution, -1, nullptr,
    550                                                            memory, 0, sizeof(float)),
    551               ANEURALNETWORKS_BAD_DATA);
    552 
    553     // This should fail, since memory is not the size of a float32.
    554     EXPECT_EQ(ANeuralNetworksExecution_setOutputFromMemory(execution, 0, nullptr,
    555                                                            memory, 0, memorySize),
    556               ANEURALNETWORKS_BAD_DATA);
    557 
    558     // This should fail, since offset is larger than memorySize.
    559     EXPECT_EQ(ANeuralNetworksExecution_setOutputFromMemory(execution, 0, nullptr,
    560                                                            memory, memorySize + 1, sizeof(float)),
    561               ANEURALNETWORKS_BAD_DATA);
    562 
    563     // This should fail, since requested size is larger than the memory.
    564     EXPECT_EQ(ANeuralNetworksExecution_setOutputFromMemory(execution, 0, nullptr,
    565                                                            memory, memorySize - 3, sizeof(float)),
    566               ANEURALNETWORKS_BAD_DATA);
    567 }
    568 
    569 TEST_F(ValidationTestExecution, StartCompute) {
    570     ANeuralNetworksExecution* execution;
    571     EXPECT_EQ(ANeuralNetworksExecution_create(mCompilation, &execution), ANEURALNETWORKS_NO_ERROR);
    572 
    573     ANeuralNetworksEvent* event;
    574     EXPECT_EQ(ANeuralNetworksExecution_startCompute(nullptr, &event),
    575               ANEURALNETWORKS_UNEXPECTED_NULL);
    576     EXPECT_EQ(ANeuralNetworksExecution_startCompute(execution, nullptr),
    577               ANEURALNETWORKS_UNEXPECTED_NULL);
    578 }
    579 
    580 TEST_F(ValidationTestExecution, EventWait) {
    581     EXPECT_EQ(ANeuralNetworksEvent_wait(nullptr), ANEURALNETWORKS_UNEXPECTED_NULL);
    582 }
    583 }  // namespace
    584