xref: /aosp_15_r20/external/perfetto/src/perfetto_cmd/config_unittest.cc (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1 /*
2  * Copyright (C) 2018 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include "src/perfetto_cmd/config.h"
18 
19 #include "test/gtest_and_gmock.h"
20 
21 #include "perfetto/tracing/core/data_source_config.h"
22 #include "perfetto/tracing/core/trace_config.h"
23 
24 #include "protos/perfetto/config/ftrace/ftrace_config.gen.h"
25 
26 namespace perfetto {
27 namespace {
28 
29 using testing::Contains;
30 
31 class CreateConfigFromOptionsTest : public ::testing::Test {
32  public:
33   TraceConfig config;
34   ConfigOptions options;
35 };
36 
TEST_F(CreateConfigFromOptionsTest,Default)37 TEST_F(CreateConfigFromOptionsTest, Default) {
38   ASSERT_TRUE(CreateConfigFromOptions(options, &config));
39   EXPECT_FALSE(config.write_into_file());
40 }
41 
TEST_F(CreateConfigFromOptionsTest,MilliSeconds)42 TEST_F(CreateConfigFromOptionsTest, MilliSeconds) {
43   options.time = "2ms";
44   ASSERT_TRUE(CreateConfigFromOptions(options, &config));
45   EXPECT_EQ(config.duration_ms(), 2u);
46 }
47 
TEST_F(CreateConfigFromOptionsTest,ZeroTime)48 TEST_F(CreateConfigFromOptionsTest, ZeroTime) {
49   options.time = "0";
50   ASSERT_TRUE(CreateConfigFromOptions(options, &config));
51   EXPECT_EQ(config.duration_ms(), 0u);
52 }
53 
TEST_F(CreateConfigFromOptionsTest,Seconds)54 TEST_F(CreateConfigFromOptionsTest, Seconds) {
55   options.time = "100s";
56   ASSERT_TRUE(CreateConfigFromOptions(options, &config));
57   EXPECT_EQ(config.duration_ms(), 100 * 1000u);
58 }
59 
TEST_F(CreateConfigFromOptionsTest,Minutes)60 TEST_F(CreateConfigFromOptionsTest, Minutes) {
61   options.time = "2m";
62   ASSERT_TRUE(CreateConfigFromOptions(options, &config));
63   EXPECT_EQ(config.duration_ms(), 2 * 60 * 1000u);
64 }
65 
TEST_F(CreateConfigFromOptionsTest,Hours)66 TEST_F(CreateConfigFromOptionsTest, Hours) {
67   options.time = "2h";
68   ASSERT_TRUE(CreateConfigFromOptions(options, &config));
69   EXPECT_EQ(config.duration_ms(), 2 * 60 * 60 * 1000u);
70 }
71 
TEST_F(CreateConfigFromOptionsTest,ZeroBufferSize)72 TEST_F(CreateConfigFromOptionsTest, ZeroBufferSize) {
73   options.buffer_size = "0";
74   ASSERT_TRUE(CreateConfigFromOptions(options, &config));
75   EXPECT_EQ(config.buffers()[0].size_kb(), 0u);
76 }
77 
TEST_F(CreateConfigFromOptionsTest,Kilobyte)78 TEST_F(CreateConfigFromOptionsTest, Kilobyte) {
79   options.buffer_size = "2kb";
80   ASSERT_TRUE(CreateConfigFromOptions(options, &config));
81   EXPECT_EQ(config.buffers()[0].size_kb(), 2u);
82 }
83 
TEST_F(CreateConfigFromOptionsTest,Megabyte)84 TEST_F(CreateConfigFromOptionsTest, Megabyte) {
85   options.buffer_size = "2mb";
86   ASSERT_TRUE(CreateConfigFromOptions(options, &config));
87   EXPECT_EQ(config.buffers()[0].size_kb(), 2 * 1024u);
88 }
89 
TEST_F(CreateConfigFromOptionsTest,Gigabyte)90 TEST_F(CreateConfigFromOptionsTest, Gigabyte) {
91   options.buffer_size = "2gb";
92   ASSERT_TRUE(CreateConfigFromOptions(options, &config));
93   EXPECT_EQ(config.buffers()[0].size_kb(), 2 * 1024 * 1024u);
94 }
95 
TEST_F(CreateConfigFromOptionsTest,BadTrailingSpace)96 TEST_F(CreateConfigFromOptionsTest, BadTrailingSpace) {
97   options.buffer_size = "2gb ";
98   ASSERT_FALSE(CreateConfigFromOptions(options, &config));
99 }
100 
TEST_F(CreateConfigFromOptionsTest,UnmatchedUnit)101 TEST_F(CreateConfigFromOptionsTest, UnmatchedUnit) {
102   options.buffer_size = "2ly";
103   ASSERT_FALSE(CreateConfigFromOptions(options, &config));
104 }
105 
TEST_F(CreateConfigFromOptionsTest,OnlyNumber)106 TEST_F(CreateConfigFromOptionsTest, OnlyNumber) {
107   options.buffer_size = "2";
108   ASSERT_FALSE(CreateConfigFromOptions(options, &config));
109 }
110 
TEST_F(CreateConfigFromOptionsTest,OnlyUnit)111 TEST_F(CreateConfigFromOptionsTest, OnlyUnit) {
112   options.buffer_size = "kb";
113   ASSERT_FALSE(CreateConfigFromOptions(options, &config));
114 }
115 
TEST_F(CreateConfigFromOptionsTest,Empty)116 TEST_F(CreateConfigFromOptionsTest, Empty) {
117   options.buffer_size = "";
118   ASSERT_TRUE(CreateConfigFromOptions(options, &config));
119 }
120 
TEST_F(CreateConfigFromOptionsTest,InvalidTime)121 TEST_F(CreateConfigFromOptionsTest, InvalidTime) {
122   options.time = "2mb";
123   ASSERT_FALSE(CreateConfigFromOptions(options, &config));
124 }
125 
TEST_F(CreateConfigFromOptionsTest,InvalidSize)126 TEST_F(CreateConfigFromOptionsTest, InvalidSize) {
127   options.max_file_size = "2s";
128   ASSERT_FALSE(CreateConfigFromOptions(options, &config));
129 }
130 
TEST_F(CreateConfigFromOptionsTest,FullConfig)131 TEST_F(CreateConfigFromOptionsTest, FullConfig) {
132   options.buffer_size = "100mb";
133   options.max_file_size = "1gb";
134   options.time = "1h";
135   options.categories.push_back("sw");
136   options.categories.push_back("sched/sched_switch");
137   options.atrace_apps.push_back("com.android.chrome");
138   ASSERT_TRUE(CreateConfigFromOptions(options, &config));
139   EXPECT_EQ(config.duration_ms(), 60 * 60 * 1000u);
140   EXPECT_EQ(config.flush_period_ms(), 30 * 1000u);
141   EXPECT_EQ(config.max_file_size_bytes(), 1 * 1024 * 1024 * 1024u);
142   EXPECT_EQ(config.buffers()[0].size_kb(), 100 * 1024u);
143   EXPECT_EQ(config.data_sources()[0].config().name(), "linux.ftrace");
144   EXPECT_EQ(config.data_sources()[0].config().target_buffer(), 0u);
145 
146   protos::gen::FtraceConfig ftrace;
147   ASSERT_TRUE(ftrace.ParseFromString(
148       config.data_sources()[0].config().ftrace_config_raw()));
149   EXPECT_THAT(ftrace.ftrace_events(), Contains("sched/sched_switch"));
150   EXPECT_TRUE(ftrace.symbolize_ksyms());
151   EXPECT_THAT(ftrace.atrace_categories(), Contains("sw"));
152   EXPECT_THAT(ftrace.atrace_apps(), Contains("com.android.chrome"));
153 }
154 
TEST_F(CreateConfigFromOptionsTest,OnlyHypervisorTraces)155 TEST_F(CreateConfigFromOptionsTest, OnlyHypervisorTraces) {
156   options.buffer_size = "100mb";
157   options.time = "10s";
158   options.categories.push_back("hyp");
159   ASSERT_TRUE(CreateConfigFromOptions(options, &config));
160   EXPECT_EQ(config.duration_ms(), 10 * 1000u);
161   EXPECT_EQ(config.buffers()[0].size_kb(), 100 * 1024u);
162   EXPECT_EQ(config.data_sources()[0].config().name(), "linux.ftrace");
163   protos::gen::FtraceConfig ftrace;
164   ASSERT_TRUE(ftrace.ParseFromString(
165       config.data_sources()[0].config().ftrace_config_raw()));
166   EXPECT_THAT(ftrace.ftrace_events(), Contains("hyp/*"));
167   ASSERT_EQ(ftrace.instance_name(), "hyp");
168 }
169 
TEST_F(CreateConfigFromOptionsTest,BothHypervisorAndHostFtraceTraces)170 TEST_F(CreateConfigFromOptionsTest, BothHypervisorAndHostFtraceTraces) {
171   options.buffer_size = "100mb";
172   options.time = "10s";
173   options.categories.push_back("hyp");
174   options.categories.push_back("sw");
175   options.categories.push_back("sched/sched_switch");
176   ASSERT_TRUE(CreateConfigFromOptions(options, &config));
177   EXPECT_EQ(config.duration_ms(), 10 * 1000u);
178   EXPECT_EQ(config.buffers()[0].size_kb(), 100 * 1024u);
179   EXPECT_EQ(config.buffers()[0].size_kb(), 100 * 1024u);
180   EXPECT_EQ(config.data_sources()[0].config().name(), "linux.ftrace");
181   {
182     protos::gen::FtraceConfig ftrace;
183     ASSERT_TRUE(ftrace.ParseFromString(
184         config.data_sources()[0].config().ftrace_config_raw()));
185     EXPECT_THAT(ftrace.ftrace_events(), Contains("sched/sched_switch"));
186     EXPECT_THAT(ftrace.atrace_categories(), Contains("sw"));
187     EXPECT_TRUE(ftrace.symbolize_ksyms());
188   }
189   EXPECT_EQ(config.data_sources()[1].config().name(), "linux.ftrace");
190   {
191     protos::gen::FtraceConfig ftrace;
192     ASSERT_TRUE(ftrace.ParseFromString(
193         config.data_sources()[1].config().ftrace_config_raw()));
194     EXPECT_THAT(ftrace.ftrace_events(), Contains("hyp/*"));
195     ASSERT_EQ(ftrace.instance_name(), "hyp");
196   }
197 }
198 
199 }  // namespace
200 }  // namespace perfetto
201