diff options
Diffstat (limited to 'chrome_frame/test')
-rw-r--r-- | chrome_frame/test/http_negotiate_unittest.cc | 106 | ||||
-rw-r--r-- | chrome_frame/test/navigation_test.cc | 82 |
2 files changed, 70 insertions, 118 deletions
diff --git a/chrome_frame/test/http_negotiate_unittest.cc b/chrome_frame/test/http_negotiate_unittest.cc index c56034b..857197e 100644 --- a/chrome_frame/test/http_negotiate_unittest.cc +++ b/chrome_frame/test/http_negotiate_unittest.cc @@ -16,112 +16,6 @@ #include "gtest/gtest.h" #include "gmock/gmock.h" -class HttpNegotiateTest : public testing::Test { - protected: - HttpNegotiateTest() { - } -}; - -class TestHttpNegotiate - : public CComObjectRootEx<CComMultiThreadModel>, - public IHttpNegotiate { - public: - TestHttpNegotiate() - : beginning_transaction_ret_(S_OK), additional_headers_(NULL) { - } - -BEGIN_COM_MAP(TestHttpNegotiate) - COM_INTERFACE_ENTRY(IHttpNegotiate) -END_COM_MAP() - STDMETHOD(BeginningTransaction)(LPCWSTR url, LPCWSTR headers, // NOLINT - DWORD reserved, // NOLINT - LPWSTR* additional_headers) { // NOLINT - if (additional_headers_) { - int len = lstrlenW(additional_headers_); - len++; - *additional_headers = reinterpret_cast<wchar_t*>( - ::CoTaskMemAlloc(len * sizeof(wchar_t))); - lstrcpyW(*additional_headers, additional_headers_); - } - return beginning_transaction_ret_; - } - - STDMETHOD(OnResponse)(DWORD response_code, LPCWSTR response_header, - LPCWSTR request_header, - LPWSTR* additional_request_headers) { - return S_OK; - } - - HRESULT beginning_transaction_ret_; - const wchar_t* additional_headers_; -}; - -TEST_F(HttpNegotiateTest, BeginningTransaction) { - static const int kBeginningTransactionIndex = 3; - CComObjectStackEx<TestHttpNegotiate> test_http; - IHttpNegotiate_BeginningTransaction_Fn original = - reinterpret_cast<IHttpNegotiate_BeginningTransaction_Fn>( - (*reinterpret_cast<void***>( - static_cast<IHttpNegotiate*>( - &test_http)))[kBeginningTransactionIndex]); - - std::wstring cf_ua( - ASCIIToWide(http_utils::GetDefaultUserAgentHeaderWithCFTag())); - std::wstring cf_tag( - ASCIIToWide(http_utils::GetChromeFrameUserAgent())); - - EXPECT_NE(std::wstring::npos, cf_ua.find(cf_tag)); - - struct TestCase { - const std::wstring original_headers_; - const std::wstring delegate_additional_; - const std::wstring expected_additional_; - HRESULT delegate_return_value_; - } test_cases[] = { - { L"Accept: */*\r\n", - L"", - cf_ua + L"\r\n", - S_OK }, - { L"Accept: */*\r\n", - L"", - L"", - E_OUTOFMEMORY }, - { L"", - L"Accept: */*\r\n", - L"Accept: */*\r\n" + cf_ua + L"\r\n", - S_OK }, - { L"User-Agent: Bingo/1.0\r\n", - L"", - L"User-Agent: Bingo/1.0 " + cf_tag + L"\r\n", - S_OK }, - { L"User-Agent: NotMe/1.0\r\n", - L"User-Agent: MeMeMe/1.0\r\n", - L"User-Agent: MeMeMe/1.0 " + cf_tag + L"\r\n", - S_OK }, - { L"", - L"User-Agent: MeMeMe/1.0\r\n", - L"User-Agent: MeMeMe/1.0 " + cf_tag + L"\r\n", - S_OK }, - }; - - for (int i = 0; i < arraysize(test_cases); ++i) { - TestCase& test = test_cases[i]; - wchar_t* additional = NULL; - test_http.beginning_transaction_ret_ = test.delegate_return_value_; - test_http.additional_headers_ = test.delegate_additional_.c_str(); - HttpNegotiatePatch::BeginningTransaction(original, &test_http, - L"http://www.google.com", test.original_headers_.c_str(), 0, - &additional); - EXPECT_TRUE(additional != NULL); - - if (additional) { - // Check against the expected additional headers. - EXPECT_EQ(test.expected_additional_, std::wstring(additional)); - ::CoTaskMemFree(additional); - } - } -} - class TestInternetProtocolSink : public CComObjectRootEx<CComMultiThreadModel>, public IInternetProtocolSink { diff --git a/chrome_frame/test/navigation_test.cc b/chrome_frame/test/navigation_test.cc index 457793d..7e157ee 100644 --- a/chrome_frame/test/navigation_test.cc +++ b/chrome_frame/test/navigation_test.cc @@ -11,6 +11,7 @@ #include "chrome_frame/test/chrome_frame_ui_test_utils.h" #include "chrome_frame/test/mock_ie_event_sink_actions.h" #include "chrome_frame/test/mock_ie_event_sink_test.h" +#include "net/http/http_util.h" // Needed for CreateFunctor. #define GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING @@ -922,19 +923,20 @@ TEST_P(FullTabNavigationTest, RefreshContents) { return; } + const char kHeaders[] = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n" + "X-UA-Compatible: chrome=1\r\n"; + + const char kBody[] = "<html><body>Hi there. Got new content?" + "</body></html>"; + std::wstring src_url = server_mock_.Resolve(L"/refresh_src.html"); EXPECT_CALL(server_mock_, Get(_, StrEq(L"/refresh_src.html"), _)) .Times(2) - .WillRepeatedly( - SendFast( - "HTTP/1.1 200 OK\r\n" - "Content-Type: text/html\r\n", - "<html>" - "<head><meta http-equiv=\"x-ua-compatible\" content=\"chrome=1\"" - "/></head>" - "<body>Hi there. Got new content?" - "</body></html>")); + .WillOnce(SendFast(kHeaders, kBody)) + .WillOnce(testing::DoAll( + SendFast(kHeaders, kBody), + DelayCloseBrowserMock(&loop_, 4000, &ie_mock_))); EXPECT_CALL(ie_mock_, OnFileDownload(_, _)).Times(testing::AnyNumber()); @@ -945,9 +947,7 @@ TEST_P(FullTabNavigationTest, RefreshContents) { EXPECT_CALL(ie_mock_, OnNavigateComplete2(_, testing::Field(&VARIANT::bstrVal, StrEq(src_url)))) - .WillOnce(testing::DoAll( - DelayRefresh(&ie_mock_, &loop_, 2000), - DelayCloseBrowserMock(&loop_, 4000, &ie_mock_))); + .WillOnce(DelayRefresh(&ie_mock_, &loop_, 2000)); EXPECT_CALL(ie_mock_, OnLoad(in_cf, StrEq(src_url))) .Times(2); @@ -1104,4 +1104,62 @@ TEST_F(FullTabDownloadTest, TopLevelPostReissueFromChromeFramePage) { LaunchIENavigateAndLoop(src_url, kChromeFrameLongNavigationTimeoutInSeconds); } +MATCHER_P(UserAgentHeaderMatcher, ua_string, "") { + std::string headers = arg.headers(); + StringToUpperASCII(&headers); + + std::string ua_string_to_search = ua_string; + StringToUpperASCII(&ua_string_to_search); + + net::HttpUtil::HeadersIterator it(headers.begin(), headers.end(), + "\r\n"); + while (it.GetNext()) { + if (lstrcmpiA(it.name().c_str(), "User-Agent") == 0) { + if (it.values().find(ua_string_to_search) != std::string::npos) + return true; + } + } + return false; +} + +// Tests refreshing causes a page load and that the chrome frame user agent +// string is appended to the UA in the incoming top level HTTP requests. +TEST_P(FullTabNavigationTest, RefreshContentsUATest) { + const char kBody[] = "<html><head></head>" + "<body>Hi there. Got new content?" + "</body></html>"; + + std::string headers = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n"; + bool in_cf = GetParam().invokes_cf(); + if (in_cf) { + headers.append("X-UA-Compatible: chrome=1\r\n"); + } + + std::wstring src_url = server_mock_.Resolve(L"/refresh_src.html"); + + EXPECT_CALL(server_mock_, Get(_, StrEq(L"/refresh_src.html"), + UserAgentHeaderMatcher("chromeframe"))) + .Times(2) + .WillOnce(SendFast(headers, kBody)) + .WillOnce(testing::DoAll( + SendFast(headers, kBody), + DelayCloseBrowserMock(&loop_, 4000, &ie_mock_))); + + EXPECT_CALL(ie_mock_, OnFileDownload(_, _)).Times(testing::AnyNumber()); + + EXPECT_CALL(ie_mock_, + OnBeforeNavigate2(_, testing::Field(&VARIANT::bstrVal, + StrEq(src_url)), + _, _, _, _, _)); + EXPECT_CALL(ie_mock_, + OnNavigateComplete2(_, testing::Field(&VARIANT::bstrVal, + StrEq(src_url)))) + .WillOnce(DelayRefresh(&ie_mock_, &loop_, 2000)); + + EXPECT_CALL(ie_mock_, OnLoad(in_cf, StrEq(src_url))) + .Times(testing::AtMost(2)); + + LaunchIEAndNavigate(src_url); +} + } // namespace chrome_frame_test |