// Copyright 2015 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/proxy/mojo_proxy_resolver_v8_tracing_bindings.h"

#include <string>
#include <utility>
#include <vector>

#include "base/macros.h"
#include "base/strings/utf_string_conversions.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace net {

class MojoProxyResolverV8TracingBindingsTest : public testing::Test {
 public:
  MojoProxyResolverV8TracingBindingsTest() = default;

  void SetUp() override {
    bindings_.reset(new MojoProxyResolverV8TracingBindings<
                    MojoProxyResolverV8TracingBindingsTest>(this));
  }

  void Alert(const std::string& message) { alerts_.push_back(message); }

  void OnError(int32_t line_number, const std::string& message) {
    errors_.push_back(std::make_pair(line_number, message));
  }

  void ResolveDns(std::unique_ptr<HostResolver::RequestInfo> request_info,
                  interfaces::HostResolverRequestClientPtr client) {}

 protected:
  std::unique_ptr<MojoProxyResolverV8TracingBindings<
      MojoProxyResolverV8TracingBindingsTest>>
      bindings_;

  std::vector<std::string> alerts_;
  std::vector<std::pair<int, std::string>> errors_;

 private:
  DISALLOW_COPY_AND_ASSIGN(MojoProxyResolverV8TracingBindingsTest);
};

TEST_F(MojoProxyResolverV8TracingBindingsTest, Basic) {
  bindings_->Alert(base::ASCIIToUTF16("alert"));
  bindings_->OnError(-1, base::ASCIIToUTF16("error"));

  EXPECT_TRUE(bindings_->GetHostResolver());
  EXPECT_FALSE(bindings_->GetNetLogWithSource().net_log());

  ASSERT_EQ(1u, alerts_.size());
  EXPECT_EQ("alert", alerts_[0]);
  ASSERT_EQ(1u, errors_.size());
  EXPECT_EQ(-1, errors_[0].first);
  EXPECT_EQ("error", errors_[0].second);
}

}  // namespace net
