# Copyright 2014 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.

import("//third_party/mojo/src/mojo/public/mojo_application.gni")

if (is_android) {
  mojo_android_application("network") {
    output_name = "network_service"

    sources = [
      "android_hooks.cc",
    ]

    deps = [
      ":sources",
      "//base",
      "//net",
    ]

    java_deps = [
      "//net/android:net_java",
    ]
  }
} else {
  mojo_native_application("network") {
    output_name = "network_service"

    deps = [
      ":sources",
    ]
  }
}

source_set("lib") {
  sources = [
    "cookie_store_impl.cc",
    "cookie_store_impl.h",
    "host_resolver_impl.cc",
    "host_resolver_impl.h",
    "http_connection_impl.cc",
    "http_connection_impl.h",
    "http_server_impl.cc",
    "http_server_impl.h",
    "net_adapters.cc",
    "net_adapters.h",
    "net_address_type_converters.cc",
    "net_address_type_converters.h",
    "network_context.cc",
    "network_context.h",
    "network_service_delegate.cc",
    "network_service_delegate.h",
    "network_service_impl.cc",
    "network_service_impl.h",
    "tcp_bound_socket_impl.cc",
    "tcp_bound_socket_impl.h",
    "tcp_connected_socket_impl.cc",
    "tcp_connected_socket_impl.h",
    "tcp_server_socket_impl.cc",
    "tcp_server_socket_impl.h",
    "udp_socket_impl.cc",
    "udp_socket_impl.h",
    "udp_socket_wrapper.cc",
    "udp_socket_wrapper.h",
    "url_loader_impl.cc",
    "url_loader_impl.h",
    "web_socket_impl.cc",
    "web_socket_impl.h",
    "web_socket_read_queue.cc",
    "web_socket_read_queue.h",
    "web_socket_write_queue.cc",
    "web_socket_write_queue.h",
  ]

  deps = [
    "//base",
    "//mojo/common",
    "//mojo/common:tracing_impl",
    "//mojo/converters/base",
    "//mojo/converters/url",
    "//mojo/environment:chromium",
    "//mojo/message_pump",
    "//mojo/services/network/interfaces",
    "//net",
    "//net:http_server",
    "//third_party/mojo/src/mojo/public/cpp/application",
    "//url",
  ]
}

source_set("sources") {
  visibility = [ ":*" ]

  sources = [
    "main.cc",
  ]

  deps = [
    ":lib",
    "//base",
    "//mojo/application",
    "//mojo/services/network/interfaces",
    "//third_party/mojo/src/mojo/public/c/system",
    "//third_party/mojo/src/mojo/public/cpp/application",
    "//third_party/mojo/src/mojo/public/cpp/bindings",
  ]
}

mojo_native_application("apptests") {
  output_name = "network_service_apptests"
  testonly = true

  sources = [
    "host_resolver_apptest.cc",
    "http_server_apptest.cc",
    "udp_socket_apptest.cc",
    "url_loader_impl_apptest.cc",
    "url_loader_interceptor_apptest.cc",
  ]

  deps = [
    ":lib",
    "//base",
    "//mojo/application",
    "//mojo/application:test_support",
    "//mojo/data_pipe_utils",
    "//mojo/message_pump",
    "//mojo/services/network/interfaces",
    "//net",
    "//net:test_support",
    "//testing/gtest",
    "//third_party/mojo/src/mojo/public/cpp/bindings:callback",
  ]
}
