# 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("//mojo/public/mojo_application.gni")

mojo_native_application("network") {
  output_name = "network_service"
  sources = [ "main.cc" ]
  deps = [
    ":lib",
    "//base",
    "//mojo/application",
    "//mojo/public/c/system:for_shared_library",
    "//mojo/public/cpp/bindings:bindings",
    "//mojo/services/public/cpp/network",
    "//mojo/services/public/interfaces/network",
  ]
}

source_set("lib") {
  sources = [
    "cookie_store_impl.cc",
    "cookie_store_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_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",
    "url_loader_impl.cc",
    "url_loader_impl.h",
    "web_socket_impl.cc",
    "web_socket_impl.h",
  ]

  deps = [
    "//base",
    "//mojo/application",
    "//mojo/common",
    "//mojo/environment:chromium",
    "//mojo/services/public/cpp/network",
    "//mojo/services/public/interfaces/network",
    "//net",
    "//url",
  ]
}

# TODO(yzshen): Remove this test once the apptests is run on bots.
test("unittests") {
  output_name = "network_service_unittests"

  sources = [
    "udp_socket_unittest.cc",
  ]

  deps = [
    ":network",
    "//base",
    "//base/test:run_all_unittests",
    "//base/test:test_support",
    "//mojo/application_manager",
    "//mojo/edk/system",
    "//mojo/environment:chromium",
    "//mojo/services/public/cpp/network",
    "//mojo/services/public/interfaces/network",
    "//mojo/shell:test_support",
    "//testing/gtest",
  ]
}

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

  sources = [
    "udp_socket_apptest.cc",
  ]

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