Fix stream states for OpenSL ES
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 1328719..f732e08 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -18,6 +18,7 @@
add_executable(testOboe
testUtilities.cpp
testStreamClosedMethods.cpp
+ testStreamStates.cpp
testXRunBehaviour.cpp
)
target_link_libraries(testOboe gtest oboe)
diff --git a/tests/testStreamClosedMethods.cpp b/tests/testStreamClosedMethods.cpp
index 4ca5797..2b48212 100644
--- a/tests/testStreamClosedMethods.cpp
+++ b/tests/testStreamClosedMethods.cpp
@@ -296,8 +296,10 @@
TEST_F(StreamClosedReturnValues, StreamStateControlsReturnClosed){
openAndCloseStream();
- EXPECT_EQ(mStream->close(), Result::ErrorClosed);
- EXPECT_EQ(mStream->start(), Result::ErrorClosed);
+ Result r = mStream->close();
+ EXPECT_EQ(r, Result::ErrorClosed) << convertToText(r);
+ r = mStream->start();
+ EXPECT_EQ(r, Result::ErrorClosed) << convertToText(r);
EXPECT_EQ(mStream->pause(), Result::ErrorClosed);
EXPECT_EQ(mStream->flush(), Result::ErrorClosed);
EXPECT_EQ(mStream->stop(), Result::ErrorClosed);
diff --git a/tests/testStreamStates.cpp b/tests/testStreamStates.cpp
new file mode 100644
index 0000000..c6eb8d5
--- /dev/null
+++ b/tests/testStreamStates.cpp
@@ -0,0 +1,115 @@
+/*
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <gtest/gtest.h>
+#include <oboe/Oboe.h>
+
+using namespace oboe;
+
+class StreamStates : public ::testing::Test {
+
+protected:
+
+ void SetUp(){
+
+ }
+
+ bool openStream(){
+ Result r = mBuilder.openStream(&mStream);
+ EXPECT_EQ(r, Result::OK) << "Failed to open stream " << convertToText(r);
+ return (r == Result::OK);
+ }
+
+ void closeStream(){
+ Result r = mStream->close();
+ if (r != Result::OK){
+ FAIL() << "Failed to close stream. " << convertToText(r);
+ }
+ }
+
+ void openAndCloseStream(){
+
+ openStream();
+ closeStream();
+ ASSERT_EQ(mStream->getState(), StreamState::Closed) << "Stream state " << convertToText(mStream->getState());
+ }
+
+ AudioStreamBuilder mBuilder;
+ AudioStream *mStream = nullptr;
+ static constexpr int kTimeoutInNanos = 100 * kNanosPerMillisecond;
+
+};
+
+TEST_F(StreamStates, StateIsOpenAfterOpening){
+ openStream();
+ StreamState next;
+ Result r = mStream->waitForStateChange(StreamState::Uninitialized, &next, kTimeoutInNanos);
+ EXPECT_EQ(r, Result::OK) << convertToText(r);
+ ASSERT_EQ(next, StreamState::Open) << convertToText(next);
+ closeStream();
+}
+
+TEST_F(StreamStates, StateIsStartedAfterStarting){
+
+ openStream();
+
+ StreamState next;
+ auto r = mStream->requestStart();
+ EXPECT_EQ(r, Result::OK);
+
+ r = mStream->waitForStateChange(StreamState::Starting, &next, kTimeoutInNanos);
+ EXPECT_EQ(r, Result::OK);
+
+ ASSERT_EQ(next, StreamState::Started);
+
+ closeStream();
+}
+
+TEST_F(StreamStates, StateIsPausedAfterPausing){
+
+ openStream();
+
+ StreamState next;
+ auto r = mStream->requestStart();
+ EXPECT_EQ(r, Result::OK);
+ r = mStream->requestPause();
+ EXPECT_EQ(r, Result::OK);
+
+ r = mStream->waitForStateChange(StreamState::Pausing, &next, kTimeoutInNanos);
+ EXPECT_EQ(r, Result::OK);
+
+ ASSERT_EQ(next, StreamState::Paused);
+
+ closeStream();
+}
+
+
+TEST_F(StreamStates, StateIsStoppedAfterStopping){
+
+ openStream();
+
+ StreamState next;
+ auto r = mStream->requestStart();
+ EXPECT_EQ(r, Result::OK);
+
+ r = mStream->requestStop();
+ r = mStream->waitForStateChange(StreamState::Stopping, &next, kTimeoutInNanos);
+ EXPECT_EQ(r, Result::OK);
+
+ ASSERT_EQ(next, StreamState::Stopped);
+
+ closeStream();
+}