# 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")

# files_impl is a helper library for *implementing* various interfaces in
# |mojo.files|.
mojo_sdk_source_set("files_impl") {
  # TODO(vtl): This is needed because mojo_sdk.gni doesn't understand relative
  # dependencies (so without this we can't depend on our interfaces!). Should
  # this target even be a mojo_sdk_source_set?
  restrict_external_deps = false

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

  sources = [
    "input_stream_file.h",
    "lib/input_stream_file.cc",
    "lib/output_stream_file.cc",
    "output_stream_file.h",
  ]

  deps = [
    "../interfaces",
  ]

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

mojo_native_application("files_impl_apptests") {
  output_name = "files_impl_apptests"

  testonly = true

  sources = [
    "tests/input_stream_file_unittest.cc",
    "tests/output_stream_file_unittest.cc",
  ]

  deps = [
    ":files_impl",
    "../interfaces",
    "$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",
    "$mojo_sdk_root/mojo/public/cpp/utility",
    "//testing/gtest",
  ]
}
