blob: 49c667dc1b2de9b7d431ee556a84ef36623b8aa0 [file] [log] [blame]
[email protected]00a05bc2011-09-29 18:08:061// Copyright (c) 2011 The Chromium Authors. All rights reserved.
[email protected]b57f03232010-10-25 14:14:392// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
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"
8
9namespace chrome_frame_test {
10
11class 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))) {
18 }
19
20 LoadedInRenderer GetExpectedRenderer() const {
21 return expected_;
22 }
23
24 std::wstring GetPath() const {
25 return ASCIIToWide("/" + name_);
26 }
27
28 std::wstring GetUrl(MockWebServer* server_mock) const {
29 return server_mock->Resolve(ASCIIToWide(name_));
30 }
31
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()));
36 }
37
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 if (in_header_) {
44 headers << "X-UA-COMPATIBLE: " << value_ << "\r\n";
45 }
46 return headers.str();
47 }
48
49 std::string GetHtml() const {
50 std::ostringstream html;
51 html << "<html><head>";
52 if (!in_header_) {
53 html << "<meta http-equiv=\"x-ua-compatible\" content=\"" << value_
54 << "\" />";
55 }
56 html << "</head><body>This is some text.</body></html>";
57 return html.str();
58 }
59
60 private:
61 LoadedInRenderer expected_;
62 std::string name_;
63 std::string value_;
64 bool in_header_;
65};
66
67// Determines the major version of the installed IE
68// Returns -1 in case of failure, 0 if the version is newer than currently known
69int GetIEMajorVersion() {
70 switch (GetInstalledIEVersion()) {
71 case IE_6:
72 return 6;
73 case IE_7:
74 return 7;
75 case IE_8:
76 return 8;
77 case IE_9:
78 return 9;
[email protected]00a05bc2011-09-29 18:08:0679 case IE_10:
80 return 10;
[email protected]b57f03232010-10-25 14:14:3981 case IE_INVALID:
82 case NON_IE:
83 case IE_UNSUPPORTED:
84 ADD_FAILURE() << "Failed to detect IE version.";
85 return -1;
86 default:
87 return 0;
88 }
89}
90
91int LowVersion() {
92 int ie_version = GetIEMajorVersion();
93 switch (ie_version) {
94 case -1:
95 case 0:
96 return 5;
97 default:
98 return ie_version - 1;
99 }
100}
101
102int HighVersion() {
103 int ie_version = GetIEMajorVersion();
104 switch (ie_version) {
105 case -1:
106 case 0:
107 return 1000;
108 default:
109 return ie_version + 1;
110 }
111}
112
113int EqualVersion() {
114 int ie_version = GetIEMajorVersion();
115 switch (ie_version) {
116 case -1:
117 case 0:
118 return 1000;
119 default:
120 return ie_version;
121 }
122}
123
124std::string HeaderValue(int ie_version) {
125 if (ie_version == -1) {
126 return "IE=8; Chrome=1";
127 } else {
128 return std::string("IE=8; Chrome=IE") + base::IntToString(ie_version);
129 }
130}
131
132std::string CorruptHeaderValue(int ie_version) {
133 return HeaderValue(ie_version) + ".0";
134}
135
136std::string LongHeaderValue(int ie_version) {
137 std::string long_value = HeaderValue(ie_version) + "; " +
138 std::string(256, 'a') + "=bbb";
139 DCHECK_GT(long_value.length(), 256u);
140 DCHECK_LT(long_value.length(), 512u);
141 return long_value;
142}
143
144class HeaderTest
145 : public MockIEEventSinkTest,
146 public testing::TestWithParam<TestData> {
147 public:
148 HeaderTest() {}
149};
150
151INSTANTIATE_TEST_CASE_P(MetaTag, HeaderTest, testing::Values(
152 TestData(HeaderValue(LowVersion()), false, IN_IE),
153 TestData(HeaderValue(EqualVersion()), false, IN_CF),
154 TestData(HeaderValue(HighVersion()), false, IN_CF),
155 TestData(LongHeaderValue(LowVersion()), false, IN_IE),
156 TestData(LongHeaderValue(EqualVersion()), false, IN_CF),
157 TestData(LongHeaderValue(HighVersion()), false, IN_CF)));
158INSTANTIATE_TEST_CASE_P(HttpHeader, HeaderTest, testing::Values(
159 TestData(HeaderValue(LowVersion()), true, IN_IE),
160 TestData(HeaderValue(EqualVersion()), true, IN_CF),
161 TestData(HeaderValue(HighVersion()), true, IN_CF),
162 TestData(LongHeaderValue(LowVersion()), true, IN_IE),
163 TestData(LongHeaderValue(EqualVersion()), true, IN_CF),
164 TestData(LongHeaderValue(HighVersion()), true, IN_CF)));
165INSTANTIATE_TEST_CASE_P(CorruptValueHeader, HeaderTest, testing::Values(
166 TestData(CorruptHeaderValue(LowVersion()), true, IN_IE),
167 TestData(CorruptHeaderValue(EqualVersion()), true, IN_IE),
168 TestData(CorruptHeaderValue(HighVersion()), true, IN_IE),
169 TestData(CorruptHeaderValue(LowVersion()), false, IN_IE),
170 TestData(CorruptHeaderValue(EqualVersion()), false, IN_IE),
171 TestData(CorruptHeaderValue(HighVersion()), false, IN_IE)));
172
173TEST_P(HeaderTest, HandleXUaCompatibleHeader) {
174 std::wstring url = GetParam().GetUrl(&server_mock_);
175 LoadedInRenderer expected_renderer = GetParam().GetExpectedRenderer();
176
177 GetParam().ExpectOnServer(&server_mock_);
178 ie_mock_.ExpectNavigation(expected_renderer, url);
179
180 EXPECT_CALL(ie_mock_, OnLoad(expected_renderer, testing::StrEq(url)))
181 .WillOnce(CloseBrowserMock(&ie_mock_));
182
183 LaunchIEAndNavigate(url);
184}
185
186} // namespace chrome_frame_test