Index: chrome_frame/test/urlmon_moniker_integration_test.cc |
diff --git a/chrome_frame/test/urlmon_moniker_integration_test.cc b/chrome_frame/test/urlmon_moniker_integration_test.cc |
deleted file mode 100644 |
index c491a009ce945c7ac27f3025e327046180b78cd5..0000000000000000000000000000000000000000 |
--- a/chrome_frame/test/urlmon_moniker_integration_test.cc |
+++ /dev/null |
@@ -1,354 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include <atlbase.h> |
-#include <atlcom.h> |
- |
-#include "base/bind.h" |
-#include "base/threading/thread.h" |
-#include "base/win/scoped_comptr.h" |
-#include "base/win/scoped_handle.h" |
-#include "chrome_frame/bho.h" |
-//#include "chrome_frame/urlmon_moniker.h" |
-#include "chrome_frame/test/chrome_frame_test_utils.h" |
-#include "chrome_frame/test/test_server.h" |
-#include "chrome_frame/test/urlmon_moniker_tests.h" |
-#include "gmock/gmock.h" |
-#include "gtest/gtest.h" |
- |
-#define GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING |
-#include "testing/gmock_mutant.h" |
- |
-using testing::_; |
-using testing::CreateFunctor; |
-using testing::Eq; |
-using testing::Invoke; |
-using testing::SetArgumentPointee; |
-using testing::StrEq; |
-using testing::Return; |
-using testing::DoAll; |
-using testing::WithArgs; |
- |
- |
-static const base::TimeDelta kUrlmonMonikerTimeout = |
- base::TimeDelta::FromSeconds(5); |
- |
-namespace { |
-const char kTestContent[] = "<html><head>" |
- "<meta http-equiv=\"X-UA-Compatible\" content=\"chrome=1\" />" |
- "</head><body>Test HTML content</body></html>"; |
-} // end namespace |
- |
-class UrlmonMonikerTest : public testing::Test { |
- protected: |
- UrlmonMonikerTest() { |
- } |
-}; |
- |
-TEST_F(UrlmonMonikerTest, MonikerPatch) { |
- EXPECT_TRUE(MonikerPatch::Initialize()); |
- EXPECT_TRUE(MonikerPatch::Initialize()); // Should be ok to call twice. |
- MonikerPatch::Uninitialize(); |
-} |
- |
-// Runs an HTTP server on a worker thread that has a message loop. |
-class RunTestServer : public base::Thread { |
- public: |
- RunTestServer() |
- : base::Thread("TestServer"), |
- default_response_("/", kTestContent), |
- ready_(::CreateEvent(NULL, TRUE, FALSE, NULL)) { |
- } |
- |
- ~RunTestServer() { |
- Stop(); |
- } |
- |
- bool Start() { |
- bool ret = StartWithOptions(Options(base::MessageLoop::TYPE_UI, 0)); |
- if (ret) { |
- message_loop()->PostTask(FROM_HERE, |
- base::Bind(&RunTestServer::StartServer, this)); |
- wait_until_ready(); |
- } |
- return ret; |
- } |
- |
- static void StartServer(RunTestServer* me) { |
- me->server_.reset(new test_server::SimpleWebServer(43210)); |
- me->server_->AddResponse(&me->default_response_); |
- ::SetEvent(me->ready_); |
- } |
- |
- bool wait_until_ready() { |
- return ::WaitForSingleObject(ready_, kUrlmonMonikerTimeout.InMilliseconds()) |
- == WAIT_OBJECT_0; |
- } |
- |
- protected: |
- scoped_ptr<test_server::SimpleWebServer> server_; |
- test_server::SimpleResponse default_response_; |
- base::win::ScopedHandle ready_; |
-}; |
- |
-// Helper class for running tests that rely on the NavigationManager. |
-class UrlmonMonikerTestManager { |
- public: |
- explicit UrlmonMonikerTestManager(const wchar_t* test_url) { |
- EXPECT_TRUE(MonikerPatch::Initialize()); |
- } |
- |
- ~UrlmonMonikerTestManager() { |
- MonikerPatch::Uninitialize(); |
- } |
- |
- chrome_frame_test::TimedMsgLoop& loop() { |
- return loop_; |
- } |
- |
- protected: |
- chrome_frame_test::TimedMsgLoop loop_; |
-}; |
- |
-ACTION_P(SetBindInfo, is_async) { |
- DWORD* flags = arg0; |
- BINDINFO* bind_info = arg1; |
- |
- DCHECK(flags); |
- DCHECK(bind_info); |
- DCHECK(bind_info->cbSize >= sizeof(BINDINFO)); |
- |
- *flags = BINDF_ASYNCHRONOUS | BINDF_ASYNCSTORAGE | BINDF_PULLDATA; |
- if (is_async) |
- *flags |= BINDF_ASYNCHRONOUS | BINDF_ASYNCSTORAGE; |
- |
- bind_info->dwBindVerb = BINDVERB_GET; |
- memset(&bind_info->stgmedData, 0, sizeof(STGMEDIUM)); |
- bind_info->grfBindInfoF = 0; |
- bind_info->szCustomVerb = NULL; |
-} |
- |
-// Wraps the MockBindStatusCallbackImpl mock object and allows the user |
-// to specify expectations on the callback object. |
-class UrlmonMonikerTestCallback { |
- public: |
- explicit UrlmonMonikerTestCallback(UrlmonMonikerTestManager* mgr) |
- : mgr_(mgr), clip_format_(0) { |
- } |
- |
- ~UrlmonMonikerTestCallback() { |
- } |
- |
- typedef enum GetBindInfoExpectations { |
- EXPECT_NO_CALL, |
- REQUEST_SYNCHRONOUS, |
- REQUEST_ASYNCHRONOUS, |
- } GET_BIND_INFO_EXPECTATION; |
- |
- // Sets gmock expectations for the IBindStatusCallback mock object. |
- void SetCallbackExpectations(GetBindInfoExpectations bind_info_handling, |
- HRESULT data_available_response, |
- bool quit_loop_on_stop) { |
- EXPECT_CALL(callback_, OnProgress(_, _, _, _)) |
- .WillRepeatedly(Return(S_OK)); |
- |
- if (bind_info_handling == REQUEST_ASYNCHRONOUS) { |
- EXPECT_CALL(callback_, GetBindInfo(_, _)) |
- .WillOnce(DoAll(SetBindInfo(true), Return(S_OK))); |
- } else if (bind_info_handling == REQUEST_SYNCHRONOUS) { |
- EXPECT_CALL(callback_, GetBindInfo(_, _)) |
- .WillOnce(DoAll(SetBindInfo(false), Return(S_OK))); |
- } else { |
- DCHECK(bind_info_handling == EXPECT_NO_CALL); |
- } |
- |
- EXPECT_CALL(callback_, OnStartBinding(_, _)) |
- .WillOnce(Return(S_OK)); |
- |
- EXPECT_CALL(callback_, OnDataAvailable(_, _, _, _)) |
- .WillRepeatedly(Return(data_available_response)); |
- |
- if (quit_loop_on_stop) { |
- // When expecting asynchronous |
- EXPECT_CALL(callback_, OnStopBinding(data_available_response, _)) |
- .WillOnce(DoAll(QUIT_LOOP(mgr_->loop()), Return(S_OK))); |
- } else { |
- EXPECT_CALL(callback_, OnStopBinding(data_available_response, _)) |
- .WillOnce(Return(S_OK)); |
- } |
- } |
- |
- HRESULT CreateUrlMonikerAndBindToStorage(const wchar_t* url, |
- IBindCtx** bind_ctx) { |
- base::win::ScopedComPtr<IMoniker> moniker; |
- HRESULT hr = CreateURLMoniker(NULL, url, moniker.Receive()); |
- EXPECT_TRUE(moniker != NULL); |
- if (moniker) { |
- base::win::ScopedComPtr<IBindCtx> context; |
- ::CreateAsyncBindCtx(0, callback(), NULL, context.Receive()); |
- DCHECK(context); |
- base::win::ScopedComPtr<IStream> stream; |
- hr = moniker->BindToStorage(context, NULL, IID_IStream, |
- reinterpret_cast<void**>(stream.Receive())); |
- if (SUCCEEDED(hr) && bind_ctx) |
- *bind_ctx = context.Detach(); |
- } |
- return hr; |
- } |
- |
- IBindStatusCallback* callback() { |
- return &callback_; |
- } |
- |
- protected: |
- CComObjectStackEx<MockBindStatusCallbackImpl> callback_; |
- UrlmonMonikerTestManager* mgr_; |
- CLIPFORMAT clip_format_; |
-}; |
- |
-/* |
- |
-// Tests synchronously binding to a moniker and downloading the target. |
-TEST_F(UrlmonMonikerTest, BindToStorageSynchronous) { |
- const wchar_t test_url[] = L"http://localhost:43210/"; |
- UrlmonMonikerTestManager test(test_url); |
- UrlmonMonikerTestCallback callback(&test); |
- |
- RunTestServer server_thread; |
- EXPECT_TRUE(server_thread.Start()); |
- |
- callback.SetCallbackExpectations( |
- UrlmonMonikerTestCallback::REQUEST_SYNCHRONOUS, S_OK, false); |
- |
- base::win::ScopedComPtr<IBindCtx> bind_ctx; |
- HRESULT hr = callback.CreateUrlMonikerAndBindToStorage(test_url, |
- bind_ctx.Receive()); |
- // The download should have happened synchronously, so we don't expect |
- // MK_S_ASYNCHRONOUS or any errors. |
- EXPECT_EQ(S_OK, hr); |
- |
- IBindCtx* release = bind_ctx.Detach(); |
- EXPECT_EQ(0, release->Release()); |
- |
- server_thread.Stop(); |
-} |
- |
-// Tests asynchronously binding to a moniker and downloading the target. |
-TEST_F(UrlmonMonikerTest, BindToStorageAsynchronous) { |
- const wchar_t test_url[] = L"http://localhost:43210/"; |
- UrlmonMonikerTestManager test(test_url); |
- UrlmonMonikerTestCallback callback(&test); |
- |
- test_server::SimpleWebServer server(43210); |
- test_server::SimpleResponse default_response("/", kTestContent); |
- server.AddResponse(&default_response); |
- |
- callback.SetCallbackExpectations( |
- UrlmonMonikerTestCallback::REQUEST_ASYNCHRONOUS, S_OK, true); |
- |
- base::win::ScopedComPtr<IBindCtx> bind_ctx; |
- HRESULT hr = callback.CreateUrlMonikerAndBindToStorage(test_url, |
- bind_ctx.Receive()); |
- EXPECT_EQ(MK_S_ASYNCHRONOUS, hr); |
- test.loop().RunFor(kUrlmonMonikerTimeout); |
- |
- IBindCtx* release = bind_ctx.Detach(); |
- EXPECT_EQ(0, release->Release()); |
-} |
- |
-// Responds with the Chrome mime type. |
-class ResponseWithContentType : public test_server::SimpleResponse { |
- public: |
- ResponseWithContentType(const char* request_path, |
- const std::string& contents) |
- : test_server::SimpleResponse(request_path, contents) { |
- } |
- virtual bool GetContentType(std::string* content_type) const { |
- *content_type = WideToASCII(kChromeMimeType); |
- return true; |
- } |
-}; |
- |
-// Downloads a document asynchronously and then verifies that the downloaded |
-// contents were cached and the cache contents are correct. |
-// TODO(tommi): Fix and re-enable. |
-// http://code.google.com/p/chromium/issues/detail?id=39415 |
-TEST_F(UrlmonMonikerTest, BindToStorageSwitchContent) { |
- const wchar_t test_url[] = L"http://localhost:43210/"; |
- UrlmonMonikerTestManager test(test_url); |
- UrlmonMonikerTestCallback callback(&test); |
- |
- test_server::SimpleWebServer server(43210); |
- ResponseWithContentType default_response("/", kTestContent); |
- server.AddResponse(&default_response); |
- |
- callback.SetCallbackExpectations( |
- UrlmonMonikerTestCallback::REQUEST_ASYNCHRONOUS, INET_E_TERMINATED_BIND, |
- true); |
- |
- HRESULT hr = callback.CreateUrlMonikerAndBindToStorage(test_url, NULL); |
- EXPECT_EQ(MK_S_ASYNCHRONOUS, hr); |
- test.loop().RunFor(kUrlmonMonikerTimeout); |
- |
- scoped_refptr<RequestData> request_data( |
- test.nav_manager().GetActiveRequestData(test_url)); |
- EXPECT_TRUE(request_data != NULL); |
- |
- if (request_data) { |
- EXPECT_EQ(request_data->GetCachedContentSize(), |
- arraysize(kTestContent) - 1); |
- base::win::ScopedComPtr<IStream> stream; |
- request_data->GetResetCachedContentStream(stream.Receive()); |
- EXPECT_TRUE(stream != NULL); |
- if (stream) { |
- char buffer[0xffff]; |
- DWORD read = 0; |
- stream->Read(buffer, sizeof(buffer), &read); |
- EXPECT_EQ(read, arraysize(kTestContent) - 1); |
- EXPECT_EQ(0, memcmp(buffer, kTestContent, read)); |
- } |
- } |
-} |
- |
-// Fetches content asynchronously first to cache it and then |
-// verifies that fetching the cached content the same way works as expected |
-// and happens synchronously. |
-TEST_F(UrlmonMonikerTest, BindToStorageCachedContent) { |
- const wchar_t test_url[] = L"http://localhost:43210/"; |
- UrlmonMonikerTestManager test(test_url); |
- UrlmonMonikerTestCallback callback(&test); |
- |
- test_server::SimpleWebServer server(43210); |
- ResponseWithContentType default_response("/", kTestContent); |
- server.AddResponse(&default_response); |
- |
- // First set of expectations. Download the contents |
- // asynchronously. This should populate the cache so that |
- // the second request should be served synchronously without |
- // going to the server. |
- callback.SetCallbackExpectations( |
- UrlmonMonikerTestCallback::REQUEST_ASYNCHRONOUS, INET_E_TERMINATED_BIND, |
- true); |
- |
- HRESULT hr = callback.CreateUrlMonikerAndBindToStorage(test_url, NULL); |
- EXPECT_EQ(MK_S_ASYNCHRONOUS, hr); |
- test.loop().RunFor(kUrlmonMonikerTimeout); |
- |
- scoped_refptr<RequestData> request_data( |
- test.nav_manager().GetActiveRequestData(test_url)); |
- EXPECT_TRUE(request_data != NULL); |
- |
- if (request_data) { |
- // This time, just accept the content as normal. |
- UrlmonMonikerTestCallback callback2(&test); |
- callback2.SetCallbackExpectations( |
- UrlmonMonikerTestCallback::EXPECT_NO_CALL, S_OK, false); |
- hr = callback2.CreateUrlMonikerAndBindToStorage(test_url, NULL); |
- // S_OK means that the operation completed synchronously. |
- // Otherwise we'd get MK_S_ASYNCHRONOUS. |
- EXPECT_EQ(S_OK, hr); |
- } |
-} |
- |
-*/ |