Roll leveldb to r76.
[chromium-blink-merge.git] / chrome_frame / test / header_test.cc
blob0e61c84046c2436108b9f790e34371d70deb9b14
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome_frame/test/mock_ie_event_sink_actions.h"
6 #include "chrome_frame/test/mock_ie_event_sink_test.h"
7 #include "base/rand_util.h"
9 namespace chrome_frame_test {
11 class TestData {
12 public:
13 TestData(const std::string& value, bool in_header, LoadedInRenderer expected)
14 : value_(value),
15 in_header_(in_header),
16 expected_(expected),
17 name_(base::IntToString(base::RandInt(0, 1000))) {
20 LoadedInRenderer GetExpectedRenderer() const {
21 return expected_;
24 std::wstring GetPath() const {
25 return ASCIIToWide("/" + name_);
28 std::wstring GetUrl(MockWebServer* server_mock) const {
29 return server_mock->Resolve(ASCIIToWide(name_));
32 void ExpectOnServer(MockWebServer* server_mock) const {
33 EXPECT_CALL(*server_mock, Get(testing::_, GetPath(), testing::_))
34 .Times(testing::AnyNumber())
35 .WillRepeatedly(SendFast(GetHeaders(), GetHtml()));
38 std::string GetHeaders() const {
39 std::ostringstream headers;
40 headers << "HTTP/1.1 200 OK\r\n"
41 << "Connection: close\r\n"
42 << "Content-Type: text/html\r\n"
43 << "Cache-Control: no-cache\r\n";
44 if (in_header_) {
45 headers << "X-UA-COMPATIBLE: " << value_ << "\r\n";
47 return headers.str();
50 std::string GetHtml() const {
51 std::ostringstream html;
52 html << "<html><head>";
53 if (!in_header_) {
54 html << "<meta http-equiv=\"x-ua-compatible\" content=\"" << value_
55 << "\" />";
57 html << "</head><body>This is some text.</body></html>";
58 return html.str();
61 private:
62 LoadedInRenderer expected_;
63 std::string name_;
64 std::string value_;
65 bool in_header_;
68 // Determines the major version of the installed IE
69 // Returns -1 in case of failure, 0 if the version is newer than currently known
70 int GetIEMajorVersion() {
71 switch (GetInstalledIEVersion()) {
72 case IE_6:
73 return 6;
74 case IE_7:
75 return 7;
76 case IE_8:
77 return 8;
78 case IE_9:
79 return 9;
80 case IE_10:
81 return 10;
82 case IE_INVALID:
83 case NON_IE:
84 case IE_UNSUPPORTED:
85 ADD_FAILURE() << "Failed to detect IE version.";
86 return -1;
87 default:
88 return 0;
92 int LowVersion() {
93 int ie_version = GetIEMajorVersion();
94 switch (ie_version) {
95 case -1:
96 case 0:
97 return 5;
98 default:
99 return ie_version - 1;
103 int HighVersion() {
104 int ie_version = GetIEMajorVersion();
105 switch (ie_version) {
106 case -1:
107 case 0:
108 return 1000;
109 default:
110 return ie_version + 1;
114 int EqualVersion() {
115 int ie_version = GetIEMajorVersion();
116 switch (ie_version) {
117 case -1:
118 case 0:
119 return 1000;
120 default:
121 return ie_version;
125 std::string HeaderValue(int ie_version) {
126 if (ie_version == -1) {
127 return "IE=8; Chrome=1";
128 } else {
129 return std::string("IE=8; Chrome=IE") + base::IntToString(ie_version);
133 std::string CorruptHeaderValue(int ie_version) {
134 return HeaderValue(ie_version) + ".0";
137 std::string LongHeaderValue(int ie_version) {
138 std::string long_value = HeaderValue(ie_version) + "; " +
139 std::string(256, 'a') + "=bbb";
140 DCHECK_GT(long_value.length(), 256u);
141 DCHECK_LT(long_value.length(), 512u);
142 return long_value;
145 class HeaderTest
146 : public MockIEEventSinkTest,
147 public testing::TestWithParam<TestData> {
148 public:
149 HeaderTest() {}
152 INSTANTIATE_TEST_CASE_P(MetaTag, HeaderTest, testing::Values(
153 TestData(HeaderValue(LowVersion()), false, IN_IE),
154 TestData(HeaderValue(EqualVersion()), false, IN_CF),
155 TestData(HeaderValue(HighVersion()), false, IN_CF),
156 TestData(LongHeaderValue(LowVersion()), false, IN_IE),
157 TestData(LongHeaderValue(EqualVersion()), false, IN_CF),
158 TestData(LongHeaderValue(HighVersion()), false, IN_CF)));
159 INSTANTIATE_TEST_CASE_P(HttpHeader, HeaderTest, testing::Values(
160 TestData(HeaderValue(LowVersion()), true, IN_IE),
161 TestData(HeaderValue(EqualVersion()), true, IN_CF),
162 TestData(HeaderValue(HighVersion()), true, IN_CF),
163 TestData(LongHeaderValue(LowVersion()), true, IN_IE),
164 TestData(LongHeaderValue(EqualVersion()), true, IN_CF),
165 TestData(LongHeaderValue(HighVersion()), true, IN_CF)));
166 INSTANTIATE_TEST_CASE_P(CorruptValueHeader, HeaderTest, testing::Values(
167 TestData(CorruptHeaderValue(LowVersion()), true, IN_IE),
168 TestData(CorruptHeaderValue(EqualVersion()), true, IN_IE),
169 TestData(CorruptHeaderValue(HighVersion()), true, IN_IE),
170 TestData(CorruptHeaderValue(LowVersion()), false, IN_IE),
171 TestData(CorruptHeaderValue(EqualVersion()), false, IN_IE),
172 TestData(CorruptHeaderValue(HighVersion()), false, IN_IE)));
174 TEST_P(HeaderTest, HandleXUaCompatibleHeader) {
175 std::wstring url = GetParam().GetUrl(&server_mock_);
176 LoadedInRenderer expected_renderer = GetParam().GetExpectedRenderer();
178 GetParam().ExpectOnServer(&server_mock_);
179 ie_mock_.ExpectNavigation(expected_renderer, url);
181 EXPECT_CALL(ie_mock_, OnLoad(expected_renderer, testing::StrEq(url)))
182 .WillOnce(CloseBrowserMock(&ie_mock_));
184 LaunchIEAndNavigate(url);
187 } // namespace chrome_frame_test