blob: 03fc2c2dbf4bd7cd4e5482c339da6f626e553ef9 [file] [log] [blame]
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +01001/*
2 * Copyright (C) 2023 The Android Open Source Project
3 *
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
35using ::aidl::android::hardware::camera::common::CameraDeviceStatus;
36using ::aidl::android::hardware::camera::common::Status;
37using ::aidl::android::hardware::camera::common::TorchModeStatus;
38using ::aidl::android::hardware::camera::provider::BnCameraProviderCallback;
39using ::testing::_;
40using ::testing::ElementsAre;
41using ::testing::Eq;
42using ::testing::IsEmpty;
43using ::testing::IsNull;
44using ::testing::MatchesRegex;
45using ::testing::Not;
46using ::testing::Return;
47
48constexpr char kVirtualCameraNameRegex[] =
49 "device@[0-9]+\\.[0-9]+/virtual/[0-9]+";
50
51class MockCameraProviderCallback : public BnCameraProviderCallback {
52 public:
53 MOCK_METHOD(ndk::ScopedAStatus, cameraDeviceStatusChange,
54 (const std::string&, CameraDeviceStatus), (override));
55 MOCK_METHOD(ndk::ScopedAStatus, torchModeStatusChange,
56 (const std::string&, TorchModeStatus), (override));
57 MOCK_METHOD(ndk::ScopedAStatus, physicalCameraDeviceStatusChange,
58 (const std::string&, const std::string&, CameraDeviceStatus),
59 (override));
60};
61
62class VirtualCameraProviderTest : public ::testing::Test {
63 public:
64 void SetUp() override {
65 mCameraProvider = ndk::SharedRefBase::make<VirtualCameraProvider>();
66 mMockCameraProviderCallback =
67 ndk::SharedRefBase::make<MockCameraProviderCallback>();
68 ON_CALL(*mMockCameraProviderCallback, cameraDeviceStatusChange)
69 .WillByDefault([](const std::string&, CameraDeviceStatus) {
70 return ndk::ScopedAStatus::ok();
71 });
72 }
73
74 protected:
75 std::shared_ptr<VirtualCameraProvider> mCameraProvider;
76 std::shared_ptr<MockCameraProviderCallback> mMockCameraProviderCallback =
77 ndk::SharedRefBase::make<MockCameraProviderCallback>();
78};
79
80TEST_F(VirtualCameraProviderTest, SetNullCameraCallbackFails) {
81 // Attempting to set callback to nullptr should fail.
82 EXPECT_FALSE(mCameraProvider->setCallback(nullptr).isOk());
83}
84
85TEST_F(VirtualCameraProviderTest, NoCamerasInitially) {
86 std::vector<std::string> cameras;
87
88 // Initially, the camera provider should return empty list
89 // of cameras.
90 ASSERT_TRUE(mCameraProvider->getCameraIdList(&cameras).isOk());
91 EXPECT_THAT(cameras, IsEmpty());
92}
93
94TEST_F(VirtualCameraProviderTest, CreateCamera) {
95 // When new camera is created, we expect
96 // cameraDeviceStatusChange to be called exactly once with
97 // PRESENT status.
98 EXPECT_CALL(*mMockCameraProviderCallback,
99 cameraDeviceStatusChange(_, CameraDeviceStatus::PRESENT))
100 .WillOnce(Return(ndk::ScopedAStatus::ok()));
101
102 ASSERT_TRUE(mCameraProvider->setCallback(mMockCameraProviderCallback).isOk());
103 std::shared_ptr<VirtualCameraDevice> camera = mCameraProvider->createCamera();
104 EXPECT_THAT(camera, Not(IsNull()));
105 EXPECT_THAT(camera->getCameraName(), MatchesRegex(kVirtualCameraNameRegex));
106
107 // Created camera should be in the list of cameras.
108 std::vector<std::string> cameraIds;
109 ASSERT_TRUE(mCameraProvider->getCameraIdList(&cameraIds).isOk());
110 EXPECT_THAT(cameraIds, ElementsAre(camera->getCameraName()));
111}
112
113TEST_F(VirtualCameraProviderTest, CreateCameraBeforeCallbackIsSet) {
114 // We expect cameraDeviceStatusChange to be invoked even when the
115 // setCallback configures the callback after camera is already created.
116 EXPECT_CALL(*mMockCameraProviderCallback,
117 cameraDeviceStatusChange(_, CameraDeviceStatus::PRESENT))
118 .WillOnce(Return(ndk::ScopedAStatus::ok()));
119
120 std::shared_ptr<VirtualCameraDevice> camera = mCameraProvider->createCamera();
121 ASSERT_TRUE(mCameraProvider->setCallback(mMockCameraProviderCallback).isOk());
122
123 // Created camera should be in the list of cameras.
124 std::vector<std::string> cameraIds;
125 EXPECT_TRUE(mCameraProvider->getCameraIdList(&cameraIds).isOk());
126 EXPECT_THAT(cameraIds, ElementsAre(camera->getCameraName()));
127}
128
129TEST_F(VirtualCameraProviderTest, RemoveCamera) {
130 ASSERT_TRUE(mCameraProvider->setCallback(mMockCameraProviderCallback).isOk());
131 std::shared_ptr<VirtualCameraDevice> camera = mCameraProvider->createCamera();
132
133 EXPECT_CALL(*mMockCameraProviderCallback,
134 cameraDeviceStatusChange(Eq(camera->getCameraName()),
135 CameraDeviceStatus::NOT_PRESENT))
136 .WillOnce(Return(ndk::ScopedAStatus::ok()));
137 EXPECT_TRUE(mCameraProvider->removeCamera(camera->getCameraName()));
138
139 // There are no cameras present after only camera is removed.
140 std::vector<std::string> cameraIds;
141 ASSERT_TRUE(mCameraProvider->getCameraIdList(&cameraIds).isOk());
142 EXPECT_THAT(cameraIds, IsEmpty());
143}
144
145TEST_F(VirtualCameraProviderTest, RemoveNonExistingCamera) {
146 ASSERT_TRUE(mCameraProvider->setCallback(mMockCameraProviderCallback).isOk());
147 std::shared_ptr<VirtualCameraDevice> camera = mCameraProvider->createCamera();
148
149 // Removing non-existing camera should fail.
150 const std::string cameraName = "DefinitelyNoTCamera";
151 EXPECT_FALSE(mCameraProvider->removeCamera(cameraName));
152
153 // Camera should be still present in the camera list.
154 std::vector<std::string> cameraIds;
155 ASSERT_TRUE(mCameraProvider->getCameraIdList(&cameraIds).isOk());
156 EXPECT_THAT(cameraIds, ElementsAre(camera->getCameraName()));
157}
158
159} // namespace
160} // namespace virtualcamera
161} // namespace companion
162} // namespace android