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