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]);
9660cbb52613d212236de49b4f22fe059585f8c1b2Zhijun He        status_t res =
9760cbb52613d212236de49b4f22fe059585f8c1b2Zhijun He                mModule->common.methods->open(
9860cbb52613d212236de49b4f22fe059585f8c1b2Zhijun He                                             &mModule->common,
9960cbb52613d212236de49b4f22fe059585f8c1b2Zhijun He                                             deviceName,
10060cbb52613d212236de49b4f22fe059585f8c1b2Zhijun He                                             &device);
10160cbb52613d212236de49b4f22fe059585f8c1b2Zhijun He        EXPECT_NE(OK, res);
10260cbb52613d212236de49b4f22fe059585f8c1b2Zhijun He        EXPECT_EQ(-ENODEV, res)
10360cbb52613d212236de49b4f22fe059585f8c1b2Zhijun He            << "Incorrect error code when trying to open camera with invalid id "
10460cbb52613d212236de49b4f22fe059585f8c1b2Zhijun He            << deviceName;
105e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin    }
106e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin}
107e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin
108eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor MurashkinTEST_F(CameraModuleTest, GetCameraInfo) {
109e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin
110eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin    TEST_EXTENSION_FORKING_INIT;
111e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin
112e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin    for (int i = 0; i < mNumberOfCameras; ++i) {
113e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin        struct camera_info info;
114e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin        ASSERT_EQ(OK, mModule->get_camera_info(i, &info));
115e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin    }
116e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin
117e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin}
118e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin
119eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor MurashkinTEST_F(CameraModuleTest, GetCameraInfoBadIndices) {
120e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin
121eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin    TEST_EXTENSION_FORKING_INIT;
122e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin
123e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin    int idx[] = { -1, mNumberOfCameras, mNumberOfCameras + 1 };
124e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin    for (unsigned i = 0; i < sizeof(idx)/sizeof(idx[0]); ++i) {
125e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin        struct camera_info info;
126e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin        EXPECT_NE(OK, mModule->get_camera_info(idx[i], &info));
127e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin        EXPECT_EQ(-ENODEV, mModule->get_camera_info(idx[i], &info))
128e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin            << "Incorrect error code for get_camera_info idx= "
129e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin            << idx[i];
130e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin    }
131e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin}
132e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin
133e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin/**
134e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin * TODO: Additional test to add: open two cameras at once.
135e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin *       (is allowed to fail, at least for now, but should not blow up)
136eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin *     - open same device multiple times
137eab33fc589a8e1ca04f5703b5f1ace69f8ff9aeaIgor Murashkin *     - close same device multiple times
138e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin */
139e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin
140e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin
141e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin
142e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin
143e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin}
144e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin}
145e302ee3dd3abacebeb32263654186ab433efc14cIgor Murashkin}
146