From dfc013adaa13cae38393279a98a3753a44814827 Mon Sep 17 00:00:00 2001 From: Xusong Wang Date: Fri, 21 May 2021 14:58:40 -0700 Subject: [PATCH] Test readonly request input in AIDL VTS. This CL modifies the AIDL generated tests to use readonly memory pool for request inputs. Bug: 188104713 Test: VtsHalNeuralnetworksTargetTest Change-Id: I9e62f1cdeb501bf29bcb9c56317a452c9105b272 --- .../vts/functional/GeneratedTestHarness.cpp | 4 +-- neuralnetworks/aidl/vts/functional/Utils.cpp | 29 ++++++++++++++++--- neuralnetworks/aidl/vts/functional/Utils.h | 9 ++++-- 3 files changed, 33 insertions(+), 9 deletions(-) diff --git a/neuralnetworks/aidl/vts/functional/GeneratedTestHarness.cpp b/neuralnetworks/aidl/vts/functional/GeneratedTestHarness.cpp index d3b041ddf7..2356ff0520 100644 --- a/neuralnetworks/aidl/vts/functional/GeneratedTestHarness.cpp +++ b/neuralnetworks/aidl/vts/functional/GeneratedTestHarness.cpp @@ -435,8 +435,8 @@ std::optional ExecutionContext::createRequest(const TestModel& testMode mInputMemory = TestBlobAHWB::create(std::max(inputSize, 1)); mOutputMemory = TestBlobAHWB::create(std::max(outputSize, 1)); } else { - mInputMemory = TestAshmem::create(std::max(inputSize, 1)); - mOutputMemory = TestAshmem::create(std::max(outputSize, 1)); + mInputMemory = TestAshmem::create(std::max(inputSize, 1), /*aidlReadonly=*/true); + mOutputMemory = TestAshmem::create(std::max(outputSize, 1), /*aidlReadonly=*/false); } CHECK_NE(mInputMemory, nullptr); CHECK_NE(mOutputMemory, nullptr); diff --git a/neuralnetworks/aidl/vts/functional/Utils.cpp b/neuralnetworks/aidl/vts/functional/Utils.cpp index 3c7f5f797d..9af362ea8a 100644 --- a/neuralnetworks/aidl/vts/functional/Utils.cpp +++ b/neuralnetworks/aidl/vts/functional/Utils.cpp @@ -23,6 +23,7 @@ #include #include +#include #include #include #include @@ -98,19 +99,39 @@ uint32_t sizeOfData(const Operand& operand) { std::multiplies<>{}); } -std::unique_ptr TestAshmem::create(uint32_t size) { - auto ashmem = std::make_unique(size); +std::unique_ptr TestAshmem::create(uint32_t size, bool aidlReadonly) { + auto ashmem = std::make_unique(size, aidlReadonly); return ashmem->mIsValid ? std::move(ashmem) : nullptr; } -void TestAshmem::initialize(uint32_t size) { +// This function will create a readonly shared memory with PROT_READ only. +// The input shared memory must be either Ashmem or mapped-FD. +static nn::SharedMemory convertSharedMemoryToReadonly(const nn::SharedMemory& sharedMemory) { + if (std::holds_alternative(sharedMemory->handle)) { + const auto& memory = std::get(sharedMemory->handle); + return nn::createSharedMemoryFromFd(memory.size, PROT_READ, memory.fd.get(), /*offset=*/0) + .value(); + } else if (std::holds_alternative(sharedMemory->handle)) { + const auto& memory = std::get(sharedMemory->handle); + return nn::createSharedMemoryFromFd(memory.size, PROT_READ, memory.fd.get(), memory.offset) + .value(); + } + CHECK(false) << "Unexpected shared memory type"; + return sharedMemory; +} + +void TestAshmem::initialize(uint32_t size, bool aidlReadonly) { mIsValid = false; ASSERT_GT(size, 0); const auto sharedMemory = nn::createSharedMemory(size).value(); mMappedMemory = nn::map(sharedMemory).value(); mPtr = static_cast(std::get(mMappedMemory.pointer)); CHECK_NE(mPtr, nullptr); - mAidlMemory = utils::convert(sharedMemory).value(); + if (aidlReadonly) { + mAidlMemory = utils::convert(convertSharedMemoryToReadonly(sharedMemory)).value(); + } else { + mAidlMemory = utils::convert(sharedMemory).value(); + } mIsValid = true; } diff --git a/neuralnetworks/aidl/vts/functional/Utils.h b/neuralnetworks/aidl/vts/functional/Utils.h index 77085a75ef..9dd73592dd 100644 --- a/neuralnetworks/aidl/vts/functional/Utils.h +++ b/neuralnetworks/aidl/vts/functional/Utils.h @@ -79,15 +79,18 @@ class TestMemoryBase { class TestAshmem : public TestMemoryBase { public: - static std::unique_ptr create(uint32_t size); + // If aidlReadonly is true, getAidlMemory will return a sAIDL memory with readonly access; + // otherwise, the sAIDL memory has read-write access. This only affects the sAIDL memory. + // getPointer will always return a valid address with read-write access. + static std::unique_ptr create(uint32_t size, bool aidlReadonly = false); // Prefer TestAshmem::create. // The constructor calls initialize, which constructs the memory resources. This is a workaround // that gtest macros cannot be used directly in a constructor. - TestAshmem(uint32_t size) { initialize(size); } + TestAshmem(uint32_t size, bool aidlReadonly) { initialize(size, aidlReadonly); } private: - void initialize(uint32_t size); + void initialize(uint32_t size, bool aidlReadonly); nn::Mapping mMappedMemory; };