xref: /aosp_15_r20/external/cronet/net/http/http_vary_data_unittest.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 // Copyright 2006-2008 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "net/http/http_vary_data.h"
6 
7 #include <algorithm>
8 
9 #include "net/http/http_request_info.h"
10 #include "net/http/http_response_headers.h"
11 #include "testing/gtest/include/gtest/gtest.h"
12 
13 namespace net {
14 
15 namespace {
16 
17 typedef testing::Test HttpVaryDataTest;
18 using ExtraHeaders = std::vector<std::pair<std::string, std::string>>;
19 
20 struct TestTransaction {
21   HttpRequestInfo request;
22   scoped_refptr<HttpResponseHeaders> response;
23 
Initnet::__anon24b7d5d30111::TestTransaction24   void Init(const ExtraHeaders& request_headers,
25             const std::string& response_headers) {
26     std::string temp(response_headers);
27     std::replace(temp.begin(), temp.end(), '\n', '\0');
28     response = base::MakeRefCounted<HttpResponseHeaders>(temp);
29 
30     request.extra_headers.Clear();
31     for (const auto& [key, value] : request_headers)
32       request.extra_headers.SetHeader(key, value);
33   }
34 };
35 
36 }  // namespace
37 
TEST(HttpVaryDataTest,IsInvalid)38 TEST(HttpVaryDataTest, IsInvalid) {
39   // Only first of these result in an invalid vary data object.
40   const char* const kTestResponses[] = {
41     "HTTP/1.1 200 OK\n\n",
42     "HTTP/1.1 200 OK\nVary: *\n\n",
43     "HTTP/1.1 200 OK\nVary: cookie, *, bar\n\n",
44     "HTTP/1.1 200 OK\nVary: cookie\nFoo: 1\nVary: *\n\n",
45   };
46 
47   const bool kExpectedValid[] = {false, true, true, true};
48 
49   for (size_t i = 0; i < std::size(kTestResponses); ++i) {
50     TestTransaction t;
51     t.Init(/*request_headers=*/{}, kTestResponses[i]);
52 
53     HttpVaryData v;
54     EXPECT_FALSE(v.is_valid());
55     EXPECT_EQ(kExpectedValid[i], v.Init(t.request, *t.response.get()));
56     EXPECT_EQ(kExpectedValid[i], v.is_valid());
57   }
58 }
59 
TEST(HttpVaryDataTest,MultipleInit)60 TEST(HttpVaryDataTest, MultipleInit) {
61   HttpVaryData v;
62 
63   // Init to something valid.
64   TestTransaction t1;
65   t1.Init({{"Foo", "1"}, {"bar", "23"}}, "HTTP/1.1 200 OK\nVary: foo, bar\n\n");
66   EXPECT_TRUE(v.Init(t1.request, *t1.response.get()));
67   EXPECT_TRUE(v.is_valid());
68 
69   // Now overwrite by initializing to something invalid.
70   TestTransaction t2;
71   t2.Init({{"Foo", "1"}, {"bar", "23"}}, "HTTP/1.1 200 OK\n\n");
72   EXPECT_FALSE(v.Init(t2.request, *t2.response.get()));
73   EXPECT_FALSE(v.is_valid());
74 }
75 
TEST(HttpVaryDataTest,DoesVary)76 TEST(HttpVaryDataTest, DoesVary) {
77   TestTransaction a;
78   a.Init({{"Foo", "1"}}, "HTTP/1.1 200 OK\nVary: foo\n\n");
79 
80   TestTransaction b;
81   b.Init({{"Foo", "2"}}, "HTTP/1.1 200 OK\nVary: foo\n\n");
82 
83   HttpVaryData v;
84   EXPECT_TRUE(v.Init(a.request, *a.response.get()));
85 
86   EXPECT_FALSE(v.MatchesRequest(b.request, *b.response.get()));
87 }
88 
TEST(HttpVaryDataTest,DoesVary2)89 TEST(HttpVaryDataTest, DoesVary2) {
90   TestTransaction a;
91   a.Init({{"Foo", "1"}, {"bar", "23"}}, "HTTP/1.1 200 OK\nVary: foo, bar\n\n");
92 
93   TestTransaction b;
94   b.Init({{"Foo", "12"}, {"bar", "3"}}, "HTTP/1.1 200 OK\nVary: foo, bar\n\n");
95 
96   HttpVaryData v;
97   EXPECT_TRUE(v.Init(a.request, *a.response.get()));
98 
99   EXPECT_FALSE(v.MatchesRequest(b.request, *b.response.get()));
100 }
101 
TEST(HttpVaryDataTest,DoesVaryStar)102 TEST(HttpVaryDataTest, DoesVaryStar) {
103   // Vary: * varies even when headers are identical
104   const ExtraHeaders kRequestHeaders = {{"Foo", "1"}};
105   const char kResponse[] = "HTTP/1.1 200 OK\nVary: *\n\n";
106 
107   TestTransaction a;
108   a.Init(kRequestHeaders, kResponse);
109 
110   TestTransaction b;
111   b.Init(kRequestHeaders, kResponse);
112 
113   HttpVaryData v;
114   EXPECT_TRUE(v.Init(a.request, *a.response.get()));
115 
116   EXPECT_FALSE(v.MatchesRequest(b.request, *b.response.get()));
117 }
118 
TEST(HttpVaryDataTest,DoesntVary)119 TEST(HttpVaryDataTest, DoesntVary) {
120   TestTransaction a;
121   a.Init({{"Foo", "1"}}, "HTTP/1.1 200 OK\nVary: foo\n\n");
122 
123   TestTransaction b;
124   b.Init({{"Foo", "1"}}, "HTTP/1.1 200 OK\nVary: foo\n\n");
125 
126   HttpVaryData v;
127   EXPECT_TRUE(v.Init(a.request, *a.response.get()));
128 
129   EXPECT_TRUE(v.MatchesRequest(b.request, *b.response.get()));
130 }
131 
TEST(HttpVaryDataTest,DoesntVary2)132 TEST(HttpVaryDataTest, DoesntVary2) {
133   TestTransaction a;
134   a.Init({{"Foo", "1"}, {"bAr", "2"}}, "HTTP/1.1 200 OK\nVary: foo, bar\n\n");
135 
136   TestTransaction b;
137   b.Init({{"Foo", "1"}, {"baR", "2"}},
138          "HTTP/1.1 200 OK\nVary: foo\nVary: bar\n\n");
139 
140   HttpVaryData v;
141   EXPECT_TRUE(v.Init(a.request, *a.response.get()));
142 
143   EXPECT_TRUE(v.MatchesRequest(b.request, *b.response.get()));
144 }
145 
TEST(HttpVaryDataTest,DoesntVaryByCookieForRedirect)146 TEST(HttpVaryDataTest, DoesntVaryByCookieForRedirect) {
147   TestTransaction a;
148   a.Init({{"Cookie", "1"}}, "HTTP/1.1 301 Moved\nLocation: x\n\n");
149 
150   HttpVaryData v;
151   EXPECT_FALSE(v.Init(a.request, *a.response.get()));
152 }
153 
154 }  // namespace net
155