blob: 5927b052905d8ab997485492a4251dfa3ae7d4d8 [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 Sebechlebsky5cb39962023-11-22 17:33:07 +010018#include <cstdio>
Jan Sebechlebsky685ba1e2024-03-25 10:33:09 +010019#include <iterator>
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +010020#include <memory>
Jan Sebechlebsky685ba1e2024-03-25 10:33:09 +010021#include <regex>
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +010022
23#include "VirtualCameraService.h"
24#include "aidl/android/companion/virtualcamera/BnVirtualCameraCallback.h"
25#include "aidl/android/companion/virtualcamera/VirtualCameraConfiguration.h"
26#include "aidl/android/hardware/camera/provider/BnCameraProviderCallback.h"
27#include "aidl/android/hardware/graphics/common/PixelFormat.h"
28#include "android/binder_auto_utils.h"
29#include "android/binder_interface_utils.h"
30#include "android/binder_libbinder.h"
31#include "android/binder_status.h"
32#include "binder/Binder.h"
33#include "gmock/gmock.h"
34#include "gtest/gtest.h"
Jan Sebechlebsky773c0142024-03-25 12:17:05 +010035#include "util/MetadataUtil.h"
Jan Sebechlebskyde6f16f2023-11-29 09:27:36 +010036#include "util/Permissions.h"
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +010037#include "utils/Errors.h"
38
39namespace android {
40namespace companion {
41namespace virtualcamera {
42namespace {
43
44using ::aidl::android::companion::virtualcamera::BnVirtualCameraCallback;
Jan Sebechlebsky3b478c42023-11-23 13:15:56 +010045using ::aidl::android::companion::virtualcamera::Format;
Biswarup Pal112458f2023-12-28 19:50:17 +000046using ::aidl::android::companion::virtualcamera::LensFacing;
Biswarup Pal6152a302023-12-19 12:44:09 +000047using ::aidl::android::companion::virtualcamera::SensorOrientation;
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +010048using ::aidl::android::companion::virtualcamera::VirtualCameraConfiguration;
49using ::aidl::android::hardware::camera::common::CameraDeviceStatus;
50using ::aidl::android::hardware::camera::common::TorchModeStatus;
Jan Sebechlebsky773c0142024-03-25 12:17:05 +010051using ::aidl::android::hardware::camera::device::CameraMetadata;
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +010052using ::aidl::android::hardware::camera::provider::BnCameraProviderCallback;
53using ::aidl::android::hardware::graphics::common::PixelFormat;
54using ::aidl::android::view::Surface;
55using ::testing::_;
Jan Sebechlebsky685ba1e2024-03-25 10:33:09 +010056using ::testing::ElementsAre;
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +010057using ::testing::Eq;
58using ::testing::Ge;
59using ::testing::IsEmpty;
60using ::testing::IsNull;
61using ::testing::Not;
Jan Sebechlebsky773c0142024-03-25 12:17:05 +010062using ::testing::Optional;
Jan Sebechlebskyde6f16f2023-11-29 09:27:36 +010063using ::testing::Return;
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +010064using ::testing::SizeIs;
65
Jan Sebechlebsky3b478c42023-11-23 13:15:56 +010066constexpr int kVgaWidth = 640;
67constexpr int kVgaHeight = 480;
Biswarup Pal6152a302023-12-19 12:44:09 +000068constexpr int kMaxFps = 30;
Biswarup Pal112458f2023-12-28 19:50:17 +000069constexpr SensorOrientation kSensorOrientation =
70 SensorOrientation::ORIENTATION_0;
71constexpr LensFacing kLensFacing = LensFacing::FRONT;
Biswarup Pal37a75182024-01-16 15:53:35 +000072constexpr int kDefaultDeviceId = 0;
Jan Sebechlebskyde6f16f2023-11-29 09:27:36 +010073constexpr char kCreateVirtualDevicePermissions[] =
74 "android.permission.CREATE_VIRTUAL_DEVICE";
Jan Sebechlebsky3b478c42023-11-23 13:15:56 +010075
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +010076const VirtualCameraConfiguration kEmptyVirtualCameraConfiguration;
77
Biswarup Pal112458f2023-12-28 19:50:17 +000078VirtualCameraConfiguration createConfiguration(const int width, const int height,
79 const Format format,
80 const int maxFps) {
Jan Sebechlebsky3b478c42023-11-23 13:15:56 +010081 VirtualCameraConfiguration configuration;
Biswarup Pal6152a302023-12-19 12:44:09 +000082 configuration.supportedStreamConfigs.push_back({.width = width,
83 .height = height,
84 .pixelFormat = format,
85 .maxFps = maxFps});
Biswarup Pal112458f2023-12-28 19:50:17 +000086 configuration.sensorOrientation = kSensorOrientation;
87 configuration.lensFacing = kLensFacing;
Jan Sebechlebsky3b478c42023-11-23 13:15:56 +010088 return configuration;
89}
90
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +010091class MockCameraProviderCallback : public BnCameraProviderCallback {
92 public:
93 MOCK_METHOD(ndk::ScopedAStatus, cameraDeviceStatusChange,
94 (const std::string&, CameraDeviceStatus), (override));
95 MOCK_METHOD(ndk::ScopedAStatus, torchModeStatusChange,
96 (const std::string&, TorchModeStatus), (override));
97 MOCK_METHOD(ndk::ScopedAStatus, physicalCameraDeviceStatusChange,
98 (const std::string&, const std::string&, CameraDeviceStatus),
99 (override));
100};
101
Jan Sebechlebskyde6f16f2023-11-29 09:27:36 +0100102class MockPermissionsProxy : public PermissionsProxy {
103 public:
104 MOCK_METHOD(bool, checkCallingPermission, (const std::string&),
105 (const override));
106};
107
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100108class VirtualCameraServiceTest : public ::testing::Test {
109 public:
110 void SetUp() override {
111 mCameraProvider = ndk::SharedRefBase::make<VirtualCameraProvider>();
112 mMockCameraProviderCallback =
113 ndk::SharedRefBase::make<MockCameraProviderCallback>();
114 ON_CALL(*mMockCameraProviderCallback, cameraDeviceStatusChange)
115 .WillByDefault([](const std::string&, CameraDeviceStatus) {
116 return ndk::ScopedAStatus::ok();
117 });
118 mCameraProvider->setCallback(mMockCameraProviderCallback);
Jan Sebechlebskyde6f16f2023-11-29 09:27:36 +0100119 mCameraService = ndk::SharedRefBase::make<VirtualCameraService>(
120 mCameraProvider, mMockPermissionsProxy);
Jan Sebechlebskyb36090e2024-04-11 09:19:33 +0200121 mCameraService->disableEglVerificationForTest();
Jan Sebechlebskyde6f16f2023-11-29 09:27:36 +0100122
123 ON_CALL(mMockPermissionsProxy, checkCallingPermission)
124 .WillByDefault(Return(true));
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100125
126 mDevNullFd = open("/dev/null", O_RDWR);
127 ASSERT_THAT(mDevNullFd, Ge(0));
128 }
129
130 void createCamera() {
131 mOwnerToken = sp<BBinder>::make();
132 mNdkOwnerToken.set(AIBinder_fromPlatformBinder(mOwnerToken));
133 bool aidlRet;
134
135 ASSERT_TRUE(mCameraService
Biswarup Pal37a75182024-01-16 15:53:35 +0000136 ->registerCamera(mNdkOwnerToken, mVgaYUV420OnlyConfiguration,
137 kDefaultDeviceId, &aidlRet)
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100138 .isOk());
139 ASSERT_TRUE(aidlRet);
140 }
141
142 void TearDown() override {
143 close(mDevNullFd);
144 }
145
Jan Sebechlebsky773c0142024-03-25 12:17:05 +0100146 binder_status_t execute_shell_command(const std::string& cmd) {
Jan Sebechlebsky685ba1e2024-03-25 10:33:09 +0100147 const static std::regex whitespaceRegex("\\s+");
148 std::vector<std::string> tokens;
149 std::copy_if(
150 std::sregex_token_iterator(cmd.begin(), cmd.end(), whitespaceRegex, -1),
151 std::sregex_token_iterator(), std::back_inserter(tokens),
152 [](const std::string& token) { return !token.empty(); });
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100153
Jan Sebechlebsky685ba1e2024-03-25 10:33:09 +0100154 std::vector<const char*> argv;
155 argv.reserve(tokens.size());
156 std::transform(tokens.begin(), tokens.end(), std::back_inserter(argv),
157 [](const std::string& str) { return str.c_str(); });
158
Jan Sebechlebsky773c0142024-03-25 12:17:05 +0100159 return mCameraService->handleShellCommand(
160 mDevNullFd, mDevNullFd, mDevNullFd, argv.data(), argv.size());
Marvin Ramina8196132024-03-15 15:55:22 +0000161 }
162
Jan Sebechlebsky3b478c42023-11-23 13:15:56 +0100163 std::vector<std::string> getCameraIds() {
164 std::vector<std::string> cameraIds;
165 EXPECT_TRUE(mCameraProvider->getCameraIdList(&cameraIds).isOk());
166 return cameraIds;
167 }
168
Jan Sebechlebsky773c0142024-03-25 12:17:05 +0100169 std::optional<camera_metadata_enum_android_lens_facing> getCameraLensFacing(
170 const std::string& id) {
171 std::shared_ptr<VirtualCameraDevice> camera = mCameraProvider->getCamera(id);
172 if (camera == nullptr) {
173 return std::nullopt;
174 }
175 CameraMetadata metadata;
176 camera->getCameraCharacteristics(&metadata);
177 return getLensFacing(metadata);
178 }
179
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100180 protected:
181 std::shared_ptr<VirtualCameraService> mCameraService;
182 std::shared_ptr<VirtualCameraProvider> mCameraProvider;
183 std::shared_ptr<MockCameraProviderCallback> mMockCameraProviderCallback =
184 ndk::SharedRefBase::make<MockCameraProviderCallback>();
Jan Sebechlebskyde6f16f2023-11-29 09:27:36 +0100185 MockPermissionsProxy mMockPermissionsProxy;
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100186
187 sp<BBinder> mOwnerToken;
188 ndk::SpAIBinder mNdkOwnerToken;
189
190 int mDevNullFd;
Jan Sebechlebsky3b478c42023-11-23 13:15:56 +0100191
192 VirtualCameraConfiguration mVgaYUV420OnlyConfiguration =
Biswarup Pal112458f2023-12-28 19:50:17 +0000193 createConfiguration(kVgaWidth, kVgaHeight, Format::YUV_420_888, kMaxFps);
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100194};
195
Jan Sebechlebsky042d1fb2023-12-12 16:37:00 +0100196TEST_F(VirtualCameraServiceTest, RegisterCameraWithYuvInputSucceeds) {
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100197 sp<BBinder> token = sp<BBinder>::make();
198 ndk::SpAIBinder ndkToken(AIBinder_fromPlatformBinder(token));
199 bool aidlRet;
200
Biswarup Pal37a75182024-01-16 15:53:35 +0000201 ASSERT_TRUE(mCameraService
202 ->registerCamera(ndkToken, mVgaYUV420OnlyConfiguration,
203 kDefaultDeviceId, &aidlRet)
204 .isOk());
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100205
206 EXPECT_TRUE(aidlRet);
Jan Sebechlebsky3b478c42023-11-23 13:15:56 +0100207 EXPECT_THAT(getCameraIds(), SizeIs(1));
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100208}
209
Jan Sebechlebsky042d1fb2023-12-12 16:37:00 +0100210TEST_F(VirtualCameraServiceTest, RegisterCameraWithRgbaInputSucceeds) {
211 sp<BBinder> token = sp<BBinder>::make();
212 ndk::SpAIBinder ndkToken(AIBinder_fromPlatformBinder(token));
213 bool aidlRet;
214
215 VirtualCameraConfiguration config =
Biswarup Pal112458f2023-12-28 19:50:17 +0000216 createConfiguration(kVgaWidth, kVgaHeight, Format::RGBA_8888, kMaxFps);
Jan Sebechlebsky042d1fb2023-12-12 16:37:00 +0100217
Biswarup Pal37a75182024-01-16 15:53:35 +0000218 ASSERT_TRUE(mCameraService
219 ->registerCamera(ndkToken, config, kDefaultDeviceId, &aidlRet)
220 .isOk());
Jan Sebechlebsky042d1fb2023-12-12 16:37:00 +0100221
222 EXPECT_TRUE(aidlRet);
223 EXPECT_THAT(getCameraIds(), SizeIs(1));
224}
225
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100226TEST_F(VirtualCameraServiceTest, RegisterCameraTwiceSecondReturnsFalse) {
227 createCamera();
228 bool aidlRet;
229
230 ASSERT_TRUE(mCameraService
Jan Sebechlebsky3b478c42023-11-23 13:15:56 +0100231 ->registerCamera(mNdkOwnerToken, mVgaYUV420OnlyConfiguration,
Biswarup Pal37a75182024-01-16 15:53:35 +0000232 kDefaultDeviceId, &aidlRet)
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100233 .isOk());
234 EXPECT_FALSE(aidlRet);
Jan Sebechlebsky3b478c42023-11-23 13:15:56 +0100235 EXPECT_THAT(getCameraIds(), SizeIs(1));
236}
237
238TEST_F(VirtualCameraServiceTest, EmptyConfigurationFails) {
239 bool aidlRet;
240
241 ASSERT_FALSE(mCameraService
242 ->registerCamera(mNdkOwnerToken,
Biswarup Pal37a75182024-01-16 15:53:35 +0000243 kEmptyVirtualCameraConfiguration,
244 kDefaultDeviceId, &aidlRet)
Jan Sebechlebsky3b478c42023-11-23 13:15:56 +0100245 .isOk());
246 EXPECT_FALSE(aidlRet);
247 EXPECT_THAT(getCameraIds(), IsEmpty());
248}
249
250TEST_F(VirtualCameraServiceTest, ConfigurationWithUnsupportedPixelFormatFails) {
251 bool aidlRet;
252
253 VirtualCameraConfiguration config =
Biswarup Pal112458f2023-12-28 19:50:17 +0000254 createConfiguration(kVgaWidth, kVgaHeight, Format::UNKNOWN, kMaxFps);
Jan Sebechlebsky3b478c42023-11-23 13:15:56 +0100255
256 ASSERT_FALSE(
Biswarup Pal37a75182024-01-16 15:53:35 +0000257 mCameraService
258 ->registerCamera(mNdkOwnerToken, config, kDefaultDeviceId, &aidlRet)
259 .isOk());
Jan Sebechlebsky3b478c42023-11-23 13:15:56 +0100260 EXPECT_FALSE(aidlRet);
261 EXPECT_THAT(getCameraIds(), IsEmpty());
262}
263
264TEST_F(VirtualCameraServiceTest, ConfigurationWithTooHighResFails) {
265 bool aidlRet;
266 VirtualCameraConfiguration config =
Biswarup Pal112458f2023-12-28 19:50:17 +0000267 createConfiguration(1000000, 1000000, Format::YUV_420_888, kMaxFps);
Jan Sebechlebsky3b478c42023-11-23 13:15:56 +0100268
269 ASSERT_FALSE(
Biswarup Pal37a75182024-01-16 15:53:35 +0000270 mCameraService
271 ->registerCamera(mNdkOwnerToken, config, kDefaultDeviceId, &aidlRet)
272 .isOk());
Jan Sebechlebsky3b478c42023-11-23 13:15:56 +0100273 EXPECT_FALSE(aidlRet);
274 EXPECT_THAT(getCameraIds(), IsEmpty());
275}
276
Jan Sebechlebsky3b478c42023-11-23 13:15:56 +0100277TEST_F(VirtualCameraServiceTest, ConfigurationWithNegativeResolutionFails) {
278 bool aidlRet;
279 VirtualCameraConfiguration config =
Biswarup Pal112458f2023-12-28 19:50:17 +0000280 createConfiguration(-1, kVgaHeight, Format::YUV_420_888, kMaxFps);
Biswarup Pal6152a302023-12-19 12:44:09 +0000281
282 ASSERT_FALSE(
Biswarup Pal37a75182024-01-16 15:53:35 +0000283 mCameraService
284 ->registerCamera(mNdkOwnerToken, config, kDefaultDeviceId, &aidlRet)
285 .isOk());
Biswarup Pal6152a302023-12-19 12:44:09 +0000286 EXPECT_FALSE(aidlRet);
287 EXPECT_THAT(getCameraIds(), IsEmpty());
288}
289
290TEST_F(VirtualCameraServiceTest, ConfigurationWithTooLowMaxFpsFails) {
291 bool aidlRet;
292 VirtualCameraConfiguration config =
Biswarup Pal112458f2023-12-28 19:50:17 +0000293 createConfiguration(kVgaWidth, kVgaHeight, Format::YUV_420_888, 0);
Biswarup Pal6152a302023-12-19 12:44:09 +0000294
295 ASSERT_FALSE(
Biswarup Pal37a75182024-01-16 15:53:35 +0000296 mCameraService
297 ->registerCamera(mNdkOwnerToken, config, kDefaultDeviceId, &aidlRet)
298 .isOk());
Biswarup Pal6152a302023-12-19 12:44:09 +0000299 EXPECT_FALSE(aidlRet);
300 EXPECT_THAT(getCameraIds(), IsEmpty());
301}
302
303TEST_F(VirtualCameraServiceTest, ConfigurationWithTooHighMaxFpsFails) {
304 bool aidlRet;
305 VirtualCameraConfiguration config =
Biswarup Pal112458f2023-12-28 19:50:17 +0000306 createConfiguration(kVgaWidth, kVgaHeight, Format::YUV_420_888, 90);
Jan Sebechlebsky3b478c42023-11-23 13:15:56 +0100307
308 ASSERT_FALSE(
Biswarup Pal37a75182024-01-16 15:53:35 +0000309 mCameraService
310 ->registerCamera(mNdkOwnerToken, config, kDefaultDeviceId, &aidlRet)
311 .isOk());
Jan Sebechlebsky3b478c42023-11-23 13:15:56 +0100312 EXPECT_FALSE(aidlRet);
313 EXPECT_THAT(getCameraIds(), IsEmpty());
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100314}
315
316TEST_F(VirtualCameraServiceTest, GetCamera) {
317 createCamera();
318
319 EXPECT_THAT(mCameraService->getCamera(mNdkOwnerToken), Not(IsNull()));
320
321 sp<BBinder> otherToken = sp<BBinder>::make();
322 EXPECT_THAT(mCameraService->getCamera(
323 ndk::SpAIBinder(AIBinder_fromPlatformBinder(otherToken))),
324 IsNull());
325}
326
327TEST_F(VirtualCameraServiceTest, UnregisterCamera) {
328 createCamera();
329
330 EXPECT_THAT(mCameraService->getCamera(mNdkOwnerToken), Not(IsNull()));
331
332 mCameraService->unregisterCamera(mNdkOwnerToken);
333
334 EXPECT_THAT(mCameraService->getCamera(mNdkOwnerToken), IsNull());
335}
336
Jan Sebechlebskyde6f16f2023-11-29 09:27:36 +0100337TEST_F(VirtualCameraServiceTest, RegisterCameraWithoutPermissionFails) {
338 bool aidlRet;
339 EXPECT_CALL(mMockPermissionsProxy,
340 checkCallingPermission(kCreateVirtualDevicePermissions))
341 .WillOnce(Return(false));
342
343 EXPECT_THAT(mCameraService
344 ->registerCamera(mNdkOwnerToken, mVgaYUV420OnlyConfiguration,
Biswarup Pal37a75182024-01-16 15:53:35 +0000345 kDefaultDeviceId, &aidlRet)
Jan Sebechlebskyde6f16f2023-11-29 09:27:36 +0100346 .getExceptionCode(),
347 Eq(EX_SECURITY));
348}
349
350TEST_F(VirtualCameraServiceTest, UnregisterCameraWithoutPermissionFails) {
351 EXPECT_CALL(mMockPermissionsProxy,
352 checkCallingPermission(kCreateVirtualDevicePermissions))
353 .WillOnce(Return(false));
354
355 EXPECT_THAT(
356 mCameraService->unregisterCamera(mNdkOwnerToken).getExceptionCode(),
357 Eq(EX_SECURITY));
358}
359
360TEST_F(VirtualCameraServiceTest, GetIdWithoutPermissionFails) {
361 int32_t aidlRet;
362 EXPECT_CALL(mMockPermissionsProxy,
363 checkCallingPermission(kCreateVirtualDevicePermissions))
364 .WillOnce(Return(false));
365
366 EXPECT_THAT(
367 mCameraService->getCameraId(mNdkOwnerToken, &aidlRet).getExceptionCode(),
368 Eq(EX_SECURITY));
369}
370
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100371TEST_F(VirtualCameraServiceTest, UnregisterCameraWithUnknownToken) {
372 createCamera();
373
374 EXPECT_THAT(mCameraService->getCamera(mNdkOwnerToken), Not(IsNull()));
375
376 auto otherToken = sp<BBinder>::make();
377 ndk::SpAIBinder ndkOtherToken(AIBinder_fromPlatformBinder(otherToken));
378 mCameraService->unregisterCamera(ndkOtherToken);
379
380 EXPECT_THAT(mCameraService->getCamera(mNdkOwnerToken), Not(IsNull()));
381}
382
383TEST_F(VirtualCameraServiceTest, ShellCmdWithNullArgs) {
384 EXPECT_EQ(mCameraService->handleShellCommand(
385 /*in=*/mDevNullFd, /*out=*/mDevNullFd, /*err=*/mDevNullFd,
386 /*args=*/nullptr, /*numArgs=*/1),
387 STATUS_BAD_VALUE);
388
389 std::array<const char*, 1> args{nullptr};
390 EXPECT_EQ(mCameraService->handleShellCommand(
391 /*in=*/mDevNullFd, /*out=*/mDevNullFd, /*err=*/mDevNullFd,
392 args.data(), /*numArgs=*/1),
393 STATUS_BAD_VALUE);
394}
395
Jan Sebechlebsky76d7e212023-11-28 14:10:25 +0100396TEST_F(VirtualCameraServiceTest, ShellCmdWithNoArgs) {
397 EXPECT_EQ(mCameraService->handleShellCommand(
398 /*in=*/mDevNullFd, /*out=*/mDevNullFd, /*err=*/mDevNullFd,
399 /*args=*/nullptr, /*numArgs=*/0),
400 STATUS_OK);
401}
402
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100403TEST_F(VirtualCameraServiceTest, TestCameraShellCmd) {
Jan Sebechlebsky773c0142024-03-25 12:17:05 +0100404 EXPECT_THAT(execute_shell_command("enable_test_camera"), Eq(NO_ERROR));
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100405
Jan Sebechlebsky3b478c42023-11-23 13:15:56 +0100406 std::vector<std::string> cameraIdsAfterEnable = getCameraIds();
407 EXPECT_THAT(cameraIdsAfterEnable, SizeIs(1));
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100408
Jan Sebechlebsky773c0142024-03-25 12:17:05 +0100409 EXPECT_THAT(execute_shell_command("disable_test_camera"), Eq(NO_ERROR));
Jan Sebechlebsky3b478c42023-11-23 13:15:56 +0100410
411 std::vector<std::string> cameraIdsAfterDisable = getCameraIds();
412 EXPECT_THAT(cameraIdsAfterDisable, IsEmpty());
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100413}
414
Marvin Ramina8196132024-03-15 15:55:22 +0000415TEST_F(VirtualCameraServiceTest, TestCameraShellCmdWithId) {
Jan Sebechlebsky773c0142024-03-25 12:17:05 +0100416 EXPECT_THAT(execute_shell_command("enable_test_camera --camera_id=12345"),
417 Eq(NO_ERROR));
Marvin Ramina8196132024-03-15 15:55:22 +0000418
419 std::vector<std::string> cameraIdsAfterEnable = getCameraIds();
Jan Sebechlebsky685ba1e2024-03-25 10:33:09 +0100420 EXPECT_THAT(cameraIdsAfterEnable, ElementsAre("device@1.1/virtual/12345"));
Marvin Ramina8196132024-03-15 15:55:22 +0000421
Jan Sebechlebsky773c0142024-03-25 12:17:05 +0100422 EXPECT_THAT(execute_shell_command("disable_test_camera"), Eq(NO_ERROR));
Marvin Ramina8196132024-03-15 15:55:22 +0000423
424 std::vector<std::string> cameraIdsAfterDisable = getCameraIds();
425 EXPECT_THAT(cameraIdsAfterDisable, IsEmpty());
426}
427
Jan Sebechlebsky773c0142024-03-25 12:17:05 +0100428TEST_F(VirtualCameraServiceTest, TestCameraShellCmdWithInvalidId) {
429 EXPECT_THAT(
430 execute_shell_command("enable_test_camera --camera_id=NotNumericalId"),
431 Eq(STATUS_BAD_VALUE));
432}
433
434TEST_F(VirtualCameraServiceTest, TestCameraShellCmdWithUnknownCommand) {
435 EXPECT_THAT(execute_shell_command("brew_coffee --flavor=vanilla"),
436 Eq(STATUS_BAD_VALUE));
437}
438
439TEST_F(VirtualCameraServiceTest, TestCameraShellCmdWithMalformedOption) {
440 EXPECT_THAT(execute_shell_command("enable_test_camera **camera_id=12345"),
441 Eq(STATUS_BAD_VALUE));
442}
443
444TEST_F(VirtualCameraServiceTest, TestCameraShellCmdWithLensFacing) {
445 EXPECT_THAT(execute_shell_command("enable_test_camera --lens_facing=front"),
446 Eq(NO_ERROR));
447
448 std::vector<std::string> cameraIds = getCameraIds();
449 ASSERT_THAT(cameraIds, SizeIs(1));
450 EXPECT_THAT(getCameraLensFacing(cameraIds[0]),
451 Optional(Eq(ANDROID_LENS_FACING_FRONT)));
452}
453
454TEST_F(VirtualCameraServiceTest, TestCameraShellCmdWithInvalidLensFacing) {
455 EXPECT_THAT(execute_shell_command("enable_test_camera --lens_facing=west"),
456 Eq(STATUS_BAD_VALUE));
457}
458
Jan Sebechlebsky5cb39962023-11-22 17:33:07 +0100459} // namespace
460} // namespace virtualcamera
461} // namespace companion
462} // namespace android