Minor improvements to unit test framework.

git-svn-id: https://chromiumembedded.googlecode.com/svn/trunk@92 5089003a-bbd8-11dd-ad1f-f1f9622dbc98
This commit is contained in:
Marshall Greenblatt 2010-07-24 17:28:00 +00:00
parent 06ceab7447
commit 9ab2eca392
4 changed files with 378 additions and 384 deletions

View File

@ -273,7 +273,7 @@ public:
CefRefPtr<CefFrame> frame) CefRefPtr<CefFrame> frame)
{ {
if(!browser->IsPopup() && !frame.get()) if(!browser->IsPopup() && !frame.get())
NotifyTestComplete(); DestroyTest();
return RV_CONTINUE; return RV_CONTINUE;
} }
@ -286,7 +286,8 @@ TEST(RequestTest, SendRecv)
g_RequestSendRecvTestHandlerHandleBeforeBrowseCalled = false; g_RequestSendRecvTestHandlerHandleBeforeBrowseCalled = false;
g_RequestSendRecvTestHandlerHandleBeforeResourceLoadCalled = false; g_RequestSendRecvTestHandlerHandleBeforeResourceLoadCalled = false;
RequestSendRecvTestHandler* handler = new RequestSendRecvTestHandler(); CefRefPtr<RequestSendRecvTestHandler> handler =
new RequestSendRecvTestHandler();
handler->ExecuteTest(); handler->ExecuteTest();
ASSERT_TRUE(g_RequestSendRecvTestHandlerHandleBeforeBrowseCalled); ASSERT_TRUE(g_RequestSendRecvTestHandlerHandleBeforeBrowseCalled);
@ -393,7 +394,7 @@ public:
else else
{ {
// Resource re-load, end the test // Resource re-load, end the test
NotifyTestComplete(); DestroyTest();
} }
} }
else else
@ -416,7 +417,8 @@ TEST(RequestTest, HistoryNav)
g_RequestHistoryNavTestDidLoadRequest = false; g_RequestHistoryNavTestDidLoadRequest = false;
g_RequestHistoryNavTestDidReloadRequest = false; g_RequestHistoryNavTestDidReloadRequest = false;
RequestHistoryNavTestHandler* handler = new RequestHistoryNavTestHandler(); CefRefPtr<RequestHistoryNavTestHandler> handler =
new RequestHistoryNavTestHandler();
handler->ExecuteTest(); handler->ExecuteTest();
ASSERT_TRUE(g_RequestHistoryNavTestDidLoadRequest); ASSERT_TRUE(g_RequestHistoryNavTestDidLoadRequest);

View File

@ -6,13 +6,14 @@
#define _TEST_HANDLER_H #define _TEST_HANDLER_H
#include "include/cef.h" #include "include/cef.h"
#include "base/waitable_event.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
// Base implementation of CefHandler for unit tests. // Base implementation of CefHandler for unit tests.
class TestHandler : public CefThreadSafeBase<CefHandler> class TestHandler : public CefThreadSafeBase<CefHandler>
{ {
public: public:
TestHandler() : browser_hwnd_(NULL), completion_event_(NULL) TestHandler() : browser_hwnd_(NULL), completion_event_(true, false)
{ {
} }
@ -177,8 +178,8 @@ public:
browser_ = NULL; browser_ = NULL;
browser_hwnd_ = NULL; browser_hwnd_ = NULL;
// Just in case it wasn't called already // Signal that the test is now complete.
NotifyTestComplete(); completion_event_.Signal();
} }
Unlock(); Unlock();
return RV_CONTINUE; return RV_CONTINUE;
@ -232,47 +233,33 @@ public:
// returns. // returns.
void ExecuteTest() void ExecuteTest()
{ {
// Add a reference
AddRef();
// Create the notification event
Lock();
completion_event_ = CreateEvent(NULL, TRUE, FALSE, NULL);
ASSERT_TRUE(completion_event_ != NULL);
Unlock();
// Run the test // Run the test
RunTest(); RunTest();
// Wait for the test to complete // Wait for the test to complete
WaitForSingleObject(completion_event_, INFINITE); completion_event_.Wait();
Lock();
CloseHandle(completion_event_);
completion_event_ = NULL;
Unlock();
// Remove the reference
Release();
} }
protected: protected:
// Called by the implementing class when the test is complete // Destroy the browser window. Once the window is destroyed test completion
void NotifyTestComplete() // will be signaled.
void DestroyTest()
{ {
// Notify that the test is complete
Lock(); Lock();
if(completion_event_ != NULL) #if defined(OS_WIN)
SetEvent(completion_event_);
if(browser_hwnd_ != NULL) if(browser_hwnd_ != NULL)
PostMessage(browser_hwnd_, WM_CLOSE, 0, 0); PostMessage(browser_hwnd_, WM_CLOSE, 0, 0);
#endif
Unlock(); Unlock();
} }
void CreateBrowser(const std::wstring& url) void CreateBrowser(const std::wstring& url)
{ {
CefWindowInfo windowInfo; CefWindowInfo windowInfo;
#if defined(OS_WIN)
windowInfo.SetAsPopup(NULL, L"CefUnitTest"); windowInfo.SetAsPopup(NULL, L"CefUnitTest");
windowInfo.m_dwStyle |= WS_VISIBLE; windowInfo.m_dwStyle |= WS_VISIBLE;
#endif
CefBrowser::CreateBrowser(windowInfo, false, this, url); CefBrowser::CreateBrowser(windowInfo, false, this, url);
} }
@ -292,10 +279,10 @@ private:
CefRefPtr<CefBrowser> browser_; CefRefPtr<CefBrowser> browser_;
// The browser window handle // The browser window handle
HWND browser_hwnd_; CefWindowHandle browser_hwnd_;
// Handle used to notify when the test is complete // Handle used to notify when the test is complete
HANDLE completion_event_; base::WaitableEvent completion_event_;
// Map of resources that can be automatically loaded // Map of resources that can be automatically loaded
typedef std::map<std::wstring, std::pair<std::string, std::wstring>> ResourceMap; typedef std::map<std::wstring, std::pair<std::string, std::wstring>> ResourceMap;

View File

@ -6,6 +6,7 @@
#define _CEF_TEST_SUITE_H #define _CEF_TEST_SUITE_H
#include "build/build_config.h" #include "build/build_config.h"
#include "base/platform_thread.h"
#include "base/test/test_suite.h" #include "base/test/test_suite.h"
#include "include/cef.h" #include "include/cef.h"
@ -22,6 +23,10 @@ class CefTestSuite : public TestSuite {
} }
virtual void Shutdown() { virtual void Shutdown() {
// Delay a bit so that the system has a chance to finish destroying windows
// before CefShutdown() checks for memory leaks.
PlatformThread::Sleep(500);
CefShutdown(); CefShutdown();
TestSuite::Shutdown(); TestSuite::Shutdown();
} }

View File

@ -244,7 +244,7 @@ public:
CefRefPtr<CefFrame> frame) CefRefPtr<CefFrame> frame)
{ {
if(!browser->IsPopup() && !frame.get()) if(!browser->IsPopup() && !frame.get())
NotifyTestComplete(); DestroyTest();
return RV_CONTINUE; return RV_CONTINUE;
} }
}; };
@ -271,7 +271,7 @@ TEST(V8Test, Extension)
L"})();"; L"})();";
CefRegisterExtension(L"v8/test", extensionCode, new V8TestV8Handler(false)); CefRegisterExtension(L"v8/test", extensionCode, new V8TestV8Handler(false));
V8TestHandler* handler = new V8TestHandler(); CefRefPtr<V8TestHandler> handler = new V8TestHandler();
handler->ExecuteTest(); handler->ExecuteTest();
ASSERT_TRUE(g_V8TestV8HandlerExecuteCalled); ASSERT_TRUE(g_V8TestV8HandlerExecuteCalled);