blob: 828f580565868cdcac795190ba2ead6b5260880b [file] [log] [blame]
Mark Salyzynd3ba6652014-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 Salyzynd392ac12017-04-27 14:46:31 -070017#include <ctype.h>
Mark Salyzynd3ba6652014-02-28 13:44:12 -080018#include <fcntl.h>
Mark Salyzynef4e4f32016-01-21 10:59:25 -080019#include <inttypes.h>
Mark Salyzyn696817d2014-04-18 14:49:28 -070020#include <poll.h>
Mark Salyzynd3ba6652014-02-28 13:44:12 -080021#include <signal.h>
22#include <stdio.h>
23#include <string.h>
Mark Salyzyn247d6822017-01-03 14:00:19 -080024#include <sys/stat.h>
Mark Salyzyn501c3732017-03-10 14:31:54 -080025#include <sys/types.h>
Mark Salyzyn247d6822017-01-03 14:00:19 -080026#include <unistd.h>
Mark Salyzynd3ba6652014-02-28 13:44:12 -080027
Mark Salyzynef4e4f32016-01-21 10:59:25 -080028#include <string>
29
Mark Salyzynd392ac12017-04-27 14:46:31 -070030#include <android-base/file.h>
Mark Salyzync8d31942016-11-03 10:29:23 -070031#include <android-base/macros.h>
Mark Salyzynef4e4f32016-01-21 10:59:25 -080032#include <android-base/stringprintf.h>
Tom Cherry9b77d732020-08-07 10:27:37 -070033#include <android-base/unique_fd.h>
Mark Salyzynef4e4f32016-01-21 10:59:25 -080034#include <cutils/sockets.h>
Mark Salyzyn0dd44312016-09-28 15:54:45 -070035#include <gtest/gtest.h>
Tom Cherryc5c6d7d2020-04-17 09:38:55 -070036#include <log/log_read.h>
Mark Salyzyn247d6822017-01-03 14:00:19 -080037#include <private/android_filesystem_config.h>
Mark Salyzync51ecf92017-05-04 10:25:13 -070038#include <private/android_logger.h>
Mark Salyzyn247d6822017-01-03 14:00:19 -080039#ifdef __ANDROID__
40#include <selinux/selinux.h>
41#endif
Mark Salyzynd3ba6652014-02-28 13:44:12 -080042
Elliott Hughes0fe3b672020-08-20 15:40:57 -070043#include "LogUtils.h" // For LOGD_SNDTIMEO.
Mark Salyzyn5c77ad52016-02-23 08:55:43 -080044
Tom Cherry9b77d732020-08-07 10:27:37 -070045using android::base::unique_fd;
46
Mark Salyzyn2bd06f22016-12-27 13:30:03 -080047#ifdef __ANDROID__
Mark Salyzyn501c3732017-03-10 14:31:54 -080048static void send_to_control(char* buf, size_t len) {
49 int sock = socket_local_client("logd", ANDROID_SOCKET_NAMESPACE_RESERVED,
Mark Salyzynd3ba6652014-02-28 13:44:12 -080050 SOCK_STREAM);
51 if (sock >= 0) {
52 if (write(sock, buf, strlen(buf) + 1) > 0) {
Mark Salyzyn696817d2014-04-18 14:49:28 -070053 ssize_t ret;
54 while ((ret = read(sock, buf, len)) > 0) {
Mark Salyzync9e5f372016-09-21 09:24:13 -070055 if (((size_t)ret == len) || (len < PAGE_SIZE)) {
Mark Salyzyn696817d2014-04-18 14:49:28 -070056 break;
57 }
58 len -= ret;
59 buf += ret;
60
Mark Salyzyn501c3732017-03-10 14:31:54 -080061 struct pollfd p = {.fd = sock, .events = POLLIN, .revents = 0 };
Mark Salyzyn696817d2014-04-18 14:49:28 -070062
63 ret = poll(&p, 1, 20);
64 if ((ret <= 0) || !(p.revents & POLLIN)) {
65 break;
66 }
67 }
Mark Salyzynd3ba6652014-02-28 13:44:12 -080068 }
69 close(sock);
70 }
71}
72
Mark Salyzyn61e9ce62016-09-12 14:51:54 -070073/*
74 * returns statistics
75 */
Mark Salyzyn501c3732017-03-10 14:31:54 -080076static void my_android_logger_get_statistics(char* buf, size_t len) {
Mark Salyzyn61e9ce62016-09-12 14:51:54 -070077 snprintf(buf, len, "getStatistics 0 1 2 3 4");
78 send_to_control(buf, len);
79}
80
Mark Salyzyn501c3732017-03-10 14:31:54 -080081static void alloc_statistics(char** buffer, size_t* length) {
Mark Salyzynd3ba6652014-02-28 13:44:12 -080082 size_t len = 8192;
Mark Salyzyn501c3732017-03-10 14:31:54 -080083 char* buf;
Mark Salyzynd3ba6652014-02-28 13:44:12 -080084
Mark Salyzyn501c3732017-03-10 14:31:54 -080085 for (int retry = 32; (retry >= 0); delete[] buf, --retry) {
86 buf = new char[len];
Mark Salyzynd3ba6652014-02-28 13:44:12 -080087 my_android_logger_get_statistics(buf, len);
88
Mark Salyzyn501c3732017-03-10 14:31:54 -080089 buf[len - 1] = '\0';
Mark Salyzynd3ba6652014-02-28 13:44:12 -080090 size_t ret = atol(buf) + 1;
91 if (ret < 4) {
Mark Salyzyn501c3732017-03-10 14:31:54 -080092 delete[] buf;
Mark Salyzynd392ac12017-04-27 14:46:31 -070093 buf = nullptr;
Mark Salyzynd3ba6652014-02-28 13:44:12 -080094 break;
95 }
96 bool check = ret <= len;
97 len = ret;
98 if (check) {
99 break;
100 }
Mark Salyzyn501c3732017-03-10 14:31:54 -0800101 len += len / 8; // allow for some slop
Mark Salyzynd3ba6652014-02-28 13:44:12 -0800102 }
103 *buffer = buf;
104 *length = len;
105}
106
Mark Salyzyn501c3732017-03-10 14:31:54 -0800107static char* find_benchmark_spam(char* cp) {
Mark Salyzynd3ba6652014-02-28 13:44:12 -0800108 // liblog_benchmarks has been run designed to SPAM. The signature of
Mark Salyzyn62d6a2a2015-05-26 11:00:45 -0700109 // a noisiest UID statistics is:
Mark Salyzynd3ba6652014-02-28 13:44:12 -0800110 //
Mark Salyzyn62d6a2a2015-05-26 11:00:45 -0700111 // Chattiest UIDs in main log buffer: Size Pruned
112 // UID PACKAGE BYTES LINES
113 // 0 root 54164 147569
Mark Salyzynd3ba6652014-02-28 13:44:12 -0800114 //
Mark Salyzynd392ac12017-04-27 14:46:31 -0700115 char* benchmark = nullptr;
Mark Salyzynd3ba6652014-02-28 13:44:12 -0800116 do {
Mark Salyzyn62d6a2a2015-05-26 11:00:45 -0700117 static const char signature[] = "\n0 root ";
118
119 benchmark = strstr(cp, signature);
Mark Salyzynd3ba6652014-02-28 13:44:12 -0800120 if (!benchmark) {
Mark Salyzynd3ba6652014-02-28 13:44:12 -0800121 break;
122 }
Mark Salyzyn62d6a2a2015-05-26 11:00:45 -0700123 cp = benchmark + sizeof(signature);
124 while (isspace(*cp)) {
Mark Salyzynd3ba6652014-02-28 13:44:12 -0800125 ++cp;
126 }
Mark Salyzyn62d6a2a2015-05-26 11:00:45 -0700127 benchmark = cp;
Mark Salyzynf33657d2015-12-01 11:13:20 -0800128#ifdef DEBUG
Mark Salyzyn501c3732017-03-10 14:31:54 -0800129 char* end = strstr(benchmark, "\n");
Mark Salyzynd392ac12017-04-27 14:46:31 -0700130 if (end == nullptr) {
Mark Salyzynf33657d2015-12-01 11:13:20 -0800131 end = benchmark + strlen(benchmark);
132 }
133 fprintf(stderr, "parse for spam counter in \"%.*s\"\n",
134 (int)(end - benchmark), benchmark);
135#endif
136 // content
Mark Salyzyn62d6a2a2015-05-26 11:00:45 -0700137 while (isdigit(*cp)) {
138 ++cp;
Mark Salyzynd3ba6652014-02-28 13:44:12 -0800139 }
Mark Salyzyn62d6a2a2015-05-26 11:00:45 -0700140 while (isspace(*cp)) {
141 ++cp;
142 }
Mark Salyzynf33657d2015-12-01 11:13:20 -0800143 // optional +/- field?
144 if ((*cp == '-') || (*cp == '+')) {
Mark Salyzyn501c3732017-03-10 14:31:54 -0800145 while (isdigit(*++cp) || (*cp == '.') || (*cp == '%') ||
146 (*cp == 'X')) {
Mark Salyzynf33657d2015-12-01 11:13:20 -0800147 ;
148 }
149 while (isspace(*cp)) {
150 ++cp;
151 }
152 }
153 // number of entries pruned
Mark Salyzyn62d6a2a2015-05-26 11:00:45 -0700154 unsigned long value = 0;
155 while (isdigit(*cp)) {
156 value = value * 10ULL + *cp - '0';
157 ++cp;
158 }
Mark Salyzynf33657d2015-12-01 11:13:20 -0800159 if (value > 10UL) {
Mark Salyzyn62d6a2a2015-05-26 11:00:45 -0700160 break;
161 }
Mark Salyzynd392ac12017-04-27 14:46:31 -0700162 benchmark = nullptr;
Mark Salyzyn62d6a2a2015-05-26 11:00:45 -0700163 } while (*cp);
164 return benchmark;
Mark Salyzynd3ba6652014-02-28 13:44:12 -0800165}
Mark Salyzyn2bd06f22016-12-27 13:30:03 -0800166#endif
Mark Salyzynd3ba6652014-02-28 13:44:12 -0800167
Tom Cherrybd5a2832020-07-31 11:48:33 -0700168#ifdef LOGD_ENABLE_FLAKY_TESTS
Mark Salyzynd3ba6652014-02-28 13:44:12 -0800169TEST(logd, statistics) {
Mark Salyzyn2bd06f22016-12-27 13:30:03 -0800170#ifdef __ANDROID__
Mark Salyzynd3ba6652014-02-28 13:44:12 -0800171 size_t len;
Mark Salyzyn501c3732017-03-10 14:31:54 -0800172 char* buf;
Mark Salyzynd3ba6652014-02-28 13:44:12 -0800173
Mark Salyzynd392ac12017-04-27 14:46:31 -0700174 // Drop cache so that any access problems can be discovered.
175 if (!android::base::WriteStringToFile("3\n", "/proc/sys/vm/drop_caches")) {
176 GTEST_LOG_(INFO) << "Could not open trigger dropping inode cache";
177 }
178
Mark Salyzynd3ba6652014-02-28 13:44:12 -0800179 alloc_statistics(&buf, &len);
180
Mark Salyzynd392ac12017-04-27 14:46:31 -0700181 ASSERT_TRUE(nullptr != buf);
Mark Salyzynd3ba6652014-02-28 13:44:12 -0800182
183 // remove trailing FF
Mark Salyzyn501c3732017-03-10 14:31:54 -0800184 char* cp = buf + len - 1;
Mark Salyzynd3ba6652014-02-28 13:44:12 -0800185 *cp = '\0';
186 bool truncated = *--cp != '\f';
187 if (!truncated) {
188 *cp = '\0';
189 }
190
191 // squash out the byte count
192 cp = buf;
193 if (!truncated) {
194 while (isdigit(*cp) || (*cp == '\n')) {
195 ++cp;
196 }
197 }
198
199 fprintf(stderr, "%s", cp);
200
201 EXPECT_LT((size_t)64, strlen(cp));
202
203 EXPECT_EQ(0, truncated);
204
Mark Salyzyn501c3732017-03-10 14:31:54 -0800205 char* main_logs = strstr(cp, "\nChattiest UIDs in main ");
Mark Salyzynd392ac12017-04-27 14:46:31 -0700206 EXPECT_TRUE(nullptr != main_logs);
Mark Salyzynd3ba6652014-02-28 13:44:12 -0800207
Mark Salyzyn501c3732017-03-10 14:31:54 -0800208 char* radio_logs = strstr(cp, "\nChattiest UIDs in radio ");
209 if (!radio_logs)
Mark Salyzynd392ac12017-04-27 14:46:31 -0700210 GTEST_LOG_(INFO) << "Value of: nullptr != radio_logs\n"
Mark Salyzyn501c3732017-03-10 14:31:54 -0800211 "Actual: false\n"
212 "Expected: false\n";
Mark Salyzynd3ba6652014-02-28 13:44:12 -0800213
Mark Salyzyn501c3732017-03-10 14:31:54 -0800214 char* system_logs = strstr(cp, "\nChattiest UIDs in system ");
Mark Salyzynd392ac12017-04-27 14:46:31 -0700215 EXPECT_TRUE(nullptr != system_logs);
Mark Salyzynd3ba6652014-02-28 13:44:12 -0800216
Mark Salyzyn501c3732017-03-10 14:31:54 -0800217 char* events_logs = strstr(cp, "\nChattiest UIDs in events ");
Mark Salyzynd392ac12017-04-27 14:46:31 -0700218 EXPECT_TRUE(nullptr != events_logs);
219
220 // Check if there is any " u0_a#### " as this means packagelistparser broken
221 char* used_getpwuid = nullptr;
222 int used_getpwuid_len;
223 char* uid_name = cp;
224 static const char getpwuid_prefix[] = " u0_a";
225 while ((uid_name = strstr(uid_name, getpwuid_prefix)) != nullptr) {
226 used_getpwuid = uid_name + 1;
227 uid_name += strlen(getpwuid_prefix);
228 while (isdigit(*uid_name)) ++uid_name;
229 used_getpwuid_len = uid_name - used_getpwuid;
230 if (isspace(*uid_name)) break;
231 used_getpwuid = nullptr;
232 }
233 EXPECT_TRUE(nullptr == used_getpwuid);
234 if (used_getpwuid) {
235 fprintf(stderr, "libpackagelistparser failed to pick up %.*s\n",
236 used_getpwuid_len, used_getpwuid);
237 }
Mark Salyzynd3ba6652014-02-28 13:44:12 -0800238
Mark Salyzyn501c3732017-03-10 14:31:54 -0800239 delete[] buf;
Mark Salyzyn2bd06f22016-12-27 13:30:03 -0800240#else
241 GTEST_LOG_(INFO) << "This test does nothing.\n";
242#endif
Mark Salyzynd3ba6652014-02-28 13:44:12 -0800243}
Tom Cherrybd5a2832020-07-31 11:48:33 -0700244#endif
Mark Salyzynd3ba6652014-02-28 13:44:12 -0800245
Mark Salyzyn2bd06f22016-12-27 13:30:03 -0800246#ifdef __ANDROID__
Mark Salyzyn501c3732017-03-10 14:31:54 -0800247static void caught_signal(int /* signum */) {
248}
Mark Salyzynd3ba6652014-02-28 13:44:12 -0800249
Tom Cherry441054a2019-10-15 16:53:11 -0700250static void dump_log_msg(const char* prefix, log_msg* msg, int lid) {
Mark Salyzynef4e4f32016-01-21 10:59:25 -0800251 std::cout << std::flush;
252 std::cerr << std::flush;
253 fflush(stdout);
254 fflush(stderr);
Tom Cherryd3ecc662020-04-09 14:53:55 -0700255 EXPECT_GE(msg->entry.hdr_size, sizeof(logger_entry));
Mark Salyzynd3ba6652014-02-28 13:44:12 -0800256
Tom Cherry441054a2019-10-15 16:53:11 -0700257 fprintf(stderr, "%s: [%u] ", prefix, msg->len());
258 fprintf(stderr, "hdr_size=%u ", msg->entry.hdr_size);
259 fprintf(stderr, "pid=%u tid=%u %u.%09u ", msg->entry.pid, msg->entry.tid, msg->entry.sec,
260 msg->entry.nsec);
261 lid = msg->entry.lid;
Mark Salyzynd3ba6652014-02-28 13:44:12 -0800262
Mark Salyzyn501c3732017-03-10 14:31:54 -0800263 switch (lid) {
264 case 0:
265 fprintf(stderr, "lid=main ");
266 break;
267 case 1:
268 fprintf(stderr, "lid=radio ");
269 break;
270 case 2:
271 fprintf(stderr, "lid=events ");
272 break;
273 case 3:
274 fprintf(stderr, "lid=system ");
275 break;
276 case 4:
277 fprintf(stderr, "lid=crash ");
278 break;
279 case 5:
280 fprintf(stderr, "lid=security ");
281 break;
282 case 6:
283 fprintf(stderr, "lid=kernel ");
284 break;
285 default:
286 if (lid >= 0) {
287 fprintf(stderr, "lid=%d ", lid);
288 }
Mark Salyzynd3ba6652014-02-28 13:44:12 -0800289 }
290
291 unsigned int len = msg->entry.len;
292 fprintf(stderr, "msg[%u]={", len);
Mark Salyzyn501c3732017-03-10 14:31:54 -0800293 unsigned char* cp = reinterpret_cast<unsigned char*>(msg->msg());
Mark Salyzyn305374c2016-08-18 14:59:41 -0700294 if (!cp) {
295 static const unsigned char garbage[] = "<INVALID>";
Mark Salyzyn501c3732017-03-10 14:31:54 -0800296 cp = const_cast<unsigned char*>(garbage);
297 len = strlen(reinterpret_cast<const char*>(garbage));
Mark Salyzyn305374c2016-08-18 14:59:41 -0700298 }
Mark Salyzyn501c3732017-03-10 14:31:54 -0800299 while (len) {
300 unsigned char* p = cp;
Mark Salyzynd3ba6652014-02-28 13:44:12 -0800301 while (*p && (((' ' <= *p) && (*p < 0x7F)) || (*p == '\n'))) {
302 ++p;
303 }
304 if (((p - cp) > 3) && !*p && ((unsigned int)(p - cp) < len)) {
305 fprintf(stderr, "\"");
306 while (*cp) {
Chih-Hung Hsieh634118e2014-09-12 16:02:28 -0700307 if (*cp != '\n') {
308 fprintf(stderr, "%c", *cp);
309 } else {
310 fprintf(stderr, "\\n");
311 }
Mark Salyzynd3ba6652014-02-28 13:44:12 -0800312 ++cp;
313 --len;
314 }
315 fprintf(stderr, "\"");
316 } else {
317 fprintf(stderr, "%02x", *cp);
318 }
319 ++cp;
320 if (--len) {
321 fprintf(stderr, ", ");
322 }
323 }
324 fprintf(stderr, "}\n");
Mark Salyzynef4e4f32016-01-21 10:59:25 -0800325 fflush(stderr);
Mark Salyzynd3ba6652014-02-28 13:44:12 -0800326}
Mark Salyzyn2bd06f22016-12-27 13:30:03 -0800327#endif
Mark Salyzynd3ba6652014-02-28 13:44:12 -0800328
Mark Salyzyn2bd06f22016-12-27 13:30:03 -0800329#ifdef __ANDROID__
Mark Salyzynd3ba6652014-02-28 13:44:12 -0800330// BAD ROBOT
331// Benchmark threshold are generally considered bad form unless there is
332// is some human love applied to the continued maintenance and whether the
333// thresholds are tuned on a per-target basis. Here we check if the values
334// are more than double what is expected. Doubling will not prevent failure
335// on busy or low-end systems that could have a tendency to stretch values.
336//
337// The primary goal of this test is to simulate a spammy app (benchmark
338// being the worst) and check to make sure the logger can deal with it
339// appropriately by checking all the statistics are in an expected range.
340//
341TEST(logd, benchmark) {
342 size_t len;
Mark Salyzyn501c3732017-03-10 14:31:54 -0800343 char* buf;
Mark Salyzynd3ba6652014-02-28 13:44:12 -0800344
345 alloc_statistics(&buf, &len);
346 bool benchmark_already_run = buf && find_benchmark_spam(buf);
Mark Salyzyn501c3732017-03-10 14:31:54 -0800347 delete[] buf;
Mark Salyzynd3ba6652014-02-28 13:44:12 -0800348
349 if (benchmark_already_run) {
Mark Salyzyn501c3732017-03-10 14:31:54 -0800350 fprintf(stderr,
351 "WARNING: spam already present and too much history\n"
352 " false OK for prune by worst UID check\n");
Mark Salyzynd3ba6652014-02-28 13:44:12 -0800353 }
354
Mark Salyzyn501c3732017-03-10 14:31:54 -0800355 FILE* fp;
Mark Salyzynd3ba6652014-02-28 13:44:12 -0800356
357 // Introduce some extreme spam for the worst UID filter
Mark Salyzyn501c3732017-03-10 14:31:54 -0800358 ASSERT_TRUE(
Mark Salyzynd392ac12017-04-27 14:46:31 -0700359 nullptr !=
Mark Salyzyn501c3732017-03-10 14:31:54 -0800360 (fp = popen("/data/nativetest/liblog-benchmarks/liblog-benchmarks"
361 " BM_log_maximum_retry"
362 " BM_log_maximum"
363 " BM_clock_overhead"
Mark Salyzyn81ab11a2017-03-29 09:11:19 -0700364 " BM_log_print_overhead"
Mark Salyzyn501c3732017-03-10 14:31:54 -0800365 " BM_log_latency"
366 " BM_log_delay",
367 "r")));
Mark Salyzynd3ba6652014-02-28 13:44:12 -0800368
369 char buffer[5120];
370
Mark Salyzyn501c3732017-03-10 14:31:54 -0800371 static const char* benchmarks[] = {
Mark Salyzyn81ab11a2017-03-29 09:11:19 -0700372 "BM_log_maximum_retry ", "BM_log_maximum ", "BM_clock_overhead ",
373 "BM_log_print_overhead ", "BM_log_latency ", "BM_log_delay "
Mark Salyzynd3ba6652014-02-28 13:44:12 -0800374 };
375 static const unsigned int log_maximum_retry = 0;
376 static const unsigned int log_maximum = 1;
377 static const unsigned int clock_overhead = 2;
Mark Salyzyn81ab11a2017-03-29 09:11:19 -0700378 static const unsigned int log_print_overhead = 3;
Mark Salyzynd3ba6652014-02-28 13:44:12 -0800379 static const unsigned int log_latency = 4;
380 static const unsigned int log_delay = 5;
381
Mark Salyzync8d31942016-11-03 10:29:23 -0700382 unsigned long ns[arraysize(benchmarks)];
Mark Salyzynd3ba6652014-02-28 13:44:12 -0800383
384 memset(ns, 0, sizeof(ns));
385
386 while (fgets(buffer, sizeof(buffer), fp)) {
Mark Salyzync8d31942016-11-03 10:29:23 -0700387 for (unsigned i = 0; i < arraysize(ns); ++i) {
Mark Salyzyn501c3732017-03-10 14:31:54 -0800388 char* cp = strstr(buffer, benchmarks[i]);
Mark Salyzyn0c57bd82014-06-06 13:38:42 -0700389 if (!cp) {
Mark Salyzynd3ba6652014-02-28 13:44:12 -0800390 continue;
391 }
Mark Salyzyn0c57bd82014-06-06 13:38:42 -0700392 sscanf(cp, "%*s %lu %lu", &ns[i], &ns[i]);
Mark Salyzynd3ba6652014-02-28 13:44:12 -0800393 fprintf(stderr, "%-22s%8lu\n", benchmarks[i], ns[i]);
394 }
395 }
396 int ret = pclose(fp);
397
398 if (!WIFEXITED(ret) || (WEXITSTATUS(ret) == 127)) {
399 fprintf(stderr,
400 "WARNING: "
401 "/data/nativetest/liblog-benchmarks/liblog-benchmarks missing\n"
402 " can not perform test\n");
403 return;
404 }
405
Mark Salyzyn501c3732017-03-10 14:31:54 -0800406 EXPECT_GE(200000UL, ns[log_maximum_retry]); // 104734 user
Mark Salyzyn81ab11a2017-03-29 09:11:19 -0700407 EXPECT_NE(0UL, ns[log_maximum_retry]); // failure to parse
Mark Salyzynd3ba6652014-02-28 13:44:12 -0800408
Mark Salyzyn501c3732017-03-10 14:31:54 -0800409 EXPECT_GE(90000UL, ns[log_maximum]); // 46913 user
Mark Salyzyn81ab11a2017-03-29 09:11:19 -0700410 EXPECT_NE(0UL, ns[log_maximum]); // failure to parse
Mark Salyzynd3ba6652014-02-28 13:44:12 -0800411
Mark Salyzyn501c3732017-03-10 14:31:54 -0800412 EXPECT_GE(4096UL, ns[clock_overhead]); // 4095
Mark Salyzyn81ab11a2017-03-29 09:11:19 -0700413 EXPECT_NE(0UL, ns[clock_overhead]); // failure to parse
Mark Salyzynd3ba6652014-02-28 13:44:12 -0800414
Mark Salyzyn81ab11a2017-03-29 09:11:19 -0700415 EXPECT_GE(250000UL, ns[log_print_overhead]); // 126886 user
416 EXPECT_NE(0UL, ns[log_print_overhead]); // failure to parse
Mark Salyzynd3ba6652014-02-28 13:44:12 -0800417
Mark Salyzyn501c3732017-03-10 14:31:54 -0800418 EXPECT_GE(10000000UL,
419 ns[log_latency]); // 1453559 user space (background cgroup)
Mark Salyzyn81ab11a2017-03-29 09:11:19 -0700420 EXPECT_NE(0UL, ns[log_latency]); // failure to parse
Mark Salyzynd3ba6652014-02-28 13:44:12 -0800421
Mark Salyzyn501c3732017-03-10 14:31:54 -0800422 EXPECT_GE(20000000UL, ns[log_delay]); // 10500289 user
Mark Salyzyn81ab11a2017-03-29 09:11:19 -0700423 EXPECT_NE(0UL, ns[log_delay]); // failure to parse
Mark Salyzynd3ba6652014-02-28 13:44:12 -0800424
425 alloc_statistics(&buf, &len);
426
Mark Salyzynd3ba6652014-02-28 13:44:12 -0800427 bool collected_statistics = !!buf;
428 EXPECT_EQ(true, collected_statistics);
Mark Salyzynd3ba6652014-02-28 13:44:12 -0800429
Mark Salyzynd392ac12017-04-27 14:46:31 -0700430 ASSERT_TRUE(nullptr != buf);
Mark Salyzyne821dac2014-04-09 10:02:23 -0700431
Mark Salyzyn501c3732017-03-10 14:31:54 -0800432 char* benchmark_statistics_found = find_benchmark_spam(buf);
Mark Salyzynd392ac12017-04-27 14:46:31 -0700433 ASSERT_TRUE(benchmark_statistics_found != nullptr);
Mark Salyzyne821dac2014-04-09 10:02:23 -0700434
435 // Check how effective the SPAM filter is, parse out Now size.
Mark Salyzyn62d6a2a2015-05-26 11:00:45 -0700436 // 0 root 54164 147569
Mark Salyzyne821dac2014-04-09 10:02:23 -0700437 // ^-- benchmark_statistics_found
438
Mark Salyzyn0c57bd82014-06-06 13:38:42 -0700439 unsigned long nowSpamSize = atol(benchmark_statistics_found);
Mark Salyzynd3ba6652014-02-28 13:44:12 -0800440
Mark Salyzyn501c3732017-03-10 14:31:54 -0800441 delete[] buf;
Mark Salyzyne821dac2014-04-09 10:02:23 -0700442
Mark Salyzyn0c57bd82014-06-06 13:38:42 -0700443 ASSERT_NE(0UL, nowSpamSize);
Mark Salyzyne821dac2014-04-09 10:02:23 -0700444
Mark Salyzyn6e9aaae2014-06-13 10:09:55 -0700445 // Determine if we have the spam filter enabled
Mark Salyzyn501c3732017-03-10 14:31:54 -0800446 int sock = socket_local_client("logd", ANDROID_SOCKET_NAMESPACE_RESERVED,
Mark Salyzyne821dac2014-04-09 10:02:23 -0700447 SOCK_STREAM);
Mark Salyzyn6e9aaae2014-06-13 10:09:55 -0700448
449 ASSERT_TRUE(sock >= 0);
450
451 static const char getPruneList[] = "getPruneList";
452 if (write(sock, getPruneList, sizeof(getPruneList)) > 0) {
453 char buffer[80];
454 memset(buffer, 0, sizeof(buffer));
455 read(sock, buffer, sizeof(buffer));
Mark Salyzyn501c3732017-03-10 14:31:54 -0800456 char* cp = strchr(buffer, '\n');
Mark Salyzyn6e9aaae2014-06-13 10:09:55 -0700457 if (!cp || (cp[1] != '~') || (cp[2] != '!')) {
458 close(sock);
459 fprintf(stderr,
460 "WARNING: "
Mark Salyzyn501c3732017-03-10 14:31:54 -0800461 "Logger has SPAM filtration turned off \"%s\"\n",
462 buffer);
Mark Salyzyn6e9aaae2014-06-13 10:09:55 -0700463 return;
464 }
465 } else {
466 int save_errno = errno;
467 close(sock);
Mark Salyzyn501c3732017-03-10 14:31:54 -0800468 FAIL() << "Can not send " << getPruneList << " to logger -- "
469 << strerror(save_errno);
Mark Salyzyn6e9aaae2014-06-13 10:09:55 -0700470 }
471
Mark Salyzyne821dac2014-04-09 10:02:23 -0700472 static const unsigned long expected_absolute_minimum_log_size = 65536UL;
473 unsigned long totalSize = expected_absolute_minimum_log_size;
Mark Salyzyn501c3732017-03-10 14:31:54 -0800474 static const char getSize[] = { 'g', 'e', 't', 'L', 'o', 'g',
475 'S', 'i', 'z', 'e', ' ', LOG_ID_MAIN + '0',
476 '\0' };
Mark Salyzyn6e9aaae2014-06-13 10:09:55 -0700477 if (write(sock, getSize, sizeof(getSize)) > 0) {
478 char buffer[80];
479 memset(buffer, 0, sizeof(buffer));
480 read(sock, buffer, sizeof(buffer));
481 totalSize = atol(buffer);
482 if (totalSize < expected_absolute_minimum_log_size) {
483 fprintf(stderr,
484 "WARNING: "
Mark Salyzyn501c3732017-03-10 14:31:54 -0800485 "Logger had unexpected referenced size \"%s\"\n",
486 buffer);
Mark Salyzyn6e9aaae2014-06-13 10:09:55 -0700487 totalSize = expected_absolute_minimum_log_size;
Mark Salyzyne821dac2014-04-09 10:02:23 -0700488 }
Mark Salyzyne821dac2014-04-09 10:02:23 -0700489 }
Mark Salyzyn6e9aaae2014-06-13 10:09:55 -0700490 close(sock);
491
Mark Salyzyne821dac2014-04-09 10:02:23 -0700492 // logd allows excursions to 110% of total size
Mark Salyzyn501c3732017-03-10 14:31:54 -0800493 totalSize = (totalSize * 11) / 10;
Mark Salyzyne821dac2014-04-09 10:02:23 -0700494
495 // 50% threshold for SPAM filter (<20% typical, lots of engineering margin)
Mark Salyzyn0c57bd82014-06-06 13:38:42 -0700496 ASSERT_GT(totalSize, nowSpamSize * 2);
Mark Salyzynd3ba6652014-02-28 13:44:12 -0800497}
Mark Salyzyn2bd06f22016-12-27 13:30:03 -0800498#endif
Mark Salyzynfc9f5b82015-12-01 08:57:53 -0800499
Mark Salyzynef4e4f32016-01-21 10:59:25 -0800500// b/26447386 confirm fixed
Mark Salyzyn501c3732017-03-10 14:31:54 -0800501void timeout_negative(const char* command) {
Mark Salyzyn2bd06f22016-12-27 13:30:03 -0800502#ifdef __ANDROID__
Mark Salyzynfc9f5b82015-12-01 08:57:53 -0800503 log_msg msg_wrap, msg_timeout;
504 bool content_wrap = false, content_timeout = false, written = false;
505 unsigned int alarm_wrap = 0, alarm_timeout = 0;
506 // A few tries to get it right just in case wrap kicks in due to
507 // content providers being active during the test.
508 int i = 3;
509
510 while (--i) {
Mark Salyzyn501c3732017-03-10 14:31:54 -0800511 int fd = socket_local_client("logdr", ANDROID_SOCKET_NAMESPACE_RESERVED,
Mark Salyzynfc9f5b82015-12-01 08:57:53 -0800512 SOCK_SEQPACKET);
513 ASSERT_LT(0, fd);
514
Mark Salyzynef4e4f32016-01-21 10:59:25 -0800515 std::string ask(command);
516
Mark Salyzynfc9f5b82015-12-01 08:57:53 -0800517 struct sigaction ignore, old_sigaction;
518 memset(&ignore, 0, sizeof(ignore));
519 ignore.sa_handler = caught_signal;
520 sigemptyset(&ignore.sa_mask);
521 sigaction(SIGALRM, &ignore, &old_sigaction);
522 unsigned int old_alarm = alarm(3);
523
Mark Salyzynef4e4f32016-01-21 10:59:25 -0800524 size_t len = ask.length() + 1;
525 written = write(fd, ask.c_str(), len) == (ssize_t)len;
Mark Salyzynfc9f5b82015-12-01 08:57:53 -0800526 if (!written) {
527 alarm(old_alarm);
Mark Salyzynd392ac12017-04-27 14:46:31 -0700528 sigaction(SIGALRM, &old_sigaction, nullptr);
Mark Salyzynfc9f5b82015-12-01 08:57:53 -0800529 close(fd);
530 continue;
531 }
532
Mark Salyzyn1736c482016-12-27 13:30:03 -0800533 // alarm triggers at 50% of the --wrap time out
Mark Salyzynfc9f5b82015-12-01 08:57:53 -0800534 content_wrap = recv(fd, msg_wrap.buf, sizeof(msg_wrap), 0) > 0;
535
536 alarm_wrap = alarm(5);
537
Mark Salyzyn1736c482016-12-27 13:30:03 -0800538 // alarm triggers at 133% of the --wrap time out
Mark Salyzynfc9f5b82015-12-01 08:57:53 -0800539 content_timeout = recv(fd, msg_timeout.buf, sizeof(msg_timeout), 0) > 0;
Mark Salyzyn501c3732017-03-10 14:31:54 -0800540 if (!content_timeout) { // make sure we hit dumpAndClose
541 content_timeout =
542 recv(fd, msg_timeout.buf, sizeof(msg_timeout), 0) > 0;
Mark Salyzynef4e4f32016-01-21 10:59:25 -0800543 }
Mark Salyzynfc9f5b82015-12-01 08:57:53 -0800544
Alan Stokes81e63d02017-08-25 14:13:06 +0100545 if (old_alarm > 0) {
546 unsigned int time_spent = 3 - alarm_wrap;
547 if (old_alarm > time_spent + 1) {
548 old_alarm -= time_spent;
549 } else {
550 old_alarm = 2;
551 }
552 }
553 alarm_timeout = alarm(old_alarm);
Mark Salyzynd392ac12017-04-27 14:46:31 -0700554 sigaction(SIGALRM, &old_sigaction, nullptr);
Mark Salyzynfc9f5b82015-12-01 08:57:53 -0800555
556 close(fd);
557
Alan Stokes81e63d02017-08-25 14:13:06 +0100558 if (content_wrap && alarm_wrap && content_timeout && alarm_timeout) {
Mark Salyzynfc9f5b82015-12-01 08:57:53 -0800559 break;
560 }
561 }
562
563 if (content_wrap) {
Tom Cherry441054a2019-10-15 16:53:11 -0700564 dump_log_msg("wrap", &msg_wrap, -1);
Mark Salyzynfc9f5b82015-12-01 08:57:53 -0800565 }
566
567 if (content_timeout) {
Tom Cherry441054a2019-10-15 16:53:11 -0700568 dump_log_msg("timeout", &msg_timeout, -1);
Mark Salyzynfc9f5b82015-12-01 08:57:53 -0800569 }
570
571 EXPECT_TRUE(written);
Mark Salyzynef4e4f32016-01-21 10:59:25 -0800572 EXPECT_TRUE(content_wrap);
573 EXPECT_NE(0U, alarm_wrap);
574 EXPECT_TRUE(content_timeout);
575 EXPECT_NE(0U, alarm_timeout);
Mark Salyzyn2bd06f22016-12-27 13:30:03 -0800576#else
Mark Salyzynd392ac12017-04-27 14:46:31 -0700577 command = nullptr;
Mark Salyzyn2bd06f22016-12-27 13:30:03 -0800578 GTEST_LOG_(INFO) << "This test does nothing.\n";
579#endif
Mark Salyzynef4e4f32016-01-21 10:59:25 -0800580}
581
582TEST(logd, timeout_no_start) {
583 timeout_negative("dumpAndClose lids=0,1,2,3,4,5 timeout=6");
584}
585
586TEST(logd, timeout_start_epoch) {
Mark Salyzyn501c3732017-03-10 14:31:54 -0800587 timeout_negative(
588 "dumpAndClose lids=0,1,2,3,4,5 timeout=6 start=0.000000000");
Mark Salyzynef4e4f32016-01-21 10:59:25 -0800589}
590
Tom Cherry25a4d702020-04-29 10:15:15 -0700591#ifdef ENABLE_FLAKY_TESTS
Mark Salyzynef4e4f32016-01-21 10:59:25 -0800592// b/26447386 refined behavior
593TEST(logd, timeout) {
Mark Salyzyn2bd06f22016-12-27 13:30:03 -0800594#ifdef __ANDROID__
Mark Salyzyn1736c482016-12-27 13:30:03 -0800595 // b/33962045 This test interferes with other log reader tests that
596 // follow because of file descriptor socket persistence in the same
597 // process. So let's fork it to isolate it from giving us pain.
598
599 pid_t pid = fork();
600
601 if (pid) {
602 siginfo_t info = {};
603 ASSERT_EQ(0, TEMP_FAILURE_RETRY(waitid(P_PID, pid, &info, WEXITED)));
604 ASSERT_EQ(0, info.si_status);
605 return;
606 }
607
Mark Salyzynef4e4f32016-01-21 10:59:25 -0800608 log_msg msg_wrap, msg_timeout;
609 bool content_wrap = false, content_timeout = false, written = false;
610 unsigned int alarm_wrap = 0, alarm_timeout = 0;
611 // A few tries to get it right just in case wrap kicks in due to
Mark Salyzyn1736c482016-12-27 13:30:03 -0800612 // content providers being active during the test.
Mark Salyzynef4e4f32016-01-21 10:59:25 -0800613 int i = 5;
Tom Cherryf2c27462020-04-08 14:36:05 -0700614 log_time start(CLOCK_REALTIME);
Alan Stokes81e63d02017-08-25 14:13:06 +0100615 start.tv_sec -= 30; // reach back a moderate period of time
Mark Salyzynef4e4f32016-01-21 10:59:25 -0800616
617 while (--i) {
Mark Salyzyn501c3732017-03-10 14:31:54 -0800618 int fd = socket_local_client("logdr", ANDROID_SOCKET_NAMESPACE_RESERVED,
Mark Salyzynef4e4f32016-01-21 10:59:25 -0800619 SOCK_SEQPACKET);
Mark Salyzyn24aa9a42017-04-17 12:39:13 -0700620 int save_errno = errno;
621 if (fd < 0) {
622 fprintf(stderr, "failed to open /dev/socket/logdr %s\n",
623 strerror(save_errno));
624 _exit(fd);
625 }
Mark Salyzynef4e4f32016-01-21 10:59:25 -0800626
627 std::string ask = android::base::StringPrintf(
Mark Salyzyn501c3732017-03-10 14:31:54 -0800628 "dumpAndClose lids=0,1,2,3,4,5 timeout=6 start=%" PRIu32
629 ".%09" PRIu32,
Alan Stokes81e63d02017-08-25 14:13:06 +0100630 start.tv_sec, start.tv_nsec);
Mark Salyzynef4e4f32016-01-21 10:59:25 -0800631
632 struct sigaction ignore, old_sigaction;
633 memset(&ignore, 0, sizeof(ignore));
634 ignore.sa_handler = caught_signal;
635 sigemptyset(&ignore.sa_mask);
636 sigaction(SIGALRM, &ignore, &old_sigaction);
637 unsigned int old_alarm = alarm(3);
638
639 size_t len = ask.length() + 1;
640 written = write(fd, ask.c_str(), len) == (ssize_t)len;
641 if (!written) {
642 alarm(old_alarm);
Mark Salyzynd392ac12017-04-27 14:46:31 -0700643 sigaction(SIGALRM, &old_sigaction, nullptr);
Mark Salyzynef4e4f32016-01-21 10:59:25 -0800644 close(fd);
645 continue;
646 }
647
Mark Salyzyn1736c482016-12-27 13:30:03 -0800648 // alarm triggers at 50% of the --wrap time out
Mark Salyzynef4e4f32016-01-21 10:59:25 -0800649 content_wrap = recv(fd, msg_wrap.buf, sizeof(msg_wrap), 0) > 0;
650
651 alarm_wrap = alarm(5);
652
Mark Salyzyn1736c482016-12-27 13:30:03 -0800653 // alarm triggers at 133% of the --wrap time out
Mark Salyzynef4e4f32016-01-21 10:59:25 -0800654 content_timeout = recv(fd, msg_timeout.buf, sizeof(msg_timeout), 0) > 0;
Mark Salyzyn501c3732017-03-10 14:31:54 -0800655 if (!content_timeout) { // make sure we hit dumpAndClose
656 content_timeout =
657 recv(fd, msg_timeout.buf, sizeof(msg_timeout), 0) > 0;
Mark Salyzynef4e4f32016-01-21 10:59:25 -0800658 }
659
Alan Stokes81e63d02017-08-25 14:13:06 +0100660 if (old_alarm > 0) {
661 unsigned int time_spent = 3 - alarm_wrap;
662 if (old_alarm > time_spent + 1) {
663 old_alarm -= time_spent;
664 } else {
665 old_alarm = 2;
666 }
667 }
668 alarm_timeout = alarm(old_alarm);
Mark Salyzynd392ac12017-04-27 14:46:31 -0700669 sigaction(SIGALRM, &old_sigaction, nullptr);
Mark Salyzynef4e4f32016-01-21 10:59:25 -0800670
671 close(fd);
672
673 if (!content_wrap && !alarm_wrap && content_timeout && alarm_timeout) {
674 break;
675 }
676
677 // modify start time in case content providers are relatively
678 // active _or_ inactive during the test.
679 if (content_timeout) {
680 log_time msg(msg_timeout.entry.sec, msg_timeout.entry.nsec);
Alan Stokes81e63d02017-08-25 14:13:06 +0100681 if (msg < start) {
Mark Salyzyn24aa9a42017-04-17 12:39:13 -0700682 fprintf(stderr, "%u.%09u < %u.%09u\n", msg_timeout.entry.sec,
Alan Stokes81e63d02017-08-25 14:13:06 +0100683 msg_timeout.entry.nsec, (unsigned)start.tv_sec,
684 (unsigned)start.tv_nsec);
Mark Salyzyn24aa9a42017-04-17 12:39:13 -0700685 _exit(-1);
686 }
Alan Stokes81e63d02017-08-25 14:13:06 +0100687 if (msg > start) {
688 start = msg;
689 start.tv_sec += 30;
Tom Cherryf2c27462020-04-08 14:36:05 -0700690 log_time now = log_time(CLOCK_REALTIME);
Alan Stokes81e63d02017-08-25 14:13:06 +0100691 if (start > now) {
692 start = now;
693 --start.tv_sec;
Mark Salyzynef4e4f32016-01-21 10:59:25 -0800694 }
695 }
696 } else {
Alan Stokes81e63d02017-08-25 14:13:06 +0100697 start.tv_sec -= 120; // inactive, reach further back!
Mark Salyzynef4e4f32016-01-21 10:59:25 -0800698 }
699 }
700
701 if (content_wrap) {
Tom Cherry441054a2019-10-15 16:53:11 -0700702 dump_log_msg("wrap", &msg_wrap, -1);
Mark Salyzynef4e4f32016-01-21 10:59:25 -0800703 }
704
705 if (content_timeout) {
Tom Cherry441054a2019-10-15 16:53:11 -0700706 dump_log_msg("timeout", &msg_timeout, -1);
Mark Salyzynef4e4f32016-01-21 10:59:25 -0800707 }
708
709 if (content_wrap || !content_timeout) {
Alan Stokes81e63d02017-08-25 14:13:06 +0100710 fprintf(stderr, "start=%" PRIu32 ".%09" PRIu32 "\n", start.tv_sec,
711 start.tv_nsec);
Mark Salyzynef4e4f32016-01-21 10:59:25 -0800712 }
713
714 EXPECT_TRUE(written);
Mark Salyzynfc9f5b82015-12-01 08:57:53 -0800715 EXPECT_FALSE(content_wrap);
716 EXPECT_EQ(0U, alarm_wrap);
717 EXPECT_TRUE(content_timeout);
718 EXPECT_NE(0U, alarm_timeout);
Mark Salyzyn1736c482016-12-27 13:30:03 -0800719
Mark Salyzyn501c3732017-03-10 14:31:54 -0800720 _exit(!written + content_wrap + alarm_wrap + !content_timeout +
721 !alarm_timeout);
Mark Salyzyn2bd06f22016-12-27 13:30:03 -0800722#else
723 GTEST_LOG_(INFO) << "This test does nothing.\n";
724#endif
Mark Salyzynfc9f5b82015-12-01 08:57:53 -0800725}
Tom Cherry25a4d702020-04-29 10:15:15 -0700726#endif
Mark Salyzyn5c77ad52016-02-23 08:55:43 -0800727
Tom Cherrybd5a2832020-07-31 11:48:33 -0700728#ifdef LOGD_ENABLE_FLAKY_TESTS
Mark Salyzyn5c77ad52016-02-23 08:55:43 -0800729// b/27242723 confirmed fixed
730TEST(logd, SNDTIMEO) {
Mark Salyzyn2bd06f22016-12-27 13:30:03 -0800731#ifdef __ANDROID__
Mark Salyzyn501c3732017-03-10 14:31:54 -0800732 static const unsigned sndtimeo =
733 LOGD_SNDTIMEO; // <sigh> it has to be done!
Mark Salyzyn5c77ad52016-02-23 08:55:43 -0800734 static const unsigned sleep_time = sndtimeo + 3;
735 static const unsigned alarm_time = sleep_time + 5;
736
737 int fd;
738
Mark Salyzyn501c3732017-03-10 14:31:54 -0800739 ASSERT_TRUE(
740 (fd = socket_local_client("logdr", ANDROID_SOCKET_NAMESPACE_RESERVED,
741 SOCK_SEQPACKET)) > 0);
Mark Salyzyn5c77ad52016-02-23 08:55:43 -0800742
743 struct sigaction ignore, old_sigaction;
744 memset(&ignore, 0, sizeof(ignore));
745 ignore.sa_handler = caught_signal;
746 sigemptyset(&ignore.sa_mask);
747 sigaction(SIGALRM, &ignore, &old_sigaction);
748 unsigned int old_alarm = alarm(alarm_time);
749
Mark Salyzyn501c3732017-03-10 14:31:54 -0800750 static const char ask[] = "stream lids=0,1,2,3,4,5,6"; // all sources
Mark Salyzyn5c77ad52016-02-23 08:55:43 -0800751 bool reader_requested = write(fd, ask, sizeof(ask)) == sizeof(ask);
752 EXPECT_TRUE(reader_requested);
753
754 log_msg msg;
755 bool read_one = recv(fd, msg.buf, sizeof(msg), 0) > 0;
756
757 EXPECT_TRUE(read_one);
758 if (read_one) {
Tom Cherry441054a2019-10-15 16:53:11 -0700759 dump_log_msg("user", &msg, -1);
Mark Salyzyn5c77ad52016-02-23 08:55:43 -0800760 }
761
Mark Salyzyn501c3732017-03-10 14:31:54 -0800762 fprintf(stderr, "Sleep for >%d seconds logd SO_SNDTIMEO ...\n", sndtimeo);
Mark Salyzyn5c77ad52016-02-23 08:55:43 -0800763 sleep(sleep_time);
764
765 // flush will block if we did not trigger. if it did, last entry returns 0
766 int recv_ret;
767 do {
768 recv_ret = recv(fd, msg.buf, sizeof(msg), 0);
769 } while (recv_ret > 0);
770 int save_errno = (recv_ret < 0) ? errno : 0;
771
772 EXPECT_NE(0U, alarm(old_alarm));
Mark Salyzynd392ac12017-04-27 14:46:31 -0700773 sigaction(SIGALRM, &old_sigaction, nullptr);
Mark Salyzyn5c77ad52016-02-23 08:55:43 -0800774
775 EXPECT_EQ(0, recv_ret);
776 if (recv_ret > 0) {
Tom Cherry441054a2019-10-15 16:53:11 -0700777 dump_log_msg("user", &msg, -1);
Mark Salyzyn5c77ad52016-02-23 08:55:43 -0800778 }
779 EXPECT_EQ(0, save_errno);
780
781 close(fd);
Mark Salyzyn2bd06f22016-12-27 13:30:03 -0800782#else
783 GTEST_LOG_(INFO) << "This test does nothing.\n";
784#endif
Mark Salyzyn5c77ad52016-02-23 08:55:43 -0800785}
Tom Cherrybd5a2832020-07-31 11:48:33 -0700786#endif
Mark Salyzyna2c02222016-12-13 10:31:29 -0800787
Mark Salyzyn61e9ce62016-09-12 14:51:54 -0700788TEST(logd, getEventTag_list) {
789#ifdef __ANDROID__
790 char buffer[256];
791 memset(buffer, 0, sizeof(buffer));
792 snprintf(buffer, sizeof(buffer), "getEventTag name=*");
793 send_to_control(buffer, sizeof(buffer));
794 buffer[sizeof(buffer) - 1] = '\0';
Mark Salyzyn501c3732017-03-10 14:31:54 -0800795 char* cp;
Mark Salyzyn61e9ce62016-09-12 14:51:54 -0700796 long ret = strtol(buffer, &cp, 10);
797 EXPECT_GT(ret, 4096);
798#else
799 GTEST_LOG_(INFO) << "This test does nothing.\n";
800#endif
801}
802
Mark Salyzyn407537f2017-02-21 16:19:08 -0800803TEST(logd, getEventTag_42) {
804#ifdef __ANDROID__
805 char buffer[256];
806 memset(buffer, 0, sizeof(buffer));
807 snprintf(buffer, sizeof(buffer), "getEventTag id=42");
808 send_to_control(buffer, sizeof(buffer));
809 buffer[sizeof(buffer) - 1] = '\0';
Mark Salyzyn501c3732017-03-10 14:31:54 -0800810 char* cp;
Mark Salyzyn407537f2017-02-21 16:19:08 -0800811 long ret = strtol(buffer, &cp, 10);
812 EXPECT_GT(ret, 16);
Mark Salyzynd392ac12017-04-27 14:46:31 -0700813 EXPECT_TRUE(strstr(buffer, "\t(to life the universe etc|3)") != nullptr);
814 EXPECT_TRUE(strstr(buffer, "answer") != nullptr);
Mark Salyzyn407537f2017-02-21 16:19:08 -0800815#else
816 GTEST_LOG_(INFO) << "This test does nothing.\n";
817#endif
818}
819
Mark Salyzyn61e9ce62016-09-12 14:51:54 -0700820TEST(logd, getEventTag_newentry) {
821#ifdef __ANDROID__
822 char buffer[256];
823 memset(buffer, 0, sizeof(buffer));
824 log_time now(CLOCK_MONOTONIC);
825 char name[64];
826 snprintf(name, sizeof(name), "a%" PRIu64, now.nsec());
Mark Salyzyn501c3732017-03-10 14:31:54 -0800827 snprintf(buffer, sizeof(buffer), "getEventTag name=%s format=\"(new|1)\"",
828 name);
Mark Salyzyn61e9ce62016-09-12 14:51:54 -0700829 send_to_control(buffer, sizeof(buffer));
830 buffer[sizeof(buffer) - 1] = '\0';
Mark Salyzyn501c3732017-03-10 14:31:54 -0800831 char* cp;
Mark Salyzyn61e9ce62016-09-12 14:51:54 -0700832 long ret = strtol(buffer, &cp, 10);
833 EXPECT_GT(ret, 16);
Mark Salyzynd392ac12017-04-27 14:46:31 -0700834 EXPECT_TRUE(strstr(buffer, "\t(new|1)") != nullptr);
835 EXPECT_TRUE(strstr(buffer, name) != nullptr);
Mark Salyzyn501c3732017-03-10 14:31:54 -0800836// ToDo: also look for this in /data/misc/logd/event-log-tags and
837// /dev/event-log-tags.
Mark Salyzyn61e9ce62016-09-12 14:51:54 -0700838#else
839 GTEST_LOG_(INFO) << "This test does nothing.\n";
840#endif
841}
Tom Cherry9b77d732020-08-07 10:27:37 -0700842
843TEST(logd, no_epipe) {
844#ifdef __ANDROID__
845 // Actually generating SIGPIPE in logd is racy, since we need to close the socket quicker than
846 // logd finishes writing the data to it, so we try 10 times, which should be enough to trigger
847 // SIGPIPE if logd isn't ignoring SIGPIPE
848 for (int i = 0; i < 10; ++i) {
849 unique_fd sock1(
850 socket_local_client("logd", ANDROID_SOCKET_NAMESPACE_RESERVED, SOCK_STREAM));
851 ASSERT_GT(sock1, 0);
852 unique_fd sock2(
853 socket_local_client("logd", ANDROID_SOCKET_NAMESPACE_RESERVED, SOCK_STREAM));
854 ASSERT_GT(sock2, 0);
855
856 std::string message = "getStatistics 0 1 2 3 4 5 6 7";
857
858 ASSERT_GT(write(sock1, message.c_str(), message.length()), 0);
859 sock1.reset();
860 ASSERT_GT(write(sock2, message.c_str(), message.length()), 0);
861
862 struct pollfd p = {.fd = sock2, .events = POLLIN, .revents = 0};
863
864 int ret = poll(&p, 1, 20);
865 EXPECT_EQ(ret, 1);
866 EXPECT_TRUE(p.revents & POLLIN);
867 EXPECT_FALSE(p.revents & POLL_ERR);
868 }
869#else
870 GTEST_LOG_(INFO) << "This test does nothing.\n";
871#endif
872}