Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 17030494 authored by Kevin Rocard's avatar Kevin Rocard Committed by Mikhail Naganov
Browse files

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
parent 0571e8e8
Loading
Loading
Loading
Loading
+23 −5
Original line number Diff line number Diff line
@@ -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<Result> 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;