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