blob: dad7dd710a9d0651f079fc516eabc523814cccb1 [file] [log] [blame]
// Copyright 2018 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 "session_spec.h"
#include <iterator>
#include <gtest/gtest.h>
#include "garnet/lib/perfmon/events.h"
namespace cpuperf {
namespace {
class SessionSpecTest : public ::testing::Test {
public:
// ::testing::Test overrides
void SetUp() override { RegisterTestModel(); }
void TearDown() override {}
private:
// Ensure there's a model named "test".
// This serves two functions:
// - provide a model to test against
// - cause |ModelEventManager::Create()| to not register events for the
// current arch
void RegisterTestModel() {
// Only do this once though, the effect is otherwise cumulative.
if (!models_registered_) {
static const perfmon::EventDetails TestEvents[] = {
{perfmon::MakeEventId(perfmon::kGroupFixed, 1), "test-event", "test-event",
"test-event description"},
};
perfmon::ModelEventManager::RegisterEvents("test", "misc", &TestEvents[0],
std::size(TestEvents));
// Also register events for the default model: Some tests don't specify
// one (on purpose) and we want to control what events are present. Do
// this by registering them first.
perfmon::ModelEventManager::RegisterEvents(perfmon::GetDefaultModelName().c_str(), "misc",
&TestEvents[0], std::size(TestEvents));
models_registered_ = true;
}
}
static bool models_registered_;
};
bool SessionSpecTest::models_registered_ = false;
TEST_F(SessionSpecTest, DecodingErrors) {
std::string json;
SessionSpec result;
// Empty input.
EXPECT_FALSE(DecodeSessionSpec(json, &result));
// Not an object.
json = "[]";
EXPECT_FALSE(DecodeSessionSpec(json, &result));
json = "yes";
EXPECT_FALSE(DecodeSessionSpec(json, &result));
json = "4a";
EXPECT_FALSE(DecodeSessionSpec(json, &result));
// Incorrect parameter types.
json = R"({"config_name": 42})";
EXPECT_FALSE(DecodeSessionSpec(json, &result));
json = R"({"model_name": 42})";
EXPECT_FALSE(DecodeSessionSpec(json, &result));
json = R"({"events": 42})";
EXPECT_FALSE(DecodeSessionSpec(json, &result));
json = R"({"buffer_size_in_mb": "yikes"})";
EXPECT_FALSE(DecodeSessionSpec(json, &result));
json = R"({"duration": "long"})";
EXPECT_FALSE(DecodeSessionSpec(json, &result));
json = R"({"duration": -42})";
EXPECT_FALSE(DecodeSessionSpec(json, &result));
json = R"({"num_iterations": false})";
EXPECT_FALSE(DecodeSessionSpec(json, &result));
// Bad buffer size.
json = R"({"buffer_size_in_mb": 0})";
EXPECT_FALSE(DecodeSessionSpec(json, &result));
// Additional properies.
json = R"({"bla": "hey there"})";
EXPECT_FALSE(DecodeSessionSpec(json, &result));
}
TEST_F(SessionSpecTest, DecodeConfigName) {
std::string json = R"({"config_name": "test"})";
SessionSpec result;
ASSERT_TRUE(DecodeSessionSpec(json, &result));
EXPECT_EQ("test", result.config_name);
}
TEST_F(SessionSpecTest, DecodeModelName) {
std::string json = R"({"model_name": "test"})";
SessionSpec result;
ASSERT_TRUE(DecodeSessionSpec(json, &result));
EXPECT_EQ("test", result.model_name);
}
TEST_F(SessionSpecTest, DecodeEvents) {
std::string json = R"({
"model_name": "test",
"events": [
{
"group_name": "misc",
"event_name": "test-event",
"rate": 42,
"flags": [ "os", "user", "pc", "timebase" ]
}
]
})";
SessionSpec result;
ASSERT_TRUE(DecodeSessionSpec(json, &result));
const perfmon::EventDetails* details;
ASSERT_TRUE(result.model_event_manager->LookupEventByName("misc", "test-event", &details));
perfmon::EventId test_event_id = details->id;
EXPECT_EQ(result.perfmon_config.GetEventCount(), 1u);
result.perfmon_config.IterateOverEvents(
[&test_event_id](const perfmon::Config::EventConfig& event) {
EXPECT_EQ(event.event, test_event_id);
EXPECT_EQ(event.rate, 42u);
EXPECT_EQ(event.flags, (perfmon::Config::kFlagOs | perfmon::Config::kFlagUser |
perfmon::Config::kFlagPc | perfmon::Config::kFlagTimebase));
});
}
TEST_F(SessionSpecTest, DecodeBufferSizeInMb) {
std::string json = R"({"buffer_size_in_mb": 1})";
SessionSpec result;
ASSERT_TRUE(DecodeSessionSpec(json, &result));
EXPECT_EQ(1u, result.buffer_size_in_mb);
}
TEST_F(SessionSpecTest, DecodeDuration) {
std::string json = R"({"duration": 42})";
SessionSpec result;
ASSERT_TRUE(DecodeSessionSpec(json, &result));
EXPECT_EQ(zx::sec(42).to_nsecs(), result.duration.to_nsecs());
}
TEST_F(SessionSpecTest, DecodeNumIterations) {
std::string json = R"({"num_iterations": 99})";
SessionSpec result;
ASSERT_TRUE(DecodeSessionSpec(json, &result));
EXPECT_EQ(99u, result.num_iterations);
}
} // namespace
} // namespace cpuperf