// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chrome/browser/net/safe_search_util.h"

#include "base/message_loop/message_loop.h"
#include "base/strings/string_piece.h"
#include "net/http/http_request_headers.h"
#include "net/url_request/url_request_test_util.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h"

class SafeSearchUtilTest : public ::testing::Test {
 protected:
  SafeSearchUtilTest() {}
  ~SafeSearchUtilTest() override {}

  scoped_ptr<net::URLRequest> CreateYoutubeRequest() {
    return context_.CreateRequest(GURL("http://www.youtube.com"),
                                  net::DEFAULT_PRIORITY,
                                  NULL,
                                  NULL);
  }

  scoped_ptr<net::URLRequest> CreateNonYoutubeRequest() {
    return context_.CreateRequest(GURL("http://www.notyoutube.com"),
                                  net::DEFAULT_PRIORITY,
                                  NULL,
                                  NULL);
  }

  static void SetCookie(net::HttpRequestHeaders* headers,
                        const std::string& value) {
    headers->SetHeader(base::StringPiece(net::HttpRequestHeaders::kCookie),
                       base::StringPiece(value));
  }

  static void CheckHeaders(net::URLRequest* request,
                           const std::string& header_string_original,
                           const std::string& header_string_expected) {
    net::HttpRequestHeaders headers;
    SetCookie(&headers, header_string_original);
    safe_search_util::ForceYouTubeSafetyMode(request, &headers);

    net::HttpRequestHeaders headers_expected;
    SetCookie(&headers_expected, header_string_expected);
    EXPECT_EQ(headers_expected.ToString(), headers.ToString());
  }

  base::MessageLoop message_loop_;
  net::TestURLRequestContext context_;
};

// ForceGoogleSafeSearch is already tested quite extensively in
// ChromeNetworkDelegateSafeSearchTest (in chrome_network_delegate_unittest.cc),
// so we won't test it again here.

TEST_F(SafeSearchUtilTest, CreateYoutubePrefCookie) {
  scoped_ptr<net::URLRequest> request = CreateYoutubeRequest();
  CheckHeaders(request.get(),
               "OtherCookie=value",
               "OtherCookie=value; PREF=f2=8000000");
}

TEST_F(SafeSearchUtilTest, ModifyYoutubePrefCookie) {
  scoped_ptr<net::URLRequest> request = CreateYoutubeRequest();
  CheckHeaders(request.get(),
               "PREF=f1=123; OtherCookie=value",
               "PREF=f1=123&f2=8000000; OtherCookie=value");
  CheckHeaders(request.get(),
               "PREF=",
               "PREF=f2=8000000");
  CheckHeaders(request.get(),
               "PREF=\"\"",
               "PREF=\"f2=8000000\"");
  CheckHeaders(request.get(),
               "PREF=f1=123&f2=4321&foo=bar",
               "PREF=f1=123&f2=8004321&foo=bar");
  CheckHeaders(request.get(),
               "PREF=\"f1=1&f2=4321\"; OtherCookie=value",
               "PREF=\"f1=1&f2=8004321\"; OtherCookie=value");
}

TEST_F(SafeSearchUtilTest, DoesntTouchNonYoutubeURL) {
  scoped_ptr<net::URLRequest> request = CreateNonYoutubeRequest();
  CheckHeaders(request.get(),
               "PREF=f2=0",
               "PREF=f2=0");
}
