xref: /aosp_15_r20/external/perfetto/src/tracing/service/packet_stream_validator_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/tracing/service/packet_stream_validator.h"
18 
19 #include <string>
20 
21 #include "protos/perfetto/trace/ftrace/ftrace_event.gen.h"
22 #include "protos/perfetto/trace/ftrace/ftrace_event_bundle.gen.h"
23 #include "protos/perfetto/trace/ftrace/sched.gen.h"
24 #include "protos/perfetto/trace/test_event.gen.h"
25 #include "protos/perfetto/trace/trace_packet.gen.h"
26 #include "test/gtest_and_gmock.h"
27 
28 namespace perfetto {
29 namespace {
30 
TEST(PacketStreamValidatorTest,NullPacket)31 TEST(PacketStreamValidatorTest, NullPacket) {
32   std::string ser_buf;
33   Slices seq;
34   EXPECT_TRUE(PacketStreamValidator::Validate(seq));
35 }
36 
TEST(PacketStreamValidatorTest,SimplePacket)37 TEST(PacketStreamValidatorTest, SimplePacket) {
38   protos::gen::TracePacket proto;
39   proto.mutable_for_testing()->set_str("string field");
40   std::string ser_buf = proto.SerializeAsString();
41 
42   Slices seq;
43   seq.emplace_back(&ser_buf[0], ser_buf.size());
44   EXPECT_TRUE(PacketStreamValidator::Validate(seq));
45 }
46 
TEST(PacketStreamValidatorTest,ComplexPacket)47 TEST(PacketStreamValidatorTest, ComplexPacket) {
48   protos::gen::TracePacket proto;
49   proto.mutable_for_testing()->set_str("string field");
50   proto.mutable_ftrace_events()->set_cpu(0);
51   auto* ft = proto.mutable_ftrace_events()->add_event();
52   ft->set_pid(42);
53   ft->mutable_sched_switch()->set_prev_comm("tom");
54   ft->mutable_sched_switch()->set_prev_pid(123);
55   ft->mutable_sched_switch()->set_next_comm("jerry");
56   ft->mutable_sched_switch()->set_next_pid(456);
57   std::string ser_buf = proto.SerializeAsString();
58 
59   Slices seq;
60   seq.emplace_back(&ser_buf[0], ser_buf.size());
61   EXPECT_TRUE(PacketStreamValidator::Validate(seq));
62 }
63 
TEST(PacketStreamValidatorTest,SimplePacketWithUid)64 TEST(PacketStreamValidatorTest, SimplePacketWithUid) {
65   protos::gen::TracePacket proto;
66   proto.set_trusted_uid(123);
67   std::string ser_buf = proto.SerializeAsString();
68 
69   Slices seq;
70   seq.emplace_back(&ser_buf[0], ser_buf.size());
71   EXPECT_FALSE(PacketStreamValidator::Validate(seq));
72 }
73 
TEST(PacketStreamValidatorTest,SimplePacketWithZeroUid)74 TEST(PacketStreamValidatorTest, SimplePacketWithZeroUid) {
75   protos::gen::TracePacket proto;
76   proto.set_trusted_uid(0);
77   std::string ser_buf = proto.SerializeAsString();
78 
79   Slices seq;
80   seq.emplace_back(&ser_buf[0], ser_buf.size());
81   EXPECT_FALSE(PacketStreamValidator::Validate(seq));
82 }
83 
TEST(PacketStreamValidatorTest,SimplePacketWithNegativeOneUid)84 TEST(PacketStreamValidatorTest, SimplePacketWithNegativeOneUid) {
85   protos::gen::TracePacket proto;
86   proto.set_trusted_uid(-1);
87   std::string ser_buf = proto.SerializeAsString();
88 
89   Slices seq;
90   seq.emplace_back(&ser_buf[0], ser_buf.size());
91   EXPECT_FALSE(PacketStreamValidator::Validate(seq));
92 }
93 
TEST(PacketStreamValidatorTest,ComplexPacketWithUid)94 TEST(PacketStreamValidatorTest, ComplexPacketWithUid) {
95   protos::gen::TracePacket proto;
96   proto.mutable_for_testing()->set_str("string field");
97   proto.mutable_ftrace_events()->set_cpu(0);
98   auto* ft = proto.mutable_ftrace_events()->add_event();
99   ft->set_pid(42);
100   ft->mutable_sched_switch()->set_prev_comm("tom");
101   ft->mutable_sched_switch()->set_prev_pid(123);
102   ft->mutable_sched_switch()->set_next_comm("jerry");
103   ft->mutable_sched_switch()->set_next_pid(456);
104   proto.set_trusted_uid(123);
105   std::string ser_buf = proto.SerializeAsString();
106 
107   Slices seq;
108   seq.emplace_back(&ser_buf[0], ser_buf.size());
109   EXPECT_FALSE(PacketStreamValidator::Validate(seq));
110 }
111 
TEST(PacketStreamValidatorTest,FragmentedPacket)112 TEST(PacketStreamValidatorTest, FragmentedPacket) {
113   protos::gen::TracePacket proto;
114   proto.mutable_for_testing()->set_str("string field");
115   proto.mutable_ftrace_events()->set_cpu(0);
116   auto* ft = proto.mutable_ftrace_events()->add_event();
117   ft->set_pid(42);
118   ft->mutable_sched_switch()->set_prev_comm("tom");
119   ft->mutable_sched_switch()->set_prev_pid(123);
120   ft->mutable_sched_switch()->set_next_comm("jerry");
121   ft->mutable_sched_switch()->set_next_pid(456);
122   std::string ser_buf = proto.SerializeAsString();
123 
124   for (size_t i = 0; i < ser_buf.size(); i++) {
125     Slices seq;
126     seq.emplace_back(&ser_buf[0], i);
127     seq.emplace_back(&ser_buf[i], ser_buf.size() - i);
128     EXPECT_TRUE(PacketStreamValidator::Validate(seq));
129   }
130 }
131 
TEST(PacketStreamValidatorTest,FragmentedPacketWithUid)132 TEST(PacketStreamValidatorTest, FragmentedPacketWithUid) {
133   protos::gen::TracePacket proto;
134   proto.mutable_for_testing()->set_str("string field");
135   proto.set_trusted_uid(123);
136   proto.mutable_ftrace_events()->set_cpu(0);
137   auto* ft = proto.mutable_ftrace_events()->add_event();
138   ft->set_pid(42);
139   ft->mutable_sched_switch()->set_prev_comm("tom");
140   ft->mutable_sched_switch()->set_prev_pid(123);
141   ft->mutable_sched_switch()->set_next_comm("jerry");
142   ft->mutable_sched_switch()->set_next_pid(456);
143   proto.mutable_for_testing()->set_str("foo");
144   std::string ser_buf = proto.SerializeAsString();
145 
146   for (size_t i = 0; i < ser_buf.size(); i++) {
147     Slices seq;
148     seq.emplace_back(&ser_buf[0], i);
149     seq.emplace_back(&ser_buf[i], ser_buf.size() - i);
150     EXPECT_FALSE(PacketStreamValidator::Validate(seq));
151   }
152 }
153 
TEST(PacketStreamValidatorTest,SimplePacketWithPid)154 TEST(PacketStreamValidatorTest, SimplePacketWithPid) {
155   protos::gen::TracePacket proto;
156   proto.set_trusted_pid(123);
157   std::string ser_buf = proto.SerializeAsString();
158 
159   Slices seq;
160   seq.emplace_back(&ser_buf[0], ser_buf.size());
161   EXPECT_FALSE(PacketStreamValidator::Validate(seq));
162 }
163 
TEST(PacketStreamValidatorTest,SimplePacketWithZeroPid)164 TEST(PacketStreamValidatorTest, SimplePacketWithZeroPid) {
165   protos::gen::TracePacket proto;
166   proto.set_trusted_pid(0);
167   std::string ser_buf = proto.SerializeAsString();
168 
169   Slices seq;
170   seq.emplace_back(&ser_buf[0], ser_buf.size());
171   EXPECT_FALSE(PacketStreamValidator::Validate(seq));
172 }
173 
TEST(PacketStreamValidatorTest,SimplePacketWithNegativeOnePid)174 TEST(PacketStreamValidatorTest, SimplePacketWithNegativeOnePid) {
175   protos::gen::TracePacket proto;
176   proto.set_trusted_pid(-1);
177   std::string ser_buf = proto.SerializeAsString();
178 
179   Slices seq;
180   seq.emplace_back(&ser_buf[0], ser_buf.size());
181   EXPECT_FALSE(PacketStreamValidator::Validate(seq));
182 }
183 
TEST(PacketStreamValidatorTest,SimplePacketWithMachineID)184 TEST(PacketStreamValidatorTest, SimplePacketWithMachineID) {
185   protos::gen::TracePacket proto;
186   proto.set_machine_id(123);
187   std::string ser_buf = proto.SerializeAsString();
188 
189   Slices seq;
190   seq.emplace_back(&ser_buf[0], ser_buf.size());
191   EXPECT_FALSE(PacketStreamValidator::Validate(seq));
192 }
193 
TEST(PacketStreamValidatorTest,SimplePacketWithZeroMachineID)194 TEST(PacketStreamValidatorTest, SimplePacketWithZeroMachineID) {
195   protos::gen::TracePacket proto;
196   proto.set_machine_id(0);
197   std::string ser_buf = proto.SerializeAsString();
198 
199   Slices seq;
200   seq.emplace_back(&ser_buf[0], ser_buf.size());
201   EXPECT_FALSE(PacketStreamValidator::Validate(seq));
202 }
203 
TEST(PacketStreamValidatorTest,ComplexPacketWithPid)204 TEST(PacketStreamValidatorTest, ComplexPacketWithPid) {
205   protos::gen::TracePacket proto;
206   proto.mutable_for_testing()->set_str("string field");
207   proto.mutable_ftrace_events()->set_cpu(0);
208   auto* ft = proto.mutable_ftrace_events()->add_event();
209   ft->set_pid(42);
210   ft->mutable_sched_switch()->set_prev_comm("tom");
211   ft->mutable_sched_switch()->set_prev_pid(123);
212   ft->mutable_sched_switch()->set_next_comm("jerry");
213   ft->mutable_sched_switch()->set_next_pid(456);
214   proto.set_trusted_pid(123);
215   std::string ser_buf = proto.SerializeAsString();
216 
217   Slices seq;
218   seq.emplace_back(&ser_buf[0], ser_buf.size());
219   EXPECT_FALSE(PacketStreamValidator::Validate(seq));
220 }
221 
TEST(PacketStreamValidatorTest,FragmentedPacketWithPid)222 TEST(PacketStreamValidatorTest, FragmentedPacketWithPid) {
223   protos::gen::TracePacket proto;
224   proto.mutable_for_testing()->set_str("string field");
225   proto.set_trusted_pid(123);
226   proto.mutable_ftrace_events()->set_cpu(0);
227   auto* ft = proto.mutable_ftrace_events()->add_event();
228   ft->set_pid(42);
229   ft->mutable_sched_switch()->set_prev_comm("tom");
230   ft->mutable_sched_switch()->set_prev_pid(123);
231   ft->mutable_sched_switch()->set_next_comm("jerry");
232   ft->mutable_sched_switch()->set_next_pid(456);
233   proto.mutable_for_testing()->set_str("foo");
234   std::string ser_buf = proto.SerializeAsString();
235 
236   for (size_t i = 0; i < ser_buf.size(); i++) {
237     Slices seq;
238     seq.emplace_back(&ser_buf[0], i);
239     seq.emplace_back(&ser_buf[i], ser_buf.size() - i);
240     EXPECT_FALSE(PacketStreamValidator::Validate(seq));
241   }
242 }
243 
TEST(PacketStreamValidatorTest,TruncatedPacket)244 TEST(PacketStreamValidatorTest, TruncatedPacket) {
245   protos::gen::TracePacket proto;
246   proto.mutable_for_testing()->set_str("string field");
247   std::string ser_buf = proto.SerializeAsString();
248 
249   for (size_t i = 1; i < ser_buf.size(); i++) {
250     Slices seq;
251     seq.emplace_back(&ser_buf[0], i);
252     EXPECT_FALSE(PacketStreamValidator::Validate(seq));
253   }
254 }
255 
TEST(PacketStreamValidatorTest,TrailingGarbage)256 TEST(PacketStreamValidatorTest, TrailingGarbage) {
257   protos::gen::TracePacket proto;
258   proto.mutable_for_testing()->set_str("string field");
259   std::string ser_buf = proto.SerializeAsString();
260   ser_buf += "bike is short for bichael";
261 
262   Slices seq;
263   seq.emplace_back(&ser_buf[0], ser_buf.size());
264   EXPECT_FALSE(PacketStreamValidator::Validate(seq));
265 }
266 
267 }  // namespace
268 }  // namespace perfetto
269