# 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("//testing/test.gni")

static_library("courgette_lib") {
  sources = [
    "adjustment_method.cc",
    "adjustment_method.h",
    "adjustment_method_2.cc",
    "assembly_program.cc",
    "assembly_program.h",
    "consecutive_range_visitor.h",
    "courgette.h",
    "courgette_flow.cc",
    "courgette_flow.h",
    "crc.cc",
    "crc.h",
    "difference_estimator.cc",
    "difference_estimator.h",
    "disassembler.cc",
    "disassembler.h",
    "disassembler_elf_32.cc",
    "disassembler_elf_32.h",
    "disassembler_elf_32_arm.cc",
    "disassembler_elf_32_arm.h",
    "disassembler_elf_32_x86.cc",
    "disassembler_elf_32_x86.h",
    "disassembler_win32.cc",
    "disassembler_win32.h",
    "disassembler_win32_x64.cc",
    "disassembler_win32_x64.h",
    "disassembler_win32_x86.cc",
    "disassembler_win32_x86.h",
    "encoded_program.cc",
    "encoded_program.h",
    "ensemble.cc",
    "ensemble.h",
    "ensemble_apply.cc",
    "ensemble_create.cc",
    "image_utils.h",
    "instruction_utils.h",
    "label_manager.cc",
    "label_manager.h",
    "memory_allocator.cc",
    "memory_allocator.h",
    "patch_generator_x86_32.h",
    "patcher_x86_32.h",
    "program_detector.cc",
    "program_detector.h",
    "region.h",
    "rel32_finder.cc",
    "rel32_finder.h",
    "rel32_finder_x64.cc",
    "rel32_finder_x64.h",
    "rel32_finder_x86.cc",
    "rel32_finder_x86.h",
    "simple_delta.cc",
    "simple_delta.h",
    "streams.cc",
    "streams.h",
    "third_party/bsdiff/bsdiff.h",
    "third_party/bsdiff/bsdiff_apply.cc",
    "third_party/bsdiff/bsdiff_create.cc",
    "third_party/bsdiff/bsdiff_search.h",
    "third_party/bsdiff/paged_array.h",
    "third_party/divsufsort/divsufsort.cc",
    "third_party/divsufsort/divsufsort.h",
    "third_party/divsufsort/divsufsort_private.h",
    "third_party/divsufsort/sssort.cc",
    "third_party/divsufsort/trsort.cc",
    "types_elf.h",
    "types_win_pe.h",
  ]

  deps = [
    "//base",
    "//third_party/lzma_sdk",
  ]
}

if (!is_ios) {
  executable("courgette") {
    if (is_win && current_cpu == "x64") {
      # The build infrastructure needs courgette to be named courgette64.
      output_name = "courgette64"
    }

    sources = [
      "courgette_tool.cc",
    ]

    if (is_win) {
      ldflags = [ "/LARGEADDRESSAWARE" ]
    }

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

  executable("courgette_minimal_tool") {
    sources = [
      "courgette_minimal_tool.cc",
    ]

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

  if (is_win) {
    if (current_cpu == "x64") {
      # TODO(sebmarchand): The official build scripts expect courgette.exe to be
      # in the official build archives, remove this once they have been updated.
      # https://crbug.com/629243
      copy("copy_courgette_binaries") {
        sources = [
          "$root_out_dir/courgette64.exe",
        ]
        outputs = [
          "$root_out_dir/courgette.exe",
        ]
        deps = [
          ":courgette",
        ]
      }
    } else {
      # Make sure that we have a copy of courgette64.exe in the root out
      # directory.
      copy("copy_courgette_binaries") {
        if (is_clang) {
          courgette64_toolchain = "//build/toolchain/win:win_clang_x64"
        } else {
          courgette64_toolchain = "//build/toolchain/win:x64"
        }
        courgette64_label = ":courgette($courgette64_toolchain)"

        courgette64_out_dir = get_label_info(courgette64_label, "root_out_dir")
        sources = [
          "$courgette64_out_dir/courgette64.exe",
        ]
        outputs = [
          "$root_out_dir/{{source_file_part}}",
        ]
        deps = [
          courgette64_label,
        ]
      }
    }
  }
}

test("courgette_unittests") {
  sources = [
    "adjustment_method_unittest.cc",
    "base_test_unittest.cc",
    "base_test_unittest.h",
    "bsdiff_memory_unittest.cc",
    "consecutive_range_visitor_unittest.cc",
    "difference_estimator_unittest.cc",
    "disassembler_elf_32_x86_unittest.cc",
    "disassembler_win32_x64_unittest.cc",
    "disassembler_win32_x86_unittest.cc",
    "encode_decode_unittest.cc",
    "encoded_program_unittest.cc",
    "ensemble_unittest.cc",
    "image_utils_unittest.cc",
    "label_manager_unittest.cc",
    "memory_allocator_unittest.cc",
    "program_detector_unittest.cc",
    "rel32_finder_unittest.cc",
    "streams_unittest.cc",
    "third_party/bsdiff/bsdiff_search_unittest.cc",
    "third_party/bsdiff/paged_array_unittest.cc",
    "third_party/divsufsort/divsufsort_unittest.cc",
    "typedrva_unittest.cc",
    "versioning_unittest.cc",
  ]

  # TODO(jschuh): crbug.com/167187 fix size_t to int truncations.
  configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]

  deps = [
    ":courgette_lib",
    "//base",
    "//base:i18n",
    "//base/test:run_all_unittests",
    "//base/test:test_support",
    "//testing/gtest",
  ]

  data = [
    "testdata/",
  ]
}

test("courgette_fuzz") {
  sources = [
    "base_test_unittest.cc",
    "base_test_unittest.h",
    "encoded_program_fuzz_unittest.cc",
  ]
  deps = [
    ":courgette_lib",
    "//base",
    "//base:i18n",
    "//base/test:test_support",
    "//testing/gtest",
  ]
}
