# 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("//build/config/ui.gni")
import("//testing/test.gni")
import("//services/catalog/public/tools/catalog.gni")
import("//services/service_manager/public/cpp/service.gni")
import("//services/service_manager/public/service_manifest.gni")
import("//services/service_manager/public/tools/test/service_test.gni")

static_library("lib") {
  sources = [
    "accelerator.cc",
    "accelerator.h",
    "access_policy.h",
    "access_policy_delegate.h",
    "accessibility_manager.cc",
    "accessibility_manager.h",
    "default_access_policy.cc",
    "default_access_policy.h",
    "display.cc",
    "display.h",
    "display_binding.cc",
    "display_binding.h",
    "display_manager.cc",
    "display_manager.h",
    "drag_controller.cc",
    "drag_controller.h",
    "drag_cursor_updater.h",
    "drag_source.h",
    "drag_target_connection.h",
    "event_dispatcher.cc",
    "event_dispatcher.h",
    "event_dispatcher_delegate.h",
    "event_matcher.cc",
    "event_matcher.h",
    "focus_controller.cc",
    "focus_controller.h",
    "focus_controller_delegate.h",
    "focus_controller_observer.h",
    "frame_generator.cc",
    "frame_generator.h",
    "gpu_host.cc",
    "gpu_host.h",
    "gpu_host_delegate.h",
    "modal_window_controller.cc",
    "modal_window_controller.h",
    "operation.cc",
    "operation.h",
    "platform_display.cc",
    "platform_display.h",
    "platform_display_default.cc",
    "platform_display_default.h",
    "platform_display_delegate.h",
    "platform_display_factory.h",
    "platform_display_init_params.cc",
    "platform_display_init_params.h",
    "server_window.cc",
    "server_window.h",
    "server_window_compositor_frame_sink_manager.cc",
    "server_window_compositor_frame_sink_manager.h",
    "server_window_delegate.h",
    "server_window_drawn_tracker.cc",
    "server_window_drawn_tracker.h",
    "server_window_drawn_tracker_observer.h",
    "server_window_observer.h",
    "server_window_tracker.h",
    "user_activity_monitor.cc",
    "user_activity_monitor.h",
    "user_display_manager.cc",
    "user_display_manager.h",
    "user_display_manager_delegate.h",
    "user_id.h",
    "user_id_tracker.cc",
    "user_id_tracker.h",
    "user_id_tracker_observer.h",
    "window_coordinate_conversions.cc",
    "window_coordinate_conversions.h",
    "window_finder.cc",
    "window_finder.h",
    "window_manager_access_policy.cc",
    "window_manager_access_policy.h",
    "window_manager_display_root.cc",
    "window_manager_display_root.h",
    "window_manager_state.cc",
    "window_manager_state.h",
    "window_manager_window_tree_factory.cc",
    "window_manager_window_tree_factory.h",
    "window_manager_window_tree_factory_set.cc",
    "window_manager_window_tree_factory_set.h",
    "window_manager_window_tree_factory_set_observer.h",
    "window_server.cc",
    "window_server.h",
    "window_server_delegate.cc",
    "window_server_delegate.h",
    "window_tree.cc",
    "window_tree.h",
    "window_tree_binding.cc",
    "window_tree_binding.h",
    "window_tree_factory.cc",
    "window_tree_factory.h",
    "window_tree_host_factory.cc",
    "window_tree_host_factory.h",
  ]

  deps = [
    "//gpu/command_buffer/client",
    "//gpu/command_buffer/client:gles2_interface",
    "//gpu/ipc/client",
    "//gpu/ipc/common",
    "//services/ui/gpu",  # TODO(sad): Temporary until GPU process split.
    "//services/ui/gpu/interfaces",
  ]

  public_deps = [
    "//base",
    "//cc",
    "//cc/ipc:interfaces",
    "//cc/surfaces",
    "//cc/surfaces:surface_id",
    "//mojo/common:common_base",
    "//mojo/public/cpp/bindings",
    "//services/service_manager/public/cpp",
    "//services/service_manager/public/interfaces",
    "//services/tracing/public/cpp",
    "//services/ui/common:mus_common",
    "//services/ui/common:server_gpu",
    "//services/ui/display",
    "//services/ui/public/interfaces",
    "//ui/base",
    "//ui/display",
    "//ui/events",
    "//ui/events/devices",
    "//ui/events/platform",
    "//ui/gfx",
    "//ui/gfx/geometry",
    "//ui/gfx/geometry/mojo",
    "//ui/gl",
    "//ui/platform_window",
    "//ui/platform_window:platform_impls",
    "//ui/platform_window/mojo",
  ]

  if (use_ozone) {
    public_deps += [ "//ui/ozone:ozone" ]
  }
}

static_library("test_interface") {
  sources = [
    "window_server_test_impl.cc",
    "window_server_test_impl.h",
  ]

  deps = [
    ":lib",
    "//mojo/public/cpp/bindings:bindings",
    "//services/ui/public/interfaces",
    "//ui/gfx",
  ]
}

static_library("test_support") {
  testonly = true

  sources = [
    "test_change_tracker.cc",
    "test_change_tracker.h",
    "window_server_service_test_base.cc",
    "window_server_service_test_base.h",
    "window_server_test_base.cc",
    "window_server_test_base.h",
  ]

  deps = [
    "//base",
    "//base/test:test_config",
    "//mojo/common",
    "//mojo/public/cpp/bindings:bindings",
    "//services/service_manager/public/cpp:service_test_support",
    "//services/service_manager/public/cpp:sources",
    "//services/ui/common:mus_common",
    "//services/ui/public/cpp",
    "//services/ui/public/interfaces",
    "//testing/gtest",
    "//ui/aura",
    "//ui/display:test_support",
    "//ui/gfx/geometry/mojo",
    "//ui/gl",
    "//ui/wm",
  ]
}

group("tests") {
  testonly = true
  deps = [
    ":mus_ws_unittests",
  ]
  if (!is_android) {
    deps += [ "//services/ui/public/cpp/tests:mus_public_unittests" ]
  }
}

service_test("mus_ws_unittests") {
  sources = [
    "cursor_unittest.cc",
    "display_unittest.cc",
    "drag_controller_unittest.cc",
    "event_dispatcher_unittest.cc",
    "event_matcher_unittest.cc",
    "focus_controller_unittest.cc",
    "frame_generator_unittest.cc",
    "server_window_compositor_frame_sink_manager_test_api.cc",
    "server_window_compositor_frame_sink_manager_test_api.h",
    "server_window_drawn_tracker_unittest.cc",
    "test_server_window_delegate.cc",
    "test_server_window_delegate.h",
    "test_utils.cc",
    "test_utils.h",
    "transient_windows_unittest.cc",
    "user_activity_monitor_unittest.cc",
    "user_display_manager_unittest.cc",
    "window_coordinate_conversions_unittest.cc",
    "window_finder_unittest.cc",
    "window_manager_client_unittest.cc",
    "window_manager_state_unittest.cc",
    "window_tree_client_unittest.cc",
    "window_tree_unittest.cc",
  ]

  catalog = ":mus_ws_unittests_catalog"

  deps = [
    ":lib",
    ":test_support",
    "//base",
    "//base/test:test_config",
    "//base/test:test_support",
    "//cc:cc",
    "//gpu/ipc/client",
    "//mojo/public/cpp/bindings:bindings",
    "//services/service_manager/public/cpp:service_test_support",
    "//services/service_manager/public/cpp:sources",
    "//services/service_manager/public/interfaces",
    "//services/ui/common:mus_common",
    "//services/ui/common:task_runner_test_base",
    "//services/ui/public/cpp",
    "//services/ui/public/interfaces",
    "//testing/gtest",
    "//third_party/mesa:osmesa",
    "//ui/aura",
    "//ui/aura:test_support",
    "//ui/events",
    "//ui/gfx",
    "//ui/gfx:test_support",
    "//ui/gfx/geometry",
    "//ui/gfx/geometry/mojo",
    "//ui/gl",
  ]
}

service_manifest("mus_ws_unittests_app_manifest") {
  name = "mus_ws_unittests_app"
  source = "mus_ws_unittests_app_manifest.json"
}

catalog("mus_ws_unittests_catalog") {
  embedded_services = [ ":mus_ws_unittests_app_manifest" ]

  standalone_services = [ "//services/ui:manifest" ]
}
