1 /*
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>
25 #include <gtest/gtest.h>
26
27 #include "../trace-dev.cpp"
28
29 class TraceDevTest : public ::testing::Test {
30 protected:
SetUp()31 void SetUp() override {
32 lseek(tmp_file_.fd, 0, SEEK_SET);
33 atrace_marker_fd = tmp_file_.fd;
34 }
35
TearDown()36 void TearDown() override {
37 atrace_marker_fd = -1;
38 }
39
40 TemporaryFile tmp_file_;
41
MakeName(size_t length)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
TEST_F(TraceDevTest,atrace_begin_body_normal)51 TEST_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
TEST_F(TraceDevTest,atrace_begin_body_exact)62 TEST_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
TEST_F(TraceDevTest,atrace_begin_body_truncated)85 TEST_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
TEST_F(TraceDevTest,atrace_async_begin_body_normal)100 TEST_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
TEST_F(TraceDevTest,atrace_async_begin_body_exact)111 TEST_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
TEST_F(TraceDevTest,atrace_async_begin_body_truncated)134 TEST_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
TEST_F(TraceDevTest,atrace_async_end_body_normal)149 TEST_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
TEST_F(TraceDevTest,atrace_async_end_body_exact)160 TEST_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
TEST_F(TraceDevTest,atrace_async_end_body_truncated)183 TEST_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
TEST_F(TraceDevTest,atrace_int_body_normal)198 TEST_F(TraceDevTest, atrace_int_body_normal) {
199 atrace_int_body("fake_name", 12345);
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("C|%d|fake_name|12345", getpid());
206 ASSERT_STREQ(expected.c_str(), actual.c_str());
207 }
208
TEST_F(TraceDevTest,atrace_int_body_exact)209 TEST_F(TraceDevTest, atrace_int_body_exact) {
210 std::string expected = android::base::StringPrintf("C|%d|", getpid());
211 std::string name = MakeName(ATRACE_MESSAGE_LENGTH - expected.length() - 7);
212 atrace_int_body(name.c_str(), 12345);
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 + "|12345";
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_int_body(name.c_str(), 12345);
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
TEST_F(TraceDevTest,atrace_int_body_truncated)232 TEST_F(TraceDevTest, atrace_int_body_truncated) {
233 std::string expected = android::base::StringPrintf("C|%d|", getpid());
234 std::string name = MakeName(2 * ATRACE_MESSAGE_LENGTH);
235 atrace_int_body(name.c_str(), 12345);
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() - 7;
243 expected += android::base::StringPrintf("%.*s|12345", expected_len, name.c_str());
244 ASSERT_STREQ(expected.c_str(), actual.c_str());
245 }
246
TEST_F(TraceDevTest,atrace_int64_body_normal)247 TEST_F(TraceDevTest, atrace_int64_body_normal) {
248 atrace_int64_body("fake_name", 17179869183L);
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("C|%d|fake_name|17179869183", getpid());
255 ASSERT_STREQ(expected.c_str(), actual.c_str());
256 }
257
TEST_F(TraceDevTest,atrace_int64_body_exact)258 TEST_F(TraceDevTest, atrace_int64_body_exact) {
259 std::string expected = android::base::StringPrintf("C|%d|", getpid());
260 std::string name = MakeName(ATRACE_MESSAGE_LENGTH - expected.length() - 13);
261 atrace_int64_body(name.c_str(), 17179869183L);
262
263 ASSERT_EQ(ATRACE_MESSAGE_LENGTH - 1, lseek(atrace_marker_fd, 0, SEEK_CUR));
264 ASSERT_EQ(0, lseek(atrace_marker_fd, 0, SEEK_SET));
265
266 std::string actual;
267 ASSERT_TRUE(android::base::ReadFdToString(atrace_marker_fd, &actual));
268 expected += name + "|17179869183";
269 ASSERT_STREQ(expected.c_str(), actual.c_str());
270
271 // Add a single character and verify we get the exact same value as before.
272 ASSERT_EQ(0, lseek(atrace_marker_fd, 0, SEEK_SET));
273 name += '*';
274 atrace_int64_body(name.c_str(), 17179869183L);
275 EXPECT_EQ(ATRACE_MESSAGE_LENGTH - 1, lseek(atrace_marker_fd, 0, SEEK_CUR));
276 ASSERT_EQ(0, lseek(atrace_marker_fd, 0, SEEK_SET));
277 ASSERT_TRUE(android::base::ReadFdToString(atrace_marker_fd, &actual));
278 ASSERT_STREQ(expected.c_str(), actual.c_str());
279 }
280
TEST_F(TraceDevTest,atrace_int64_body_truncated)281 TEST_F(TraceDevTest, atrace_int64_body_truncated) {
282 std::string expected = android::base::StringPrintf("C|%d|", getpid());
283 std::string name = MakeName(2 * ATRACE_MESSAGE_LENGTH);
284 atrace_int64_body(name.c_str(), 17179869183L);
285
286 ASSERT_EQ(ATRACE_MESSAGE_LENGTH - 1, lseek(atrace_marker_fd, 0, SEEK_CUR));
287 ASSERT_EQ(0, lseek(atrace_marker_fd, 0, SEEK_SET));
288
289 std::string actual;
290 ASSERT_TRUE(android::base::ReadFdToString(atrace_marker_fd, &actual));
291 int expected_len = ATRACE_MESSAGE_LENGTH - expected.length() - 13;
292 expected += android::base::StringPrintf("%.*s|17179869183", expected_len, name.c_str());
293 ASSERT_STREQ(expected.c_str(), actual.c_str());
294 }
295