1fa7767c5Sopenharmony_ci/*
2fa7767c5Sopenharmony_ci * Copyright (c) 2023-2023 Huawei Device Co., Ltd.
3fa7767c5Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4fa7767c5Sopenharmony_ci * you may not use this file except in compliance with the License.
5fa7767c5Sopenharmony_ci * You may obtain a copy of the License at
6fa7767c5Sopenharmony_ci *
7fa7767c5Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8fa7767c5Sopenharmony_ci *
9fa7767c5Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10fa7767c5Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11fa7767c5Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12fa7767c5Sopenharmony_ci * See the License for the specific language governing permissions and
13fa7767c5Sopenharmony_ci * limitations under the License.
14fa7767c5Sopenharmony_ci */
15fa7767c5Sopenharmony_ci
16fa7767c5Sopenharmony_ci#include "gtest/gtest.h"
17fa7767c5Sopenharmony_ci#include "plugin/common/any.h"
18fa7767c5Sopenharmony_ci#include "plugin/plugins/source/audio_capture/audio_capture_plugin.h"
19fa7767c5Sopenharmony_ci#include "plugin/plugins/source/audio_capture/audio_type_translate.h"
20fa7767c5Sopenharmony_ci
21fa7767c5Sopenharmony_ciusing namespace testing::ext;
22fa7767c5Sopenharmony_ci
23fa7767c5Sopenharmony_cinamespace OHOS {
24fa7767c5Sopenharmony_cinamespace Media {
25fa7767c5Sopenharmony_cinamespace Test {
26fa7767c5Sopenharmony_ciusing namespace Plugin;
27fa7767c5Sopenharmony_ciusing namespace AuCapturePlugin;
28fa7767c5Sopenharmony_ciusing namespace AudioStandard;
29fa7767c5Sopenharmony_ci
30fa7767c5Sopenharmony_ci#define MAX_TYPE 9
31fa7767c5Sopenharmony_ci#define MP4_URL "http://www.w3school.com.cn/i/movie.mp4"
32fa7767c5Sopenharmony_ci
33fa7767c5Sopenharmony_ciclass AudioCaptureCallback : public Callback {
34fa7767c5Sopenharmony_cipublic:
35fa7767c5Sopenharmony_ci    void OnEvent(const PluginEvent &event)
36fa7767c5Sopenharmony_ci    {
37fa7767c5Sopenharmony_ci        ASSERT_TRUE(static_cast<int>(event.type) >= 0);
38fa7767c5Sopenharmony_ci        ASSERT_TRUE(static_cast<int>(event.type) <= MAX_TYPE);
39fa7767c5Sopenharmony_ci    }
40fa7767c5Sopenharmony_ci};
41fa7767c5Sopenharmony_ci
42fa7767c5Sopenharmony_ciHWTEST(AudioCaptureTest, testAudioCapturePluginErrorBranch, TestSize.Level1)
43fa7767c5Sopenharmony_ci{
44fa7767c5Sopenharmony_ci    auto str = std::make_shared<std::string>("audio");
45fa7767c5Sopenharmony_ci    auto audioCapture = std::make_shared<AudioCapturePlugin>(str->c_str());
46fa7767c5Sopenharmony_ci    ASSERT_TRUE(audioCapture != nullptr);
47fa7767c5Sopenharmony_ci
48fa7767c5Sopenharmony_ci    auto status = audioCapture->Init();
49fa7767c5Sopenharmony_ci    ASSERT_TRUE(status == Status::OK);
50fa7767c5Sopenharmony_ci
51fa7767c5Sopenharmony_ci    auto prepareStatus = audioCapture->Prepare();
52fa7767c5Sopenharmony_ci    ASSERT_TRUE(prepareStatus == Status::OK);
53fa7767c5Sopenharmony_ci
54fa7767c5Sopenharmony_ci    auto deInitStatus = audioCapture->Deinit();
55fa7767c5Sopenharmony_ci    ASSERT_TRUE(deInitStatus == Status::OK);
56fa7767c5Sopenharmony_ci
57fa7767c5Sopenharmony_ci    auto resetStatus = audioCapture->Reset();
58fa7767c5Sopenharmony_ci    ASSERT_FALSE(resetStatus == Status::OK);
59fa7767c5Sopenharmony_ci
60fa7767c5Sopenharmony_ci    auto prepare = audioCapture->Prepare();
61fa7767c5Sopenharmony_ci    ASSERT_FALSE(prepare == Status::OK);
62fa7767c5Sopenharmony_ci
63fa7767c5Sopenharmony_ci    auto startStatus = audioCapture->Start();
64fa7767c5Sopenharmony_ci    ASSERT_FALSE(startStatus == Status::OK);
65fa7767c5Sopenharmony_ci
66fa7767c5Sopenharmony_ci    auto stopStatus = audioCapture->Stop();
67fa7767c5Sopenharmony_ci    ASSERT_TRUE(stopStatus == Status::OK);
68fa7767c5Sopenharmony_ci}
69fa7767c5Sopenharmony_ci
70fa7767c5Sopenharmony_ciHWTEST(AudioCaptureTest, testAudioCapturePluginStart, TestSize.Level1)
71fa7767c5Sopenharmony_ci{
72fa7767c5Sopenharmony_ci    auto str = std::make_shared<std::string>("audio");
73fa7767c5Sopenharmony_ci    auto audioCapture = std::make_shared<AudioCapturePlugin>(str->c_str());
74fa7767c5Sopenharmony_ci    ASSERT_TRUE(audioCapture != nullptr);
75fa7767c5Sopenharmony_ci
76fa7767c5Sopenharmony_ci    audioCapture->SetParameter(Tag::AUDIO_SAMPLE_RATE, AudioSamplingRate::SAMPLE_RATE_44100);
77fa7767c5Sopenharmony_ci    audioCapture->SetParameter(Tag::AUDIO_CHANNELS, STEREO);
78fa7767c5Sopenharmony_ci    audioCapture->SetParameter(Tag::MEDIA_BITRATE, 3000);
79fa7767c5Sopenharmony_ci    audioCapture->SetParameter(Tag::AUDIO_SAMPLE_FORMAT, SAMPLE_S32LE);
80fa7767c5Sopenharmony_ci    audioCapture->SetParameter(Tag::APP_TOKEN_ID, 2000);
81fa7767c5Sopenharmony_ci    audioCapture->SetParameter(Tag::APP_UID, 300);
82fa7767c5Sopenharmony_ci    audioCapture->SetParameter(Tag::APP_PID, 1000);
83fa7767c5Sopenharmony_ci    audioCapture->SetParameter(Tag::AUDIO_SAMPLE_PER_FRAME, 60);
84fa7767c5Sopenharmony_ci
85fa7767c5Sopenharmony_ci    auto initStatus = audioCapture->Init();
86fa7767c5Sopenharmony_ci    ASSERT_TRUE(initStatus == Status::OK);
87fa7767c5Sopenharmony_ci
88fa7767c5Sopenharmony_ci    auto prepareSt = audioCapture->Prepare();
89fa7767c5Sopenharmony_ci    ASSERT_TRUE(prepareSt == Status::OK);
90fa7767c5Sopenharmony_ci
91fa7767c5Sopenharmony_ci    auto resetStatus2 = audioCapture->Reset();
92fa7767c5Sopenharmony_ci    ASSERT_TRUE(resetStatus2 == Status::OK);
93fa7767c5Sopenharmony_ci
94fa7767c5Sopenharmony_ci    auto stopStatus2 = audioCapture->Stop();
95fa7767c5Sopenharmony_ci    ASSERT_TRUE(stopStatus2 == Status::OK);
96fa7767c5Sopenharmony_ci
97fa7767c5Sopenharmony_ci    auto startStatus2 = audioCapture->Start();
98fa7767c5Sopenharmony_ci    ASSERT_TRUE(startStatus2 == Status::ERROR_UNKNOWN);
99fa7767c5Sopenharmony_ci
100fa7767c5Sopenharmony_ci    auto source = std::make_shared<MediaSource>(MP4_URL);
101fa7767c5Sopenharmony_ci    auto sourceSt = audioCapture->SetSource(source);
102fa7767c5Sopenharmony_ci    ASSERT_TRUE(sourceSt == Status::ERROR_UNIMPLEMENTED);
103fa7767c5Sopenharmony_ci
104fa7767c5Sopenharmony_ci    AudioCaptureCallback pluginCallback {};
105fa7767c5Sopenharmony_ci    auto audioSt = audioCapture->SetCallback(&pluginCallback);
106fa7767c5Sopenharmony_ci    ASSERT_TRUE(audioSt == Status::ERROR_UNIMPLEMENTED);
107fa7767c5Sopenharmony_ci
108fa7767c5Sopenharmony_ci    auto prepareSt2 = audioCapture->Prepare();
109fa7767c5Sopenharmony_ci    ASSERT_TRUE(prepareSt2 == Status::OK);
110fa7767c5Sopenharmony_ci
111fa7767c5Sopenharmony_ci    auto startStatus3 = audioCapture->Start();
112fa7767c5Sopenharmony_ci    ASSERT_TRUE(startStatus3 == Status::ERROR_UNKNOWN);
113fa7767c5Sopenharmony_ci}
114fa7767c5Sopenharmony_ci
115fa7767c5Sopenharmony_ciHWTEST(AudioCaptureTest, testAudioCapturePlugin, TestSize.Level1)
116fa7767c5Sopenharmony_ci{
117fa7767c5Sopenharmony_ci    auto str = std::make_shared<std::string>("audio");
118fa7767c5Sopenharmony_ci    auto audioCapture = std::make_shared<AudioCapturePlugin>(str->c_str());
119fa7767c5Sopenharmony_ci    ASSERT_TRUE(audioCapture != nullptr);
120fa7767c5Sopenharmony_ci
121fa7767c5Sopenharmony_ci    auto initStatus = audioCapture->Init();
122fa7767c5Sopenharmony_ci    ASSERT_TRUE(initStatus == Status::OK);
123fa7767c5Sopenharmony_ci
124fa7767c5Sopenharmony_ci    audioCapture->SetParameter(Tag::AUDIO_SAMPLE_RATE, AudioSamplingRate::SAMPLE_RATE_8000);
125fa7767c5Sopenharmony_ci    audioCapture->SetParameter(Tag::AUDIO_CHANNELS, MONO);
126fa7767c5Sopenharmony_ci    audioCapture->SetParameter(Tag::MEDIA_BITRATE, 16666);
127fa7767c5Sopenharmony_ci    audioCapture->SetParameter(Tag::AUDIO_SAMPLE_FORMAT, SAMPLE_S16LE);
128fa7767c5Sopenharmony_ci    audioCapture->SetParameter(Tag::APP_TOKEN_ID, 100000);
129fa7767c5Sopenharmony_ci    audioCapture->SetParameter(Tag::APP_UID, 200);
130fa7767c5Sopenharmony_ci    audioCapture->SetParameter(Tag::APP_PID, 100);
131fa7767c5Sopenharmony_ci    audioCapture->SetParameter(Tag::AUDIO_SAMPLE_PER_FRAME, 30);
132fa7767c5Sopenharmony_ci
133fa7767c5Sopenharmony_ci    auto source = std::make_shared<MediaSource>(MP4_URL);
134fa7767c5Sopenharmony_ci    auto sourceSt = audioCapture->SetSource(source);
135fa7767c5Sopenharmony_ci    ASSERT_TRUE(sourceSt == Status::ERROR_UNIMPLEMENTED);
136fa7767c5Sopenharmony_ci
137fa7767c5Sopenharmony_ci    auto prepareSt2 = audioCapture->Prepare();
138fa7767c5Sopenharmony_ci    ASSERT_TRUE(prepareSt2 == Status::OK);
139fa7767c5Sopenharmony_ci
140fa7767c5Sopenharmony_ci    auto startStatus3 = audioCapture->Start();
141fa7767c5Sopenharmony_ci    ASSERT_TRUE(startStatus3 == Status::ERROR_UNKNOWN);
142fa7767c5Sopenharmony_ci
143fa7767c5Sopenharmony_ci    uint64_t size;
144fa7767c5Sopenharmony_ci    auto sizeStatus = audioCapture->GetSize(size);
145fa7767c5Sopenharmony_ci    ASSERT_TRUE(size == 1024);
146fa7767c5Sopenharmony_ci    ASSERT_TRUE(sizeStatus == Status::OK);
147fa7767c5Sopenharmony_ci
148fa7767c5Sopenharmony_ci    std::shared_ptr<Buffer> buffer = std::make_shared<Buffer>(BufferMetaType::AUDIO);
149fa7767c5Sopenharmony_ci    size_t expectedLe = 10;
150fa7767c5Sopenharmony_ci    auto readStatus = audioCapture->Read(buffer, expectedLe);
151fa7767c5Sopenharmony_ci    ASSERT_TRUE(readStatus == Status::ERROR_AGAIN);
152fa7767c5Sopenharmony_ci
153fa7767c5Sopenharmony_ci    Seekable seekable = audioCapture->GetSeekable();
154fa7767c5Sopenharmony_ci    ASSERT_EQ(Seekable::UNSEEKABLE, seekable);
155fa7767c5Sopenharmony_ci    Status seekSt = audioCapture->SeekToPos(300);
156fa7767c5Sopenharmony_ci    ASSERT_EQ(seekSt, Status::ERROR_UNIMPLEMENTED);
157fa7767c5Sopenharmony_ci
158fa7767c5Sopenharmony_ci    auto deInitStatus = audioCapture->Deinit();
159fa7767c5Sopenharmony_ci    ASSERT_TRUE(deInitStatus == Status::OK);
160fa7767c5Sopenharmony_ci}
161fa7767c5Sopenharmony_ci
162fa7767c5Sopenharmony_ciHWTEST(AudioCaptureTest, testGetParams, TestSize.Level1)
163fa7767c5Sopenharmony_ci{
164fa7767c5Sopenharmony_ci    auto str = std::make_shared<std::string>("audio");
165fa7767c5Sopenharmony_ci    auto audioCapture = std::make_shared<AudioCapturePlugin>(str->c_str());
166fa7767c5Sopenharmony_ci    ASSERT_TRUE(audioCapture != nullptr);
167fa7767c5Sopenharmony_ci
168fa7767c5Sopenharmony_ci    ValueType value;
169fa7767c5Sopenharmony_ci    audioCapture->GetParameter(Tag::AUDIO_SAMPLE_RATE, value);
170fa7767c5Sopenharmony_ci
171fa7767c5Sopenharmony_ci    auto initStatus = audioCapture->Init();
172fa7767c5Sopenharmony_ci    ASSERT_TRUE(initStatus == Status::OK);
173fa7767c5Sopenharmony_ci
174fa7767c5Sopenharmony_ci    audioCapture->SetParameter(Tag::AUDIO_SAMPLE_RATE, AudioSamplingRate::SAMPLE_RATE_8000);
175fa7767c5Sopenharmony_ci    audioCapture->SetParameter(Tag::AUDIO_CHANNELS, MONO);
176fa7767c5Sopenharmony_ci    audioCapture->SetParameter(Tag::MEDIA_BITRATE, 16666);
177fa7767c5Sopenharmony_ci    audioCapture->SetParameter(Tag::AUDIO_SAMPLE_FORMAT, SAMPLE_S16LE);
178fa7767c5Sopenharmony_ci    audioCapture->SetParameter(Tag::APP_TOKEN_ID, 100000);
179fa7767c5Sopenharmony_ci    audioCapture->SetParameter(Tag::APP_UID, 200);
180fa7767c5Sopenharmony_ci    audioCapture->SetParameter(Tag::APP_PID, 100);
181fa7767c5Sopenharmony_ci    audioCapture->SetParameter(Tag::AUDIO_SAMPLE_PER_FRAME, 30);
182fa7767c5Sopenharmony_ci
183fa7767c5Sopenharmony_ci    audioCapture->GetParameter(Tag::AUDIO_SAMPLE_RATE, value);
184fa7767c5Sopenharmony_ci    ASSERT_TRUE(value.HasValue());
185fa7767c5Sopenharmony_ci
186fa7767c5Sopenharmony_ci    audioCapture->GetParameter(Tag::AUDIO_CHANNELS, value);
187fa7767c5Sopenharmony_ci    ASSERT_TRUE(value.HasValue());
188fa7767c5Sopenharmony_ci
189fa7767c5Sopenharmony_ci    audioCapture->GetParameter(Tag::MEDIA_BITRATE, value);
190fa7767c5Sopenharmony_ci    ASSERT_TRUE(value.HasValue());
191fa7767c5Sopenharmony_ci
192fa7767c5Sopenharmony_ci    audioCapture->GetParameter(Tag::AUDIO_SAMPLE_FORMAT, value);
193fa7767c5Sopenharmony_ci    ASSERT_TRUE(value.HasValue());
194fa7767c5Sopenharmony_ci
195fa7767c5Sopenharmony_ci    audioCapture->GetParameter(Tag::AUDIO_CHANNEL_LAYOUT, value);
196fa7767c5Sopenharmony_ci    ASSERT_TRUE(value.HasValue());
197fa7767c5Sopenharmony_ci
198fa7767c5Sopenharmony_ci    audioCapture->GetParameter(Tag::AUDIO_OUTPUT_CHANNELS, value);
199fa7767c5Sopenharmony_ci    ASSERT_TRUE(value.HasValue());
200fa7767c5Sopenharmony_ci
201fa7767c5Sopenharmony_ci    audioCapture->GetParameter(Tag::AUDIO_SAMPLE_RATE, value);
202fa7767c5Sopenharmony_ci    ASSERT_TRUE(value.HasValue());
203fa7767c5Sopenharmony_ci}
204fa7767c5Sopenharmony_ci
205fa7767c5Sopenharmony_ciHWTEST(AudioTypeTranslateTest, testSampleRateNum2Enum, TestSize.Level1)
206fa7767c5Sopenharmony_ci{
207fa7767c5Sopenharmony_ci    AudioSamplingRate val;
208fa7767c5Sopenharmony_ci    auto res = SampleRateNum2Enum(8000, val);
209fa7767c5Sopenharmony_ci    ASSERT_TRUE(val == AudioStandard::SAMPLE_RATE_8000);
210fa7767c5Sopenharmony_ci    ASSERT_TRUE(res);
211fa7767c5Sopenharmony_ci
212fa7767c5Sopenharmony_ci    auto res2 = SampleRateNum2Enum(9000, val);
213fa7767c5Sopenharmony_ci    ASSERT_FALSE(res2);
214fa7767c5Sopenharmony_ci
215fa7767c5Sopenharmony_ci    OHOS::AudioStandard::AudioSampleFormat aFmt;
216fa7767c5Sopenharmony_ci    auto sampleRes = PluginFmt2SampleFmt(AudioSampleFormat::S16, aFmt);
217fa7767c5Sopenharmony_ci    ASSERT_EQ(aFmt, AudioStandard::SAMPLE_S16LE);
218fa7767c5Sopenharmony_ci    ASSERT_TRUE(sampleRes);
219fa7767c5Sopenharmony_ci
220fa7767c5Sopenharmony_ci    auto sampleRes2 = PluginFmt2SampleFmt(AudioSampleFormat::S24P, aFmt);
221fa7767c5Sopenharmony_ci    ASSERT_FALSE(sampleRes2);
222fa7767c5Sopenharmony_ci
223fa7767c5Sopenharmony_ci    OHOS::AudioStandard::AudioChannel enumVal;
224fa7767c5Sopenharmony_ci    auto channelRes = ChannelNumNum2Enum(1, enumVal);
225fa7767c5Sopenharmony_ci    ASSERT_EQ(enumVal, AudioStandard::MONO);
226fa7767c5Sopenharmony_ci    ASSERT_TRUE(channelRes);
227fa7767c5Sopenharmony_ci
228fa7767c5Sopenharmony_ci    auto channelRes2 = ChannelNumNum2Enum(3, enumVal);
229fa7767c5Sopenharmony_ci    ASSERT_FALSE(channelRes2);
230fa7767c5Sopenharmony_ci
231fa7767c5Sopenharmony_ci    auto status = Error2Status(OHOS::ERR_OK);
232fa7767c5Sopenharmony_ci    ASSERT_EQ(status, Status::OK);
233fa7767c5Sopenharmony_ci
234fa7767c5Sopenharmony_ci    auto status2 = Error2Status(OHOS::ERR_OVERFLOW);
235fa7767c5Sopenharmony_ci    ASSERT_EQ(status2, Status::ERROR_UNKNOWN);
236fa7767c5Sopenharmony_ci
237fa7767c5Sopenharmony_ci    auto status3 = Error2Status(30);
238fa7767c5Sopenharmony_ci    ASSERT_EQ(status3, Status::ERROR_UNKNOWN);
239fa7767c5Sopenharmony_ci}
240fa7767c5Sopenharmony_ci
241fa7767c5Sopenharmony_ci} // namespace Test
242fa7767c5Sopenharmony_ci} // namespace Media
243fa7767c5Sopenharmony_ci} // namespace OHOS
244