diff options
Diffstat (limited to 'chrome_frame/test/url_request_test.cc')
-rw-r--r-- | chrome_frame/test/url_request_test.cc | 374 |
1 files changed, 222 insertions, 152 deletions
diff --git a/chrome_frame/test/url_request_test.cc b/chrome_frame/test/url_request_test.cc index e095aa5..aad95a9 100644 --- a/chrome_frame/test/url_request_test.cc +++ b/chrome_frame/test/url_request_test.cc @@ -1,152 +1,222 @@ -// Copyright (c) 2010 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 "app/win_util.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gmock_mutant.h"
-
-#include "chrome_frame/urlmon_url_request.h"
-#include "chrome_frame/urlmon_url_request_private.h"
-#include "chrome_frame/test/chrome_frame_test_utils.h"
-#include "chrome_frame/test/http_server.h"
-using testing::CreateFunctor;
-
-const int kChromeFrameLongNavigationTimeoutInSeconds = 10;
-
-class MockUrlDelegate : public PluginUrlRequestDelegate {
- public:
- MOCK_METHOD8(OnResponseStarted, void(int request_id, const char* mime_type,
- const char* headers, int size,
- base::Time last_modified, const std::string& peristent_cookies,
- const std::string& redirect_url, int redirect_status));
- MOCK_METHOD3(OnReadComplete, void(int request_id, const void* buffer,
- int len));
- MOCK_METHOD2(OnResponseEnd, void(int request_id,
- const URLRequestStatus& status));
-
- static bool ImplementsThreadSafeReferenceCounting() {
- return false;
- }
- void AddRef() {}
- void Release() {}
-
- void PostponeReadRequest(chrome_frame_test::TimedMsgLoop* loop,
- UrlmonUrlRequest* request, int bytes_to_read) {
- loop->PostDelayedTask(FROM_HERE, NewRunnableMethod(this,
- &MockUrlDelegate::Read, request, bytes_to_read), 0);
- }
-
- private:
- void Read(UrlmonUrlRequest* request, int bytes_to_read) {
- request->Read(bytes_to_read);
- }
-};
-
-// Simplest UrlmonUrlRequest. Retrieve a file from local web server.
-TEST(UrlmonUrlRequestTest, Simple1) {
- MockUrlDelegate mock;
- ChromeFrameHTTPServer server;
- chrome_frame_test::TimedMsgLoop loop;
- win_util::ScopedCOMInitializer init_com;
- CComObjectStackEx<UrlmonUrlRequest> request;
-
- server.SetUp();
- request.AddRef();
- request.Initialize(&mock, 1, // request_id
- server.Resolve(L"chrome_frame_window_open.html").spec(),
- "get",
- "", // referrer
- "", // extra request
- NULL, // upload data
- true); // frame busting
-
- EXPECT_CALL(mock, OnResponseStarted(1, testing::_, testing::_, testing::_,
- testing::_, testing::_, testing::_,
- testing::_))
- .Times(1)
- .WillOnce(testing::IgnoreResult(testing::InvokeWithoutArgs(CreateFunctor(
- &request, &UrlmonUrlRequest::Read, 512))));
-
-
- EXPECT_CALL(mock, OnReadComplete(1, testing::_, testing::Gt(0)))
- .Times(testing::AtLeast(1))
- .WillRepeatedly(testing::InvokeWithoutArgs(CreateFunctor(&mock,
- &MockUrlDelegate::PostponeReadRequest, &loop, &request, 64)));
-
- EXPECT_CALL(mock, OnResponseEnd(1, testing::_))
- .Times(1)
- .WillOnce(QUIT_LOOP_SOON(loop, 2));
-
- request.Start();
- loop.RunFor(kChromeFrameLongNavigationTimeoutInSeconds);
- request.Release();
- server.TearDown();
-}
-
-// Simplest test - retrieve file from local web server.
-TEST(UrlmonUrlRequestManagerTest, Simple1) {
- MockUrlDelegate mock;
- ChromeFrameHTTPServer server;
- chrome_frame_test::TimedMsgLoop loop;
- server.SetUp();
- scoped_ptr<UrlmonUrlRequestManager> mgr(new UrlmonUrlRequestManager());
- mgr->set_delegate(&mock);
- IPC::AutomationURLRequest r1 = {
- server.Resolve(L"chrome_frame_window_open.html").spec(), "get" };
-
- EXPECT_CALL(mock, OnResponseStarted(1, testing::_, testing::_, testing::_,
- testing::_, testing::_, testing::_, testing::_))
- .Times(1)
- .WillOnce(testing::InvokeWithoutArgs(CreateFunctor(mgr.get(),
- &PluginUrlRequestManager::ReadUrlRequest, 0, 1, 512)));
-
- EXPECT_CALL(mock, OnReadComplete(1, testing::_, testing::Gt(0)))
- .Times(testing::AtLeast(1))
- .WillRepeatedly(testing::InvokeWithoutArgs(CreateFunctor(mgr.get(),
- &PluginUrlRequestManager::ReadUrlRequest, 0, 1, 2)));
-
- EXPECT_CALL(mock, OnResponseEnd(1, testing::_))
- .Times(1)
- .WillOnce(QUIT_LOOP_SOON(loop, 2));
-
- mgr->StartUrlRequest(0, 1, r1);
- loop.RunFor(kChromeFrameLongNavigationTimeoutInSeconds);
- mgr.reset();
- server.TearDown();
-
-}
-
-TEST(UrlmonUrlRequestManagerTest, Abort1) {
- MockUrlDelegate mock;
- ChromeFrameHTTPServer server;
- chrome_frame_test::TimedMsgLoop loop;
- server.SetUp();
- scoped_ptr<UrlmonUrlRequestManager> mgr(new UrlmonUrlRequestManager());
- mgr->set_delegate(&mock);
- IPC::AutomationURLRequest r1 = {
- server.Resolve(L"chrome_frame_window_open.html").spec(), "get" };
-
- EXPECT_CALL(mock, OnResponseStarted(1, testing::_, testing::_, testing::_,
- testing::_, testing::_, testing::_, testing::_))
- .Times(1)
- .WillOnce(testing::DoAll(
- testing::InvokeWithoutArgs(CreateFunctor(mgr.get(),
- &PluginUrlRequestManager::EndUrlRequest, 0, 1, URLRequestStatus())),
- testing::InvokeWithoutArgs(CreateFunctor(mgr.get(),
- &PluginUrlRequestManager::ReadUrlRequest, 0, 1, 2))));
-
- EXPECT_CALL(mock, OnReadComplete(1, testing::_, testing::Gt(0)))
- .Times(0);
-
- EXPECT_CALL(mock, OnResponseEnd(1, testing::_))
- .Times(1)
- .WillOnce(QUIT_LOOP_SOON(loop, 2));
-
- mgr->StartUrlRequest(0, 1, r1);
- loop.RunFor(kChromeFrameLongNavigationTimeoutInSeconds);
- mgr.reset();
- server.TearDown();
-}
+// Copyright (c) 2010 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 "app/win_util.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gmock_mutant.h" + +#include "chrome_frame/urlmon_url_request.h" +#include "chrome_frame/urlmon_url_request_private.h" +#include "chrome_frame/test/chrome_frame_test_utils.h" +#include "chrome_frame/test/http_server.h" +using testing::CreateFunctor; + +const int kChromeFrameLongNavigationTimeoutInSeconds = 10; + +class MockUrlDelegate : public PluginUrlRequestDelegate { + public: + MOCK_METHOD8(OnResponseStarted, void(int request_id, const char* mime_type, + const char* headers, int size, + base::Time last_modified, const std::string& peristent_cookies, + const std::string& redirect_url, int redirect_status)); + MOCK_METHOD3(OnReadComplete, void(int request_id, const void* buffer, + int len)); + MOCK_METHOD2(OnResponseEnd, void(int request_id, + const URLRequestStatus& status)); + + static bool ImplementsThreadSafeReferenceCounting() { + return false; + } + void AddRef() {} + void Release() {} + + void PostponeReadRequest(chrome_frame_test::TimedMsgLoop* loop, + UrlmonUrlRequest* request, int bytes_to_read) { + loop->PostDelayedTask(FROM_HERE, NewRunnableMethod(this, + &MockUrlDelegate::Read, request, bytes_to_read), 0); + } + + private: + void Read(UrlmonUrlRequest* request, int bytes_to_read) { + request->Read(bytes_to_read); + } +}; + +// Simplest UrlmonUrlRequest. Retrieve a file from local web server. +TEST(UrlmonUrlRequestTest, Simple1) { + MockUrlDelegate mock; + ChromeFrameHTTPServer server; + chrome_frame_test::TimedMsgLoop loop; + win_util::ScopedCOMInitializer init_com; + CComObjectStackEx<UrlmonUrlRequest> request; + + server.SetUp(); + request.AddRef(); + request.Initialize(&mock, 1, // request_id + server.Resolve(L"files/chrome_frame_window_open.html").spec(), + "get", + "", // referrer + "", // extra request + NULL, // upload data + true); // frame busting + + testing::InSequence s; + EXPECT_CALL(mock, OnResponseStarted(1, testing::_, testing::_, testing::_, + testing::_, testing::_, testing::_, + testing::_)) + .Times(1) + .WillOnce(testing::IgnoreResult(testing::InvokeWithoutArgs(CreateFunctor( + &request, &UrlmonUrlRequest::Read, 512)))); + + + EXPECT_CALL(mock, OnReadComplete(1, testing::_, testing::Gt(0))) + .Times(testing::AtLeast(1)) + .WillRepeatedly(testing::InvokeWithoutArgs(CreateFunctor(&mock, + &MockUrlDelegate::PostponeReadRequest, &loop, &request, 64))); + + EXPECT_CALL(mock, OnResponseEnd(1, testing::_)) + .Times(1) + .WillOnce(QUIT_LOOP_SOON(loop, 2)); + + request.Start(); + loop.RunFor(kChromeFrameLongNavigationTimeoutInSeconds); + request.Release(); + server.TearDown(); +} + +TEST(UrlmonUrlRequestTest, UnreachableUrl) { + MockUrlDelegate mock; + chrome_frame_test::TimedMsgLoop loop; + win_util::ScopedCOMInitializer init_com; + CComObjectStackEx<UrlmonUrlRequest> request; + ChromeFrameHTTPServer server; + server.SetUp(); + GURL unreachable = server.Resolve(L"files/non_existing.html"); + server.TearDown(); + + request.AddRef(); + request.Initialize(&mock, 1, // request_id + unreachable.spec(), "get", + "", // referrer + "", // extra request + NULL, // upload data + true); // frame busting + + EXPECT_CALL(mock, OnResponseEnd(1, testing::Property( + &URLRequestStatus::os_error, net::ERR_TUNNEL_CONNECTION_FAILED))) + .Times(1) + .WillOnce(QUIT_LOOP_SOON(loop, 2)); + + request.Start(); + loop.RunFor(kChromeFrameLongNavigationTimeoutInSeconds); + request.Release(); +} + +TEST(UrlmonUrlRequestTest, ZeroLengthResponse) { + MockUrlDelegate mock; + ChromeFrameHTTPServer server; + chrome_frame_test::TimedMsgLoop loop; + win_util::ScopedCOMInitializer init_com; + CComObjectStackEx<UrlmonUrlRequest> request; + + server.SetUp(); + request.AddRef(); + request.Initialize(&mock, 1, // request_id + server.Resolve(L"files/empty.html").spec(), "get", + "", // referrer + "", // extra request + NULL, // upload data + true); // frame busting + + // Expect headers + EXPECT_CALL(mock, OnResponseStarted(1, testing::_, testing::_, testing::_, + testing::_, testing::_, testing::_, + testing::_)) + .Times(1) + .WillOnce(QUIT_LOOP(loop)); + + request.Start(); + loop.RunFor(kChromeFrameLongNavigationTimeoutInSeconds); + EXPECT_FALSE(loop.WasTimedOut()); + + // Should stay quiet, since we do not ask for anything for awhile. + EXPECT_CALL(mock, OnResponseEnd(1, testing::_)).Times(0); + loop.RunFor(3); + + // Invoke read. Only now the response end ("server closed the connection") + // is supposed to be delivered. + EXPECT_CALL(mock, OnResponseEnd(1, testing::Property( + &URLRequestStatus::is_success, true))) + .Times(1); + request.Read(512); + request.Release(); + server.TearDown(); +} + +// Simplest test - retrieve file from local web server. +TEST(UrlmonUrlRequestManagerTest, Simple1) { + MockUrlDelegate mock; + ChromeFrameHTTPServer server; + chrome_frame_test::TimedMsgLoop loop; + server.SetUp(); + scoped_ptr<UrlmonUrlRequestManager> mgr(new UrlmonUrlRequestManager()); + mgr->set_delegate(&mock); + IPC::AutomationURLRequest r1 = { + server.Resolve(L"files/chrome_frame_window_open.html").spec(), "get" }; + + EXPECT_CALL(mock, OnResponseStarted(1, testing::_, testing::_, testing::_, + testing::_, testing::_, testing::_, testing::_)) + .Times(1) + .WillOnce(testing::InvokeWithoutArgs(CreateFunctor(mgr.get(), + &PluginUrlRequestManager::ReadUrlRequest, 0, 1, 512))); + + EXPECT_CALL(mock, OnReadComplete(1, testing::_, testing::Gt(0))) + .Times(testing::AtLeast(1)) + .WillRepeatedly(testing::InvokeWithoutArgs(CreateFunctor(mgr.get(), + &PluginUrlRequestManager::ReadUrlRequest, 0, 1, 2))); + + EXPECT_CALL(mock, OnResponseEnd(1, testing::_)) + .Times(1) + .WillOnce(QUIT_LOOP_SOON(loop, 2)); + + mgr->StartUrlRequest(0, 1, r1); + loop.RunFor(kChromeFrameLongNavigationTimeoutInSeconds); + mgr.reset(); + server.TearDown(); +} + +TEST(UrlmonUrlRequestManagerTest, Abort1) { + MockUrlDelegate mock; + ChromeFrameHTTPServer server; + chrome_frame_test::TimedMsgLoop loop; + server.SetUp(); + scoped_ptr<UrlmonUrlRequestManager> mgr(new UrlmonUrlRequestManager()); + mgr->set_delegate(&mock); + IPC::AutomationURLRequest r1 = { + server.Resolve(L"files/chrome_frame_window_open.html").spec(), "get" }; + + EXPECT_CALL(mock, OnResponseStarted(1, testing::_, testing::_, testing::_, + testing::_, testing::_, testing::_, testing::_)) + .Times(1) + .WillOnce(testing::DoAll( + testing::InvokeWithoutArgs(CreateFunctor(mgr.get(), + &PluginUrlRequestManager::EndUrlRequest, 0, 1, URLRequestStatus())), + testing::InvokeWithoutArgs(CreateFunctor(mgr.get(), + &PluginUrlRequestManager::ReadUrlRequest, 0, 1, 2)))); + + EXPECT_CALL(mock, OnReadComplete(1, testing::_, testing::Gt(0))) + .Times(0); + + EXPECT_CALL(mock, OnResponseEnd(1, testing::_)) + .Times(1) + .WillOnce(QUIT_LOOP_SOON(loop, 2)); + + mgr->StartUrlRequest(0, 1, r1); + loop.RunFor(kChromeFrameLongNavigationTimeoutInSeconds); + mgr.reset(); + server.TearDown(); +} + |