blob: f8dd3dfb1ee95e01e0fcc79218bba15a9f50fab8 [file] [log] [blame]
// 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 <string>
#include <unordered_set>
#include <gtest/gtest.h>
#include <src/lib/fxl/command_line.h>
#include <src/lib/fxl/log_settings_command_line.h>
#include "garnet/bin/cpuperf_provider/categories.h"
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
// Provide our own main so that --verbose,etc. are recognized.
int main(int argc, char** argv) {
auto cl = fxl::CommandLineFromArgcArgv(argc, argv);
if (!fxl::SetLogSettingsFromCommandLine(cl))
return EXIT_FAILURE;
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}