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

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

copy("copy_test_files") {
  visibility = [ ":*" ]
  sources = [
    # Keep "test_case.html.mock-http-headers" with "test_case.html".
    "tests/ppapi_nacl_tests_newlib.nmf",
    "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") {
  visibility = [ ":*" ]
  sources = [
    "tests/test_url_loader_data/hello.txt",
  ]
  outputs = [
    "$root_out_dir/test_url_loader_data/{{source_file_part}}",
  ]
}

import("//build/config/features.gni")
import("//build/config/nacl/config.gni")
import("//build/config/nacl/rules.gni")
import("//ppapi/ppapi_sources.gni")
import("//testing/test.gni")

shared_library("ppapi_tests") {
  sources = ppapi_sources.test_common_source_files +
            ppapi_sources.test_trusted_source_files

  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",
    "//build/config/sanitizers:deps",
    "//ppapi/cpp",
    "//ppapi/shared_impl",
  ]
}

shared_library("power_saver_test_plugin") {
  sources = [
    "tests/power_saver_test_plugin.cc",
    "tests/test_utils.cc",
  ]

  deps = [
    "//build/config/sanitizers:deps",
    "//ppapi/cpp",
    "//ppapi/shared_impl",
  ]
}

shared_library("blink_test_plugin") {
  sources = [
    "tests/blink_test_plugin.cc",
  ]

  deps = [
    "//build/config/sanitizers:deps",
    "//ppapi/cpp",
    "//ppapi/shared_impl",
  ]
}

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/flash_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/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/allocator",
    "//base/test:run_all_unittests",
    "//base/test:test_support",
    "//gpu/ipc",
    "//ipc",
    "//ipc:test_support",
    "//media:shared_memory_support",
    "//ppapi/host",
    "//ppapi/proxy",
    "//ppapi/proxy:test_support",
    "//ppapi/shared_impl",
    "//ppapi/shared_impl:test_support",
    "//testing/gmock",
    "//testing/gtest",
    "//ui/surface",
  ]
}

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

  deps = [
    "//base/allocator",
    "//base/test:test_support",
    "//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/config/sanitizers:deps",
  ]
}

static_library("ppapi_cpp_lib") {
  # This library is distributed as a part of the SDK and as such has to
  # be a static library rather than a source set.
  sources = ppapi_sources.cpp_source_files
  sources += [
    "cpp/module_embedder.h",
    "cpp/ppp_entrypoints.cc",
  ]
  deps = [
    "//build/config/nacl:nacl_base",
  ]
}

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) {
  if (is_nacl) {
    shared_library("ppapi_cpp_lib_shared") {
      # When using gcc, we hide all symbols by default, but that breaks at
      # link time as the test executable requires symbols defined in the
      # shared library.
      if (is_nacl_glibc) {
        configs -= [ "//build/config/gcc:symbol_visibility_hidden" ]
      }

      sources = ppapi_sources.cpp_source_files
      sources += [
        "cpp/module_embedder.h",
        "cpp/ppp_entrypoints.cc",
      ]
      cflags = [ "-fPIC" ]
      deps = [
        "//build/config/nacl:nacl_base",
      ]
    }

    executable("ppapi_nacl_tests") {
      include_dirs = [ "lib/gl/include" ]
      sources = ppapi_sources.test_common_source_files +
                ppapi_sources.test_nacl_source_files
      defines = [
        "GL_GLEXT_PROTOTYPES",
        "PPAPI_TEST_IMPLEMENTATION",
      ]
      ldflags = [ "-pthread" ]
      deps = [
        "//build/config/nacl:nacl_base",
        "//ppapi/native_client:ppapi_lib",
      ]
      if (is_nacl_glibc) {
        deps += [ ":ppapi_cpp_lib_shared" ]
      } else {
        deps += [ ":ppapi_cpp_lib" ]
      }
    }

    if (current_cpu == "pnacl") {
      action("translate_pexe_to_nexe") {
        # We specify the toolchain explicitly because in the Non-SFI case, we
        # still want to use the pexe built using the newlib_pnacl toolchain.
        tests = ":ppapi_nacl_tests(//build/toolchain/nacl:newlib_pnacl)"

        pexe = get_label_info(tests, "root_out_dir") + "/ppapi_nacl_tests.pexe"
        nexe = "${root_out_dir}/ppapi_nacl_tests.nexe"

        script = "${nacl_toolchain_bindir}/pydir/loader.py"
        sources = [
          pexe,
        ]
        outputs = [
          nexe,
        ]

        if (is_nacl_nonsfi) {
          if (target_cpu == "x86" || target_cpu == "x64") {
            arch = "x86-32-nonsfi"
          } else if (target_cpu == "arm") {
            arch = "arm-nonsfi"
          }
        } else {
          # TODO(phosek): remove the following once change 1360243003 is rolled
          # into Chrome and use $target_cpu directly.
          if (target_cpu == "x86") {
            arch = "i686"
          } else if (target_cpu == "x64") {
            arch = "x86-64"
          } else if (target_cpu == "arm") {
            arch = "armv7"
          }
        }

        # The pre-translated object file has to be linked with an IRT shim to
        # get a runnable nexe. This is handled by pnacl-translate, which passes
        # -l:libpnacl_irt_shim.a to native linker, and we need to ensure the
        # linker can find the correct library.
        if (is_nacl_nonsfi) {
          pnacl_irt_shim = "//ppapi/native_client/src/untrusted/pnacl_irt_shim:aot(//build/toolchain/nacl:newlib_pnacl_nonsfi)"
        } else {
          pnacl_irt_shim = "//ppapi/native_client/src/untrusted/pnacl_irt_shim:aot(//build/toolchain/nacl:clang_newlib_${target_cpu})"
        }

        args = [
          "pnacl-translate",
          rebase_path(pexe, root_build_dir),
          "-o",
          rebase_path(nexe, root_build_dir),
          "-arch",
          arch,
          "-Wl,-L" +
              rebase_path(get_label_info(pnacl_irt_shim, "target_out_dir")),
        ]
        deps = [
          tests,
        ]
        data_deps = [
          pnacl_irt_shim,
        ]
      }
    }

    copy("nacl_tests_copy") {
      sources = [
        "${root_out_dir}/ppapi_nacl_tests.nexe",
      ]

      # The CPU names used in tests/ppapi_nacl_tests_newlib.nmf
      # are the ones used in GYP (x32 for x86).
      if (current_cpu == "pnacl") {
        suffix = "pnacl"
      } else {
        if (target_cpu == "x86") {
          nmf_cpu = "x32"
        } else {
          nmf_cpu = target_cpu
        }
        if (is_nacl_glibc) {
          suffix = "glibc_${nmf_cpu}"
        } else {
          suffix = "newlib_${nmf_cpu}"
        }
      }
      outputs = [
        "${root_build_dir}/{{source_name_part}}_${suffix}.nexe",
      ]
      if (current_cpu == "pnacl") {
        deps = [
          ":translate_pexe_to_nexe",
        ]
      } else {
        deps = [
          ":ppapi_nacl_tests",
        ]
      }
    }

    generate_nmf("ppapi_nacl_tests_nmf") {
      if (is_nacl_glibc) {
        nmf = "${root_build_dir}/ppapi_nacl_tests_glibc.nmf"
        stage_dependencies = root_build_dir
      } else if (current_cpu == "pnacl") {
        nmf = "${root_build_dir}/ppapi_nacl_tests_pnacl.nmf"
      } else {
        nmf = "${root_build_dir}/ppapi_nacl_tests_newlib.nmf"
      }
      executables = get_target_outputs(":nacl_tests_copy")
      deps = [
        ":nacl_tests_copy",
      ]
    }

    generate_nonsfi_test_nmf("ppapi_nacl_tests_pnacl_nonsfi_nmf") {
      nmf = "${root_build_dir}/ppapi_nacl_tests_pnacl_nonsfi.nmf"
      executable = "${root_out_dir}/ppapi_nacl_tests.nexe"
      deps = [
        ":translate_pexe_to_nexe",
      ]
    }
  }

  group("ppapi_nacl_tests_all") {
    data_deps = [
      ":copy_test_files",
      ":nacl_tests_copy(//build/toolchain/nacl:clang_newlib_${target_cpu})",
      ":ppapi_nacl_tests_nmf(//build/toolchain/nacl:glibc_${target_cpu})",
    ]
    if (enable_pnacl) {
      data_deps += [
        ":ppapi_nacl_tests_nmf(//build/toolchain/nacl:newlib_pnacl)",
        ":ppapi_nacl_tests_pnacl_nonsfi_nmf(//build/toolchain/nacl:newlib_pnacl_nonsfi)",
      ]
    }
  }
}
