Index: chrome_frame/test/url_request_test.cc |
=================================================================== |
--- chrome_frame/test/url_request_test.cc (revision 0) |
+++ chrome_frame/test/url_request_test.cc (revision 0) |
@@ -0,0 +1,152 @@ |
+// 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(); |
+} |