# 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.

##########################################
# Though under //zircon, this build file #
# is meant to be used in the Fuchsia GN  #
# build.                                 #
# See fxb/36139.                         #
##########################################

assert(!defined(zx) || zx != "/",
       "This file can only be used in the Fuchsia GN build.")

import("//build/test.gni")
import("//build/test/test_package.gni")

test("trace-reader-test") {
  if (is_fuchsia) {
    configs += [ "//build/unification/config:zircon-migrated" ]
  }
  if (is_fuchsia) {
    fdio_config = [ "//build/config/fuchsia:fdio_config" ]
    if (configs + fdio_config - fdio_config != configs) {
      configs -= fdio_config
    }
  }
  sources = [
    "file_reader_tests.cc",
    "reader_tests.cc",
    "records_tests.cc",
  ]
  deps = [
    "//zircon/public/lib/fbl",
    "//zircon/public/lib/fit",
    "//zircon/public/lib/trace-engine-headers-for-reader",
    "//zircon/public/lib/trace-reader",
    "//zircon/public/lib/zxtest",
  ]
  if (is_fuchsia) {
    deps += [
      "//zircon/public/lib/fdio",
      "//zircon/public/lib/zx",
    ]
  }
}

group("test") {
  testonly = true
  deps = [ ":trace-reader-test" ]
}

unittest_package("trace-reader-test-package") {
  package_name = "trace-reader-test"
  deps = [ ":trace-reader-test" ]

  tests = [
    {
      name = "trace-reader-test"
      dest = "trace-reader-test-test"
    },
  ]
}
