1// Copyright 2014 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 "chrome/browser/net/safe_search_util.h"
6
7#include "base/message_loop/message_loop.h"
8#include "base/strings/string_piece.h"
9#include "net/http/http_request_headers.h"
10#include "net/url_request/url_request_test_util.h"
11#include "testing/gtest/include/gtest/gtest.h"
12#include "url/gurl.h"
13
14class SafeSearchUtilTest : public ::testing::Test {
15 protected:
16  SafeSearchUtilTest() {}
17  virtual ~SafeSearchUtilTest() {}
18
19  scoped_ptr<net::URLRequest> CreateYoutubeRequest() {
20    return context_.CreateRequest(GURL("http://www.youtube.com"),
21                                  net::DEFAULT_PRIORITY,
22                                  NULL,
23                                  NULL);
24  }
25
26  scoped_ptr<net::URLRequest> CreateNonYoutubeRequest() {
27    return context_.CreateRequest(GURL("http://www.notyoutube.com"),
28                                  net::DEFAULT_PRIORITY,
29                                  NULL,
30                                  NULL);
31  }
32
33  static void SetCookie(net::HttpRequestHeaders* headers,
34                        const std::string& value) {
35    headers->SetHeader(base::StringPiece(net::HttpRequestHeaders::kCookie),
36                       base::StringPiece(value));
37  }
38
39  static void CheckHeaders(net::URLRequest* request,
40                           const std::string& header_string_original,
41                           const std::string& header_string_expected) {
42    net::HttpRequestHeaders headers;
43    SetCookie(&headers, header_string_original);
44    safe_search_util::ForceYouTubeSafetyMode(request, &headers);
45
46    net::HttpRequestHeaders headers_expected;
47    SetCookie(&headers_expected, header_string_expected);
48    EXPECT_EQ(headers_expected.ToString(), headers.ToString());
49  }
50
51  base::MessageLoop message_loop_;
52  net::TestURLRequestContext context_;
53};
54
55// ForceGoogleSafeSearch is already tested quite extensively in
56// ChromeNetworkDelegateSafeSearchTest (in chrome_network_delegate_unittest.cc),
57// so we won't test it again here.
58
59TEST_F(SafeSearchUtilTest, CreateYoutubePrefCookie) {
60  scoped_ptr<net::URLRequest> request = CreateYoutubeRequest();
61  CheckHeaders(request.get(),
62               "OtherCookie=value",
63               "OtherCookie=value; PREF=f2=8000000");
64}
65
66TEST_F(SafeSearchUtilTest, ModifyYoutubePrefCookie) {
67  scoped_ptr<net::URLRequest> request = CreateYoutubeRequest();
68  CheckHeaders(request.get(),
69               "PREF=f1=123; OtherCookie=value",
70               "PREF=f1=123&f2=8000000; OtherCookie=value");
71  CheckHeaders(request.get(),
72               "PREF=",
73               "PREF=f2=8000000");
74  CheckHeaders(request.get(),
75               "PREF=\"\"",
76               "PREF=\"f2=8000000\"");
77  CheckHeaders(request.get(),
78               "PREF=f1=123&f2=4321&foo=bar",
79               "PREF=f1=123&f2=8004321&foo=bar");
80  CheckHeaders(request.get(),
81               "PREF=\"f1=1&f2=4321\"; OtherCookie=value",
82               "PREF=\"f1=1&f2=8004321\"; OtherCookie=value");
83}
84
85TEST_F(SafeSearchUtilTest, DoesntTouchNonYoutubeURL) {
86  scoped_ptr<net::URLRequest> request = CreateNonYoutubeRequest();
87  CheckHeaders(request.get(),
88               "PREF=f2=0",
89               "PREF=f2=0");
90}
91