tests: test framesPerCallback

Ensure honored for OpenSL ES.

See #766
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index bdfd618..f466733 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -25,13 +25,13 @@
 
 # Build the test binary
 add_executable(
-		testOboe
+        testOboe
         testUtilities.cpp
-#		testFlowgraph.cpp
+#        testFlowgraph.cpp
         testStreamClosedMethods.cpp
-        testStreamStates.cpp
         testStreamWaitState.cpp
-		testStreamOpen.cpp
         testXRunBehaviour.cpp
+        testStreamOpen.cpp
+        testStreamStates.cpp
         )
 target_link_libraries(testOboe gtest oboe)
diff --git a/tests/testStreamOpen.cpp b/tests/testStreamOpen.cpp
index 4dc79e2..f20bf84 100644
--- a/tests/testStreamOpen.cpp
+++ b/tests/testStreamOpen.cpp
@@ -20,6 +20,15 @@
 
 using namespace oboe;
 
+class NumFramesCallback : public AudioStreamCallback {
+public:
+    DataCallbackResult onAudioReady(AudioStream *oboeStream, void *audioData, int32_t numFrames) override {
+		framesPerCallback = numFrames;
+        return DataCallbackResult::Continue;
+    }
+    
+    std::atomic<int32_t> framesPerCallback{0};
+};
 
 class StreamOpen : public ::testing::Test {
 
@@ -28,6 +37,8 @@
     bool openStream(){
         Result r = mBuilder.openStream(&mStream);
         EXPECT_EQ(r, Result::OK) << "Failed to open stream " << convertToText(r);
+        EXPECT_EQ(0, openCount) << "Should start with a fresh object every time.";
+        openCount++;
         return (r == Result::OK);
     }
 
@@ -38,16 +49,18 @@
                 FAIL() << "Failed to close stream. " << convertToText(r);
             }
         }
+        usleep(500 * 1000); // give previous stream time to settle
     }
 
     AudioStreamBuilder mBuilder;
     AudioStream *mStream = nullptr;
-
+    int32_t openCount = 0;
 };
 
 TEST_F(StreamOpen, ForOpenSLESDefaultSampleRateIsUsed){
 
     DefaultStreamValues::SampleRate = 44100;
+    DefaultStreamValues::FramesPerBurst = 192;
     mBuilder.setAudioApi(AudioApi::OpenSLES);
     openStream();
     ASSERT_EQ(mStream->getSampleRate(), 44100);
@@ -56,8 +69,10 @@
 
 TEST_F(StreamOpen, ForOpenSLESDefaultFramesPerBurstIsUsed){
 
-    DefaultStreamValues::FramesPerBurst = 128;
+    DefaultStreamValues::SampleRate = 48000;
+    DefaultStreamValues::FramesPerBurst = 128; // used for low latency
     mBuilder.setAudioApi(AudioApi::OpenSLES);
+    mBuilder.setPerformanceMode(PerformanceMode::LowLatency);
     openStream();
     ASSERT_EQ(mStream->getFramesPerBurst(), 128);
     closeStream();
@@ -93,6 +108,80 @@
 	ASSERT_EQ((int)mStream->getPerformanceMode(), (int)PerformanceMode::None);
     closeStream();
 }
+
+// Make sure the callback is called with the requested FramesPerCallback
+TEST_F(StreamOpen, OpenSLESFramesPerCallback) {
+	const int kRequestedFramesPerCallback = 417;
+	NumFramesCallback callback;
+	
+    DefaultStreamValues::SampleRate = 48000;
+    DefaultStreamValues::ChannelCount = 2;
+    DefaultStreamValues::FramesPerBurst = 192;
+    mBuilder.setAudioApi(AudioApi::OpenSLES);
+    mBuilder.setFramesPerCallback(kRequestedFramesPerCallback);
+    mBuilder.setCallback(&callback);
+    openStream();
+    ASSERT_EQ(mStream->requestStart(), Result::OK);
+    int timeout = 20;
+    while (callback.framesPerCallback == 0 && timeout > 0) {
+		usleep(50 * 1000);
+		timeout--;
+	}
+    ASSERT_EQ(kRequestedFramesPerCallback, callback.framesPerCallback);
+    ASSERT_EQ(kRequestedFramesPerCallback, mStream->getFramesPerCallback());
+    ASSERT_EQ(mStream->requestStop(), Result::OK);
+    closeStream();
+}
+
+/* TODO - This is hanging!
+// Make sure the LowLatency callback has the requested FramesPerCallback.
+TEST_F(StreamOpen, AAudioFramesPerCallbackLowLatency) {
+	const int kRequestedFramesPerCallback = 192;
+	NumFramesCallback callback;
+
+    mBuilder.setAudioApi(AudioApi::AAudio);
+    mBuilder.setFramesPerCallback(kRequestedFramesPerCallback);
+    mBuilder.setCallback(&callback);
+    mBuilder.setPerformanceMode(PerformanceMode::LowLatency);
+    openStream();
+    ASSERT_EQ(kRequestedFramesPerCallback, mStream->getFramesPerCallback());
+    ASSERT_EQ(mStream->requestStart(), Result::OK);
+    int timeout = 20;
+    while (callback.framesPerCallback == 0 && timeout > 0) {
+		usleep(50 * 1000);
+		timeout--;
+	}
+    ASSERT_EQ(kRequestedFramesPerCallback, callback.framesPerCallback);
+    ASSERT_EQ(mStream->requestStop(), Result::OK);
+    closeStream();
+}
+*/
+
+/* TODO - This is hanging!
+// Make sure the regular callback has the requested FramesPerCallback.
+TEST_F(StreamOpen, AAudioFramesPerCallbackNone) {
+	const int kRequestedFramesPerCallback = 1024;
+	NumFramesCallback callback;
+
+    mBuilder.setAudioApi(AudioApi::AAudio);
+    mBuilder.setFramesPerCallback(kRequestedFramesPerCallback);
+    mBuilder.setCallback(&callback);
+    mBuilder.setPerformanceMode(PerformanceMode::None);
+    openStream();
+    ASSERT_EQ(kRequestedFramesPerCallback, mStream->getFramesPerCallback());
+    ASSERT_EQ(mStream->setBufferSizeInFrames(mStream->getBufferCapacityInFrames()), Result::OK);
+    ASSERT_EQ(mStream->requestStart(), Result::OK);
+    int timeout = 20;
+    while (callback.framesPerCallback == 0 && timeout > 0) {
+		usleep(50 * 1000);
+		timeout--;
+	}
+    ASSERT_EQ(kRequestedFramesPerCallback, callback.framesPerCallback);
+    ASSERT_EQ(mStream->requestStop(), Result::OK);
+    closeStream();
+}
+*/
+
 TEST_F(StreamOpen, RecordingFormatUnspecifiedReturnsI16BeforeMarshmallow){
 
     if (getSdkVersion() < __ANDROID_API_M__){