1c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be
3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file.
4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <algorithm>
6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/http/http_request_info.h"
8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/http/http_response_headers.h"
9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/http/http_vary_data.h"
10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "testing/gtest/include/gtest/gtest.h"
11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace {
13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttypedef testing::Test HttpVaryDataTest;
15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstruct TestTransaction {
17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  net::HttpRequestInfo request;
18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  scoped_refptr<net::HttpResponseHeaders> response;
19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void Init(const std::string& request_headers,
21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            const std::string& response_headers) {
22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    std::string temp(response_headers);
23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    std::replace(temp.begin(), temp.end(), '\n', '\0');
24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    response = new net::HttpResponseHeaders(temp);
25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    request.extra_headers.Clear();
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    request.extra_headers.AddHeadersFromString(request_headers);
28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}  // namespace
32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HttpVaryDataTest, IsInvalid) {
34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // All of these responses should result in an invalid vary data object.
35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const char* kTestResponses[] = {
36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    "HTTP/1.1 200 OK\n\n",
37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    "HTTP/1.1 200 OK\nVary: *\n\n",
38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    "HTTP/1.1 200 OK\nVary: cookie, *, bar\n\n",
39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    "HTTP/1.1 200 OK\nVary: cookie\nFoo: 1\nVary: *\n\n",
40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  };
41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  for (size_t i = 0; i < arraysize(kTestResponses); ++i) {
43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    TestTransaction t;
44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    t.Init("", kTestResponses[i]);
45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    net::HttpVaryData v;
47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_FALSE(v.is_valid());
48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_FALSE(v.Init(t.request, *t.response));
49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_FALSE(v.is_valid());
50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HttpVaryDataTest, MultipleInit) {
54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  net::HttpVaryData v;
55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Init to something valid.
57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  TestTransaction t1;
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  t1.Init("Foo: 1\r\nbar: 23", "HTTP/1.1 200 OK\nVary: foo, bar\n\n");
59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(v.Init(t1.request, *t1.response));
60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(v.is_valid());
61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Now overwrite by initializing to something invalid.
63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  TestTransaction t2;
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  t2.Init("Foo: 1\r\nbar: 23", "HTTP/1.1 200 OK\nVary: *\n\n");
65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(v.Init(t2.request, *t2.response));
66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(v.is_valid());
67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HttpVaryDataTest, DoesVary) {
70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  TestTransaction a;
71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  a.Init("Foo: 1", "HTTP/1.1 200 OK\nVary: foo\n\n");
72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  TestTransaction b;
74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  b.Init("Foo: 2", "HTTP/1.1 200 OK\nVary: foo\n\n");
75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  net::HttpVaryData v;
77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(v.Init(a.request, *a.response));
78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(v.MatchesRequest(b.request, *b.response));
80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HttpVaryDataTest, DoesVary2) {
83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  TestTransaction a;
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  a.Init("Foo: 1\r\nbar: 23", "HTTP/1.1 200 OK\nVary: foo, bar\n\n");
85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  TestTransaction b;
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  b.Init("Foo: 12\r\nbar: 3", "HTTP/1.1 200 OK\nVary: foo, bar\n\n");
88c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  net::HttpVaryData v;
90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(v.Init(a.request, *a.response));
91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(v.MatchesRequest(b.request, *b.response));
93c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
94c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
95c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HttpVaryDataTest, DoesntVary) {
96c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  TestTransaction a;
97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  a.Init("Foo: 1", "HTTP/1.1 200 OK\nVary: foo\n\n");
98c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
99c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  TestTransaction b;
100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  b.Init("Foo: 1", "HTTP/1.1 200 OK\nVary: foo\n\n");
101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  net::HttpVaryData v;
103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(v.Init(a.request, *a.response));
104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(v.MatchesRequest(b.request, *b.response));
106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HttpVaryDataTest, DoesntVary2) {
109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  TestTransaction a;
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  a.Init("Foo: 1\r\nbAr: 2", "HTTP/1.1 200 OK\nVary: foo, bar\n\n");
111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  TestTransaction b;
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  b.Init("Foo: 1\r\nbaR: 2", "HTTP/1.1 200 OK\nVary: foo\nVary: bar\n\n");
114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  net::HttpVaryData v;
116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(v.Init(a.request, *a.response));
117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(v.MatchesRequest(b.request, *b.response));
119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HttpVaryDataTest, ImplicitCookieForRedirect) {
122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  TestTransaction a;
123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  a.Init("Cookie: 1", "HTTP/1.1 301 Moved\nLocation: x\n\n");
124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  TestTransaction b;
126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  b.Init("Cookie: 2", "HTTP/1.1 301 Moved\nLocation: x\n\n");
127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  net::HttpVaryData v;
129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(v.Init(a.request, *a.response));
130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(v.MatchesRequest(b.request, *b.response));
132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(HttpVaryDataTest, ImplicitCookieForRedirect2) {
135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // This should be no different than the test above
136c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  TestTransaction a;
138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  a.Init("Cookie: 1", "HTTP/1.1 301 Moved\nLocation: x\nVary: coOkie\n\n");
139c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  TestTransaction b;
141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  b.Init("Cookie: 2", "HTTP/1.1 301 Moved\nLocation: x\nVary: cooKie\n\n");
142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  net::HttpVaryData v;
144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(v.Init(a.request, *a.response));
145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
146c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(v.MatchesRequest(b.request, *b.response));
147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
148