# 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/features.gni")
import("//build/config/nacl/config.gni")
import("//build/config/nacl/rules.gni")
import("//components/nacl/features.gni")
import("//ppapi/buildflags/buildflags.gni")
import("//testing/test.gni")
if (is_mac) {
  import("//build/config/mac/rules.gni")
}

assert(!is_android || enable_plugins,
       "//ppapi should not be referenced when is_android && !enable_plugins")

# Test files shared between several targets below.
#
# TODO(brettw) it seems like it should be possible to factor this in a source
# set that is shared in such a way that these only need to be referenced once.
test_common_source_files = [
  "lib/gl/gles2/gl2ext_ppapi.c",
  "lib/gl/gles2/gl2ext_ppapi.h",
  "lib/gl/gles2/gles2.c",
  "tests/all_c_includes.h",
  "tests/all_cpp_includes.h",
  "tests/arch_dependent_sizes_32.h",
  "tests/arch_dependent_sizes_64.h",
  "tests/pp_thread.h",
  "tests/test_audio.cc",
  "tests/test_audio.h",
  "tests/test_audio_config.cc",
  "tests/test_audio_config.h",
  "tests/test_case.cc",
  "tests/test_case.h",
  "tests/test_console.cc",
  "tests/test_console.h",
  "tests/test_core.cc",
  "tests/test_core.h",
  "tests/test_cursor_control.cc",
  "tests/test_cursor_control.h",
  "tests/test_empty.cc",
  "tests/test_empty.h",
  "tests/test_file_io.cc",
  "tests/test_file_io.h",
  "tests/test_file_ref.cc",
  "tests/test_file_ref.h",
  "tests/test_file_system.cc",
  "tests/test_file_system.h",
  "tests/test_fullscreen.cc",
  "tests/test_fullscreen.h",
  "tests/test_graphics_2d.cc",
  "tests/test_graphics_2d.h",
  "tests/test_graphics_3d.cc",
  "tests/test_graphics_3d.h",
  "tests/test_host_resolver.cc",
  "tests/test_host_resolver.h",
  "tests/test_host_resolver_crash.cc",
  "tests/test_host_resolver_crash.h",
  "tests/test_host_resolver_private.cc",
  "tests/test_host_resolver_private.h",
  "tests/test_host_resolver_private_disallowed.cc",
  "tests/test_host_resolver_private_disallowed.h",
  "tests/test_image_data.cc",
  "tests/test_image_data.h",
  "tests/test_ime_input_event.cc",
  "tests/test_ime_input_event.h",
  "tests/test_input_event.cc",
  "tests/test_input_event.h",
  "tests/test_media_stream_audio_track.cc",
  "tests/test_media_stream_audio_track.h",
  "tests/test_media_stream_video_track.cc",
  "tests/test_media_stream_video_track.h",
  "tests/test_memory.cc",
  "tests/test_memory.h",
  "tests/test_message_handler.cc",
  "tests/test_message_handler.h",
  "tests/test_message_loop.cc",
  "tests/test_message_loop.h",
  "tests/test_mouse_cursor.cc",
  "tests/test_mouse_cursor.h",
  "tests/test_mouse_lock.cc",
  "tests/test_mouse_lock.h",
  "tests/test_net_address.cc",
  "tests/test_net_address.h",
  "tests/test_net_address_private_untrusted.cc",
  "tests/test_net_address_private_untrusted.h",
  "tests/test_network_monitor.cc",
  "tests/test_network_monitor.h",
  "tests/test_network_proxy.cc",
  "tests/test_network_proxy.h",
  "tests/test_paint_aggregator.cc",
  "tests/test_paint_aggregator.h",
  "tests/test_post_message.cc",
  "tests/test_post_message.h",
  "tests/test_printing.cc",
  "tests/test_printing.h",
  "tests/test_tcp_server_socket_private.cc",
  "tests/test_tcp_server_socket_private.h",
  "tests/test_tcp_socket.cc",
  "tests/test_tcp_socket.h",
  "tests/test_tcp_socket_private.cc",
  "tests/test_tcp_socket_private.h",
  "tests/test_tcp_socket_private_crash.cc",
  "tests/test_tcp_socket_private_crash.h",
  "tests/test_test_internals.cc",
  "tests/test_test_internals.h",
  "tests/test_trace_event.cc",
  "tests/test_trace_event.h",
  "tests/test_udp_socket.cc",
  "tests/test_udp_socket.h",
  "tests/test_udp_socket_private.cc",
  "tests/test_udp_socket_private.h",
  "tests/test_uma.cc",
  "tests/test_uma.h",
  "tests/test_url_loader.cc",
  "tests/test_url_loader.h",
  "tests/test_url_request.cc",
  "tests/test_url_request.h",
  "tests/test_utils.cc",
  "tests/test_var.cc",
  "tests/test_var.h",
  "tests/test_var_resource.cc",
  "tests/test_var_resource.h",
  "tests/test_video_decoder.cc",
  "tests/test_video_decoder.h",
  "tests/test_video_encoder.cc",
  "tests/test_video_encoder.h",
  "tests/test_view.cc",
  "tests/test_view.h",
  "tests/test_websocket.cc",
  "tests/test_websocket.h",
  "tests/testing_instance.cc",
  "tests/testing_instance.h",

  # Compile-time tests
  "tests/test_c_includes.c",
  "tests/test_cpp_includes.cc",
  "tests/test_struct_sizes.c",
]

copy("copy_test_files") {
  sources = [
    # Keep "test_case.html.mock-http-headers" with "test_case.html"
    # and "corb_eligible_resource.json.mock-http-headers" with
    # "corb_eligible_resource.json".
    "tests/corb_eligible_resource.json",
    "tests/corb_eligible_resource.json.mock-http-headers",
    "tests/test_case.html",
    "tests/test_case.html.mock-http-headers",
    "tests/test_page.css",
    "tests/test_page.css.mock-http-headers",
  ]
  outputs = [ "$root_out_dir/{{source_file_part}}" ]
}

copy("copy_test_files2") {
  sources = [ "tests/test_url_loader_data/hello.txt" ]
  outputs = [ "$root_out_dir/test_url_loader_data/{{source_file_part}}" ]
}

source_set("ppapi_tests_sources") {
  sources = test_common_source_files
  sources += [
    "tests/test_browser_font.cc",
    "tests/test_browser_font.h",
    "tests/test_buffer.cc",
    "tests/test_buffer.h",
    "tests/test_char_set.cc",
    "tests/test_char_set.h",
    "tests/test_crypto.cc",
    "tests/test_crypto.h",
    "tests/test_file_chooser.cc",
    "tests/test_file_chooser.h",
    "tests/test_net_address_private.cc",
    "tests/test_net_address_private.h",
    "tests/test_pdf.cc",
    "tests/test_pdf.h",
    "tests/test_tcp_socket_private_trusted.cc",
    "tests/test_tcp_socket_private_trusted.h",
    "tests/test_url_util.cc",
    "tests/test_url_util.h",
    "tests/test_utils.h",
    "tests/test_video_decoder_dev.cc",
    "tests/test_video_decoder_dev.h",
    "tests/test_x509_certificate_private.cc",
    "tests/test_x509_certificate_private.h",

    # Deprecated test cases.
    "tests/test_instance_deprecated.cc",
    "tests/test_instance_deprecated.h",
    "tests/test_var_deprecated.cc",
    "tests/test_var_deprecated.h",
  ]

  configs += [
    "//build/config:precompiled_headers",
    "//v8:external_startup_data",
  ]

  defines = [ "GL_GLEXT_PROTOTYPES" ]
  include_dirs = [ "lib/gl/include" ]

  deps = [
    ":copy_test_files",
    ":copy_test_files2",
    "//ppapi/cpp",
    "//ppapi/shared_impl",
  ]
}

if (is_mac) {
  ppapi_tests_target_type = "mac_plugin_bundle"
} else {
  ppapi_tests_target_type = "shared_library"
}
target(ppapi_tests_target_type, "ppapi_tests") {
  deps = [ ":ppapi_tests_sources" ]
}

# Test plugin for Cross-Origin Read Blocking.
# See also ppapi::RegisterCorbTestPlugin.
source_set("corb_test_plugin_sources") {
  sources = [
    "tests/corb_test_plugin.cc",
    "tests/test_utils.cc",
  ]

  deps = [
    "//ppapi/cpp",
    "//ppapi/shared_impl",
  ]
}

if (!is_mac) {
  shared_library("corb_test_plugin") {
    deps = [ ":corb_test_plugin_sources" ]
  }
} else {
  mac_plugin_bundle("corb_test_plugin") {
    deps = [ ":corb_test_plugin_sources" ]
  }
}

source_set("blink_deprecated_test_plugin_sources") {
  sources = [ "tests/blink_deprecated_test_plugin.cc" ]

  deps = [
    "//base",
    "//ppapi/cpp",
    "//ppapi/shared_impl",
  ]
}

if (!is_mac) {
  loadable_module("blink_deprecated_test_plugin") {
    deps = [ ":blink_deprecated_test_plugin_sources" ]
  }
} else {
  mac_plugin_bundle("blink_deprecated_test_plugin") {
    deps = [ ":blink_deprecated_test_plugin_sources" ]
  }
}

source_set("blink_test_plugin_sources") {
  sources = [ "tests/blink_test_plugin.cc" ]

  deps = [
    "//base",
    "//ppapi/cpp",
    "//ppapi/shared_impl",
  ]
}

if (!is_mac) {
  loadable_module("blink_test_plugin") {
    deps = [ ":blink_test_plugin_sources" ]
  }
} else {
  mac_plugin_bundle("blink_test_plugin") {
    deps = [ ":blink_test_plugin_sources" ]
  }
}

test("ppapi_unittests") {
  sources = [
    "host/resource_message_filter_unittest.cc",
    "proxy/device_enumeration_resource_helper_unittest.cc",
    "proxy/file_chooser_resource_unittest.cc",
    "proxy/file_system_resource_unittest.cc",
    "proxy/interface_list_unittest.cc",
    "proxy/mock_resource.cc",
    "proxy/mock_resource.h",
    "proxy/nacl_message_scanner_unittest.cc",
    "proxy/pdf_resource_unittest.cc",
    "proxy/plugin_dispatcher_unittest.cc",
    "proxy/plugin_resource_tracker_unittest.cc",
    "proxy/plugin_var_tracker_unittest.cc",
    "proxy/ppapi_command_buffer_proxy_unittest.cc",
    "proxy/ppb_var_unittest.cc",
    "proxy/ppp_instance_private_proxy_unittest.cc",
    "proxy/ppp_instance_proxy_unittest.cc",
    "proxy/ppp_messaging_proxy_unittest.cc",
    "proxy/printing_resource_unittest.cc",
    "proxy/raw_var_data_unittest.cc",
    "proxy/serialized_var_unittest.cc",
    "proxy/tracked_callback_unittest.cc",
    "proxy/video_decoder_resource_unittest.cc",
    "proxy/video_encoder_resource_unittest.cc",
    "proxy/websocket_resource_unittest.cc",
    "shared_impl/media_stream_audio_track_shared_unittest.cc",
    "shared_impl/media_stream_buffer_manager_unittest.cc",
    "shared_impl/media_stream_video_track_shared_unittest.cc",
    "shared_impl/proxy_lock_unittest.cc",
    "shared_impl/resource_tracker_unittest.cc",
    "shared_impl/thread_aware_callback_unittest.cc",
    "shared_impl/time_conversion_unittest.cc",
    "shared_impl/var_tracker_unittest.cc",
  ]

  deps = [
    "//base/test:test_support",
    "//gpu/ipc/common:command_buffer_traits",
    "//ipc",
    "//ipc:run_all_unittests",
    "//ipc:test_support",
    "//media:shared_memory_support",
    "//ppapi/host",
    "//ppapi/proxy",
    "//ppapi/proxy:test_support",
    "//ppapi/shared_impl",
    "//ppapi/shared_impl:test_support",
    "//skia",
    "//testing/gmock",
    "//testing/gtest",
    "//ui/surface",
  ]
}

test("ppapi_perftests") {
  sources = [
    "proxy/ppapi_perftests.cc",
    "proxy/ppp_messaging_proxy_perftest.cc",
  ]

  deps = [
    "//base/test:test_support",
    "//mojo/core/embedder",
    "//ppapi/proxy",
    "//ppapi/proxy:test_support",
    "//ppapi/shared_impl",
    "//ppapi/shared_impl:test_support",
    "//testing/gtest",
  ]
}

executable("pepper_hash_for_uma") {
  sources = [ "tools/pepper_hash_for_uma.cc" ]

  deps = [
    "//base",
    "//build/win:default_exe_manifest",
  ]
}

source_set("ppapi_gles2_lib") {
  include_dirs = [ "lib/gl/include" ]
  sources = [
    "lib/gl/gles2/gl2ext_ppapi.c",
    "lib/gl/gles2/gl2ext_ppapi.h",
    "lib/gl/gles2/gles2.c",
  ]
  deps = [ "//ppapi/cpp" ]
}

if (enable_nacl) {
  import("//ppapi/native_client/nacl_test_data.gni")

  if (is_nacl) {
    nacl_test_data("ppapi_nacl_tests") {
      include_dirs = [ "lib/gl/include" ]
      sources = test_common_source_files

      sources += [
        "tests/test_nacl_irt_stack_alignment.cc",
        "tests/test_nacl_irt_stack_alignment.h",
        "tests/test_tcp_server_socket_private_disallowed.cc",
        "tests/test_tcp_server_socket_private_disallowed.h",
        "tests/test_tcp_socket_private_disallowed.cc",
        "tests/test_tcp_socket_private_disallowed.h",
        "tests/test_udp_socket_private_disallowed.cc",
        "tests/test_udp_socket_private_disallowed.h",
      ]

      defines = [
        "GL_GLEXT_PROTOTYPES",
        "PPAPI_TEST_IMPLEMENTATION",
      ]
      deps = [ "//ppapi/cpp" ]
      if (current_cpu == "pnacl") {
        pretranslate_pexe = true
      }
    }
  }

  group("ppapi_nacl_tests_all") {
    data_deps = [
      ":copy_test_files",
      ":ppapi_nacl_tests(//build/toolchain/nacl:clang_newlib_${target_cpu})",
      ":ppapi_nacl_tests(//build/toolchain/nacl:newlib_pnacl)",
    ]

    if (target_cpu != "mipsel" && !is_mac && !is_win) {
      data_deps +=
          [ ":ppapi_nacl_tests(//build/toolchain/nacl:glibc_${target_cpu})" ]
    }

    if ((is_linux || is_chromeos) && enable_nacl_nonsfi) {
      data_deps +=
          [ ":ppapi_nacl_tests(//build/toolchain/nacl:newlib_pnacl_nonsfi)" ]
    }
  }
}
