// Copyright (c) 2013 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 "ppapi/tests/test_network_proxy.h"

#include "ppapi/cpp/instance.h"
#include "ppapi/cpp/network_proxy.h"
#include "ppapi/cpp/var.h"
#include "ppapi/tests/testing_instance.h"

REGISTER_TEST_CASE(NetworkProxy);

TestNetworkProxy::TestNetworkProxy(TestingInstance* instance)
    : TestCase(instance) {
}

void TestNetworkProxy::RunTests(const std::string& filter) {
  RUN_CALLBACK_TEST(TestNetworkProxy, GetProxyForURL, filter);
}

std::string TestNetworkProxy::TestGetProxyForURL() {
  TestCompletionCallbackWithOutput<pp::Var> callback(instance_->pp_instance(),
                                                     callback_type());
  callback.WaitForResult(
      pp::NetworkProxy::GetProxyForURL(instance_,
                                       pp::Var("http://127.0.0.1/foobar/"),
                                       callback.GetCallback()));
  CHECK_CALLBACK_BEHAVIOR(callback);
  ASSERT_EQ(PP_OK, callback.result());
  pp::Var output = callback.output();
  ASSERT_TRUE(output.is_string());
  // Assume no one configures a proxy for localhost.
  ASSERT_EQ("DIRECT", callback.output().AsString());

  callback.WaitForResult(
      pp::NetworkProxy::GetProxyForURL(instance_,
                                       pp::Var("http://www.google.com"),
                                       callback.GetCallback()));
  CHECK_CALLBACK_BEHAVIOR(callback);
  ASSERT_EQ(PP_OK, callback.result());
  output = callback.output();
  // Don't know what the proxy might be, but it should be a valid result.
  ASSERT_TRUE(output.is_string());

  callback.WaitForResult(
      pp::NetworkProxy::GetProxyForURL(instance_,
                                       pp::Var("file:///tmp"),
                                       callback.GetCallback()));
  CHECK_CALLBACK_BEHAVIOR(callback);
  ASSERT_EQ(PP_OK, callback.result());
  output = callback.output();
  ASSERT_TRUE(output.is_string());
  // Should get "DIRECT" for file:// URLs.
  ASSERT_EQ("DIRECT", output.AsString());

  callback.WaitForResult(
      pp::NetworkProxy::GetProxyForURL(instance_,
                                       pp::Var("this isn't a url"),
                                       callback.GetCallback()));
  CHECK_CALLBACK_BEHAVIOR(callback);
  ASSERT_EQ(PP_ERROR_BADARGUMENT, callback.result());
  ASSERT_TRUE(callback.output().is_undefined());

  callback.WaitForResult(
      pp::NetworkProxy::GetProxyForURL(instance_,
                                       pp::Var(42), // non-string Var
                                       callback.GetCallback()));
  CHECK_CALLBACK_BEHAVIOR(callback);
  ASSERT_EQ(PP_ERROR_BADARGUMENT, callback.result());
  ASSERT_TRUE(callback.output().is_undefined());

  PASS();
}
