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