# 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/environment:chromium",
    "//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:for_shared_library",
    "//third_party/mojo/src/mojo/public/cpp/application",
    "//third_party/mojo/src/mojo/public/cpp/bindings: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/services/network/interfaces",
    "//net",
    "//net:test_support",
    "//testing/gtest",
    "//third_party/mojo/src/mojo/public/cpp/bindings:callback",
  ]
}
