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

Commit ed4745df authored by Patrick Williams's avatar Patrick Williams
Browse files

Fix flaky BBQ tests

Updates several tests to use transaction committed callbacks and BBQ's mergeWithNextTransaction to correctly wait before taking screenshots.

Bug: 288344458
Test: tested the updated tests with at least 200 runs each
Change-Id: I821d8673162ec22be6c3060e24491c3ee4941640
parent 9032c039
Loading
Loading
Loading
Loading
+32 −7
Original line number Diff line number Diff line
@@ -351,6 +351,24 @@ protected:
    sp<CountProducerListener> mProducerListener;
};

// Helper class to ensure the provided BBQ frame number has been committed in SurfaceFlinger.
class BBQSyncHelper {
public:
    BBQSyncHelper(BLASTBufferQueueHelper& bbqHelper, uint64_t frameNumber) {
        t.addTransactionCompletedCallback(callbackHelper.function, callbackHelper.getContext());
        bbqHelper.mergeWithNextTransaction(&t, frameNumber);
    }

    void wait() {
        CallbackData callbackData;
        callbackHelper.getCallbackData(&callbackData);
    }

private:
    Transaction t;
    CallbackHelper callbackHelper;
};

TEST_F(BLASTBufferQueueTest, CreateBLASTBufferQueue) {
    // create BLASTBufferQueue adapter associated with this surface
    BLASTBufferQueueHelper adapter(mSurfaceControl, mDisplayWidth, mDisplayHeight);
@@ -422,6 +440,7 @@ TEST_F(BLASTBufferQueueTest, onFrameAvailable_Apply) {
    BLASTBufferQueueHelper adapter(mSurfaceControl, mDisplayWidth, mDisplayHeight);
    sp<IGraphicBufferProducer> igbProducer;
    setUpProducer(adapter, igbProducer);
    BBQSyncHelper syncHelper{adapter, 1};

    int slot;
    sp<Fence> fence;
@@ -447,7 +466,7 @@ TEST_F(BLASTBufferQueueTest, onFrameAvailable_Apply) {
    igbProducer->queueBuffer(slot, input, &qbOutput);
    ASSERT_NE(ui::Transform::ROT_INVALID, qbOutput.transformHint);

    adapter.waitForCallbacks();
    syncHelper.wait();

    // capture screen and verify that it is red
    ASSERT_EQ(NO_ERROR, captureDisplay(mCaptureArgs, mCaptureResults));
@@ -507,6 +526,7 @@ TEST_F(BLASTBufferQueueTest, SetCrop_Item) {
    BLASTBufferQueueHelper adapter(mSurfaceControl, mDisplayWidth, mDisplayHeight);
    sp<IGraphicBufferProducer> igbProducer;
    setUpProducer(adapter, igbProducer);
    BBQSyncHelper syncHelper{adapter, 1};
    int slot;
    sp<Fence> fence;
    sp<GraphicBuffer> buf;
@@ -531,7 +551,7 @@ TEST_F(BLASTBufferQueueTest, SetCrop_Item) {
    igbProducer->queueBuffer(slot, input, &qbOutput);
    ASSERT_NE(ui::Transform::ROT_INVALID, qbOutput.transformHint);

    adapter.waitForCallbacks();
    syncHelper.wait();
    // capture screen and verify that it is red
    ASSERT_EQ(NO_ERROR, captureDisplay(mCaptureArgs, mCaptureResults));

@@ -562,6 +582,7 @@ TEST_F(BLASTBufferQueueTest, SetCrop_ScalingModeScaleCrop) {
    BLASTBufferQueueHelper adapter(mSurfaceControl, bufferSideLength, bufferSideLength);
    sp<IGraphicBufferProducer> igbProducer;
    setUpProducer(adapter, igbProducer);
    BBQSyncHelper syncHelper{adapter, 1};
    int slot;
    sp<Fence> fence;
    sp<GraphicBuffer> buf;
@@ -590,7 +611,7 @@ TEST_F(BLASTBufferQueueTest, SetCrop_ScalingModeScaleCrop) {
    igbProducer->queueBuffer(slot, input, &qbOutput);
    ASSERT_NE(ui::Transform::ROT_INVALID, qbOutput.transformHint);

    adapter.waitForCallbacks();
    syncHelper.wait();
    // capture screen and verify that it is red
    ASSERT_EQ(NO_ERROR, captureDisplay(mCaptureArgs, mCaptureResults));
    ASSERT_NO_FATAL_FAILURE(checkScreenCapture(r, g, b,
@@ -621,6 +642,7 @@ TEST_F(BLASTBufferQueueTest, ScaleCroppedBufferToBufferSize) {
    BLASTBufferQueueHelper adapter(mSurfaceControl, windowSize.getWidth(), windowSize.getHeight());
    sp<IGraphicBufferProducer> igbProducer;
    setUpProducer(adapter, igbProducer);
    BBQSyncHelper syncHelper{adapter, 1};
    int slot;
    sp<Fence> fence;
    sp<GraphicBuffer> buf;
@@ -653,7 +675,7 @@ TEST_F(BLASTBufferQueueTest, ScaleCroppedBufferToBufferSize) {
    igbProducer->queueBuffer(slot, input, &qbOutput);
    ASSERT_NE(ui::Transform::ROT_INVALID, qbOutput.transformHint);

    adapter.waitForCallbacks();
    syncHelper.wait();

    ASSERT_EQ(NO_ERROR, captureDisplay(mCaptureArgs, mCaptureResults));

@@ -688,6 +710,7 @@ TEST_F(BLASTBufferQueueTest, ScaleCroppedBufferToWindowSize) {
    BLASTBufferQueueHelper adapter(mSurfaceControl, windowSize.getWidth(), windowSize.getHeight());
    sp<IGraphicBufferProducer> igbProducer;
    setUpProducer(adapter, igbProducer);
    BBQSyncHelper syncHelper{adapter, 1};
    int slot;
    sp<Fence> fence;
    sp<GraphicBuffer> buf;
@@ -720,7 +743,7 @@ TEST_F(BLASTBufferQueueTest, ScaleCroppedBufferToWindowSize) {
    igbProducer->queueBuffer(slot, input, &qbOutput);
    ASSERT_NE(ui::Transform::ROT_INVALID, qbOutput.transformHint);

    adapter.waitForCallbacks();
    syncHelper.wait();

    ASSERT_EQ(NO_ERROR, captureDisplay(mCaptureArgs, mCaptureResults));
    // Verify cropped region is scaled correctly.
@@ -746,6 +769,7 @@ TEST_F(BLASTBufferQueueTest, ScalingModeChanges) {
    sp<IGraphicBufferProducer> igbProducer;
    setUpProducer(adapter, igbProducer);
    {
        BBQSyncHelper syncHelper{adapter, 1};
        int slot;
        sp<Fence> fence;
        sp<GraphicBuffer> buf;
@@ -767,7 +791,7 @@ TEST_F(BLASTBufferQueueTest, ScalingModeChanges) {
                                                       NATIVE_WINDOW_SCALING_MODE_FREEZE, 0,
                                                       Fence::NO_FENCE);
        igbProducer->queueBuffer(slot, input, &qbOutput);
        adapter.waitForCallbacks();
        syncHelper.wait();
    }
    // capture screen and verify that it is red
    ASSERT_EQ(NO_ERROR, captureDisplay(mCaptureArgs, mCaptureResults));
@@ -780,6 +804,7 @@ TEST_F(BLASTBufferQueueTest, ScalingModeChanges) {
    adapter.update(mSurfaceControl, mDisplayWidth, mDisplayHeight / 2);

    {
        BBQSyncHelper syncHelper{adapter, 1};
        int slot;
        sp<Fence> fence;
        sp<GraphicBuffer> buf;
@@ -802,7 +827,7 @@ TEST_F(BLASTBufferQueueTest, ScalingModeChanges) {
                                                       NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW,
                                                       0, Fence::NO_FENCE);
        igbProducer->queueBuffer(slot, input, &qbOutput);
        adapter.waitForCallbacks();
        syncHelper.wait();
    }
    // capture screen and verify that it is red
    ASSERT_EQ(NO_ERROR, captureDisplay(mCaptureArgs, mCaptureResults));