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