# 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_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",
    "region.h",
    "rel32_finder_win32_x86.cc",
    "rel32_finder_win32_x86.h",
    "simple_delta.cc",
    "simple_delta.h",
    "streams.cc",
    "streams.h",
    "third_party/bsdiff.h",
    "third_party/bsdiff_apply.cc",
    "third_party/bsdiff_create.cc",
    "third_party/paged_array.h",
    "third_party/qsufsort.h",
    "types_elf.h",
    "types_win_pe.h",
  ]

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

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

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

  deps = [
    ":courgette_lib",
    "//base",
    "//build/config/sanitizers:deps",
  ]
}

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",
    "rel32_finder_win32_x86_unittest.cc",
    "streams_unittest.cc",
    "third_party/paged_array_unittest.cc",
    "third_party/qsufsort_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/allocator",
    "//base/test:run_all_unittests",
    "//base/test:test_support",
    "//testing/gtest",
  ]
}

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