// Copyright (c) 2011 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 "content/browser/browser_url_handler_impl.h"
#include "content/public/test/test_browser_context.h"
#include "content/public/test/test_browser_thread_bundle.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h"

namespace content {

class BrowserURLHandlerImplTest : public testing::Test {
};

// Test URL rewriter that rewrites all "foo://" URLs to "bar://bar".
static bool FooRewriter(GURL* url, BrowserContext* browser_context) {
  if (url->scheme() == "foo") {
    *url = GURL("bar://bar");
    return true;
  }
  return false;
}

// Test URL rewriter that rewrites all "bar://" URLs to "foo://foo".
static bool BarRewriter(GURL* url, BrowserContext* browser_context) {
  if (url->scheme() == "bar") {
    *url = GURL("foo://foo");
    return true;
  }
  return false;
}

TEST_F(BrowserURLHandlerImplTest, BasicRewriteAndReverse) {
  TestBrowserThreadBundle thread_bundle;
  TestBrowserContext browser_context;
  BrowserURLHandlerImpl handler;

  handler.AddHandlerPair(FooRewriter, BarRewriter);

  GURL url("foo://bar");
  GURL original_url(url);
  bool reverse_on_redirect = false;
  handler.RewriteURLIfNecessary(&url, &browser_context, &reverse_on_redirect);
  ASSERT_TRUE(reverse_on_redirect);
  ASSERT_EQ("bar://bar", url.spec());

  // Check that reversing the URL works.
  GURL saved_url(url);
  bool reversed = handler.ReverseURLRewrite(&url,
                                            original_url,
                                            &browser_context);
  ASSERT_TRUE(reversed);
  ASSERT_EQ("foo://foo", url.spec());

  // Check that reversing the URL only works with a matching |original_url|.
  url = saved_url;
  original_url = GURL("bam://bam");  // Won't be matched by FooRewriter.
  reversed = handler.ReverseURLRewrite(&url, original_url, &browser_context);
  ASSERT_FALSE(reversed);
  ASSERT_EQ(saved_url, url);
}

TEST_F(BrowserURLHandlerImplTest, NullHandlerReverse) {
  TestBrowserThreadBundle thread_bundle;
  TestBrowserContext browser_context;
  BrowserURLHandlerImpl handler;

  GURL url("bar://foo");
  GURL original_url(url);

  handler.AddHandlerPair(BrowserURLHandlerImpl::null_handler(), FooRewriter);
  bool reversed = handler.ReverseURLRewrite(&url,
                                            original_url,
                                            &browser_context);
  ASSERT_FALSE(reversed);
  ASSERT_EQ(original_url, url);

  handler.AddHandlerPair(BrowserURLHandlerImpl::null_handler(), BarRewriter);
  reversed = handler.ReverseURLRewrite(&url, original_url, &browser_context);
  ASSERT_TRUE(reversed);
  ASSERT_EQ("foo://foo", url.spec());
}

// Verify that the reverse handler for view-source does not duplicate query
// parameters.
TEST_F(BrowserURLHandlerImplTest, ViewSourceReverse) {
  TestBrowserThreadBundle thread_bundle;
  TestBrowserContext browser_context;
  BrowserURLHandlerImpl handler;

  GURL url("http://foo/?a=1");
  GURL original_url("view-source:http://some_url");
  bool reversed = handler.ReverseURLRewrite(&url,
                                            original_url,
                                            &browser_context);
  ASSERT_TRUE(reversed);
  ASSERT_EQ("view-source:http://foo/?a=1", url.spec());
}

}  // namespace content
