From 17030494e3671fe216befcbaf8b08a7627cbb17c Mon Sep 17 00:00:00 2001 From: Kevin Rocard Date: Thu, 13 Dec 2018 11:33:17 -0800 Subject: [PATCH] DO NOT MERGE: Audio VTS: Wait after stream close Due to asynchronous nature of the destruction of server-side objects it is required to flush IPC messages to the server and wait to avoid flakiness due to an attempt to open the stream while it's still not closed on the server side. This patch is specific for Android P release. Test: atest VtsHalAudioV4_0TargetTest Bug: 118655804 Change-Id: I1a5ec28bce9802ec654c139153ec4aa6786474e5 --- .../functional/AudioPrimaryHidlHalTest.cpp | 28 +++++++++++++++---- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/audio/core/4.0/vts/functional/AudioPrimaryHidlHalTest.cpp b/audio/core/4.0/vts/functional/AudioPrimaryHidlHalTest.cpp index 46c228a19f..71d91db360 100644 --- a/audio/core/4.0/vts/functional/AudioPrimaryHidlHalTest.cpp +++ b/audio/core/4.0/vts/functional/AudioPrimaryHidlHalTest.cpp @@ -191,7 +191,7 @@ TEST_F(AudioHidlTest, OpenPrimaryDeviceUsingGetDevice) { // flushCommand makes sure all local command are sent, thus should reduce // the latency between local and remote destruction. IPCThreadState::self()->flushCommands(); - usleep(100); + usleep(100*1000); } ////////////////////////////////////////////////////////////////////////////// @@ -698,13 +698,27 @@ class OpenStreamTest : public AudioConfigPrimaryTest, Return closeStream() { open = false; - return stream->close(); + auto res = stream->close(); + stream.clear(); + waitForStreamDestruction(); + return res; + } + + void waitForStreamDestruction() { + // FIXME: there is no way to know when the remote IStream is being destroyed + // Binder does not support testing if an object is alive, thus + // wait for 100ms to let the binder destruction propagates and + // the remote device has the time to be destroyed. + // flushCommand makes sure all local command are sent, thus should reduce + // the latency between local and remote destruction. + IPCThreadState::self()->flushCommands(); + usleep(100*1000); } private: void TearDown() override { if (open) { - ASSERT_OK(stream->close()); + ASSERT_OK(closeStream()); } } @@ -1051,8 +1065,12 @@ TEST_IO_STREAM(getMmapPositionNoMmap, "Get a stream Mmap position before mapping ASSERT_RESULT(invalidStateOrNotSupported, stream->stop())) TEST_IO_STREAM(close, "Make sure a stream can be closed", ASSERT_OK(closeStream())) -TEST_IO_STREAM(closeTwice, "Make sure a stream can not be closed twice", ASSERT_OK(closeStream()); - ASSERT_RESULT(Result::INVALID_STATE, closeStream())) +TEST_IO_STREAM(closeTwice, "Make sure a stream can not be closed twice", + auto streamCopy = stream; + ASSERT_OK(closeStream()); + ASSERT_RESULT(Result::INVALID_STATE, streamCopy->close()); + streamCopy.clear(); + waitForStreamDestruction()) static void testCreateTooBigMmapBuffer(IStream* stream) { MmapBufferInfo info;