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

Commit cf337a53 authored by Jim Shargo's avatar Jim Shargo
Browse files

libgui: Make Surface_test more robust and improve logging

In b/365708032, we're seeing flakiness around the creation of a
SurfaceComposerClient, even in tests that don't use it. The class is not
being initialized since SF is likely not available

This is only used by a small number of the 100+ tests in this file, so
if the tests don't rely on it, we can avoid the initialization.

Bug: 365708032
Flag: EXEMPT adding logging
Test: atest libgui_test
Change-Id: I60c7d9efd5e61fb341298cff3cb8847eb2a6b8ba
parent dab23b0e
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -2640,6 +2640,9 @@ void SurfaceComposerClient::onFirstRef() {
        if (status.isOk() && conn != nullptr) {
            mClient = conn;
            mStatus = NO_ERROR;
        } else {
            ALOGE("SurfaceComposerClient::onFirstRef unable to create client connection, error: %s",
                  status.toString8().c_str());
        }
    }
}
+45 −40
Original line number Diff line number Diff line
@@ -129,34 +129,6 @@ private:

class SurfaceTest : public ::testing::Test {
protected:
    SurfaceTest() {
        ProcessState::self()->startThreadPool();
    }

    virtual void SetUp() {
        mComposerClient = sp<SurfaceComposerClient>::make();
        ASSERT_EQ(NO_ERROR, mComposerClient->initCheck());

        // TODO(brianderson): The following sometimes fails and is a source of
        //   test flakiness.
        mSurfaceControl = mComposerClient->createSurface(
                String8("Test Surface"), 32, 32, PIXEL_FORMAT_RGBA_8888, 0);
        SurfaceComposerClient::Transaction().apply(true);

        ASSERT_TRUE(mSurfaceControl != nullptr);
        ASSERT_TRUE(mSurfaceControl->isValid());

        Transaction t;
        ASSERT_EQ(NO_ERROR, t.setLayer(mSurfaceControl, 0x7fffffff).show(mSurfaceControl).apply());

        mSurface = mSurfaceControl->getSurface();
        ASSERT_TRUE(mSurface != nullptr);
    }

    virtual void TearDown() {
        mComposerClient->dispose();
    }

    void testSurfaceListener(bool hasSurfaceListener, bool enableReleasedCb,
                             int32_t extraDiscardedBuffers) {
        sp<IGraphicBufferProducer> producer;
@@ -237,13 +209,46 @@ protected:
        // Disconnect the surface
        ASSERT_EQ(NO_ERROR, surface->disconnect(NATIVE_WINDOW_API_CPU));
    }
};

class SurfaceComposerSurfaceTest : public SurfaceTest {
protected:
    SurfaceComposerSurfaceTest() { ProcessState::self()->startThreadPool(); }

    virtual void SetUp() override {
        SurfaceTest::SetUp();

        mComposerClient = sp<SurfaceComposerClient>::make();
        ASSERT_EQ(NO_ERROR, mComposerClient->initCheck());

        // TODO(brianderson): The following sometimes fails and is a source of
        //   test flakiness.
        mSurfaceControl = mComposerClient->createSurface(String8("Test Surface"), 32, 32,
                                                         PIXEL_FORMAT_RGBA_8888, 0);
        SurfaceComposerClient::Transaction().apply(true);

        ASSERT_TRUE(mSurfaceControl != nullptr);
        ASSERT_TRUE(mSurfaceControl->isValid());

        Transaction t;
        ASSERT_EQ(NO_ERROR, t.setLayer(mSurfaceControl, 0x7fffffff).show(mSurfaceControl).apply());

        mSurface = mSurfaceControl->getSurface();
        ASSERT_TRUE(mSurface != nullptr);
    }

    virtual void TearDown() {
        SurfaceTest::TearDown();

        mComposerClient->dispose();
    }

    sp<Surface> mSurface;
    sp<SurfaceComposerClient> mComposerClient;
    sp<SurfaceControl> mSurfaceControl;
};

TEST_F(SurfaceTest, CreateSurfaceReturnsErrorBadClient) {
TEST_F(SurfaceComposerSurfaceTest, CreateSurfaceReturnsErrorBadClient) {
    mComposerClient->dispose();
    ASSERT_EQ(NO_INIT, mComposerClient->initCheck());

@@ -253,7 +258,7 @@ TEST_F(SurfaceTest, CreateSurfaceReturnsErrorBadClient) {
    ASSERT_EQ(NO_INIT, err);
}

TEST_F(SurfaceTest, QueuesToWindowComposerIsTrueWhenVisible) {
TEST_F(SurfaceComposerSurfaceTest, QueuesToWindowComposerIsTrueWhenVisible) {
    sp<ANativeWindow> anw(mSurface);
    int result = -123;
    int err = anw->query(anw.get(), NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER,
@@ -262,7 +267,7 @@ TEST_F(SurfaceTest, QueuesToWindowComposerIsTrueWhenVisible) {
    EXPECT_EQ(1, result);
}

TEST_F(SurfaceTest, QueuesToWindowComposerIsTrueWhenPurgatorized) {
TEST_F(SurfaceComposerSurfaceTest, QueuesToWindowComposerIsTrueWhenPurgatorized) {
    mSurfaceControl.clear();
    // Wait for the async clean-up to complete.
    std::this_thread::sleep_for(50ms);
@@ -275,7 +280,7 @@ TEST_F(SurfaceTest, QueuesToWindowComposerIsTrueWhenPurgatorized) {
    EXPECT_EQ(1, result);
}

TEST_F(SurfaceTest, ConcreteTypeIsSurface) {
TEST_F(SurfaceComposerSurfaceTest, ConcreteTypeIsSurface) {
    sp<ANativeWindow> anw(mSurface);
    int result = -123;
    int err = anw->query(anw.get(), NATIVE_WINDOW_CONCRETE_TYPE, &result);
@@ -283,7 +288,7 @@ TEST_F(SurfaceTest, ConcreteTypeIsSurface) {
    EXPECT_EQ(NATIVE_WINDOW_SURFACE, result);
}

TEST_F(SurfaceTest, LayerCountIsOne) {
TEST_F(SurfaceComposerSurfaceTest, LayerCountIsOne) {
    sp<ANativeWindow> anw(mSurface);
    int result = -123;
    int err = anw->query(anw.get(), NATIVE_WINDOW_LAYER_COUNT, &result);
@@ -291,7 +296,7 @@ TEST_F(SurfaceTest, LayerCountIsOne) {
    EXPECT_EQ(1, result);
}

TEST_F(SurfaceTest, QueryConsumerUsage) {
TEST_F(SurfaceComposerSurfaceTest, QueryConsumerUsage) {
    const int TEST_USAGE_FLAGS =
            GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_HW_RENDER;
    auto [c, s] = BufferItemConsumer::create(TEST_USAGE_FLAGS);
@@ -304,7 +309,7 @@ TEST_F(SurfaceTest, QueryConsumerUsage) {
    ASSERT_EQ(TEST_USAGE_FLAGS, flags);
}

TEST_F(SurfaceTest, QueryDefaultBuffersDataSpace) {
TEST_F(SurfaceComposerSurfaceTest, QueryDefaultBuffersDataSpace) {
    const android_dataspace TEST_DATASPACE = HAL_DATASPACE_V0_SRGB;

    auto [cpuConsumer, s] = CpuConsumer::create(1);
@@ -582,7 +587,7 @@ TEST_F(SurfaceTest, SurfaceListenerTest) {
    testSurfaceListener(/*hasListener*/true, /*enableReleasedCb*/true, /*extraDiscardedBuffers*/2);
}

TEST_F(SurfaceTest, TestGetLastDequeueStartTime) {
TEST_F(SurfaceComposerSurfaceTest, TestGetLastDequeueStartTime) {
    sp<ANativeWindow> anw(mSurface);
    ASSERT_EQ(NO_ERROR, native_window_api_connect(anw.get(), NATIVE_WINDOW_API_CPU));

@@ -598,7 +603,7 @@ TEST_F(SurfaceTest, TestGetLastDequeueStartTime) {
    ASSERT_GE(after, lastDequeueTime);
}

TEST_F(SurfaceTest, SurfaceIsForCursor) {
TEST_F(SurfaceComposerSurfaceTest, SurfaceIsForCursor) {
    sp<SurfaceControl> control;
    ASSERT_EQ(NO_ERROR,
              mComposerClient->createSurfaceChecked(String8("Test Surface"), 32, 32,