blob: e148ee5cf5f98813a3d3b9ddc0dfcccf9c8a787a [file] [log] [blame]
Don Turner94fe4852018-07-03 08:42:09 +01001/*
2 * Copyright 2018 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Don Turnerff649d02018-07-04 18:35:02 +010017/*
18 * TODO:
19 Create test runner APK
20 Remove hardcoded ANDROID_NDK from cmake config
21 */
Don Turner94fe4852018-07-03 08:42:09 +010022
23#include <gtest/gtest.h>
Don Turnerff649d02018-07-04 18:35:02 +010024#include <oboe/Oboe.h>
Don Turner94fe4852018-07-03 08:42:09 +010025
26using namespace oboe;
27
Don Turnerff649d02018-07-04 18:35:02 +010028class MyCallback : public AudioStreamCallback {
29public:
30 DataCallbackResult onAudioReady(AudioStream *oboeStream, void *audioData, int32_t numFrames) override {
31 return DataCallbackResult::Continue;
32 }
33};
34
35
36
Don Turner94fe4852018-07-03 08:42:09 +010037class StreamClosedReturnValues : public ::testing::Test {
38
Don Turnerff649d02018-07-04 18:35:02 +010039protected:
Don Turner94fe4852018-07-03 08:42:09 +010040
Don Turnerff649d02018-07-04 18:35:02 +010041 void SetUp(){
42
43 }
44
45 bool openStream(){
46 Result r = mBuilder.openStream(&mStream);
47 EXPECT_EQ(r, Result::OK) << "Failed to open stream " << convertToText(r);
48 return (r == Result::OK);
49 }
50
51 void closeStream(){
52 Result r = mStream->close();
53 if (r != Result::OK){
54 FAIL() << "Failed to close stream. " << convertToText(r);
55 }
56 }
57
58 void openAndCloseStream(){
59
60 openStream();
61 closeStream();
62 ASSERT_EQ(mStream->getState(), StreamState::Closed) << "Stream state " << convertToText(mStream->getState());
63 }
64
65 AudioStreamBuilder mBuilder;
66 AudioStream *mStream = nullptr;
Don Turner94fe4852018-07-03 08:42:09 +010067
68};
69
70TEST_F(StreamClosedReturnValues, GetChannelCountReturnsLastKnownValue){
71
Don Turnerff649d02018-07-04 18:35:02 +010072 mBuilder.setChannelCount(2);
73 openAndCloseStream();
74 ASSERT_EQ(mStream->getChannelCount(), 2);
75}
76
77TEST_F(StreamClosedReturnValues, GetDirectionReturnsLastKnownValue){
78
79 // Note that when testing on the emulator setting the direction to Input will result in ErrorInternal when
80 // opening the stream
81 mBuilder.setDirection(Direction::Input);
82 openAndCloseStream();
83 ASSERT_EQ(mStream->getDirection(), Direction::Input);
84}
85
86TEST_F(StreamClosedReturnValues, GetSampleRateReturnsLastKnownValue){
87
88 mBuilder.setSampleRate(8000);
89 openAndCloseStream();
90 ASSERT_EQ(mStream->getSampleRate(), 8000);
91}
92
93TEST_F(StreamClosedReturnValues, GetFramesPerCallbackReturnsLastKnownValue) {
94
95 mBuilder.setFramesPerCallback(192);
96 openAndCloseStream();
97 ASSERT_EQ(mStream->getFramesPerCallback(), 192);
98}
99
100TEST_F(StreamClosedReturnValues, GetFormatReturnsLastKnownValue) {
101
102 mBuilder.setFormat(AudioFormat::I16);
103 openAndCloseStream();
104 ASSERT_EQ(mStream->getFormat(), AudioFormat::I16);
105}
106
107TEST_F(StreamClosedReturnValues, GetBufferSizeInFramesReturnsLastKnownValue) {
108
109 openStream();
110 int32_t bufferSize = mStream->getBufferSizeInFrames();
111 closeStream();
112 ASSERT_EQ(mStream->getBufferSizeInFrames(), bufferSize);
113}
114
115TEST_F(StreamClosedReturnValues, GetBufferCapacityInFramesReturnsLastKnownValue) {
116
117 openStream();
118 int32_t bufferCapacity = mStream->getBufferCapacityInFrames();
119 closeStream();
120 ASSERT_EQ(mStream->getBufferCapacityInFrames(), bufferCapacity);
121}
122
123TEST_F(StreamClosedReturnValues, GetSharingModeReturnsLastKnownValue) {
124
125 openStream();
126 SharingMode s = mStream->getSharingMode();
127 closeStream();
128 ASSERT_EQ(mStream->getSharingMode(), s);
129}
130
131TEST_F(StreamClosedReturnValues, GetPerformanceModeReturnsLastKnownValue) {
132
133 openStream();
134 PerformanceMode p = mStream->getPerformanceMode();
135 closeStream();
136 ASSERT_EQ(mStream->getPerformanceMode(), p);
137}
138
139TEST_F(StreamClosedReturnValues, GetDeviceIdReturnsLastKnownValue) {
140
141 openStream();
142 int32_t d = mStream->getDeviceId();
143 closeStream();
144 ASSERT_EQ(mStream->getDeviceId(), d);
145}
146
147TEST_F(StreamClosedReturnValues, GetCallbackReturnsLastKnownValue) {
148
149 AudioStreamCallback *callback = new MyCallback();
150 mBuilder.setCallback(callback);
151 openAndCloseStream();
152
153 AudioStreamCallback *callback2 = mStream->getCallback();
154 ASSERT_EQ(callback, callback2);
155}
156
157TEST_F(StreamClosedReturnValues, GetUsageReturnsLastKnownValue){
158 openStream();
159 Usage u = mStream->getUsage();
160 closeStream();
161 ASSERT_EQ(mStream->getUsage(), u);
162}
163
164TEST_F(StreamClosedReturnValues, GetContentTypeReturnsLastKnownValue){
165 openStream();
166 ContentType c = mStream->getContentType();
167 closeStream();
168 ASSERT_EQ(mStream->getContentType(), c);
169}
170
171TEST_F(StreamClosedReturnValues, GetInputPresetReturnsLastKnownValue){
172 openStream();
173 auto i = mStream->getInputPreset();
174 closeStream();
175 ASSERT_EQ(mStream->getInputPreset(), i);
176}
177
178TEST_F(StreamClosedReturnValues, GetSessionIdReturnsLastKnownValue){
179 openStream();
180 auto s = mStream->getSessionId();
181 closeStream();
182 ASSERT_EQ(mStream->getSessionId(), s);
183}
184
185TEST_F(StreamClosedReturnValues, StreamStateIsClosed){
186 openAndCloseStream();
187 ASSERT_EQ(mStream->getState(), StreamState::Closed);
188}
189
190TEST_F(StreamClosedReturnValues, GetXRunCountReturnsLastKnownValue){
191
192 openStream();
193 if (mStream->isXRunCountSupported()){
194 auto i = mStream->getXRunCount();
195 ASSERT_EQ(mStream->getXRunCount(), i);
196 }
197 closeStream();
198}
199
200TEST_F(StreamClosedReturnValues, GetFramesPerBurstReturnsLastKnownValue){
201
202 openStream();
203 auto f = mStream->getFramesPerBurst();
204 closeStream();
205 ASSERT_EQ(mStream->getFramesPerBurst(), f);
206}
207
208TEST_F(StreamClosedReturnValues, IsPlayingReturnsFalse){
209
210 openAndCloseStream();
211 ASSERT_FALSE(mStream->isPlaying());
212}
213
214TEST_F(StreamClosedReturnValues, GetBytesPerFrameReturnsLastKnownValue){
215 openStream();
216 auto f = mStream->getBytesPerFrame();
217 closeStream();
218 ASSERT_EQ(mStream->getBytesPerFrame(), f);
219}
220
221TEST_F(StreamClosedReturnValues, GetBytesPerSampleReturnsLastKnownValue){
222 openStream();
223 auto f = mStream->getBytesPerSample();
224 closeStream();
225 ASSERT_EQ(mStream->getBytesPerSample(), f);
226}
227
228TEST_F(StreamClosedReturnValues, GetFramesWrittenReturnsLastKnownValue){
229 mBuilder.setFormat(AudioFormat::I16);
230 mBuilder.setChannelCount(1);
231 openStream();
232 mStream->start();
233
234 int16_t buffer[4] = { 1, 2, 3, 4 };
235 Result r = mStream->write(&buffer, 4, 0);
236 if (r != Result::OK){
237 FAIL() << "Could not write to audio stream";
238 }
239
240 auto f = mStream->getFramesWritten();
241 ASSERT_EQ(f, 4);
242
243 closeStream();
244 ASSERT_EQ(mStream->getFramesWritten(), f);
245}
246
247// TODO: Reading a positive value doesn't work on OpenSL ES in this test - why?
248TEST_F(StreamClosedReturnValues, GetFramesReadReturnsLastKnownValue) {
249
250 mBuilder.setDirection(Direction::Input);
251 mBuilder.setFormat(AudioFormat::I16);
252 mBuilder.setChannelCount(1);
253
254 if (openStream()){
255 mStream->start();
256
257/*
258 int16_t buffer[192];
259 auto r = mStream->read(&buffer, 192, 0);
260 ASSERT_EQ(r.value(), 192);
261*/
262
263 auto f = mStream->getFramesRead();
264// ASSERT_EQ(f, 192);
265
266 closeStream();
267 ASSERT_EQ(mStream->getFramesRead(), f);
268 };
269}
270
271TEST_F(StreamClosedReturnValues, GetTimestampReturnsErrorClosedIfSupported){
272
273 openStream();
274
275 int64_t framePosition;
276 int64_t presentationTime;
277
278 auto r = mStream->getTimestamp(CLOCK_MONOTONIC, &framePosition, &presentationTime);
279 bool isTimestampSupported = (r == Result::OK);
280
281 closeStream();
282
283 if (isTimestampSupported){
284 ASSERT_EQ(mStream->getTimestamp(CLOCK_MONOTONIC, &framePosition, &presentationTime), Result::ErrorClosed);
285 }
286}
287
288TEST_F(StreamClosedReturnValues, GetAudioApiReturnsLastKnownValue){
289 openStream();
290 AudioApi a = mStream->getAudioApi();
291 closeStream();
292 ASSERT_EQ(mStream->getAudioApi(), a);
293}
294
295TEST_F(StreamClosedReturnValues, GetUsesAAudioReturnsLastKnownValue){
296 openStream();
297 bool a = mStream->usesAAudio();
298 closeStream();
299 ASSERT_EQ(mStream->usesAAudio(), a);
300}
301
302TEST_F(StreamClosedReturnValues, StreamStateControlsReturnClosed){
303
304 openAndCloseStream();
305 EXPECT_EQ(mStream->close(), Result::ErrorClosed);
306 EXPECT_EQ(mStream->start(), Result::ErrorClosed);
307 EXPECT_EQ(mStream->pause(), Result::ErrorClosed);
308 EXPECT_EQ(mStream->flush(), Result::ErrorClosed);
309 EXPECT_EQ(mStream->stop(), Result::ErrorClosed);
310 EXPECT_EQ(mStream->requestStart(), Result::ErrorClosed);
311 EXPECT_EQ(mStream->requestPause(), Result::ErrorClosed);
312 EXPECT_EQ(mStream->requestFlush(), Result::ErrorClosed);
313 EXPECT_EQ(mStream->requestStop(), Result::ErrorClosed);
314}
315
316TEST_F(StreamClosedReturnValues, WaitForStateChangeReturnsClosed){
317
318 openAndCloseStream();
319 StreamState next;
320 ASSERT_EQ(mStream->waitForStateChange(StreamState::Open, &next, 0), Result::ErrorClosed);
321}