CameraModuleTests.cpp revision 48bb03fad356184c52607dfbae065511785e5eb4
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
67e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin    for (int i = 0; i < mNumberOfCameras; ++i) {
684c543a1456cd34a94e2c3a09879aa65ed8cd2f3aEino-Ville Talvala        CreateCamera(i, &mDevice);
690a7a430a81b97b09f42b56ab85de24d0ca711520Igor Murashkin        ASSERT_EQ(OK, initializeDevice(i))
70e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin            << "Failed to initialize device " << i;
71e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin        mDevice.clear();
72e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin    }
73e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin
74e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin}
75e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin
76eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor MurashkinTEST_F(CameraModuleTest, LoadModuleBadIndices) {
77e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin
78eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin    TEST_EXTENSION_FORKING_INIT;
79e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin
80e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin    int idx[] = { -1, mNumberOfCameras, mNumberOfCameras + 1 };
81e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin
82e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin    for (unsigned i = 0; i < sizeof(idx)/sizeof(idx[0]); ++i) {
834c543a1456cd34a94e2c3a09879aa65ed8cd2f3aEino-Ville Talvala        // Since the initialization should fail at device open(), it doesn't
844c543a1456cd34a94e2c3a09879aa65ed8cd2f3aEino-Ville Talvala        // matter which version of CameraNDevice is used here
85e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin        mDevice = new Camera2Device(idx[i]);
860a7a430a81b97b09f42b56ab85de24d0ca711520Igor Murashkin        status_t deviceInitializeCode = initializeDevice(idx[i]);
87e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin        EXPECT_NE(OK, deviceInitializeCode);
88e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin        EXPECT_EQ(-ENODEV, deviceInitializeCode)
89e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin            << "Incorrect error code when trying to initialize invalid index "
90e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin            << idx[i];
91e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin        mDevice.clear();
92e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin    }
93e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin}
94e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin
95eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor MurashkinTEST_F(CameraModuleTest, GetCameraInfo) {
96e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin
97eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin    TEST_EXTENSION_FORKING_INIT;
98e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin
99e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin    for (int i = 0; i < mNumberOfCameras; ++i) {
100e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin        struct camera_info info;
101e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin        ASSERT_EQ(OK, mModule->get_camera_info(i, &info));
102e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin    }
103e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin
104e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin}
105e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin
106eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor MurashkinTEST_F(CameraModuleTest, GetCameraInfoBadIndices) {
107e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin
108eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin    TEST_EXTENSION_FORKING_INIT;
109e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin
110e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin    int idx[] = { -1, mNumberOfCameras, mNumberOfCameras + 1 };
111e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin    for (unsigned i = 0; i < sizeof(idx)/sizeof(idx[0]); ++i) {
112e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin        struct camera_info info;
113e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin        EXPECT_NE(OK, mModule->get_camera_info(idx[i], &info));
114e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin        EXPECT_EQ(-ENODEV, mModule->get_camera_info(idx[i], &info))
115e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin            << "Incorrect error code for get_camera_info idx= "
116e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin            << idx[i];
117e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin    }
118e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin}
119e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin
120e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin/**
121e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin * TODO: Additional test to add: open two cameras at once.
122e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin *       (is allowed to fail, at least for now, but should not blow up)
123eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin *     - open same device multiple times
124eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin *     - close same device multiple times
125e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin */
126e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin
127e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin
128e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin
129e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin
130e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin}
131e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin}
132e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin}
133