blob: 719f64d53b9dab609bcbf117a22b0dd5fc9d5619 [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
Jan Sebechlebsky685ba1e2024-03-25 10:33:09 +010017#include <algorithm>
Jan Sebechlebsky288900f2024-05-24 14:47:54 +020018#include <cstdint>
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +010019#include <cstdio>
Jan Sebechlebsky685ba1e2024-03-25 10:33:09 +010020#include <iterator>
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +010021#include <memory>
Vadim Caen39100152024-06-11 15:24:15 +020022#include <optional>
Jan Sebechlebsky685ba1e2024-03-25 10:33:09 +010023#include <regex>
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +010024
25#include "VirtualCameraService.h"
26#include "aidl/android/companion/virtualcamera/BnVirtualCameraCallback.h"
27#include "aidl/android/companion/virtualcamera/VirtualCameraConfiguration.h"
28#include "aidl/android/hardware/camera/provider/BnCameraProviderCallback.h"
29#include "aidl/android/hardware/graphics/common/PixelFormat.h"
30#include "android/binder_auto_utils.h"
31#include "android/binder_interface_utils.h"
32#include "android/binder_libbinder.h"
33#include "android/binder_status.h"
34#include "binder/Binder.h"
35#include "gmock/gmock.h"
36#include "gtest/gtest.h"
Jan Sebechlebsky773c0142024-03-25 12:17:05 +010037#include "util/MetadataUtil.h"
Jan Sebechlebskyde6f16f2023-11-29 09:27:36 +010038#include "util/Permissions.h"
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +010039#include "utils/Errors.h"
40
41namespace android {
42namespace companion {
43namespace virtualcamera {
44namespace {
45
46using ::aidl::android::companion::virtualcamera::BnVirtualCameraCallback;
Jan Sebechlebsky3b478c42023-11-23 13:15:56 +010047using ::aidl::android::companion::virtualcamera::Format;
Biswarup Pal112458f2023-12-28 19:50:17 +000048using ::aidl::android::companion::virtualcamera::LensFacing;
Biswarup Pal6152a302023-12-19 12:44:09 +000049using ::aidl::android::companion::virtualcamera::SensorOrientation;
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +010050using ::aidl::android::companion::virtualcamera::VirtualCameraConfiguration;
51using ::aidl::android::hardware::camera::common::CameraDeviceStatus;
52using ::aidl::android::hardware::camera::common::TorchModeStatus;
Jan Sebechlebsky773c0142024-03-25 12:17:05 +010053using ::aidl::android::hardware::camera::device::CameraMetadata;
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +010054using ::aidl::android::hardware::camera::provider::BnCameraProviderCallback;
55using ::aidl::android::hardware::graphics::common::PixelFormat;
56using ::aidl::android::view::Surface;
57using ::testing::_;
Jan Sebechlebsky685ba1e2024-03-25 10:33:09 +010058using ::testing::ElementsAre;
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +010059using ::testing::Eq;
60using ::testing::Ge;
61using ::testing::IsEmpty;
62using ::testing::IsNull;
63using ::testing::Not;
Jan Sebechlebsky773c0142024-03-25 12:17:05 +010064using ::testing::Optional;
Jan Sebechlebskyde6f16f2023-11-29 09:27:36 +010065using ::testing::Return;
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +010066using ::testing::SizeIs;
67
Jan Sebechlebsky3b478c42023-11-23 13:15:56 +010068constexpr int kVgaWidth = 640;
69constexpr int kVgaHeight = 480;
Biswarup Pal6152a302023-12-19 12:44:09 +000070constexpr int kMaxFps = 30;
Biswarup Pal112458f2023-12-28 19:50:17 +000071constexpr SensorOrientation kSensorOrientation =
72 SensorOrientation::ORIENTATION_0;
73constexpr LensFacing kLensFacing = LensFacing::FRONT;
Biswarup Pal37a75182024-01-16 15:53:35 +000074constexpr int kDefaultDeviceId = 0;
Jan Sebechlebskyde6f16f2023-11-29 09:27:36 +010075constexpr char kCreateVirtualDevicePermissions[] =
76 "android.permission.CREATE_VIRTUAL_DEVICE";
Jan Sebechlebsky3b478c42023-11-23 13:15:56 +010077
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +010078const VirtualCameraConfiguration kEmptyVirtualCameraConfiguration;
79
Jan Sebechlebsky288900f2024-05-24 14:47:54 +020080class MockVirtualCameraCallback : public BnVirtualCameraCallback {
81 public:
82 MOCK_METHOD(ndk::ScopedAStatus, onStreamConfigured,
83 (int32_t, const ::aidl::android::view::Surface&, int, int,
84 ::aidl::android::companion::virtualcamera::Format pixelFormat),
85 (override));
86 MOCK_METHOD(ndk::ScopedAStatus, onProcessCaptureRequest, (int32_t, int32_t),
87 (override));
88 MOCK_METHOD(ndk::ScopedAStatus, onStreamClosed, (int32_t), (override));
89};
90
Biswarup Pal112458f2023-12-28 19:50:17 +000091VirtualCameraConfiguration createConfiguration(const int width, const int height,
92 const Format format,
93 const int maxFps) {
Jan Sebechlebsky3b478c42023-11-23 13:15:56 +010094 VirtualCameraConfiguration configuration;
Biswarup Pal6152a302023-12-19 12:44:09 +000095 configuration.supportedStreamConfigs.push_back({.width = width,
96 .height = height,
97 .pixelFormat = format,
98 .maxFps = maxFps});
Biswarup Pal112458f2023-12-28 19:50:17 +000099 configuration.sensorOrientation = kSensorOrientation;
100 configuration.lensFacing = kLensFacing;
Jan Sebechlebsky288900f2024-05-24 14:47:54 +0200101 configuration.virtualCameraCallback =
102 ndk::SharedRefBase::make<MockVirtualCameraCallback>();
Jan Sebechlebsky3b478c42023-11-23 13:15:56 +0100103 return configuration;
104}
105
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100106class MockCameraProviderCallback : public BnCameraProviderCallback {
107 public:
108 MOCK_METHOD(ndk::ScopedAStatus, cameraDeviceStatusChange,
109 (const std::string&, CameraDeviceStatus), (override));
110 MOCK_METHOD(ndk::ScopedAStatus, torchModeStatusChange,
111 (const std::string&, TorchModeStatus), (override));
112 MOCK_METHOD(ndk::ScopedAStatus, physicalCameraDeviceStatusChange,
113 (const std::string&, const std::string&, CameraDeviceStatus),
114 (override));
115};
116
Jan Sebechlebskyde6f16f2023-11-29 09:27:36 +0100117class MockPermissionsProxy : public PermissionsProxy {
118 public:
119 MOCK_METHOD(bool, checkCallingPermission, (const std::string&),
120 (const override));
121};
122
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100123class VirtualCameraServiceTest : public ::testing::Test {
124 public:
125 void SetUp() override {
126 mCameraProvider = ndk::SharedRefBase::make<VirtualCameraProvider>();
127 mMockCameraProviderCallback =
128 ndk::SharedRefBase::make<MockCameraProviderCallback>();
129 ON_CALL(*mMockCameraProviderCallback, cameraDeviceStatusChange)
130 .WillByDefault([](const std::string&, CameraDeviceStatus) {
131 return ndk::ScopedAStatus::ok();
132 });
133 mCameraProvider->setCallback(mMockCameraProviderCallback);
Jan Sebechlebskyde6f16f2023-11-29 09:27:36 +0100134 mCameraService = ndk::SharedRefBase::make<VirtualCameraService>(
135 mCameraProvider, mMockPermissionsProxy);
Jan Sebechlebskyb36090e2024-04-11 09:19:33 +0200136 mCameraService->disableEglVerificationForTest();
Jan Sebechlebskyde6f16f2023-11-29 09:27:36 +0100137
138 ON_CALL(mMockPermissionsProxy, checkCallingPermission)
139 .WillByDefault(Return(true));
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100140
141 mDevNullFd = open("/dev/null", O_RDWR);
142 ASSERT_THAT(mDevNullFd, Ge(0));
143 }
144
145 void createCamera() {
146 mOwnerToken = sp<BBinder>::make();
147 mNdkOwnerToken.set(AIBinder_fromPlatformBinder(mOwnerToken));
148 bool aidlRet;
149
150 ASSERT_TRUE(mCameraService
Biswarup Pal37a75182024-01-16 15:53:35 +0000151 ->registerCamera(mNdkOwnerToken, mVgaYUV420OnlyConfiguration,
152 kDefaultDeviceId, &aidlRet)
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100153 .isOk());
154 ASSERT_TRUE(aidlRet);
155 }
156
157 void TearDown() override {
158 close(mDevNullFd);
159 }
160
Jan Sebechlebsky773c0142024-03-25 12:17:05 +0100161 binder_status_t execute_shell_command(const std::string& cmd) {
Jan Sebechlebsky685ba1e2024-03-25 10:33:09 +0100162 const static std::regex whitespaceRegex("\\s+");
163 std::vector<std::string> tokens;
164 std::copy_if(
165 std::sregex_token_iterator(cmd.begin(), cmd.end(), whitespaceRegex, -1),
166 std::sregex_token_iterator(), std::back_inserter(tokens),
167 [](const std::string& token) { return !token.empty(); });
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100168
Jan Sebechlebsky685ba1e2024-03-25 10:33:09 +0100169 std::vector<const char*> argv;
170 argv.reserve(tokens.size());
171 std::transform(tokens.begin(), tokens.end(), std::back_inserter(argv),
172 [](const std::string& str) { return str.c_str(); });
173
Jan Sebechlebsky773c0142024-03-25 12:17:05 +0100174 return mCameraService->handleShellCommand(
175 mDevNullFd, mDevNullFd, mDevNullFd, argv.data(), argv.size());
Marvin Ramina8196132024-03-15 15:55:22 +0000176 }
177
Jan Sebechlebsky3b478c42023-11-23 13:15:56 +0100178 std::vector<std::string> getCameraIds() {
179 std::vector<std::string> cameraIds;
180 EXPECT_TRUE(mCameraProvider->getCameraIdList(&cameraIds).isOk());
181 return cameraIds;
182 }
183
Jan Sebechlebsky773c0142024-03-25 12:17:05 +0100184 std::optional<camera_metadata_enum_android_lens_facing> getCameraLensFacing(
185 const std::string& id) {
186 std::shared_ptr<VirtualCameraDevice> camera = mCameraProvider->getCamera(id);
187 if (camera == nullptr) {
188 return std::nullopt;
189 }
190 CameraMetadata metadata;
191 camera->getCameraCharacteristics(&metadata);
192 return getLensFacing(metadata);
193 }
194
Vadim Caen39100152024-06-11 15:24:15 +0200195 std::optional<int32_t> getCameraSensorOrienation(const std::string& id) {
196 std::shared_ptr<VirtualCameraDevice> camera = mCameraProvider->getCamera(id);
197 if (camera == nullptr) {
198 return std::nullopt;
199 }
200 CameraMetadata metadata;
201 camera->getCameraCharacteristics(&metadata);
202 return getSensorOrientation(metadata);
203 }
204
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100205 protected:
206 std::shared_ptr<VirtualCameraService> mCameraService;
207 std::shared_ptr<VirtualCameraProvider> mCameraProvider;
208 std::shared_ptr<MockCameraProviderCallback> mMockCameraProviderCallback =
209 ndk::SharedRefBase::make<MockCameraProviderCallback>();
Jan Sebechlebskyde6f16f2023-11-29 09:27:36 +0100210 MockPermissionsProxy mMockPermissionsProxy;
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100211
212 sp<BBinder> mOwnerToken;
213 ndk::SpAIBinder mNdkOwnerToken;
214
215 int mDevNullFd;
Jan Sebechlebsky3b478c42023-11-23 13:15:56 +0100216
217 VirtualCameraConfiguration mVgaYUV420OnlyConfiguration =
Biswarup Pal112458f2023-12-28 19:50:17 +0000218 createConfiguration(kVgaWidth, kVgaHeight, Format::YUV_420_888, kMaxFps);
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100219};
220
Jan Sebechlebsky042d1fb2023-12-12 16:37:00 +0100221TEST_F(VirtualCameraServiceTest, RegisterCameraWithYuvInputSucceeds) {
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100222 sp<BBinder> token = sp<BBinder>::make();
223 ndk::SpAIBinder ndkToken(AIBinder_fromPlatformBinder(token));
224 bool aidlRet;
225
Biswarup Pal37a75182024-01-16 15:53:35 +0000226 ASSERT_TRUE(mCameraService
227 ->registerCamera(ndkToken, mVgaYUV420OnlyConfiguration,
228 kDefaultDeviceId, &aidlRet)
229 .isOk());
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100230
231 EXPECT_TRUE(aidlRet);
Jan Sebechlebsky3b478c42023-11-23 13:15:56 +0100232 EXPECT_THAT(getCameraIds(), SizeIs(1));
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100233}
234
Jan Sebechlebsky042d1fb2023-12-12 16:37:00 +0100235TEST_F(VirtualCameraServiceTest, RegisterCameraWithRgbaInputSucceeds) {
236 sp<BBinder> token = sp<BBinder>::make();
237 ndk::SpAIBinder ndkToken(AIBinder_fromPlatformBinder(token));
238 bool aidlRet;
239
240 VirtualCameraConfiguration config =
Biswarup Pal112458f2023-12-28 19:50:17 +0000241 createConfiguration(kVgaWidth, kVgaHeight, Format::RGBA_8888, kMaxFps);
Jan Sebechlebsky042d1fb2023-12-12 16:37:00 +0100242
Biswarup Pal37a75182024-01-16 15:53:35 +0000243 ASSERT_TRUE(mCameraService
244 ->registerCamera(ndkToken, config, kDefaultDeviceId, &aidlRet)
245 .isOk());
Jan Sebechlebsky042d1fb2023-12-12 16:37:00 +0100246
247 EXPECT_TRUE(aidlRet);
248 EXPECT_THAT(getCameraIds(), SizeIs(1));
249}
250
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100251TEST_F(VirtualCameraServiceTest, RegisterCameraTwiceSecondReturnsFalse) {
252 createCamera();
253 bool aidlRet;
254
255 ASSERT_TRUE(mCameraService
Jan Sebechlebsky3b478c42023-11-23 13:15:56 +0100256 ->registerCamera(mNdkOwnerToken, mVgaYUV420OnlyConfiguration,
Biswarup Pal37a75182024-01-16 15:53:35 +0000257 kDefaultDeviceId, &aidlRet)
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100258 .isOk());
259 EXPECT_FALSE(aidlRet);
Jan Sebechlebsky3b478c42023-11-23 13:15:56 +0100260 EXPECT_THAT(getCameraIds(), SizeIs(1));
261}
262
263TEST_F(VirtualCameraServiceTest, EmptyConfigurationFails) {
264 bool aidlRet;
265
266 ASSERT_FALSE(mCameraService
267 ->registerCamera(mNdkOwnerToken,
Biswarup Pal37a75182024-01-16 15:53:35 +0000268 kEmptyVirtualCameraConfiguration,
269 kDefaultDeviceId, &aidlRet)
Jan Sebechlebsky3b478c42023-11-23 13:15:56 +0100270 .isOk());
271 EXPECT_FALSE(aidlRet);
272 EXPECT_THAT(getCameraIds(), IsEmpty());
273}
274
Jan Sebechlebsky288900f2024-05-24 14:47:54 +0200275TEST_F(VirtualCameraServiceTest,
276 ConfigurationWithoutVirtualCameraCallbackFails) {
277 sp<BBinder> token = sp<BBinder>::make();
278 ndk::SpAIBinder ndkToken(AIBinder_fromPlatformBinder(token));
279 bool aidlRet;
280
281 VirtualCameraConfiguration config =
282 createConfiguration(kVgaWidth, kVgaHeight, Format::RGBA_8888, kMaxFps);
283 config.virtualCameraCallback = nullptr;
284
285 ASSERT_FALSE(mCameraService
286 ->registerCamera(ndkToken, config, kDefaultDeviceId, &aidlRet)
287 .isOk());
288
289 EXPECT_FALSE(aidlRet);
290 EXPECT_THAT(getCameraIds(), IsEmpty());
291}
292
Jan Sebechlebsky3b478c42023-11-23 13:15:56 +0100293TEST_F(VirtualCameraServiceTest, ConfigurationWithUnsupportedPixelFormatFails) {
294 bool aidlRet;
295
296 VirtualCameraConfiguration config =
Biswarup Pal112458f2023-12-28 19:50:17 +0000297 createConfiguration(kVgaWidth, kVgaHeight, Format::UNKNOWN, kMaxFps);
Jan Sebechlebsky3b478c42023-11-23 13:15:56 +0100298
299 ASSERT_FALSE(
Biswarup Pal37a75182024-01-16 15:53:35 +0000300 mCameraService
301 ->registerCamera(mNdkOwnerToken, config, kDefaultDeviceId, &aidlRet)
302 .isOk());
Jan Sebechlebsky3b478c42023-11-23 13:15:56 +0100303 EXPECT_FALSE(aidlRet);
304 EXPECT_THAT(getCameraIds(), IsEmpty());
305}
306
307TEST_F(VirtualCameraServiceTest, ConfigurationWithTooHighResFails) {
308 bool aidlRet;
309 VirtualCameraConfiguration config =
Biswarup Pal112458f2023-12-28 19:50:17 +0000310 createConfiguration(1000000, 1000000, Format::YUV_420_888, kMaxFps);
Jan Sebechlebsky3b478c42023-11-23 13:15:56 +0100311
312 ASSERT_FALSE(
Biswarup Pal37a75182024-01-16 15:53:35 +0000313 mCameraService
314 ->registerCamera(mNdkOwnerToken, config, kDefaultDeviceId, &aidlRet)
315 .isOk());
Jan Sebechlebsky3b478c42023-11-23 13:15:56 +0100316 EXPECT_FALSE(aidlRet);
317 EXPECT_THAT(getCameraIds(), IsEmpty());
318}
319
Jan Sebechlebsky3b478c42023-11-23 13:15:56 +0100320TEST_F(VirtualCameraServiceTest, ConfigurationWithNegativeResolutionFails) {
321 bool aidlRet;
322 VirtualCameraConfiguration config =
Biswarup Pal112458f2023-12-28 19:50:17 +0000323 createConfiguration(-1, kVgaHeight, Format::YUV_420_888, kMaxFps);
Biswarup Pal6152a302023-12-19 12:44:09 +0000324
325 ASSERT_FALSE(
Biswarup Pal37a75182024-01-16 15:53:35 +0000326 mCameraService
327 ->registerCamera(mNdkOwnerToken, config, kDefaultDeviceId, &aidlRet)
328 .isOk());
Biswarup Pal6152a302023-12-19 12:44:09 +0000329 EXPECT_FALSE(aidlRet);
330 EXPECT_THAT(getCameraIds(), IsEmpty());
331}
332
333TEST_F(VirtualCameraServiceTest, ConfigurationWithTooLowMaxFpsFails) {
334 bool aidlRet;
335 VirtualCameraConfiguration config =
Biswarup Pal112458f2023-12-28 19:50:17 +0000336 createConfiguration(kVgaWidth, kVgaHeight, Format::YUV_420_888, 0);
Biswarup Pal6152a302023-12-19 12:44:09 +0000337
338 ASSERT_FALSE(
Biswarup Pal37a75182024-01-16 15:53:35 +0000339 mCameraService
340 ->registerCamera(mNdkOwnerToken, config, kDefaultDeviceId, &aidlRet)
341 .isOk());
Biswarup Pal6152a302023-12-19 12:44:09 +0000342 EXPECT_FALSE(aidlRet);
343 EXPECT_THAT(getCameraIds(), IsEmpty());
344}
345
346TEST_F(VirtualCameraServiceTest, ConfigurationWithTooHighMaxFpsFails) {
347 bool aidlRet;
348 VirtualCameraConfiguration config =
Biswarup Pal112458f2023-12-28 19:50:17 +0000349 createConfiguration(kVgaWidth, kVgaHeight, Format::YUV_420_888, 90);
Jan Sebechlebsky3b478c42023-11-23 13:15:56 +0100350
351 ASSERT_FALSE(
Biswarup Pal37a75182024-01-16 15:53:35 +0000352 mCameraService
353 ->registerCamera(mNdkOwnerToken, config, kDefaultDeviceId, &aidlRet)
354 .isOk());
Jan Sebechlebsky3b478c42023-11-23 13:15:56 +0100355 EXPECT_FALSE(aidlRet);
356 EXPECT_THAT(getCameraIds(), IsEmpty());
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100357}
358
359TEST_F(VirtualCameraServiceTest, GetCamera) {
360 createCamera();
361
362 EXPECT_THAT(mCameraService->getCamera(mNdkOwnerToken), Not(IsNull()));
363
364 sp<BBinder> otherToken = sp<BBinder>::make();
365 EXPECT_THAT(mCameraService->getCamera(
366 ndk::SpAIBinder(AIBinder_fromPlatformBinder(otherToken))),
367 IsNull());
368}
369
370TEST_F(VirtualCameraServiceTest, UnregisterCamera) {
371 createCamera();
372
373 EXPECT_THAT(mCameraService->getCamera(mNdkOwnerToken), Not(IsNull()));
374
375 mCameraService->unregisterCamera(mNdkOwnerToken);
376
377 EXPECT_THAT(mCameraService->getCamera(mNdkOwnerToken), IsNull());
378}
379
Jan Sebechlebskyde6f16f2023-11-29 09:27:36 +0100380TEST_F(VirtualCameraServiceTest, RegisterCameraWithoutPermissionFails) {
381 bool aidlRet;
382 EXPECT_CALL(mMockPermissionsProxy,
383 checkCallingPermission(kCreateVirtualDevicePermissions))
384 .WillOnce(Return(false));
385
386 EXPECT_THAT(mCameraService
387 ->registerCamera(mNdkOwnerToken, mVgaYUV420OnlyConfiguration,
Biswarup Pal37a75182024-01-16 15:53:35 +0000388 kDefaultDeviceId, &aidlRet)
Jan Sebechlebskyde6f16f2023-11-29 09:27:36 +0100389 .getExceptionCode(),
390 Eq(EX_SECURITY));
391}
392
393TEST_F(VirtualCameraServiceTest, UnregisterCameraWithoutPermissionFails) {
394 EXPECT_CALL(mMockPermissionsProxy,
395 checkCallingPermission(kCreateVirtualDevicePermissions))
396 .WillOnce(Return(false));
397
398 EXPECT_THAT(
399 mCameraService->unregisterCamera(mNdkOwnerToken).getExceptionCode(),
400 Eq(EX_SECURITY));
401}
402
403TEST_F(VirtualCameraServiceTest, GetIdWithoutPermissionFails) {
Biswarup Pal15dcd132024-06-02 14:02:03 +0000404 std::string aidlRet;
Jan Sebechlebskyde6f16f2023-11-29 09:27:36 +0100405 EXPECT_CALL(mMockPermissionsProxy,
406 checkCallingPermission(kCreateVirtualDevicePermissions))
407 .WillOnce(Return(false));
408
409 EXPECT_THAT(
410 mCameraService->getCameraId(mNdkOwnerToken, &aidlRet).getExceptionCode(),
411 Eq(EX_SECURITY));
412}
413
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100414TEST_F(VirtualCameraServiceTest, UnregisterCameraWithUnknownToken) {
415 createCamera();
416
417 EXPECT_THAT(mCameraService->getCamera(mNdkOwnerToken), Not(IsNull()));
418
419 auto otherToken = sp<BBinder>::make();
420 ndk::SpAIBinder ndkOtherToken(AIBinder_fromPlatformBinder(otherToken));
421 mCameraService->unregisterCamera(ndkOtherToken);
422
423 EXPECT_THAT(mCameraService->getCamera(mNdkOwnerToken), Not(IsNull()));
424}
425
426TEST_F(VirtualCameraServiceTest, ShellCmdWithNullArgs) {
427 EXPECT_EQ(mCameraService->handleShellCommand(
428 /*in=*/mDevNullFd, /*out=*/mDevNullFd, /*err=*/mDevNullFd,
429 /*args=*/nullptr, /*numArgs=*/1),
430 STATUS_BAD_VALUE);
431
432 std::array<const char*, 1> args{nullptr};
433 EXPECT_EQ(mCameraService->handleShellCommand(
434 /*in=*/mDevNullFd, /*out=*/mDevNullFd, /*err=*/mDevNullFd,
435 args.data(), /*numArgs=*/1),
436 STATUS_BAD_VALUE);
437}
438
Jan Sebechlebsky76d7e212023-11-28 14:10:25 +0100439TEST_F(VirtualCameraServiceTest, ShellCmdWithNoArgs) {
440 EXPECT_EQ(mCameraService->handleShellCommand(
441 /*in=*/mDevNullFd, /*out=*/mDevNullFd, /*err=*/mDevNullFd,
442 /*args=*/nullptr, /*numArgs=*/0),
443 STATUS_OK);
444}
445
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100446TEST_F(VirtualCameraServiceTest, TestCameraShellCmd) {
Jan Sebechlebsky773c0142024-03-25 12:17:05 +0100447 EXPECT_THAT(execute_shell_command("enable_test_camera"), Eq(NO_ERROR));
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100448
Jan Sebechlebsky3b478c42023-11-23 13:15:56 +0100449 std::vector<std::string> cameraIdsAfterEnable = getCameraIds();
450 EXPECT_THAT(cameraIdsAfterEnable, SizeIs(1));
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100451
Jan Sebechlebsky773c0142024-03-25 12:17:05 +0100452 EXPECT_THAT(execute_shell_command("disable_test_camera"), Eq(NO_ERROR));
Jan Sebechlebsky3b478c42023-11-23 13:15:56 +0100453
454 std::vector<std::string> cameraIdsAfterDisable = getCameraIds();
455 EXPECT_THAT(cameraIdsAfterDisable, IsEmpty());
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100456}
457
Marvin Ramina8196132024-03-15 15:55:22 +0000458TEST_F(VirtualCameraServiceTest, TestCameraShellCmdWithId) {
Biswarup Pal15dcd132024-06-02 14:02:03 +0000459 EXPECT_THAT(
460 execute_shell_command("enable_test_camera --camera_id=hello12345"),
461 Eq(NO_ERROR));
Marvin Ramina8196132024-03-15 15:55:22 +0000462
463 std::vector<std::string> cameraIdsAfterEnable = getCameraIds();
Biswarup Pal15dcd132024-06-02 14:02:03 +0000464 EXPECT_THAT(cameraIdsAfterEnable,
465 ElementsAre("device@1.1/virtual/hello12345"));
Marvin Ramina8196132024-03-15 15:55:22 +0000466
Jan Sebechlebsky773c0142024-03-25 12:17:05 +0100467 EXPECT_THAT(execute_shell_command("disable_test_camera"), Eq(NO_ERROR));
Marvin Ramina8196132024-03-15 15:55:22 +0000468
469 std::vector<std::string> cameraIdsAfterDisable = getCameraIds();
470 EXPECT_THAT(cameraIdsAfterDisable, IsEmpty());
471}
472
Jan Sebechlebsky773c0142024-03-25 12:17:05 +0100473TEST_F(VirtualCameraServiceTest, TestCameraShellCmdWithInvalidId) {
Biswarup Pal15dcd132024-06-02 14:02:03 +0000474 EXPECT_THAT(execute_shell_command("enable_test_camera --camera_id="),
475 Eq(STATUS_BAD_VALUE));
Jan Sebechlebsky773c0142024-03-25 12:17:05 +0100476}
477
478TEST_F(VirtualCameraServiceTest, TestCameraShellCmdWithUnknownCommand) {
479 EXPECT_THAT(execute_shell_command("brew_coffee --flavor=vanilla"),
480 Eq(STATUS_BAD_VALUE));
481}
482
483TEST_F(VirtualCameraServiceTest, TestCameraShellCmdWithMalformedOption) {
484 EXPECT_THAT(execute_shell_command("enable_test_camera **camera_id=12345"),
485 Eq(STATUS_BAD_VALUE));
486}
487
488TEST_F(VirtualCameraServiceTest, TestCameraShellCmdWithLensFacing) {
489 EXPECT_THAT(execute_shell_command("enable_test_camera --lens_facing=front"),
490 Eq(NO_ERROR));
491
492 std::vector<std::string> cameraIds = getCameraIds();
493 ASSERT_THAT(cameraIds, SizeIs(1));
494 EXPECT_THAT(getCameraLensFacing(cameraIds[0]),
495 Optional(Eq(ANDROID_LENS_FACING_FRONT)));
496}
497
498TEST_F(VirtualCameraServiceTest, TestCameraShellCmdWithInvalidLensFacing) {
499 EXPECT_THAT(execute_shell_command("enable_test_camera --lens_facing=west"),
500 Eq(STATUS_BAD_VALUE));
501}
502
Jan Sebechlebsky34469e42024-05-29 10:56:12 +0200503TEST_F(VirtualCameraServiceTest, TestCameraShellCmdWithInputFps) {
504 EXPECT_THAT(execute_shell_command("enable_test_camera --input_fps=15"),
505 Eq(NO_ERROR));
506
507 std::vector<std::string> cameraIds = getCameraIds();
508 ASSERT_THAT(cameraIds, SizeIs(1));
509}
510
511TEST_F(VirtualCameraServiceTest, TestCameraShellCmdWithInvalidInputFps) {
512 EXPECT_THAT(execute_shell_command("enable_test_camera --input_fps=1001"),
513 Eq(STATUS_BAD_VALUE));
514 EXPECT_THAT(execute_shell_command("enable_test_camera --input_fps=0"),
515 Eq(STATUS_BAD_VALUE));
516 EXPECT_THAT(execute_shell_command("enable_test_camera --input_fps=foo"),
517 Eq(STATUS_BAD_VALUE));
518}
519
Vadim Caen39100152024-06-11 15:24:15 +0200520TEST_F(VirtualCameraServiceTest, TestCameraShellCmdWithSensorOrientation90) {
521 EXPECT_THAT(
522 execute_shell_command("enable_test_camera --sensor_orientation=90"),
523 Eq(NO_ERROR));
524
525 std::vector<std::string> cameraIds = getCameraIds();
526 ASSERT_THAT(cameraIds, SizeIs(1));
527 EXPECT_THAT(getCameraSensorOrienation(cameraIds[0]), Optional(Eq(90)));
528}
529
530TEST_F(VirtualCameraServiceTest, TestCameraShellCmdWithSensorOrientationNoArgs) {
531 EXPECT_THAT(execute_shell_command("enable_test_camera"), Eq(NO_ERROR));
532
533 std::vector<std::string> cameraIds = getCameraIds();
534 ASSERT_THAT(cameraIds, SizeIs(1));
535 EXPECT_THAT(getCameraSensorOrienation(cameraIds[0]), Optional(Eq(0)));
536}
537
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100538} // namespace
539} // namespace virtualcamera
540} // namespace companion
541} // namespace android