blob: ff6d202315626a8ec215fea5ac0a3bc22de12541 [file] [log] [blame]
Christopher Ferris626efb72016-02-23 18:02:20 -08001/*
2 * Copyright (C) 2016 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 <sys/types.h>
18#include <unistd.h>
19
20#include <memory>
21#include <string>
22
23#include <android-base/file.h>
24#include <android-base/stringprintf.h>
Christopher Ferris626efb72016-02-23 18:02:20 -080025#include <gtest/gtest.h>
26
Elliott Hughes8e9aeb92017-11-10 10:22:07 -080027#include "../trace-dev.cpp"
Christopher Ferris626efb72016-02-23 18:02:20 -080028
29class TraceDevTest : public ::testing::Test {
30 protected:
31 void SetUp() override {
32 lseek(tmp_file_.fd, 0, SEEK_SET);
33 atrace_marker_fd = tmp_file_.fd;
34 }
35
36 void TearDown() override {
37 atrace_marker_fd = -1;
38 }
39
40 TemporaryFile tmp_file_;
41
42 static std::string MakeName(size_t length) {
43 std::string name;
44 for (size_t i = 0; i < length; i++) {
45 name += '0' + (i % 10);
46 }
47 return name;
48 }
49};
50
51TEST_F(TraceDevTest, atrace_begin_body_normal) {
52 atrace_begin_body("fake_name");
53
54 ASSERT_EQ(0, lseek(atrace_marker_fd, 0, SEEK_SET));
55
56 std::string actual;
57 ASSERT_TRUE(android::base::ReadFdToString(atrace_marker_fd, &actual));
58 std::string expected = android::base::StringPrintf("B|%d|fake_name", getpid());
59 ASSERT_STREQ(expected.c_str(), actual.c_str());
60}
61
62TEST_F(TraceDevTest, atrace_begin_body_exact) {
63 std::string expected = android::base::StringPrintf("B|%d|", getpid());
64 std::string name = MakeName(ATRACE_MESSAGE_LENGTH - expected.length() - 1);
65 atrace_begin_body(name.c_str());
66
67 ASSERT_EQ(ATRACE_MESSAGE_LENGTH - 1, lseek(atrace_marker_fd, 0, SEEK_CUR));
68 ASSERT_EQ(0, lseek(atrace_marker_fd, 0, SEEK_SET));
69
70 std::string actual;
71 ASSERT_TRUE(android::base::ReadFdToString(atrace_marker_fd, &actual));
72 expected += name;
73 ASSERT_STREQ(expected.c_str(), actual.c_str());
74
75 // Add a single character and verify we get the exact same value as before.
76 ASSERT_EQ(0, lseek(atrace_marker_fd, 0, SEEK_SET));
77 name += '*';
78 atrace_begin_body(name.c_str());
79 EXPECT_EQ(ATRACE_MESSAGE_LENGTH - 1, lseek(atrace_marker_fd, 0, SEEK_CUR));
80 ASSERT_EQ(0, lseek(atrace_marker_fd, 0, SEEK_SET));
81 ASSERT_TRUE(android::base::ReadFdToString(atrace_marker_fd, &actual));
82 ASSERT_STREQ(expected.c_str(), actual.c_str());
83}
84
85TEST_F(TraceDevTest, atrace_begin_body_truncated) {
86 std::string expected = android::base::StringPrintf("B|%d|", getpid());
87 std::string name = MakeName(2 * ATRACE_MESSAGE_LENGTH);
88 atrace_begin_body(name.c_str());
89
90 ASSERT_EQ(ATRACE_MESSAGE_LENGTH - 1, lseek(atrace_marker_fd, 0, SEEK_CUR));
91 ASSERT_EQ(0, lseek(atrace_marker_fd, 0, SEEK_SET));
92
93 std::string actual;
94 ASSERT_TRUE(android::base::ReadFdToString(atrace_marker_fd, &actual));
95 int expected_len = ATRACE_MESSAGE_LENGTH - expected.length() - 1;
96 expected += android::base::StringPrintf("%.*s", expected_len, name.c_str());
97 ASSERT_STREQ(expected.c_str(), actual.c_str());
98}
99
100TEST_F(TraceDevTest, atrace_async_begin_body_normal) {
101 atrace_async_begin_body("fake_name", 12345);
102
103 ASSERT_EQ(0, lseek(atrace_marker_fd, 0, SEEK_SET));
104
105 std::string actual;
106 ASSERT_TRUE(android::base::ReadFdToString(atrace_marker_fd, &actual));
107 std::string expected = android::base::StringPrintf("S|%d|fake_name|12345", getpid());
108 ASSERT_STREQ(expected.c_str(), actual.c_str());
109}
110
111TEST_F(TraceDevTest, atrace_async_begin_body_exact) {
112 std::string expected = android::base::StringPrintf("S|%d|", getpid());
113 std::string name = MakeName(ATRACE_MESSAGE_LENGTH - expected.length() - 7);
114 atrace_async_begin_body(name.c_str(), 12345);
115
116 ASSERT_EQ(ATRACE_MESSAGE_LENGTH - 1, lseek(atrace_marker_fd, 0, SEEK_CUR));
117 ASSERT_EQ(0, lseek(atrace_marker_fd, 0, SEEK_SET));
118
119 std::string actual;
120 ASSERT_TRUE(android::base::ReadFdToString(atrace_marker_fd, &actual));
121 expected += name + "|12345";
122 ASSERT_STREQ(expected.c_str(), actual.c_str());
123
124 // Add a single character and verify we get the exact same value as before.
125 ASSERT_EQ(0, lseek(atrace_marker_fd, 0, SEEK_SET));
126 name += '*';
127 atrace_async_begin_body(name.c_str(), 12345);
128 EXPECT_EQ(ATRACE_MESSAGE_LENGTH - 1, lseek(atrace_marker_fd, 0, SEEK_CUR));
129 ASSERT_EQ(0, lseek(atrace_marker_fd, 0, SEEK_SET));
130 ASSERT_TRUE(android::base::ReadFdToString(atrace_marker_fd, &actual));
131 ASSERT_STREQ(expected.c_str(), actual.c_str());
132}
133
134TEST_F(TraceDevTest, atrace_async_begin_body_truncated) {
135 std::string expected = android::base::StringPrintf("S|%d|", getpid());
136 std::string name = MakeName(2 * ATRACE_MESSAGE_LENGTH);
137 atrace_async_begin_body(name.c_str(), 12345);
138
139 ASSERT_EQ(ATRACE_MESSAGE_LENGTH - 1, lseek(atrace_marker_fd, 0, SEEK_CUR));
140 ASSERT_EQ(0, lseek(atrace_marker_fd, 0, SEEK_SET));
141
142 std::string actual;
143 ASSERT_TRUE(android::base::ReadFdToString(atrace_marker_fd, &actual));
144 int expected_len = ATRACE_MESSAGE_LENGTH - expected.length() - 7;
145 expected += android::base::StringPrintf("%.*s|12345", expected_len, name.c_str());
146 ASSERT_STREQ(expected.c_str(), actual.c_str());
147}
148
149TEST_F(TraceDevTest, atrace_async_end_body_normal) {
150 atrace_async_end_body("fake_name", 12345);
151
152 ASSERT_EQ(0, lseek(atrace_marker_fd, 0, SEEK_SET));
153
154 std::string actual;
155 ASSERT_TRUE(android::base::ReadFdToString(atrace_marker_fd, &actual));
156 std::string expected = android::base::StringPrintf("F|%d|fake_name|12345", getpid());
157 ASSERT_STREQ(expected.c_str(), actual.c_str());
158}
159
160TEST_F(TraceDevTest, atrace_async_end_body_exact) {
161 std::string expected = android::base::StringPrintf("F|%d|", getpid());
162 std::string name = MakeName(ATRACE_MESSAGE_LENGTH - expected.length() - 7);
163 atrace_async_end_body(name.c_str(), 12345);
164
165 ASSERT_EQ(ATRACE_MESSAGE_LENGTH - 1, lseek(atrace_marker_fd, 0, SEEK_CUR));
166 ASSERT_EQ(0, lseek(atrace_marker_fd, 0, SEEK_SET));
167
168 std::string actual;
169 ASSERT_TRUE(android::base::ReadFdToString(atrace_marker_fd, &actual));
170 expected += name + "|12345";
171 ASSERT_STREQ(expected.c_str(), actual.c_str());
172
173 // Add a single character and verify we get the exact same value as before.
174 ASSERT_EQ(0, lseek(atrace_marker_fd, 0, SEEK_SET));
175 name += '*';
176 atrace_async_end_body(name.c_str(), 12345);
177 EXPECT_EQ(ATRACE_MESSAGE_LENGTH - 1, lseek(atrace_marker_fd, 0, SEEK_CUR));
178 ASSERT_EQ(0, lseek(atrace_marker_fd, 0, SEEK_SET));
179 ASSERT_TRUE(android::base::ReadFdToString(atrace_marker_fd, &actual));
180 ASSERT_STREQ(expected.c_str(), actual.c_str());
181}
182
183TEST_F(TraceDevTest, atrace_async_end_body_truncated) {
184 std::string expected = android::base::StringPrintf("F|%d|", getpid());
185 std::string name = MakeName(2 * ATRACE_MESSAGE_LENGTH);
186 atrace_async_end_body(name.c_str(), 12345);
187
188 ASSERT_EQ(ATRACE_MESSAGE_LENGTH - 1, lseek(atrace_marker_fd, 0, SEEK_CUR));
189 ASSERT_EQ(0, lseek(atrace_marker_fd, 0, SEEK_SET));
190
191 std::string actual;
192 ASSERT_TRUE(android::base::ReadFdToString(atrace_marker_fd, &actual));
193 int expected_len = ATRACE_MESSAGE_LENGTH - expected.length() - 7;
194 expected += android::base::StringPrintf("%.*s|12345", expected_len, name.c_str());
195 ASSERT_STREQ(expected.c_str(), actual.c_str());
196}
197
Lucas Dupin2c2c5d92021-12-08 16:37:22 -0800198TEST_F(TraceDevTest, atrace_instant_body_normal) {
199 atrace_instant_body("fake_name");
200
201 ASSERT_EQ(0, lseek(atrace_marker_fd, 0, SEEK_SET));
202
203 std::string actual;
204 ASSERT_TRUE(android::base::ReadFdToString(atrace_marker_fd, &actual));
205 std::string expected = android::base::StringPrintf("I|%d|fake_name", getpid());
206 ASSERT_STREQ(expected.c_str(), actual.c_str());
207}
208
209TEST_F(TraceDevTest, atrace_instant_body_exact) {
210 std::string expected = android::base::StringPrintf("I|%d|", getpid());
211 std::string name = MakeName(ATRACE_MESSAGE_LENGTH - expected.length() - 1);
212 atrace_instant_body(name.c_str());
213
214 ASSERT_EQ(ATRACE_MESSAGE_LENGTH - 1, lseek(atrace_marker_fd, 0, SEEK_CUR));
215 ASSERT_EQ(0, lseek(atrace_marker_fd, 0, SEEK_SET));
216
217 std::string actual;
218 ASSERT_TRUE(android::base::ReadFdToString(atrace_marker_fd, &actual));
219 expected += name;
220 ASSERT_STREQ(expected.c_str(), actual.c_str());
221
222 // Add a single character and verify we get the exact same value as before.
223 ASSERT_EQ(0, lseek(atrace_marker_fd, 0, SEEK_SET));
224 name += '*';
225 atrace_instant_body(name.c_str());
226 EXPECT_EQ(ATRACE_MESSAGE_LENGTH - 1, lseek(atrace_marker_fd, 0, SEEK_CUR));
227 ASSERT_EQ(0, lseek(atrace_marker_fd, 0, SEEK_SET));
228 ASSERT_TRUE(android::base::ReadFdToString(atrace_marker_fd, &actual));
229 ASSERT_STREQ(expected.c_str(), actual.c_str());
230}
231
232TEST_F(TraceDevTest, atrace_instant_body_truncated) {
233 std::string expected = android::base::StringPrintf("I|%d|", getpid());
234 std::string name = MakeName(2 * ATRACE_MESSAGE_LENGTH);
235 atrace_instant_body(name.c_str());
236
237 ASSERT_EQ(ATRACE_MESSAGE_LENGTH - 1, lseek(atrace_marker_fd, 0, SEEK_CUR));
238 ASSERT_EQ(0, lseek(atrace_marker_fd, 0, SEEK_SET));
239
240 std::string actual;
241 ASSERT_TRUE(android::base::ReadFdToString(atrace_marker_fd, &actual));
242 int expected_len = ATRACE_MESSAGE_LENGTH - expected.length() - 1;
243 expected += android::base::StringPrintf("%.*s", expected_len, name.c_str());
244 ASSERT_STREQ(expected.c_str(), actual.c_str());
245}
246
247TEST_F(TraceDevTest, atrace_instant_for_track_body_normal) {
248 atrace_instant_for_track_body("fake_track", "fake_name");
249
250 ASSERT_EQ(0, lseek(atrace_marker_fd, 0, SEEK_SET));
251
252 std::string actual;
253 ASSERT_TRUE(android::base::ReadFdToString(atrace_marker_fd, &actual));
254 std::string expected = android::base::StringPrintf("N|%d|fake_track|fake_name", getpid());
255 ASSERT_STREQ(expected.c_str(), actual.c_str());
256}
257
258TEST_F(TraceDevTest, atrace_instant_for_track_body_exact) {
259 const int nameSize = 5;
260 std::string expected = android::base::StringPrintf("N|%d|", getpid());
261 std::string trackName = MakeName(ATRACE_MESSAGE_LENGTH - expected.length() - 1 - nameSize);
262 atrace_instant_for_track_body(trackName.c_str(), "name");
263
264 ASSERT_EQ(ATRACE_MESSAGE_LENGTH - 1, lseek(atrace_marker_fd, 0, SEEK_CUR));
265 ASSERT_EQ(0, lseek(atrace_marker_fd, 0, SEEK_SET));
266
267 std::string actual;
268 ASSERT_TRUE(android::base::ReadFdToString(atrace_marker_fd, &actual));
269 expected += trackName + "|name";
270 ASSERT_STREQ(expected.c_str(), actual.c_str());
271
272 // Add a single character and verify we get the exact same value as before.
273 ASSERT_EQ(0, lseek(atrace_marker_fd, 0, SEEK_SET));
274 trackName += '*';
275 atrace_instant_for_track_body(trackName.c_str(), "name");
276 EXPECT_EQ(ATRACE_MESSAGE_LENGTH - 1, lseek(atrace_marker_fd, 0, SEEK_CUR));
277 ASSERT_EQ(0, lseek(atrace_marker_fd, 0, SEEK_SET));
278 ASSERT_TRUE(android::base::ReadFdToString(atrace_marker_fd, &actual));
279 ASSERT_STREQ(expected.c_str(), actual.c_str());
280}
281
282TEST_F(TraceDevTest, atrace_instant_for_track_body_truncated) {
283 const int nameSize = 5;
284 std::string expected = android::base::StringPrintf("N|%d|", getpid());
285 std::string trackName = MakeName(2 * ATRACE_MESSAGE_LENGTH);
286 atrace_instant_for_track_body(trackName.c_str(), "name");
287
288 ASSERT_EQ(ATRACE_MESSAGE_LENGTH - 1, lseek(atrace_marker_fd, 0, SEEK_CUR));
289 ASSERT_EQ(0, lseek(atrace_marker_fd, 0, SEEK_SET));
290
291 std::string actual;
292 ASSERT_TRUE(android::base::ReadFdToString(atrace_marker_fd, &actual));
293 int expected_len = ATRACE_MESSAGE_LENGTH - expected.length() - 1 - nameSize;
294 expected += android::base::StringPrintf("%.*s|name", expected_len, trackName.c_str());
295 ASSERT_STREQ(expected.c_str(), actual.c_str());
296}
297
Christopher Ferris626efb72016-02-23 18:02:20 -0800298TEST_F(TraceDevTest, atrace_int_body_normal) {
299 atrace_int_body("fake_name", 12345);
300
301 ASSERT_EQ(0, lseek(atrace_marker_fd, 0, SEEK_SET));
302
303 std::string actual;
304 ASSERT_TRUE(android::base::ReadFdToString(atrace_marker_fd, &actual));
305 std::string expected = android::base::StringPrintf("C|%d|fake_name|12345", getpid());
306 ASSERT_STREQ(expected.c_str(), actual.c_str());
307}
308
309TEST_F(TraceDevTest, atrace_int_body_exact) {
310 std::string expected = android::base::StringPrintf("C|%d|", getpid());
311 std::string name = MakeName(ATRACE_MESSAGE_LENGTH - expected.length() - 7);
312 atrace_int_body(name.c_str(), 12345);
313
314 ASSERT_EQ(ATRACE_MESSAGE_LENGTH - 1, lseek(atrace_marker_fd, 0, SEEK_CUR));
315 ASSERT_EQ(0, lseek(atrace_marker_fd, 0, SEEK_SET));
316
317 std::string actual;
318 ASSERT_TRUE(android::base::ReadFdToString(atrace_marker_fd, &actual));
319 expected += name + "|12345";
320 ASSERT_STREQ(expected.c_str(), actual.c_str());
321
322 // Add a single character and verify we get the exact same value as before.
323 ASSERT_EQ(0, lseek(atrace_marker_fd, 0, SEEK_SET));
324 name += '*';
325 atrace_int_body(name.c_str(), 12345);
326 EXPECT_EQ(ATRACE_MESSAGE_LENGTH - 1, lseek(atrace_marker_fd, 0, SEEK_CUR));
327 ASSERT_EQ(0, lseek(atrace_marker_fd, 0, SEEK_SET));
328 ASSERT_TRUE(android::base::ReadFdToString(atrace_marker_fd, &actual));
329 ASSERT_STREQ(expected.c_str(), actual.c_str());
330}
331
332TEST_F(TraceDevTest, atrace_int_body_truncated) {
333 std::string expected = android::base::StringPrintf("C|%d|", getpid());
334 std::string name = MakeName(2 * ATRACE_MESSAGE_LENGTH);
335 atrace_int_body(name.c_str(), 12345);
336
337 ASSERT_EQ(ATRACE_MESSAGE_LENGTH - 1, lseek(atrace_marker_fd, 0, SEEK_CUR));
338 ASSERT_EQ(0, lseek(atrace_marker_fd, 0, SEEK_SET));
339
340 std::string actual;
341 ASSERT_TRUE(android::base::ReadFdToString(atrace_marker_fd, &actual));
342 int expected_len = ATRACE_MESSAGE_LENGTH - expected.length() - 7;
343 expected += android::base::StringPrintf("%.*s|12345", expected_len, name.c_str());
344 ASSERT_STREQ(expected.c_str(), actual.c_str());
345}
346
347TEST_F(TraceDevTest, atrace_int64_body_normal) {
348 atrace_int64_body("fake_name", 17179869183L);
349
350 ASSERT_EQ(0, lseek(atrace_marker_fd, 0, SEEK_SET));
351
352 std::string actual;
353 ASSERT_TRUE(android::base::ReadFdToString(atrace_marker_fd, &actual));
354 std::string expected = android::base::StringPrintf("C|%d|fake_name|17179869183", getpid());
355 ASSERT_STREQ(expected.c_str(), actual.c_str());
356}
357
358TEST_F(TraceDevTest, atrace_int64_body_exact) {
359 std::string expected = android::base::StringPrintf("C|%d|", getpid());
360 std::string name = MakeName(ATRACE_MESSAGE_LENGTH - expected.length() - 13);
361 atrace_int64_body(name.c_str(), 17179869183L);
362
363 ASSERT_EQ(ATRACE_MESSAGE_LENGTH - 1, lseek(atrace_marker_fd, 0, SEEK_CUR));
364 ASSERT_EQ(0, lseek(atrace_marker_fd, 0, SEEK_SET));
365
366 std::string actual;
367 ASSERT_TRUE(android::base::ReadFdToString(atrace_marker_fd, &actual));
368 expected += name + "|17179869183";
369 ASSERT_STREQ(expected.c_str(), actual.c_str());
370
371 // Add a single character and verify we get the exact same value as before.
372 ASSERT_EQ(0, lseek(atrace_marker_fd, 0, SEEK_SET));
373 name += '*';
374 atrace_int64_body(name.c_str(), 17179869183L);
375 EXPECT_EQ(ATRACE_MESSAGE_LENGTH - 1, lseek(atrace_marker_fd, 0, SEEK_CUR));
376 ASSERT_EQ(0, lseek(atrace_marker_fd, 0, SEEK_SET));
377 ASSERT_TRUE(android::base::ReadFdToString(atrace_marker_fd, &actual));
378 ASSERT_STREQ(expected.c_str(), actual.c_str());
379}
380
381TEST_F(TraceDevTest, atrace_int64_body_truncated) {
382 std::string expected = android::base::StringPrintf("C|%d|", getpid());
383 std::string name = MakeName(2 * ATRACE_MESSAGE_LENGTH);
384 atrace_int64_body(name.c_str(), 17179869183L);
385
386 ASSERT_EQ(ATRACE_MESSAGE_LENGTH - 1, lseek(atrace_marker_fd, 0, SEEK_CUR));
387 ASSERT_EQ(0, lseek(atrace_marker_fd, 0, SEEK_SET));
388
389 std::string actual;
390 ASSERT_TRUE(android::base::ReadFdToString(atrace_marker_fd, &actual));
391 int expected_len = ATRACE_MESSAGE_LENGTH - expected.length() - 13;
392 expected += android::base::StringPrintf("%.*s|17179869183", expected_len, name.c_str());
393 ASSERT_STREQ(expected.c_str(), actual.c_str());
394}