blob: 89e2f146051109d5ac8629e93a55efaa7c989f5b [file] [log] [blame]
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +01001/*
Biswarup Pal6152a302023-12-19 12:44:09 +00002 * Copyright 2023 The Android Open Source Project
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +01003 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <memory>
18
19#include "VirtualCameraProvider.h"
20#include "aidl/android/hardware/camera/common/CameraDeviceStatus.h"
21#include "aidl/android/hardware/camera/common/Status.h"
22#include "aidl/android/hardware/camera/common/TorchModeStatus.h"
23#include "aidl/android/hardware/camera/provider/BnCameraProviderCallback.h"
24#include "android/binder_auto_utils.h"
25#include "android/binder_interface_utils.h"
26#include "gmock/gmock.h"
27#include "gtest/gtest.h"
28#include "util/Util.h"
29
30namespace android {
31namespace companion {
32namespace virtualcamera {
33namespace {
34
Jan Sebechlebsky3b478c42023-11-23 13:15:56 +010035using ::aidl::android::companion::virtualcamera::Format;
Biswarup Pal6152a302023-12-19 12:44:09 +000036using ::aidl::android::companion::virtualcamera::SensorOrientation;
Jan Sebechlebsky3b478c42023-11-23 13:15:56 +010037using ::aidl::android::companion::virtualcamera::SupportedStreamConfiguration;
Biswarup Pal6152a302023-12-19 12:44:09 +000038using ::aidl::android::companion::virtualcamera::VirtualCameraConfiguration;
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +010039using ::aidl::android::hardware::camera::common::CameraDeviceStatus;
40using ::aidl::android::hardware::camera::common::Status;
41using ::aidl::android::hardware::camera::common::TorchModeStatus;
42using ::aidl::android::hardware::camera::provider::BnCameraProviderCallback;
43using ::testing::_;
44using ::testing::ElementsAre;
45using ::testing::Eq;
46using ::testing::IsEmpty;
47using ::testing::IsNull;
48using ::testing::MatchesRegex;
49using ::testing::Not;
50using ::testing::Return;
51
Jan Sebechlebsky3b478c42023-11-23 13:15:56 +010052constexpr int kVgaWidth = 640;
53constexpr int kVgaHeight = 480;
Biswarup Pal6152a302023-12-19 12:44:09 +000054constexpr int kMaxFps = 30;
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +010055constexpr char kVirtualCameraNameRegex[] =
56 "device@[0-9]+\\.[0-9]+/virtual/[0-9]+";
57
58class MockCameraProviderCallback : public BnCameraProviderCallback {
59 public:
60 MOCK_METHOD(ndk::ScopedAStatus, cameraDeviceStatusChange,
61 (const std::string&, CameraDeviceStatus), (override));
62 MOCK_METHOD(ndk::ScopedAStatus, torchModeStatusChange,
63 (const std::string&, TorchModeStatus), (override));
64 MOCK_METHOD(ndk::ScopedAStatus, physicalCameraDeviceStatusChange,
65 (const std::string&, const std::string&, CameraDeviceStatus),
66 (override));
67};
68
69class VirtualCameraProviderTest : public ::testing::Test {
70 public:
71 void SetUp() override {
72 mCameraProvider = ndk::SharedRefBase::make<VirtualCameraProvider>();
73 mMockCameraProviderCallback =
74 ndk::SharedRefBase::make<MockCameraProviderCallback>();
75 ON_CALL(*mMockCameraProviderCallback, cameraDeviceStatusChange)
76 .WillByDefault([](const std::string&, CameraDeviceStatus) {
77 return ndk::ScopedAStatus::ok();
78 });
79 }
80
81 protected:
82 std::shared_ptr<VirtualCameraProvider> mCameraProvider;
83 std::shared_ptr<MockCameraProviderCallback> mMockCameraProviderCallback =
84 ndk::SharedRefBase::make<MockCameraProviderCallback>();
Biswarup Pal6152a302023-12-19 12:44:09 +000085 VirtualCameraConfiguration mInputConfig = VirtualCameraConfiguration{
86 .supportedStreamConfigs = {SupportedStreamConfiguration{
87 .width = kVgaWidth,
88 .height = kVgaHeight,
89 .pixelFormat = Format::YUV_420_888,
90 .maxFps = kMaxFps}},
91 .virtualCameraCallback = nullptr,
92 .sensorOrientation = SensorOrientation::ORIENTATION_0};
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +010093};
94
95TEST_F(VirtualCameraProviderTest, SetNullCameraCallbackFails) {
96 // Attempting to set callback to nullptr should fail.
97 EXPECT_FALSE(mCameraProvider->setCallback(nullptr).isOk());
98}
99
100TEST_F(VirtualCameraProviderTest, NoCamerasInitially) {
101 std::vector<std::string> cameras;
102
103 // Initially, the camera provider should return empty list
104 // of cameras.
105 ASSERT_TRUE(mCameraProvider->getCameraIdList(&cameras).isOk());
106 EXPECT_THAT(cameras, IsEmpty());
107}
108
109TEST_F(VirtualCameraProviderTest, CreateCamera) {
110 // When new camera is created, we expect
111 // cameraDeviceStatusChange to be called exactly once with
112 // PRESENT status.
113 EXPECT_CALL(*mMockCameraProviderCallback,
114 cameraDeviceStatusChange(_, CameraDeviceStatus::PRESENT))
115 .WillOnce(Return(ndk::ScopedAStatus::ok()));
116
117 ASSERT_TRUE(mCameraProvider->setCallback(mMockCameraProviderCallback).isOk());
Jan Sebechlebsky3b478c42023-11-23 13:15:56 +0100118 std::shared_ptr<VirtualCameraDevice> camera =
Biswarup Pal6152a302023-12-19 12:44:09 +0000119 mCameraProvider->createCamera(mInputConfig);
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100120 EXPECT_THAT(camera, Not(IsNull()));
121 EXPECT_THAT(camera->getCameraName(), MatchesRegex(kVirtualCameraNameRegex));
122
123 // Created camera should be in the list of cameras.
124 std::vector<std::string> cameraIds;
125 ASSERT_TRUE(mCameraProvider->getCameraIdList(&cameraIds).isOk());
126 EXPECT_THAT(cameraIds, ElementsAre(camera->getCameraName()));
127}
128
129TEST_F(VirtualCameraProviderTest, CreateCameraBeforeCallbackIsSet) {
130 // We expect cameraDeviceStatusChange to be invoked even when the
131 // setCallback configures the callback after camera is already created.
132 EXPECT_CALL(*mMockCameraProviderCallback,
133 cameraDeviceStatusChange(_, CameraDeviceStatus::PRESENT))
134 .WillOnce(Return(ndk::ScopedAStatus::ok()));
135
Jan Sebechlebsky3b478c42023-11-23 13:15:56 +0100136 std::shared_ptr<VirtualCameraDevice> camera =
Biswarup Pal6152a302023-12-19 12:44:09 +0000137 mCameraProvider->createCamera(mInputConfig);
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100138 ASSERT_TRUE(mCameraProvider->setCallback(mMockCameraProviderCallback).isOk());
139
140 // Created camera should be in the list of cameras.
141 std::vector<std::string> cameraIds;
142 EXPECT_TRUE(mCameraProvider->getCameraIdList(&cameraIds).isOk());
143 EXPECT_THAT(cameraIds, ElementsAre(camera->getCameraName()));
144}
145
146TEST_F(VirtualCameraProviderTest, RemoveCamera) {
147 ASSERT_TRUE(mCameraProvider->setCallback(mMockCameraProviderCallback).isOk());
Jan Sebechlebsky3b478c42023-11-23 13:15:56 +0100148 std::shared_ptr<VirtualCameraDevice> camera =
Biswarup Pal6152a302023-12-19 12:44:09 +0000149 mCameraProvider->createCamera(mInputConfig);
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100150
151 EXPECT_CALL(*mMockCameraProviderCallback,
152 cameraDeviceStatusChange(Eq(camera->getCameraName()),
153 CameraDeviceStatus::NOT_PRESENT))
154 .WillOnce(Return(ndk::ScopedAStatus::ok()));
155 EXPECT_TRUE(mCameraProvider->removeCamera(camera->getCameraName()));
156
157 // There are no cameras present after only camera is removed.
158 std::vector<std::string> cameraIds;
159 ASSERT_TRUE(mCameraProvider->getCameraIdList(&cameraIds).isOk());
160 EXPECT_THAT(cameraIds, IsEmpty());
161}
162
163TEST_F(VirtualCameraProviderTest, RemoveNonExistingCamera) {
164 ASSERT_TRUE(mCameraProvider->setCallback(mMockCameraProviderCallback).isOk());
Jan Sebechlebsky3b478c42023-11-23 13:15:56 +0100165 std::shared_ptr<VirtualCameraDevice> camera =
Biswarup Pal6152a302023-12-19 12:44:09 +0000166 mCameraProvider->createCamera(mInputConfig);
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100167
168 // Removing non-existing camera should fail.
169 const std::string cameraName = "DefinitelyNoTCamera";
170 EXPECT_FALSE(mCameraProvider->removeCamera(cameraName));
171
172 // Camera should be still present in the camera list.
173 std::vector<std::string> cameraIds;
174 ASSERT_TRUE(mCameraProvider->getCameraIdList(&cameraIds).isOk());
175 EXPECT_THAT(cameraIds, ElementsAre(camera->getCameraName()));
176}
177
178} // namespace
179} // namespace virtualcamera
180} // namespace companion
181} // namespace android