// Copyright 2019 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.

#include "garnet/bin/cpuperf_provider/categories.h"

#include <gtest/gtest.h>

#include <string>
#include <unordered_set>

namespace cpuperf_provider {

namespace {

class CategoryTest : public ::testing::Test {
 public:
  CategoryTest()
      : model_event_manager_(perfmon::ModelEventManager::Create(perfmon::GetDefaultModelName())) {}

  perfmon::ModelEventManager* model_event_manager() const { return model_event_manager_.get(); }

 private:
  std::unique_ptr<perfmon::ModelEventManager> model_event_manager_;
};

TEST_F(CategoryTest, Os) {
  const std::unordered_set<std::string> categories{
      "cpu:os",
  };
  TraceConfig::IsCategoryEnabledFunc func = [&categories](const char* name) {
    return categories.find(name) != categories.end();
  };
  auto config = TraceConfig::Create(model_event_manager(), func);
  ASSERT_TRUE(config);

  // Not enabled because there is no data to collect.
  ASSERT_FALSE(config->is_enabled());

  ASSERT_TRUE(config->trace_os());
  ASSERT_FALSE(config->trace_user());
  ASSERT_FALSE(config->trace_pc());
  ASSERT_FALSE(config->trace_last_branch());
  ASSERT_EQ(config->sample_rate(), 0u);
  ASSERT_EQ(config->timebase_event(), perfmon::kEventIdNone);
}

TEST_F(CategoryTest, User) {
  const std::unordered_set<std::string> categories{
      "cpu:user",
  };
  TraceConfig::IsCategoryEnabledFunc func = [&categories](const char* name) {
    return categories.find(name) != categories.end();
  };
  auto config = TraceConfig::Create(model_event_manager(), func);
  ASSERT_TRUE(config);

  // Not enabled because there is no data to collect.
  ASSERT_FALSE(config->is_enabled());

  ASSERT_FALSE(config->trace_os());
  ASSERT_TRUE(config->trace_user());
  ASSERT_FALSE(config->trace_pc());
  ASSERT_FALSE(config->trace_last_branch());
  ASSERT_EQ(config->sample_rate(), 0u);
  ASSERT_EQ(config->timebase_event(), perfmon::kEventIdNone);
}

TEST_F(CategoryTest, NeitherOsNorUser) {
  const std::unordered_set<std::string> categories {
    "cpu:pc",
#if defined(__x86_64__)
        "cpu:fixed:instructions_retired",
#elif defined(__aarch64__)
        "cpu:fixed:cycle_counter",
#endif
        "cpu:sample:1000",
  };
  TraceConfig::IsCategoryEnabledFunc func = [&categories](const char* name) {
    return categories.find(name) != categories.end();
  };
  auto config = TraceConfig::Create(model_event_manager(), func);
  ASSERT_TRUE(config);
  ASSERT_TRUE(config->is_enabled());
  // If neither os nor user are specified, then both are enabled.
  ASSERT_TRUE(config->trace_os());
  ASSERT_TRUE(config->trace_user());
  ASSERT_TRUE(config->trace_pc());
  ASSERT_EQ(config->sample_rate(), 1000u);
  ASSERT_EQ(config->timebase_event(), perfmon::kEventIdNone);
}

TEST_F(CategoryTest, Timebase) {
  const std::unordered_set<std::string> categories {
    "cpu:pc",
#if defined(__x86_64__)
        "cpu:timebase:fixed:instructions_retired", "cpu:fixed:instructions_retired",
#elif defined(__aarch64__)
        "cpu:timebase:fixed:cycle_counter", "cpu:fixed:cycle_counter",
#endif
        "cpu:sample:1000",
  };
  TraceConfig::IsCategoryEnabledFunc func = [&categories](const char* name) {
    return categories.find(name) != categories.end();
  };
  auto config = TraceConfig::Create(model_event_manager(), func);
  ASSERT_TRUE(config);
  ASSERT_TRUE(config->is_enabled());
  // If neither os nor user are specified, then both are enabled.
  ASSERT_TRUE(config->trace_os());
  ASSERT_TRUE(config->trace_user());
  ASSERT_TRUE(config->trace_pc());
  ASSERT_EQ(config->sample_rate(), 1000u);
  ASSERT_NE(config->timebase_event(), perfmon::kEventIdNone);
}

}  // namespace

}  // namespace cpuperf_provider
