From 83b724a23f8712637f5f3ce921bbf2bf3eec6b12 Mon Sep 17 00:00:00 2001 From: Jayant Chowdhary Date: Thu, 14 May 2020 21:02:41 -0700 Subject: [PATCH 1/2] camera vts: Skip regular vts tests for secure only cameras. Bug: 156749607 Test: fake mark a camera id as a secure only, see that it doesn't get tested unless a test calls getCameraDeviceNames with addSecure = true Test: VtsHalCameraProviderV2_4TargetTest passes on device without any secure only cameras Change-Id: Ibe428b663bd8024f46f0273ed5dfaa108a90dd43 Signed-off-by: Jayant Chowdhary --- .../VtsHalCameraProviderV2_4TargetTest.cpp | 54 +++++++++++++++++-- 1 file changed, 49 insertions(+), 5 deletions(-) diff --git a/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp b/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp index bf5fbfe692..3e26de2025 100644 --- a/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp +++ b/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp @@ -575,7 +575,10 @@ public: } virtual void TearDown() override {} - hidl_vec getCameraDeviceNames(sp provider); + hidl_vec getCameraDeviceNames(sp provider, + bool addSecureOnly = false); + + bool isSecureOnly(sp provider, const hidl_string& name); std::map getCameraDeviceIdToNameMap(sp provider); @@ -1585,7 +1588,8 @@ std::map CameraHidlTest::getCameraDeviceIdToNameMap( return idToNameMap; } -hidl_vec CameraHidlTest::getCameraDeviceNames(sp provider) { +hidl_vec CameraHidlTest::getCameraDeviceNames(sp provider, + bool addSecureOnly) { std::vector cameraDeviceNames; Return ret; ret = provider->getCameraIdList( @@ -1634,11 +1638,51 @@ hidl_vec CameraHidlTest::getCameraDeviceNames(sp p } } - hidl_vec retList(cameraDeviceNames.size()); + std::vector retList; for (size_t i = 0; i < cameraDeviceNames.size(); i++) { - retList[i] = cameraDeviceNames[i]; + bool isSecureOnlyCamera = isSecureOnly(mProvider, cameraDeviceNames[i]); + if (addSecureOnly) { + if (isSecureOnlyCamera) { + retList.emplace_back(cameraDeviceNames[i]); + } + } else if (!isSecureOnlyCamera) { + retList.emplace_back(cameraDeviceNames[i]); + } } - return retList; + hidl_vec finalRetList = std::move(retList); + return finalRetList; +} + +bool CameraHidlTest::isSecureOnly(sp provider, const hidl_string& name) { + Return ret; + ::android::sp device3_x; + bool retVal = false; + if (getCameraDeviceVersion(mProviderType, name) == CAMERA_DEVICE_API_VERSION_1_0) { + return false; + } + ret = provider->getCameraDeviceInterface_V3_x(name, [&](auto status, const auto& device) { + ALOGI("getCameraDeviceInterface_V3_x returns status:%d", (int)status); + ASSERT_EQ(Status::OK, status); + ASSERT_NE(device, nullptr); + device3_x = device; + }); + if (!ret.isOk()) { + ADD_FAILURE() << "Failed to get camera device interface for " << name; + } + ret = device3_x->getCameraCharacteristics([&](Status s, CameraMetadata metadata) { + ASSERT_EQ(Status::OK, s); + camera_metadata_t* chars = (camera_metadata_t*)metadata.data(); + SystemCameraKind systemCameraKind = SystemCameraKind::PUBLIC; + Status status = getSystemCameraKind(chars, &systemCameraKind); + ASSERT_EQ(status, Status::OK); + if (systemCameraKind == SystemCameraKind::HIDDEN_SECURE_CAMERA) { + retVal = true; + } + }); + if (!ret.isOk()) { + ADD_FAILURE() << "Failed to get camera characteristics for device " << name; + } + return retVal; } hidl_vec> CameraHidlTest::getConcurrentDeviceCombinations( From a80974ca8ccd934ba8fe1e7903ababc6304f93f3 Mon Sep 17 00:00:00 2001 From: Jayant Chowdhary Date: Mon, 1 Jun 2020 10:09:47 -0700 Subject: [PATCH 2/2] Camera VTS: Add a minimal test for secure only cameras. Bug: 156749607 Test: VtsHalCameraProviderV2_4TargetTest --gtest_filter=PerInstance/CameraHidlTest.processSecureCaptureRequest* on device which SECURE_IMAGE_DATA. Change-Id: I57f6210b69b383dc4f43cc4ee8272050a0432541 Signed-off-by: Jayant Chowdhary --- .../VtsHalCameraProviderV2_4TargetTest.cpp | 77 ++++++++++++++----- 1 file changed, 58 insertions(+), 19 deletions(-) diff --git a/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp b/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp index 3e26de2025..0275eebe37 100644 --- a/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp +++ b/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp @@ -802,6 +802,16 @@ public: bool *useHalBufManager /*out*/, sp *cb /*out*/, uint32_t streamConfigCounter = 0); + void configureSingleStream(const std::string& name, int32_t deviceVersion, + sp provider, + const AvailableStream* previewThreshold, uint64_t bufferUsage, + RequestTemplate reqTemplate, + sp* session /*out*/, + V3_2::Stream* previewStream /*out*/, + HalStreamConfiguration* halStreamConfig /*out*/, + bool* supportsPartialResults /*out*/, + uint32_t* partialResultCount /*out*/, bool* useHalBufManager /*out*/, + sp* cb /*out*/, uint32_t streamConfigCounter = 0); void verifyLogicalCameraMetadata(const std::string& cameraName, const ::android::sp<::android::hardware::camera::device::V3_2::ICameraDevice>& device, @@ -878,6 +888,9 @@ public: static Status getSystemCameraKind(const camera_metadata_t* staticMeta, SystemCameraKind* systemCameraKind); + void processCaptureRequestInternal(uint64_t bufferusage, RequestTemplate reqTemplate, + bool useSecureOnlyCameras); + // Used by switchToOffline where a new result queue is created for offline reqs void updateInflightResultQueue(std::shared_ptr resultQueue); @@ -4360,8 +4373,21 @@ TEST_P(CameraHidlTest, configureStreamsVideoStillOutputs) { // Generate and verify a camera capture request TEST_P(CameraHidlTest, processCaptureRequestPreview) { - hidl_vec cameraDeviceNames = getCameraDeviceNames(mProvider); - AvailableStream previewThreshold = {kMaxPreviewWidth, kMaxPreviewHeight, + processCaptureRequestInternal(GRALLOC1_CONSUMER_USAGE_HWCOMPOSER, RequestTemplate::PREVIEW, + false /*secureOnlyCameras*/); +} + +// Generate and verify a secure camera capture request +TEST_P(CameraHidlTest, processSecureCaptureRequest) { + processCaptureRequestInternal(GRALLOC1_PRODUCER_USAGE_PROTECTED, RequestTemplate::STILL_CAPTURE, + true /*secureOnlyCameras*/); +} + +void CameraHidlTest::processCaptureRequestInternal(uint64_t bufferUsage, + RequestTemplate reqTemplate, + bool useSecureOnlyCameras) { + hidl_vec cameraDeviceNames = getCameraDeviceNames(mProvider, useSecureOnlyCameras); + AvailableStream streamThreshold = {kMaxPreviewWidth, kMaxPreviewHeight, static_cast(PixelFormat::IMPLEMENTATION_DEFINED)}; uint64_t bufferId = 1; uint32_t frameNumber = 1; @@ -4377,17 +4403,17 @@ TEST_P(CameraHidlTest, processCaptureRequestPreview) { return; } - V3_2::Stream previewStream; + V3_2::Stream testStream; HalStreamConfiguration halStreamConfig; sp session; sp cb; bool supportsPartialResults = false; bool useHalBufManager = false; uint32_t partialResultCount = 0; - configurePreviewStream(name, deviceVersion, mProvider, &previewThreshold, &session /*out*/, - &previewStream /*out*/, &halStreamConfig /*out*/, - &supportsPartialResults /*out*/, - &partialResultCount /*out*/, &useHalBufManager /*out*/, &cb /*out*/); + configureSingleStream(name, deviceVersion, mProvider, &streamThreshold, bufferUsage, + reqTemplate, &session /*out*/, &testStream /*out*/, + &halStreamConfig /*out*/, &supportsPartialResults /*out*/, + &partialResultCount /*out*/, &useHalBufManager /*out*/, &cb /*out*/); std::shared_ptr resultQueue; auto resultQueueRet = @@ -4408,7 +4434,6 @@ TEST_P(CameraHidlTest, processCaptureRequestPreview) { InFlightRequest inflightReq = {1, false, supportsPartialResults, partialResultCount, resultQueue}; - RequestTemplate reqTemplate = RequestTemplate::PREVIEW; Return ret; ret = session->constructDefaultRequestSettings(reqTemplate, [&](auto status, const auto& req) { @@ -4427,7 +4452,7 @@ TEST_P(CameraHidlTest, processCaptureRequestPreview) { nullptr, nullptr}; } else { - allocateGraphicBuffer(previewStream.width, previewStream.height, + allocateGraphicBuffer(testStream.width, testStream.height, android_convertGralloc1To0Usage(halStreamConfig.streams[0].producerUsage, halStreamConfig.streams[0].consumerUsage), halStreamConfig.streams[0].overrideFormat, &buffer_handle); @@ -4476,7 +4501,7 @@ TEST_P(CameraHidlTest, processCaptureRequestPreview) { ASSERT_FALSE(inflightReq.errorCodeValid); ASSERT_NE(inflightReq.resultOutputBuffers.size(), 0u); - ASSERT_EQ(previewStream.id, inflightReq.resultOutputBuffers[0].streamId); + ASSERT_EQ(testStream.id, inflightReq.resultOutputBuffers[0].streamId); request.frameNumber++; // Empty settings should be supported after the first call @@ -4514,11 +4539,11 @@ TEST_P(CameraHidlTest, processCaptureRequestPreview) { ASSERT_FALSE(inflightReq.errorCodeValid); ASSERT_NE(inflightReq.resultOutputBuffers.size(), 0u); - ASSERT_EQ(previewStream.id, inflightReq.resultOutputBuffers[0].streamId); + ASSERT_EQ(testStream.id, inflightReq.resultOutputBuffers[0].streamId); } if (useHalBufManager) { - verifyBuffersReturned(session, deviceVersion, previewStream.id, cb); + verifyBuffersReturned(session, deviceVersion, testStream.id, cb); } ret = session->close(); @@ -6322,6 +6347,19 @@ void CameraHidlTest::configurePreviewStream(const std::string &name, int32_t dev bool *useHalBufManager /*out*/, sp *outCb /*out*/, uint32_t streamConfigCounter) { + configureSingleStream(name, deviceVersion, provider, previewThreshold, + GRALLOC1_CONSUMER_USAGE_HWCOMPOSER, RequestTemplate::PREVIEW, session, + previewStream, halStreamConfig, supportsPartialResults, + partialResultCount, useHalBufManager, outCb, streamConfigCounter); +} +// Open a device session and configure a preview stream. +void CameraHidlTest::configureSingleStream( + const std::string& name, int32_t deviceVersion, sp provider, + const AvailableStream* previewThreshold, uint64_t bufferUsage, RequestTemplate reqTemplate, + sp* session /*out*/, V3_2::Stream* previewStream /*out*/, + HalStreamConfiguration* halStreamConfig /*out*/, bool* supportsPartialResults /*out*/, + uint32_t* partialResultCount /*out*/, bool* useHalBufManager /*out*/, + sp* outCb /*out*/, uint32_t streamConfigCounter) { ASSERT_NE(nullptr, session); ASSERT_NE(nullptr, previewStream); ASSERT_NE(nullptr, halStreamConfig); @@ -6410,11 +6448,14 @@ void CameraHidlTest::configurePreviewStream(const std::string &name, int32_t dev dataspaceFlag = static_cast(Dataspace::UNKNOWN); } - V3_2::Stream stream3_2 = {0, StreamType::OUTPUT, - static_cast (outputPreviewStreams[0].width), - static_cast (outputPreviewStreams[0].height), - static_cast (outputPreviewStreams[0].format), - GRALLOC1_CONSUMER_USAGE_HWCOMPOSER, dataspaceFlag, StreamRotation::ROTATION_0}; + V3_2::Stream stream3_2 = {0, + StreamType::OUTPUT, + static_cast(outputPreviewStreams[0].width), + static_cast(outputPreviewStreams[0].height), + static_cast(outputPreviewStreams[0].format), + bufferUsage, + dataspaceFlag, + StreamRotation::ROTATION_0}; ::android::hardware::hidl_vec streams3_2 = {stream3_2}; ::android::hardware::camera::device::V3_2::StreamConfiguration config3_2; ::android::hardware::camera::device::V3_4::StreamConfiguration config3_4; @@ -6422,7 +6463,6 @@ void CameraHidlTest::configurePreviewStream(const std::string &name, int32_t dev createStreamConfiguration(streams3_2, StreamConfigurationMode::NORMAL_MODE, &config3_2, &config3_4, &config3_5, jpegBufferSize); if (session3_5 != nullptr) { - RequestTemplate reqTemplate = RequestTemplate::PREVIEW; ret = session3_5->constructDefaultRequestSettings(reqTemplate, [&config3_5](auto status, const auto& req) { ASSERT_EQ(Status::OK, status); @@ -6445,7 +6485,6 @@ void CameraHidlTest::configurePreviewStream(const std::string &name, int32_t dev } }); } else if (session3_4 != nullptr) { - RequestTemplate reqTemplate = RequestTemplate::PREVIEW; ret = session3_4->constructDefaultRequestSettings(reqTemplate, [&config3_4](auto status, const auto& req) { ASSERT_EQ(Status::OK, status);