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 "token_setproc.h"
30 #include "os_account_manager.h"
31
32 using namespace testing::ext;
33
34 namespace OHOS {
35 namespace CameraStandard {
36
UpdataCameraOutputCapability(int32_t modeName)37 void CameraformatYUVModuleTest::UpdataCameraOutputCapability(int32_t modeName)
38 {
39 if (!cameraManager_ || cameras_.empty()) {
40 return;
41 }
42 auto outputCapability = cameraManager_->GetSupportedOutputCapability(cameras_[0], modeName);
43 ASSERT_NE(outputCapability, nullptr);
44
45 outputCapability->photoProfiles_[0].size_ = {640, 480};
46 outputCapability->photoProfiles_[0].format_ = CAMERA_FORMAT_YUV_420_SP;
47 outputCapability->previewProfiles_[0].size_ = {640, 480};
48 outputCapability->previewProfiles_[0].format_ = CAMERA_FORMAT_YUV_420_SP;
49
50 previewProfile_ = outputCapability->GetPreviewProfiles();
51 ASSERT_FALSE(previewProfile_.empty());
52
53 outputCapability->SetPreviewProfiles(previewProfile_);
54 cameras_[0]->SetProfile(outputCapability);
55
56 photoProfile_ = outputCapability->GetPhotoProfiles();
57 ASSERT_FALSE(photoProfile_.empty());
58
59 outputCapability->SetPhotoProfiles(photoProfile_);
60 cameras_[0]->SetProfile(outputCapability);
61 }
62
UpdataCameraOutputCapabilitySrc(int32_t modeName)63 void CameraformatYUVModuleTest::UpdataCameraOutputCapabilitySrc(int32_t modeName)
64 {
65 if (!cameraManager_ || cameras_.empty()) {
66 return;
67 }
68 auto outputCapability = cameraManager_->GetSupportedOutputCapability(cameras_[0], modeName);
69 ASSERT_NE(outputCapability, nullptr);
70
71 outputCapability->photoProfiles_[0].size_ = {640, 480};
72 outputCapability->photoProfiles_[0].format_ = CAMERA_FORMAT_YUV_422_YUYV;
73 outputCapability->previewProfiles_[0].size_ = {640, 480};
74 outputCapability->previewProfiles_[0].format_ = CAMERA_FORMAT_YUV_422_YUYV;
75
76 previewProfile_ = outputCapability->GetPreviewProfiles();
77 ASSERT_FALSE(previewProfile_.empty());
78
79 outputCapability->SetPreviewProfiles(previewProfile_);
80 cameras_[0]->SetProfile(outputCapability);
81
82 photoProfile_ = outputCapability->GetPhotoProfiles();
83 ASSERT_FALSE(photoProfile_.empty());
84
85 outputCapability->SetPhotoProfiles(photoProfile_);
86 cameras_[0]->SetProfile(outputCapability);
87 }
88
SetUpTestCase(void)89 void CameraformatYUVModuleTest::SetUpTestCase(void)
90 {
91 MEDIA_DEBUG_LOG("CameraformatYUVModuleTest::SetUpTestCase started!");
92 }
93
TearDownTestCase(void)94 void CameraformatYUVModuleTest::TearDownTestCase(void)
95 {
96 MEDIA_DEBUG_LOG("CameraformatYUVModuleTest::TearDownTestCase started!");
97 }
98
SetUp()99 void CameraformatYUVModuleTest::SetUp()
100 {
101 NativeAuthorization();
102 cameraManager_ = CameraManager::GetInstance();
103 ASSERT_NE(cameraManager_, nullptr);
104 cameras_ = cameraManager_->GetSupportedCameras();
105 ASSERT_FALSE(cameras_.empty());
106 session_ = cameraManager_->CreateCaptureSession(SceneMode::NORMAL);
107 ASSERT_NE(session_, nullptr);
108 input_ = cameraManager_->CreateCameraInput(cameras_[0]);
109 ASSERT_NE(input_, nullptr);
110 input_->Open();
111 }
112
TearDown()113 void CameraformatYUVModuleTest::TearDown()
114 {
115 MEDIA_DEBUG_LOG("CameraformatYUVModuleTest::TearDown started!");
116 cameraManager_ = nullptr;
117 cameras_.clear();
118 input_->Close();
119 preview_->Release();
120 input_->Release();
121 session_->Release();
122 }
123
NativeAuthorization()124 void CameraformatYUVModuleTest::NativeAuthorization()
125 {
126 const char *perms[2];
127 perms[0] = "ohos.permission.DISTRIBUTED_DATASYNC";
128 perms[1] = "ohos.permission.CAMERA";
129 NativeTokenInfoParams infoInstance = {
130 .dcapsNum = 0,
131 .permsNum = 2,
132 .aclsNum = 0,
133 .dcaps = NULL,
134 .perms = perms,
135 .acls = NULL,
136 .processName = "native_camera_tdd",
137 .aplStr = "system_basic",
138 };
139 tokenId_ = GetAccessTokenId(&infoInstance);
140 uid_ = IPCSkeleton::GetCallingUid();
141 AccountSA::OsAccountManager::GetOsAccountLocalIdFromUid(uid_, userId_);
142 MEDIA_DEBUG_LOG("CaptureSessionUnitTest::NativeAuthorization uid:%{public}d", uid_);
143 SetSelfTokenID(tokenId_);
144 OHOS::Security::AccessToken::AccessTokenKit::ReloadNativeTokenInfo();
145 }
146
147 /*
148 * Feature: Framework
149 * Function: Test the functionality of capturing YUV photos.
150 * SubFunction: NA
151 * FunctionPoints: NA
152 * EnvConditions: NA
153 * CaseDescription: Test the functionality of capturing YUV photos which the format is YUV_420_SP.
154 */
155 HWTEST_F(CameraformatYUVModuleTest, camera_format_YUV_moduletest_001, TestSize.Level0)
156 {
157 UpdataCameraOutputCapability();
158 sptr<Surface> surface = Surface::CreateSurfaceAsConsumer();
159 preview_ = cameraManager_->CreatePreviewOutput(previewProfile_[0], surface);
160 ASSERT_NE(preview_, nullptr);
161 sptr<IConsumerSurface> iConsumerSurface = IConsumerSurface::Create();
162 ASSERT_NE(iConsumerSurface, nullptr);
163 sptr<IBufferProducer> surface2 = iConsumerSurface->GetProducer();
164 ASSERT_NE(surface2, nullptr);
165 sptr<CaptureOutput> photoOutput = cameraManager_->CreatePhotoOutput(photoProfile_[0], surface2);
166 ASSERT_NE(photoOutput, nullptr);
167 EXPECT_EQ(session_->BeginConfig(), 0);
168 EXPECT_EQ(session_->AddInput(input_), 0);
169 if (!session_->CanAddOutput(preview_)) {
170 return;
171 }
172 EXPECT_EQ(session_->AddOutput(preview_), 0);
173 if (!session_->CanAddOutput(photoOutput)) {
174 return;
175 }
176 EXPECT_EQ(session_->AddOutput(photoOutput), 0);
177 EXPECT_EQ(session_->CommitConfig(), 0);
178
179 auto intResult = session_->Start();
180 EXPECT_EQ(intResult, 0);
181
182 sleep(WAIT_TIME_AFTER_START);
183 intResult = ((sptr<PhotoOutput>&)photoOutput)->Capture();
184 EXPECT_EQ(intResult, 0);
185 sleep(WAIT_TIME_AFTER_CAPTURE);
186
187 intResult = session_->Stop();
188 EXPECT_EQ(intResult, 0);
189 }
190
191 /*
192 * Feature: Framework
193 * Function: Test the functionality of capturing YUV photos.
194 * SubFunction: NA
195 * FunctionPoints: NA
196 * EnvConditions: NA
197 * CaseDescription: Test the functionality of capturing YUV photos which the format is YUV_422_YUYV.
198 */
199 HWTEST_F(CameraformatYUVModuleTest, camera_format_YUV_moduletest_002, TestSize.Level0)
200 {
201 UpdataCameraOutputCapabilitySrc();
202 sptr<Surface> surface = Surface::CreateSurfaceAsConsumer();
203 preview_ = cameraManager_->CreatePreviewOutput(previewProfile_[0], surface);
204 ASSERT_NE(preview_, nullptr);
205 sptr<IConsumerSurface> iConsumerSurface = IConsumerSurface::Create();
206 ASSERT_NE(iConsumerSurface, nullptr);
207 sptr<IBufferProducer> surface2 = iConsumerSurface->GetProducer();
208 ASSERT_NE(surface2, nullptr);
209 sptr<CaptureOutput> photoOutput = cameraManager_->CreatePhotoOutput(photoProfile_[0], surface2);
210 ASSERT_NE(photoOutput, nullptr);
211 EXPECT_EQ(session_->BeginConfig(), 0);
212 EXPECT_EQ(session_->AddInput(input_), 0);
213 if (!session_->CanAddOutput(preview_)) {
214 return;
215 }
216 EXPECT_EQ(session_->AddOutput(preview_), 0);
217 if (!session_->CanAddOutput(photoOutput)) {
218 return;
219 }
220 EXPECT_EQ(session_->AddOutput(photoOutput), 0);
221 EXPECT_EQ(session_->CommitConfig(), 0);
222
223 auto intResult = session_->Start();
224 EXPECT_EQ(intResult, 0);
225
226 sleep(WAIT_TIME_AFTER_START);
227 intResult = ((sptr<PhotoOutput>&)photoOutput)->Capture();
228 EXPECT_EQ(intResult, 0);
229 sleep(WAIT_TIME_AFTER_CAPTURE);
230
231 intResult = session_->Stop();
232 EXPECT_EQ(intResult, 0);
233 }
234 } // namespace CameraStandard
235 } // namespace OHOS