Home | History | Annotate | Download | only in http
      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.
      4 
      5 #include <algorithm>
      6 
      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"
     11 
     12 namespace {
     13 
     14 typedef testing::Test HttpVaryDataTest;
     15 
     16 struct TestTransaction {
     17   net::HttpRequestInfo request;
     18   scoped_refptr<net::HttpResponseHeaders> response;
     19 
     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);
     25 
     26     request.extra_headers.Clear();
     27     request.extra_headers.AddHeadersFromString(request_headers);
     28   }
     29 };
     30 
     31 }  // namespace
     32 
     33 TEST(HttpVaryDataTest, IsInvalid) {
     34   // All of these responses should result in an invalid vary data object.
     35   const char* 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",
     40   };
     41 
     42   for (size_t i = 0; i < arraysize(kTestResponses); ++i) {
     43     TestTransaction t;
     44     t.Init("", kTestResponses[i]);
     45 
     46     net::HttpVaryData v;
     47     EXPECT_FALSE(v.is_valid());
     48     EXPECT_FALSE(v.Init(t.request, *t.response));
     49     EXPECT_FALSE(v.is_valid());
     50   }
     51 }
     52 
     53 TEST(HttpVaryDataTest, MultipleInit) {
     54   net::HttpVaryData v;
     55 
     56   // Init to something valid.
     57   TestTransaction t1;
     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));
     60   EXPECT_TRUE(v.is_valid());
     61 
     62   // Now overwrite by initializing to something invalid.
     63   TestTransaction t2;
     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));
     66   EXPECT_FALSE(v.is_valid());
     67 }
     68 
     69 TEST(HttpVaryDataTest, DoesVary) {
     70   TestTransaction a;
     71   a.Init("Foo: 1", "HTTP/1.1 200 OK\nVary: foo\n\n");
     72 
     73   TestTransaction b;
     74   b.Init("Foo: 2", "HTTP/1.1 200 OK\nVary: foo\n\n");
     75 
     76   net::HttpVaryData v;
     77   EXPECT_TRUE(v.Init(a.request, *a.response));
     78 
     79   EXPECT_FALSE(v.MatchesRequest(b.request, *b.response));
     80 }
     81 
     82 TEST(HttpVaryDataTest, DoesVary2) {
     83   TestTransaction a;
     84   a.Init("Foo: 1\r\nbar: 23", "HTTP/1.1 200 OK\nVary: foo, bar\n\n");
     85 
     86   TestTransaction b;
     87   b.Init("Foo: 12\r\nbar: 3", "HTTP/1.1 200 OK\nVary: foo, bar\n\n");
     88 
     89   net::HttpVaryData v;
     90   EXPECT_TRUE(v.Init(a.request, *a.response));
     91 
     92   EXPECT_FALSE(v.MatchesRequest(b.request, *b.response));
     93 }
     94 
     95 TEST(HttpVaryDataTest, DoesntVary) {
     96   TestTransaction a;
     97   a.Init("Foo: 1", "HTTP/1.1 200 OK\nVary: foo\n\n");
     98 
     99   TestTransaction b;
    100   b.Init("Foo: 1", "HTTP/1.1 200 OK\nVary: foo\n\n");
    101 
    102   net::HttpVaryData v;
    103   EXPECT_TRUE(v.Init(a.request, *a.response));
    104 
    105   EXPECT_TRUE(v.MatchesRequest(b.request, *b.response));
    106 }
    107 
    108 TEST(HttpVaryDataTest, DoesntVary2) {
    109   TestTransaction a;
    110   a.Init("Foo: 1\r\nbAr: 2", "HTTP/1.1 200 OK\nVary: foo, bar\n\n");
    111 
    112   TestTransaction b;
    113   b.Init("Foo: 1\r\nbaR: 2", "HTTP/1.1 200 OK\nVary: foo\nVary: bar\n\n");
    114 
    115   net::HttpVaryData v;
    116   EXPECT_TRUE(v.Init(a.request, *a.response));
    117 
    118   EXPECT_TRUE(v.MatchesRequest(b.request, *b.response));
    119 }
    120 
    121 TEST(HttpVaryDataTest, ImplicitCookieForRedirect) {
    122   TestTransaction a;
    123   a.Init("Cookie: 1", "HTTP/1.1 301 Moved\nLocation: x\n\n");
    124 
    125   TestTransaction b;
    126   b.Init("Cookie: 2", "HTTP/1.1 301 Moved\nLocation: x\n\n");
    127 
    128   net::HttpVaryData v;
    129   EXPECT_TRUE(v.Init(a.request, *a.response));
    130 
    131   EXPECT_FALSE(v.MatchesRequest(b.request, *b.response));
    132 }
    133 
    134 TEST(HttpVaryDataTest, ImplicitCookieForRedirect2) {
    135   // This should be no different than the test above
    136 
    137   TestTransaction a;
    138   a.Init("Cookie: 1", "HTTP/1.1 301 Moved\nLocation: x\nVary: coOkie\n\n");
    139 
    140   TestTransaction b;
    141   b.Init("Cookie: 2", "HTTP/1.1 301 Moved\nLocation: x\nVary: cooKie\n\n");
    142 
    143   net::HttpVaryData v;
    144   EXPECT_TRUE(v.Init(a.request, *a.response));
    145 
    146   EXPECT_FALSE(v.MatchesRequest(b.request, *b.response));
    147 }
    148