CameraModuleTests.cpp revision 0a7a430a81b97b09f42b56ab85de24d0ca711520
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> 22e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin 23e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin#include "hardware/hardware.h" 24e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin#include "hardware/camera2.h" 25e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin 26e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin#include "Camera2Device.h" 27e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin#include "utils/StrongPointer.h" 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 490a7a430a81b97b09f42b56ab85de24d0ca711520Igor Murashkin if (!isDeviceVersionHal2(cameraId)) { 500a7a430a81b97b09f42b56ab85de24d0ca711520Igor Murashkin return OK; 510a7a430a81b97b09f42b56ab85de24d0ca711520Igor Murashkin } 520a7a430a81b97b09f42b56ab85de24d0ca711520Igor Murashkin 530a7a430a81b97b09f42b56ab85de24d0ca711520Igor Murashkin return mDevice->initialize(mModule); 540a7a430a81b97b09f42b56ab85de24d0ca711520Igor Murashkin } 550a7a430a81b97b09f42b56ab85de24d0ca711520Igor Murashkin 560a7a430a81b97b09f42b56ab85de24d0ca711520Igor Murashkin int getDeviceVersion(int cameraId) { 570a7a430a81b97b09f42b56ab85de24d0ca711520Igor Murashkin camera_info info; 580a7a430a81b97b09f42b56ab85de24d0ca711520Igor Murashkin status_t res = mModule->get_camera_info(cameraId, &info); 590a7a430a81b97b09f42b56ab85de24d0ca711520Igor Murashkin EXPECT_EQ(OK, res); 600a7a430a81b97b09f42b56ab85de24d0ca711520Igor Murashkin 610a7a430a81b97b09f42b56ab85de24d0ca711520Igor Murashkin return info.device_version; 620a7a430a81b97b09f42b56ab85de24d0ca711520Igor Murashkin } 630a7a430a81b97b09f42b56ab85de24d0ca711520Igor Murashkin 640a7a430a81b97b09f42b56ab85de24d0ca711520Igor Murashkin bool isDeviceVersionHal2(int cameraId) { 650a7a430a81b97b09f42b56ab85de24d0ca711520Igor Murashkin return getDeviceVersion(cameraId) >= CAMERA_DEVICE_API_VERSION_2_0; 660a7a430a81b97b09f42b56ab85de24d0ca711520Igor Murashkin } 67e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin}; 68e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin 69eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor MurashkinTEST_F(CameraModuleTest, LoadModule) { 70e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin 71eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin TEST_EXTENSION_FORKING_INIT; 72e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin 73e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin for (int i = 0; i < mNumberOfCameras; ++i) { 74e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin mDevice = new Camera2Device(i); 750a7a430a81b97b09f42b56ab85de24d0ca711520Igor Murashkin 760a7a430a81b97b09f42b56ab85de24d0ca711520Igor Murashkin ASSERT_EQ(OK, initializeDevice(i)) 77e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin << "Failed to initialize device " << i; 78e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin mDevice.clear(); 79e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin } 80e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin 81e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin} 82e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin 83eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor MurashkinTEST_F(CameraModuleTest, LoadModuleBadIndices) { 84e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin 85eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin TEST_EXTENSION_FORKING_INIT; 86e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin 87e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin int idx[] = { -1, mNumberOfCameras, mNumberOfCameras + 1 }; 88e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin 89e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin for (unsigned i = 0; i < sizeof(idx)/sizeof(idx[0]); ++i) { 90e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin mDevice = new Camera2Device(idx[i]); 910a7a430a81b97b09f42b56ab85de24d0ca711520Igor Murashkin status_t deviceInitializeCode = initializeDevice(idx[i]); 92e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin EXPECT_NE(OK, deviceInitializeCode); 93e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin EXPECT_EQ(-ENODEV, deviceInitializeCode) 94e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin << "Incorrect error code when trying to initialize invalid index " 95e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin << idx[i]; 96e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin mDevice.clear(); 97e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin } 98e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin} 99e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin 100eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor MurashkinTEST_F(CameraModuleTest, GetCameraInfo) { 101e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin 102eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin TEST_EXTENSION_FORKING_INIT; 103e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin 104e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin for (int i = 0; i < mNumberOfCameras; ++i) { 105e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin struct camera_info info; 106e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin ASSERT_EQ(OK, mModule->get_camera_info(i, &info)); 107e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin } 108e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin 109e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin} 110e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin 111eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor MurashkinTEST_F(CameraModuleTest, GetCameraInfoBadIndices) { 112e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin 113eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin TEST_EXTENSION_FORKING_INIT; 114e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin 115e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin int idx[] = { -1, mNumberOfCameras, mNumberOfCameras + 1 }; 116e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin for (unsigned i = 0; i < sizeof(idx)/sizeof(idx[0]); ++i) { 117e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin struct camera_info info; 118e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin EXPECT_NE(OK, mModule->get_camera_info(idx[i], &info)); 119e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin EXPECT_EQ(-ENODEV, mModule->get_camera_info(idx[i], &info)) 120e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin << "Incorrect error code for get_camera_info idx= " 121e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin << idx[i]; 122e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin } 123e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin} 124e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin 125e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin/** 126e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin * TODO: Additional test to add: open two cameras at once. 127e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin * (is allowed to fail, at least for now, but should not blow up) 128eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin * - open same device multiple times 129eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin * - close same device multiple times 130e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin */ 131e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin 132e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin 133e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin 134e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin 135e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin} 136e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin} 137e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin} 138e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin 139