1 /*
2 * Copyright (c) 2025 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "camera_format_YUV_moduletest.h"
17 #include "gtest/gtest.h"
18 #include <cstdint>
19 #include <vector>
20 #include "access_token.h"
21 #include "accesstoken_kit.h"
22 #include "camera_util.h"
23 #include "hap_token_info.h"
24 #include "ipc_skeleton.h"
25 #include "metadata_utils.h"
26 #include "nativetoken_kit.h"
27 #include "surface.h"
28 #include "test_common.h"
29 #include "test_token.h"
30 #include "token_setproc.h"
31 #include "os_account_manager.h"
32
33 using namespace testing::ext;
34
35 namespace OHOS {
36 namespace CameraStandard {
37
UpdateCameraOutputCapability(int32_t modeName)38 void CameraformatYUVModuleTest::UpdateCameraOutputCapability(int32_t modeName)
39 {
40 if (!cameraManager_ || cameras_.empty()) {
41 return;
42 }
43 auto outputCapability = cameraManager_->GetSupportedOutputCapability(cameras_[0], modeName);
44 ASSERT_NE(outputCapability, nullptr);
45
46 outputCapability->photoProfiles_[0].size_ = {640, 480};
47 outputCapability->photoProfiles_[0].format_ = CAMERA_FORMAT_YUV_420_SP;
48 outputCapability->previewProfiles_[0].size_ = {640, 480};
49 outputCapability->previewProfiles_[0].format_ = CAMERA_FORMAT_YUV_420_SP;
50
51 previewProfile_ = outputCapability->GetPreviewProfiles();
52 ASSERT_FALSE(previewProfile_.empty());
53
54 outputCapability->SetPreviewProfiles(previewProfile_);
55 cameras_[0]->SetProfile(outputCapability);
56
57 photoProfile_ = outputCapability->GetPhotoProfiles();
58 ASSERT_FALSE(photoProfile_.empty());
59
60 outputCapability->SetPhotoProfiles(photoProfile_);
61 cameras_[0]->SetProfile(outputCapability);
62 }
63
UpdateCameraOutputCapabilitySrc(int32_t modeName)64 void CameraformatYUVModuleTest::UpdateCameraOutputCapabilitySrc(int32_t modeName)
65 {
66 if (!cameraManager_ || cameras_.empty()) {
67 return;
68 }
69 auto outputCapability = cameraManager_->GetSupportedOutputCapability(cameras_[0], modeName);
70 ASSERT_NE(outputCapability, nullptr);
71
72 outputCapability->photoProfiles_[0].size_ = {640, 480};
73 outputCapability->photoProfiles_[0].format_ = CAMERA_FORMAT_YUV_422_YUYV;
74 outputCapability->previewProfiles_[0].size_ = {640, 480};
75 outputCapability->previewProfiles_[0].format_ = CAMERA_FORMAT_YUV_422_YUYV;
76
77 previewProfile_ = outputCapability->GetPreviewProfiles();
78 ASSERT_FALSE(previewProfile_.empty());
79
80 outputCapability->SetPreviewProfiles(previewProfile_);
81 cameras_[0]->SetProfile(outputCapability);
82
83 photoProfile_ = outputCapability->GetPhotoProfiles();
84 ASSERT_FALSE(photoProfile_.empty());
85
86 outputCapability->SetPhotoProfiles(photoProfile_);
87 cameras_[0]->SetProfile(outputCapability);
88 }
89
SetUpTestCase(void)90 void CameraformatYUVModuleTest::SetUpTestCase(void)
91 {
92 MEDIA_DEBUG_LOG("CameraformatYUVModuleTest::SetUpTestCase started!");
93 ASSERT_TRUE(TestToken().GetAllCameraPermission());
94 }
95
TearDownTestCase(void)96 void CameraformatYUVModuleTest::TearDownTestCase(void)
97 {
98 MEDIA_DEBUG_LOG("CameraformatYUVModuleTest::TearDownTestCase started!");
99 }
100
SetUp()101 void CameraformatYUVModuleTest::SetUp()
102 {
103 cameraManager_ = CameraManager::GetInstance();
104 ASSERT_NE(cameraManager_, nullptr);
105 cameras_ = cameraManager_->GetSupportedCameras();
106 ASSERT_FALSE(cameras_.empty());
107 session_ = cameraManager_->CreateCaptureSession(SceneMode::NORMAL);
108 ASSERT_NE(session_, nullptr);
109 input_ = cameraManager_->CreateCameraInput(cameras_[0]);
110 ASSERT_NE(input_, nullptr);
111 input_->Open();
112 }
113
TearDown()114 void CameraformatYUVModuleTest::TearDown()
115 {
116 MEDIA_DEBUG_LOG("CameraformatYUVModuleTest::TearDown started!");
117 cameraManager_ = nullptr;
118 cameras_.clear();
119 input_->Close();
120 preview_->Release();
121 input_->Release();
122 session_->Release();
123 }
124
125 /*
126 * Feature: Framework
127 * Function: Test the functionality of capturing YUV photos.
128 * SubFunction: NA
129 * FunctionPoints: NA
130 * EnvConditions: NA
131 * CaseDescription: Test the functionality of capturing YUV photos which the format is YUV_420_SP.
132 */
133 HWTEST_F(CameraformatYUVModuleTest, camera_format_YUV_moduletest_001, TestSize.Level0)
134 {
135 UpdateCameraOutputCapability();
136 sptr<Surface> surface = Surface::CreateSurfaceAsConsumer();
137 preview_ = cameraManager_->CreatePreviewOutput(previewProfile_[0], surface);
138 ASSERT_NE(preview_, nullptr);
139 sptr<IConsumerSurface> iConsumerSurface = IConsumerSurface::Create();
140 ASSERT_NE(iConsumerSurface, nullptr);
141 sptr<IBufferProducer> surface2 = iConsumerSurface->GetProducer();
142 ASSERT_NE(surface2, nullptr);
143 sptr<CaptureOutput> photoOutput = cameraManager_->CreatePhotoOutput(photoProfile_[0], surface2);
144 ASSERT_NE(photoOutput, nullptr);
145 EXPECT_EQ(session_->BeginConfig(), 0);
146 EXPECT_EQ(session_->AddInput(input_), 0);
147 if (!session_->CanAddOutput(preview_)) {
148 GTEST_SKIP();
149 }
150 EXPECT_EQ(session_->AddOutput(preview_), 0);
151 if (!session_->CanAddOutput(photoOutput)) {
152 GTEST_SKIP();
153 }
154 EXPECT_EQ(session_->AddOutput(photoOutput), 0);
155 EXPECT_EQ(session_->CommitConfig(), 0);
156
157 auto intResult = session_->Start();
158 EXPECT_EQ(intResult, 0);
159
160 sleep(WAIT_TIME_AFTER_START);
161 intResult = ((sptr<PhotoOutput>&)photoOutput)->Capture();
162 EXPECT_EQ(intResult, 0);
163 sleep(WAIT_TIME_AFTER_CAPTURE);
164
165 intResult = session_->Stop();
166 EXPECT_EQ(intResult, 0);
167 }
168
169 /*
170 * Feature: Framework
171 * Function: Test the functionality of capturing YUV photos.
172 * SubFunction: NA
173 * FunctionPoints: NA
174 * EnvConditions: NA
175 * CaseDescription: Test the functionality of capturing YUV photos which the format is YUV_422_YUYV.
176 */
177 HWTEST_F(CameraformatYUVModuleTest, camera_format_YUV_moduletest_002, TestSize.Level0)
178 {
179 UpdateCameraOutputCapabilitySrc();
180 sptr<Surface> surface = Surface::CreateSurfaceAsConsumer();
181 preview_ = cameraManager_->CreatePreviewOutput(previewProfile_[0], surface);
182 ASSERT_NE(preview_, nullptr);
183 sptr<IConsumerSurface> iConsumerSurface = IConsumerSurface::Create();
184 ASSERT_NE(iConsumerSurface, nullptr);
185 sptr<IBufferProducer> surface2 = iConsumerSurface->GetProducer();
186 ASSERT_NE(surface2, nullptr);
187 sptr<CaptureOutput> photoOutput = cameraManager_->CreatePhotoOutput(photoProfile_[0], surface2);
188 ASSERT_NE(photoOutput, nullptr);
189 EXPECT_EQ(session_->BeginConfig(), 0);
190 EXPECT_EQ(session_->AddInput(input_), 0);
191 if (!session_->CanAddOutput(preview_)) {
192 GTEST_SKIP();
193 }
194 EXPECT_EQ(session_->AddOutput(preview_), 0);
195 if (!session_->CanAddOutput(photoOutput)) {
196 GTEST_SKIP();
197 }
198 EXPECT_EQ(session_->AddOutput(photoOutput), 0);
199 EXPECT_EQ(session_->CommitConfig(), 0);
200
201 auto intResult = session_->Start();
202 EXPECT_EQ(intResult, 0);
203
204 sleep(WAIT_TIME_AFTER_START);
205 intResult = ((sptr<PhotoOutput>&)photoOutput)->Capture();
206 EXPECT_EQ(intResult, 0);
207 sleep(WAIT_TIME_AFTER_CAPTURE);
208
209 intResult = session_->Stop();
210 EXPECT_EQ(intResult, 0);
211 }
212 } // namespace CameraStandard
213 } // namespace OHOS