7 #import <OCMock/OCMock.h>
8 #import "flutter/fml/synchronization/waitable_event.h"
9 #import "flutter/testing/testing.h"
21 - (nullable instancetype)
init;
22 - (void)dispatchMainTask:(nonnull
void (^)())task;
23 - (void)dispatchRenderTask:(nonnull
void (^)())task;
29 dispatch_queue_t _mainQueue;
30 std::shared_ptr<fml::AutoResetWaitableEvent>
_mainLatch;
40 - (nullable instancetype)
init {
43 _mainQueue = dispatch_queue_create(
"MAIN", DISPATCH_QUEUE_SERIAL);
44 _renderQueue = dispatch_queue_create(
"RENDER", DISPATCH_QUEUE_SERIAL);
50 - (void)dispatchMainTask:(nonnull
void (^)())task {
51 dispatch_async(_mainQueue, task);
54 - (void)dispatchRenderTask:(nonnull
void (^)())task {
59 fml::AutoResetWaitableEvent latch;
60 fml::AutoResetWaitableEvent* pLatch = &latch;
61 dispatch_async(_mainQueue, ^{
68 fml::AutoResetWaitableEvent latch;
69 fml::AutoResetWaitableEvent* pLatch = &latch;
78 TEST(FlutterThreadSynchronizerTest, RegularCommit) {
84 __block
int notifiedResize = 0;
93 EXPECT_FALSE([synchronizer isWaitingWhenMutexIsAvailable]);
95 EXPECT_EQ(notifiedResize, 1);
105 EXPECT_FALSE([synchronizer isWaitingWhenMutexIsAvailable]);
107 EXPECT_EQ(notifiedResize, 2);
110 __block
int notifiedCommit = 0;
118 EXPECT_FALSE([synchronizer isWaitingWhenMutexIsAvailable]);
120 EXPECT_EQ(notifiedCommit, 1);
123 TEST(FlutterThreadSynchronizerTest, ResizingBlocksRenderingUntilSizeMatches) {
130 fml::AutoResetWaitableEvent begunResizingLatch;
131 fml::AutoResetWaitableEvent* begunResizing = &begunResizingLatch;
142 EXPECT_FALSE([synchronizer isWaitingWhenMutexIsAvailable]);
152 EXPECT_FALSE([synchronizer isWaitingWhenMutexIsAvailable]);
159 begunResizing->Signal();
162 begunResizing->Wait();
163 EXPECT_TRUE([synchronizer isWaitingWhenMutexIsAvailable]);
173 EXPECT_TRUE([synchronizer isWaitingWhenMutexIsAvailable]);
183 EXPECT_FALSE([synchronizer isWaitingWhenMutexIsAvailable]);
188 TEST(FlutterThreadSynchronizerTest, ShutdownMakesEverythingNonBlocking) {
192 fml::AutoResetWaitableEvent begunResizingLatch;
193 fml::AutoResetWaitableEvent* begunResizing = &begunResizingLatch;
204 EXPECT_FALSE([synchronizer isWaitingWhenMutexIsAvailable]);
214 EXPECT_FALSE([synchronizer isWaitingWhenMutexIsAvailable]);
225 begunResizing->Signal();
228 begunResizing->Wait();
229 EXPECT_FALSE([synchronizer isWaitingWhenMutexIsAvailable]);
240 EXPECT_FALSE([synchronizer isWaitingWhenMutexIsAvailable]);
243 TEST(FlutterThreadSynchronizerTest, RegularCommitForMultipleViews) {
247 fml::AutoResetWaitableEvent begunResizingLatch;
248 fml::AutoResetWaitableEvent* begunResizing = &begunResizingLatch;
261 begunResizing->Signal();
264 begunResizing->Wait();
265 EXPECT_FALSE([synchronizer isWaitingWhenMutexIsAvailable]);
273 begunResizing->Signal();
276 begunResizing->Signal();
277 EXPECT_FALSE([synchronizer isWaitingWhenMutexIsAvailable]);
292 EXPECT_FALSE([synchronizer isWaitingWhenMutexIsAvailable]);
295 TEST(FlutterThreadSynchronizerTest, ResizingForMultipleViews) {
299 fml::AutoResetWaitableEvent begunResizingLatch;
300 fml::AutoResetWaitableEvent* begunResizing = &begunResizingLatch;
316 EXPECT_FALSE([synchronizer isWaitingWhenMutexIsAvailable]);
330 EXPECT_FALSE([synchronizer isWaitingWhenMutexIsAvailable]);
337 begunResizing->Signal();
340 begunResizing->Wait();
341 EXPECT_TRUE([synchronizer isWaitingWhenMutexIsAvailable]);
351 EXPECT_TRUE([synchronizer isWaitingWhenMutexIsAvailable]);
361 EXPECT_TRUE([synchronizer isWaitingWhenMutexIsAvailable]);
371 EXPECT_TRUE([synchronizer isWaitingWhenMutexIsAvailable]);
382 EXPECT_FALSE([synchronizer isWaitingWhenMutexIsAvailable]);