1f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// found in the LICENSE file.
4f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
5f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "components/data_reduction_proxy/common/data_reduction_proxy_headers.h"
6f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
76e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include <vector>
86e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/data_reduction_proxy/common/data_reduction_proxy_headers_test_utils.h"
10f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "net/http/http_response_headers.h"
11f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "net/proxy/proxy_service.h"
12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
13f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
14f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace data_reduction_proxy {
15f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
16f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class DataReductionProxyHeadersTest : public testing::Test {};
17f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(DataReductionProxyHeadersTest, GetDataReductionProxyActionValue) {
196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  const struct {
206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)     const char* headers;
216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)     std::string action_key;
226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)     bool expected_result;
236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)     std::string expected_action_value;
246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  } tests[] = {
256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    { "HTTP/1.1 200 OK\n"
266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Content-Length: 999\n",
276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "a",
286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      false,
296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "",
306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    },
316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    { "HTTP/1.1 200 OK\n"
326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "connection: keep-alive\n"
336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Content-Length: 999\n",
346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "a",
356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      false,
366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "",
376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    },
386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    { "HTTP/1.1 200 OK\n"
396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "connection: keep-alive\n"
406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Chrome-Proxy: bypass=86400\n"
416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Content-Length: 999\n",
426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "bypass",
436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      true,
446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "86400",
456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    },
466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    { "HTTP/1.1 200 OK\n"
476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "connection: keep-alive\n"
486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Chrome-Proxy: bypass86400\n"
496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Content-Length: 999\n",
506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "bypass",
516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      false,
526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "",
536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    },
546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    { "HTTP/1.1 200 OK\n"
556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "connection: keep-alive\n"
566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Chrome-Proxy: bypass=0\n"
576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Content-Length: 999\n",
586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "bypass",
596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      true,
606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "0",
616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    },
626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    { "HTTP/1.1 200 OK\n"
636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "connection: keep-alive\n"
646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Chrome-Proxy: bypass=1500\n"
656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Chrome-Proxy: bypass=86400\n"
666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Content-Length: 999\n",
676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "bypass",
686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      true,
696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "1500",
706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    },
716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    { "HTTP/1.1 200 OK\n"
726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "connection: keep-alive\n"
736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Chrome-Proxy: block=1500, block=3600\n"
746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Content-Length: 999\n",
756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "block",
766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      true,
776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "1500",
786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    },
796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    { "HTTP/1.1 200 OK\n"
806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "connection: proxy-bypass\n"
816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Chrome-Proxy:    key=123   \n"
826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Content-Length: 999\n",
836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "key",
846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      true,
856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "123",
866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    },
876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    { "HTTP/1.1 200 OK\n"
886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "connection: proxy-bypass\n"
896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Chrome-Proxy: block-once\n"
906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Content-Length: 999\n",
916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "block-once",
926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      false,
936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "",
946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    },
956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  };
966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    std::string headers(tests[i].headers);
986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    HeadersToRaw(&headers);
996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    scoped_refptr<net::HttpResponseHeaders> parsed(
1006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        new net::HttpResponseHeaders(headers));
1016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    std::string action_value;
1036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    bool has_action_key = GetDataReductionProxyActionValue(
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        parsed.get(), tests[i].action_key, &action_value);
1056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    EXPECT_EQ(tests[i].expected_result, has_action_key);
1066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if (has_action_key) {
1076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      EXPECT_EQ(tests[i].expected_action_value, action_value);
1086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    }
1096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
1106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
112f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TEST_F(DataReductionProxyHeadersTest, GetProxyBypassInfo) {
113f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const struct {
114f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)     const char* headers;
115f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)     bool expected_result;
116f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)     int64 expected_retry_delay;
117f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)     bool expected_bypass_all;
1186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)     bool expected_mark_proxies_as_bad;
119f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  } tests[] = {
120f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { "HTTP/1.1 200 OK\n"
121f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Content-Length: 999\n",
122f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      false,
123f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      0,
124f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      false,
1256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      false,
126f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    },
127f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { "HTTP/1.1 200 OK\n"
128f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "connection: keep-alive\n"
129f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Content-Length: 999\n",
130f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      false,
131f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      0,
132f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      false,
1336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      false,
134f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    },
135f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { "HTTP/1.1 200 OK\n"
136f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "connection: keep-alive\n"
137f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Chrome-Proxy: bypass=86400\n"
138f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Content-Length: 999\n",
139f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      true,
140f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      86400,
141f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      false,
1426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      true,
143f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    },
144f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { "HTTP/1.1 200 OK\n"
145f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "connection: keep-alive\n"
146f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Chrome-Proxy: bypass=-1\n"
147f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Content-Length: 999\n",
148f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      false,
149f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      0,
150f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      false,
1516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      false,
152f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    },
153f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { "HTTP/1.1 200 OK\n"
154f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "connection: keep-alive\n"
155f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Chrome-Proxy: bypass=xyz\n"
156f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Content-Length: 999\n",
157f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      false,
158f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      0,
159f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      false,
1606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      false,
161f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    },
162f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { "HTTP/1.1 200 OK\n"
163f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "connection: keep-alive\n"
164f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Chrome-Proxy: bypass\n"
165f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Content-Length: 999\n",
166f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      false,
167f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      0,
168f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      false,
1696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      false,
170f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    },
171f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { "HTTP/1.1 200 OK\n"
172f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "connection: keep-alive\n"
173f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Chrome-Proxy: foo=abc, bypass=86400\n"
174f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Content-Length: 999\n",
175f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      true,
176f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      86400,
177f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      false,
1786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      true,
179f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    },
180f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { "HTTP/1.1 200 OK\n"
181f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "connection: keep-alive\n"
182f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Chrome-Proxy: bypass=86400, bar=abc\n"
183f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Content-Length: 999\n",
184f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      true,
185f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      86400,
186f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      false,
1876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      true,
188f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    },
189f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { "HTTP/1.1 200 OK\n"
190f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "connection: keep-alive\n"
191f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Chrome-Proxy: bypass=3600\n"
192f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Chrome-Proxy: bypass=86400\n"
193f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Content-Length: 999\n",
194f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      true,
195f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      3600,
196f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      false,
1976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      true,
198f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    },
199f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { "HTTP/1.1 200 OK\n"
200f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "connection: keep-alive\n"
201f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Chrome-Proxy: bypass=3600, bypass=86400\n"
202f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Content-Length: 999\n",
203f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      true,
204f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      3600,
205f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      false,
2066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      true,
207f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    },
208f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { "HTTP/1.1 200 OK\n"
209f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "connection: keep-alive\n"
210f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Chrome-Proxy: bypass=, bypass=86400\n"
211f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Content-Length: 999\n",
212f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      true,
213f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      86400,
214f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      false,
2156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      true,
216f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    },
217f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { "HTTP/1.1 200 OK\n"
218f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "connection: keep-alive\n"
219f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Chrome-Proxy: bypass\n"
220f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Chrome-Proxy: bypass=86400\n"
221f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Content-Length: 999\n",
222f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      true,
223f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      86400,
224f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      false,
2256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      true,
226f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    },
227f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { "HTTP/1.1 200 OK\n"
228f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "connection: keep-alive\n"
229f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Chrome-Proxy: block=, block=3600\n"
230f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Content-Length: 999\n",
231f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      true,
232f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      3600,
233f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      true,
2346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      true,
235f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    },
236f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { "HTTP/1.1 200 OK\n"
237f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "connection: keep-alive\n"
238f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Chrome-Proxy: bypass=86400, block=3600\n"
239f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Content-Length: 999\n",
240f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      true,
241f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      3600,
242f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      true,
2436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      true,
244f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    },
245f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { "HTTP/1.1 200 OK\n"
246f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "connection: proxy-bypass\n"
247f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Chrome-Proxy: block=, bypass=86400\n"
248f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Content-Length: 999\n",
249f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      true,
250f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      86400,
251f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      false,
2526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      true,
253f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    },
254f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { "HTTP/1.1 200 OK\n"
255f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "connection: proxy-bypass\n"
256f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Chrome-Proxy: block=-1\n"
257f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Content-Length: 999\n",
258f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      false,
259f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      0,
260f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      false,
2616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      false,
262f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    },
263f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { "HTTP/1.1 200 OK\n"
264f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "connection: proxy-bypass\n"
265f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Chrome-Proxy: block=99999999999999999999\n"
266f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Content-Length: 999\n",
267f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      false,
268f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      0,
269f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      false,
2706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      false,
2716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    },
2726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    { "HTTP/1.1 200 OK\n"
2736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "connection: keep-alive\n"
2746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Chrome-Proxy: block-once\n"
2756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Content-Length: 999\n",
2766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      true,
2776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      0,
2786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      true,
2796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      false,
2806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    },
2816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    { "HTTP/1.1 200 OK\n"
2826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "connection: keep-alive\n"
2836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Chrome-Proxy: block-once=\n"
2846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Content-Length: 999\n",
2856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      false,
2866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      0,
2876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      false,
2886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      false,
2896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    },
2906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    { "HTTP/1.1 200 OK\n"
2916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "connection: keep-alive\n"
2926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Chrome-Proxy: block-once=10\n"
2936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Content-Length: 999\n",
2946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      false,
2956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      0,
2966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      false,
2976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      false,
2986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    },
2996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    { "HTTP/1.1 200 OK\n"
3006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "connection: keep-alive\n"
3016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Chrome-Proxy: block-once, bypass=86400, block=3600\n"
3026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Content-Length: 999\n",
3036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      true,
3046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      3600,
3056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      true,
3066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      true,
3076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    },
3086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    { "HTTP/1.1 200 OK\n"
3096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "connection: keep-alive\n"
3106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Chrome-Proxy: block-once\n"
3116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Chrome-Proxy: bypass=86400, block=3600\n"
3126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Content-Length: 999\n",
3136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      true,
3146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      3600,
3156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      true,
3166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      true,
3176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    },
3186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    { "HTTP/1.1 200 OK\n"
3196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "connection: keep-alive\n"
3206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Chrome-Proxy: block-once, bypass=86400\n"
3216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Content-Length: 999\n",
3226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      true,
3236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      86400,
3246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      false,
3256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      true,
3266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    },
3276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    { "HTTP/1.1 200 OK\n"
3286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "connection: keep-alive\n"
3296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Chrome-Proxy: block-once, block=3600\n"
3306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Content-Length: 999\n",
3316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      true,
3326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      3600,
3336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      true,
3346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      true,
3356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    },
3366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    { "HTTP/1.1 200 OK\n"
3376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "connection: keep-alive\n"
3386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Chrome-Proxy: bypass=, block=, block-once\n"
3396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Content-Length: 999\n",
3406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      true,
3416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      0,
3426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      true,
3436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      false,
344f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    },
345f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  };
346f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
347f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    std::string headers(tests[i].headers);
348f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    HeadersToRaw(&headers);
349f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    scoped_refptr<net::HttpResponseHeaders> parsed(
350f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        new net::HttpResponseHeaders(headers));
351f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
352f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    DataReductionProxyInfo data_reduction_proxy_info;
3531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_EQ(
3541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        tests[i].expected_result,
3551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ParseHeadersAndSetProxyInfo(parsed.get(), &data_reduction_proxy_info));
356f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_EQ(tests[i].expected_retry_delay,
357f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)              data_reduction_proxy_info.bypass_duration.InSeconds());
358f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_EQ(tests[i].expected_bypass_all,
359f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)              data_reduction_proxy_info.bypass_all);
3606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    EXPECT_EQ(tests[i].expected_mark_proxies_as_bad,
3616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)              data_reduction_proxy_info.mark_proxies_as_bad);
362f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
363f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
364f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
3655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(DataReductionProxyHeadersTest, ParseHeadersAndSetProxyInfo) {
3665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  std::string headers =
3675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "HTTP/1.1 200 OK\n"
3685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "connection: keep-alive\n"
3695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "Chrome-Proxy: bypass=0\n"
3705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "Content-Length: 999\n";
3715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  HeadersToRaw(&headers);
3725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scoped_refptr<net::HttpResponseHeaders> parsed(
3735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      new net::HttpResponseHeaders(headers));
3745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DataReductionProxyInfo data_reduction_proxy_info;
3761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(
3771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ParseHeadersAndSetProxyInfo(parsed.get(), &data_reduction_proxy_info));
3785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_LE(60, data_reduction_proxy_info.bypass_duration.InSeconds());
3795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_GE(5 * 60, data_reduction_proxy_info.bypass_duration.InSeconds());
3805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(data_reduction_proxy_info.bypass_all);
3815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
3825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
383f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TEST_F(DataReductionProxyHeadersTest, HasDataReductionProxyViaHeader) {
384f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const struct {
3856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    const char* headers;
3866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    bool expected_result;
3876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    bool expected_has_intermediary;
3886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    bool ignore_intermediary;
389f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  } tests[] = {
390f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { "HTTP/1.1 200 OK\n"
391f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Via: 1.1 Chrome-Proxy\n",
392f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      false,
3936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      false,
3946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      false,
395f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    },
396f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { "HTTP/1.1 200 OK\n"
397f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Via: 1\n",
398f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      false,
3996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      false,
4006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      false,
401f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    },
402f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { "HTTP/1.1 200 OK\n"
403f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Via: 1.1 Chrome-Compression-Proxy\n",
404f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      true,
4056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      true,
4066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      false,
407f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    },
408f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { "HTTP/1.1 200 OK\n"
409f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Via: 1.0 Chrome-Compression-Proxy\n",
410f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      true,
4116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      true,
4126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      false,
413f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    },
414f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { "HTTP/1.1 200 OK\n"
415f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Via: 1.1 Foo-Bar, 1.1 Chrome-Compression-Proxy\n",
416f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      true,
4176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      true,
4186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      false,
419f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    },
420f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { "HTTP/1.1 200 OK\n"
421f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Via: 1.1 Chrome-Compression-Proxy, 1.1 Bar-Foo\n",
422f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      true,
4236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      false,
4246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      false,
425f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    },
426f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { "HTTP/1.1 200 OK\n"
427f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Via: 1.1 chrome-compression-proxy\n",
428f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      false,
4296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      false,
4306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      false,
431f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    },
432f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { "HTTP/1.1 200 OK\n"
433f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Via: 1.1 Foo-Bar\n"
434f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Via: 1.1 Chrome-Compression-Proxy\n",
435f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      true,
4366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      true,
4376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      false,
4386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    },
4396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    { "HTTP/1.1 200 OK\n"
4406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Via: 1.1 Chrome-Compression-Proxy\n"
4416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Via: 1.1 Foo-Bar\n",
4426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      true,
4436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      false,
4446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      false,
445f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    },
446f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { "HTTP/1.1 200 OK\n"
447f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Via: 1.1 Chrome-Proxy\n",
448f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      false,
4496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      false,
4506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      false,
451f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    },
452f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { "HTTP/1.1 200 OK\n"
453f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Via: 1.1 Chrome Compression Proxy\n",
454f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      true,
4556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      true,
4566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      false,
457f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    },
458f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { "HTTP/1.1 200 OK\n"
459f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Via: 1.1 Foo-Bar, 1.1 Chrome Compression Proxy\n",
460f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      true,
4616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      true,
4626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      false,
463f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    },
464f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { "HTTP/1.1 200 OK\n"
465f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Via: 1.1 Chrome Compression Proxy, 1.1 Bar-Foo\n",
466f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      true,
4676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      false,
4686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      false,
469f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    },
470f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { "HTTP/1.1 200 OK\n"
471f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Via: 1.1 chrome compression proxy\n",
472f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      false,
4736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      false,
4746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      false,
475f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    },
476f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { "HTTP/1.1 200 OK\n"
477f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Via: 1.1 Foo-Bar\n"
478f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Via: 1.1 Chrome Compression Proxy\n",
479f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      true,
4806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      true,
4816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      false,
4826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    },
4836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    { "HTTP/1.1 200 OK\n"
4846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Via: 1.1 Chrome Compression Proxy\n"
4856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Via: 1.1 Foo-Bar\n",
4866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      true,
4876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      false,
4886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      false,
4896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    },
4906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    { "HTTP/1.1 200 OK\n"
4916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Via: 1.1 Chrome Compression Proxy\n"
4926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Via: 1.1 Foo-Bar\n",
4936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      true,
4946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      false,
4956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      true,
496f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    },
497f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  };
498f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
499f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    std::string headers(tests[i].headers);
500f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    HeadersToRaw(&headers);
501f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    scoped_refptr<net::HttpResponseHeaders> parsed(
502f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        new net::HttpResponseHeaders(headers));
503f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
5046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    bool has_chrome_proxy_via_header, has_intermediary;
5056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if (tests[i].ignore_intermediary) {
5066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      has_chrome_proxy_via_header =
5071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          HasDataReductionProxyViaHeader(parsed.get(), NULL);
5086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    }
5096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    else {
5106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      has_chrome_proxy_via_header =
5111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          HasDataReductionProxyViaHeader(parsed.get(), &has_intermediary);
5126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    }
5136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    EXPECT_EQ(tests[i].expected_result, has_chrome_proxy_via_header);
5146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if (has_chrome_proxy_via_header && !tests[i].ignore_intermediary) {
5156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      EXPECT_EQ(tests[i].expected_has_intermediary, has_intermediary);
5166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    }
517f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
518f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
519f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
520f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TEST_F(DataReductionProxyHeadersTest, GetDataReductionProxyBypassEventType) {
521f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const struct {
522f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)     const char* headers;
5236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)     DataReductionProxyBypassType expected_result;
524f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  } tests[] = {
525f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { "HTTP/1.1 200 OK\n"
526f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Chrome-Proxy: bypass=0\n"
527f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Via: 1.1 Chrome-Compression-Proxy\n",
5286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      BYPASS_EVENT_TYPE_MEDIUM,
5295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    },
5305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    { "HTTP/1.1 200 OK\n"
5315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "Chrome-Proxy: bypass=1\n"
5325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "Via: 1.1 Chrome-Compression-Proxy\n",
5336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      BYPASS_EVENT_TYPE_SHORT,
534f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    },
535f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { "HTTP/1.1 200 OK\n"
536116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      "Chrome-Proxy: bypass=59\n"
537f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Via: 1.1 Chrome-Compression-Proxy\n",
5386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      BYPASS_EVENT_TYPE_SHORT,
539f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    },
540f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { "HTTP/1.1 200 OK\n"
541116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      "Chrome-Proxy: bypass=60\n"
542116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      "Via: 1.1 Chrome-Compression-Proxy\n",
5436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      BYPASS_EVENT_TYPE_MEDIUM,
544116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    },
545116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    { "HTTP/1.1 200 OK\n"
546116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      "Chrome-Proxy: bypass=300\n"
547116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      "Via: 1.1 Chrome-Compression-Proxy\n",
5486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      BYPASS_EVENT_TYPE_MEDIUM,
549116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    },
550116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    { "HTTP/1.1 200 OK\n"
551116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      "Chrome-Proxy: bypass=301\n"
552f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Via: 1.1 Chrome-Compression-Proxy\n",
5536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      BYPASS_EVENT_TYPE_LONG,
5546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    },
5556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    { "HTTP/1.1 200 OK\n"
5566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Chrome-Proxy: block-once\n"
5576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Via: 1.1 Chrome-Compression-Proxy\n",
5586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      BYPASS_EVENT_TYPE_CURRENT,
559f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    },
560f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { "HTTP/1.1 500 Internal Server Error\n"
561f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Via: 1.1 Chrome-Compression-Proxy\n",
5626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      BYPASS_EVENT_TYPE_STATUS_500_HTTP_INTERNAL_SERVER_ERROR,
563f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    },
564f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { "HTTP/1.1 501 Not Implemented\n"
565f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Via: 1.1 Chrome-Compression-Proxy\n",
5666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      BYPASS_EVENT_TYPE_MAX,
567f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    },
568f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { "HTTP/1.1 502 Bad Gateway\n"
569f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Via: 1.1 Chrome-Compression-Proxy\n",
5706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      BYPASS_EVENT_TYPE_STATUS_502_HTTP_BAD_GATEWAY,
571f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    },
572f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { "HTTP/1.1 503 Service Unavailable\n"
573f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Via: 1.1 Chrome-Compression-Proxy\n",
5746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      BYPASS_EVENT_TYPE_STATUS_503_HTTP_SERVICE_UNAVAILABLE,
575f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    },
576f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { "HTTP/1.1 504 Gateway Timeout\n"
577f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Via: 1.1 Chrome-Compression-Proxy\n",
5786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      BYPASS_EVENT_TYPE_MAX,
579f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    },
580f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { "HTTP/1.1 505 HTTP Version Not Supported\n"
581f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Via: 1.1 Chrome-Compression-Proxy\n",
5826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      BYPASS_EVENT_TYPE_MAX,
583f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    },
584f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { "HTTP/1.1 304 Not Modified\n",
5856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        BYPASS_EVENT_TYPE_MAX,
586f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    },
587f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { "HTTP/1.1 200 OK\n",
5886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        BYPASS_EVENT_TYPE_MISSING_VIA_HEADER_OTHER,
589f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    },
590f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { "HTTP/1.1 200 OK\n"
591116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      "Chrome-Proxy: bypass=59\n",
5926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      BYPASS_EVENT_TYPE_SHORT,
593f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    },
594f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { "HTTP/1.1 502 Bad Gateway\n",
5956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        BYPASS_EVENT_TYPE_STATUS_502_HTTP_BAD_GATEWAY,
596f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    },
597f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { "HTTP/1.1 502 Bad Gateway\n"
598116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      "Chrome-Proxy: bypass=59\n",
5996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      BYPASS_EVENT_TYPE_SHORT,
600f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    },
601f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { "HTTP/1.1 502 Bad Gateway\n"
602116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      "Chrome-Proxy: bypass=59\n",
6036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      BYPASS_EVENT_TYPE_SHORT,
604f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    },
605f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { "HTTP/1.1 414 Request-URI Too Long\n",
6066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        BYPASS_EVENT_TYPE_MISSING_VIA_HEADER_4XX,
607f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    },
608f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { "HTTP/1.1 414 Request-URI Too Long\n"
609f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Via: 1.1 Chrome-Compression-Proxy\n",
6106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      BYPASS_EVENT_TYPE_MAX,
611f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    },
612f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { "HTTP/1.1 407 Proxy Authentication Required\n",
6136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        BYPASS_EVENT_TYPE_MALFORMED_407,
614f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    },
615f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    { "HTTP/1.1 407 Proxy Authentication Required\n"
616f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Proxy-Authenticate: Basic\n"
617f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "Via: 1.1 Chrome-Compression-Proxy\n",
6186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      BYPASS_EVENT_TYPE_MAX,
619f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    }
620f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  };
621f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
622f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    std::string headers(tests[i].headers);
623f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    HeadersToRaw(&headers);
624f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    scoped_refptr<net::HttpResponseHeaders> parsed(
625f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        new net::HttpResponseHeaders(headers));
626f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    DataReductionProxyInfo chrome_proxy_info;
6271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_EQ(
6281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        tests[i].expected_result,
6291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        GetDataReductionProxyBypassType(parsed.get(), &chrome_proxy_info));
630f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
631f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
6326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
6336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(DataReductionProxyHeadersTest,
6346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)       GetDataReductionProxyActionFingerprintChromeProxy) {
6356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  const struct {
6366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)     std::string label;
6376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)     const char* headers;
6386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)     bool expected_fingerprint_exist;
6396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)     std::string expected_fingerprint;
6406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  } tests[] = {
6416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    { "fingerprint doesn't exist",
6426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "HTTP/1.1 200 OK\n"
6436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Chrome-Proxy: bypass=0\n",
6446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      false,
6456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "",
6466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    },
6476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    { "fingerprint occurs once",
6486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "HTTP/1.1 200 OK\n"
6496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Chrome-Proxy: bypass=1, fcp=fp\n",
6506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      true,
6516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "fp",
6526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    },
6536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    { "fingerprint occurs twice",
6546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "HTTP/1.1 200 OK\n"
6556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Chrome-Proxy: bypass=2, fcp=fp1, fcp=fp2\n",
6566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      true,
6576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "fp1",
6586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    },
6596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  };
6606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
6616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    std::string headers(tests[i].headers);
6626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    HeadersToRaw(&headers);
6636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    scoped_refptr<net::HttpResponseHeaders> parsed(
6646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        new net::HttpResponseHeaders(headers));
6656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
6666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    std::string fingerprint;
6676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    bool fingerprint_exist = GetDataReductionProxyActionFingerprintChromeProxy(
6681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        parsed.get(), &fingerprint);
6696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    EXPECT_EQ(tests[i].expected_fingerprint_exist, fingerprint_exist)
6706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        << tests[i].label;
6716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
6726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if (fingerprint_exist)
6736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      EXPECT_EQ(tests[i].expected_fingerprint, fingerprint) << tests[i].label;
6746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
6756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
6766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
6776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(DataReductionProxyHeadersTest,
6786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)       GetDataReductionProxyActionFingerprintVia) {
6796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  const struct {
6806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)     std::string label;
6816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)     const char* headers;
6826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)     bool expected_fingerprint_exist;
6836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)     std::string expected_fingerprint;
6846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  } tests[] = {
6856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    { "fingerprint doesn't exist",
6866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "HTTP/1.1 200 OK\n"
6876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Chrome-Proxy: bypass=0\n",
6886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      false,
6896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "",
6906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    },
6916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    { "fingerprint occurs once",
6926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "HTTP/1.1 200 OK\n"
6936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Chrome-Proxy: bypass=1, fvia=fvia\n",
6946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      true,
6956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "fvia",
6966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    },
6976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    { "fingerprint occurs twice",
6986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "HTTP/1.1 200 OK\n"
6996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Chrome-Proxy: bypass=2, fvia=fvia1, fvia=fvia2\n",
7006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      true,
7016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "fvia1",
7026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    },
7036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  };
7046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
7056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    std::string headers(tests[i].headers);
7066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    HeadersToRaw(&headers);
7076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    scoped_refptr<net::HttpResponseHeaders> parsed(
7086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        new net::HttpResponseHeaders(headers));
7096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
7106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    std::string fingerprint;
7116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    bool fingerprint_exist =
7121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        GetDataReductionProxyActionFingerprintVia(parsed.get(), &fingerprint);
7136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    EXPECT_EQ(tests[i].expected_fingerprint_exist, fingerprint_exist)
7146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        << tests[i].label;
7156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
7166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if (fingerprint_exist)
7176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      EXPECT_EQ(tests[i].expected_fingerprint, fingerprint) << tests[i].label;
7186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
7196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
7206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
7216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(DataReductionProxyHeadersTest,
7226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)       GetDataReductionProxyActionFingerprintOtherHeaders) {
7236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  const struct {
7246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)     std::string label;
7256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)     const char* headers;
7266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)     bool expected_fingerprint_exist;
7276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)     std::string expected_fingerprint;
7286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  } tests[] = {
7296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    { "fingerprint doesn't exist",
7306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "HTTP/1.1 200 OK\n"
7316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Chrome-Proxy: bypass=0\n",
7326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      false,
7336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "",
7346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    },
7356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    { "fingerprint occurs once",
7366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "HTTP/1.1 200 OK\n"
7376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Chrome-Proxy: bypass=1, foh=foh\n",
7386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      true,
7396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "foh",
7406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    },
7416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    { "fingerprint occurs twice",
7426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "HTTP/1.1 200 OK\n"
7436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Chrome-Proxy: bypass=2, foh=foh1, foh=foh2\n",
7446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      true,
7456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "foh1",
7466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    },
7476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  };
7486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
7496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    std::string headers(tests[i].headers);
7506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    HeadersToRaw(&headers);
7516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    scoped_refptr<net::HttpResponseHeaders> parsed(
7526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        new net::HttpResponseHeaders(headers));
7536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
7546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    std::string fingerprint;
7551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    bool fingerprint_exist = GetDataReductionProxyActionFingerprintOtherHeaders(
7561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        parsed.get(), &fingerprint);
7576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    EXPECT_EQ(tests[i].expected_fingerprint_exist, fingerprint_exist)
7586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        << tests[i].label;
7596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
7606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if (fingerprint_exist)
7616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      EXPECT_EQ(tests[i].expected_fingerprint, fingerprint) << tests[i].label;
7626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
7636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
7646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
7656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(DataReductionProxyHeadersTest,
7666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)       GetDataReductionProxyActionFingerprintContentLength) {
7676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  const struct {
7686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)     std::string label;
7696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)     const char* headers;
7706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)     bool expected_fingerprint_exist;
7716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)     std::string expected_fingerprint;
7726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  } tests[] = {
7736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    { "fingerprint doesn't exist",
7746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "HTTP/1.1 200 OK\n"
7756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Chrome-Proxy: bypass=0\n",
7766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      false,
7776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "",
7786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    },
7796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    { "fingerprint occurs once",
7806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "HTTP/1.1 200 OK\n"
7816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Chrome-Proxy: bypass=1, fcl=fcl\n",
7826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      true,
7836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "fcl",
7846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    },
7856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    { "fingerprint occurs twice",
7866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "HTTP/1.1 200 OK\n"
7876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Chrome-Proxy: bypass=2, fcl=fcl1, fcl=fcl2\n",
7886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      true,
7896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "fcl1",
7906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    },
7916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  };
7926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
7936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    std::string headers(tests[i].headers);
7946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    HeadersToRaw(&headers);
7956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    scoped_refptr<net::HttpResponseHeaders> parsed(
7966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        new net::HttpResponseHeaders(headers));
7976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
7986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    std::string fingerprint;
7996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    bool fingerprint_exist =
8001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        GetDataReductionProxyActionFingerprintContentLength(parsed.get(),
8011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                            &fingerprint);
8026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    EXPECT_EQ(tests[i].expected_fingerprint_exist, fingerprint_exist)
8036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        << tests[i].label;
8046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
8056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if (fingerprint_exist)
8066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      EXPECT_EQ(tests[i].expected_fingerprint, fingerprint) << tests[i].label;
8076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
8086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
8096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
8106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(DataReductionProxyHeadersTest,
8116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)       GetDataReductionProxyHeaderWithFingerprintRemoved) {
8126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  const struct {
8136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    std::string label;
8146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    const char* headers;
8156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    std::string expected_output_values_string;
8166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  } test[] = {
8176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    {
8186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Checks the case that there is no Chrome-Proxy header's fingerprint.",
8196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "HTTP/1.1 200 OK\n"
8206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Chrome-Proxy: 1,2,3,5\n",
8216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "1,2,3,5,",
8226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    },
8236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    {
8246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Checks the case that there is Chrome-Proxy header's fingerprint.",
8256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "HTTP/1.1 200 OK\n"
8266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Chrome-Proxy: 1,2,3,fcp=4,5\n",
8276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "1,2,3,5,",
8286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    },
8296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    {
8306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Checks the case that there is Chrome-Proxy header's fingerprint, and it"
8316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "occurs at the end.",
8326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "HTTP/1.1 200 OK\n"
8336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Chrome-Proxy: 1,2,3,fcp=4,",
8346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "1,2,3,",
8356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    },
8366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    {
8376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Checks the case that there is Chrome-Proxy header's fingerprint, and it"
8386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "occurs at the beginning.",
8396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "HTTP/1.1 200 OK\n"
8406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Chrome-Proxy: fcp=1,2,3,",
8416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "2,3,",
8426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    },
8436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    {
8446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Checks the case that value is longer than prefix.",
8456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "HTTP/1.1 200 OK\n"
8466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Chrome-Proxy: fcp=1,fcp!=1,fcp!=2,fcpfcp=3",
8476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "fcp!=1,fcp!=2,fcpfcp=3,",
8486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    },
8496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    {
8506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Checks the case that value is shorter than prefix but similar.",
8516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "HTTP/1.1 200 OK\n"
8526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "Chrome-Proxy: fcp=1,fcp,fcp=",
8536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      "fcp,fcp=,",
8546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    },
8556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  };
8566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
8576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test); ++i) {
8586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    std::string headers(test[i].headers);
8596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    HeadersToRaw(&headers);
8606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    scoped_refptr<net::HttpResponseHeaders> parsed(
8616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        new net::HttpResponseHeaders(headers));
8626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
8636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    std::vector<std::string> output_values;
8641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    GetDataReductionProxyHeaderWithFingerprintRemoved(parsed.get(),
8651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                      &output_values);
8666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
8676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    std::string output_values_string;
8686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    for (size_t j = 0; j < output_values.size(); ++j)
8696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      output_values_string += output_values[j] + ",";
8706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
8716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    EXPECT_EQ(test[i].expected_output_values_string, output_values_string)
8726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        << test[i].label;
8736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
8746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
8756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
876f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}  // namespace data_reduction_proxy
877