1 // Copyright (c) 2006-2008 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.
7 #include "net/http/http_request_info.h"
8 #include "net/http/http_response_headers.h"
9 #include "net/http/http_vary_data.h"
10 #include "testing/gtest/include/gtest/gtest.h"
14 typedef testing::Test HttpVaryDataTest
;
16 struct TestTransaction
{
17 net::HttpRequestInfo request
;
18 scoped_refptr
<net::HttpResponseHeaders
> response
;
20 void Init(const std::string
& request_headers
,
21 const std::string
& response_headers
) {
22 std::string
temp(response_headers
);
23 std::replace(temp
.begin(), temp
.end(), '\n', '\0');
24 response
= new net::HttpResponseHeaders(temp
);
26 request
.extra_headers
.Clear();
27 request
.extra_headers
.AddHeadersFromString(request_headers
);
33 TEST(HttpVaryDataTest
, IsInvalid
) {
34 // All of these responses should result in an invalid vary data object.
35 const char* const kTestResponses
[] = {
36 "HTTP/1.1 200 OK\n\n",
37 "HTTP/1.1 200 OK\nVary: *\n\n",
38 "HTTP/1.1 200 OK\nVary: cookie, *, bar\n\n",
39 "HTTP/1.1 200 OK\nVary: cookie\nFoo: 1\nVary: *\n\n",
42 for (size_t i
= 0; i
< arraysize(kTestResponses
); ++i
) {
44 t
.Init(std::string(), kTestResponses
[i
]);
47 EXPECT_FALSE(v
.is_valid());
48 EXPECT_FALSE(v
.Init(t
.request
, *t
.response
.get()));
49 EXPECT_FALSE(v
.is_valid());
53 TEST(HttpVaryDataTest
, MultipleInit
) {
56 // Init to something valid.
58 t1
.Init("Foo: 1\r\nbar: 23", "HTTP/1.1 200 OK\nVary: foo, bar\n\n");
59 EXPECT_TRUE(v
.Init(t1
.request
, *t1
.response
.get()));
60 EXPECT_TRUE(v
.is_valid());
62 // Now overwrite by initializing to something invalid.
64 t2
.Init("Foo: 1\r\nbar: 23", "HTTP/1.1 200 OK\nVary: *\n\n");
65 EXPECT_FALSE(v
.Init(t2
.request
, *t2
.response
.get()));
66 EXPECT_FALSE(v
.is_valid());
69 TEST(HttpVaryDataTest
, DoesVary
) {
71 a
.Init("Foo: 1", "HTTP/1.1 200 OK\nVary: foo\n\n");
74 b
.Init("Foo: 2", "HTTP/1.1 200 OK\nVary: foo\n\n");
77 EXPECT_TRUE(v
.Init(a
.request
, *a
.response
.get()));
79 EXPECT_FALSE(v
.MatchesRequest(b
.request
, *b
.response
.get()));
82 TEST(HttpVaryDataTest
, DoesVary2
) {
84 a
.Init("Foo: 1\r\nbar: 23", "HTTP/1.1 200 OK\nVary: foo, bar\n\n");
87 b
.Init("Foo: 12\r\nbar: 3", "HTTP/1.1 200 OK\nVary: foo, bar\n\n");
90 EXPECT_TRUE(v
.Init(a
.request
, *a
.response
.get()));
92 EXPECT_FALSE(v
.MatchesRequest(b
.request
, *b
.response
.get()));
95 TEST(HttpVaryDataTest
, DoesntVary
) {
97 a
.Init("Foo: 1", "HTTP/1.1 200 OK\nVary: foo\n\n");
100 b
.Init("Foo: 1", "HTTP/1.1 200 OK\nVary: foo\n\n");
103 EXPECT_TRUE(v
.Init(a
.request
, *a
.response
.get()));
105 EXPECT_TRUE(v
.MatchesRequest(b
.request
, *b
.response
.get()));
108 TEST(HttpVaryDataTest
, DoesntVary2
) {
110 a
.Init("Foo: 1\r\nbAr: 2", "HTTP/1.1 200 OK\nVary: foo, bar\n\n");
113 b
.Init("Foo: 1\r\nbaR: 2", "HTTP/1.1 200 OK\nVary: foo\nVary: bar\n\n");
116 EXPECT_TRUE(v
.Init(a
.request
, *a
.response
.get()));
118 EXPECT_TRUE(v
.MatchesRequest(b
.request
, *b
.response
.get()));
121 TEST(HttpVaryDataTest
, ImplicitCookieForRedirect
) {
123 a
.Init("Cookie: 1", "HTTP/1.1 301 Moved\nLocation: x\n\n");
126 b
.Init("Cookie: 2", "HTTP/1.1 301 Moved\nLocation: x\n\n");
129 EXPECT_TRUE(v
.Init(a
.request
, *a
.response
.get()));
131 EXPECT_FALSE(v
.MatchesRequest(b
.request
, *b
.response
.get()));
134 TEST(HttpVaryDataTest
, ImplicitCookieForRedirect2
) {
135 // This should be no different than the test above
138 a
.Init("Cookie: 1", "HTTP/1.1 301 Moved\nLocation: x\nVary: coOkie\n\n");
141 b
.Init("Cookie: 2", "HTTP/1.1 301 Moved\nLocation: x\nVary: cooKie\n\n");
144 EXPECT_TRUE(v
.Init(a
.request
, *a
.response
.get()));
146 EXPECT_FALSE(v
.MatchesRequest(b
.request
, *b
.response
.get()));