Index: Source/core/workers/WorkerThreadTest.cpp |
diff --git a/Source/core/workers/WorkerThreadTest.cpp b/Source/core/workers/WorkerThreadTest.cpp |
index b070b123daa6c205a86efaba85ad9880adde6477..5f9270a37db506064d5faf65a6e05adbe42f0fea 100644 |
--- a/Source/core/workers/WorkerThreadTest.cpp |
+++ b/Source/core/workers/WorkerThreadTest.cpp |
@@ -9,7 +9,6 @@ |
#include "core/workers/WorkerReportingProxy.h" |
#include "core/workers/WorkerThreadStartupData.h" |
#include "platform/NotImplemented.h" |
-#include "public/platform/WebScheduler.h" |
#include "public/platform/WebWaitableEvent.h" |
#include <gmock/gmock.h> |
#include <gtest/gtest.h> |
@@ -98,8 +97,6 @@ |
return *m_thread; |
} |
- MOCK_METHOD1(doIdleGc, bool(double deadlineSeconds)); |
- |
PassRefPtrWillBeRawPtr<WorkerGlobalScope> createWorkerGlobalScope(PassOwnPtr<WorkerThreadStartupData> startupData) override |
{ |
return adoptRefWillBeNoop(new FakeWorkerGlobalScope(startupData->m_scriptURL, startupData->m_userAgent, this, startupData->m_starterOrigin, startupData->m_workerClients.release())); |
@@ -107,30 +104,6 @@ |
private: |
OwnPtr<WebThreadSupportingGC> m_thread; |
-}; |
- |
-class WakeupTask : public WebThread::Task { |
-public: |
- WakeupTask() { } |
- |
- ~WakeupTask() override { } |
- |
- void run() override { } |
-}; |
- |
-class PostDelayedWakeupTask : public WebThread::Task { |
-public: |
- PostDelayedWakeupTask(WebScheduler* scheduler, long long delay) : m_scheduler(scheduler), m_delay(delay) { } |
- |
- ~PostDelayedWakeupTask() override { } |
- |
- void run() override |
- { |
- m_scheduler->postTimerTask(FROM_HERE, new WakeupTask(), m_delay); |
- } |
- |
- WebScheduler* m_scheduler; // Not owned. |
- long long m_delay; |
}; |
class SignalTask : public WebThread::Task { |
@@ -188,17 +161,6 @@ |
completionEvent->wait(); |
} |
- void postWakeUpTask(long long waitMs) |
- { |
- WebScheduler* scheduler = m_workerThread->backingThread().platformThread().scheduler(); |
- |
- // The idle task will get posted on an after wake up queue, so we need another task |
- // posted at the right time to wake the system up. We don't know the right delay here |
- // since the thread can take a variable length of time to be responsive, however this |
- // isn't a problem when posting a delayed task from within a task on the worker thread. |
- scheduler->postLoadingTask(FROM_HERE, new PostDelayedWakeupTask(scheduler, waitMs)); |
- } |
- |
protected: |
void ExpectWorkerLifetimeReportingCalls() |
{ |
@@ -220,158 +182,4 @@ |
m_workerThread->terminateAndWait(); |
} |
-TEST_F(WorkerThreadTest, GcOccursWhileIdle) |
-{ |
- OwnPtr<WebWaitableEvent> gcDone = adoptPtr(Platform::current()->createWaitableEvent()); |
- |
- ON_CALL(*m_workerThread, doIdleGc(_)).WillByDefault(Invoke( |
- [&gcDone](double) |
- { |
- gcDone->signal(); |
- return false; |
- })); |
- |
- EXPECT_CALL(*m_workerThread, doIdleGc(_)).Times(1); |
- |
- startAndWaitForInit(); |
- postWakeUpTask(310ul); // 10ms after the quiescent period ends. |
- |
- gcDone->wait(); |
- m_workerThread->terminateAndWait(); |
-}; |
- |
-class RepeatingTask : public WebThread::Task { |
-public: |
- RepeatingTask(WebScheduler* scheduler, WebWaitableEvent* completion) |
- : RepeatingTask(scheduler, completion, 0) { } |
- |
- ~RepeatingTask() override { } |
- |
- void run() override |
- { |
- m_taskCount++; |
- if (m_taskCount == 10) |
- m_completion->signal(); |
- |
- m_scheduler->postTimerTask( |
- FROM_HERE, new RepeatingTask(m_scheduler, m_completion, m_taskCount), 50ul); |
- m_scheduler->postLoadingTask(FROM_HERE, new WakeupTask()); |
- |
- } |
- |
-private: |
- RepeatingTask(WebScheduler* scheduler, WebWaitableEvent* completion, int taskCount) |
- : m_scheduler(scheduler) |
- , m_completion(completion) |
- , m_taskCount(taskCount) |
- { } |
- |
- WebScheduler* m_scheduler; // Not owned. |
- WebWaitableEvent* m_completion; |
- int m_taskCount; |
-}; |
- |
-TEST_F(WorkerThreadTest, GcDoesNotOccurIfGapBetweenDelayedTasksIsTooSmall) |
-{ |
- OwnPtr<WebWaitableEvent> completion = adoptPtr(Platform::current()->createWaitableEvent()); |
- |
- EXPECT_CALL(*m_workerThread, doIdleGc(_)).Times(0); |
- |
- startAndWaitForInit(); |
- |
- WebScheduler* scheduler = m_workerThread->backingThread().platformThread().scheduler(); |
- |
- // Post a repeating task that should prevent any GC from happening. |
- scheduler->postLoadingTask(FROM_HERE, new RepeatingTask(scheduler, completion.get())); |
- |
- completion->wait(); |
- |
- // Make sure doIdleGc has not been called by this stage. |
- Mock::VerifyAndClearExpectations(m_workerThread.get()); |
- |
- m_workerThread->terminateAndWait(); |
-} |
- |
-TEST_F(WorkerThreadTest, LongGcDeadline_NoFutureTasks) |
-{ |
- OwnPtr<WebWaitableEvent> gcDone = adoptPtr(Platform::current()->createWaitableEvent()); |
- double deadlineLength = 0; |
- |
- ON_CALL(*m_workerThread, doIdleGc(_)).WillByDefault(Invoke( |
- [&gcDone, &deadlineLength](double deadline) |
- { |
- gcDone->signal(); |
- deadlineLength = deadline -Platform::current()->monotonicallyIncreasingTime(); |
- return false; |
- })); |
- |
- EXPECT_CALL(*m_workerThread, doIdleGc(_)).Times(1); |
- |
- startAndWaitForInit(); |
- postWakeUpTask(310ul); |
- |
- gcDone->wait(); |
- |
- // The deadline should be close to 1s in duration if there are no tasks that need to run soon. |
- EXPECT_GT(deadlineLength, 0.9); |
- |
- m_workerThread->terminateAndWait(); |
-} |
- |
-TEST_F(WorkerThreadTest, LongGcDeadline_NextTaskAfterIdlePeriod) |
-{ |
- OwnPtr<WebWaitableEvent> gcDone = adoptPtr(Platform::current()->createWaitableEvent()); |
- double deadlineLength = 0; |
- |
- ON_CALL(*m_workerThread, doIdleGc(_)).WillByDefault(Invoke( |
- [&gcDone, &deadlineLength](double deadline) |
- { |
- gcDone->signal(); |
- deadlineLength = deadline -Platform::current()->monotonicallyIncreasingTime(); |
- return false; |
- })); |
- |
- EXPECT_CALL(*m_workerThread, doIdleGc(_)).Times(1); |
- |
- startAndWaitForInit(); |
- postWakeUpTask(310ul); |
- postWakeUpTask(675ul); // Task that runs shortly after the 50ms idle period ends. |
- |
- gcDone->wait(); |
- |
- // The worker thread calls canExceedIdleDeadlineIfRequired which only considers if |
- // there are any delayed tasks scheduled for the current long idle period. Since the |
- // next task is in the following idle period, a long gc deadline is allowed. |
- EXPECT_GT(deadlineLength, 0.9); |
- |
- m_workerThread->terminateAndWait(); |
-} |
- |
-TEST_F(WorkerThreadTest, ShortGcDeadline) |
-{ |
- OwnPtr<WebWaitableEvent> gcDone = adoptPtr(Platform::current()->createWaitableEvent()); |
- double deadlineLength = 0; |
- |
- ON_CALL(*m_workerThread, doIdleGc(_)).WillByDefault(Invoke( |
- [&gcDone, &deadlineLength](double deadline) |
- { |
- gcDone->signal(); |
- deadlineLength = deadline - Platform::current()->monotonicallyIncreasingTime(); |
- return false; |
- })); |
- |
- EXPECT_CALL(*m_workerThread, doIdleGc(_)).Times(1); |
- |
- startAndWaitForInit(); |
- postWakeUpTask(310ul); |
- postWakeUpTask(625ul); // Task that runs during the idle period. |
- |
- gcDone->wait(); |
- |
- // The deadline should be < 50ms if there's a task that needs to run during the idle period. |
- EXPECT_LT(deadlineLength, 0.025); |
- |
- m_workerThread->terminateAndWait(); |
-} |
- |
} // namespace blink |