# Copyright 2020 The Fuchsia 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("//build/fuzzing/fuzzer.gni")
import("//build/host.gni")
import("//build/test.gni")
import("//build/test/test_package.gni")

source_set("chunked-compression") {
  sources = [
    "chunked-archive.cc",
    "chunked-archive.h",
    "chunked-compressor.cc",
    "chunked-compressor.h",
    "chunked-decompressor.cc",
    "chunked-decompressor.h",
    "compression-params.cc",
    "compression-params.h",
    "status.h",
    "streaming-chunked-compressor.cc",
    "streaming-chunked-compressor.h",
  ]
  public_deps = [ "//zircon/public/lib/fbl" ]
  deps = [
    "//src/lib/fxl",
    "//third_party/zstd",
    "//zircon/public/lib/cksum",
    "//zircon/public/lib/fbl",
  ]

  if (is_fuchsia) {
    deps += [ "//zircon/system/ulib/syslog" ]
    public_deps += [ "//zircon/public/lib/zx" ]
  }
}

executable("chunked-compress") {
  sources = [ "main.cc" ]
  deps = [
    ":chunked-compression",
    "//zircon/public/lib/fbl",
  ]
}

install_host_tools("chunked-compress-host-tool") {
  deps = [ ":chunked-compress" ]
  outputs = [ "chunked-compress" ]
}

source_set("chunked-compression-testutils") {
  testonly = true
  visibility = [ ":*" ]
  sources = [
    "test-utils.cc",
    "test-utils.h",
  ]
  public_deps = [
    ":chunked-compression",
    "//zircon/public/lib/fbl",
  ]
  deps = [ "//zircon/public/lib/cksum" ]
}

test("chunked-compression-unittests") {
  testonly = true
  output_name = "chunked-compression-unittests"
  sources = [
    "chunked-compressor-test.cc",
    "chunked-decompressor-test.cc",
    "compression-params-test.cc",
    "header-reader-test.cc",
    "header-writer-test.cc",
    "seek-table-test.cc",
    "streaming-chunked-compressor-test.cc",
  ]
  deps = [
    ":chunked-compression",
    ":chunked-compression-testutils",
    "//zircon/public/lib/cksum",
    "//zircon/public/lib/zxtest",
  ]
}

unittest_package("chunked-compression-unittests-package") {
  package_name = "chunked-compression-unittests"
  deps = [ ":chunked-compression-unittests" ]

  tests = [
    {
      name = "chunked-compression-unittests"
    },
  ]
}

fuzzer("header-reader-fuzzer") {
  sources = [ "header-reader-fuzztest.cc" ]
  dictionary = "test_data/archive.dict"
  deps = [
    ":chunked-compression",
    ":chunked-compression-testutils",
    "//src/lib/fxl",
  ]
}

fuzzer("decompressor-fuzzer") {
  sources = [ "decompressor-fuzztest.cc" ]
  dictionary = "test_data/archive.dict"
  deps = [
    ":chunked-compression",
    ":chunked-compression-testutils",
    "//src/lib/fxl",
  ]
}

fuzzer("compress-decompress-fuzzer") {
  sources = [ "compress-decompress-fuzztest.cc" ]
  deps = [
    ":chunked-compression",
    ":chunked-compression-testutils",
  ]
}

fuzzers_package("chunked-compression-fuzzers-package") {
  package_name = "chunked-compression-fuzzers"
  fuzzers = [
    ":compress-decompress-fuzzer",
    ":decompressor-fuzzer",
    ":header-reader-fuzzer",
  ]
}

group("tests") {
  testonly = true
  deps = [
    ":chunked-compression-fuzzers-package",
    ":chunked-compression-unittests-package",
  ]
}
