// Copyright (c) 2012 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 "net/base/net_errors.h"
#include "net/proxy/proxy_config.h"
#include "net/proxy/proxy_info.h"
#include "net/proxy/proxy_list.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace net {
namespace {

TEST(ProxyInfoTest, ProxyInfoIsDirectOnly) {
  // Test the is_direct_only() predicate.
  ProxyInfo info;

  // An empty ProxyInfo is not considered direct.
  EXPECT_FALSE(info.is_direct_only());

  info.UseDirect();
  EXPECT_TRUE(info.is_direct_only());

  info.UsePacString("DIRECT");
  EXPECT_TRUE(info.is_direct_only());

  info.UsePacString("PROXY myproxy:80");
  EXPECT_FALSE(info.is_direct_only());

  info.UsePacString("DIRECT; PROXY myproxy:80");
  EXPECT_TRUE(info.is_direct());
  EXPECT_FALSE(info.is_direct_only());

  info.UsePacString("PROXY myproxy:80; DIRECT");
  EXPECT_FALSE(info.is_direct());
  EXPECT_FALSE(info.is_direct_only());
  EXPECT_EQ(2u, info.proxy_list().size());
  EXPECT_EQ("PROXY myproxy:80;DIRECT", info.proxy_list().ToPacString());
  // After falling back to direct, we shouldn't consider it DIRECT only.
  EXPECT_TRUE(info.Fallback(ERR_PROXY_CONNECTION_FAILED, BoundNetLog()));
  EXPECT_TRUE(info.is_direct());
  EXPECT_FALSE(info.is_direct_only());
}

}  // namespace

TEST(ProxyInfoTest, UseVsOverrideProxyList) {
  ProxyInfo info;
  info.config_id_ = 99;
  ProxyList proxy_list;
  proxy_list.Set("http://foo.com");
  info.OverrideProxyList(proxy_list);
  EXPECT_EQ(99, info.config_id_);
  EXPECT_EQ("PROXY foo.com:80", info.proxy_list().ToPacString());
  proxy_list.Set("http://bar.com");
  info.UseProxyList(proxy_list);
  EXPECT_EQ(0, info.config_id_);
  EXPECT_EQ("PROXY bar.com:80", info.proxy_list().ToPacString());
}

}  // namespace net
