blob: f7a6c2ccd498d566ac9ad07c88694ba01e9b6aca [file] [log] [blame]
/*
* Copyright (C) 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "src/perfetto_cmd/config.h"
#include "test/gtest_and_gmock.h"
#include "perfetto/tracing/core/data_source_config.h"
#include "perfetto/tracing/core/trace_config.h"
#include "protos/perfetto/config/ftrace/ftrace_config.gen.h"
namespace perfetto {
namespace {
using testing::Contains;
class CreateConfigFromOptionsTest : public ::testing::Test {
public:
TraceConfig config;
ConfigOptions options;
};
TEST_F(CreateConfigFromOptionsTest, Default) {
ASSERT_TRUE(CreateConfigFromOptions(options, &config));
EXPECT_FALSE(config.write_into_file());
}
TEST_F(CreateConfigFromOptionsTest, MilliSeconds) {
options.time = "2ms";
ASSERT_TRUE(CreateConfigFromOptions(options, &config));
EXPECT_EQ(config.duration_ms(), 2u);
}
TEST_F(CreateConfigFromOptionsTest, ZeroTime) {
options.time = "0";
ASSERT_TRUE(CreateConfigFromOptions(options, &config));
EXPECT_EQ(config.duration_ms(), 0u);
}
TEST_F(CreateConfigFromOptionsTest, Seconds) {
options.time = "100s";
ASSERT_TRUE(CreateConfigFromOptions(options, &config));
EXPECT_EQ(config.duration_ms(), 100 * 1000u);
}
TEST_F(CreateConfigFromOptionsTest, Minutes) {
options.time = "2m";
ASSERT_TRUE(CreateConfigFromOptions(options, &config));
EXPECT_EQ(config.duration_ms(), 2 * 60 * 1000u);
}
TEST_F(CreateConfigFromOptionsTest, Hours) {
options.time = "2h";
ASSERT_TRUE(CreateConfigFromOptions(options, &config));
EXPECT_EQ(config.duration_ms(), 2 * 60 * 60 * 1000u);
}
TEST_F(CreateConfigFromOptionsTest, ZeroBufferSize) {
options.buffer_size = "0";
ASSERT_TRUE(CreateConfigFromOptions(options, &config));
EXPECT_EQ(config.buffers()[0].size_kb(), 0u);
}
TEST_F(CreateConfigFromOptionsTest, Kilobyte) {
options.buffer_size = "2kb";
ASSERT_TRUE(CreateConfigFromOptions(options, &config));
EXPECT_EQ(config.buffers()[0].size_kb(), 2u);
}
TEST_F(CreateConfigFromOptionsTest, Megabyte) {
options.buffer_size = "2mb";
ASSERT_TRUE(CreateConfigFromOptions(options, &config));
EXPECT_EQ(config.buffers()[0].size_kb(), 2 * 1024u);
}
TEST_F(CreateConfigFromOptionsTest, Gigabyte) {
options.buffer_size = "2gb";
ASSERT_TRUE(CreateConfigFromOptions(options, &config));
EXPECT_EQ(config.buffers()[0].size_kb(), 2 * 1024 * 1024u);
}
TEST_F(CreateConfigFromOptionsTest, BadTrailingSpace) {
options.buffer_size = "2gb ";
ASSERT_FALSE(CreateConfigFromOptions(options, &config));
}
TEST_F(CreateConfigFromOptionsTest, UnmatchedUnit) {
options.buffer_size = "2ly";
ASSERT_FALSE(CreateConfigFromOptions(options, &config));
}
TEST_F(CreateConfigFromOptionsTest, OnlyNumber) {
options.buffer_size = "2";
ASSERT_FALSE(CreateConfigFromOptions(options, &config));
}
TEST_F(CreateConfigFromOptionsTest, OnlyUnit) {
options.buffer_size = "kb";
ASSERT_FALSE(CreateConfigFromOptions(options, &config));
}
TEST_F(CreateConfigFromOptionsTest, Empty) {
options.buffer_size = "";
ASSERT_TRUE(CreateConfigFromOptions(options, &config));
}
TEST_F(CreateConfigFromOptionsTest, InvalidTime) {
options.time = "2mb";
ASSERT_FALSE(CreateConfigFromOptions(options, &config));
}
TEST_F(CreateConfigFromOptionsTest, InvalidSize) {
options.max_file_size = "2s";
ASSERT_FALSE(CreateConfigFromOptions(options, &config));
}
TEST_F(CreateConfigFromOptionsTest, FullConfig) {
options.buffer_size = "100mb";
options.max_file_size = "1gb";
options.time = "1h";
options.categories.push_back("sw");
options.categories.push_back("sched/sched_switch");
options.atrace_apps.push_back("com.android.chrome");
ASSERT_TRUE(CreateConfigFromOptions(options, &config));
EXPECT_EQ(config.duration_ms(), 60 * 60 * 1000u);
EXPECT_EQ(config.flush_period_ms(), 30 * 1000u);
EXPECT_EQ(config.max_file_size_bytes(), 1 * 1024 * 1024 * 1024u);
EXPECT_EQ(config.buffers()[0].size_kb(), 100 * 1024u);
EXPECT_EQ(config.data_sources()[0].config().name(), "linux.ftrace");
EXPECT_EQ(config.data_sources()[0].config().target_buffer(), 0u);
protos::gen::FtraceConfig ftrace;
ASSERT_TRUE(ftrace.ParseFromString(
config.data_sources()[0].config().ftrace_config_raw()));
EXPECT_THAT(ftrace.ftrace_events(), Contains("sched/sched_switch"));
EXPECT_TRUE(ftrace.symbolize_ksyms());
EXPECT_THAT(ftrace.atrace_categories(), Contains("sw"));
EXPECT_THAT(ftrace.atrace_apps(), Contains("com.android.chrome"));
}
TEST_F(CreateConfigFromOptionsTest, OnlyHypervisorTraces) {
options.buffer_size = "100mb";
options.time = "10s";
options.categories.push_back("hyp");
ASSERT_TRUE(CreateConfigFromOptions(options, &config));
EXPECT_EQ(config.duration_ms(), 10 * 1000u);
EXPECT_EQ(config.buffers()[0].size_kb(), 100 * 1024u);
EXPECT_EQ(config.data_sources()[0].config().name(), "linux.ftrace");
protos::gen::FtraceConfig ftrace;
ASSERT_TRUE(ftrace.ParseFromString(
config.data_sources()[0].config().ftrace_config_raw()));
EXPECT_THAT(ftrace.ftrace_events(), Contains("hyp/*"));
ASSERT_EQ(ftrace.instance_name(), "hyp");
}
TEST_F(CreateConfigFromOptionsTest, BothHypervisorAndHostFtraceTraces) {
options.buffer_size = "100mb";
options.time = "10s";
options.categories.push_back("hyp");
options.categories.push_back("sw");
options.categories.push_back("sched/sched_switch");
ASSERT_TRUE(CreateConfigFromOptions(options, &config));
EXPECT_EQ(config.duration_ms(), 10 * 1000u);
EXPECT_EQ(config.buffers()[0].size_kb(), 100 * 1024u);
EXPECT_EQ(config.buffers()[0].size_kb(), 100 * 1024u);
EXPECT_EQ(config.data_sources()[0].config().name(), "linux.ftrace");
{
protos::gen::FtraceConfig ftrace;
ASSERT_TRUE(ftrace.ParseFromString(
config.data_sources()[0].config().ftrace_config_raw()));
EXPECT_THAT(ftrace.ftrace_events(), Contains("sched/sched_switch"));
EXPECT_THAT(ftrace.atrace_categories(), Contains("sw"));
EXPECT_TRUE(ftrace.symbolize_ksyms());
}
EXPECT_EQ(config.data_sources()[1].config().name(), "linux.ftrace");
{
protos::gen::FtraceConfig ftrace;
ASSERT_TRUE(ftrace.ParseFromString(
config.data_sources()[1].config().ftrace_config_raw()));
EXPECT_THAT(ftrace.ftrace_events(), Contains("hyp/*"));
ASSERT_EQ(ftrace.instance_name(), "hyp");
}
}
} // namespace
} // namespace perfetto