Improvements to unit test behavior.

- Standardize the test timeout implementation using a new TestHandler::SetTestTimeout method and enable timeouts for almost all tests. The test timeout can be disabled globally using a new `--disable-test-timeout` command-line flag.
- Wait for TestHandler object destruction at the end of each test using a new ReleaseAndWaitForDestructor function. This avoids test state leakage and verifies that no object references are leaked.

git-svn-id: https://chromiumembedded.googlecode.com/svn/trunk@1964 5089003a-bbd8-11dd-ad1f-f1f9622dbc98
This commit is contained in:
Marshall Greenblatt 2015-01-09 23:40:26 +00:00
parent ba198e9ef1
commit 054300874d
22 changed files with 420 additions and 72 deletions

View File

@ -730,6 +730,9 @@ class CookieTestJSHandler : public TestHandler {
// Create the browser
CreateBrowser(kCookieJSUrl1,
CefRequestContext::CreateContext(context_handler_.get()));
// Time out the test after a reasonable period of time.
SetTestTimeout();
}
void OnLoadEnd(CefRefPtr<CefBrowser> browser,
@ -802,6 +805,8 @@ TEST(CookieTest, GetCookieManagerJS) {
EXPECT_TRUE(handler->got_load_end2_);
EXPECT_TRUE(handler->got_cookie1_);
EXPECT_TRUE(handler->got_cookie2_);
ReleaseAndWaitForDestructor(handler);
}
@ -986,6 +991,9 @@ class CookieTestSchemeHandler : public TestHandler {
// Create the browser
CreateBrowser(url1_,
CefRequestContext::CreateContext(context_handler_.get()));
// Time out the test after a reasonable period of time.
SetTestTimeout();
}
void OnLoadEnd(CefRefPtr<CefBrowser> browser,
@ -1088,6 +1096,8 @@ TEST(CookieTest, GetCookieManagerHttp) {
EXPECT_TRUE(handler->got_cookie1_);
EXPECT_TRUE(handler->got_cookie2_);
EXPECT_TRUE(handler->got_cookie3_);
ReleaseAndWaitForDestructor(handler);
}
// Verify use of multiple cookie managers via a custom scheme.
@ -1109,6 +1119,8 @@ TEST(CookieTest, GetCookieManagerCustom) {
EXPECT_TRUE(handler->got_cookie1_);
EXPECT_TRUE(handler->got_cookie2_);
EXPECT_TRUE(handler->got_cookie3_);
ReleaseAndWaitForDestructor(handler);
}
// Entry point for registering custom schemes.

View File

@ -77,6 +77,9 @@ class DialogTestHandler : public TestHandler {
// Create the browser
CreateBrowser(kTestUrl);
// Time out the test after a reasonable period of time.
SetTestTimeout();
}
void OnLoadEnd(CefRefPtr<CefBrowser> browser,
@ -151,6 +154,7 @@ TEST(DialogTest, FileEmptyParams) {
CefRefPtr<DialogTestHandler> handler = new DialogTestHandler(config);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}
TEST(DialogTest, FileOpen) {
@ -161,6 +165,7 @@ TEST(DialogTest, FileOpen) {
CefRefPtr<DialogTestHandler> handler = new DialogTestHandler(config);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}
TEST(DialogTest, FileOpenCancel) {
@ -170,6 +175,7 @@ TEST(DialogTest, FileOpenCancel) {
CefRefPtr<DialogTestHandler> handler = new DialogTestHandler(config);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}
TEST(DialogTest, FileOpenAsync) {
@ -180,6 +186,7 @@ TEST(DialogTest, FileOpenAsync) {
CefRefPtr<DialogTestHandler> handler = new DialogTestHandler(config);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}
TEST(DialogTest, FileOpenAsyncCancel) {
@ -189,6 +196,7 @@ TEST(DialogTest, FileOpenAsyncCancel) {
CefRefPtr<DialogTestHandler> handler = new DialogTestHandler(config);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}
TEST(DialogTest, FileOpenMultiple) {
@ -200,6 +208,7 @@ TEST(DialogTest, FileOpenMultiple) {
CefRefPtr<DialogTestHandler> handler = new DialogTestHandler(config);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}
TEST(DialogTest, FileOpenMultipleCancel) {
@ -209,6 +218,7 @@ TEST(DialogTest, FileOpenMultipleCancel) {
CefRefPtr<DialogTestHandler> handler = new DialogTestHandler(config);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}
TEST(DialogTest, FileOpenMultipleAsync) {
@ -220,6 +230,7 @@ TEST(DialogTest, FileOpenMultipleAsync) {
CefRefPtr<DialogTestHandler> handler = new DialogTestHandler(config);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}
TEST(DialogTest, FileOpenMultipleAsyncCancel) {
@ -229,6 +240,7 @@ TEST(DialogTest, FileOpenMultipleAsyncCancel) {
CefRefPtr<DialogTestHandler> handler = new DialogTestHandler(config);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}
TEST(DialogTest, FileSave) {
@ -239,6 +251,7 @@ TEST(DialogTest, FileSave) {
CefRefPtr<DialogTestHandler> handler = new DialogTestHandler(config);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}
TEST(DialogTest, FileSaveCancel) {
@ -248,6 +261,7 @@ TEST(DialogTest, FileSaveCancel) {
CefRefPtr<DialogTestHandler> handler = new DialogTestHandler(config);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}
TEST(DialogTest, FileSaveAsync) {
@ -258,6 +272,7 @@ TEST(DialogTest, FileSaveAsync) {
CefRefPtr<DialogTestHandler> handler = new DialogTestHandler(config);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}
TEST(DialogTest, FileSaveAsyncCancel) {
@ -267,4 +282,5 @@ TEST(DialogTest, FileSaveAsyncCancel) {
CefRefPtr<DialogTestHandler> handler = new DialogTestHandler(config);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}

View File

@ -45,6 +45,9 @@ class TitleTestHandler : public TestHandler {
// Create the browser.
CreateBrowser(kTitleUrl1);
// Time out the test after a reasonable period of time.
SetTestTimeout();
}
void OnTitleChange(CefRefPtr<CefBrowser> browser,
@ -109,4 +112,5 @@ class TitleTestHandler : public TestHandler {
TEST(DisplayTest, Title) {
CefRefPtr<TitleTestHandler> handler = new TitleTestHandler();
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}

View File

@ -270,6 +270,9 @@ class TestDOMHandler : public TestHandler {
AddResource(kTestUrl, mainHtml.str(), "text/html");
CreateBrowser(kTestUrl);
// Time out the test after a reasonable period of time.
SetTestTimeout();
}
void OnLoadEnd(CefRefPtr<CefBrowser> browser,
@ -316,6 +319,8 @@ TEST(DOMTest, Read) {
EXPECT_TRUE(handler->got_message_);
EXPECT_TRUE(handler->got_success_);
ReleaseAndWaitForDestructor(handler);
}
// Test DOM modifications.
@ -326,6 +331,8 @@ TEST(DOMTest, Modify) {
EXPECT_TRUE(handler->got_message_);
EXPECT_TRUE(handler->got_success_);
ReleaseAndWaitForDestructor(handler);
}
// Entry point for creating DOM renderer test objects.

View File

@ -133,6 +133,9 @@ class DownloadTestHandler : public TestHandler {
// Create the browser
CreateBrowser(kTestEntryUrl);
// Time out the test after a reasonable period of time.
SetTestTimeout();
}
void OnLoadEnd(CefRefPtr<CefBrowser> browser,
@ -261,4 +264,5 @@ class DownloadTestHandler : public TestHandler {
TEST(DownloadTest, Download) {
CefRefPtr<DownloadTestHandler> handler = new DownloadTestHandler();
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}

View File

@ -13,9 +13,6 @@
#include "tests/cefclient/client_app.h"
#include "tests/unittests/test_handler.h"
// Comment out this define to disable the unit test timeout.
#define TIMEOUT_ENABLED 1
namespace {
// The frame navigation test harness work as follows:
@ -416,11 +413,7 @@ class FrameNavTestHandler : public TestHandler {
public:
explicit FrameNavTestHandler(FrameNavFactoryId factory_id)
: nav_(0),
factory_(FrameNavExpectationsFactoryBrowser::FromID(factory_id))
#if defined(TIMEOUT_ENABLED)
, weak_ptr_factory_(this)
#endif
{
factory_(FrameNavExpectationsFactoryBrowser::FromID(factory_id)) {
EXPECT_FALSE(g_frame_nav_test);
EXPECT_EQ(FNF_ID_INVALID, g_frame_nav_factory_id);
g_frame_nav_test = true;
@ -442,13 +435,8 @@ class FrameNavTestHandler : public TestHandler {
// Create the browser with the initial URL.
CreateBrowser(expectations_->GetMainURL());
#if defined(TIMEOUT_ENABLED)
// Time out the test after a reasonable period of time.
CefPostDelayedTask(TID_UI,
base::Bind(&FrameNavTestHandler::DestroyTest,
weak_ptr_factory_.GetWeakPtr()),
4000);
#endif
SetTestTimeout();
}
// Transition to the next navigation.
@ -552,10 +540,6 @@ class FrameNavTestHandler : public TestHandler {
got_destroyed_.yes();
#if defined(TIMEOUT_ENABLED)
weak_ptr_factory_.InvalidateWeakPtrs();
#endif
// The expectations should have been tested already.
EXPECT_FALSE(expectations_.get());
@ -569,29 +553,15 @@ class FrameNavTestHandler : public TestHandler {
TrackCallback got_destroyed_;
scoped_ptr<FrameNavExpectationsFactoryBrowser> factory_;
scoped_ptr<FrameNavExpectationsBrowser> expectations_;
#if defined(TIMEOUT_ENABLED)
// Must be the last member.
base::WeakPtrFactory<FrameNavTestHandler> weak_ptr_factory_;
#endif
};
// Wait for the the FrameNavTestHandler destructor to be called. This avoids
// problems with setting global variables when running multiple tests.
void WaitForTestHandlerDestruction() {
while (g_frame_nav_test)
base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(100));
}
// Helper for defining frame tests.
#define FRAME_TEST(name, factory_id) \
TEST(FrameTest, name) { \
CefRefPtr<FrameNavTestHandler> handler = \
new FrameNavTestHandler(factory_id); \
handler->ExecuteTest(); \
handler = NULL; \
WaitForTestHandlerDestruction(); \
ReleaseAndWaitForDestructor(handler); \
}

View File

@ -58,6 +58,9 @@ class GeolocationTestHandler : public TestHandler {
// Create the browser
CreateBrowser(kTestUrl);
// Time out the test after a reasonable period of time.
SetTestTimeout();
}
void OnLoadEnd(CefRefPtr<CefBrowser> browser,
@ -146,6 +149,7 @@ TEST(GeolocationTest, HandlerAllow) {
new GeolocationTestHandler(TEST_ALLOW, false);
handler->ExecuteTest();
EXPECT_TRUE(handler->got_allow_);
ReleaseAndWaitForDestructor(handler);
}
TEST(GeolocationTest, HandlerAllowAsync) {
@ -153,6 +157,7 @@ TEST(GeolocationTest, HandlerAllowAsync) {
new GeolocationTestHandler(TEST_ALLOW, true);
handler->ExecuteTest();
EXPECT_TRUE(handler->got_allow_);
ReleaseAndWaitForDestructor(handler);
}
TEST(GeolocationTest, HandlerDeny) {
@ -160,6 +165,7 @@ TEST(GeolocationTest, HandlerDeny) {
new GeolocationTestHandler(TEST_DENY, false);
handler->ExecuteTest();
EXPECT_TRUE(handler->got_deny_);
ReleaseAndWaitForDestructor(handler);
}
TEST(GeolocationTest, HandlerDenyAsync) {
@ -167,6 +173,7 @@ TEST(GeolocationTest, HandlerDenyAsync) {
new GeolocationTestHandler(TEST_DENY, true);
handler->ExecuteTest();
EXPECT_TRUE(handler->got_deny_);
ReleaseAndWaitForDestructor(handler);
}
TEST(GeolocationTest, HandlerCancel) {
@ -174,6 +181,7 @@ TEST(GeolocationTest, HandlerCancel) {
new GeolocationTestHandler(TEST_CANCEL, false);
handler->ExecuteTest();
EXPECT_TRUE(handler->got_cancel_);
ReleaseAndWaitForDestructor(handler);
}

View File

@ -63,6 +63,9 @@ class JSDialogTestHandler : public TestHandler {
// Create the browser
CreateBrowser(kStartUrl);
// Time out the test after a reasonable period of time.
SetTestTimeout();
}
void OnLoadEnd(CefRefPtr<CefBrowser> browser,
@ -190,6 +193,8 @@ TEST(JSDialogTest, AlertSuppress) {
EXPECT_FALSE(handler->got_onbeforeunloaddialog_);
EXPECT_TRUE(handler->got_onresetdialogstate_);
EXPECT_TRUE(handler->got_onloadend_);
ReleaseAndWaitForDestructor(handler);
}
// Alert dialog with immediate callback.
@ -206,6 +211,8 @@ TEST(JSDialogTest, AlertRunImmediate) {
EXPECT_FALSE(handler->got_onbeforeunloaddialog_);
EXPECT_TRUE(handler->got_onresetdialogstate_);
EXPECT_TRUE(handler->got_onloadend_);
ReleaseAndWaitForDestructor(handler);
}
// Alert dialog with delayed callback.
@ -222,6 +229,8 @@ TEST(JSDialogTest, AlertRunDelayed) {
EXPECT_FALSE(handler->got_onbeforeunloaddialog_);
EXPECT_TRUE(handler->got_onresetdialogstate_);
EXPECT_TRUE(handler->got_onloadend_);
ReleaseAndWaitForDestructor(handler);
}
// Confirm dialog with suppression.
@ -238,6 +247,8 @@ TEST(JSDialogTest, ConfirmSuppress) {
EXPECT_FALSE(handler->got_onbeforeunloaddialog_);
EXPECT_TRUE(handler->got_onresetdialogstate_);
EXPECT_TRUE(handler->got_onloadend_);
ReleaseAndWaitForDestructor(handler);
}
// Confirm dialog run immediately return OK.
@ -254,6 +265,8 @@ TEST(JSDialogTest, ConfirmRunImmediateOk) {
EXPECT_FALSE(handler->got_onbeforeunloaddialog_);
EXPECT_TRUE(handler->got_onresetdialogstate_);
EXPECT_TRUE(handler->got_onloadend_);
ReleaseAndWaitForDestructor(handler);
}
// Confirm dialog run immediately return Cancel.
@ -270,6 +283,8 @@ TEST(JSDialogTest, ConfirmRunImmediateCancel) {
EXPECT_FALSE(handler->got_onbeforeunloaddialog_);
EXPECT_TRUE(handler->got_onresetdialogstate_);
EXPECT_TRUE(handler->got_onloadend_);
ReleaseAndWaitForDestructor(handler);
}
// Confirm dialog run delayed return OK.
@ -286,6 +301,8 @@ TEST(JSDialogTest, ConfirmRunDelayedOk) {
EXPECT_FALSE(handler->got_onbeforeunloaddialog_);
EXPECT_TRUE(handler->got_onresetdialogstate_);
EXPECT_TRUE(handler->got_onloadend_);
ReleaseAndWaitForDestructor(handler);
}
// Confirm dialog run delayed return Cancel.
@ -302,6 +319,8 @@ TEST(JSDialogTest, ConfirmRunDelayedCancel) {
EXPECT_FALSE(handler->got_onbeforeunloaddialog_);
EXPECT_TRUE(handler->got_onresetdialogstate_);
EXPECT_TRUE(handler->got_onloadend_);
ReleaseAndWaitForDestructor(handler);
}
// Prompt dialog with suppression.
@ -318,6 +337,8 @@ TEST(JSDialogTest, PromptSuppress) {
EXPECT_FALSE(handler->got_onbeforeunloaddialog_);
EXPECT_TRUE(handler->got_onresetdialogstate_);
EXPECT_TRUE(handler->got_onloadend_);
ReleaseAndWaitForDestructor(handler);
}
// Prompt dialog run immediately return OK.
@ -334,6 +355,8 @@ TEST(JSDialogTest, PromptRunImmediateOk) {
EXPECT_FALSE(handler->got_onbeforeunloaddialog_);
EXPECT_TRUE(handler->got_onresetdialogstate_);
EXPECT_TRUE(handler->got_onloadend_);
ReleaseAndWaitForDestructor(handler);
}
// Prompt dialog run immediately return Cancel.
@ -350,6 +373,8 @@ TEST(JSDialogTest, PromptRunImmediateCancel) {
EXPECT_FALSE(handler->got_onbeforeunloaddialog_);
EXPECT_TRUE(handler->got_onresetdialogstate_);
EXPECT_TRUE(handler->got_onloadend_);
ReleaseAndWaitForDestructor(handler);
}
// Prompt dialog run delayed return OK.
@ -366,6 +391,8 @@ TEST(JSDialogTest, PromptRunDelayedOk) {
EXPECT_FALSE(handler->got_onbeforeunloaddialog_);
EXPECT_TRUE(handler->got_onresetdialogstate_);
EXPECT_TRUE(handler->got_onloadend_);
ReleaseAndWaitForDestructor(handler);
}
// Prompt dialog run delayed return Cancel.
@ -382,6 +409,8 @@ TEST(JSDialogTest, PromptRunDelayedCancel) {
EXPECT_FALSE(handler->got_onbeforeunloaddialog_);
EXPECT_TRUE(handler->got_onresetdialogstate_);
EXPECT_TRUE(handler->got_onloadend_);
ReleaseAndWaitForDestructor(handler);
}
// OnBeforeUnload dialog with immediate callback.
@ -398,6 +427,8 @@ TEST(JSDialogTest, OnBeforeUnloadRunImmediate) {
EXPECT_TRUE(handler->got_onbeforeunloaddialog_);
EXPECT_TRUE(handler->got_onresetdialogstate_);
EXPECT_TRUE(handler->got_onloadend_);
ReleaseAndWaitForDestructor(handler);
}
// OnBeforeUnload dialog with delayed callback.
@ -414,4 +445,6 @@ TEST(JSDialogTest, OnBeforeUnloadRunDelayed) {
EXPECT_TRUE(handler->got_onbeforeunloaddialog_);
EXPECT_TRUE(handler->got_onresetdialogstate_);
EXPECT_TRUE(handler->got_onloadend_);
ReleaseAndWaitForDestructor(handler);
}

View File

@ -34,7 +34,10 @@ class LifeSpanTestHandler : public RoutingTestHandler {
explicit LifeSpanTestHandler(const Settings& settings)
: settings_(settings),
executing_delay_close_(false) {}
executing_delay_close_(false) {
// By default no LifeSpan tests call DestroyTest().
SetDestroyTestExpected(false);
}
void RunTest() override {
// Add the resources that we will navigate to/from.
@ -53,6 +56,8 @@ class LifeSpanTestHandler : public RoutingTestHandler {
// Create the browser.
CreateBrowser(kLifeSpanUrl);
// Intentionally don't call SetTestTimeout() for these tests.
}
void OnAfterCreated(CefRefPtr<CefBrowser> browser) override {
@ -146,6 +151,9 @@ class LifeSpanTestHandler : public RoutingTestHandler {
// Wait a bit to make sure no additional events are received and then close
// the window.
void ScheduleDelayClose() {
// This test will call DestroyTest().
SetDestroyTestExpected(true);
CefPostDelayedTask(TID_UI,
base::Bind(&LifeSpanTestHandler::DelayClose, this), 100);
}
@ -177,6 +185,8 @@ TEST(LifeSpanTest, DoCloseAllow) {
EXPECT_TRUE(handler->got_unload_message_);
EXPECT_TRUE(handler->got_load_end_);
EXPECT_FALSE(handler->got_delay_close_);
ReleaseAndWaitForDestructor(handler);
}
TEST(LifeSpanTest, DoCloseAllowForce) {
@ -193,6 +203,8 @@ TEST(LifeSpanTest, DoCloseAllowForce) {
EXPECT_TRUE(handler->got_unload_message_);
EXPECT_TRUE(handler->got_load_end_);
EXPECT_FALSE(handler->got_delay_close_);
ReleaseAndWaitForDestructor(handler);
}
TEST(LifeSpanTest, DoCloseDisallow) {
@ -208,6 +220,8 @@ TEST(LifeSpanTest, DoCloseDisallow) {
EXPECT_TRUE(handler->got_unload_message_);
EXPECT_TRUE(handler->got_load_end_);
EXPECT_TRUE(handler->got_delay_close_);
ReleaseAndWaitForDestructor(handler);
}
TEST(LifeSpanTest, DoCloseDisallowForce) {
@ -224,6 +238,8 @@ TEST(LifeSpanTest, DoCloseDisallowForce) {
EXPECT_TRUE(handler->got_unload_message_);
EXPECT_TRUE(handler->got_load_end_);
EXPECT_TRUE(handler->got_delay_close_);
ReleaseAndWaitForDestructor(handler);
}
TEST(LifeSpanTest, DoCloseDisallowWithOnUnloadAllow) {
@ -241,6 +257,8 @@ TEST(LifeSpanTest, DoCloseDisallowWithOnUnloadAllow) {
EXPECT_TRUE(handler->got_unload_message_);
EXPECT_TRUE(handler->got_load_end_);
EXPECT_TRUE(handler->got_delay_close_);
ReleaseAndWaitForDestructor(handler);
}
TEST(LifeSpanTest, DoCloseAllowWithOnUnloadForce) {
@ -258,6 +276,8 @@ TEST(LifeSpanTest, DoCloseAllowWithOnUnloadForce) {
EXPECT_TRUE(handler->got_unload_message_);
EXPECT_TRUE(handler->got_load_end_);
EXPECT_FALSE(handler->got_delay_close_);
ReleaseAndWaitForDestructor(handler);
}
TEST(LifeSpanTest, DoCloseDisallowWithOnUnloadForce) {
@ -275,6 +295,8 @@ TEST(LifeSpanTest, DoCloseDisallowWithOnUnloadForce) {
EXPECT_TRUE(handler->got_unload_message_);
EXPECT_TRUE(handler->got_load_end_);
EXPECT_TRUE(handler->got_delay_close_);
ReleaseAndWaitForDestructor(handler);
}
TEST(LifeSpanTest, OnUnloadAllow) {
@ -291,6 +313,8 @@ TEST(LifeSpanTest, OnUnloadAllow) {
EXPECT_TRUE(handler->got_unload_message_);
EXPECT_TRUE(handler->got_load_end_);
EXPECT_FALSE(handler->got_delay_close_);
ReleaseAndWaitForDestructor(handler);
}
TEST(LifeSpanTest, OnUnloadDisallow) {
@ -307,4 +331,6 @@ TEST(LifeSpanTest, OnUnloadDisallow) {
EXPECT_FALSE(handler->got_unload_message_);
EXPECT_TRUE(handler->got_load_end_);
EXPECT_TRUE(handler->got_delay_close_);
ReleaseAndWaitForDestructor(handler);
}

View File

@ -19,9 +19,6 @@
#include "tests/unittests/routing_test_handler.h"
#include "tests/cefclient/client_app.h"
// Comment out this define to disable the unit test timeout.
#define TIMEOUT_ENABLED 1
namespace {
const char kTestDomainRoot[] = "http://tests-mr";
@ -209,12 +206,8 @@ class MRTestHandler : public TestHandler {
void RunTest() override {
RunMRTest();
#if defined(TIMEOUT_ENABLED)
// Time out the test after a reasonable period of time.
CefPostDelayedTask(TID_UI,
base::Bind(&MRTestHandler::DestroyTest, this),
4000);
#endif
SetTestTimeout();
}
void OnAfterCreated(CefRefPtr<CefBrowser> browser) override {
@ -402,12 +395,14 @@ class HarnessTestHandler : public SingleLoadTestHandler {
TEST(MessageRouterTest, HarnessSuccess) {
CefRefPtr<HarnessTestHandler> handler = new HarnessTestHandler(true);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}
// Verify that the test harness works with failed assertions.
TEST(MessageRouterTest, HarnessFailure) {
CefRefPtr<HarnessTestHandler> handler = new HarnessTestHandler(false);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}
@ -608,6 +603,7 @@ TEST(MessageRouterTest, SingleQuerySuccessSyncCallback) {
CefRefPtr<SingleQueryTestHandler> handler =
new SingleQueryTestHandler(SingleQueryTestHandler::SUCCESS, true);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}
// Test that a single query with successful result delivered asynchronously.
@ -615,6 +611,7 @@ TEST(MessageRouterTest, SingleQuerySuccessAsyncCallback) {
CefRefPtr<SingleQueryTestHandler> handler =
new SingleQueryTestHandler(SingleQueryTestHandler::SUCCESS, false);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}
// Test that a single query with failure result delivered synchronously.
@ -622,6 +619,7 @@ TEST(MessageRouterTest, SingleQueryFailureSyncCallback) {
CefRefPtr<SingleQueryTestHandler> handler =
new SingleQueryTestHandler(SingleQueryTestHandler::FAILURE, true);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}
// Test that a single query with failure result delivered asynchronously.
@ -629,6 +627,7 @@ TEST(MessageRouterTest, SingleQueryFailureAsyncCallback) {
CefRefPtr<SingleQueryTestHandler> handler =
new SingleQueryTestHandler(SingleQueryTestHandler::FAILURE, false);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}
// Test that a single query with cancellation.
@ -636,6 +635,7 @@ TEST(MessageRouterTest, SingleQueryCancel) {
CefRefPtr<SingleQueryTestHandler> handler =
new SingleQueryTestHandler(SingleQueryTestHandler::CANCEL, true);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}
@ -836,6 +836,7 @@ TEST(MessageRouterTest, SinglePersistentQuerySuccessSyncCallback) {
new SinglePersistentQueryTestHandler(
SinglePersistentQueryTestHandler::SUCCESS, true);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}
// Test that a single query with successful result delivered asynchronously.
@ -844,6 +845,7 @@ TEST(MessageRouterTest, SinglePersistentQuerySuccessAsyncCallback) {
new SinglePersistentQueryTestHandler(
SinglePersistentQueryTestHandler::SUCCESS, false);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}
// Test that a single query with failure result delivered synchronously.
@ -852,6 +854,7 @@ TEST(MessageRouterTest, SinglePersistentQueryFailureSyncCallback) {
new SinglePersistentQueryTestHandler(
SinglePersistentQueryTestHandler::FAILURE, true);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}
// Test that a single query with failure result delivered asynchronously.
@ -860,6 +863,7 @@ TEST(MessageRouterTest, SinglePersistentQueryFailureAsyncCallback) {
new SinglePersistentQueryTestHandler(
SinglePersistentQueryTestHandler::FAILURE, false);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}
@ -963,6 +967,7 @@ TEST(MessageRouterTest, SingleUnhandledQuery) {
CefRefPtr<SingleUnhandledQueryTestHandler> handler =
new SingleUnhandledQueryTestHandler();
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}
@ -1877,6 +1882,7 @@ class MultiQuerySingleFrameTestHandler :
manager->AddTestQuery(MultiQueryManager::type); \
manager->Finalize(); \
handler->ExecuteTest(); \
ReleaseAndWaitForDestructor(handler); \
}
// Test the query types individually.
@ -1910,6 +1916,7 @@ TEST(MessageRouterTest, MultiQuerySingleFrameSyncSome) {
new MultiQuerySingleFrameTestHandler(true);
MakeTestQueries(handler->GetManager(), true);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}
// Test that one frame can run some queries successfully in an asynchronous
@ -1919,6 +1926,7 @@ TEST(MessageRouterTest, MultiQuerySingleFrameAsyncSome) {
new MultiQuerySingleFrameTestHandler(false);
MakeTestQueries(handler->GetManager(), true);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}
// Test that one frame can run many queries successfully in a synchronous
@ -1928,6 +1936,7 @@ TEST(MessageRouterTest, MultiQuerySingleFrameSyncMany) {
new MultiQuerySingleFrameTestHandler(true);
MakeTestQueries(handler->GetManager(), false);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}
// Test that one frame can run many queries successfully in an asynchronous
@ -1937,6 +1946,7 @@ TEST(MessageRouterTest, MultiQuerySingleFrameAsyncMany) {
new MultiQuerySingleFrameTestHandler(false);
MakeTestQueries(handler->GetManager(), false);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}
// Test that pending queries can be canceled by removing the handler.
@ -1946,6 +1956,7 @@ TEST(MessageRouterTest, MultiQuerySingleFrameCancelByRemovingHandler) {
MultiQuerySingleFrameTestHandler::CANCEL_BY_REMOVING_HANDLER);
MakeTestQueries(handler->GetManager(), false);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}
// Test that pending queries can be canceled by closing the browser.
@ -1955,6 +1966,7 @@ TEST(MessageRouterTest, MultiQuerySingleFrameCancelByClosingBrowser) {
MultiQuerySingleFrameTestHandler::CANCEL_BY_CLOSING_BROWSER);
MakeTestQueries(handler->GetManager(), false);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}
@ -2184,6 +2196,7 @@ TEST(MessageRouterTest, MultiQueryMultiHandler) {
CefRefPtr<MultiQueryMultiHandlerTestHandler> handler =
new MultiQueryMultiHandlerTestHandler(false, false);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}
// Test that multiple handlers behave correctly. Cancel by removing the
@ -2192,6 +2205,7 @@ TEST(MessageRouterTest, MultiQueryMultiHandlerCancelByRemovingHandler) {
CefRefPtr<MultiQueryMultiHandlerTestHandler> handler =
new MultiQueryMultiHandlerTestHandler(false, true);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}
@ -2553,6 +2567,7 @@ TEST(MessageRouterTest, MultiQueryMultiFrameSync) {
CefRefPtr<MultiQueryMultiFrameTestHandler> handler =
new MultiQueryMultiFrameTestHandler(true, false);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}
// Test that multiple frames can run many queries successfully in an
@ -2561,6 +2576,7 @@ TEST(MessageRouterTest, MultiQueryMultiFrameAsync) {
CefRefPtr<MultiQueryMultiFrameTestHandler> handler =
new MultiQueryMultiFrameTestHandler(false, false);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}
// Test that multiple frames can run many queries successfully in a synchronous
@ -2569,6 +2585,7 @@ TEST(MessageRouterTest, MultiQueryMultiFrameSyncSubnavCancel) {
CefRefPtr<MultiQueryMultiFrameTestHandler> handler =
new MultiQueryMultiFrameTestHandler(true, true);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}
// Test that multiple frames can run many queries successfully in an
@ -2577,6 +2594,7 @@ TEST(MessageRouterTest, MultiQueryMultiFrameAsyncSubnavCancel) {
CefRefPtr<MultiQueryMultiFrameTestHandler> handler =
new MultiQueryMultiFrameTestHandler(false, true);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}
@ -2717,6 +2735,7 @@ TEST(MessageRouterTest, MultiQueryMultiBrowserSameOriginSync) {
CefRefPtr<MultiQueryMultiBrowserTestHandler> handler =
new MultiQueryMultiBrowserTestHandler(true, true);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}
// Test that multiple browsers can query simultaniously from the same origin.
@ -2724,6 +2743,7 @@ TEST(MessageRouterTest, MultiQueryMultiBrowserSameOriginAsync) {
CefRefPtr<MultiQueryMultiBrowserTestHandler> handler =
new MultiQueryMultiBrowserTestHandler(false, true);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}
// Test that multiple browsers can query simultaniously from different origins.
@ -2731,6 +2751,7 @@ TEST(MessageRouterTest, MultiQueryMultiBrowserDifferentOriginSync) {
CefRefPtr<MultiQueryMultiBrowserTestHandler> handler =
new MultiQueryMultiBrowserTestHandler(true, false);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}
// Test that multiple browsers can query simultaniously from different origins.
@ -2738,6 +2759,7 @@ TEST(MessageRouterTest, MultiQueryMultiBrowserDifferentOriginAsync) {
CefRefPtr<MultiQueryMultiBrowserTestHandler> handler =
new MultiQueryMultiBrowserTestHandler(false, false);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}
@ -2791,6 +2813,7 @@ TEST(MessageRouterTest, MultiQueryMultiNavigateSameOriginSync) {
CefRefPtr<MultiQueryMultiNavigateTestHandler> handler =
new MultiQueryMultiNavigateTestHandler(true, true);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}
// Test that multiple navigations can query from the same origin.
@ -2798,6 +2821,7 @@ TEST(MessageRouterTest, MultiQueryMultiNavigateSameOriginAsync) {
CefRefPtr<MultiQueryMultiNavigateTestHandler> handler =
new MultiQueryMultiNavigateTestHandler(false, true);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}
// Test that multiple navigations can query from different origins.
@ -2805,6 +2829,7 @@ TEST(MessageRouterTest, MultiQueryMultiNavigateDifferentOriginSync) {
CefRefPtr<MultiQueryMultiNavigateTestHandler> handler =
new MultiQueryMultiNavigateTestHandler(true, false);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}
// Test that multiple navigations can query from different origins.
@ -2812,4 +2837,5 @@ TEST(MessageRouterTest, MultiQueryMultiNavigateDifferentOriginAsync) {
CefRefPtr<MultiQueryMultiNavigateTestHandler> handler =
new MultiQueryMultiNavigateTestHandler(false, false);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}

View File

@ -360,6 +360,9 @@ class HistoryNavTestHandler : public TestHandler {
// Create the browser.
CreateBrowser(CefString());
// Time out the test after a reasonable period of time.
SetTestTimeout();
}
void RunNav(CefRefPtr<CefBrowser> browser) {
@ -591,6 +594,8 @@ TEST(NavigationTest, History) {
ASSERT_TRUE(handler->got_correct_can_go_forward2_[i]) << "i = " << i;
}
}
ReleaseAndWaitForDestructor(handler);
}
@ -724,6 +729,9 @@ class RedirectTestHandler : public TestHandler {
void RunTest() override {
// Create the browser.
CreateBrowser(kRNav1);
// Time out the test after a reasonable period of time.
SetTestTimeout();
}
bool OnBeforeResourceLoad(CefRefPtr<CefBrowser> browser,
@ -842,6 +850,8 @@ TEST(NavigationTest, Redirect) {
ASSERT_TRUE(g_got_nav3_request);
ASSERT_TRUE(g_got_nav4_request);
ASSERT_FALSE(g_got_invalid_request);
ReleaseAndWaitForDestructor(handler);
}
@ -1219,6 +1229,9 @@ class OrderNavTestHandler : public TestHandler {
// Create the browser.
CreateBrowser(KONav1);
// Time out the test after a reasonable period of time.
SetTestTimeout();
}
void ContinueIfReady(CefRefPtr<CefBrowser> browser) {
@ -1415,6 +1428,7 @@ TEST(NavigationTest, Order) {
new OrderNavTestHandler();
handler->ExecuteTest();
g_order_nav_test = false;
ReleaseAndWaitForDestructor(handler);
}
@ -1628,6 +1642,9 @@ class CrossOriginNavTestHandler : public TestHandler {
// Create the browser.
CreateBrowser(kCrossOriginNav1);
// Time out the test after a reasonable period of time.
SetTestTimeout();
}
void ContinueIfReady(CefRefPtr<CefBrowser> browser) {
@ -1739,6 +1756,7 @@ TEST(NavigationTest, CrossOrigin) {
new CrossOriginNavTestHandler();
handler->ExecuteTest();
g_cross_origin_nav_test = false;
ReleaseAndWaitForDestructor(handler);
}
@ -1765,6 +1783,9 @@ class PopupNavTestHandler : public TestHandler {
// Create the browser.
CreateBrowser(kPopupNavPageUrl);
// Time out the test after a reasonable period of time.
SetTestTimeout();
}
bool OnBeforePopup(CefRefPtr<CefBrowser> browser,
@ -1836,12 +1857,14 @@ class PopupNavTestHandler : public TestHandler {
TEST(NavigationTest, PopupAllow) {
CefRefPtr<PopupNavTestHandler> handler = new PopupNavTestHandler(true);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}
// Test denying popups.
TEST(NavigationTest, PopupDeny) {
CefRefPtr<PopupNavTestHandler> handler = new PopupNavTestHandler(false);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}
@ -1857,15 +1880,13 @@ class BrowseNavTestHandler : public TestHandler {
destroyed_(false) {}
void RunTest() override {
AddResource(kBrowseNavPageUrl, "<html>Test</html>", "text/html");
AddResource(kBrowseNavPageUrl, "<html>Test</html>", "text/html");
// Create the browser.
CreateBrowser(kBrowseNavPageUrl);
// Time out the test after a reasonable period of time.
CefPostDelayedTask(TID_UI,
base::Bind(&BrowseNavTestHandler::DestroyTest, this),
2000);
SetTestTimeout();
}
bool OnBeforeBrowse(CefRefPtr<CefBrowser> browser,
@ -1997,12 +2018,14 @@ class BrowseNavTestHandler : public TestHandler {
TEST(NavigationTest, BrowseAllow) {
CefRefPtr<BrowseNavTestHandler> handler = new BrowseNavTestHandler(true);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}
// Test denying navigation.
TEST(NavigationTest, BrowseDeny) {
CefRefPtr<BrowseNavTestHandler> handler = new BrowseNavTestHandler(false);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}

View File

@ -35,8 +35,6 @@ const char kTestUrl[] = "http://tests/osrtest";
// this html should render on a 600 x 400 window with a little vertical
// offset with scrollbar.
// #define DEBUGGER_ATTACHED
// default osr widget size
const int kOsrWidth = 600;
const int kOsrHeight = 400;
@ -205,13 +203,9 @@ class OSRTestHandler : public RoutingTestHandler,
// TestHandler methods
void RunTest() override {
CreateOSRBrowser(kTestUrl);
#if !defined(DEBUGGER_ATTACHED)
// Each test has a 5 second timeout. After this timeout it will be destroyed
// and the test will fail. DestroyTest will be called at the timeout even
// if the test is already destroyed and this is fine.
CefPostDelayedTask(TID_UI, base::Bind(&OSRTestHandler::DestroyTest, this),
5000);
#endif // DEBUGGER_ATTACHED
// Time out the test after a reasonable period of time.
SetTestTimeout();
}
void OnAfterCreated(CefRefPtr<CefBrowser> browser) override {
@ -1007,6 +1001,7 @@ class OSRTestHandler : public RoutingTestHandler,
int event_total_;
bool started_;
TrackCallback got_update_cursor_;
IMPLEMENT_REFCOUNTING(OSRTestHandler);
};
@ -1019,6 +1014,7 @@ TEST(OSRTest, name) {\
new OSRTestHandler(test_mode, scale_factor);\
handler->ExecuteTest();\
EXPECT_TRUE(handler->succeeded());\
ReleaseAndWaitForDestructor(handler);\
}
// tests

View File

@ -80,6 +80,9 @@ class SendRecvTestHandler : public TestHandler {
AddResource(kSendRecvUrl, "<html><body>TEST</body></html>", "text/html");
CreateBrowser(kSendRecvUrl);
// Time out the test after a reasonable period of time.
SetTestTimeout();
}
void OnLoadEnd(CefRefPtr<CefBrowser> browser,
@ -121,6 +124,8 @@ TEST(ProcessMessageTest, SendRecv) {
handler->ExecuteTest();
EXPECT_TRUE(handler->got_message_);
ReleaseAndWaitForDestructor(handler);
}
// Verify create.

View File

@ -134,6 +134,9 @@ class CookieTestHandler : public TestHandler {
// Create browser that loads the 1st URL.
CreateBrowser(url_, context_);
// Time out the test after a reasonable period of time.
SetTestTimeout();
}
void OnLoadEnd(CefRefPtr<CefBrowser> browser,
@ -208,6 +211,7 @@ TEST(RequestContextTest, GetCookieManager) {
new CookieTestHandler(
"http://tests-simple-rch.com/nav1.html");
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}
namespace {
@ -290,6 +294,9 @@ class PopupTestHandler : public TestHandler {
// Create browser that loads the 1st URL.
CreateBrowser(url_, context_);
// Time out the test after a reasonable period of time.
SetTestTimeout();
}
void OnLoadEnd(CefRefPtr<CefBrowser> browser,
@ -432,6 +439,7 @@ TEST(RequestContextTest, WindowOpenSameOrigin) {
new PopupTestHandler(true,
PopupTestHandler::MODE_WINDOW_OPEN);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}
TEST(RequestContextTest, WindowOpenDifferentOrigin) {
@ -439,6 +447,7 @@ TEST(RequestContextTest, WindowOpenDifferentOrigin) {
new PopupTestHandler(false,
PopupTestHandler::MODE_WINDOW_OPEN);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}
// Test that a popup created using a targeted link will get the same request
@ -448,6 +457,7 @@ TEST(RequestContextTest, TargetedLinkSameOrigin) {
new PopupTestHandler(true,
PopupTestHandler::MODE_TARGETED_LINK);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}
TEST(RequestContextTest, TargetedLinkDifferentOrigin) {
@ -455,6 +465,7 @@ TEST(RequestContextTest, TargetedLinkDifferentOrigin) {
new PopupTestHandler(false,
PopupTestHandler::MODE_TARGETED_LINK);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}
@ -466,6 +477,7 @@ TEST(RequestContextTest, NoReferrerLinkSameOrigin) {
new PopupTestHandler(true,
PopupTestHandler::MODE_NOREFERRER_LINK);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}
TEST(RequestContextTest, NoReferrerLinkDifferentOrigin) {
@ -473,4 +485,5 @@ TEST(RequestContextTest, NoReferrerLinkDifferentOrigin) {
new PopupTestHandler(false,
PopupTestHandler::MODE_NOREFERRER_LINK);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}

View File

@ -123,6 +123,9 @@ class NetNotifyTestHandler : public TestHandler {
// Navigate to the 2nd URL.
context_handler_->SetURL(url2_);
GetBrowser()->GetMainFrame()->LoadURL(url2_);
// Time out the test after a reasonable period of time.
SetTestTimeout();
}
bool OnBeforeResourceLoad(CefRefPtr<CefBrowser> browser,
@ -448,6 +451,10 @@ void RunNetNotifyTest(NetNotifyTestType test_type, bool same_origin) {
collection.ExecuteTests();
ReleaseAndWaitForDestructor(handler1);
ReleaseAndWaitForDestructor(handler2);
ReleaseAndWaitForDestructor(handler3);
g_net_notify_test = false;
}

View File

@ -15,9 +15,6 @@
#include "tests/unittests/test_handler.h"
#include "tests/unittests/test_util.h"
// Comment out this define to disable the unit test timeout.
#define TIMEOUT_ENABLED 1
// Verify Set/Get methods for CefRequest, CefPostData and CefPostDataElement.
TEST(RequestTest, SetGet) {
// CefRequest CreateRequest
@ -149,6 +146,9 @@ class RequestSendRecvTestHandler : public TestHandler {
// Create the browser
CreateBrowser("about:blank");
// Time out the test after a reasonable period of time.
SetTestTimeout();
}
void OnAfterCreated(CefRefPtr<CefBrowser> browser) override {
@ -204,6 +204,8 @@ TEST(RequestTest, SendRecv) {
ASSERT_TRUE(handler->got_before_resource_load_);
ASSERT_TRUE(handler->got_resource_handler_);
ReleaseAndWaitForDestructor(handler);
}
namespace {
@ -437,11 +439,8 @@ class TypeTestHandler : public TestHandler {
CreateBrowser(std::string(kTypeTestOrigin) + "main.html");
#if defined(TIMEOUT_ENABLED)
// Time out the test after a reasonable period of time.
CefPostDelayedTask(TID_UI, base::Bind(&TypeTestHandler::DestroyTest, this),
2000);
#endif
SetTestTimeout();
}
bool OnBeforeBrowse(CefRefPtr<CefBrowser> browser,
@ -536,6 +535,7 @@ TEST(RequestTest, ResourceAndTransitionType) {
CefRefPtr<TypeTestHandler> handler =
new TypeTestHandler();
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}

View File

@ -89,6 +89,9 @@ class TestSchemeHandler : public TestHandler {
void RunTest() override {
CreateBrowser(test_results_->url);
// Time out the test after a reasonable period of time.
SetTestTimeout();
}
// Necessary to make the method public in order to destroy the test from
@ -505,6 +508,8 @@ TEST(SchemeHandlerTest, Registration) {
g_TestResults.got_error.reset();
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
EXPECT_TRUE(g_TestResults.got_request);
EXPECT_TRUE(g_TestResults.got_read);
EXPECT_TRUE(g_TestResults.got_output);
@ -522,6 +527,7 @@ TEST(SchemeHandlerTest, CustomStandardNormalResponse) {
CefRefPtr<TestSchemeHandler> handler = new TestSchemeHandler(&g_TestResults);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
EXPECT_TRUE(g_TestResults.got_request);
EXPECT_TRUE(g_TestResults.got_read);
@ -542,6 +548,7 @@ TEST(SchemeHandlerTest, CustomStandardNormalResponseDelayed) {
CefRefPtr<TestSchemeHandler> handler = new TestSchemeHandler(&g_TestResults);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
EXPECT_TRUE(g_TestResults.got_request);
EXPECT_TRUE(g_TestResults.got_read);
@ -560,6 +567,7 @@ TEST(SchemeHandlerTest, CustomNonStandardNormalResponse) {
CefRefPtr<TestSchemeHandler> handler = new TestSchemeHandler(&g_TestResults);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
EXPECT_TRUE(g_TestResults.got_request);
EXPECT_TRUE(g_TestResults.got_read);
@ -578,6 +586,7 @@ TEST(SchemeHandlerTest, CustomStandardErrorResponse) {
CefRefPtr<TestSchemeHandler> handler = new TestSchemeHandler(&g_TestResults);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
EXPECT_TRUE(g_TestResults.got_request);
EXPECT_TRUE(g_TestResults.got_read);
@ -596,6 +605,7 @@ TEST(SchemeHandlerTest, CustomNonStandardErrorResponse) {
CefRefPtr<TestSchemeHandler> handler = new TestSchemeHandler(&g_TestResults);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
EXPECT_TRUE(g_TestResults.got_request);
EXPECT_TRUE(g_TestResults.got_read);
@ -612,6 +622,7 @@ TEST(SchemeHandlerTest, CustomStandardNameNotHandled) {
CefRefPtr<TestSchemeHandler> handler = new TestSchemeHandler(&g_TestResults);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
EXPECT_FALSE(g_TestResults.got_request);
EXPECT_FALSE(g_TestResults.got_read);
@ -628,6 +639,7 @@ TEST(SchemeHandlerTest, CustomNonStandardNameNotHandled) {
CefRefPtr<TestSchemeHandler> handler = new TestSchemeHandler(&g_TestResults);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
EXPECT_FALSE(g_TestResults.got_request);
EXPECT_FALSE(g_TestResults.got_read);
@ -644,6 +656,7 @@ TEST(SchemeHandlerTest, CustomStandardDomainNotHandled) {
CefRefPtr<TestSchemeHandler> handler = new TestSchemeHandler(&g_TestResults);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
EXPECT_FALSE(g_TestResults.got_request);
EXPECT_FALSE(g_TestResults.got_read);
@ -659,6 +672,7 @@ TEST(SchemeHandlerTest, CustomStandardNoResponse) {
CefRefPtr<TestSchemeHandler> handler = new TestSchemeHandler(&g_TestResults);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
EXPECT_TRUE(g_TestResults.got_request);
EXPECT_FALSE(g_TestResults.got_read);
@ -674,6 +688,7 @@ TEST(SchemeHandlerTest, CustomNonStandardNoResponse) {
CefRefPtr<TestSchemeHandler> handler = new TestSchemeHandler(&g_TestResults);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
EXPECT_TRUE(g_TestResults.got_request);
EXPECT_FALSE(g_TestResults.got_read);
@ -692,6 +707,7 @@ TEST(SchemeHandlerTest, CustomStandardRedirect) {
CefRefPtr<TestSchemeHandler> handler = new TestSchemeHandler(&g_TestResults);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
EXPECT_TRUE(g_TestResults.got_request);
EXPECT_TRUE(g_TestResults.got_read);
@ -711,6 +727,7 @@ TEST(SchemeHandlerTest, CustomNonStandardRedirect) {
CefRefPtr<TestSchemeHandler> handler = new TestSchemeHandler(&g_TestResults);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
EXPECT_TRUE(g_TestResults.got_request);
EXPECT_TRUE(g_TestResults.got_read);
@ -731,6 +748,7 @@ TEST(SchemeHandlerTest, CustomStandardXHRSameOriginSync) {
CefRefPtr<TestSchemeHandler> handler = new TestSchemeHandler(&g_TestResults);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
EXPECT_TRUE(g_TestResults.got_request);
EXPECT_TRUE(g_TestResults.got_read);
@ -754,6 +772,7 @@ TEST(SchemeHandlerTest, CustomStandardXHRSameOriginAsync) {
CefRefPtr<TestSchemeHandler> handler = new TestSchemeHandler(&g_TestResults);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
EXPECT_TRUE(g_TestResults.got_request);
EXPECT_TRUE(g_TestResults.got_read);
@ -776,6 +795,7 @@ TEST(SchemeHandlerTest, CustomNonStandardXHRSameOriginSync) {
CefRefPtr<TestSchemeHandler> handler = new TestSchemeHandler(&g_TestResults);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
EXPECT_TRUE(g_TestResults.got_request);
EXPECT_TRUE(g_TestResults.got_read);
@ -799,6 +819,7 @@ TEST(SchemeHandlerTest, CustomNonStandardXHRSameOriginAsync) {
CefRefPtr<TestSchemeHandler> handler = new TestSchemeHandler(&g_TestResults);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
EXPECT_TRUE(g_TestResults.got_request);
EXPECT_TRUE(g_TestResults.got_read);
@ -818,6 +839,7 @@ TEST(SchemeHandlerTest, CustomStandardXSSSameOrigin) {
CefRefPtr<TestSchemeHandler> handler = new TestSchemeHandler(&g_TestResults);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
EXPECT_TRUE(g_TestResults.got_request);
EXPECT_TRUE(g_TestResults.got_read);
@ -837,6 +859,7 @@ TEST(SchemeHandlerTest, CustomNonStandardXSSSameOrigin) {
CefRefPtr<TestSchemeHandler> handler = new TestSchemeHandler(&g_TestResults);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
EXPECT_TRUE(g_TestResults.got_request);
EXPECT_TRUE(g_TestResults.got_read);
@ -861,6 +884,7 @@ TEST(SchemeHandlerTest, CustomStandardXHRDifferentOriginSync) {
CefRefPtr<TestSchemeHandler> handler = new TestSchemeHandler(&g_TestResults);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
EXPECT_TRUE(g_TestResults.got_request);
EXPECT_TRUE(g_TestResults.got_read);
@ -886,6 +910,7 @@ TEST(SchemeHandlerTest, CustomStandardXHRDifferentOriginAsync) {
CefRefPtr<TestSchemeHandler> handler = new TestSchemeHandler(&g_TestResults);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
EXPECT_TRUE(g_TestResults.got_request);
EXPECT_TRUE(g_TestResults.got_read);
@ -907,6 +932,7 @@ TEST(SchemeHandlerTest, CustomStandardXSSDifferentOrigin) {
CefRefPtr<TestSchemeHandler> handler = new TestSchemeHandler(&g_TestResults);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
EXPECT_TRUE(g_TestResults.got_request);
EXPECT_TRUE(g_TestResults.got_read);
@ -931,6 +957,7 @@ TEST(SchemeHandlerTest, HttpXHRDifferentOriginSync) {
CefRefPtr<TestSchemeHandler> handler = new TestSchemeHandler(&g_TestResults);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
EXPECT_TRUE(g_TestResults.got_request);
EXPECT_TRUE(g_TestResults.got_read);
@ -956,6 +983,7 @@ TEST(SchemeHandlerTest, HttpXHRDifferentOriginAsync) {
CefRefPtr<TestSchemeHandler> handler = new TestSchemeHandler(&g_TestResults);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
EXPECT_TRUE(g_TestResults.got_request);
EXPECT_TRUE(g_TestResults.got_read);
@ -977,6 +1005,7 @@ TEST(SchemeHandlerTest, HttpXSSDifferentOrigin) {
CefRefPtr<TestSchemeHandler> handler = new TestSchemeHandler(&g_TestResults);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
EXPECT_TRUE(g_TestResults.got_request);
EXPECT_TRUE(g_TestResults.got_read);
@ -1003,6 +1032,7 @@ TEST(SchemeHandlerTest, CustomStandardXHRDifferentOriginWithHeaderSync) {
CefRefPtr<TestSchemeHandler> handler = new TestSchemeHandler(&g_TestResults);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
EXPECT_TRUE(g_TestResults.got_request);
EXPECT_TRUE(g_TestResults.got_read);
@ -1030,6 +1060,7 @@ TEST(SchemeHandlerTest, CustomStandardXHRDifferentOriginWithHeaderAsync) {
CefRefPtr<TestSchemeHandler> handler = new TestSchemeHandler(&g_TestResults);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
EXPECT_TRUE(g_TestResults.got_request);
EXPECT_TRUE(g_TestResults.got_read);
@ -1058,6 +1089,7 @@ TEST(SchemeHandlerTest, CustomStandardXHRDifferentOriginWithWhitelistSync1) {
CefRefPtr<TestSchemeHandler> handler = new TestSchemeHandler(&g_TestResults);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
EXPECT_TRUE(g_TestResults.got_request);
EXPECT_TRUE(g_TestResults.got_read);
@ -1088,6 +1120,7 @@ TEST(SchemeHandlerTest, CustomStandardXHRDifferentOriginWithWhitelistSync2) {
CefRefPtr<TestSchemeHandler> handler = new TestSchemeHandler(&g_TestResults);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
EXPECT_TRUE(g_TestResults.got_request);
EXPECT_TRUE(g_TestResults.got_read);
@ -1118,6 +1151,7 @@ TEST(SchemeHandlerTest, CustomStandardXHRDifferentOriginWithWhitelistSync3) {
CefRefPtr<TestSchemeHandler> handler = new TestSchemeHandler(&g_TestResults);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
EXPECT_TRUE(g_TestResults.got_request);
EXPECT_TRUE(g_TestResults.got_read);
@ -1150,6 +1184,7 @@ TEST(SchemeHandlerTest, CustomStandardXHRDifferentOriginWithWhitelistAsync1) {
CefRefPtr<TestSchemeHandler> handler = new TestSchemeHandler(&g_TestResults);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
EXPECT_TRUE(g_TestResults.got_request);
EXPECT_TRUE(g_TestResults.got_read);
@ -1181,6 +1216,7 @@ TEST(SchemeHandlerTest, CustomStandardXHRDifferentOriginWithWhitelistAsync2) {
CefRefPtr<TestSchemeHandler> handler = new TestSchemeHandler(&g_TestResults);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
EXPECT_TRUE(g_TestResults.got_request);
EXPECT_TRUE(g_TestResults.got_read);
@ -1212,6 +1248,7 @@ TEST(SchemeHandlerTest, CustomStandardXHRDifferentOriginWithWhitelistAsync3) {
CefRefPtr<TestSchemeHandler> handler = new TestSchemeHandler(&g_TestResults);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
EXPECT_TRUE(g_TestResults.got_request);
EXPECT_TRUE(g_TestResults.got_read);
@ -1240,6 +1277,7 @@ TEST(SchemeHandlerTest, HttpXHRDifferentOriginWithHeaderSync) {
CefRefPtr<TestSchemeHandler> handler = new TestSchemeHandler(&g_TestResults);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
EXPECT_TRUE(g_TestResults.got_request);
EXPECT_TRUE(g_TestResults.got_read);
@ -1266,6 +1304,7 @@ TEST(SchemeHandlerTest, HttpXHRDifferentOriginWithHeaderAsync) {
CefRefPtr<TestSchemeHandler> handler = new TestSchemeHandler(&g_TestResults);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
EXPECT_TRUE(g_TestResults.got_request);
EXPECT_TRUE(g_TestResults.got_read);
@ -1288,6 +1327,7 @@ TEST(SchemeHandlerTest, CustomStandardXSSDifferentOriginWithDomain) {
CefRefPtr<TestSchemeHandler> handler = new TestSchemeHandler(&g_TestResults);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
EXPECT_TRUE(g_TestResults.got_request);
EXPECT_TRUE(g_TestResults.got_read);
@ -1310,6 +1350,7 @@ TEST(SchemeHandlerTest, HttpXSSDifferentOriginWithDomain) {
CefRefPtr<TestSchemeHandler> handler = new TestSchemeHandler(&g_TestResults);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
EXPECT_TRUE(g_TestResults.got_request);
EXPECT_TRUE(g_TestResults.got_read);
@ -1335,6 +1376,7 @@ TEST(SchemeHandlerTest, CustomStandardXHRDifferentOriginRedirectSync) {
CefRefPtr<TestSchemeHandler> handler = new TestSchemeHandler(&g_TestResults);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
EXPECT_TRUE(g_TestResults.got_request);
EXPECT_TRUE(g_TestResults.got_read);
@ -1362,6 +1404,7 @@ TEST(SchemeHandlerTest, CustomStandardXHRDifferentOriginRedirectAsync) {
CefRefPtr<TestSchemeHandler> handler = new TestSchemeHandler(&g_TestResults);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
EXPECT_TRUE(g_TestResults.got_request);
EXPECT_TRUE(g_TestResults.got_read);
@ -1395,6 +1438,7 @@ TEST(SchemeHandlerTest,
CefRefPtr<TestSchemeHandler> handler = new TestSchemeHandler(&g_TestResults);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
EXPECT_TRUE(g_TestResults.got_request);
EXPECT_TRUE(g_TestResults.got_read);
@ -1433,6 +1477,7 @@ TEST(SchemeHandlerTest,
CefRefPtr<TestSchemeHandler> handler = new TestSchemeHandler(&g_TestResults);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
EXPECT_TRUE(g_TestResults.got_request);
EXPECT_TRUE(g_TestResults.got_read);
@ -1467,6 +1512,7 @@ TEST(SchemeHandlerTest,
CefRefPtr<TestSchemeHandler> handler = new TestSchemeHandler(&g_TestResults);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
EXPECT_TRUE(g_TestResults.got_request);
EXPECT_TRUE(g_TestResults.got_read);
@ -1501,6 +1547,7 @@ TEST(SchemeHandlerTest,
CefRefPtr<TestSchemeHandler> handler = new TestSchemeHandler(&g_TestResults);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
EXPECT_TRUE(g_TestResults.got_request);
EXPECT_TRUE(g_TestResults.got_read);

View File

@ -16,9 +16,6 @@
#include "testing/gtest/include/gtest/gtest.h"
#include "tests/unittests/routing_test_handler.h"
// Comment out this define to disable the unit test timeout.
#define TIMEOUT_ENABLED 1
namespace {
const char kTestUrl[] = "http://tests-srh/test.html";
@ -106,11 +103,8 @@ class ReadTestHandler : public RoutingTestHandler {
// Create the browser.
CreateBrowser(kTestUrl);
#if defined(TIMEOUT_ENABLED)
// Time out the test after a reasonable period of time.
CefPostDelayedTask(TID_UI,
base::Bind(&ReadTestHandler::DestroyTest, this), 3000);
#endif
SetTestTimeout();
}
CefRefPtr<CefResourceHandler> GetResourceHandler(
@ -183,9 +177,11 @@ class ReadTestHandler : public RoutingTestHandler {
TEST(StreamResourceHandlerTest, ReadWillBlock) {
CefRefPtr<ReadTestHandler> handler = new ReadTestHandler(true);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}
TEST(StreamResourceHandlerTest, ReadWontBlock) {
CefRefPtr<ReadTestHandler> handler = new ReadTestHandler(false);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}

View File

@ -78,13 +78,46 @@ void TestHandler::Collection::ExecuteTests() {
}
// TestHandler::UIThreadHelper
TestHandler::UIThreadHelper::UIThreadHelper()
: weak_ptr_factory_(this) {
}
void TestHandler::UIThreadHelper::PostTask(const base::Closure& task) {
EXPECT_UI_THREAD();
CefPostTask(
TID_UI,
base::Bind(&UIThreadHelper::TaskHelper,
weak_ptr_factory_.GetWeakPtr(), task));
}
void TestHandler::UIThreadHelper::PostDelayedTask(
const base::Closure& task, int delay_ms) {
EXPECT_UI_THREAD();
CefPostDelayedTask(
TID_UI,
base::Bind(&UIThreadHelper::TaskHelper,
weak_ptr_factory_.GetWeakPtr(), task),
delay_ms);
}
void TestHandler::UIThreadHelper::TaskHelper(const base::Closure& task) {
EXPECT_UI_THREAD();
task.Run();
}
// TestHandler
int TestHandler::browser_count_ = 0;
TestHandler::TestHandler(CompletionState* completion_state)
: first_browser_id_(0),
signal_completion_when_all_browsers_close_(true) {
signal_completion_when_all_browsers_close_(true),
destroy_event_(NULL),
destroy_test_expected_(true),
destroy_test_called_(false) {
if (completion_state) {
completion_state_ = completion_state;
completion_state_owned_ = false;
@ -95,10 +128,18 @@ TestHandler::TestHandler(CompletionState* completion_state)
}
TestHandler::~TestHandler() {
DCHECK(!ui_thread_helper_.get());
if (destroy_test_expected_)
EXPECT_TRUE(destroy_test_called_);
else
EXPECT_FALSE(destroy_test_called_);
EXPECT_TRUE(browser_map_.empty());
if (completion_state_owned_)
delete completion_state_;
if (destroy_event_)
destroy_event_->Signal();
}
void TestHandler::OnAfterCreated(CefRefPtr<CefBrowser> browser) {
@ -189,10 +230,14 @@ void TestHandler::GetAllBrowsers(BrowserMap* map) {
void TestHandler::ExecuteTest() {
EXPECT_EQ(completion_state_->total(), 1);
// Run the test
// Reset any state from the previous run.
if (destroy_test_called_)
destroy_test_called_ = false;
// Run the test.
RunTest();
// Wait for the test to complete
// Wait for the test to complete.
completion_state_->WaitForTests();
}
@ -207,6 +252,11 @@ void TestHandler::DestroyTest() {
return;
}
EXPECT_TRUE(destroy_test_expected_);
if (destroy_test_called_)
return;
destroy_test_called_ = true;
if (!browser_map_.empty()) {
// Use a copy of the map since the original may be modified while we're
// iterating.
@ -217,6 +267,15 @@ void TestHandler::DestroyTest() {
for (; it != browser_map.end(); ++it)
it->second->GetHost()->CloseBrowser(false);
}
if (ui_thread_helper_.get())
ui_thread_helper_.reset(NULL);
}
void TestHandler::OnTestTimeout(int timeout_ms) {
EXPECT_UI_THREAD();
EXPECT_TRUE(false) << "Test timed out after " << timeout_ms << "ms";
DestroyTest();
}
void TestHandler::CreateBrowser(
@ -260,6 +319,24 @@ void TestHandler::ClearResources() {
resource_map_.clear();
}
void TestHandler::SetTestTimeout(int timeout_ms) {
if (!CefCurrentlyOn(TID_UI)) {
CefPostTask(TID_UI, base::Bind(&TestHandler::SetTestTimeout, this,
timeout_ms));
return;
}
if (CefCommandLine::GetGlobalCommandLine()->HasSwitch("disable-test-timeout"))
return;
// Use a weak reference to |this| via UIThreadHelper so that the TestHandler
// can be destroyed before the timeout expires.
GetUIThreadHelper()->PostDelayedTask(
base::Bind(&TestHandler::OnTestTimeout, base::Unretained(this),
timeout_ms),
timeout_ms);
}
void TestHandler::TestComplete() {
if (!CefCurrentlyOn(TID_UI)) {
CefPostTask(TID_UI, base::Bind(&TestHandler::TestComplete, this));
@ -270,6 +347,15 @@ void TestHandler::TestComplete() {
completion_state_->TestComplete();
}
TestHandler::UIThreadHelper* TestHandler::GetUIThreadHelper() {
EXPECT_UI_THREAD();
EXPECT_FALSE(destroy_test_called_);
if (!ui_thread_helper_.get())
ui_thread_helper_.reset(new UIThreadHelper());
return ui_thread_helper_.get();
}
// global functions

View File

@ -97,6 +97,26 @@ class TestHandler : public CefClient,
typedef std::map<int, CefRefPtr<CefBrowser> > BrowserMap;
// Helper for executing methods using WeakPtr references to TestHandler.
class UIThreadHelper {
public:
UIThreadHelper();
// Pass in a |task| with an unretained reference to TestHandler. |task| will
// be executed only if TestHandler::DestroyTest has not yet been called.
// For example:
// GetUIThreadHelper()->PostTask(
// base::Bind(&TestHandler::DoSomething, base::Unretained(this)));
void PostTask(const base::Closure& task);
void PostDelayedTask(const base::Closure& task, int delay_ms);
private:
void TaskHelper(const base::Closure& task);
// Must be the last member.
base::WeakPtrFactory<UIThreadHelper> weak_ptr_factory_;
};
// The |completion_state| object if specified must outlive this class.
explicit TestHandler(CompletionState* completion_state = NULL);
~TestHandler() override;
@ -166,6 +186,15 @@ class TestHandler : public CefClient,
// multiple handlers or when using a Collection object.
void ExecuteTest();
// Event that will be signaled from the TestHandler destructor.
// Used by ReleaseAndWaitForDestructor.
void SetDestroyEvent(base::WaitableEvent* event) { destroy_event_ = event; }
// If a test will not call DestroyTest() indicate so using this method.
void SetDestroyTestExpected(bool expected) {
destroy_test_expected_ = expected;
}
// Returns true if a browser currently exists.
static bool HasBrowser() { return browser_count_ > 0; }
@ -181,6 +210,10 @@ class TestHandler : public CefClient,
// TestComplete() must be called manually.
virtual void DestroyTest();
// Called on the UI thread if the test times out as a result of calling
// SetTestTimeout(). Calls DestroyTest() by default.
virtual void OnTestTimeout(int timeout_ms);
void CreateBrowser(const CefString& url,
CefRefPtr<CefRequestContext> request_context = NULL);
@ -196,12 +229,19 @@ class TestHandler : public CefClient,
return signal_completion_when_all_browsers_close_;
}
// Call OnTestTimeout() after the specified amount of time.
void SetTestTimeout(int timeout_ms = 5000);
// Signal that the test is complete. This will be called automatically when
// all existing non-popup browsers are closed if
// |signal_completion_when_all_browsers_close_| is true (default value). It
// is an error to call this method before all browsers have closed.
void TestComplete();
// Returns the single UIThreadHelper instance, creating it if necessary. Must
// be called on the UI thread.
UIThreadHelper* GetUIThreadHelper();
private:
// Used to notify when the test is complete. Can be accessed on any thread.
CompletionState* completion_state_;
@ -225,6 +265,14 @@ class TestHandler : public CefClient,
// If true test completion will be signaled when all browsers have closed.
bool signal_completion_when_all_browsers_close_;
base::WaitableEvent* destroy_event_;
// Tracks whether DestroyTest() is expected or has been called.
bool destroy_test_expected_;
bool destroy_test_called_;
scoped_ptr<UIThreadHelper> ui_thread_helper_;
// Used to track the number of currently existing browser windows.
static int browser_count_;
@ -235,6 +283,19 @@ class TestHandler : public CefClient,
};
// Release |handler| and wait for the destructor to be called.
// This function is used to avoid test state leakage and to verify that
// all Handler references have been released on test completion.
template<typename T>
void ReleaseAndWaitForDestructor(CefRefPtr<T>& handler, int delay_ms = 2000) {
base::WaitableEvent event(true, false);
handler->SetDestroyEvent(&event);
handler = NULL;
bool handler_destructed =
event.TimedWait(base::TimeDelta::FromMilliseconds(delay_ms));
EXPECT_TRUE(handler_destructed);
}
// Post a task to the specified thread and wait for the task to execute as
// indication that all previously pending tasks on that thread have completed.
void WaitForThread(CefThreadId thread_id);

View File

@ -927,6 +927,9 @@ class RequestTestHandler : public TestHandler,
test_runner_.SetupTest(test_mode_);
CreateBrowser(test_url_);
// Time out the test after a reasonable period of time.
SetTestTimeout();
}
CefRefPtr<CefProcessMessage> CreateTestMessage() {
@ -1067,6 +1070,7 @@ void RegisterURLRequestCustomSchemes(
EXPECT_TRUE(handler->got_message_); \
EXPECT_TRUE(handler->got_success_); \
} \
ReleaseAndWaitForDestructor(handler); \
}
#define REQ_TEST(name, test_mode, test_in_browser) \

View File

@ -2014,6 +2014,9 @@ class V8TestHandler : public TestHandler {
"<script>var i = 0;</script>TEST</body></html>", "text/html");
CreateBrowser(test_url_);
}
// Time out the test after a reasonable period of time.
SetTestTimeout();
}
void OnBeforeClose(CefRefPtr<CefBrowser> browser) override {
@ -2112,6 +2115,7 @@ void CreateV8RendererTests(ClientApp::RenderDelegateSet& delegates) {
EXPECT_TRUE(handler->got_message_); \
EXPECT_TRUE(handler->got_success_); \
g_current_test_mode = V8TEST_NONE; \
ReleaseAndWaitForDestructor(handler); \
}
#define V8_TEST(name, test_mode) \