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