1/*
2 * Copyright (c) 2021 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#include "preview_test.h"
16
17using namespace OHOS;
18using namespace std;
19using namespace testing::ext;
20using namespace OHOS::Camera;
21
22void PreviewTest::SetUpTestCase(void) {}
23void PreviewTest::TearDownTestCase(void) {}
24void PreviewTest::SetUp(void)
25{
26    Test_ = std::make_shared<OHOS::Camera::Test>();
27    Test_->Init();
28    Test_->Open();
29}
30void PreviewTest::TearDown(void)
31{
32    Test_->Close();
33}
34
35/**
36  * @tc.name: Preview
37  * @tc.desc: Preview stream, 640*480, expected success.
38  * @tc.size: MediumTest
39  * @tc.type: Function
40  */
41HWTEST_F(PreviewTest, Camera_Preview_0001, TestSize.Level0)
42{
43    std::cout << "==========[test log]Preview stream, 640*480, expected success." << std::endl;
44    // Start stream
45    Test_->intents = {Camera::PREVIEW};
46    Test_->StartStream(Test_->intents);
47    // Get preview
48    Test_->StartCapture(Test_->streamId_preview, Test_->captureId_preview, false, true);
49    // Release stream
50    Test_->captureIds = {Test_->captureId_preview};
51    Test_->streamIds = {Test_->streamId_preview};
52    Test_->StopStream(Test_->captureIds, Test_->streamIds);
53    Test_->StopConsumer(Test_->intents);
54}
55
56/**
57  * @tc.name: Preview
58  * @tc.desc: Preview stream, 1280*960, expected success.
59  * @tc.size: MediumTest
60  * @tc.type: Function
61  */
62HWTEST_F(PreviewTest, Camera_Preview_0004, TestSize.Level2)
63{
64    std::cout << "==========[test log]Preview stream, 1280*960, expected success." << std::endl;
65
66    // Create and get streamOperator information
67    Test_->CreateStreamOperatorCallback();
68    Test_->rc = Test_->cameraDevice->GetStreamOperator(Test_->streamOperatorCallback, Test_->streamOperator);
69    EXPECT_EQ(Test_->rc, Camera::NO_ERROR);
70    // Create data flow
71    Test_->streamInfo = std::make_shared<StreamInfo>();
72    Test_->streamInfo->streamId_ = Test_->streamId_preview;
73    Test_->streamInfo->width_ = 1280;
74    Test_->streamInfo->height_ = 960;
75    Test_->streamInfo->dataspace_ = 8;
76    Test_->StreamInfoFormat();
77    Test_->streamInfo->intent_ = Camera::PREVIEW;
78    std::shared_ptr<OHOS::Camera::Test::StreamConsumer> preview_consumer =
79        std::make_shared<OHOS::Camera::Test::StreamConsumer>();
80#ifdef CAMERA_BUILT_ON_OHOS_LITE
81    Test_->streamInfo->bufferQueue_ = preview_consumer->CreateProducer([this](OHOS::SurfaceBuffer* buffer) {
82        Test_->SaveYUV("preview", buffer->GetVirAddr(), buffer->GetSize());
83    });
84#else
85    Test_->streamInfo->bufferQueue_ = preview_consumer->CreateProducer([this](void* addr, uint32_t size) {
86        Test_->SaveYUV("preview", addr, size);
87    });
88#endif
89    Test_->streamInfo->bufferQueue_->SetQueueSize(8);
90    Test_->consumerMap_[Camera::PREVIEW] = preview_consumer;
91    Test_->streamInfo->tunneledMode_ = 5;
92    std::vector<std::shared_ptr<StreamInfo>>().swap(Test_->streamInfos);
93    Test_->streamInfos.push_back(Test_->streamInfo);
94    Test_->rc = Test_->streamOperator->CreateStreams(Test_->streamInfos);
95    EXPECT_EQ(Test_->rc, Camera::NO_ERROR);
96    // Flow distribution
97    Test_->rc = Test_->streamOperator->CommitStreams(Camera::NORMAL, Test_->ability);
98    EXPECT_EQ(Test_->rc, Camera::NO_ERROR);
99    // Get preview
100    Test_->StartCapture(Test_->streamId_preview, Test_->captureId_preview, false, true);
101    // Release stream
102    Test_->captureIds = {Test_->captureId_preview};
103    Test_->streamIds = {Test_->streamId_preview};
104    Test_->StopStream(Test_->captureIds, Test_->streamIds);
105    Test_->StopConsumer(Test_->intents);
106}
107
108/**
109  * @tc.name: Preview
110  * @tc.desc: GetStreamOperator success.
111  * @tc.size: MediumTest
112  * @tc.type: Function
113  */
114HWTEST_F(PreviewTest, Camera_Preview_0010, TestSize.Level0)
115{
116    std::cout << "==========[test log]GetStreamOperator success." << std::endl;
117    // Create and get streamOperator information
118    Test_->CreateStreamOperatorCallback();
119    Test_->rc = Test_->cameraDevice->GetStreamOperator(Test_->streamOperatorCallback, Test_->streamOperator);
120    EXPECT_EQ(false, Test_->rc != Camera::NO_ERROR || Test_->streamOperator == nullptr);
121}
122
123/**
124  * @tc.name: Preview
125  * @tc.desc: GetStreamOperator, input nullptr.
126  * @tc.size: MediumTest
127  * @tc.type: Function
128  */
129HWTEST_F(PreviewTest, Camera_Preview_0011, TestSize.Level2)
130{
131    std::cout << "==========[test log]GetStreamOperator, input nullptr." << std::endl;
132    // Create and get streamOperator information
133    Test_->rc = Test_->cameraDevice->GetStreamOperator(nullptr, Test_->streamOperator);
134    std::cout << "GetStreamOperator's rc " << Test_->rc << std::endl;
135    EXPECT_EQ(Camera::CamRetCode::INVALID_ARGUMENT, Test_->rc);
136}
137
138/**
139  * @tc.name: Preview
140  * @tc.desc: Preview, CommitStreams Metadata = nullptr.
141  * @tc.size: MediumTest
142  * @tc.type: Function
143  */
144HWTEST_F(PreviewTest, Camera_Preview_0040, TestSize.Level2)
145{
146    std::cout << "==========[test log]Preview, CommitStreams Metadata = nullptr." << std::endl;
147    // Create and get streamOperator information
148    Test_->CreateStreamOperatorCallback();
149    Test_->rc = Test_->cameraDevice->GetStreamOperator(Test_->streamOperatorCallback, Test_->streamOperator);
150    EXPECT_EQ(Test_->rc, Camera::NO_ERROR);
151    // Flow distribution
152    Test_->rc = Test_->streamOperator->CommitStreams(Camera::NORMAL, nullptr);
153    EXPECT_EQ(true, Test_->rc == INVALID_ARGUMENT);
154}
155
156/**
157  * @tc.name: Preview
158  * @tc.desc: Preview, CommitStreams without CreateStreams, expected fail.
159  * @tc.size: MediumTest
160  * @tc.type: Function
161  */
162HWTEST_F(PreviewTest, Camera_Preview_0050, TestSize.Level2)
163{
164    std::cout << "==========[test log]Preview, CommitStreams no CreateStreams, expected fail." << std::endl;
165    // Create and get streamOperator information
166    Test_->CreateStreamOperatorCallback();
167    Test_->rc = Test_->cameraDevice->GetStreamOperator(Test_->streamOperatorCallback, Test_->streamOperator);
168    EXPECT_EQ(Test_->rc, Camera::NO_ERROR);
169    // Flow distribution
170    Test_->rc = Test_->streamOperator->CommitStreams(Camera::NORMAL, Test_->ability);
171    std::cout << "streamOperator->CommitStreams's rc " << Test_->rc << std::endl;
172    EXPECT_EQ(true, Test_->rc == INVALID_ARGUMENT);
173}
174
175/**
176  * @tc.name: Preview
177  * @tc.desc: Preview  and release streams, success.
178  * @tc.size: MediumTest
179  * @tc.type: Function
180  */
181HWTEST_F(PreviewTest, Camera_Preview_0060, TestSize.Level1)
182{
183    std::cout << "==========[test log]Preview  and release streams, success." << std::endl;
184    // Start stream
185    Test_->intents = {Camera::PREVIEW};
186    Test_->StartStream(Test_->intents);
187    // Get preview
188    Test_->StartCapture(Test_->streamId_preview, Test_->captureId_preview, false, true);
189    // Release stream
190    Test_->captureIds = {Test_->captureId_preview};
191    Test_->streamIds = {Test_->streamId_preview};
192    Test_->StopStream(Test_->captureIds, Test_->streamIds);
193    Test_->StopConsumer(Test_->intents);
194}
195
196/**
197  * @tc.name: Preview
198  * @tc.desc: ReleaseStreams no exist streamID, expect success.
199  * @tc.size: MediumTest
200  * @tc.type: Function
201  */
202HWTEST_F(PreviewTest, Camera_Preview_0062, TestSize.Level2)
203{
204    std::cout << "==========[test log]ReleaseStreams no exist streamID, expect success." << std::endl;
205    // Create and get streamOperator information
206    Test_->CreateStreamOperatorCallback();
207    Test_->rc = Test_->cameraDevice->GetStreamOperator(Test_->streamOperatorCallback, Test_->streamOperator);
208    EXPECT_EQ(false, Test_->rc != Camera::NO_ERROR || Test_->streamOperator == nullptr);
209    Test_->streamInfo = std::make_shared<StreamInfo>();
210    Test_->rc = Test_->streamOperator->ReleaseStreams({9999});
211    std::cout << "streamOperator->ReleaseStreams's rc " << Test_->rc << std::endl;
212    EXPECT_EQ(true, Test_->rc == Camera::NO_ERROR);
213}
214
215/**
216  * @tc.name: Preview
217  * @tc.desc: CancelCapture without Create capture.
218  * @tc.size: MediumTest
219  * @tc.type: Function
220  */
221HWTEST_F(PreviewTest, Camera_Preview_0090, TestSize.Level2)
222{
223    std::cout << "==========[test log]CancelCapture without Create capture ." << std::endl;
224    // Start stream
225    Test_->intents = {Camera::PREVIEW};
226    Test_->StartStream(Test_->intents);
227    // Do not capture the preview image, directly cancel the capture
228    int captureId = 100;
229    Test_->rc = Test_->streamOperator->CancelCapture(captureId);
230    EXPECT_EQ(true, Test_->rc == Camera::INVALID_ARGUMENT);
231    if (Test_->rc == Camera::NO_ERROR) {
232        std::cout << "==========[test log]CancelCapture success." << std::endl;
233    } else {
234        std::cout << "==========[test log]CancelCapture fail, rc = " << Test_->rc << std::endl;
235    }
236    // Release stream
237    Test_->rc = Test_->streamOperator->ReleaseStreams({Test_->streamId_preview});
238    EXPECT_EQ(Test_->rc, Camera::NO_ERROR);
239    if (Test_->rc == Camera::NO_ERROR) {
240        std::cout << "==========[test log]ReleaseStreams success." << std::endl;
241    } else {
242        std::cout << "==========[test log]ReleaseStreams fail, rc = " << Test_->rc << std::endl;
243    }
244}
245
246/**
247  * @tc.name: Preview
248  * @tc.desc: Release streams, then creatCapture.
249  * @tc.size: MediumTest
250  * @tc.type: Function
251  */
252HWTEST_F(PreviewTest, Camera_Preview_0091, TestSize.Level2)
253{
254    std::cout << "==========[test log]Create capture, then release streams." << std::endl;
255    // Start stream
256    Test_->intents = {Camera::PREVIEW};
257    Test_->StartStream(Test_->intents);
258    // Release stream
259    Test_->rc = Test_->streamOperator->ReleaseStreams({Test_->streamId_preview});
260    EXPECT_EQ(Test_->rc, Camera::NO_ERROR);
261    if (Test_->rc == Camera::NO_ERROR) {
262        std::cout << "==========[test log]ReleaseStreams success." << std::endl;
263    } else {
264        std::cout << "==========[test log]ReleaseStreams fail, rc = " << Test_->rc << std::endl;
265    }
266
267    // Get preview
268    int captureId = 100;
269    Test_->captureInfo = std::make_shared<CaptureInfo>();
270    Test_->captureInfo->streamIds_ = {Test_->streamId_preview};
271    Test_->captureInfo->captureSetting_ = Test_->ability;
272    Test_->captureInfo->enableShutterCallback_ = false;
273    bool isStreaming = true;
274    Test_->rc = Test_->streamOperator->Capture(captureId, Test_->captureInfo, isStreaming);
275    EXPECT_EQ(Test_->rc, Camera::INVALID_ARGUMENT);
276    // Turn off the device
277    Test_->cameraDevice->Close();
278    std::cout << "cameraDevice->Close" << std::endl;
279}
280
281/**
282  * @tc.name: Preview
283  * @tc.desc: The same CaptureID, Create capture twice, expected failed.
284  * @tc.size: MediumTest
285  * @tc.type: Function
286  */
287HWTEST_F(PreviewTest, Camera_Preview_0092, TestSize.Level2)
288{
289    std::cout << "==========[test log]The same CaptureID, Create capture twice, expected failed." << std::endl;
290    // Start stream
291    Test_->intents = {Camera::PREVIEW};
292    Test_->StartStream(Test_->intents);
293    // Get preview
294    Test_->captureInfo = std::make_shared<Camera::CaptureInfo>();
295    Test_->captureInfo->streamIds_ = {Test_->streamId_preview};
296    Test_->captureInfo->captureSetting_ = Test_->ability;
297    Test_->captureInfo->enableShutterCallback_ = true;
298    // The same captureId, the first time to take a photo
299    Test_->rc = Test_->streamOperator->Capture(Test_->captureId_preview, Test_->captureInfo, true);
300    EXPECT_EQ(true, Test_->rc == Camera::NO_ERROR);
301    if (Test_->rc == Camera::NO_ERROR) {
302        std::cout << "==========[test log]check Capture: Capture success, " << Test_->captureId_preview << std::endl;
303    } else {
304        std::cout << "==========[test log]check Capture: Capture fail, rc = " << Test_->rc << std::endl;
305    }
306    sleep(1);
307    // The same captureId, take the second photo
308    Test_->rc = Test_->streamOperator->Capture(Test_->captureId_preview, Test_->captureInfo, true);
309    EXPECT_EQ(false, Test_->rc == Camera::NO_ERROR);
310    if (Test_->rc == Camera::NO_ERROR) {
311        std::cout << "==========[test log]check Capture: Capture success, " << Test_->captureId_preview << std::endl;
312    } else {
313        std::cout << "==========[test log]check Capture: Capture fail, rc = " << Test_->rc << std::endl;
314    }
315    sleep(1);
316    Test_->rc = Test_->streamOperator->CancelCapture(Test_->captureId_preview);
317    EXPECT_EQ(true, Test_->rc == Camera::NO_ERROR);
318    if (Test_->rc == Camera::NO_ERROR) {
319        std::cout << "======[test log]check Capture: CancelCapture success," << Test_->captureId_preview << std::endl;
320    } else {
321        std::cout << "==========[test log]check Capture: CancelCapture fail, rc = " << Test_->rc << std::endl;
322        std::cout << "captureId = " << Test_->captureId_preview << std::endl;
323    }
324    // Release stream
325    Test_->streamIds = {Test_->streamId_preview};
326    std::cout << "Test_->streamIds size = " << Test_->streamIds.size() << std::endl;
327    Test_->rc = Test_->streamOperator->ReleaseStreams(Test_->streamIds);
328    if (Test_->rc == Camera::NO_ERROR) {
329        std::cout << "==========[test log]check Capture: ReleaseStreams success." << std::endl;
330    } else {
331        std::cout << "==========[test log]check Capture: ReleaseStreams fail, rc = " << Test_->rc << std::endl;
332    }
333    EXPECT_EQ(true, Test_->rc == Camera::NO_ERROR);
334}
335
336/**
337  * @tc.name: Preview
338  * @tc.desc: Different captureIDs, Create capture,expected success.
339  * @tc.size: MediumTest
340  * @tc.type: Function
341  */
342HWTEST_F(PreviewTest, Camera_Preview_0093, TestSize.Level2)
343{
344    std::cout << "==========[test log]Different captureIDs, Create capture,expected success." << std::endl;
345    // Start stream
346    Test_->intents = {Camera::PREVIEW};
347    Test_->StartStream(Test_->intents);
348    // Get preview
349    Test_->StartCapture(Test_->streamId_preview, Test_->captureId_preview, false, false);
350    Test_->StartCapture(Test_->streamId_preview, Test_->captureId_capture, false, false);
351    // Release stream
352    Test_->captureIds = {};
353    Test_->streamIds = {Test_->streamId_preview};
354    Test_->StopStream(Test_->captureIds, Test_->streamIds);
355    Test_->StopConsumer(Test_->intents);
356}
357