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();
+}