CameraModuleTests.cpp revision e9b0eaaec6ac6bc988a52b6ce61b87334dc71bfc
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
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    int getDeviceVersion(int cameraId, status_t* status) {
580a7a430a81b97b09f42b56ab85de24d0ca711520Igor Murashkin        camera_info info;
59e9b0eaaec6ac6bc988a52b6ce61b87334dc71bfcIgor Murashkin        *status = mModule->get_camera_info(cameraId, &info);
600a7a430a81b97b09f42b56ab85de24d0ca711520Igor Murashkin
610a7a430a81b97b09f42b56ab85de24d0ca711520Igor Murashkin        return info.device_version;
620a7a430a81b97b09f42b56ab85de24d0ca711520Igor Murashkin    }
630a7a430a81b97b09f42b56ab85de24d0ca711520Igor Murashkin
64e9b0eaaec6ac6bc988a52b6ce61b87334dc71bfcIgor Murashkin    bool isDeviceVersionHal2(int cameraId, status_t* status) {
65e9b0eaaec6ac6bc988a52b6ce61b87334dc71bfcIgor Murashkin        return getDeviceVersion(cameraId, status)
66e9b0eaaec6ac6bc988a52b6ce61b87334dc71bfcIgor Murashkin               >= CAMERA_DEVICE_API_VERSION_2_0;
670a7a430a81b97b09f42b56ab85de24d0ca711520Igor Murashkin    }
68e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin};
69e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin
70eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor MurashkinTEST_F(CameraModuleTest, LoadModule) {
71e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin
72eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin    TEST_EXTENSION_FORKING_INIT;
73e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin
74e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin    for (int i = 0; i < mNumberOfCameras; ++i) {
75e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin        mDevice = new Camera2Device(i);
760a7a430a81b97b09f42b56ab85de24d0ca711520Igor Murashkin
770a7a430a81b97b09f42b56ab85de24d0ca711520Igor Murashkin        ASSERT_EQ(OK, initializeDevice(i))
78e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin            << "Failed to initialize device " << i;
79e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin        mDevice.clear();
80e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin    }
81e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin
82e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin}
83e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin
84eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor MurashkinTEST_F(CameraModuleTest, LoadModuleBadIndices) {
85e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin
86eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin    TEST_EXTENSION_FORKING_INIT;
87e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin
88e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin    int idx[] = { -1, mNumberOfCameras, mNumberOfCameras + 1 };
89e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin
90e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin    for (unsigned i = 0; i < sizeof(idx)/sizeof(idx[0]); ++i) {
91e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin        mDevice = new Camera2Device(idx[i]);
920a7a430a81b97b09f42b56ab85de24d0ca711520Igor Murashkin        status_t deviceInitializeCode = initializeDevice(idx[i]);
93e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin        EXPECT_NE(OK, deviceInitializeCode);
94e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin        EXPECT_EQ(-ENODEV, deviceInitializeCode)
95e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin            << "Incorrect error code when trying to initialize invalid index "
96e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin            << idx[i];
97e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin        mDevice.clear();
98e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin    }
99e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin}
100e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin
101eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor MurashkinTEST_F(CameraModuleTest, GetCameraInfo) {
102e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin
103eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin    TEST_EXTENSION_FORKING_INIT;
104e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin
105e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin    for (int i = 0; i < mNumberOfCameras; ++i) {
106e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin        struct camera_info info;
107e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin        ASSERT_EQ(OK, mModule->get_camera_info(i, &info));
108e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin    }
109e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin
110e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin}
111e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin
112eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor MurashkinTEST_F(CameraModuleTest, GetCameraInfoBadIndices) {
113e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin
114eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin    TEST_EXTENSION_FORKING_INIT;
115e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin
116e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin    int idx[] = { -1, mNumberOfCameras, mNumberOfCameras + 1 };
117e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin    for (unsigned i = 0; i < sizeof(idx)/sizeof(idx[0]); ++i) {
118e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin        struct camera_info info;
119e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin        EXPECT_NE(OK, mModule->get_camera_info(idx[i], &info));
120e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin        EXPECT_EQ(-ENODEV, mModule->get_camera_info(idx[i], &info))
121e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin            << "Incorrect error code for get_camera_info idx= "
122e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin            << idx[i];
123e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin    }
124e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin}
125e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin
126e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin/**
127e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin * TODO: Additional test to add: open two cameras at once.
128e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin *       (is allowed to fail, at least for now, but should not blow up)
129eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin *     - open same device multiple times
130eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin *     - close same device multiple times
131e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin */
132e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin
133e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin
134e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin
135e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin
136e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin}
137e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin}
138e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin}
139e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin
140