// Copyright 2017 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/test/test_mojo_proxy_resolver_factory.h"

#include "base/bind.h"
#include "base/bind_helpers.h"
#include "base/logging.h"
#include "mojo/public/cpp/bindings/strong_binding.h"

namespace content {

TestMojoProxyResolverFactory::TestMojoProxyResolverFactory()
    : service_keepalive_(static_cast<service_manager::ServiceBinding*>(nullptr),
                         base::nullopt),
      binding_(this) {
  proxy_resolver_factory_impl_.BindRequest(mojo::MakeRequest(&factory_),
                                           &service_keepalive_);
}

TestMojoProxyResolverFactory::~TestMojoProxyResolverFactory() = default;

void TestMojoProxyResolverFactory::CreateResolver(
    const std::string& pac_script,
    proxy_resolver::mojom::ProxyResolverRequest req,
    proxy_resolver::mojom::ProxyResolverFactoryRequestClientPtr client) {
  resolver_created_ = true;
  factory_->CreateResolver(pac_script, std::move(req), std::move(client));
}

proxy_resolver::mojom::ProxyResolverFactoryPtr
TestMojoProxyResolverFactory::CreateFactoryInterface() {
  DCHECK(!binding_.is_bound());
  proxy_resolver::mojom::ProxyResolverFactoryPtr mojo_factory;
  binding_.Bind(mojo::MakeRequest(&mojo_factory));
  return mojo_factory;
}

}  // namespace content
