/* * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #define LOG_NDEBUG 0 #define LOG_TAG "CameraCharacteristicsPermission" #include #include #include #include #include #include #include using namespace android; using namespace android::hardware; class CameraCharacteristicsPermission : public ::testing::Test { protected: CameraCharacteristicsPermission() : numCameras(0){} //Gtest interface void SetUp() override; void TearDown() override; int32_t numCameras; sp mCameraService; }; void CameraCharacteristicsPermission::SetUp() { ::android::binder::Status rc; ProcessState::self()->startThreadPool(); sp sm = defaultServiceManager(); sp binder = sm->getService(String16("media.camera")); mCameraService = interface_cast(binder); rc = mCameraService->getNumberOfCameras( hardware::ICameraService::CAMERA_TYPE_ALL, &numCameras); EXPECT_TRUE(rc.isOk()); } void CameraCharacteristicsPermission::TearDown() { mCameraService.clear(); } // Revoking and acquiring permissions automatically might not be possible. // Test the functionality for removal of camera characteristics needing // a camera permission. TEST_F(CameraCharacteristicsPermission, TestCameraPermission) { for (int32_t cameraId = 0; cameraId < numCameras; cameraId++) { String16 cameraIdStr = String16(String8::format("%d", cameraId)); bool isSupported = false; auto rc = mCameraService->supportsCameraApi(cameraIdStr, hardware::ICameraService::API_VERSION_2, &isSupported); EXPECT_TRUE(rc.isOk()); if (!isSupported) { continue; } CameraMetadata metadata; std::vector tagsNeedingPermission; rc = mCameraService->getCameraCharacteristics(cameraIdStr, /*targetSdkVersion*/__ANDROID_API_FUTURE__, /*overrideToPortrait*/false, &metadata); ASSERT_TRUE(rc.isOk()); EXPECT_FALSE(metadata.isEmpty()); EXPECT_EQ(metadata.removePermissionEntries(CAMERA_METADATA_INVALID_VENDOR_ID, &tagsNeedingPermission), NO_ERROR); camera_metadata_entry_t availableCharacteristics = metadata.find(ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS); EXPECT_TRUE(0 < availableCharacteristics.count); std::vector availableKeys; availableKeys.reserve(availableCharacteristics.count); availableKeys.insert(availableKeys.begin(), availableCharacteristics.data.i32, availableCharacteristics.data.i32 + availableCharacteristics.count); for (const auto &key : tagsNeedingPermission) { ASSERT_FALSE(metadata.exists(key)); auto it = std::find(availableKeys.begin(), availableKeys.end(), key); ASSERT_TRUE(it == availableKeys.end()); } } }