# 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",
    "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",
    "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/sanitizers:deps",
      "//build/win:default_exe_manifest",
    ]
  }

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

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