# 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",
    "cursor_location_manager.cc",
    "cursor_location_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_location_manager_unittest.cc",
    "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" ]
}
