1e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin/* 2e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin * Copyright (C) 2012 The Android Open Source Project 3e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin * 4e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin * Licensed under the Apache License, Version 2.0 (the "License"); 5e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin * you may not use this file except in compliance with the License. 6e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin * You may obtain a copy of the License at 7e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin * 8e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin * http://www.apache.org/licenses/LICENSE-2.0 9e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin * 10e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin * Unless required by applicable law or agreed to in writing, software 11e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin * distributed under the License is distributed on an "AS IS" BASIS, 12e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin * See the License for the specific language governing permissions and 14e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin * limitations under the License. 15e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin */ 16e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin 17e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin#include <gtest/gtest.h> 18e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin 19eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin#define LOG_TAG "CameraModuleTest" 20e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin#define LOG_NDEBUG 0 21e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin#include <utils/Log.h> 2248bb03fad356184c52607dfbae065511785e5eb4Eino-Ville Talvala#include <utils/StrongPointer.h> 2348bb03fad356184c52607dfbae065511785e5eb4Eino-Ville Talvala#include <common/CameraDeviceBase.h> 24e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin 25e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin#include "hardware/hardware.h" 26e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin#include "hardware/camera2.h" 27e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin 28e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin#include "CameraModuleFixture.h" 29e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin 30e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkinnamespace android { 31e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkinnamespace camera2 { 32e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkinnamespace tests { 33e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin 34eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkinclass CameraModuleTest : public ::testing::Test, 35e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin public CameraModuleFixture<> { 367acb21a65c6eefe6ab1cbc55c7c15cece6bafbe5Igor Murashkin 377acb21a65c6eefe6ab1cbc55c7c15cece6bafbe5Igor Murashkinpublic: 387acb21a65c6eefe6ab1cbc55c7c15cece6bafbe5Igor Murashkin CameraModuleTest() { 397acb21a65c6eefe6ab1cbc55c7c15cece6bafbe5Igor Murashkin CameraModuleFixture::SetUp(); 407acb21a65c6eefe6ab1cbc55c7c15cece6bafbe5Igor Murashkin } 417acb21a65c6eefe6ab1cbc55c7c15cece6bafbe5Igor Murashkin 427acb21a65c6eefe6ab1cbc55c7c15cece6bafbe5Igor Murashkin ~CameraModuleTest() { 437acb21a65c6eefe6ab1cbc55c7c15cece6bafbe5Igor Murashkin CameraModuleFixture::TearDown(); 447acb21a65c6eefe6ab1cbc55c7c15cece6bafbe5Igor Murashkin } 450a7a430a81b97b09f42b56ab85de24d0ca711520Igor Murashkin 460a7a430a81b97b09f42b56ab85de24d0ca711520Igor Murashkin status_t initializeDevice(int cameraId) { 470a7a430a81b97b09f42b56ab85de24d0ca711520Igor Murashkin 480a7a430a81b97b09f42b56ab85de24d0ca711520Igor Murashkin // ignore HAL1s. count as test pass 49e9b0eaaec6ac6bc988a52b6ce61b87334dc71bfcIgor Murashkin status_t stat; 50e9b0eaaec6ac6bc988a52b6ce61b87334dc71bfcIgor Murashkin if (isDeviceVersionHal2(cameraId, &stat) && stat == OK) { 51e9b0eaaec6ac6bc988a52b6ce61b87334dc71bfcIgor Murashkin stat = mDevice->initialize(mModule); 520a7a430a81b97b09f42b56ab85de24d0ca711520Igor Murashkin } 530a7a430a81b97b09f42b56ab85de24d0ca711520Igor Murashkin 54e9b0eaaec6ac6bc988a52b6ce61b87334dc71bfcIgor Murashkin return stat; 550a7a430a81b97b09f42b56ab85de24d0ca711520Igor Murashkin } 560a7a430a81b97b09f42b56ab85de24d0ca711520Igor Murashkin 57e9b0eaaec6ac6bc988a52b6ce61b87334dc71bfcIgor Murashkin bool isDeviceVersionHal2(int cameraId, status_t* status) { 58e9b0eaaec6ac6bc988a52b6ce61b87334dc71bfcIgor Murashkin return getDeviceVersion(cameraId, status) 59e9b0eaaec6ac6bc988a52b6ce61b87334dc71bfcIgor Murashkin >= CAMERA_DEVICE_API_VERSION_2_0; 600a7a430a81b97b09f42b56ab85de24d0ca711520Igor Murashkin } 61e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin}; 62e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin 63eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor MurashkinTEST_F(CameraModuleTest, LoadModule) { 64e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin 65eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin TEST_EXTENSION_FORKING_INIT; 66e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin 67b44ff6508bbcb8df751b5815dd4dfbd4cae252f7Zhijun He status_t stat; 68e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin for (int i = 0; i < mNumberOfCameras; ++i) { 69b44ff6508bbcb8df751b5815dd4dfbd4cae252f7Zhijun He if (isDeviceVersionHal2(i, &stat) && stat == OK) { 70b44ff6508bbcb8df751b5815dd4dfbd4cae252f7Zhijun He CreateCamera(i, &mDevice); 71b44ff6508bbcb8df751b5815dd4dfbd4cae252f7Zhijun He ASSERT_EQ(OK, initializeDevice(i)) 72b44ff6508bbcb8df751b5815dd4dfbd4cae252f7Zhijun He << "Failed to initialize device " << i; 73b44ff6508bbcb8df751b5815dd4dfbd4cae252f7Zhijun He mDevice.clear(); 74b44ff6508bbcb8df751b5815dd4dfbd4cae252f7Zhijun He } else { 75b44ff6508bbcb8df751b5815dd4dfbd4cae252f7Zhijun He const ::testing::TestInfo* const test_info = 76b44ff6508bbcb8df751b5815dd4dfbd4cae252f7Zhijun He ::testing::UnitTest::GetInstance()->current_test_info(); 77b44ff6508bbcb8df751b5815dd4dfbd4cae252f7Zhijun He std::cerr << "Skipping test " 78b44ff6508bbcb8df751b5815dd4dfbd4cae252f7Zhijun He << test_info->test_case_name() << "." 79b44ff6508bbcb8df751b5815dd4dfbd4cae252f7Zhijun He << test_info->name() 80b44ff6508bbcb8df751b5815dd4dfbd4cae252f7Zhijun He << " because HAL device version is V1" 81b44ff6508bbcb8df751b5815dd4dfbd4cae252f7Zhijun He << std::endl; 82b44ff6508bbcb8df751b5815dd4dfbd4cae252f7Zhijun He } 83e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin } 84e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin 85e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin} 86e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin 87eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor MurashkinTEST_F(CameraModuleTest, LoadModuleBadIndices) { 88e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin 89eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin TEST_EXTENSION_FORKING_INIT; 90e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin 91e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin int idx[] = { -1, mNumberOfCameras, mNumberOfCameras + 1 }; 9260cbb52613d212236de49b4f22fe059585f8c1b2Zhijun He hw_device_t *device = NULL; 93e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin 94e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin for (unsigned i = 0; i < sizeof(idx)/sizeof(idx[0]); ++i) { 9560cbb52613d212236de49b4f22fe059585f8c1b2Zhijun He String8 deviceName = String8::format("%d", idx[i]); 967eb3d91b872b2cf3350ee4aaa4e9fbbe941b44e2Yin-Chia Yeh status_t res = mModule->open(deviceName, &device); 9760cbb52613d212236de49b4f22fe059585f8c1b2Zhijun He EXPECT_NE(OK, res); 9860cbb52613d212236de49b4f22fe059585f8c1b2Zhijun He EXPECT_EQ(-ENODEV, res) 9960cbb52613d212236de49b4f22fe059585f8c1b2Zhijun He << "Incorrect error code when trying to open camera with invalid id " 10060cbb52613d212236de49b4f22fe059585f8c1b2Zhijun He << deviceName; 101e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin } 102e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin} 103e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin 104eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor MurashkinTEST_F(CameraModuleTest, GetCameraInfo) { 105e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin 106eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin TEST_EXTENSION_FORKING_INIT; 107e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin 108e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin for (int i = 0; i < mNumberOfCameras; ++i) { 109e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin struct camera_info info; 1107eb3d91b872b2cf3350ee4aaa4e9fbbe941b44e2Yin-Chia Yeh ASSERT_EQ(OK, mModule->getCameraInfo(i, &info)); 111e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin } 112e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin 113e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin} 114e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin 115eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor MurashkinTEST_F(CameraModuleTest, GetCameraInfoBadIndices) { 116e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin 117eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin TEST_EXTENSION_FORKING_INIT; 118e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin 119e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin int idx[] = { -1, mNumberOfCameras, mNumberOfCameras + 1 }; 120e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin for (unsigned i = 0; i < sizeof(idx)/sizeof(idx[0]); ++i) { 121e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin struct camera_info info; 1227eb3d91b872b2cf3350ee4aaa4e9fbbe941b44e2Yin-Chia Yeh EXPECT_NE(OK, mModule->getCameraInfo(idx[i], &info)); 1235ad8086ad70b5c67222745ed55e6edf2ed715c81Eino-Ville Talvala EXPECT_EQ(-EINVAL, mModule->getCameraInfo(idx[i], &info)) 124e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin << "Incorrect error code for get_camera_info idx= " 125e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin << idx[i]; 126e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin } 127e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin} 128e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin 129e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin/** 130e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin * TODO: Additional test to add: open two cameras at once. 131e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin * (is allowed to fail, at least for now, but should not blow up) 132eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin * - open same device multiple times 133eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin * - close same device multiple times 134e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin */ 135e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin 136e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin 137e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin 138e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin 139e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin} 140e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin} 141e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin} 142