/* SPDX-License-Identifier: GPL-2.0-or-later */ /* * Copyright (C) 2020, Google Inc. * Copyright (C) 2021, Collabora Ltd. * * capture_test.cpp - Test camera capture */ #include <iostream> #include <gtest/gtest.h> #include "environment.h" #include "simple_capture.h" using namespace libcamera; const std::vector<int> NUMREQUESTS = { 1, 2, 3, 5, 8, 13, 21, 34, 55, 89 }; const std::vector<StreamRole> ROLES = { Raw, StillCapture, VideoRecording, Viewfinder }; class SingleStream : public testing::TestWithParam<std::tuple<StreamRole, int>> { public: static std::string nameParameters(const testing::TestParamInfo<SingleStream::ParamType> &info); protected: void SetUp() override; void TearDown() override; std::shared_ptr<Camera> camera_; }; /* * We use gtest's SetUp() and TearDown() instead of constructor and destructor * in order to be able to assert on them. */ void SingleStream::SetUp() { Environment *env = Environment::get(); camera_ = env->cm()->get(env->cameraId()); ASSERT_EQ(camera_->acquire(), 0); } void SingleStream::TearDown() { if (!camera_) return; camera_->release(); camera_.reset(); } std::string SingleStream::nameParameters(const testing::TestParamInfo<SingleStream::ParamType> &info) { std::map<StreamRole, std::string> rolesMap = { { Raw, "Raw" }, { StillCapture, "StillCapture" }, { VideoRecording, "VideoRecording" }, { Viewfinder, "Viewfinder" } }; std::string roleName = rolesMap[std::get<0>(info.param)]; std::string numRequestsName = std::to_string(std::get<1>(info.param)); return roleName + "_" + numRequestsName; } /* * Test single capture cycles * * Makes sure the camera completes the exact number of requests queued. Example * failure is a camera that completes less requests than the number of requests * queued. */ TEST_P(SingleStream, Capture) { auto [role, numRequests] = GetParam(); SimpleCaptureBalanced capture(camera_); capture.configure(role); capture.capture(numRequests); } /* * Test multiple start/stop cycles * * Makes sure the camera supports multiple start/stop cycles. Example failure is * a camera that does not clean up correctly in its error path but is only * tested by single-capture applications. */ TEST_P(SingleStream, CaptureStartStop) { auto [role, numRequests] = GetParam(); unsigned int numRepeats = 3; SimpleCaptureBalanced capture(camera_); capture.configure(role); for (unsigned int starts = 0; starts < numRepeats; starts++) capture.capture(numRequests); } /* * Test unbalanced stop * * Makes sure the camera supports a stop with requests queued. Example failure * is a camera that does not handle cancelation of buffers coming back from the * video device while stopping. */ TEST_P(SingleStream, UnbalancedStop) { auto [role, numRequests] = GetParam(); SimpleCaptureUnbalanced capture(camera_); capture.configure(role); capture.capture(numRequests); } INSTANTIATE_TEST_SUITE_P(CaptureTests, SingleStream, testing::Combine(testing::ValuesIn(ROLES), testing::ValuesIn(NUMREQUESTS)), SingleStream::nameParameters);