# Copyright 2017 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/package.gni")
import("//build/test/test_package.gni")

# Split out so that unittests can reference it.
source_set("categories") {
  sources = [
    "categories.cc",
    "categories.h",
    "category-db.cc",
  ]

  if (current_cpu == "arm64") {
    sources += [
      "arm64-category-db.cc",
      "arm64-events.h",
      "arm64-pm-categories.inc",
      "arm64-timebase-categories.inc",
    ]
  }

  if (current_cpu == "x64") {
    sources += [
      "intel-category-db.cc",
      "intel-events.h",
      "intel-pm-categories.inc",
      "intel-timebase-categories.inc",
      "skylake-misc-categories.inc",
      "skylake-pm-categories.inc",
    ]
  }

  deps = [
    "//src/lib/fxl",
    "//zircon/public/lib/fbl",
  ]

  public_deps = [
    "//garnet/lib/perfmon",
    "//zircon/public/lib/trace",
    "//zircon/public/lib/zircon-internal",
  ]
}

executable("bin") {
  output_name = "cpuperf_provider"

  sources = [
    "app.cc",
    "app.h",
    "importer.cc",
    "importer.h",
    "main.cc",
  ]

  deps = [
    ":categories",
    "//garnet/lib/perfmon",
    "//sdk/lib/sys/cpp",
    "//src/lib/fxl",
    "//zircon/public/lib/async-loop-cpp",
    "//zircon/public/lib/trace",
    "//zircon/public/lib/trace-provider",
    "//zircon/public/lib/zircon-internal",
  ]
}

package("cpuperf_provider") {
  deps = [
    ":bin",
  ]

  binary = "cpuperf_provider"

  meta = [
    {
      path = rebase_path("meta/cpuperf_provider.cmx")
      dest = "cpuperf_provider.cmx"
    },
  ]
}

group("report_generators") {
  deps = [
    "//garnet/bin/cpuperf_provider/report-generators/tally",
  ]
}

executable("cpuperf_provider_tests_bin") {
  testonly = true
  output_name = "cpuperf_provider_tests"

  sources = [
    "categories_unittest.cc",
  ]

  deps = [
    ":categories",
    "//src/lib/fxl/test:gtest_main",
  ]
}

if (current_cpu == "x64") {
  executable("cpuperf_provider_integration_tests") {
    testonly = true
    output_name = "cpuperf_provider_integration_tests"

    sources = [
      "cpuperf_provider_integration_tests.cc",
    ]

    deps = [
      "//garnet/lib/perfmon",
      "//src/developer/tracing/lib/test_utils",
      "//src/lib/fxl",
      "//src/lib/fxl/test:test_settings",
      "//third_party/googletest:gtest",
      "//zircon/public/lib/trace-reader",
      "//zircon/public/lib/zx",
    ]
  }
}

test_package("cpuperf_provider_tests") {
  deps = [
    ":cpuperf_provider_tests_bin",
  ]

  tests = [
    {
      name = "cpuperf_provider_tests"
      environments = basic_envs
    },
  ]

  if (current_cpu == "x64") {
    deps += [ ":cpuperf_provider_integration_tests" ]

    tests += [
      {
        name = "cpuperf_provider_integration_tests"
        environments = basic_envs
      },
    ]
  }
}
