diff options
Diffstat (limited to 'chrome_frame/test/url_request_test.cc')
-rw-r--r-- | chrome_frame/test/url_request_test.cc | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/chrome_frame/test/url_request_test.cc b/chrome_frame/test/url_request_test.cc new file mode 100644 index 0000000..e095aa5 --- /dev/null +++ b/chrome_frame/test/url_request_test.cc @@ -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();
+}
|