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
diff --git a/libs/gui/tests/BLASTBufferQueue_test.cpp b/libs/gui/tests/BLASTBufferQueue_test.cpp
index cd90168..cce2892 100644
--- a/libs/gui/tests/BLASTBufferQueue_test.cpp
+++ b/libs/gui/tests/BLASTBufferQueue_test.cpp
@@ -351,6 +351,24 @@
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 @@
BLASTBufferQueueHelper adapter(mSurfaceControl, mDisplayWidth, mDisplayHeight);
sp<IGraphicBufferProducer> igbProducer;
setUpProducer(adapter, igbProducer);
+ BBQSyncHelper syncHelper{adapter, 1};
int slot;
sp<Fence> fence;
@@ -447,7 +466,7 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
sp<IGraphicBufferProducer> igbProducer;
setUpProducer(adapter, igbProducer);
{
+ BBQSyncHelper syncHelper{adapter, 1};
int slot;
sp<Fence> fence;
sp<GraphicBuffer> buf;
@@ -767,7 +791,7 @@
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 @@
adapter.update(mSurfaceControl, mDisplayWidth, mDisplayHeight / 2);
{
+ BBQSyncHelper syncHelper{adapter, 1};
int slot;
sp<Fence> fence;
sp<GraphicBuffer> buf;
@@ -802,7 +827,7 @@
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));