blob: a936455f3dad8cb97062bb70503b30d7b422089f [file] [log] [blame]
Mark Salyzyn819c58a2013-11-22 12:39:43 -08001/*
2 * Copyright (C) 2013-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
17#include <fcntl.h>
Elliott Hughes5d9fe772014-02-05 17:50:35 -080018#include <inttypes.h>
Mark Salyzyncef098e2014-01-09 09:02:55 -080019#include <signal.h>
William Luh964428c2015-08-13 10:41:58 -070020#include <string.h>
Mark Salyzync1584562015-03-12 15:46:29 -070021
22#include <cutils/properties.h>
Mark Salyzyn819c58a2013-11-22 12:39:43 -080023#include <gtest/gtest.h>
24#include <log/log.h>
25#include <log/logger.h>
26#include <log/log_read.h>
Mark Salyzyn5045f572014-04-30 08:50:53 -070027#include <log/logprint.h>
Mark Salyzyn083b0372015-12-04 10:59:45 -080028#include <private/android_logger.h>
Mark Salyzyn819c58a2013-11-22 12:39:43 -080029
Mark Salyzyncef098e2014-01-09 09:02:55 -080030// enhanced version of LOG_FAILURE_RETRY to add support for EAGAIN and
31// non-syscall libs. Since we are only using this in the emergency of
32// a signal to stuff a terminating code into the logs, we will spin rather
33// than try a usleep.
34#define LOG_FAILURE_RETRY(exp) ({ \
35 typeof (exp) _rc; \
36 do { \
37 _rc = (exp); \
38 } while (((_rc == -1) \
39 && ((errno == EINTR) \
40 || (errno == EAGAIN))) \
41 || (_rc == -EINTR) \
42 || (_rc == -EAGAIN)); \
43 _rc; })
44
Mark Salyzyn819c58a2013-11-22 12:39:43 -080045TEST(liblog, __android_log_buf_print) {
Mark Salyzyn8196be32014-03-18 17:10:47 -070046 EXPECT_LT(0, __android_log_buf_print(LOG_ID_RADIO, ANDROID_LOG_INFO,
Mark Salyzyn819c58a2013-11-22 12:39:43 -080047 "TEST__android_log_buf_print",
48 "radio"));
49 usleep(1000);
Mark Salyzyn8196be32014-03-18 17:10:47 -070050 EXPECT_LT(0, __android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_INFO,
Mark Salyzyn819c58a2013-11-22 12:39:43 -080051 "TEST__android_log_buf_print",
52 "system"));
53 usleep(1000);
Mark Salyzyn8196be32014-03-18 17:10:47 -070054 EXPECT_LT(0, __android_log_buf_print(LOG_ID_MAIN, ANDROID_LOG_INFO,
Mark Salyzyn819c58a2013-11-22 12:39:43 -080055 "TEST__android_log_buf_print",
56 "main"));
57 usleep(1000);
58}
59
60TEST(liblog, __android_log_buf_write) {
Mark Salyzyn8196be32014-03-18 17:10:47 -070061 EXPECT_LT(0, __android_log_buf_write(LOG_ID_RADIO, ANDROID_LOG_INFO,
Mark Salyzyn819c58a2013-11-22 12:39:43 -080062 "TEST__android_log_buf_write",
63 "radio"));
64 usleep(1000);
Mark Salyzyn8196be32014-03-18 17:10:47 -070065 EXPECT_LT(0, __android_log_buf_write(LOG_ID_SYSTEM, ANDROID_LOG_INFO,
Mark Salyzyn819c58a2013-11-22 12:39:43 -080066 "TEST__android_log_buf_write",
67 "system"));
68 usleep(1000);
Mark Salyzyn8196be32014-03-18 17:10:47 -070069 EXPECT_LT(0, __android_log_buf_write(LOG_ID_MAIN, ANDROID_LOG_INFO,
Mark Salyzyn819c58a2013-11-22 12:39:43 -080070 "TEST__android_log_buf_write",
71 "main"));
72 usleep(1000);
73}
74
75TEST(liblog, __android_log_btwrite) {
76 int intBuf = 0xDEADBEEF;
Mark Salyzyn8196be32014-03-18 17:10:47 -070077 EXPECT_LT(0, __android_log_btwrite(0,
Mark Salyzyn819c58a2013-11-22 12:39:43 -080078 EVENT_TYPE_INT,
79 &intBuf, sizeof(intBuf)));
80 long long longBuf = 0xDEADBEEFA55A5AA5;
Mark Salyzyn8196be32014-03-18 17:10:47 -070081 EXPECT_LT(0, __android_log_btwrite(0,
Mark Salyzyn819c58a2013-11-22 12:39:43 -080082 EVENT_TYPE_LONG,
83 &longBuf, sizeof(longBuf)));
84 usleep(1000);
85 char Buf[] = "\20\0\0\0DeAdBeEfA55a5aA5";
Mark Salyzyn8196be32014-03-18 17:10:47 -070086 EXPECT_LT(0, __android_log_btwrite(0,
Mark Salyzyn819c58a2013-11-22 12:39:43 -080087 EVENT_TYPE_STRING,
88 Buf, sizeof(Buf) - 1));
89 usleep(1000);
90}
91
92static void* ConcurrentPrintFn(void *arg) {
93 int ret = __android_log_buf_print(LOG_ID_MAIN, ANDROID_LOG_INFO,
Elliott Hughes5d9fe772014-02-05 17:50:35 -080094 "TEST__android_log_print", "Concurrent %" PRIuPTR,
95 reinterpret_cast<uintptr_t>(arg));
Mark Salyzyn819c58a2013-11-22 12:39:43 -080096 return reinterpret_cast<void*>(ret);
97}
98
99#define NUM_CONCURRENT 64
100#define _concurrent_name(a,n) a##__concurrent##n
101#define concurrent_name(a,n) _concurrent_name(a,n)
102
103TEST(liblog, concurrent_name(__android_log_buf_print, NUM_CONCURRENT)) {
104 pthread_t t[NUM_CONCURRENT];
105 int i;
106 for (i=0; i < NUM_CONCURRENT; i++) {
107 ASSERT_EQ(0, pthread_create(&t[i], NULL,
108 ConcurrentPrintFn,
109 reinterpret_cast<void *>(i)));
110 }
111 int ret = 0;
112 for (i=0; i < NUM_CONCURRENT; i++) {
113 void* result;
114 ASSERT_EQ(0, pthread_join(t[i], &result));
Elliott Hughes5d9fe772014-02-05 17:50:35 -0800115 int this_result = reinterpret_cast<uintptr_t>(result);
116 if ((0 == ret) && (0 != this_result)) {
117 ret = this_result;
Mark Salyzyn819c58a2013-11-22 12:39:43 -0800118 }
119 }
120 ASSERT_LT(0, ret);
121}
122
123TEST(liblog, __android_log_btwrite__android_logger_list_read) {
124 struct logger_list *logger_list;
125
126 pid_t pid = getpid();
127
Mark Salyzyn8196be32014-03-18 17:10:47 -0700128 ASSERT_TRUE(NULL != (logger_list = android_logger_list_open(
Mark Salyzyn2d3f38a2015-01-26 10:46:44 -0800129 LOG_ID_EVENTS, ANDROID_LOG_RDONLY | ANDROID_LOG_NONBLOCK, 1000, pid)));
Mark Salyzyn819c58a2013-11-22 12:39:43 -0800130
131 log_time ts(CLOCK_MONOTONIC);
132
133 ASSERT_LT(0, __android_log_btwrite(0, EVENT_TYPE_LONG, &ts, sizeof(ts)));
134 usleep(1000000);
135
136 int count = 0;
137
138 for (;;) {
139 log_msg log_msg;
140 if (android_logger_list_read(logger_list, &log_msg) <= 0) {
141 break;
142 }
143
144 ASSERT_EQ(log_msg.entry.pid, pid);
145
146 if ((log_msg.entry.len != (4 + 1 + 8))
147 || (log_msg.id() != LOG_ID_EVENTS)) {
148 continue;
149 }
150
151 char *eventData = log_msg.msg();
152
153 if (eventData[4] != EVENT_TYPE_LONG) {
154 continue;
155 }
156
157 log_time tx(eventData + 4 + 1);
158 if (ts == tx) {
159 ++count;
160 }
161 }
162
Mark Salyzyn8196be32014-03-18 17:10:47 -0700163 EXPECT_EQ(1, count);
Mark Salyzyn819c58a2013-11-22 12:39:43 -0800164
165 android_logger_list_close(logger_list);
166}
167
Mark Salyzyn7cc80132016-01-20 13:52:46 -0800168static inline int32_t get4LE(const char* src)
169{
170 return src[0] | (src[1] << 8) | (src[2] << 16) | (src[3] << 24);
171}
172
173TEST(liblog, __android_log_bswrite) {
174 struct logger_list *logger_list;
175
176 pid_t pid = getpid();
177
178 ASSERT_TRUE(NULL != (logger_list = android_logger_list_open(
179 LOG_ID_EVENTS, ANDROID_LOG_RDONLY | ANDROID_LOG_NONBLOCK, 1000, pid)));
180
181 static const char buffer[] = "Hello World";
182 log_time ts(android_log_clockid());
183
184 ASSERT_LT(0, __android_log_bswrite(0, buffer));
185 usleep(1000000);
186
187 int count = 0;
188
189 for (;;) {
190 log_msg log_msg;
191 if (android_logger_list_read(logger_list, &log_msg) <= 0) {
192 break;
193 }
194
195 ASSERT_EQ(log_msg.entry.pid, pid);
196
197 if ((log_msg.entry.sec < (ts.tv_sec - 1))
198 || ((ts.tv_sec + 1) < log_msg.entry.sec)
199 || (log_msg.entry.len != (4 + 1 + 4 + sizeof(buffer) - 1))
200 || (log_msg.id() != LOG_ID_EVENTS)) {
201 continue;
202 }
203
204 char *eventData = log_msg.msg();
205
206 if (eventData[4] != EVENT_TYPE_STRING) {
207 continue;
208 }
209
210 int len = get4LE(eventData + 4 + 1);
211 if (len == (sizeof(buffer) - 1)) {
212 ++count;
213
214 AndroidLogFormat *logformat = android_log_format_new();
215 EXPECT_TRUE(NULL != logformat);
216 AndroidLogEntry entry;
217 char msgBuf[1024];
218 EXPECT_EQ(0, android_log_processBinaryLogBuffer(&log_msg.entry_v1,
219 &entry,
220 NULL,
221 msgBuf,
222 sizeof(msgBuf)));
223 fflush(stderr);
224 EXPECT_EQ(31, android_log_printLogLine(logformat, fileno(stderr), &entry));
225 android_log_format_free(logformat);
226 }
227 }
228
229 EXPECT_EQ(1, count);
230
231 android_logger_list_close(logger_list);
232}
233
234TEST(liblog, __android_log_bswrite__empty_string) {
235 struct logger_list *logger_list;
236
237 pid_t pid = getpid();
238
239 ASSERT_TRUE(NULL != (logger_list = android_logger_list_open(
240 LOG_ID_EVENTS, ANDROID_LOG_RDONLY | ANDROID_LOG_NONBLOCK, 1000, pid)));
241
242 static const char buffer[] = "";
243 log_time ts(android_log_clockid());
244
245 ASSERT_LT(0, __android_log_bswrite(0, buffer));
246 usleep(1000000);
247
248 int count = 0;
249
250 for (;;) {
251 log_msg log_msg;
252 if (android_logger_list_read(logger_list, &log_msg) <= 0) {
253 break;
254 }
255
256 ASSERT_EQ(log_msg.entry.pid, pid);
257
258 if ((log_msg.entry.sec < (ts.tv_sec - 1))
259 || ((ts.tv_sec + 1) < log_msg.entry.sec)
260 || (log_msg.entry.len != (4 + 1 + 4))
261 || (log_msg.id() != LOG_ID_EVENTS)) {
262 continue;
263 }
264
265 char *eventData = log_msg.msg();
266
267 if (eventData[4] != EVENT_TYPE_STRING) {
268 continue;
269 }
270
271 int len = get4LE(eventData + 4 + 1);
272 if (len == 0) {
273 ++count;
274
275 AndroidLogFormat *logformat = android_log_format_new();
276 EXPECT_TRUE(NULL != logformat);
277 AndroidLogEntry entry;
278 char msgBuf[1024];
279 EXPECT_EQ(0, android_log_processBinaryLogBuffer(&log_msg.entry_v1,
280 &entry,
281 NULL,
282 msgBuf,
283 sizeof(msgBuf)));
284 fflush(stderr);
285 EXPECT_EQ(20, android_log_printLogLine(logformat, fileno(stderr), &entry));
286 android_log_format_free(logformat);
287 }
288 }
289
290 EXPECT_EQ(1, count);
291
292 android_logger_list_close(logger_list);
293}
294
Mark Salyzynffbd86f2015-12-04 10:59:45 -0800295TEST(liblog, __security) {
296 static const char persist_key[] = "persist.logd.security";
297 static const char readonly_key[] = "ro.device_owner";
298 static const char nothing_val[] = "_NOTHING_TO_SEE_HERE_";
299 char persist[PROP_VALUE_MAX];
300 char readonly[PROP_VALUE_MAX];
301
302 property_get(persist_key, persist, "");
303 property_get(readonly_key, readonly, nothing_val);
304
305 if (!strcmp(readonly, nothing_val)) {
306 EXPECT_FALSE(__android_log_security());
307 fprintf(stderr, "Warning, setting ro.device_owner to a domain\n");
308 property_set(readonly_key, "com.google.android.SecOps.DeviceOwner");
309 } else if (!strcasecmp(readonly, "false") || !readonly[0]) {
310 EXPECT_FALSE(__android_log_security());
311 return;
312 }
313
314 if (!strcasecmp(persist, "true")) {
315 EXPECT_TRUE(__android_log_security());
316 } else {
317 EXPECT_FALSE(__android_log_security());
318 }
319 property_set(persist_key, "TRUE");
320 EXPECT_TRUE(__android_log_security());
321 property_set(persist_key, "FALSE");
322 EXPECT_FALSE(__android_log_security());
323 property_set(persist_key, "true");
324 EXPECT_TRUE(__android_log_security());
325 property_set(persist_key, "false");
326 EXPECT_FALSE(__android_log_security());
327 property_set(persist_key, "");
328 EXPECT_FALSE(__android_log_security());
329 property_set(persist_key, persist);
330}
331
Mark Salyzyn083b0372015-12-04 10:59:45 -0800332TEST(liblog, __security_buffer) {
333 struct logger_list *logger_list;
334 android_event_long_t buffer;
335
336 static const char persist_key[] = "persist.logd.security";
337 char persist[PROP_VALUE_MAX];
338 bool set_persist = false;
339 bool allow_security = false;
340
341 if (__android_log_security()) {
342 allow_security = true;
343 } else {
344 property_get(persist_key, persist, "");
345 if (strcasecmp(persist, "true")) {
346 property_set(persist_key, "TRUE");
347 if (__android_log_security()) {
348 allow_security = true;
349 set_persist = true;
350 } else {
351 property_set(persist_key, persist);
352 }
353 }
354 }
355
356 if (!allow_security) {
357 fprintf(stderr, "WARNING: "
358 "security buffer disabled, bypassing end-to-end test\n");
359
360 log_time ts(CLOCK_MONOTONIC);
361
362 buffer.type = EVENT_TYPE_LONG;
363 buffer.data = *(static_cast<uint64_t *>((void *)&ts));
364
365 // expect failure!
366 ASSERT_GE(0, __android_log_security_bwrite(0, &buffer, sizeof(buffer)));
367
368 return;
369 }
370
371 pid_t pid = getpid();
372
373 ASSERT_TRUE(NULL != (logger_list = android_logger_list_open(
374 LOG_ID_SECURITY, ANDROID_LOG_RDONLY | ANDROID_LOG_NONBLOCK,
375 1000, pid)));
376
377 log_time ts(CLOCK_MONOTONIC);
378
379 buffer.type = EVENT_TYPE_LONG;
380 buffer.data = *(static_cast<uint64_t *>((void *)&ts));
381
382 ASSERT_LT(0, __android_log_security_bwrite(0, &buffer, sizeof(buffer)));
383 usleep(1000000);
384
385 int count = 0;
386
387 for (;;) {
388 log_msg log_msg;
389 if (android_logger_list_read(logger_list, &log_msg) <= 0) {
390 break;
391 }
392
393 ASSERT_EQ(log_msg.entry.pid, pid);
394
395 if ((log_msg.entry.len != (4 + 1 + 8))
396 || (log_msg.id() != LOG_ID_SECURITY)) {
397 continue;
398 }
399
400 char *eventData = log_msg.msg();
401
402 if (eventData[4] != EVENT_TYPE_LONG) {
403 continue;
404 }
405
406 log_time tx(eventData + 4 + 1);
407 if (ts == tx) {
408 ++count;
409 }
410 }
411
412 if (set_persist) {
413 property_set(persist_key, persist);
414 }
415
416 android_logger_list_close(logger_list);
417
418 EXPECT_EQ(1, count);
419
420}
421
Mark Salyzyncef098e2014-01-09 09:02:55 -0800422static unsigned signaled;
423log_time signal_time;
424
Mark Salyzyna04464a2014-04-30 08:50:53 -0700425static void caught_blocking(int /*signum*/)
Mark Salyzyncef098e2014-01-09 09:02:55 -0800426{
427 unsigned long long v = 0xDEADBEEFA55A0000ULL;
428
429 v += getpid() & 0xFFFF;
430
431 ++signaled;
432 if ((signal_time.tv_sec == 0) && (signal_time.tv_nsec == 0)) {
Mark Salyzyn7e2f83c2014-03-05 07:41:49 -0800433 signal_time = log_time(CLOCK_MONOTONIC);
Mark Salyzyncef098e2014-01-09 09:02:55 -0800434 signal_time.tv_sec += 2;
435 }
436
437 LOG_FAILURE_RETRY(__android_log_btwrite(0, EVENT_TYPE_LONG, &v, sizeof(v)));
438}
439
440// Fill in current process user and system time in 10ms increments
441static void get_ticks(unsigned long long *uticks, unsigned long long *sticks)
442{
443 *uticks = *sticks = 0;
444
445 pid_t pid = getpid();
446
447 char buffer[512];
448 snprintf(buffer, sizeof(buffer), "/proc/%u/stat", pid);
449
450 FILE *fp = fopen(buffer, "r");
451 if (!fp) {
452 return;
453 }
454
455 char *cp = fgets(buffer, sizeof(buffer), fp);
456 fclose(fp);
457 if (!cp) {
458 return;
459 }
460
461 pid_t d;
462 char s[sizeof(buffer)];
463 char c;
464 long long ll;
465 unsigned long long ull;
466
467 if (15 != sscanf(buffer,
468 "%d %s %c %lld %lld %lld %lld %lld %llu %llu %llu %llu %llu %llu %llu ",
469 &d, s, &c, &ll, &ll, &ll, &ll, &ll, &ull, &ull, &ull, &ull, &ull,
470 uticks, sticks)) {
471 *uticks = *sticks = 0;
472 }
473}
474
475TEST(liblog, android_logger_list_read__cpu) {
476 struct logger_list *logger_list;
477 unsigned long long v = 0xDEADBEEFA55A0000ULL;
478
479 pid_t pid = getpid();
480
481 v += pid & 0xFFFF;
482
Mark Salyzyn8196be32014-03-18 17:10:47 -0700483 ASSERT_TRUE(NULL != (logger_list = android_logger_list_open(
Mark Salyzyn2d3f38a2015-01-26 10:46:44 -0800484 LOG_ID_EVENTS, ANDROID_LOG_RDONLY, 1000, pid)));
Mark Salyzyncef098e2014-01-09 09:02:55 -0800485
486 int count = 0;
487
488 int signals = 0;
489
490 unsigned long long uticks_start;
491 unsigned long long sticks_start;
492 get_ticks(&uticks_start, &sticks_start);
493
494 const unsigned alarm_time = 10;
495
496 memset(&signal_time, 0, sizeof(signal_time));
497
498 signal(SIGALRM, caught_blocking);
499 alarm(alarm_time);
500
501 signaled = 0;
502
503 do {
504 log_msg log_msg;
505 if (android_logger_list_read(logger_list, &log_msg) <= 0) {
506 break;
507 }
508
509 alarm(alarm_time);
510
511 ++count;
512
513 ASSERT_EQ(log_msg.entry.pid, pid);
514
515 if ((log_msg.entry.len != (4 + 1 + 8))
516 || (log_msg.id() != LOG_ID_EVENTS)) {
517 continue;
518 }
519
520 char *eventData = log_msg.msg();
521
522 if (eventData[4] != EVENT_TYPE_LONG) {
523 continue;
524 }
525
526 unsigned long long l = eventData[4 + 1 + 0] & 0xFF;
527 l |= (unsigned long long) (eventData[4 + 1 + 1] & 0xFF) << 8;
528 l |= (unsigned long long) (eventData[4 + 1 + 2] & 0xFF) << 16;
529 l |= (unsigned long long) (eventData[4 + 1 + 3] & 0xFF) << 24;
530 l |= (unsigned long long) (eventData[4 + 1 + 4] & 0xFF) << 32;
531 l |= (unsigned long long) (eventData[4 + 1 + 5] & 0xFF) << 40;
532 l |= (unsigned long long) (eventData[4 + 1 + 6] & 0xFF) << 48;
533 l |= (unsigned long long) (eventData[4 + 1 + 7] & 0xFF) << 56;
534
535 if (l == v) {
536 ++signals;
537 break;
538 }
Mark Salyzyn8196be32014-03-18 17:10:47 -0700539 } while (!signaled || (log_time(CLOCK_MONOTONIC) < signal_time));
Mark Salyzyncef098e2014-01-09 09:02:55 -0800540 alarm(0);
541 signal(SIGALRM, SIG_DFL);
542
Mark Salyzyn8196be32014-03-18 17:10:47 -0700543 EXPECT_LT(1, count);
Mark Salyzyncef098e2014-01-09 09:02:55 -0800544
Mark Salyzyn8196be32014-03-18 17:10:47 -0700545 EXPECT_EQ(1, signals);
Mark Salyzyncef098e2014-01-09 09:02:55 -0800546
547 android_logger_list_close(logger_list);
548
549 unsigned long long uticks_end;
550 unsigned long long sticks_end;
551 get_ticks(&uticks_end, &sticks_end);
552
553 // Less than 1% in either user or system time, or both
554 const unsigned long long one_percent_ticks = alarm_time;
555 unsigned long long user_ticks = uticks_end - uticks_start;
556 unsigned long long system_ticks = sticks_end - sticks_start;
Mark Salyzyn8196be32014-03-18 17:10:47 -0700557 EXPECT_GT(one_percent_ticks, user_ticks);
558 EXPECT_GT(one_percent_ticks, system_ticks);
559 EXPECT_GT(one_percent_ticks, user_ticks + system_ticks);
560}
561
562static const char max_payload_tag[] = "TEST_max_payload_XXXX";
Mark Salyzyn42ae8272015-12-03 15:37:00 -0800563#define SIZEOF_MAX_PAYLOAD_BUF (LOGGER_ENTRY_MAX_PAYLOAD - \
564 sizeof(max_payload_tag) - 1)
565static const char max_payload_buf[] = "LEONATO\n\
Mark Salyzyn8196be32014-03-18 17:10:47 -0700566I learn in this letter that Don Peter of Arragon\n\
567comes this night to Messina\n\
568MESSENGER\n\
569He is very near by this: he was not three leagues off\n\
570when I left him\n\
571LEONATO\n\
572How many gentlemen have you lost in this action?\n\
573MESSENGER\n\
574But few of any sort, and none of name\n\
575LEONATO\n\
576A victory is twice itself when the achiever brings\n\
577home full numbers. I find here that Don Peter hath\n\
578bestowed much honour on a young Florentine called Claudio\n\
579MESSENGER\n\
580Much deserved on his part and equally remembered by\n\
581Don Pedro: he hath borne himself beyond the\n\
582promise of his age, doing, in the figure of a lamb,\n\
583the feats of a lion: he hath indeed better\n\
584bettered expectation than you must expect of me to\n\
585tell you how\n\
586LEONATO\n\
587He hath an uncle here in Messina will be very much\n\
588glad of it.\n\
589MESSENGER\n\
590I have already delivered him letters, and there\n\
591appears much joy in him; even so much that joy could\n\
592not show itself modest enough without a badge of\n\
593bitterness.\n\
594LEONATO\n\
595Did he break out into tears?\n\
596MESSENGER\n\
597In great measure.\n\
598LEONATO\n\
599A kind overflow of kindness: there are no faces\n\
600truer than those that are so washed. How much\n\
601better is it to weep at joy than to joy at weeping!\n\
602BEATRICE\n\
603I pray you, is Signior Mountanto returned from the\n\
604wars or no?\n\
605MESSENGER\n\
606I know none of that name, lady: there was none such\n\
607in the army of any sort.\n\
608LEONATO\n\
609What is he that you ask for, niece?\n\
610HERO\n\
611My cousin means Signior Benedick of Padua.\n\
612MESSENGER\n\
613O, he's returned; and as pleasant as ever he was.\n\
614BEATRICE\n\
615He set up his bills here in Messina and challenged\n\
616Cupid at the flight; and my uncle's fool, reading\n\
617the challenge, subscribed for Cupid, and challenged\n\
618him at the bird-bolt. I pray you, how many hath he\n\
619killed and eaten in these wars? But how many hath\n\
620he killed? for indeed I promised to eat all of his killing.\n\
621LEONATO\n\
622Faith, niece, you tax Signior Benedick too much;\n\
623but he'll be meet with you, I doubt it not.\n\
624MESSENGER\n\
625He hath done good service, lady, in these wars.\n\
626BEATRICE\n\
627You had musty victual, and he hath holp to eat it:\n\
628he is a very valiant trencherman; he hath an\n\
629excellent stomach.\n\
630MESSENGER\n\
631And a good soldier too, lady.\n\
632BEATRICE\n\
633And a good soldier to a lady: but what is he to a lord?\n\
634MESSENGER\n\
635A lord to a lord, a man to a man; stuffed with all\n\
636honourable virtues.\n\
637BEATRICE\n\
638It is so, indeed; he is no less than a stuffed man:\n\
639but for the stuffing,--well, we are all mortal.\n\
640LEONATO\n\
641You must not, sir, mistake my niece. There is a\n\
642kind of merry war betwixt Signior Benedick and her:\n\
643they never meet but there's a skirmish of wit\n\
644between them.\n\
645BEATRICE\n\
646Alas! he gets nothing by that. In our last\n\
647conflict four of his five wits went halting off, and\n\
648now is the whole man governed with one: so that if\n\
649he have wit enough to keep himself warm, let him\n\
650bear it for a difference between himself and his\n\
651horse; for it is all the wealth that he hath left,\n\
652to be known a reasonable creature. Who is his\n\
653companion now? He hath every month a new sworn brother.\n\
654MESSENGER\n\
655Is't possible?\n\
656BEATRICE\n\
657Very easily possible: he wears his faith but as\n\
658the fashion of his hat; it ever changes with the\n\
659next block.\n\
660MESSENGER\n\
661I see, lady, the gentleman is not in your books.\n\
662BEATRICE\n\
663No; an he were, I would burn my study. But, I pray\n\
664you, who is his companion? Is there no young\n\
665squarer now that will make a voyage with him to the devil?\n\
666MESSENGER\n\
667He is most in the company of the right noble Claudio.\n\
668BEATRICE\n\
669O Lord, he will hang upon him like a disease: he\n\
670is sooner caught than the pestilence, and the taker\n\
671runs presently mad. God help the noble Claudio! if\n\
672he have caught the Benedick, it will cost him a\n\
673thousand pound ere a' be cured.\n\
674MESSENGER\n\
675I will hold friends with you, lady.\n\
676BEATRICE\n\
677Do, good friend.\n\
678LEONATO\n\
679You will never run mad, niece.\n\
680BEATRICE\n\
681No, not till a hot January.\n\
682MESSENGER\n\
683Don Pedro is approached.\n\
684Enter DON PEDRO, DON JOHN, CLAUDIO, BENEDICK, and BALTHASAR\n\
685\n\
686DON PEDRO\n\
687Good Signior Leonato, you are come to meet your\n\
688trouble: the fashion of the world is to avoid\n\
689cost, and you encounter it\n\
690LEONATO\n\
Mark Salyzyn42ae8272015-12-03 15:37:00 -0800691Never came trouble to my house in the likeness of your grace";
Mark Salyzyn8196be32014-03-18 17:10:47 -0700692
693TEST(liblog, max_payload) {
694 pid_t pid = getpid();
695 char tag[sizeof(max_payload_tag)];
696 memcpy(tag, max_payload_tag, sizeof(tag));
697 snprintf(tag + sizeof(tag) - 5, 5, "%04X", pid & 0xFFFF);
698
699 LOG_FAILURE_RETRY(__android_log_buf_write(LOG_ID_SYSTEM, ANDROID_LOG_INFO,
700 tag, max_payload_buf));
Mark Salyzync1584562015-03-12 15:46:29 -0700701 sleep(2);
Mark Salyzyn8196be32014-03-18 17:10:47 -0700702
703 struct logger_list *logger_list;
704
705 ASSERT_TRUE(NULL != (logger_list = android_logger_list_open(
Mark Salyzyn2d3f38a2015-01-26 10:46:44 -0800706 LOG_ID_SYSTEM, ANDROID_LOG_RDONLY, 100, 0)));
Mark Salyzyn8196be32014-03-18 17:10:47 -0700707
708 bool matches = false;
709 ssize_t max_len = 0;
710
711 for(;;) {
712 log_msg log_msg;
713 if (android_logger_list_read(logger_list, &log_msg) <= 0) {
714 break;
715 }
716
717 if ((log_msg.entry.pid != pid) || (log_msg.id() != LOG_ID_SYSTEM)) {
718 continue;
719 }
720
721 char *data = log_msg.msg() + 1;
722
723 if (strcmp(data, tag)) {
724 continue;
725 }
726
727 data += strlen(data) + 1;
728
729 const char *left = data;
730 const char *right = max_payload_buf;
731 while (*left && *right && (*left == *right)) {
732 ++left;
733 ++right;
734 }
735
736 if (max_len <= (left - data)) {
737 max_len = left - data + 1;
738 }
739
740 if (max_len > 512) {
741 matches = true;
742 break;
743 }
744 }
745
Mark Salyzyn8444eb82014-04-24 09:43:23 -0700746 android_logger_list_close(logger_list);
747
Mark Salyzyn8196be32014-03-18 17:10:47 -0700748 EXPECT_EQ(true, matches);
749
Mark Salyzyn42ae8272015-12-03 15:37:00 -0800750 EXPECT_LE(SIZEOF_MAX_PAYLOAD_BUF, static_cast<size_t>(max_len));
Mark Salyzyn8444eb82014-04-24 09:43:23 -0700751}
752
753TEST(liblog, too_big_payload) {
754 pid_t pid = getpid();
755 static const char big_payload_tag[] = "TEST_big_payload_XXXX";
756 char tag[sizeof(big_payload_tag)];
757 memcpy(tag, big_payload_tag, sizeof(tag));
758 snprintf(tag + sizeof(tag) - 5, 5, "%04X", pid & 0xFFFF);
759
760 std::string longString(3266519, 'x');
761
762 ssize_t ret = LOG_FAILURE_RETRY(__android_log_buf_write(LOG_ID_SYSTEM,
763 ANDROID_LOG_INFO, tag, longString.c_str()));
764
765 struct logger_list *logger_list;
766
767 ASSERT_TRUE(NULL != (logger_list = android_logger_list_open(
Mark Salyzyn2d3f38a2015-01-26 10:46:44 -0800768 LOG_ID_SYSTEM, ANDROID_LOG_RDONLY | ANDROID_LOG_NONBLOCK, 100, 0)));
Mark Salyzyn8444eb82014-04-24 09:43:23 -0700769
770 ssize_t max_len = 0;
771
772 for(;;) {
773 log_msg log_msg;
774 if (android_logger_list_read(logger_list, &log_msg) <= 0) {
775 break;
776 }
777
778 if ((log_msg.entry.pid != pid) || (log_msg.id() != LOG_ID_SYSTEM)) {
779 continue;
780 }
781
782 char *data = log_msg.msg() + 1;
783
784 if (strcmp(data, tag)) {
785 continue;
786 }
787
788 data += strlen(data) + 1;
789
790 const char *left = data;
791 const char *right = longString.c_str();
792 while (*left && *right && (*left == *right)) {
793 ++left;
794 ++right;
795 }
796
797 if (max_len <= (left - data)) {
798 max_len = left - data + 1;
799 }
800 }
Mark Salyzyn8196be32014-03-18 17:10:47 -0700801
802 android_logger_list_close(logger_list);
Mark Salyzyn8444eb82014-04-24 09:43:23 -0700803
804 EXPECT_LE(LOGGER_ENTRY_MAX_PAYLOAD - sizeof(big_payload_tag),
805 static_cast<size_t>(max_len));
806
Ben Cheng43232922014-05-20 10:38:24 -0700807 EXPECT_EQ(ret, max_len + static_cast<ssize_t>(sizeof(big_payload_tag)));
Mark Salyzyn8196be32014-03-18 17:10:47 -0700808}
809
810TEST(liblog, dual_reader) {
811 struct logger_list *logger_list1;
812
813 // >25 messages due to liblog.__android_log_buf_print__concurrentXX above.
814 ASSERT_TRUE(NULL != (logger_list1 = android_logger_list_open(
Mark Salyzyn2d3f38a2015-01-26 10:46:44 -0800815 LOG_ID_MAIN, ANDROID_LOG_RDONLY | ANDROID_LOG_NONBLOCK, 25, 0)));
Mark Salyzyn8196be32014-03-18 17:10:47 -0700816
817 struct logger_list *logger_list2;
818
819 if (NULL == (logger_list2 = android_logger_list_open(
Mark Salyzyn2d3f38a2015-01-26 10:46:44 -0800820 LOG_ID_MAIN, ANDROID_LOG_RDONLY | ANDROID_LOG_NONBLOCK, 15, 0))) {
Mark Salyzyn8196be32014-03-18 17:10:47 -0700821 android_logger_list_close(logger_list1);
822 ASSERT_TRUE(NULL != logger_list2);
823 }
824
825 int count1 = 0;
826 bool done1 = false;
827 int count2 = 0;
828 bool done2 = false;
829
830 do {
831 log_msg log_msg;
832
833 if (!done1) {
834 if (android_logger_list_read(logger_list1, &log_msg) <= 0) {
835 done1 = true;
836 } else {
837 ++count1;
838 }
839 }
840
841 if (!done2) {
842 if (android_logger_list_read(logger_list2, &log_msg) <= 0) {
843 done2 = true;
844 } else {
845 ++count2;
846 }
847 }
848 } while ((!done1) || (!done2));
849
850 android_logger_list_close(logger_list1);
851 android_logger_list_close(logger_list2);
852
853 EXPECT_EQ(25, count1);
854 EXPECT_EQ(15, count2);
Mark Salyzyncef098e2014-01-09 09:02:55 -0800855}
856
Mark Salyzyn819c58a2013-11-22 12:39:43 -0800857TEST(liblog, android_logger_get_) {
Mark Salyzyn2d3f38a2015-01-26 10:46:44 -0800858 struct logger_list * logger_list = android_logger_list_alloc(ANDROID_LOG_WRONLY, 0, 0);
Mark Salyzyn819c58a2013-11-22 12:39:43 -0800859
860 for(int i = LOG_ID_MIN; i < LOG_ID_MAX; ++i) {
861 log_id_t id = static_cast<log_id_t>(i);
862 const char *name = android_log_id_to_name(id);
863 if (id != android_name_to_log_id(name)) {
864 continue;
865 }
Mark Salyzync1584562015-03-12 15:46:29 -0700866 fprintf(stderr, "log buffer %s\r", name);
Mark Salyzyn819c58a2013-11-22 12:39:43 -0800867 struct logger * logger;
Mark Salyzyn8196be32014-03-18 17:10:47 -0700868 EXPECT_TRUE(NULL != (logger = android_logger_open(logger_list, id)));
869 EXPECT_EQ(id, android_logger_get_id(logger));
Mark Salyzyn7d8939e2015-12-01 12:47:43 -0800870 EXPECT_LT(0, android_logger_get_log_size(logger));
Mark Salyzync1584562015-03-12 15:46:29 -0700871 /* crash buffer is allowed to be empty, that is actually healthy! */
Mark Salyzyn083b0372015-12-04 10:59:45 -0800872 if (android_logger_get_log_readable_size(logger) ||
873 (strcmp("crash", name) && strcmp("security", name))) {
Mark Salyzyn7d8939e2015-12-01 12:47:43 -0800874 EXPECT_LT(0, android_logger_get_log_readable_size(logger));
Mark Salyzync1584562015-03-12 15:46:29 -0700875 }
Mark Salyzyn8196be32014-03-18 17:10:47 -0700876 EXPECT_LT(0, android_logger_get_log_version(logger));
Mark Salyzyn819c58a2013-11-22 12:39:43 -0800877 }
878
879 android_logger_list_close(logger_list);
880}
Mark Salyzyn5045f572014-04-30 08:50:53 -0700881
882static bool checkPriForTag(AndroidLogFormat *p_format, const char *tag, android_LogPriority pri) {
883 return android_log_shouldPrintLine(p_format, tag, pri)
884 && !android_log_shouldPrintLine(p_format, tag, (android_LogPriority)(pri - 1));
885}
886
887TEST(liblog, filterRule) {
888 static const char tag[] = "random";
889
890 AndroidLogFormat *p_format = android_log_format_new();
891
892 android_log_addFilterRule(p_format,"*:i");
893
894 EXPECT_TRUE(checkPriForTag(p_format, tag, ANDROID_LOG_INFO));
895 EXPECT_TRUE(android_log_shouldPrintLine(p_format, tag, ANDROID_LOG_DEBUG) == 0);
896 android_log_addFilterRule(p_format, "*");
897 EXPECT_TRUE (checkPriForTag(p_format, tag, ANDROID_LOG_DEBUG));
898 EXPECT_TRUE(android_log_shouldPrintLine(p_format, tag, ANDROID_LOG_DEBUG) > 0);
899 android_log_addFilterRule(p_format, "*:v");
900 EXPECT_TRUE (checkPriForTag(p_format, tag, ANDROID_LOG_VERBOSE));
901 EXPECT_TRUE(android_log_shouldPrintLine(p_format, tag, ANDROID_LOG_DEBUG) > 0);
902 android_log_addFilterRule(p_format, "*:i");
903 EXPECT_TRUE (checkPriForTag(p_format, tag, ANDROID_LOG_INFO));
904 EXPECT_TRUE(android_log_shouldPrintLine(p_format, tag, ANDROID_LOG_DEBUG) == 0);
905
906 android_log_addFilterRule(p_format, tag);
907 EXPECT_TRUE (checkPriForTag(p_format, tag, ANDROID_LOG_VERBOSE));
908 EXPECT_TRUE(android_log_shouldPrintLine(p_format, tag, ANDROID_LOG_DEBUG) > 0);
909 android_log_addFilterRule(p_format, "random:v");
910 EXPECT_TRUE (checkPriForTag(p_format, tag, ANDROID_LOG_VERBOSE));
911 EXPECT_TRUE(android_log_shouldPrintLine(p_format, tag, ANDROID_LOG_DEBUG) > 0);
912 android_log_addFilterRule(p_format, "random:d");
913 EXPECT_TRUE (checkPriForTag(p_format, tag, ANDROID_LOG_DEBUG));
914 EXPECT_TRUE(android_log_shouldPrintLine(p_format, tag, ANDROID_LOG_DEBUG) > 0);
915 android_log_addFilterRule(p_format, "random:w");
916 EXPECT_TRUE (checkPriForTag(p_format, tag, ANDROID_LOG_WARN));
917 EXPECT_TRUE(android_log_shouldPrintLine(p_format, tag, ANDROID_LOG_DEBUG) == 0);
918
919 android_log_addFilterRule(p_format, "crap:*");
920 EXPECT_TRUE (checkPriForTag(p_format, "crap", ANDROID_LOG_VERBOSE));
921 EXPECT_TRUE(android_log_shouldPrintLine(p_format, "crap", ANDROID_LOG_VERBOSE) > 0);
922
923 // invalid expression
924 EXPECT_TRUE (android_log_addFilterRule(p_format, "random:z") < 0);
925 EXPECT_TRUE (checkPriForTag(p_format, tag, ANDROID_LOG_WARN));
926 EXPECT_TRUE(android_log_shouldPrintLine(p_format, tag, ANDROID_LOG_DEBUG) == 0);
927
928 // Issue #550946
929 EXPECT_TRUE(android_log_addFilterString(p_format, " ") == 0);
930 EXPECT_TRUE(checkPriForTag(p_format, tag, ANDROID_LOG_WARN));
931
932 // note trailing space
933 EXPECT_TRUE(android_log_addFilterString(p_format, "*:s random:d ") == 0);
934 EXPECT_TRUE(checkPriForTag(p_format, tag, ANDROID_LOG_DEBUG));
935
936 EXPECT_TRUE(android_log_addFilterString(p_format, "*:s random:z") < 0);
937
938#if 0 // bitrot, seek update
939 char defaultBuffer[512];
940
941 android_log_formatLogLine(p_format,
942 defaultBuffer, sizeof(defaultBuffer), 0, ANDROID_LOG_ERROR, 123,
943 123, 123, tag, "nofile", strlen("Hello"), "Hello", NULL);
944
945 fprintf(stderr, "%s\n", defaultBuffer);
946#endif
947
948 android_log_format_free(p_format);
949}
Mark Salyzync1584562015-03-12 15:46:29 -0700950
951TEST(liblog, is_loggable) {
952 static const char tag[] = "is_loggable";
953 static const char log_namespace[] = "persist.log.tag.";
954 static const size_t base_offset = 8; /* skip "persist." */
955 // sizeof("string") = strlen("string") + 1
956 char key[sizeof(log_namespace) + sizeof(tag) - 1];
957 char hold[4][PROP_VALUE_MAX];
958 static const struct {
959 int level;
960 char type;
961 } levels[] = {
962 { ANDROID_LOG_VERBOSE, 'v' },
963 { ANDROID_LOG_DEBUG , 'd' },
964 { ANDROID_LOG_INFO , 'i' },
965 { ANDROID_LOG_WARN , 'w' },
966 { ANDROID_LOG_ERROR , 'e' },
967 { ANDROID_LOG_FATAL , 'a' },
968 { -1 , 's' },
969 { -2 , 'g' }, // Illegal value, resort to default
970 };
971
972 // Set up initial test condition
973 memset(hold, 0, sizeof(hold));
974 snprintf(key, sizeof(key), "%s%s", log_namespace, tag);
975 property_get(key, hold[0], "");
976 property_set(key, "");
977 property_get(key + base_offset, hold[1], "");
978 property_set(key + base_offset, "");
979 strcpy(key, log_namespace);
980 key[sizeof(log_namespace) - 2] = '\0';
981 property_get(key, hold[2], "");
982 property_set(key, "");
983 property_get(key, hold[3], "");
984 property_set(key + base_offset, "");
985
986 // All combinations of level and defaults
987 for(size_t i = 0; i < (sizeof(levels) / sizeof(levels[0])); ++i) {
988 if (levels[i].level == -2) {
989 continue;
990 }
991 for(size_t j = 0; j < (sizeof(levels) / sizeof(levels[0])); ++j) {
992 if (levels[j].level == -2) {
993 continue;
994 }
995 fprintf(stderr, "i=%zu j=%zu\r", i, j);
Mark Salyzyn77c166b2015-12-07 16:09:22 -0800996 bool android_log_is_loggable = __android_log_is_loggable(
997 levels[i].level, tag, levels[j].level);
Mark Salyzync1584562015-03-12 15:46:29 -0700998 if ((levels[i].level < levels[j].level)
999 || (levels[j].level == -1)) {
Mark Salyzyn77c166b2015-12-07 16:09:22 -08001000 if (android_log_is_loggable) {
1001 fprintf(stderr, "\n");
1002 }
1003 EXPECT_FALSE(android_log_is_loggable);
1004 for(size_t k = 1000; k; --k) {
1005 EXPECT_FALSE(__android_log_is_loggable(
1006 levels[i].level, tag, levels[j].level));
1007 }
Mark Salyzync1584562015-03-12 15:46:29 -07001008 } else {
Mark Salyzyn77c166b2015-12-07 16:09:22 -08001009 if (!android_log_is_loggable) {
1010 fprintf(stderr, "\n");
1011 }
1012 EXPECT_TRUE(android_log_is_loggable);
1013 for(size_t k = 1000; k; --k) {
1014 EXPECT_TRUE(__android_log_is_loggable(
1015 levels[i].level, tag, levels[j].level));
1016 }
Mark Salyzync1584562015-03-12 15:46:29 -07001017 }
1018 }
1019 }
1020
1021 // All combinations of level and tag and global properties
1022 for(size_t i = 0; i < (sizeof(levels) / sizeof(levels[0])); ++i) {
1023 if (levels[i].level == -2) {
1024 continue;
1025 }
1026 for(size_t j = 0; j < (sizeof(levels) / sizeof(levels[0])); ++j) {
1027 char buf[2];
1028 buf[0] = levels[j].type;
1029 buf[1] = '\0';
1030
1031 snprintf(key, sizeof(key), "%s%s", log_namespace, tag);
1032 fprintf(stderr, "i=%zu j=%zu property_set(\"%s\",\"%s\")\r",
1033 i, j, key, buf);
1034 property_set(key, buf);
Mark Salyzyn77c166b2015-12-07 16:09:22 -08001035 bool android_log_is_loggable = __android_log_is_loggable(
1036 levels[i].level, tag, ANDROID_LOG_DEBUG);
Mark Salyzync1584562015-03-12 15:46:29 -07001037 if ((levels[i].level < levels[j].level)
1038 || (levels[j].level == -1)
1039 || ((levels[i].level < ANDROID_LOG_DEBUG)
1040 && (levels[j].level == -2))) {
Mark Salyzyn77c166b2015-12-07 16:09:22 -08001041 if (android_log_is_loggable) {
1042 fprintf(stderr, "\n");
1043 }
1044 EXPECT_FALSE(android_log_is_loggable);
1045 for(size_t k = 1000; k; --k) {
1046 EXPECT_FALSE(__android_log_is_loggable(
1047 levels[i].level, tag, ANDROID_LOG_DEBUG));
1048 }
Mark Salyzync1584562015-03-12 15:46:29 -07001049 } else {
Mark Salyzyn77c166b2015-12-07 16:09:22 -08001050 if (!android_log_is_loggable) {
1051 fprintf(stderr, "\n");
1052 }
1053 EXPECT_TRUE(android_log_is_loggable);
1054 for(size_t k = 1000; k; --k) {
1055 EXPECT_TRUE(__android_log_is_loggable(
1056 levels[i].level, tag, ANDROID_LOG_DEBUG));
1057 }
Mark Salyzync1584562015-03-12 15:46:29 -07001058 }
1059 property_set(key, "");
1060
1061 fprintf(stderr, "i=%zu j=%zu property_set(\"%s\",\"%s\")\r",
1062 i, j, key + base_offset, buf);
1063 property_set(key + base_offset, buf);
Mark Salyzyn77c166b2015-12-07 16:09:22 -08001064 android_log_is_loggable = __android_log_is_loggable(
1065 levels[i].level, tag, ANDROID_LOG_DEBUG);
Mark Salyzync1584562015-03-12 15:46:29 -07001066 if ((levels[i].level < levels[j].level)
1067 || (levels[j].level == -1)
1068 || ((levels[i].level < ANDROID_LOG_DEBUG)
1069 && (levels[j].level == -2))) {
Mark Salyzyn77c166b2015-12-07 16:09:22 -08001070 if (android_log_is_loggable) {
1071 fprintf(stderr, "\n");
1072 }
1073 EXPECT_FALSE(android_log_is_loggable);
1074 for(size_t k = 1000; k; --k) {
1075 EXPECT_FALSE(__android_log_is_loggable(
1076 levels[i].level, tag, ANDROID_LOG_DEBUG));
1077 }
Mark Salyzync1584562015-03-12 15:46:29 -07001078 } else {
Mark Salyzyn77c166b2015-12-07 16:09:22 -08001079 if (!android_log_is_loggable) {
1080 fprintf(stderr, "\n");
1081 }
1082 EXPECT_TRUE(android_log_is_loggable);
1083 for(size_t k = 1000; k; --k) {
1084 EXPECT_TRUE(__android_log_is_loggable(
1085 levels[i].level, tag, ANDROID_LOG_DEBUG));
1086 }
Mark Salyzync1584562015-03-12 15:46:29 -07001087 }
1088 property_set(key + base_offset, "");
1089
1090 strcpy(key, log_namespace);
1091 key[sizeof(log_namespace) - 2] = '\0';
1092 fprintf(stderr, "i=%zu j=%zu property_set(\"%s\",\"%s\")\r",
1093 i, j, key, buf);
1094 property_set(key, buf);
Mark Salyzyn77c166b2015-12-07 16:09:22 -08001095 android_log_is_loggable = __android_log_is_loggable(
1096 levels[i].level, tag, ANDROID_LOG_DEBUG);
Mark Salyzync1584562015-03-12 15:46:29 -07001097 if ((levels[i].level < levels[j].level)
1098 || (levels[j].level == -1)
1099 || ((levels[i].level < ANDROID_LOG_DEBUG)
1100 && (levels[j].level == -2))) {
Mark Salyzyn77c166b2015-12-07 16:09:22 -08001101 if (android_log_is_loggable) {
1102 fprintf(stderr, "\n");
1103 }
1104 EXPECT_FALSE(android_log_is_loggable);
1105 for(size_t k = 1000; k; --k) {
1106 EXPECT_FALSE(__android_log_is_loggable(
1107 levels[i].level, tag, ANDROID_LOG_DEBUG));
1108 }
Mark Salyzync1584562015-03-12 15:46:29 -07001109 } else {
Mark Salyzyn77c166b2015-12-07 16:09:22 -08001110 if (!android_log_is_loggable) {
1111 fprintf(stderr, "\n");
1112 }
1113 EXPECT_TRUE(android_log_is_loggable);
1114 for(size_t k = 1000; k; --k) {
1115 EXPECT_TRUE(__android_log_is_loggable(
1116 levels[i].level, tag, ANDROID_LOG_DEBUG));
1117 }
Mark Salyzync1584562015-03-12 15:46:29 -07001118 }
1119 property_set(key, "");
1120
1121 fprintf(stderr, "i=%zu j=%zu property_set(\"%s\",\"%s\")\r",
1122 i, j, key + base_offset, buf);
1123 property_set(key + base_offset, buf);
Mark Salyzyn77c166b2015-12-07 16:09:22 -08001124 android_log_is_loggable = __android_log_is_loggable(
1125 levels[i].level, tag, ANDROID_LOG_DEBUG);
Mark Salyzync1584562015-03-12 15:46:29 -07001126 if ((levels[i].level < levels[j].level)
1127 || (levels[j].level == -1)
1128 || ((levels[i].level < ANDROID_LOG_DEBUG)
1129 && (levels[j].level == -2))) {
Mark Salyzyn77c166b2015-12-07 16:09:22 -08001130 if (android_log_is_loggable) {
1131 fprintf(stderr, "\n");
1132 }
1133 EXPECT_FALSE(android_log_is_loggable);
1134 for(size_t k = 1000; k; --k) {
1135 EXPECT_FALSE(__android_log_is_loggable(
1136 levels[i].level, tag, ANDROID_LOG_DEBUG));
1137 }
Mark Salyzync1584562015-03-12 15:46:29 -07001138 } else {
Mark Salyzyn77c166b2015-12-07 16:09:22 -08001139 if (!android_log_is_loggable) {
1140 fprintf(stderr, "\n");
1141 }
1142 EXPECT_TRUE(android_log_is_loggable);
1143 for(size_t k = 1000; k; --k) {
1144 EXPECT_TRUE(__android_log_is_loggable(
1145 levels[i].level, tag, ANDROID_LOG_DEBUG));
1146 }
Mark Salyzync1584562015-03-12 15:46:29 -07001147 }
1148 property_set(key + base_offset, "");
1149 }
1150 }
1151
1152 // All combinations of level and tag properties, but with global set to INFO
1153 strcpy(key, log_namespace);
1154 key[sizeof(log_namespace) - 2] = '\0';
1155 property_set(key, "I");
1156 snprintf(key, sizeof(key), "%s%s", log_namespace, tag);
1157 for(size_t i = 0; i < (sizeof(levels) / sizeof(levels[0])); ++i) {
1158 if (levels[i].level == -2) {
1159 continue;
1160 }
1161 for(size_t j = 0; j < (sizeof(levels) / sizeof(levels[0])); ++j) {
1162 char buf[2];
1163 buf[0] = levels[j].type;
1164 buf[1] = '\0';
1165
1166 fprintf(stderr, "i=%zu j=%zu property_set(\"%s\",\"%s\")\r",
1167 i, j, key, buf);
1168 property_set(key, buf);
Mark Salyzyn77c166b2015-12-07 16:09:22 -08001169 bool android_log_is_loggable = __android_log_is_loggable(
1170 levels[i].level, tag, ANDROID_LOG_DEBUG);
Mark Salyzync1584562015-03-12 15:46:29 -07001171 if ((levels[i].level < levels[j].level)
1172 || (levels[j].level == -1)
1173 || ((levels[i].level < ANDROID_LOG_INFO) // Yes INFO
1174 && (levels[j].level == -2))) {
Mark Salyzyn77c166b2015-12-07 16:09:22 -08001175 if (android_log_is_loggable) {
1176 fprintf(stderr, "\n");
1177 }
1178 EXPECT_FALSE(android_log_is_loggable);
1179 for(size_t k = 1000; k; --k) {
1180 EXPECT_FALSE(__android_log_is_loggable(
1181 levels[i].level, tag, ANDROID_LOG_DEBUG));
1182 }
Mark Salyzync1584562015-03-12 15:46:29 -07001183 } else {
Mark Salyzyn77c166b2015-12-07 16:09:22 -08001184 if (!android_log_is_loggable) {
1185 fprintf(stderr, "\n");
1186 }
1187 EXPECT_TRUE(android_log_is_loggable);
1188 for(size_t k = 1000; k; --k) {
1189 EXPECT_TRUE(__android_log_is_loggable(
1190 levels[i].level, tag, ANDROID_LOG_DEBUG));
1191 }
Mark Salyzync1584562015-03-12 15:46:29 -07001192 }
1193 property_set(key, "");
1194
1195 fprintf(stderr, "i=%zu j=%zu property_set(\"%s\",\"%s\")\r",
1196 i, j, key + base_offset, buf);
1197 property_set(key + base_offset, buf);
Mark Salyzyn77c166b2015-12-07 16:09:22 -08001198 android_log_is_loggable = __android_log_is_loggable(
1199 levels[i].level, tag, ANDROID_LOG_DEBUG);
Mark Salyzync1584562015-03-12 15:46:29 -07001200 if ((levels[i].level < levels[j].level)
1201 || (levels[j].level == -1)
1202 || ((levels[i].level < ANDROID_LOG_INFO) // Yes INFO
1203 && (levels[j].level == -2))) {
Mark Salyzyn77c166b2015-12-07 16:09:22 -08001204 if (android_log_is_loggable) {
1205 fprintf(stderr, "\n");
1206 }
1207 EXPECT_FALSE(android_log_is_loggable);
1208 for(size_t k = 1000; k; --k) {
1209 EXPECT_FALSE(__android_log_is_loggable(
1210 levels[i].level, tag, ANDROID_LOG_DEBUG));
1211 }
Mark Salyzync1584562015-03-12 15:46:29 -07001212 } else {
Mark Salyzyn77c166b2015-12-07 16:09:22 -08001213 if (!android_log_is_loggable) {
1214 fprintf(stderr, "\n");
1215 }
1216 EXPECT_TRUE(android_log_is_loggable);
1217 for(size_t k = 1000; k; --k) {
1218 EXPECT_TRUE(__android_log_is_loggable(
1219 levels[i].level, tag, ANDROID_LOG_DEBUG));
1220 }
Mark Salyzync1584562015-03-12 15:46:29 -07001221 }
1222 property_set(key + base_offset, "");
1223 }
1224 }
1225
1226 // reset parms
1227 snprintf(key, sizeof(key), "%s%s", log_namespace, tag);
1228 property_set(key, hold[0]);
1229 property_set(key + base_offset, hold[1]);
1230 strcpy(key, log_namespace);
1231 key[sizeof(log_namespace) - 2] = '\0';
1232 property_set(key, hold[2]);
1233 property_set(key + base_offset, hold[3]);
1234}
William Luh964428c2015-08-13 10:41:58 -07001235
William Luh964428c2015-08-13 10:41:58 -07001236TEST(liblog, android_errorWriteWithInfoLog__android_logger_list_read__typical) {
1237 const int TAG = 123456781;
1238 const char SUBTAG[] = "test-subtag";
1239 const int UID = -1;
1240 const int DATA_LEN = 200;
1241 struct logger_list *logger_list;
1242
1243 pid_t pid = getpid();
1244
1245 ASSERT_TRUE(NULL != (logger_list = android_logger_list_open(
1246 LOG_ID_EVENTS, ANDROID_LOG_RDONLY | ANDROID_LOG_NONBLOCK, 1000, pid)));
1247
1248 ASSERT_LT(0, android_errorWriteWithInfoLog(
1249 TAG, SUBTAG, UID, max_payload_buf, DATA_LEN));
1250
1251 sleep(2);
1252
1253 int count = 0;
1254
1255 for (;;) {
1256 log_msg log_msg;
1257 if (android_logger_list_read(logger_list, &log_msg) <= 0) {
1258 break;
1259 }
1260
1261 char *eventData = log_msg.msg();
1262
1263 // Tag
1264 int tag = get4LE(eventData);
1265 eventData += 4;
1266
1267 if (tag != TAG) {
1268 continue;
1269 }
1270
1271 // List type
1272 ASSERT_EQ(EVENT_TYPE_LIST, eventData[0]);
1273 eventData++;
1274
1275 // Number of elements in list
1276 ASSERT_EQ(3, eventData[0]);
1277 eventData++;
1278
1279 // Element #1: string type for subtag
1280 ASSERT_EQ(EVENT_TYPE_STRING, eventData[0]);
1281 eventData++;
1282
1283 ASSERT_EQ((int) strlen(SUBTAG), get4LE(eventData));
1284 eventData +=4;
1285
1286 if (memcmp(SUBTAG, eventData, strlen(SUBTAG))) {
1287 continue;
1288 }
1289 eventData += strlen(SUBTAG);
1290
1291 // Element #2: int type for uid
1292 ASSERT_EQ(EVENT_TYPE_INT, eventData[0]);
1293 eventData++;
1294
1295 ASSERT_EQ(UID, get4LE(eventData));
1296 eventData += 4;
1297
1298 // Element #3: string type for data
1299 ASSERT_EQ(EVENT_TYPE_STRING, eventData[0]);
1300 eventData++;
1301
1302 ASSERT_EQ(DATA_LEN, get4LE(eventData));
1303 eventData += 4;
1304
1305 if (memcmp(max_payload_buf, eventData, DATA_LEN)) {
1306 continue;
1307 }
1308
1309 ++count;
1310 }
1311
1312 EXPECT_EQ(1, count);
1313
1314 android_logger_list_close(logger_list);
1315}
1316
1317TEST(liblog, android_errorWriteWithInfoLog__android_logger_list_read__data_too_large) {
1318 const int TAG = 123456782;
1319 const char SUBTAG[] = "test-subtag";
1320 const int UID = -1;
Mark Salyzyn42ae8272015-12-03 15:37:00 -08001321 const int DATA_LEN = SIZEOF_MAX_PAYLOAD_BUF;
William Luh964428c2015-08-13 10:41:58 -07001322 struct logger_list *logger_list;
1323
1324 pid_t pid = getpid();
1325
1326 ASSERT_TRUE(NULL != (logger_list = android_logger_list_open(
1327 LOG_ID_EVENTS, ANDROID_LOG_RDONLY | ANDROID_LOG_NONBLOCK, 1000, pid)));
1328
1329 ASSERT_LT(0, android_errorWriteWithInfoLog(
1330 TAG, SUBTAG, UID, max_payload_buf, DATA_LEN));
1331
1332 sleep(2);
1333
1334 int count = 0;
1335
1336 for (;;) {
1337 log_msg log_msg;
1338 if (android_logger_list_read(logger_list, &log_msg) <= 0) {
1339 break;
1340 }
1341
1342 char *eventData = log_msg.msg();
1343 char *original = eventData;
1344
1345 // Tag
1346 int tag = get4LE(eventData);
1347 eventData += 4;
1348
1349 if (tag != TAG) {
1350 continue;
1351 }
1352
1353 // List type
1354 ASSERT_EQ(EVENT_TYPE_LIST, eventData[0]);
1355 eventData++;
1356
1357 // Number of elements in list
1358 ASSERT_EQ(3, eventData[0]);
1359 eventData++;
1360
1361 // Element #1: string type for subtag
1362 ASSERT_EQ(EVENT_TYPE_STRING, eventData[0]);
1363 eventData++;
1364
1365 ASSERT_EQ((int) strlen(SUBTAG), get4LE(eventData));
1366 eventData +=4;
1367
1368 if (memcmp(SUBTAG, eventData, strlen(SUBTAG))) {
1369 continue;
1370 }
1371 eventData += strlen(SUBTAG);
1372
1373 // Element #2: int type for uid
1374 ASSERT_EQ(EVENT_TYPE_INT, eventData[0]);
1375 eventData++;
1376
1377 ASSERT_EQ(UID, get4LE(eventData));
1378 eventData += 4;
1379
1380 // Element #3: string type for data
1381 ASSERT_EQ(EVENT_TYPE_STRING, eventData[0]);
1382 eventData++;
1383
1384 size_t dataLen = get4LE(eventData);
1385 eventData += 4;
1386
1387 if (memcmp(max_payload_buf, eventData, dataLen)) {
1388 continue;
1389 }
1390 eventData += dataLen;
1391
Mark Salyzyn42ae8272015-12-03 15:37:00 -08001392 // 4 bytes for the tag, and 512 bytes for the log since the
1393 // max_payload_buf should be truncated.
William Luh964428c2015-08-13 10:41:58 -07001394 ASSERT_EQ(4 + 512, eventData - original);
1395
1396 ++count;
1397 }
1398
1399 EXPECT_EQ(1, count);
1400
1401 android_logger_list_close(logger_list);
1402}
1403
1404TEST(liblog, android_errorWriteWithInfoLog__android_logger_list_read__null_data) {
1405 const int TAG = 123456783;
1406 const char SUBTAG[] = "test-subtag";
1407 const int UID = -1;
1408 const int DATA_LEN = 200;
1409 struct logger_list *logger_list;
1410
1411 pid_t pid = getpid();
1412
1413 ASSERT_TRUE(NULL != (logger_list = android_logger_list_open(
1414 LOG_ID_EVENTS, ANDROID_LOG_RDONLY | ANDROID_LOG_NONBLOCK, 1000, pid)));
1415
1416 ASSERT_GT(0, android_errorWriteWithInfoLog(
1417 TAG, SUBTAG, UID, NULL, DATA_LEN));
1418
1419 sleep(2);
1420
1421 int count = 0;
1422
1423 for (;;) {
1424 log_msg log_msg;
1425 if (android_logger_list_read(logger_list, &log_msg) <= 0) {
1426 break;
1427 }
1428
1429 char *eventData = log_msg.msg();
1430
1431 // Tag
1432 int tag = get4LE(eventData);
1433 eventData += 4;
1434
1435 if (tag == TAG) {
1436 // This tag should not have been written because the data was null
1437 count++;
1438 break;
1439 }
1440 }
1441
1442 EXPECT_EQ(0, count);
1443
1444 android_logger_list_close(logger_list);
1445}
1446
1447TEST(liblog, android_errorWriteWithInfoLog__android_logger_list_read__subtag_too_long) {
1448 const int TAG = 123456784;
1449 const char SUBTAG[] = "abcdefghijklmnopqrstuvwxyz now i know my abc";
1450 const int UID = -1;
1451 const int DATA_LEN = 200;
1452 struct logger_list *logger_list;
1453
1454 pid_t pid = getpid();
1455
1456 ASSERT_TRUE(NULL != (logger_list = android_logger_list_open(
1457 LOG_ID_EVENTS, ANDROID_LOG_RDONLY | ANDROID_LOG_NONBLOCK, 1000, pid)));
1458
1459 ASSERT_LT(0, android_errorWriteWithInfoLog(
1460 TAG, SUBTAG, UID, max_payload_buf, DATA_LEN));
1461
1462 sleep(2);
1463
1464 int count = 0;
1465
1466 for (;;) {
1467 log_msg log_msg;
1468 if (android_logger_list_read(logger_list, &log_msg) <= 0) {
1469 break;
1470 }
1471
1472 char *eventData = log_msg.msg();
1473
1474 // Tag
1475 int tag = get4LE(eventData);
1476 eventData += 4;
1477
1478 if (tag != TAG) {
1479 continue;
1480 }
1481
1482 // List type
1483 ASSERT_EQ(EVENT_TYPE_LIST, eventData[0]);
1484 eventData++;
1485
1486 // Number of elements in list
1487 ASSERT_EQ(3, eventData[0]);
1488 eventData++;
1489
1490 // Element #1: string type for subtag
1491 ASSERT_EQ(EVENT_TYPE_STRING, eventData[0]);
1492 eventData++;
1493
1494 // The subtag is longer than 32 and should be truncated to that.
1495 ASSERT_EQ(32, get4LE(eventData));
1496 eventData +=4;
1497
1498 if (memcmp(SUBTAG, eventData, 32)) {
1499 continue;
1500 }
1501 eventData += 32;
1502
1503 // Element #2: int type for uid
1504 ASSERT_EQ(EVENT_TYPE_INT, eventData[0]);
1505 eventData++;
1506
1507 ASSERT_EQ(UID, get4LE(eventData));
1508 eventData += 4;
1509
1510 // Element #3: string type for data
1511 ASSERT_EQ(EVENT_TYPE_STRING, eventData[0]);
1512 eventData++;
1513
1514 ASSERT_EQ(DATA_LEN, get4LE(eventData));
1515 eventData += 4;
1516
1517 if (memcmp(max_payload_buf, eventData, DATA_LEN)) {
1518 continue;
1519 }
1520
1521 ++count;
1522 }
1523
1524 EXPECT_EQ(1, count);
1525
1526 android_logger_list_close(logger_list);
1527}
1528
1529TEST(liblog, android_errorWriteLog__android_logger_list_read__success) {
1530 const int TAG = 123456785;
1531 const char SUBTAG[] = "test-subtag";
1532 struct logger_list *logger_list;
1533
1534 pid_t pid = getpid();
1535
1536 ASSERT_TRUE(NULL != (logger_list = android_logger_list_open(
1537 LOG_ID_EVENTS, ANDROID_LOG_RDONLY | ANDROID_LOG_NONBLOCK, 1000, pid)));
1538
1539 ASSERT_LT(0, android_errorWriteLog(TAG, SUBTAG));
1540
1541 sleep(2);
1542
1543 int count = 0;
1544
1545 for (;;) {
1546 log_msg log_msg;
1547 if (android_logger_list_read(logger_list, &log_msg) <= 0) {
1548 break;
1549 }
1550
1551 char *eventData = log_msg.msg();
1552
1553 // Tag
1554 int tag = get4LE(eventData);
1555 eventData += 4;
1556
1557 if (tag != TAG) {
1558 continue;
1559 }
1560
1561 // List type
1562 ASSERT_EQ(EVENT_TYPE_LIST, eventData[0]);
1563 eventData++;
1564
1565 // Number of elements in list
1566 ASSERT_EQ(3, eventData[0]);
1567 eventData++;
1568
1569 // Element #1: string type for subtag
1570 ASSERT_EQ(EVENT_TYPE_STRING, eventData[0]);
1571 eventData++;
1572
1573 ASSERT_EQ((int) strlen(SUBTAG), get4LE(eventData));
1574 eventData +=4;
1575
1576 if (memcmp(SUBTAG, eventData, strlen(SUBTAG))) {
1577 continue;
1578 }
1579 ++count;
1580 }
1581
1582 EXPECT_EQ(1, count);
1583
1584 android_logger_list_close(logger_list);
1585}
1586
1587TEST(liblog, android_errorWriteLog__android_logger_list_read__null_subtag) {
1588 const int TAG = 123456786;
1589 struct logger_list *logger_list;
1590
1591 pid_t pid = getpid();
1592
1593 ASSERT_TRUE(NULL != (logger_list = android_logger_list_open(
1594 LOG_ID_EVENTS, ANDROID_LOG_RDONLY | ANDROID_LOG_NONBLOCK, 1000, pid)));
1595
1596 ASSERT_GT(0, android_errorWriteLog(TAG, NULL));
1597
1598 sleep(2);
1599
1600 int count = 0;
1601
1602 for (;;) {
1603 log_msg log_msg;
1604 if (android_logger_list_read(logger_list, &log_msg) <= 0) {
1605 break;
1606 }
1607
1608 char *eventData = log_msg.msg();
1609
1610 // Tag
1611 int tag = get4LE(eventData);
1612 eventData += 4;
1613
1614 if (tag == TAG) {
1615 // This tag should not have been written because the data was null
1616 count++;
1617 break;
1618 }
1619 }
1620
1621 EXPECT_EQ(0, count);
1622
1623 android_logger_list_close(logger_list);
1624}