# 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",
  ]
}

loadable_module("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/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/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",
  ]
}

if (is_nacl_glibc) {
  shared_library("ppapi_cpp_lib") {
    # 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.
    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",
    ]
  }
} else {
  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) {
    executable("ppapi_nacl_tests_nexe") {
      output_name = "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 = [
        ":ppapi_cpp_lib",
        "//build/config/nacl:nacl_base",
        "//ppapi/native_client:ppapi_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_nexe(//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("ppapi_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 (target_cpu == "x86" ||
          (is_nacl_nonsfi && (target_cpu == "x86" || target_cpu == "x64"))) {
        nmf_cpu = "x32"
      } else {
        nmf_cpu = target_cpu
      }
      if (current_cpu == "pnacl") {
        if (is_nacl_nonsfi) {
          suffix = "pnacl_newlib_${nmf_cpu}_nonsfi"
        } else {
          suffix = "pnacl_newlib_${nmf_cpu}"
        }
      } else 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_nexe",
        ]
      }
    }

    if (is_nacl_nonsfi) {
      generate_nonsfi_test_nmf("ppapi_nacl_tests_nmf") {
        nmf = "${root_build_dir}/ppapi_nacl_tests_pnacl_nonsfi.nmf"
        files = get_target_outputs(":ppapi_nacl_tests_copy")
        executable = files[0]
        deps = [
          ":ppapi_nacl_tests_copy",
        ]
      }
    } else {
      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(":ppapi_nacl_tests_copy")
        deps = [
          ":ppapi_nacl_tests_copy",
        ]
      }
    }

    group("ppapi_nacl_tests") {
      data_deps = [
        ":ppapi_nacl_tests_copy",
        ":ppapi_nacl_tests_nmf",
      ]
    }
  }

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