blob: c45e8ceca96929328e36ae0780a21bea0f5c7474 [file] [log] [blame]
Mark Salyzynfee2b002014-02-28 13:44:12 -08001/*
2 * Copyright (C) 2014 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
Mark Salyzyn9b9ee4e2017-04-27 14:46:31 -070017#include <ctype.h>
Christopher Ferrisbdd4a202021-08-10 18:33:02 -070018#include <errno.h>
Mark Salyzynfee2b002014-02-28 13:44:12 -080019#include <fcntl.h>
Mark Salyzynb1c45ec2016-01-21 10:59:25 -080020#include <inttypes.h>
Mark Salyzync05baf02014-04-18 14:49:28 -070021#include <poll.h>
Mark Salyzynfee2b002014-02-28 13:44:12 -080022#include <signal.h>
23#include <stdio.h>
24#include <string.h>
Mark Salyzynec9b9ad2017-01-03 14:00:19 -080025#include <sys/stat.h>
Mark Salyzyn65059532017-03-10 14:31:54 -080026#include <sys/types.h>
Mark Salyzynec9b9ad2017-01-03 14:00:19 -080027#include <unistd.h>
Mark Salyzynfee2b002014-02-28 13:44:12 -080028
Mark Salyzynb1c45ec2016-01-21 10:59:25 -080029#include <string>
30
Mark Salyzyn9b9ee4e2017-04-27 14:46:31 -070031#include <android-base/file.h>
Mark Salyzyn071f4692016-11-03 10:29:23 -070032#include <android-base/macros.h>
Mark Salyzynb1c45ec2016-01-21 10:59:25 -080033#include <android-base/stringprintf.h>
Tom Cherryf2248082020-08-07 10:27:37 -070034#include <android-base/unique_fd.h>
Mark Salyzynb1c45ec2016-01-21 10:59:25 -080035#include <cutils/sockets.h>
Tom Cherry5fe06cb2020-05-01 15:34:47 -070036#include <gtest/gtest-death-test.h>
Mark Salyzyn224b86f2016-09-28 15:54:45 -070037#include <gtest/gtest.h>
Tom Cherry1e2ebe32020-04-17 09:38:55 -070038#include <log/log_read.h>
Mark Salyzynec9b9ad2017-01-03 14:00:19 -080039#include <private/android_filesystem_config.h>
Mark Salyzynd4a4e422017-05-04 10:25:13 -070040#include <private/android_logger.h>
Mark Salyzynec9b9ad2017-01-03 14:00:19 -080041#ifdef __ANDROID__
42#include <selinux/selinux.h>
43#endif
Mark Salyzynfee2b002014-02-28 13:44:12 -080044
Elliott Hughesf74e39e2020-08-20 15:40:57 -070045#include "LogUtils.h" // For LOGD_SNDTIMEO.
Mark Salyzyn2296d332016-02-23 08:55:43 -080046
Tom Cherryf2248082020-08-07 10:27:37 -070047using android::base::unique_fd;
48
Mark Salyzyn8799bd82016-12-27 13:30:03 -080049#ifdef __ANDROID__
Christopher Ferrisbdd4a202021-08-10 18:33:02 -070050static bool write_command(int sock, const char* command) {
51 // The command sent to logd must include the '\0' character at the end.
52 size_t command_length = strlen(command) + 1;
53 ssize_t bytes_written = TEMP_FAILURE_RETRY(write(sock, command, command_length));
54 if (bytes_written != static_cast<ssize_t>(command_length)) {
55 if (bytes_written == -1) {
56 printf("Failed to send '%s' command: %s\n", command, strerror(errno));
57 } else {
58 printf("Failed to send '%s' command: bytes written %zd, expected written %zu\n",
59 command, bytes_written, command_length);
Mark Salyzynfee2b002014-02-28 13:44:12 -080060 }
Christopher Ferrisbdd4a202021-08-10 18:33:02 -070061 return false;
Mark Salyzynfee2b002014-02-28 13:44:12 -080062 }
Christopher Ferrisbdd4a202021-08-10 18:33:02 -070063 return true;
Mark Salyzynfee2b002014-02-28 13:44:12 -080064}
65
Christopher Ferrisbdd4a202021-08-10 18:33:02 -070066static bool write_command(int sock, const std::string& command) {
67 return write_command(sock, command.c_str());
Mark Salyzyn9472b4d2016-09-12 14:51:54 -070068}
69
Christopher Ferrisbdd4a202021-08-10 18:33:02 -070070static void send_to_control(const char* command, std::string& result) {
71 unique_fd sock(socket_local_client("logd", ANDROID_SOCKET_NAMESPACE_RESERVED, SOCK_STREAM));
72 ASSERT_LT(0, sock) << "Failed to open logd: " << strerror(errno);
73 ASSERT_TRUE(write_command(sock, command));
74 result.clear();
75 while (true) {
76 struct pollfd p = {.fd = sock, .events = POLLIN, .revents = 0};
77 // Timeout after 20 seconds.
78 int ret = TEMP_FAILURE_RETRY(poll(&p, 1, 20000));
79 ASSERT_TRUE(ret != -1) << "Poll call failed for command '" << command
80 << "': " << strerror(errno);
81 ASSERT_NE(0, ret) << "Timeout sending command '" << command << "'";
82 ASSERT_TRUE(p.revents & POLLIN)
83 << "Command socket not readable for command '" << command << "'";
Mark Salyzynfee2b002014-02-28 13:44:12 -080084
Christopher Ferrisbdd4a202021-08-10 18:33:02 -070085 char buffer[256];
86 ssize_t bytes_read = TEMP_FAILURE_RETRY(read(sock, buffer, sizeof(buffer)));
87 ASSERT_GE(bytes_read, 0) << "Read failed for command '" << command
88 << "': " << strerror(errno);
89 result += std::string(buffer, bytes_read);
90 if (bytes_read == 0 || static_cast<size_t>(bytes_read) < sizeof(buffer)) {
91 return;
Mark Salyzynfee2b002014-02-28 13:44:12 -080092 }
Mark Salyzynfee2b002014-02-28 13:44:12 -080093 }
Mark Salyzynfee2b002014-02-28 13:44:12 -080094}
Mark Salyzyn8799bd82016-12-27 13:30:03 -080095#endif
Mark Salyzynfee2b002014-02-28 13:44:12 -080096
Tom Cherry96a2a402020-07-31 11:48:33 -070097#ifdef LOGD_ENABLE_FLAKY_TESTS
Mark Salyzynfee2b002014-02-28 13:44:12 -080098TEST(logd, statistics) {
Mark Salyzyn8799bd82016-12-27 13:30:03 -080099#ifdef __ANDROID__
Mark Salyzyn9b9ee4e2017-04-27 14:46:31 -0700100 // Drop cache so that any access problems can be discovered.
101 if (!android::base::WriteStringToFile("3\n", "/proc/sys/vm/drop_caches")) {
102 GTEST_LOG_(INFO) << "Could not open trigger dropping inode cache";
103 }
104
Christopher Ferrisbdd4a202021-08-10 18:33:02 -0700105 std::string result;
106 send_to_control("getStatistics 0 1 2 3 4", result);
107 ASSERT_FALSE(result.empty());
Mark Salyzynfee2b002014-02-28 13:44:12 -0800108
Christopher Ferrisbdd4a202021-08-10 18:33:02 -0700109 EXPECT_NE(std::string::npos, result.find("\nChattiest UIDs in main "));
Mark Salyzynfee2b002014-02-28 13:44:12 -0800110
Christopher Ferrisbdd4a202021-08-10 18:33:02 -0700111 EXPECT_NE(std::string::npos, result.find("\nChattiest UIDs in radio "));
Mark Salyzynfee2b002014-02-28 13:44:12 -0800112
Christopher Ferrisbdd4a202021-08-10 18:33:02 -0700113 EXPECT_NE(std::string::npos, result.find("\nChattiest UIDs in system "));
Mark Salyzynfee2b002014-02-28 13:44:12 -0800114
Christopher Ferrisbdd4a202021-08-10 18:33:02 -0700115 EXPECT_NE(std::string::npos, result.find("\nChattiest UIDs in events "));
Mark Salyzynfee2b002014-02-28 13:44:12 -0800116
Christopher Ferrisbdd4a202021-08-10 18:33:02 -0700117 // Look for any u0_a or u0_a[0-9]+ values. If found, it indicates the
118 // libpackagelistparser failed.
Mark Salyzyn9b9ee4e2017-04-27 14:46:31 -0700119 static const char getpwuid_prefix[] = " u0_a";
Christopher Ferrisbdd4a202021-08-10 18:33:02 -0700120 size_t pos = 0;
121 while ((pos = result.find(getpwuid_prefix, pos)) != std::string::npos) {
122 // Check to see if the value following u0_a is all digits, or empty.
123 size_t uid_name_pos = pos + strlen(getpwuid_prefix);
124 size_t i = 0;
125 while (isdigit(result[uid_name_pos + i])) {
126 i++;
127 }
128 ASSERT_FALSE(isspace(result[uid_name_pos + i]))
129 << "libpackagelistparser failed to pick up " << result.substr(uid_name_pos, i);
Mark Salyzynfee2b002014-02-28 13:44:12 -0800130
Christopher Ferrisbdd4a202021-08-10 18:33:02 -0700131 pos = uid_name_pos + i;
132 }
Mark Salyzyn8799bd82016-12-27 13:30:03 -0800133#else
134 GTEST_LOG_(INFO) << "This test does nothing.\n";
135#endif
Mark Salyzynfee2b002014-02-28 13:44:12 -0800136}
Tom Cherry96a2a402020-07-31 11:48:33 -0700137#endif
Mark Salyzynfee2b002014-02-28 13:44:12 -0800138
Mark Salyzyn8799bd82016-12-27 13:30:03 -0800139#ifdef __ANDROID__
Mark Salyzyn65059532017-03-10 14:31:54 -0800140static void caught_signal(int /* signum */) {
141}
Mark Salyzynfee2b002014-02-28 13:44:12 -0800142
Tom Cherry47856dd2019-10-15 16:53:11 -0700143static void dump_log_msg(const char* prefix, log_msg* msg, int lid) {
Mark Salyzynb1c45ec2016-01-21 10:59:25 -0800144 std::cout << std::flush;
145 std::cerr << std::flush;
146 fflush(stdout);
147 fflush(stderr);
Tom Cherryc41fea92020-04-09 14:53:55 -0700148 EXPECT_GE(msg->entry.hdr_size, sizeof(logger_entry));
Mark Salyzynfee2b002014-02-28 13:44:12 -0800149
Tom Cherry47856dd2019-10-15 16:53:11 -0700150 fprintf(stderr, "%s: [%u] ", prefix, msg->len());
151 fprintf(stderr, "hdr_size=%u ", msg->entry.hdr_size);
152 fprintf(stderr, "pid=%u tid=%u %u.%09u ", msg->entry.pid, msg->entry.tid, msg->entry.sec,
153 msg->entry.nsec);
154 lid = msg->entry.lid;
Mark Salyzynfee2b002014-02-28 13:44:12 -0800155
Mark Salyzyn65059532017-03-10 14:31:54 -0800156 switch (lid) {
157 case 0:
158 fprintf(stderr, "lid=main ");
159 break;
160 case 1:
161 fprintf(stderr, "lid=radio ");
162 break;
163 case 2:
164 fprintf(stderr, "lid=events ");
165 break;
166 case 3:
167 fprintf(stderr, "lid=system ");
168 break;
169 case 4:
170 fprintf(stderr, "lid=crash ");
171 break;
172 case 5:
173 fprintf(stderr, "lid=security ");
174 break;
175 case 6:
176 fprintf(stderr, "lid=kernel ");
177 break;
178 default:
179 if (lid >= 0) {
180 fprintf(stderr, "lid=%d ", lid);
181 }
Mark Salyzynfee2b002014-02-28 13:44:12 -0800182 }
183
184 unsigned int len = msg->entry.len;
185 fprintf(stderr, "msg[%u]={", len);
Mark Salyzyn65059532017-03-10 14:31:54 -0800186 unsigned char* cp = reinterpret_cast<unsigned char*>(msg->msg());
Mark Salyzynbb605482016-08-18 14:59:41 -0700187 if (!cp) {
188 static const unsigned char garbage[] = "<INVALID>";
Mark Salyzyn65059532017-03-10 14:31:54 -0800189 cp = const_cast<unsigned char*>(garbage);
190 len = strlen(reinterpret_cast<const char*>(garbage));
Mark Salyzynbb605482016-08-18 14:59:41 -0700191 }
Mark Salyzyn65059532017-03-10 14:31:54 -0800192 while (len) {
193 unsigned char* p = cp;
Mark Salyzynfee2b002014-02-28 13:44:12 -0800194 while (*p && (((' ' <= *p) && (*p < 0x7F)) || (*p == '\n'))) {
195 ++p;
196 }
197 if (((p - cp) > 3) && !*p && ((unsigned int)(p - cp) < len)) {
198 fprintf(stderr, "\"");
199 while (*cp) {
Chih-Hung Hsieh788dd4f2014-09-12 16:02:28 -0700200 if (*cp != '\n') {
201 fprintf(stderr, "%c", *cp);
202 } else {
203 fprintf(stderr, "\\n");
204 }
Mark Salyzynfee2b002014-02-28 13:44:12 -0800205 ++cp;
206 --len;
207 }
208 fprintf(stderr, "\"");
209 } else {
210 fprintf(stderr, "%02x", *cp);
211 }
212 ++cp;
213 if (--len) {
214 fprintf(stderr, ", ");
215 }
216 }
217 fprintf(stderr, "}\n");
Mark Salyzynb1c45ec2016-01-21 10:59:25 -0800218 fflush(stderr);
Mark Salyzynfee2b002014-02-28 13:44:12 -0800219}
Mark Salyzyn8799bd82016-12-27 13:30:03 -0800220#endif
Mark Salyzynfee2b002014-02-28 13:44:12 -0800221
Mark Salyzynb1c45ec2016-01-21 10:59:25 -0800222// b/26447386 confirm fixed
Elliott Hughes7e3086b2022-05-09 13:06:03 -0700223void timeout_negative([[maybe_unused]] const char* command) {
Mark Salyzyn8799bd82016-12-27 13:30:03 -0800224#ifdef __ANDROID__
Mark Salyzynf1d6f902015-12-01 08:57:53 -0800225 log_msg msg_wrap, msg_timeout;
226 bool content_wrap = false, content_timeout = false, written = false;
227 unsigned int alarm_wrap = 0, alarm_timeout = 0;
228 // A few tries to get it right just in case wrap kicks in due to
229 // content providers being active during the test.
230 int i = 3;
231
232 while (--i) {
Christopher Ferrisbdd4a202021-08-10 18:33:02 -0700233 unique_fd fd(
234 socket_local_client("logdr", ANDROID_SOCKET_NAMESPACE_RESERVED, SOCK_SEQPACKET));
235 ASSERT_LT(0, fd) << "Failed to open logdr: " << strerror(errno);
Mark Salyzynb1c45ec2016-01-21 10:59:25 -0800236
Elliott Hughesa94e7072021-11-17 15:07:55 -0800237 struct sigaction ignore = {.sa_handler = caught_signal};
Mark Salyzynf1d6f902015-12-01 08:57:53 -0800238 sigemptyset(&ignore.sa_mask);
Elliott Hughesa94e7072021-11-17 15:07:55 -0800239 struct sigaction old_sigaction;
Mark Salyzynf1d6f902015-12-01 08:57:53 -0800240 sigaction(SIGALRM, &ignore, &old_sigaction);
241 unsigned int old_alarm = alarm(3);
242
Christopher Ferrisbdd4a202021-08-10 18:33:02 -0700243 written = write_command(fd, command);
Mark Salyzynf1d6f902015-12-01 08:57:53 -0800244 if (!written) {
245 alarm(old_alarm);
Mark Salyzyn9b9ee4e2017-04-27 14:46:31 -0700246 sigaction(SIGALRM, &old_sigaction, nullptr);
Mark Salyzynf1d6f902015-12-01 08:57:53 -0800247 continue;
248 }
249
Mark Salyzyncd1f5c82016-12-27 13:30:03 -0800250 // alarm triggers at 50% of the --wrap time out
Christopher Ferrisbdd4a202021-08-10 18:33:02 -0700251 content_wrap = TEMP_FAILURE_RETRY(recv(fd, msg_wrap.buf, sizeof(msg_wrap), 0)) > 0;
Mark Salyzynf1d6f902015-12-01 08:57:53 -0800252
253 alarm_wrap = alarm(5);
254
Mark Salyzyncd1f5c82016-12-27 13:30:03 -0800255 // alarm triggers at 133% of the --wrap time out
Christopher Ferrisbdd4a202021-08-10 18:33:02 -0700256 content_timeout = TEMP_FAILURE_RETRY(recv(fd, msg_timeout.buf, sizeof(msg_timeout), 0)) > 0;
Mark Salyzyn65059532017-03-10 14:31:54 -0800257 if (!content_timeout) { // make sure we hit dumpAndClose
258 content_timeout =
Christopher Ferrisbdd4a202021-08-10 18:33:02 -0700259 TEMP_FAILURE_RETRY(recv(fd, msg_timeout.buf, sizeof(msg_timeout), 0)) > 0;
Mark Salyzynb1c45ec2016-01-21 10:59:25 -0800260 }
Mark Salyzynf1d6f902015-12-01 08:57:53 -0800261
Alan Stokeseae60e42017-08-25 14:13:06 +0100262 if (old_alarm > 0) {
263 unsigned int time_spent = 3 - alarm_wrap;
264 if (old_alarm > time_spent + 1) {
265 old_alarm -= time_spent;
266 } else {
267 old_alarm = 2;
268 }
269 }
270 alarm_timeout = alarm(old_alarm);
Mark Salyzyn9b9ee4e2017-04-27 14:46:31 -0700271 sigaction(SIGALRM, &old_sigaction, nullptr);
Mark Salyzynf1d6f902015-12-01 08:57:53 -0800272
Alan Stokeseae60e42017-08-25 14:13:06 +0100273 if (content_wrap && alarm_wrap && content_timeout && alarm_timeout) {
Mark Salyzynf1d6f902015-12-01 08:57:53 -0800274 break;
275 }
276 }
277
278 if (content_wrap) {
Tom Cherry47856dd2019-10-15 16:53:11 -0700279 dump_log_msg("wrap", &msg_wrap, -1);
Mark Salyzynf1d6f902015-12-01 08:57:53 -0800280 }
281
282 if (content_timeout) {
Tom Cherry47856dd2019-10-15 16:53:11 -0700283 dump_log_msg("timeout", &msg_timeout, -1);
Mark Salyzynf1d6f902015-12-01 08:57:53 -0800284 }
285
286 EXPECT_TRUE(written);
Mark Salyzynb1c45ec2016-01-21 10:59:25 -0800287 EXPECT_TRUE(content_wrap);
288 EXPECT_NE(0U, alarm_wrap);
289 EXPECT_TRUE(content_timeout);
290 EXPECT_NE(0U, alarm_timeout);
Mark Salyzyn8799bd82016-12-27 13:30:03 -0800291#else
Mark Salyzyn9b9ee4e2017-04-27 14:46:31 -0700292 command = nullptr;
Mark Salyzyn8799bd82016-12-27 13:30:03 -0800293 GTEST_LOG_(INFO) << "This test does nothing.\n";
294#endif
Mark Salyzynb1c45ec2016-01-21 10:59:25 -0800295}
296
297TEST(logd, timeout_no_start) {
298 timeout_negative("dumpAndClose lids=0,1,2,3,4,5 timeout=6");
299}
300
301TEST(logd, timeout_start_epoch) {
Mark Salyzyn65059532017-03-10 14:31:54 -0800302 timeout_negative(
303 "dumpAndClose lids=0,1,2,3,4,5 timeout=6 start=0.000000000");
Mark Salyzynb1c45ec2016-01-21 10:59:25 -0800304}
305
Christopher Ferrisbdd4a202021-08-10 18:33:02 -0700306#ifdef LOGD_ENABLE_FLAKY_TESTS
Mark Salyzynb1c45ec2016-01-21 10:59:25 -0800307// b/26447386 refined behavior
308TEST(logd, timeout) {
Mark Salyzyn8799bd82016-12-27 13:30:03 -0800309#ifdef __ANDROID__
Mark Salyzyncd1f5c82016-12-27 13:30:03 -0800310 // b/33962045 This test interferes with other log reader tests that
311 // follow because of file descriptor socket persistence in the same
312 // process. So let's fork it to isolate it from giving us pain.
313
314 pid_t pid = fork();
315
316 if (pid) {
317 siginfo_t info = {};
318 ASSERT_EQ(0, TEMP_FAILURE_RETRY(waitid(P_PID, pid, &info, WEXITED)));
319 ASSERT_EQ(0, info.si_status);
320 return;
321 }
322
Mark Salyzynb1c45ec2016-01-21 10:59:25 -0800323 log_msg msg_wrap, msg_timeout;
324 bool content_wrap = false, content_timeout = false, written = false;
325 unsigned int alarm_wrap = 0, alarm_timeout = 0;
326 // A few tries to get it right just in case wrap kicks in due to
Mark Salyzyncd1f5c82016-12-27 13:30:03 -0800327 // content providers being active during the test.
Mark Salyzynb1c45ec2016-01-21 10:59:25 -0800328 int i = 5;
Tom Cherrya5ff7ae2020-04-08 14:36:05 -0700329 log_time start(CLOCK_REALTIME);
Alan Stokeseae60e42017-08-25 14:13:06 +0100330 start.tv_sec -= 30; // reach back a moderate period of time
Mark Salyzynb1c45ec2016-01-21 10:59:25 -0800331
332 while (--i) {
Christopher Ferrisbdd4a202021-08-10 18:33:02 -0700333 unique_fd fd(
334 socket_local_client("logdr", ANDROID_SOCKET_NAMESPACE_RESERVED, SOCK_SEQPACKET));
335 ASSERT_LT(0, fd) << "Failed to open logdr: " << strerror(errno);
Mark Salyzynb1c45ec2016-01-21 10:59:25 -0800336
337 std::string ask = android::base::StringPrintf(
Mark Salyzyn65059532017-03-10 14:31:54 -0800338 "dumpAndClose lids=0,1,2,3,4,5 timeout=6 start=%" PRIu32
339 ".%09" PRIu32,
Alan Stokeseae60e42017-08-25 14:13:06 +0100340 start.tv_sec, start.tv_nsec);
Mark Salyzynb1c45ec2016-01-21 10:59:25 -0800341
Elliott Hughesa94e7072021-11-17 15:07:55 -0800342 struct sigaction ignore = {.sa_handler = caught_signal};
Mark Salyzynb1c45ec2016-01-21 10:59:25 -0800343 sigemptyset(&ignore.sa_mask);
Elliott Hughesa94e7072021-11-17 15:07:55 -0800344 struct sigaction old_sigaction;
Mark Salyzynb1c45ec2016-01-21 10:59:25 -0800345 sigaction(SIGALRM, &ignore, &old_sigaction);
346 unsigned int old_alarm = alarm(3);
347
Christopher Ferrisbdd4a202021-08-10 18:33:02 -0700348 written = write_command(fd, ask);
Mark Salyzynb1c45ec2016-01-21 10:59:25 -0800349 if (!written) {
350 alarm(old_alarm);
Mark Salyzyn9b9ee4e2017-04-27 14:46:31 -0700351 sigaction(SIGALRM, &old_sigaction, nullptr);
Mark Salyzynb1c45ec2016-01-21 10:59:25 -0800352 continue;
353 }
354
Mark Salyzyncd1f5c82016-12-27 13:30:03 -0800355 // alarm triggers at 50% of the --wrap time out
Christopher Ferrisbdd4a202021-08-10 18:33:02 -0700356 content_wrap = TEMP_FAILURE_RETRY(recv(fd, msg_wrap.buf, sizeof(msg_wrap), 0)) > 0;
Mark Salyzynb1c45ec2016-01-21 10:59:25 -0800357
358 alarm_wrap = alarm(5);
359
Mark Salyzyncd1f5c82016-12-27 13:30:03 -0800360 // alarm triggers at 133% of the --wrap time out
Christopher Ferrisbdd4a202021-08-10 18:33:02 -0700361 content_timeout = TEMP_FAILURE_RETRY(recv(fd, msg_timeout.buf, sizeof(msg_timeout), 0)) > 0;
Mark Salyzyn65059532017-03-10 14:31:54 -0800362 if (!content_timeout) { // make sure we hit dumpAndClose
363 content_timeout =
Christopher Ferrisbdd4a202021-08-10 18:33:02 -0700364 TEMP_FAILURE_RETRY(recv(fd, msg_timeout.buf, sizeof(msg_timeout), 0)) > 0;
Mark Salyzynb1c45ec2016-01-21 10:59:25 -0800365 }
366
Alan Stokeseae60e42017-08-25 14:13:06 +0100367 if (old_alarm > 0) {
368 unsigned int time_spent = 3 - alarm_wrap;
369 if (old_alarm > time_spent + 1) {
370 old_alarm -= time_spent;
371 } else {
372 old_alarm = 2;
373 }
374 }
375 alarm_timeout = alarm(old_alarm);
Mark Salyzyn9b9ee4e2017-04-27 14:46:31 -0700376 sigaction(SIGALRM, &old_sigaction, nullptr);
Mark Salyzynb1c45ec2016-01-21 10:59:25 -0800377
Mark Salyzynb1c45ec2016-01-21 10:59:25 -0800378 if (!content_wrap && !alarm_wrap && content_timeout && alarm_timeout) {
379 break;
380 }
381
382 // modify start time in case content providers are relatively
383 // active _or_ inactive during the test.
384 if (content_timeout) {
385 log_time msg(msg_timeout.entry.sec, msg_timeout.entry.nsec);
Alan Stokeseae60e42017-08-25 14:13:06 +0100386 if (msg < start) {
Mark Salyzyn1d23fea2017-04-17 12:39:13 -0700387 fprintf(stderr, "%u.%09u < %u.%09u\n", msg_timeout.entry.sec,
Alan Stokeseae60e42017-08-25 14:13:06 +0100388 msg_timeout.entry.nsec, (unsigned)start.tv_sec,
389 (unsigned)start.tv_nsec);
Mark Salyzyn1d23fea2017-04-17 12:39:13 -0700390 _exit(-1);
391 }
Alan Stokeseae60e42017-08-25 14:13:06 +0100392 if (msg > start) {
393 start = msg;
394 start.tv_sec += 30;
Tom Cherrya5ff7ae2020-04-08 14:36:05 -0700395 log_time now = log_time(CLOCK_REALTIME);
Alan Stokeseae60e42017-08-25 14:13:06 +0100396 if (start > now) {
397 start = now;
398 --start.tv_sec;
Mark Salyzynb1c45ec2016-01-21 10:59:25 -0800399 }
400 }
401 } else {
Alan Stokeseae60e42017-08-25 14:13:06 +0100402 start.tv_sec -= 120; // inactive, reach further back!
Mark Salyzynb1c45ec2016-01-21 10:59:25 -0800403 }
404 }
405
406 if (content_wrap) {
Tom Cherry47856dd2019-10-15 16:53:11 -0700407 dump_log_msg("wrap", &msg_wrap, -1);
Mark Salyzynb1c45ec2016-01-21 10:59:25 -0800408 }
409
410 if (content_timeout) {
Tom Cherry47856dd2019-10-15 16:53:11 -0700411 dump_log_msg("timeout", &msg_timeout, -1);
Mark Salyzynb1c45ec2016-01-21 10:59:25 -0800412 }
413
414 if (content_wrap || !content_timeout) {
Alan Stokeseae60e42017-08-25 14:13:06 +0100415 fprintf(stderr, "start=%" PRIu32 ".%09" PRIu32 "\n", start.tv_sec,
416 start.tv_nsec);
Mark Salyzynb1c45ec2016-01-21 10:59:25 -0800417 }
418
419 EXPECT_TRUE(written);
Mark Salyzynf1d6f902015-12-01 08:57:53 -0800420 EXPECT_FALSE(content_wrap);
421 EXPECT_EQ(0U, alarm_wrap);
422 EXPECT_TRUE(content_timeout);
423 EXPECT_NE(0U, alarm_timeout);
Mark Salyzyncd1f5c82016-12-27 13:30:03 -0800424
Mark Salyzyn65059532017-03-10 14:31:54 -0800425 _exit(!written + content_wrap + alarm_wrap + !content_timeout +
426 !alarm_timeout);
Mark Salyzyn8799bd82016-12-27 13:30:03 -0800427#else
428 GTEST_LOG_(INFO) << "This test does nothing.\n";
429#endif
Mark Salyzynf1d6f902015-12-01 08:57:53 -0800430}
Tom Cherry29ddef82020-04-29 10:15:15 -0700431#endif
Mark Salyzyn2296d332016-02-23 08:55:43 -0800432
Tom Cherry96a2a402020-07-31 11:48:33 -0700433#ifdef LOGD_ENABLE_FLAKY_TESTS
Mark Salyzyn2296d332016-02-23 08:55:43 -0800434// b/27242723 confirmed fixed
435TEST(logd, SNDTIMEO) {
Mark Salyzyn8799bd82016-12-27 13:30:03 -0800436#ifdef __ANDROID__
Mark Salyzyn65059532017-03-10 14:31:54 -0800437 static const unsigned sndtimeo =
438 LOGD_SNDTIMEO; // <sigh> it has to be done!
Mark Salyzyn2296d332016-02-23 08:55:43 -0800439 static const unsigned sleep_time = sndtimeo + 3;
440 static const unsigned alarm_time = sleep_time + 5;
441
Christopher Ferrisbdd4a202021-08-10 18:33:02 -0700442 unique_fd fd(socket_local_client("logdr", ANDROID_SOCKET_NAMESPACE_RESERVED, SOCK_SEQPACKET));
443 ASSERT_LT(0, fd) << "Failed to open logdr: " << strerror(errno);
Mark Salyzyn2296d332016-02-23 08:55:43 -0800444
Elliott Hughesa94e7072021-11-17 15:07:55 -0800445 struct sigaction ignore = {.sa_handler = caught_signal};
Mark Salyzyn2296d332016-02-23 08:55:43 -0800446 sigemptyset(&ignore.sa_mask);
Elliott Hughesa94e7072021-11-17 15:07:55 -0800447 struct sigaction old_sigaction;
Mark Salyzyn2296d332016-02-23 08:55:43 -0800448 sigaction(SIGALRM, &ignore, &old_sigaction);
449 unsigned int old_alarm = alarm(alarm_time);
450
Christopher Ferrisbdd4a202021-08-10 18:33:02 -0700451 // Stream all sources.
452 ASSERT_TRUE(write_command(fd, "stream lids=0,1,2,3,4,5,6"));
Mark Salyzyn2296d332016-02-23 08:55:43 -0800453
454 log_msg msg;
Christopher Ferrisbdd4a202021-08-10 18:33:02 -0700455 bool read_one = TEMP_FAILURE_RETRY(recv(fd, msg.buf, sizeof(msg), 0)) > 0;
Mark Salyzyn2296d332016-02-23 08:55:43 -0800456 EXPECT_TRUE(read_one);
457 if (read_one) {
Tom Cherry47856dd2019-10-15 16:53:11 -0700458 dump_log_msg("user", &msg, -1);
Mark Salyzyn2296d332016-02-23 08:55:43 -0800459 }
460
Mark Salyzyn65059532017-03-10 14:31:54 -0800461 fprintf(stderr, "Sleep for >%d seconds logd SO_SNDTIMEO ...\n", sndtimeo);
Mark Salyzyn2296d332016-02-23 08:55:43 -0800462 sleep(sleep_time);
463
464 // flush will block if we did not trigger. if it did, last entry returns 0
465 int recv_ret;
466 do {
Christopher Ferrisbdd4a202021-08-10 18:33:02 -0700467 recv_ret = TEMP_FAILURE_RETRY(recv(fd, msg.buf, sizeof(msg), 0));
Mark Salyzyn2296d332016-02-23 08:55:43 -0800468 } while (recv_ret > 0);
469 int save_errno = (recv_ret < 0) ? errno : 0;
470
471 EXPECT_NE(0U, alarm(old_alarm));
Mark Salyzyn9b9ee4e2017-04-27 14:46:31 -0700472 sigaction(SIGALRM, &old_sigaction, nullptr);
Mark Salyzyn2296d332016-02-23 08:55:43 -0800473
474 EXPECT_EQ(0, recv_ret);
475 if (recv_ret > 0) {
Tom Cherry47856dd2019-10-15 16:53:11 -0700476 dump_log_msg("user", &msg, -1);
Mark Salyzyn2296d332016-02-23 08:55:43 -0800477 }
478 EXPECT_EQ(0, save_errno);
Mark Salyzyn8799bd82016-12-27 13:30:03 -0800479#else
480 GTEST_LOG_(INFO) << "This test does nothing.\n";
481#endif
Mark Salyzyn2296d332016-02-23 08:55:43 -0800482}
Tom Cherry96a2a402020-07-31 11:48:33 -0700483#endif
Mark Salyzyn24a57dc2016-12-13 10:31:29 -0800484
Mark Salyzyn9472b4d2016-09-12 14:51:54 -0700485TEST(logd, getEventTag_list) {
486#ifdef __ANDROID__
Christopher Ferrisbdd4a202021-08-10 18:33:02 -0700487 std::string result;
488 send_to_control("getEventTag name=*", result);
489 ASSERT_FALSE(result.empty());
490
Mark Salyzyn65059532017-03-10 14:31:54 -0800491 char* cp;
Christopher Ferrisbdd4a202021-08-10 18:33:02 -0700492 long ret = strtol(result.c_str(), &cp, 10);
493 EXPECT_GT(ret, 4096) << "Command result: " << result;
Mark Salyzyn9472b4d2016-09-12 14:51:54 -0700494#else
495 GTEST_LOG_(INFO) << "This test does nothing.\n";
496#endif
497}
498
Mark Salyzyn32f6d4b2017-02-21 16:19:08 -0800499TEST(logd, getEventTag_42) {
500#ifdef __ANDROID__
Christopher Ferrisbdd4a202021-08-10 18:33:02 -0700501 std::string result;
502 send_to_control("getEventTag id=42", result);
503 ASSERT_FALSE(result.empty());
504
Mark Salyzyn65059532017-03-10 14:31:54 -0800505 char* cp;
Christopher Ferrisbdd4a202021-08-10 18:33:02 -0700506 long ret = strtol(result.c_str(), &cp, 10);
507 EXPECT_GT(ret, 16) << "Command result: " << result;
508 EXPECT_NE(std::string::npos, result.find("\t(to life the universe etc|3)"))
509 << "Command result: " << result;
510 EXPECT_NE(std::string::npos, result.find("answer")) << "Command result: " << result;
Mark Salyzyn32f6d4b2017-02-21 16:19:08 -0800511#else
512 GTEST_LOG_(INFO) << "This test does nothing.\n";
513#endif
514}
515
Mark Salyzyn9472b4d2016-09-12 14:51:54 -0700516TEST(logd, getEventTag_newentry) {
517#ifdef __ANDROID__
Mark Salyzyn9472b4d2016-09-12 14:51:54 -0700518 log_time now(CLOCK_MONOTONIC);
Christopher Ferrisbdd4a202021-08-10 18:33:02 -0700519 std::string name;
520 name = android::base::StringPrintf("a%" PRIu64, now.nsec());
521
522 std::string command;
523 command = android::base::StringPrintf("getEventTag name=%s format=\"(new|1)\"", name.c_str());
524
525 std::string result;
526 send_to_control(command.c_str(), result);
527 ASSERT_FALSE(result.empty());
528
Mark Salyzyn65059532017-03-10 14:31:54 -0800529 char* cp;
Christopher Ferrisbdd4a202021-08-10 18:33:02 -0700530 long ret = strtol(result.c_str(), &cp, 10);
531 EXPECT_GT(ret, 16) << "Command result: " << result;
532 EXPECT_NE(std::string::npos, result.find("\t(new|1)")) << "Command result: " << result;
533 EXPECT_NE(std::string::npos, result.find(name)) << "Command result: " << result;
Mark Salyzyn65059532017-03-10 14:31:54 -0800534// ToDo: also look for this in /data/misc/logd/event-log-tags and
535// /dev/event-log-tags.
Mark Salyzyn9472b4d2016-09-12 14:51:54 -0700536#else
537 GTEST_LOG_(INFO) << "This test does nothing.\n";
538#endif
539}
Tom Cherryf2248082020-08-07 10:27:37 -0700540
541TEST(logd, no_epipe) {
542#ifdef __ANDROID__
543 // Actually generating SIGPIPE in logd is racy, since we need to close the socket quicker than
Tom Cherry3be635a2020-11-03 10:01:24 -0800544 // logd finishes writing the data to it, so we try 5 times, which should be enough to trigger
Tom Cherryf2248082020-08-07 10:27:37 -0700545 // SIGPIPE if logd isn't ignoring SIGPIPE
Tom Cherry3be635a2020-11-03 10:01:24 -0800546 for (int i = 0; i < 5; ++i) {
Tom Cherryf2248082020-08-07 10:27:37 -0700547 unique_fd sock1(
548 socket_local_client("logd", ANDROID_SOCKET_NAMESPACE_RESERVED, SOCK_STREAM));
Christopher Ferrisbdd4a202021-08-10 18:33:02 -0700549 ASSERT_LT(0, sock1) << "Failed to open logd: " << strerror(errno);
Tom Cherryf2248082020-08-07 10:27:37 -0700550 unique_fd sock2(
551 socket_local_client("logd", ANDROID_SOCKET_NAMESPACE_RESERVED, SOCK_STREAM));
Christopher Ferrisbdd4a202021-08-10 18:33:02 -0700552 ASSERT_LT(0, sock2) << "Failed to open logd: " << strerror(errno);
Tom Cherryf2248082020-08-07 10:27:37 -0700553
554 std::string message = "getStatistics 0 1 2 3 4 5 6 7";
Christopher Ferrisbdd4a202021-08-10 18:33:02 -0700555 ASSERT_TRUE(write_command(sock1, message));
Tom Cherryf2248082020-08-07 10:27:37 -0700556 sock1.reset();
Christopher Ferrisbdd4a202021-08-10 18:33:02 -0700557 ASSERT_TRUE(write_command(sock2, message));
Tom Cherryf2248082020-08-07 10:27:37 -0700558
559 struct pollfd p = {.fd = sock2, .events = POLLIN, .revents = 0};
560
Christopher Ferrisbdd4a202021-08-10 18:33:02 -0700561 int ret = TEMP_FAILURE_RETRY(poll(&p, 1, 1000));
Tom Cherryf2248082020-08-07 10:27:37 -0700562 EXPECT_EQ(ret, 1);
563 EXPECT_TRUE(p.revents & POLLIN);
564 EXPECT_FALSE(p.revents & POLL_ERR);
565 }
566#else
567 GTEST_LOG_(INFO) << "This test does nothing.\n";
568#endif
569}
Tom Cherry5fe06cb2020-05-01 15:34:47 -0700570
571// Only AID_ROOT, AID_SYSTEM, and AID_LOG can set log sizes. Ensure that a different user, AID_BIN,
572// cannot set the log size.
573TEST(logd, logging_permissions) {
574#ifdef __ANDROID__
575 if (getuid() != 0) {
576 GTEST_SKIP() << "This test requires root";
577 }
578
579 auto child_main = [] {
580 setgroups(0, nullptr);
581 setgid(AID_BIN);
582 setuid(AID_BIN);
583
584 std::unique_ptr<logger_list, decltype(&android_logger_list_free)> logger_list{
585 android_logger_list_alloc(0, 0, 0), &android_logger_list_free};
586 if (!logger_list) {
587 _exit(1);
588 }
589 auto logger = android_logger_open(logger_list.get(), LOG_ID_MAIN);
590 if (!logger) {
591 _exit(2);
592 }
593 // This line should fail, so if it returns 0, we exit with an error.
594 if (android_logger_set_log_size(logger, 2 * 1024 * 1024) == 0) {
595 _exit(3);
596 }
597 _exit(EXIT_SUCCESS);
598 };
599
600 ASSERT_EXIT(child_main(), testing::ExitedWithCode(0), "");
Tom Cherry5fe06cb2020-05-01 15:34:47 -0700601#else
602 GTEST_LOG_(INFO) << "This test does nothing.\n";
603#endif
604}