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

import("//build/module_args/mojo.gni")
import("$mojo_sdk_root/mojo/public/mojo_application.gni")
import("$mojo_sdk_root/mojo/public/mojo_sdk.gni")

mojo_sdk_source_set("mojio") {
  # TODO(vtl): This is needed because mojo_sdk.gni doesn't understand relative
  # dependencies (so without this we can't depend on our interfaces!).
  restrict_external_deps = false

  public_configs = [ "../../public/build/config:mojo_services" ]

  sources = [
    "lib/directory_wrapper.cc",
    "lib/directory_wrapper.h",
    "lib/errno_impl.h",
    "lib/fd_impl.h",
    "lib/fd_table.cc",
    "lib/fd_table.h",
    "lib/file_fd_impl.cc",
    "lib/file_fd_impl.h",
    "lib/mojio_fcntl.cc",
    "lib/mojio_sys_stat.cc",
    "lib/mojio_unistd.cc",
    "lib/real_errno_impl.cc",
    "lib/real_errno_impl.h",
    "lib/singletons.cc",
    "lib/singletons.h",
    "lib/util.cc",
    "lib/util.h",
    "mojio_config.h",
    "mojio_fcntl.h",
    "mojio_stdio.h",
    "mojio_sys_stat.h",
    "mojio_sys_types.h",
    "mojio_time.h",
    "mojio_unistd.h",
  ]

  deps = [
    "../interfaces",
    "../interfaces:interfaces_sync",
  ]

  mojo_sdk_deps = [
    "mojo/public/cpp/bindings",
    "mojo/public/cpp/environment",
    "mojo/public/cpp/system",
  ]
}

# NOTE(vtl): Some of the tests actually depend on a reasonable implementation of
# the files service (e.g., //services/files).
mojo_native_application("apptests") {
  output_name = "mojio_apptests"

  testonly = true

  sources = [
    "tests/directory_wrapper_unittest.cc",
    "tests/errno_impl_unittest.cc",
    "tests/fd_table_unittest.cc",
    "tests/file_fd_impl_unittest.cc",
    "tests/mock_errno_impl.cc",
    "tests/mock_errno_impl.h",
    "tests/mojio_impl_test_base.cc",
    "tests/mojio_impl_test_base.h",
    "tests/mojio_sys_stat_unittest.cc",
    "tests/mojio_test_base.cc",
    "tests/mojio_test_base.h",
    "tests/mojio_unistd_unittest.cc",
    "tests/real_errno_impl_unittest.cc",
    "tests/test_utils.cc",
    "tests/test_utils.h",
    "tests/test_utils_unittest.cc",
    "tests/util_unittest.cc",
  ]

  deps = [
    ":mojio",
    "$mojo_sdk_root/mojo/public/cpp/application:standalone",
    "$mojo_sdk_root/mojo/public/cpp/application:test_support_standalone",
    "$mojo_sdk_root/mojo/public/cpp/bindings",
    "$mojo_sdk_root/mojo/public/cpp/environment",
    "$mojo_sdk_root/mojo/public/cpp/system",
    "../interfaces",
    "//testing/gtest",
  ]
}
