blob: 8517c9f89cefeecbf17722edcc9993cd98e345b1 [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 Salyzyn8fa88962016-01-26 14:32:35 -080021#include <sys/types.h>
22#include <unistd.h>
Mark Salyzync1584562015-03-12 15:46:29 -070023
24#include <cutils/properties.h>
Mark Salyzyn819c58a2013-11-22 12:39:43 -080025#include <gtest/gtest.h>
26#include <log/log.h>
27#include <log/logger.h>
28#include <log/log_read.h>
Mark Salyzyn5045f572014-04-30 08:50:53 -070029#include <log/logprint.h>
Mark Salyzyn8fa88962016-01-26 14:32:35 -080030#include <private/android_filesystem_config.h>
Mark Salyzyn083b0372015-12-04 10:59:45 -080031#include <private/android_logger.h>
Mark Salyzyn819c58a2013-11-22 12:39:43 -080032
Mark Salyzyncef098e2014-01-09 09:02:55 -080033// enhanced version of LOG_FAILURE_RETRY to add support for EAGAIN and
34// non-syscall libs. Since we are only using this in the emergency of
35// a signal to stuff a terminating code into the logs, we will spin rather
36// than try a usleep.
37#define LOG_FAILURE_RETRY(exp) ({ \
38 typeof (exp) _rc; \
39 do { \
40 _rc = (exp); \
41 } while (((_rc == -1) \
42 && ((errno == EINTR) \
43 || (errno == EAGAIN))) \
44 || (_rc == -EINTR) \
45 || (_rc == -EAGAIN)); \
46 _rc; })
47
Mark Salyzyn819c58a2013-11-22 12:39:43 -080048TEST(liblog, __android_log_buf_print) {
Mark Salyzyn8196be32014-03-18 17:10:47 -070049 EXPECT_LT(0, __android_log_buf_print(LOG_ID_RADIO, ANDROID_LOG_INFO,
Mark Salyzyn819c58a2013-11-22 12:39:43 -080050 "TEST__android_log_buf_print",
51 "radio"));
52 usleep(1000);
Mark Salyzyn8196be32014-03-18 17:10:47 -070053 EXPECT_LT(0, __android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_INFO,
Mark Salyzyn819c58a2013-11-22 12:39:43 -080054 "TEST__android_log_buf_print",
55 "system"));
56 usleep(1000);
Mark Salyzyn8196be32014-03-18 17:10:47 -070057 EXPECT_LT(0, __android_log_buf_print(LOG_ID_MAIN, ANDROID_LOG_INFO,
Mark Salyzyn819c58a2013-11-22 12:39:43 -080058 "TEST__android_log_buf_print",
59 "main"));
60 usleep(1000);
61}
62
63TEST(liblog, __android_log_buf_write) {
Mark Salyzyn8196be32014-03-18 17:10:47 -070064 EXPECT_LT(0, __android_log_buf_write(LOG_ID_RADIO, ANDROID_LOG_INFO,
Mark Salyzyn819c58a2013-11-22 12:39:43 -080065 "TEST__android_log_buf_write",
66 "radio"));
67 usleep(1000);
Mark Salyzyn8196be32014-03-18 17:10:47 -070068 EXPECT_LT(0, __android_log_buf_write(LOG_ID_SYSTEM, ANDROID_LOG_INFO,
Mark Salyzyn819c58a2013-11-22 12:39:43 -080069 "TEST__android_log_buf_write",
70 "system"));
71 usleep(1000);
Mark Salyzyn8196be32014-03-18 17:10:47 -070072 EXPECT_LT(0, __android_log_buf_write(LOG_ID_MAIN, ANDROID_LOG_INFO,
Mark Salyzyn819c58a2013-11-22 12:39:43 -080073 "TEST__android_log_buf_write",
74 "main"));
75 usleep(1000);
76}
77
78TEST(liblog, __android_log_btwrite) {
79 int intBuf = 0xDEADBEEF;
Mark Salyzyn8196be32014-03-18 17:10:47 -070080 EXPECT_LT(0, __android_log_btwrite(0,
Mark Salyzyn819c58a2013-11-22 12:39:43 -080081 EVENT_TYPE_INT,
82 &intBuf, sizeof(intBuf)));
83 long long longBuf = 0xDEADBEEFA55A5AA5;
Mark Salyzyn8196be32014-03-18 17:10:47 -070084 EXPECT_LT(0, __android_log_btwrite(0,
Mark Salyzyn819c58a2013-11-22 12:39:43 -080085 EVENT_TYPE_LONG,
86 &longBuf, sizeof(longBuf)));
87 usleep(1000);
88 char Buf[] = "\20\0\0\0DeAdBeEfA55a5aA5";
Mark Salyzyn8196be32014-03-18 17:10:47 -070089 EXPECT_LT(0, __android_log_btwrite(0,
Mark Salyzyn819c58a2013-11-22 12:39:43 -080090 EVENT_TYPE_STRING,
91 Buf, sizeof(Buf) - 1));
92 usleep(1000);
93}
94
95static void* ConcurrentPrintFn(void *arg) {
96 int ret = __android_log_buf_print(LOG_ID_MAIN, ANDROID_LOG_INFO,
Elliott Hughes5d9fe772014-02-05 17:50:35 -080097 "TEST__android_log_print", "Concurrent %" PRIuPTR,
98 reinterpret_cast<uintptr_t>(arg));
Mark Salyzyn819c58a2013-11-22 12:39:43 -080099 return reinterpret_cast<void*>(ret);
100}
101
102#define NUM_CONCURRENT 64
103#define _concurrent_name(a,n) a##__concurrent##n
104#define concurrent_name(a,n) _concurrent_name(a,n)
105
106TEST(liblog, concurrent_name(__android_log_buf_print, NUM_CONCURRENT)) {
107 pthread_t t[NUM_CONCURRENT];
108 int i;
109 for (i=0; i < NUM_CONCURRENT; i++) {
110 ASSERT_EQ(0, pthread_create(&t[i], NULL,
111 ConcurrentPrintFn,
112 reinterpret_cast<void *>(i)));
113 }
114 int ret = 0;
115 for (i=0; i < NUM_CONCURRENT; i++) {
116 void* result;
117 ASSERT_EQ(0, pthread_join(t[i], &result));
Elliott Hughes5d9fe772014-02-05 17:50:35 -0800118 int this_result = reinterpret_cast<uintptr_t>(result);
119 if ((0 == ret) && (0 != this_result)) {
120 ret = this_result;
Mark Salyzyn819c58a2013-11-22 12:39:43 -0800121 }
122 }
123 ASSERT_LT(0, ret);
124}
125
126TEST(liblog, __android_log_btwrite__android_logger_list_read) {
127 struct logger_list *logger_list;
128
129 pid_t pid = getpid();
130
Mark Salyzyn8196be32014-03-18 17:10:47 -0700131 ASSERT_TRUE(NULL != (logger_list = android_logger_list_open(
Mark Salyzyn2d3f38a2015-01-26 10:46:44 -0800132 LOG_ID_EVENTS, ANDROID_LOG_RDONLY | ANDROID_LOG_NONBLOCK, 1000, pid)));
Mark Salyzyn819c58a2013-11-22 12:39:43 -0800133
134 log_time ts(CLOCK_MONOTONIC);
135
136 ASSERT_LT(0, __android_log_btwrite(0, EVENT_TYPE_LONG, &ts, sizeof(ts)));
137 usleep(1000000);
138
139 int count = 0;
140
141 for (;;) {
142 log_msg log_msg;
143 if (android_logger_list_read(logger_list, &log_msg) <= 0) {
144 break;
145 }
146
147 ASSERT_EQ(log_msg.entry.pid, pid);
148
149 if ((log_msg.entry.len != (4 + 1 + 8))
150 || (log_msg.id() != LOG_ID_EVENTS)) {
151 continue;
152 }
153
154 char *eventData = log_msg.msg();
155
156 if (eventData[4] != EVENT_TYPE_LONG) {
157 continue;
158 }
159
160 log_time tx(eventData + 4 + 1);
161 if (ts == tx) {
162 ++count;
163 }
164 }
165
Mark Salyzyn8196be32014-03-18 17:10:47 -0700166 EXPECT_EQ(1, count);
Mark Salyzyn819c58a2013-11-22 12:39:43 -0800167
168 android_logger_list_close(logger_list);
169}
170
Mark Salyzyn7cc80132016-01-20 13:52:46 -0800171static inline int32_t get4LE(const char* src)
172{
173 return src[0] | (src[1] << 8) | (src[2] << 16) | (src[3] << 24);
174}
175
176TEST(liblog, __android_log_bswrite) {
177 struct logger_list *logger_list;
178
179 pid_t pid = getpid();
180
181 ASSERT_TRUE(NULL != (logger_list = android_logger_list_open(
182 LOG_ID_EVENTS, ANDROID_LOG_RDONLY | ANDROID_LOG_NONBLOCK, 1000, pid)));
183
184 static const char buffer[] = "Hello World";
185 log_time ts(android_log_clockid());
186
187 ASSERT_LT(0, __android_log_bswrite(0, buffer));
188 usleep(1000000);
189
190 int count = 0;
191
192 for (;;) {
193 log_msg log_msg;
194 if (android_logger_list_read(logger_list, &log_msg) <= 0) {
195 break;
196 }
197
198 ASSERT_EQ(log_msg.entry.pid, pid);
199
200 if ((log_msg.entry.sec < (ts.tv_sec - 1))
201 || ((ts.tv_sec + 1) < log_msg.entry.sec)
202 || (log_msg.entry.len != (4 + 1 + 4 + sizeof(buffer) - 1))
203 || (log_msg.id() != LOG_ID_EVENTS)) {
204 continue;
205 }
206
207 char *eventData = log_msg.msg();
208
209 if (eventData[4] != EVENT_TYPE_STRING) {
210 continue;
211 }
212
213 int len = get4LE(eventData + 4 + 1);
214 if (len == (sizeof(buffer) - 1)) {
215 ++count;
216
217 AndroidLogFormat *logformat = android_log_format_new();
218 EXPECT_TRUE(NULL != logformat);
219 AndroidLogEntry entry;
220 char msgBuf[1024];
221 EXPECT_EQ(0, android_log_processBinaryLogBuffer(&log_msg.entry_v1,
222 &entry,
223 NULL,
224 msgBuf,
225 sizeof(msgBuf)));
226 fflush(stderr);
227 EXPECT_EQ(31, android_log_printLogLine(logformat, fileno(stderr), &entry));
228 android_log_format_free(logformat);
229 }
230 }
231
232 EXPECT_EQ(1, count);
233
234 android_logger_list_close(logger_list);
235}
236
237TEST(liblog, __android_log_bswrite__empty_string) {
238 struct logger_list *logger_list;
239
240 pid_t pid = getpid();
241
242 ASSERT_TRUE(NULL != (logger_list = android_logger_list_open(
243 LOG_ID_EVENTS, ANDROID_LOG_RDONLY | ANDROID_LOG_NONBLOCK, 1000, pid)));
244
245 static const char buffer[] = "";
246 log_time ts(android_log_clockid());
247
248 ASSERT_LT(0, __android_log_bswrite(0, buffer));
249 usleep(1000000);
250
251 int count = 0;
252
253 for (;;) {
254 log_msg log_msg;
255 if (android_logger_list_read(logger_list, &log_msg) <= 0) {
256 break;
257 }
258
259 ASSERT_EQ(log_msg.entry.pid, pid);
260
261 if ((log_msg.entry.sec < (ts.tv_sec - 1))
262 || ((ts.tv_sec + 1) < log_msg.entry.sec)
263 || (log_msg.entry.len != (4 + 1 + 4))
264 || (log_msg.id() != LOG_ID_EVENTS)) {
265 continue;
266 }
267
268 char *eventData = log_msg.msg();
269
270 if (eventData[4] != EVENT_TYPE_STRING) {
271 continue;
272 }
273
274 int len = get4LE(eventData + 4 + 1);
275 if (len == 0) {
276 ++count;
277
278 AndroidLogFormat *logformat = android_log_format_new();
279 EXPECT_TRUE(NULL != logformat);
280 AndroidLogEntry entry;
281 char msgBuf[1024];
282 EXPECT_EQ(0, android_log_processBinaryLogBuffer(&log_msg.entry_v1,
283 &entry,
284 NULL,
285 msgBuf,
286 sizeof(msgBuf)));
287 fflush(stderr);
288 EXPECT_EQ(20, android_log_printLogLine(logformat, fileno(stderr), &entry));
289 android_log_format_free(logformat);
290 }
291 }
292
293 EXPECT_EQ(1, count);
294
295 android_logger_list_close(logger_list);
296}
297
Mark Salyzynffbd86f2015-12-04 10:59:45 -0800298TEST(liblog, __security) {
299 static const char persist_key[] = "persist.logd.security";
300 static const char readonly_key[] = "ro.device_owner";
301 static const char nothing_val[] = "_NOTHING_TO_SEE_HERE_";
302 char persist[PROP_VALUE_MAX];
303 char readonly[PROP_VALUE_MAX];
304
305 property_get(persist_key, persist, "");
306 property_get(readonly_key, readonly, nothing_val);
307
308 if (!strcmp(readonly, nothing_val)) {
309 EXPECT_FALSE(__android_log_security());
310 fprintf(stderr, "Warning, setting ro.device_owner to a domain\n");
311 property_set(readonly_key, "com.google.android.SecOps.DeviceOwner");
312 } else if (!strcasecmp(readonly, "false") || !readonly[0]) {
313 EXPECT_FALSE(__android_log_security());
314 return;
315 }
316
317 if (!strcasecmp(persist, "true")) {
318 EXPECT_TRUE(__android_log_security());
319 } else {
320 EXPECT_FALSE(__android_log_security());
321 }
322 property_set(persist_key, "TRUE");
323 EXPECT_TRUE(__android_log_security());
324 property_set(persist_key, "FALSE");
325 EXPECT_FALSE(__android_log_security());
326 property_set(persist_key, "true");
327 EXPECT_TRUE(__android_log_security());
328 property_set(persist_key, "false");
329 EXPECT_FALSE(__android_log_security());
330 property_set(persist_key, "");
331 EXPECT_FALSE(__android_log_security());
332 property_set(persist_key, persist);
333}
334
Mark Salyzyn083b0372015-12-04 10:59:45 -0800335TEST(liblog, __security_buffer) {
336 struct logger_list *logger_list;
337 android_event_long_t buffer;
338
339 static const char persist_key[] = "persist.logd.security";
340 char persist[PROP_VALUE_MAX];
341 bool set_persist = false;
342 bool allow_security = false;
343
344 if (__android_log_security()) {
345 allow_security = true;
346 } else {
347 property_get(persist_key, persist, "");
348 if (strcasecmp(persist, "true")) {
349 property_set(persist_key, "TRUE");
350 if (__android_log_security()) {
351 allow_security = true;
352 set_persist = true;
353 } else {
354 property_set(persist_key, persist);
355 }
356 }
357 }
358
359 if (!allow_security) {
360 fprintf(stderr, "WARNING: "
361 "security buffer disabled, bypassing end-to-end test\n");
362
363 log_time ts(CLOCK_MONOTONIC);
364
365 buffer.type = EVENT_TYPE_LONG;
366 buffer.data = *(static_cast<uint64_t *>((void *)&ts));
367
368 // expect failure!
369 ASSERT_GE(0, __android_log_security_bwrite(0, &buffer, sizeof(buffer)));
370
371 return;
372 }
373
Mark Salyzyn8fa88962016-01-26 14:32:35 -0800374 /* Matches clientHasLogCredentials() in logd */
375 uid_t uid = getuid();
376 gid_t gid = getgid();
377 bool clientHasLogCredentials = true;
378 if ((uid != AID_SYSTEM) && (uid != AID_ROOT) && (uid != AID_LOG)
379 && (gid != AID_SYSTEM) && (gid != AID_ROOT) && (gid != AID_LOG)) {
380 uid_t euid = geteuid();
381 if ((euid != AID_SYSTEM) && (euid != AID_ROOT) && (euid != AID_LOG)) {
382 gid_t egid = getegid();
383 if ((egid != AID_SYSTEM) && (egid != AID_ROOT) && (egid != AID_LOG)) {
384 int num_groups = getgroups(0, NULL);
385 if (num_groups > 0) {
386 gid_t groups[num_groups];
387 num_groups = getgroups(num_groups, groups);
388 while (num_groups > 0) {
389 if (groups[num_groups - 1] == AID_LOG) {
390 break;
391 }
392 --num_groups;
393 }
394 }
395 if (num_groups <= 0) {
396 clientHasLogCredentials = false;
397 }
398 }
399 }
400 }
401 if (!clientHasLogCredentials) {
402 fprintf(stderr, "WARNING: "
403 "not in system context, bypassing end-to-end test\n");
404
405 log_time ts(CLOCK_MONOTONIC);
406
407 buffer.type = EVENT_TYPE_LONG;
408 buffer.data = *(static_cast<uint64_t *>((void *)&ts));
409
410 // expect failure!
411 ASSERT_GE(0, __android_log_security_bwrite(0, &buffer, sizeof(buffer)));
412
413 return;
414 }
415
Mark Salyzyn083b0372015-12-04 10:59:45 -0800416 pid_t pid = getpid();
417
418 ASSERT_TRUE(NULL != (logger_list = android_logger_list_open(
419 LOG_ID_SECURITY, ANDROID_LOG_RDONLY | ANDROID_LOG_NONBLOCK,
420 1000, pid)));
421
422 log_time ts(CLOCK_MONOTONIC);
423
424 buffer.type = EVENT_TYPE_LONG;
425 buffer.data = *(static_cast<uint64_t *>((void *)&ts));
426
427 ASSERT_LT(0, __android_log_security_bwrite(0, &buffer, sizeof(buffer)));
428 usleep(1000000);
429
430 int count = 0;
431
432 for (;;) {
433 log_msg log_msg;
434 if (android_logger_list_read(logger_list, &log_msg) <= 0) {
435 break;
436 }
437
438 ASSERT_EQ(log_msg.entry.pid, pid);
439
440 if ((log_msg.entry.len != (4 + 1 + 8))
441 || (log_msg.id() != LOG_ID_SECURITY)) {
442 continue;
443 }
444
445 char *eventData = log_msg.msg();
446
447 if (eventData[4] != EVENT_TYPE_LONG) {
448 continue;
449 }
450
451 log_time tx(eventData + 4 + 1);
452 if (ts == tx) {
453 ++count;
454 }
455 }
456
457 if (set_persist) {
458 property_set(persist_key, persist);
459 }
460
461 android_logger_list_close(logger_list);
462
Mark Salyzyn8fa88962016-01-26 14:32:35 -0800463 bool clientHasSecurityCredentials = (uid == AID_SYSTEM) || (gid == AID_SYSTEM);
464 if (!clientHasSecurityCredentials) {
465 fprintf(stderr, "WARNING: "
466 "not system, content submitted but can not check end-to-end\n");
467 }
468 EXPECT_EQ(clientHasSecurityCredentials ? 1 : 0, count);
Mark Salyzyn083b0372015-12-04 10:59:45 -0800469
470}
471
Mark Salyzyncef098e2014-01-09 09:02:55 -0800472static unsigned signaled;
473log_time signal_time;
474
Mark Salyzyna04464a2014-04-30 08:50:53 -0700475static void caught_blocking(int /*signum*/)
Mark Salyzyncef098e2014-01-09 09:02:55 -0800476{
477 unsigned long long v = 0xDEADBEEFA55A0000ULL;
478
479 v += getpid() & 0xFFFF;
480
481 ++signaled;
482 if ((signal_time.tv_sec == 0) && (signal_time.tv_nsec == 0)) {
Mark Salyzyn7e2f83c2014-03-05 07:41:49 -0800483 signal_time = log_time(CLOCK_MONOTONIC);
Mark Salyzyncef098e2014-01-09 09:02:55 -0800484 signal_time.tv_sec += 2;
485 }
486
487 LOG_FAILURE_RETRY(__android_log_btwrite(0, EVENT_TYPE_LONG, &v, sizeof(v)));
488}
489
490// Fill in current process user and system time in 10ms increments
491static void get_ticks(unsigned long long *uticks, unsigned long long *sticks)
492{
493 *uticks = *sticks = 0;
494
495 pid_t pid = getpid();
496
497 char buffer[512];
498 snprintf(buffer, sizeof(buffer), "/proc/%u/stat", pid);
499
500 FILE *fp = fopen(buffer, "r");
501 if (!fp) {
502 return;
503 }
504
505 char *cp = fgets(buffer, sizeof(buffer), fp);
506 fclose(fp);
507 if (!cp) {
508 return;
509 }
510
511 pid_t d;
512 char s[sizeof(buffer)];
513 char c;
514 long long ll;
515 unsigned long long ull;
516
517 if (15 != sscanf(buffer,
518 "%d %s %c %lld %lld %lld %lld %lld %llu %llu %llu %llu %llu %llu %llu ",
519 &d, s, &c, &ll, &ll, &ll, &ll, &ll, &ull, &ull, &ull, &ull, &ull,
520 uticks, sticks)) {
521 *uticks = *sticks = 0;
522 }
523}
524
525TEST(liblog, android_logger_list_read__cpu) {
526 struct logger_list *logger_list;
527 unsigned long long v = 0xDEADBEEFA55A0000ULL;
528
529 pid_t pid = getpid();
530
531 v += pid & 0xFFFF;
532
Mark Salyzyn8196be32014-03-18 17:10:47 -0700533 ASSERT_TRUE(NULL != (logger_list = android_logger_list_open(
Mark Salyzyn2d3f38a2015-01-26 10:46:44 -0800534 LOG_ID_EVENTS, ANDROID_LOG_RDONLY, 1000, pid)));
Mark Salyzyncef098e2014-01-09 09:02:55 -0800535
536 int count = 0;
537
538 int signals = 0;
539
540 unsigned long long uticks_start;
541 unsigned long long sticks_start;
542 get_ticks(&uticks_start, &sticks_start);
543
544 const unsigned alarm_time = 10;
545
546 memset(&signal_time, 0, sizeof(signal_time));
547
548 signal(SIGALRM, caught_blocking);
549 alarm(alarm_time);
550
551 signaled = 0;
552
553 do {
554 log_msg log_msg;
555 if (android_logger_list_read(logger_list, &log_msg) <= 0) {
556 break;
557 }
558
559 alarm(alarm_time);
560
561 ++count;
562
563 ASSERT_EQ(log_msg.entry.pid, pid);
564
565 if ((log_msg.entry.len != (4 + 1 + 8))
566 || (log_msg.id() != LOG_ID_EVENTS)) {
567 continue;
568 }
569
570 char *eventData = log_msg.msg();
571
572 if (eventData[4] != EVENT_TYPE_LONG) {
573 continue;
574 }
575
576 unsigned long long l = eventData[4 + 1 + 0] & 0xFF;
577 l |= (unsigned long long) (eventData[4 + 1 + 1] & 0xFF) << 8;
578 l |= (unsigned long long) (eventData[4 + 1 + 2] & 0xFF) << 16;
579 l |= (unsigned long long) (eventData[4 + 1 + 3] & 0xFF) << 24;
580 l |= (unsigned long long) (eventData[4 + 1 + 4] & 0xFF) << 32;
581 l |= (unsigned long long) (eventData[4 + 1 + 5] & 0xFF) << 40;
582 l |= (unsigned long long) (eventData[4 + 1 + 6] & 0xFF) << 48;
583 l |= (unsigned long long) (eventData[4 + 1 + 7] & 0xFF) << 56;
584
585 if (l == v) {
586 ++signals;
587 break;
588 }
Mark Salyzyn8196be32014-03-18 17:10:47 -0700589 } while (!signaled || (log_time(CLOCK_MONOTONIC) < signal_time));
Mark Salyzyncef098e2014-01-09 09:02:55 -0800590 alarm(0);
591 signal(SIGALRM, SIG_DFL);
592
Mark Salyzyn8196be32014-03-18 17:10:47 -0700593 EXPECT_LT(1, count);
Mark Salyzyncef098e2014-01-09 09:02:55 -0800594
Mark Salyzyn8196be32014-03-18 17:10:47 -0700595 EXPECT_EQ(1, signals);
Mark Salyzyncef098e2014-01-09 09:02:55 -0800596
597 android_logger_list_close(logger_list);
598
599 unsigned long long uticks_end;
600 unsigned long long sticks_end;
601 get_ticks(&uticks_end, &sticks_end);
602
603 // Less than 1% in either user or system time, or both
604 const unsigned long long one_percent_ticks = alarm_time;
605 unsigned long long user_ticks = uticks_end - uticks_start;
606 unsigned long long system_ticks = sticks_end - sticks_start;
Mark Salyzyn8196be32014-03-18 17:10:47 -0700607 EXPECT_GT(one_percent_ticks, user_ticks);
608 EXPECT_GT(one_percent_ticks, system_ticks);
609 EXPECT_GT(one_percent_ticks, user_ticks + system_ticks);
610}
611
612static const char max_payload_tag[] = "TEST_max_payload_XXXX";
Mark Salyzyn42ae8272015-12-03 15:37:00 -0800613#define SIZEOF_MAX_PAYLOAD_BUF (LOGGER_ENTRY_MAX_PAYLOAD - \
614 sizeof(max_payload_tag) - 1)
615static const char max_payload_buf[] = "LEONATO\n\
Mark Salyzyn8196be32014-03-18 17:10:47 -0700616I learn in this letter that Don Peter of Arragon\n\
617comes this night to Messina\n\
618MESSENGER\n\
619He is very near by this: he was not three leagues off\n\
620when I left him\n\
621LEONATO\n\
622How many gentlemen have you lost in this action?\n\
623MESSENGER\n\
624But few of any sort, and none of name\n\
625LEONATO\n\
626A victory is twice itself when the achiever brings\n\
627home full numbers. I find here that Don Peter hath\n\
628bestowed much honour on a young Florentine called Claudio\n\
629MESSENGER\n\
630Much deserved on his part and equally remembered by\n\
631Don Pedro: he hath borne himself beyond the\n\
632promise of his age, doing, in the figure of a lamb,\n\
633the feats of a lion: he hath indeed better\n\
634bettered expectation than you must expect of me to\n\
635tell you how\n\
636LEONATO\n\
637He hath an uncle here in Messina will be very much\n\
638glad of it.\n\
639MESSENGER\n\
640I have already delivered him letters, and there\n\
641appears much joy in him; even so much that joy could\n\
642not show itself modest enough without a badge of\n\
643bitterness.\n\
644LEONATO\n\
645Did he break out into tears?\n\
646MESSENGER\n\
647In great measure.\n\
648LEONATO\n\
649A kind overflow of kindness: there are no faces\n\
650truer than those that are so washed. How much\n\
651better is it to weep at joy than to joy at weeping!\n\
652BEATRICE\n\
653I pray you, is Signior Mountanto returned from the\n\
654wars or no?\n\
655MESSENGER\n\
656I know none of that name, lady: there was none such\n\
657in the army of any sort.\n\
658LEONATO\n\
659What is he that you ask for, niece?\n\
660HERO\n\
661My cousin means Signior Benedick of Padua.\n\
662MESSENGER\n\
663O, he's returned; and as pleasant as ever he was.\n\
664BEATRICE\n\
665He set up his bills here in Messina and challenged\n\
666Cupid at the flight; and my uncle's fool, reading\n\
667the challenge, subscribed for Cupid, and challenged\n\
668him at the bird-bolt. I pray you, how many hath he\n\
669killed and eaten in these wars? But how many hath\n\
670he killed? for indeed I promised to eat all of his killing.\n\
671LEONATO\n\
672Faith, niece, you tax Signior Benedick too much;\n\
673but he'll be meet with you, I doubt it not.\n\
674MESSENGER\n\
675He hath done good service, lady, in these wars.\n\
676BEATRICE\n\
677You had musty victual, and he hath holp to eat it:\n\
678he is a very valiant trencherman; he hath an\n\
679excellent stomach.\n\
680MESSENGER\n\
681And a good soldier too, lady.\n\
682BEATRICE\n\
683And a good soldier to a lady: but what is he to a lord?\n\
684MESSENGER\n\
685A lord to a lord, a man to a man; stuffed with all\n\
686honourable virtues.\n\
687BEATRICE\n\
688It is so, indeed; he is no less than a stuffed man:\n\
689but for the stuffing,--well, we are all mortal.\n\
690LEONATO\n\
691You must not, sir, mistake my niece. There is a\n\
692kind of merry war betwixt Signior Benedick and her:\n\
693they never meet but there's a skirmish of wit\n\
694between them.\n\
695BEATRICE\n\
696Alas! he gets nothing by that. In our last\n\
697conflict four of his five wits went halting off, and\n\
698now is the whole man governed with one: so that if\n\
699he have wit enough to keep himself warm, let him\n\
700bear it for a difference between himself and his\n\
701horse; for it is all the wealth that he hath left,\n\
702to be known a reasonable creature. Who is his\n\
703companion now? He hath every month a new sworn brother.\n\
704MESSENGER\n\
705Is't possible?\n\
706BEATRICE\n\
707Very easily possible: he wears his faith but as\n\
708the fashion of his hat; it ever changes with the\n\
709next block.\n\
710MESSENGER\n\
711I see, lady, the gentleman is not in your books.\n\
712BEATRICE\n\
713No; an he were, I would burn my study. But, I pray\n\
714you, who is his companion? Is there no young\n\
715squarer now that will make a voyage with him to the devil?\n\
716MESSENGER\n\
717He is most in the company of the right noble Claudio.\n\
718BEATRICE\n\
719O Lord, he will hang upon him like a disease: he\n\
720is sooner caught than the pestilence, and the taker\n\
721runs presently mad. God help the noble Claudio! if\n\
722he have caught the Benedick, it will cost him a\n\
723thousand pound ere a' be cured.\n\
724MESSENGER\n\
725I will hold friends with you, lady.\n\
726BEATRICE\n\
727Do, good friend.\n\
728LEONATO\n\
729You will never run mad, niece.\n\
730BEATRICE\n\
731No, not till a hot January.\n\
732MESSENGER\n\
733Don Pedro is approached.\n\
734Enter DON PEDRO, DON JOHN, CLAUDIO, BENEDICK, and BALTHASAR\n\
735\n\
736DON PEDRO\n\
737Good Signior Leonato, you are come to meet your\n\
738trouble: the fashion of the world is to avoid\n\
739cost, and you encounter it\n\
740LEONATO\n\
Mark Salyzyn42ae8272015-12-03 15:37:00 -0800741Never came trouble to my house in the likeness of your grace";
Mark Salyzyn8196be32014-03-18 17:10:47 -0700742
743TEST(liblog, max_payload) {
744 pid_t pid = getpid();
745 char tag[sizeof(max_payload_tag)];
746 memcpy(tag, max_payload_tag, sizeof(tag));
747 snprintf(tag + sizeof(tag) - 5, 5, "%04X", pid & 0xFFFF);
748
749 LOG_FAILURE_RETRY(__android_log_buf_write(LOG_ID_SYSTEM, ANDROID_LOG_INFO,
750 tag, max_payload_buf));
Mark Salyzync1584562015-03-12 15:46:29 -0700751 sleep(2);
Mark Salyzyn8196be32014-03-18 17:10:47 -0700752
753 struct logger_list *logger_list;
754
755 ASSERT_TRUE(NULL != (logger_list = android_logger_list_open(
Mark Salyzyn2d3f38a2015-01-26 10:46:44 -0800756 LOG_ID_SYSTEM, ANDROID_LOG_RDONLY, 100, 0)));
Mark Salyzyn8196be32014-03-18 17:10:47 -0700757
758 bool matches = false;
759 ssize_t max_len = 0;
760
761 for(;;) {
762 log_msg log_msg;
763 if (android_logger_list_read(logger_list, &log_msg) <= 0) {
764 break;
765 }
766
767 if ((log_msg.entry.pid != pid) || (log_msg.id() != LOG_ID_SYSTEM)) {
768 continue;
769 }
770
771 char *data = log_msg.msg() + 1;
772
773 if (strcmp(data, tag)) {
774 continue;
775 }
776
777 data += strlen(data) + 1;
778
779 const char *left = data;
780 const char *right = max_payload_buf;
781 while (*left && *right && (*left == *right)) {
782 ++left;
783 ++right;
784 }
785
786 if (max_len <= (left - data)) {
787 max_len = left - data + 1;
788 }
789
790 if (max_len > 512) {
791 matches = true;
792 break;
793 }
794 }
795
Mark Salyzyn8444eb82014-04-24 09:43:23 -0700796 android_logger_list_close(logger_list);
797
Mark Salyzyn8196be32014-03-18 17:10:47 -0700798 EXPECT_EQ(true, matches);
799
Mark Salyzyn42ae8272015-12-03 15:37:00 -0800800 EXPECT_LE(SIZEOF_MAX_PAYLOAD_BUF, static_cast<size_t>(max_len));
Mark Salyzyn8444eb82014-04-24 09:43:23 -0700801}
802
803TEST(liblog, too_big_payload) {
804 pid_t pid = getpid();
805 static const char big_payload_tag[] = "TEST_big_payload_XXXX";
806 char tag[sizeof(big_payload_tag)];
807 memcpy(tag, big_payload_tag, sizeof(tag));
808 snprintf(tag + sizeof(tag) - 5, 5, "%04X", pid & 0xFFFF);
809
810 std::string longString(3266519, 'x');
811
812 ssize_t ret = LOG_FAILURE_RETRY(__android_log_buf_write(LOG_ID_SYSTEM,
813 ANDROID_LOG_INFO, tag, longString.c_str()));
814
815 struct logger_list *logger_list;
816
817 ASSERT_TRUE(NULL != (logger_list = android_logger_list_open(
Mark Salyzyn2d3f38a2015-01-26 10:46:44 -0800818 LOG_ID_SYSTEM, ANDROID_LOG_RDONLY | ANDROID_LOG_NONBLOCK, 100, 0)));
Mark Salyzyn8444eb82014-04-24 09:43:23 -0700819
820 ssize_t max_len = 0;
821
822 for(;;) {
823 log_msg log_msg;
824 if (android_logger_list_read(logger_list, &log_msg) <= 0) {
825 break;
826 }
827
828 if ((log_msg.entry.pid != pid) || (log_msg.id() != LOG_ID_SYSTEM)) {
829 continue;
830 }
831
832 char *data = log_msg.msg() + 1;
833
834 if (strcmp(data, tag)) {
835 continue;
836 }
837
838 data += strlen(data) + 1;
839
840 const char *left = data;
841 const char *right = longString.c_str();
842 while (*left && *right && (*left == *right)) {
843 ++left;
844 ++right;
845 }
846
847 if (max_len <= (left - data)) {
848 max_len = left - data + 1;
849 }
850 }
Mark Salyzyn8196be32014-03-18 17:10:47 -0700851
852 android_logger_list_close(logger_list);
Mark Salyzyn8444eb82014-04-24 09:43:23 -0700853
854 EXPECT_LE(LOGGER_ENTRY_MAX_PAYLOAD - sizeof(big_payload_tag),
855 static_cast<size_t>(max_len));
856
Ben Cheng43232922014-05-20 10:38:24 -0700857 EXPECT_EQ(ret, max_len + static_cast<ssize_t>(sizeof(big_payload_tag)));
Mark Salyzyn8196be32014-03-18 17:10:47 -0700858}
859
860TEST(liblog, dual_reader) {
861 struct logger_list *logger_list1;
862
863 // >25 messages due to liblog.__android_log_buf_print__concurrentXX above.
864 ASSERT_TRUE(NULL != (logger_list1 = android_logger_list_open(
Mark Salyzyn2d3f38a2015-01-26 10:46:44 -0800865 LOG_ID_MAIN, ANDROID_LOG_RDONLY | ANDROID_LOG_NONBLOCK, 25, 0)));
Mark Salyzyn8196be32014-03-18 17:10:47 -0700866
867 struct logger_list *logger_list2;
868
869 if (NULL == (logger_list2 = android_logger_list_open(
Mark Salyzyn2d3f38a2015-01-26 10:46:44 -0800870 LOG_ID_MAIN, ANDROID_LOG_RDONLY | ANDROID_LOG_NONBLOCK, 15, 0))) {
Mark Salyzyn8196be32014-03-18 17:10:47 -0700871 android_logger_list_close(logger_list1);
872 ASSERT_TRUE(NULL != logger_list2);
873 }
874
875 int count1 = 0;
876 bool done1 = false;
877 int count2 = 0;
878 bool done2 = false;
879
880 do {
881 log_msg log_msg;
882
883 if (!done1) {
884 if (android_logger_list_read(logger_list1, &log_msg) <= 0) {
885 done1 = true;
886 } else {
887 ++count1;
888 }
889 }
890
891 if (!done2) {
892 if (android_logger_list_read(logger_list2, &log_msg) <= 0) {
893 done2 = true;
894 } else {
895 ++count2;
896 }
897 }
898 } while ((!done1) || (!done2));
899
900 android_logger_list_close(logger_list1);
901 android_logger_list_close(logger_list2);
902
903 EXPECT_EQ(25, count1);
904 EXPECT_EQ(15, count2);
Mark Salyzyncef098e2014-01-09 09:02:55 -0800905}
906
Mark Salyzyn819c58a2013-11-22 12:39:43 -0800907TEST(liblog, android_logger_get_) {
Mark Salyzyn2d3f38a2015-01-26 10:46:44 -0800908 struct logger_list * logger_list = android_logger_list_alloc(ANDROID_LOG_WRONLY, 0, 0);
Mark Salyzyn819c58a2013-11-22 12:39:43 -0800909
910 for(int i = LOG_ID_MIN; i < LOG_ID_MAX; ++i) {
911 log_id_t id = static_cast<log_id_t>(i);
912 const char *name = android_log_id_to_name(id);
913 if (id != android_name_to_log_id(name)) {
914 continue;
915 }
Mark Salyzync1584562015-03-12 15:46:29 -0700916 fprintf(stderr, "log buffer %s\r", name);
Mark Salyzyn819c58a2013-11-22 12:39:43 -0800917 struct logger * logger;
Mark Salyzyn8196be32014-03-18 17:10:47 -0700918 EXPECT_TRUE(NULL != (logger = android_logger_open(logger_list, id)));
919 EXPECT_EQ(id, android_logger_get_id(logger));
Mark Salyzyn7d8939e2015-12-01 12:47:43 -0800920 EXPECT_LT(0, android_logger_get_log_size(logger));
Mark Salyzync1584562015-03-12 15:46:29 -0700921 /* crash buffer is allowed to be empty, that is actually healthy! */
Mark Salyzyn083b0372015-12-04 10:59:45 -0800922 if (android_logger_get_log_readable_size(logger) ||
923 (strcmp("crash", name) && strcmp("security", name))) {
Mark Salyzyn7d8939e2015-12-01 12:47:43 -0800924 EXPECT_LT(0, android_logger_get_log_readable_size(logger));
Mark Salyzync1584562015-03-12 15:46:29 -0700925 }
Mark Salyzyn8196be32014-03-18 17:10:47 -0700926 EXPECT_LT(0, android_logger_get_log_version(logger));
Mark Salyzyn819c58a2013-11-22 12:39:43 -0800927 }
928
929 android_logger_list_close(logger_list);
930}
Mark Salyzyn5045f572014-04-30 08:50:53 -0700931
932static bool checkPriForTag(AndroidLogFormat *p_format, const char *tag, android_LogPriority pri) {
933 return android_log_shouldPrintLine(p_format, tag, pri)
934 && !android_log_shouldPrintLine(p_format, tag, (android_LogPriority)(pri - 1));
935}
936
937TEST(liblog, filterRule) {
938 static const char tag[] = "random";
939
940 AndroidLogFormat *p_format = android_log_format_new();
941
942 android_log_addFilterRule(p_format,"*:i");
943
944 EXPECT_TRUE(checkPriForTag(p_format, tag, ANDROID_LOG_INFO));
945 EXPECT_TRUE(android_log_shouldPrintLine(p_format, tag, ANDROID_LOG_DEBUG) == 0);
946 android_log_addFilterRule(p_format, "*");
947 EXPECT_TRUE (checkPriForTag(p_format, tag, ANDROID_LOG_DEBUG));
948 EXPECT_TRUE(android_log_shouldPrintLine(p_format, tag, ANDROID_LOG_DEBUG) > 0);
949 android_log_addFilterRule(p_format, "*:v");
950 EXPECT_TRUE (checkPriForTag(p_format, tag, ANDROID_LOG_VERBOSE));
951 EXPECT_TRUE(android_log_shouldPrintLine(p_format, tag, ANDROID_LOG_DEBUG) > 0);
952 android_log_addFilterRule(p_format, "*:i");
953 EXPECT_TRUE (checkPriForTag(p_format, tag, ANDROID_LOG_INFO));
954 EXPECT_TRUE(android_log_shouldPrintLine(p_format, tag, ANDROID_LOG_DEBUG) == 0);
955
956 android_log_addFilterRule(p_format, tag);
957 EXPECT_TRUE (checkPriForTag(p_format, tag, ANDROID_LOG_VERBOSE));
958 EXPECT_TRUE(android_log_shouldPrintLine(p_format, tag, ANDROID_LOG_DEBUG) > 0);
959 android_log_addFilterRule(p_format, "random:v");
960 EXPECT_TRUE (checkPriForTag(p_format, tag, ANDROID_LOG_VERBOSE));
961 EXPECT_TRUE(android_log_shouldPrintLine(p_format, tag, ANDROID_LOG_DEBUG) > 0);
962 android_log_addFilterRule(p_format, "random:d");
963 EXPECT_TRUE (checkPriForTag(p_format, tag, ANDROID_LOG_DEBUG));
964 EXPECT_TRUE(android_log_shouldPrintLine(p_format, tag, ANDROID_LOG_DEBUG) > 0);
965 android_log_addFilterRule(p_format, "random:w");
966 EXPECT_TRUE (checkPriForTag(p_format, tag, ANDROID_LOG_WARN));
967 EXPECT_TRUE(android_log_shouldPrintLine(p_format, tag, ANDROID_LOG_DEBUG) == 0);
968
969 android_log_addFilterRule(p_format, "crap:*");
970 EXPECT_TRUE (checkPriForTag(p_format, "crap", ANDROID_LOG_VERBOSE));
971 EXPECT_TRUE(android_log_shouldPrintLine(p_format, "crap", ANDROID_LOG_VERBOSE) > 0);
972
973 // invalid expression
974 EXPECT_TRUE (android_log_addFilterRule(p_format, "random:z") < 0);
975 EXPECT_TRUE (checkPriForTag(p_format, tag, ANDROID_LOG_WARN));
976 EXPECT_TRUE(android_log_shouldPrintLine(p_format, tag, ANDROID_LOG_DEBUG) == 0);
977
978 // Issue #550946
979 EXPECT_TRUE(android_log_addFilterString(p_format, " ") == 0);
980 EXPECT_TRUE(checkPriForTag(p_format, tag, ANDROID_LOG_WARN));
981
982 // note trailing space
983 EXPECT_TRUE(android_log_addFilterString(p_format, "*:s random:d ") == 0);
984 EXPECT_TRUE(checkPriForTag(p_format, tag, ANDROID_LOG_DEBUG));
985
986 EXPECT_TRUE(android_log_addFilterString(p_format, "*:s random:z") < 0);
987
988#if 0 // bitrot, seek update
989 char defaultBuffer[512];
990
991 android_log_formatLogLine(p_format,
992 defaultBuffer, sizeof(defaultBuffer), 0, ANDROID_LOG_ERROR, 123,
993 123, 123, tag, "nofile", strlen("Hello"), "Hello", NULL);
994
995 fprintf(stderr, "%s\n", defaultBuffer);
996#endif
997
998 android_log_format_free(p_format);
999}
Mark Salyzync1584562015-03-12 15:46:29 -07001000
1001TEST(liblog, is_loggable) {
1002 static const char tag[] = "is_loggable";
1003 static const char log_namespace[] = "persist.log.tag.";
1004 static const size_t base_offset = 8; /* skip "persist." */
1005 // sizeof("string") = strlen("string") + 1
1006 char key[sizeof(log_namespace) + sizeof(tag) - 1];
1007 char hold[4][PROP_VALUE_MAX];
1008 static const struct {
1009 int level;
1010 char type;
1011 } levels[] = {
1012 { ANDROID_LOG_VERBOSE, 'v' },
1013 { ANDROID_LOG_DEBUG , 'd' },
1014 { ANDROID_LOG_INFO , 'i' },
1015 { ANDROID_LOG_WARN , 'w' },
1016 { ANDROID_LOG_ERROR , 'e' },
1017 { ANDROID_LOG_FATAL , 'a' },
1018 { -1 , 's' },
1019 { -2 , 'g' }, // Illegal value, resort to default
1020 };
1021
1022 // Set up initial test condition
1023 memset(hold, 0, sizeof(hold));
1024 snprintf(key, sizeof(key), "%s%s", log_namespace, tag);
1025 property_get(key, hold[0], "");
1026 property_set(key, "");
1027 property_get(key + base_offset, hold[1], "");
1028 property_set(key + base_offset, "");
1029 strcpy(key, log_namespace);
1030 key[sizeof(log_namespace) - 2] = '\0';
1031 property_get(key, hold[2], "");
1032 property_set(key, "");
1033 property_get(key, hold[3], "");
1034 property_set(key + base_offset, "");
1035
1036 // All combinations of level and defaults
1037 for(size_t i = 0; i < (sizeof(levels) / sizeof(levels[0])); ++i) {
1038 if (levels[i].level == -2) {
1039 continue;
1040 }
1041 for(size_t j = 0; j < (sizeof(levels) / sizeof(levels[0])); ++j) {
1042 if (levels[j].level == -2) {
1043 continue;
1044 }
1045 fprintf(stderr, "i=%zu j=%zu\r", i, j);
Mark Salyzyn77c166b2015-12-07 16:09:22 -08001046 bool android_log_is_loggable = __android_log_is_loggable(
1047 levels[i].level, tag, levels[j].level);
Mark Salyzync1584562015-03-12 15:46:29 -07001048 if ((levels[i].level < levels[j].level)
1049 || (levels[j].level == -1)) {
Mark Salyzyn77c166b2015-12-07 16:09:22 -08001050 if (android_log_is_loggable) {
1051 fprintf(stderr, "\n");
1052 }
1053 EXPECT_FALSE(android_log_is_loggable);
1054 for(size_t k = 1000; k; --k) {
1055 EXPECT_FALSE(__android_log_is_loggable(
1056 levels[i].level, tag, levels[j].level));
1057 }
Mark Salyzync1584562015-03-12 15:46:29 -07001058 } else {
Mark Salyzyn77c166b2015-12-07 16:09:22 -08001059 if (!android_log_is_loggable) {
1060 fprintf(stderr, "\n");
1061 }
1062 EXPECT_TRUE(android_log_is_loggable);
1063 for(size_t k = 1000; k; --k) {
1064 EXPECT_TRUE(__android_log_is_loggable(
1065 levels[i].level, tag, levels[j].level));
1066 }
Mark Salyzync1584562015-03-12 15:46:29 -07001067 }
1068 }
1069 }
1070
1071 // All combinations of level and tag and global properties
1072 for(size_t i = 0; i < (sizeof(levels) / sizeof(levels[0])); ++i) {
1073 if (levels[i].level == -2) {
1074 continue;
1075 }
1076 for(size_t j = 0; j < (sizeof(levels) / sizeof(levels[0])); ++j) {
1077 char buf[2];
1078 buf[0] = levels[j].type;
1079 buf[1] = '\0';
1080
1081 snprintf(key, sizeof(key), "%s%s", log_namespace, tag);
1082 fprintf(stderr, "i=%zu j=%zu property_set(\"%s\",\"%s\")\r",
1083 i, j, key, buf);
1084 property_set(key, buf);
Mark Salyzyn77c166b2015-12-07 16:09:22 -08001085 bool android_log_is_loggable = __android_log_is_loggable(
1086 levels[i].level, tag, ANDROID_LOG_DEBUG);
Mark Salyzync1584562015-03-12 15:46:29 -07001087 if ((levels[i].level < levels[j].level)
1088 || (levels[j].level == -1)
1089 || ((levels[i].level < ANDROID_LOG_DEBUG)
1090 && (levels[j].level == -2))) {
Mark Salyzyn77c166b2015-12-07 16:09:22 -08001091 if (android_log_is_loggable) {
1092 fprintf(stderr, "\n");
1093 }
1094 EXPECT_FALSE(android_log_is_loggable);
1095 for(size_t k = 1000; k; --k) {
1096 EXPECT_FALSE(__android_log_is_loggable(
1097 levels[i].level, tag, ANDROID_LOG_DEBUG));
1098 }
Mark Salyzync1584562015-03-12 15:46:29 -07001099 } else {
Mark Salyzyn77c166b2015-12-07 16:09:22 -08001100 if (!android_log_is_loggable) {
1101 fprintf(stderr, "\n");
1102 }
1103 EXPECT_TRUE(android_log_is_loggable);
1104 for(size_t k = 1000; k; --k) {
1105 EXPECT_TRUE(__android_log_is_loggable(
1106 levels[i].level, tag, ANDROID_LOG_DEBUG));
1107 }
Mark Salyzync1584562015-03-12 15:46:29 -07001108 }
1109 property_set(key, "");
1110
1111 fprintf(stderr, "i=%zu j=%zu property_set(\"%s\",\"%s\")\r",
1112 i, j, key + base_offset, buf);
1113 property_set(key + base_offset, buf);
Mark Salyzyn77c166b2015-12-07 16:09:22 -08001114 android_log_is_loggable = __android_log_is_loggable(
1115 levels[i].level, tag, ANDROID_LOG_DEBUG);
Mark Salyzync1584562015-03-12 15:46:29 -07001116 if ((levels[i].level < levels[j].level)
1117 || (levels[j].level == -1)
1118 || ((levels[i].level < ANDROID_LOG_DEBUG)
1119 && (levels[j].level == -2))) {
Mark Salyzyn77c166b2015-12-07 16:09:22 -08001120 if (android_log_is_loggable) {
1121 fprintf(stderr, "\n");
1122 }
1123 EXPECT_FALSE(android_log_is_loggable);
1124 for(size_t k = 1000; k; --k) {
1125 EXPECT_FALSE(__android_log_is_loggable(
1126 levels[i].level, tag, ANDROID_LOG_DEBUG));
1127 }
Mark Salyzync1584562015-03-12 15:46:29 -07001128 } else {
Mark Salyzyn77c166b2015-12-07 16:09:22 -08001129 if (!android_log_is_loggable) {
1130 fprintf(stderr, "\n");
1131 }
1132 EXPECT_TRUE(android_log_is_loggable);
1133 for(size_t k = 1000; k; --k) {
1134 EXPECT_TRUE(__android_log_is_loggable(
1135 levels[i].level, tag, ANDROID_LOG_DEBUG));
1136 }
Mark Salyzync1584562015-03-12 15:46:29 -07001137 }
1138 property_set(key + base_offset, "");
1139
1140 strcpy(key, log_namespace);
1141 key[sizeof(log_namespace) - 2] = '\0';
1142 fprintf(stderr, "i=%zu j=%zu property_set(\"%s\",\"%s\")\r",
1143 i, j, key, buf);
1144 property_set(key, buf);
Mark Salyzyn77c166b2015-12-07 16:09:22 -08001145 android_log_is_loggable = __android_log_is_loggable(
1146 levels[i].level, tag, ANDROID_LOG_DEBUG);
Mark Salyzync1584562015-03-12 15:46:29 -07001147 if ((levels[i].level < levels[j].level)
1148 || (levels[j].level == -1)
1149 || ((levels[i].level < ANDROID_LOG_DEBUG)
1150 && (levels[j].level == -2))) {
Mark Salyzyn77c166b2015-12-07 16:09:22 -08001151 if (android_log_is_loggable) {
1152 fprintf(stderr, "\n");
1153 }
1154 EXPECT_FALSE(android_log_is_loggable);
1155 for(size_t k = 1000; k; --k) {
1156 EXPECT_FALSE(__android_log_is_loggable(
1157 levels[i].level, tag, ANDROID_LOG_DEBUG));
1158 }
Mark Salyzync1584562015-03-12 15:46:29 -07001159 } else {
Mark Salyzyn77c166b2015-12-07 16:09:22 -08001160 if (!android_log_is_loggable) {
1161 fprintf(stderr, "\n");
1162 }
1163 EXPECT_TRUE(android_log_is_loggable);
1164 for(size_t k = 1000; k; --k) {
1165 EXPECT_TRUE(__android_log_is_loggable(
1166 levels[i].level, tag, ANDROID_LOG_DEBUG));
1167 }
Mark Salyzync1584562015-03-12 15:46:29 -07001168 }
1169 property_set(key, "");
1170
1171 fprintf(stderr, "i=%zu j=%zu property_set(\"%s\",\"%s\")\r",
1172 i, j, key + base_offset, buf);
1173 property_set(key + base_offset, buf);
Mark Salyzyn77c166b2015-12-07 16:09:22 -08001174 android_log_is_loggable = __android_log_is_loggable(
1175 levels[i].level, tag, ANDROID_LOG_DEBUG);
Mark Salyzync1584562015-03-12 15:46:29 -07001176 if ((levels[i].level < levels[j].level)
1177 || (levels[j].level == -1)
1178 || ((levels[i].level < ANDROID_LOG_DEBUG)
1179 && (levels[j].level == -2))) {
Mark Salyzyn77c166b2015-12-07 16:09:22 -08001180 if (android_log_is_loggable) {
1181 fprintf(stderr, "\n");
1182 }
1183 EXPECT_FALSE(android_log_is_loggable);
1184 for(size_t k = 1000; k; --k) {
1185 EXPECT_FALSE(__android_log_is_loggable(
1186 levels[i].level, tag, ANDROID_LOG_DEBUG));
1187 }
Mark Salyzync1584562015-03-12 15:46:29 -07001188 } else {
Mark Salyzyn77c166b2015-12-07 16:09:22 -08001189 if (!android_log_is_loggable) {
1190 fprintf(stderr, "\n");
1191 }
1192 EXPECT_TRUE(android_log_is_loggable);
1193 for(size_t k = 1000; k; --k) {
1194 EXPECT_TRUE(__android_log_is_loggable(
1195 levels[i].level, tag, ANDROID_LOG_DEBUG));
1196 }
Mark Salyzync1584562015-03-12 15:46:29 -07001197 }
1198 property_set(key + base_offset, "");
1199 }
1200 }
1201
1202 // All combinations of level and tag properties, but with global set to INFO
1203 strcpy(key, log_namespace);
1204 key[sizeof(log_namespace) - 2] = '\0';
1205 property_set(key, "I");
1206 snprintf(key, sizeof(key), "%s%s", log_namespace, tag);
1207 for(size_t i = 0; i < (sizeof(levels) / sizeof(levels[0])); ++i) {
1208 if (levels[i].level == -2) {
1209 continue;
1210 }
1211 for(size_t j = 0; j < (sizeof(levels) / sizeof(levels[0])); ++j) {
1212 char buf[2];
1213 buf[0] = levels[j].type;
1214 buf[1] = '\0';
1215
1216 fprintf(stderr, "i=%zu j=%zu property_set(\"%s\",\"%s\")\r",
1217 i, j, key, buf);
1218 property_set(key, buf);
Mark Salyzyn77c166b2015-12-07 16:09:22 -08001219 bool android_log_is_loggable = __android_log_is_loggable(
1220 levels[i].level, tag, ANDROID_LOG_DEBUG);
Mark Salyzync1584562015-03-12 15:46:29 -07001221 if ((levels[i].level < levels[j].level)
1222 || (levels[j].level == -1)
1223 || ((levels[i].level < ANDROID_LOG_INFO) // Yes INFO
1224 && (levels[j].level == -2))) {
Mark Salyzyn77c166b2015-12-07 16:09:22 -08001225 if (android_log_is_loggable) {
1226 fprintf(stderr, "\n");
1227 }
1228 EXPECT_FALSE(android_log_is_loggable);
1229 for(size_t k = 1000; k; --k) {
1230 EXPECT_FALSE(__android_log_is_loggable(
1231 levels[i].level, tag, ANDROID_LOG_DEBUG));
1232 }
Mark Salyzync1584562015-03-12 15:46:29 -07001233 } else {
Mark Salyzyn77c166b2015-12-07 16:09:22 -08001234 if (!android_log_is_loggable) {
1235 fprintf(stderr, "\n");
1236 }
1237 EXPECT_TRUE(android_log_is_loggable);
1238 for(size_t k = 1000; k; --k) {
1239 EXPECT_TRUE(__android_log_is_loggable(
1240 levels[i].level, tag, ANDROID_LOG_DEBUG));
1241 }
Mark Salyzync1584562015-03-12 15:46:29 -07001242 }
1243 property_set(key, "");
1244
1245 fprintf(stderr, "i=%zu j=%zu property_set(\"%s\",\"%s\")\r",
1246 i, j, key + base_offset, buf);
1247 property_set(key + base_offset, buf);
Mark Salyzyn77c166b2015-12-07 16:09:22 -08001248 android_log_is_loggable = __android_log_is_loggable(
1249 levels[i].level, tag, ANDROID_LOG_DEBUG);
Mark Salyzync1584562015-03-12 15:46:29 -07001250 if ((levels[i].level < levels[j].level)
1251 || (levels[j].level == -1)
1252 || ((levels[i].level < ANDROID_LOG_INFO) // Yes INFO
1253 && (levels[j].level == -2))) {
Mark Salyzyn77c166b2015-12-07 16:09:22 -08001254 if (android_log_is_loggable) {
1255 fprintf(stderr, "\n");
1256 }
1257 EXPECT_FALSE(android_log_is_loggable);
1258 for(size_t k = 1000; k; --k) {
1259 EXPECT_FALSE(__android_log_is_loggable(
1260 levels[i].level, tag, ANDROID_LOG_DEBUG));
1261 }
Mark Salyzync1584562015-03-12 15:46:29 -07001262 } else {
Mark Salyzyn77c166b2015-12-07 16:09:22 -08001263 if (!android_log_is_loggable) {
1264 fprintf(stderr, "\n");
1265 }
1266 EXPECT_TRUE(android_log_is_loggable);
1267 for(size_t k = 1000; k; --k) {
1268 EXPECT_TRUE(__android_log_is_loggable(
1269 levels[i].level, tag, ANDROID_LOG_DEBUG));
1270 }
Mark Salyzync1584562015-03-12 15:46:29 -07001271 }
1272 property_set(key + base_offset, "");
1273 }
1274 }
1275
1276 // reset parms
1277 snprintf(key, sizeof(key), "%s%s", log_namespace, tag);
1278 property_set(key, hold[0]);
1279 property_set(key + base_offset, hold[1]);
1280 strcpy(key, log_namespace);
1281 key[sizeof(log_namespace) - 2] = '\0';
1282 property_set(key, hold[2]);
1283 property_set(key + base_offset, hold[3]);
1284}
William Luh964428c2015-08-13 10:41:58 -07001285
William Luh964428c2015-08-13 10:41:58 -07001286TEST(liblog, android_errorWriteWithInfoLog__android_logger_list_read__typical) {
1287 const int TAG = 123456781;
1288 const char SUBTAG[] = "test-subtag";
1289 const int UID = -1;
1290 const int DATA_LEN = 200;
1291 struct logger_list *logger_list;
1292
1293 pid_t pid = getpid();
1294
1295 ASSERT_TRUE(NULL != (logger_list = android_logger_list_open(
1296 LOG_ID_EVENTS, ANDROID_LOG_RDONLY | ANDROID_LOG_NONBLOCK, 1000, pid)));
1297
1298 ASSERT_LT(0, android_errorWriteWithInfoLog(
1299 TAG, SUBTAG, UID, max_payload_buf, DATA_LEN));
1300
1301 sleep(2);
1302
1303 int count = 0;
1304
1305 for (;;) {
1306 log_msg log_msg;
1307 if (android_logger_list_read(logger_list, &log_msg) <= 0) {
1308 break;
1309 }
1310
1311 char *eventData = log_msg.msg();
1312
1313 // Tag
1314 int tag = get4LE(eventData);
1315 eventData += 4;
1316
1317 if (tag != TAG) {
1318 continue;
1319 }
1320
1321 // List type
1322 ASSERT_EQ(EVENT_TYPE_LIST, eventData[0]);
1323 eventData++;
1324
1325 // Number of elements in list
1326 ASSERT_EQ(3, eventData[0]);
1327 eventData++;
1328
1329 // Element #1: string type for subtag
1330 ASSERT_EQ(EVENT_TYPE_STRING, eventData[0]);
1331 eventData++;
1332
1333 ASSERT_EQ((int) strlen(SUBTAG), get4LE(eventData));
1334 eventData +=4;
1335
1336 if (memcmp(SUBTAG, eventData, strlen(SUBTAG))) {
1337 continue;
1338 }
1339 eventData += strlen(SUBTAG);
1340
1341 // Element #2: int type for uid
1342 ASSERT_EQ(EVENT_TYPE_INT, eventData[0]);
1343 eventData++;
1344
1345 ASSERT_EQ(UID, get4LE(eventData));
1346 eventData += 4;
1347
1348 // Element #3: string type for data
1349 ASSERT_EQ(EVENT_TYPE_STRING, eventData[0]);
1350 eventData++;
1351
1352 ASSERT_EQ(DATA_LEN, get4LE(eventData));
1353 eventData += 4;
1354
1355 if (memcmp(max_payload_buf, eventData, DATA_LEN)) {
1356 continue;
1357 }
1358
1359 ++count;
1360 }
1361
1362 EXPECT_EQ(1, count);
1363
1364 android_logger_list_close(logger_list);
1365}
1366
1367TEST(liblog, android_errorWriteWithInfoLog__android_logger_list_read__data_too_large) {
1368 const int TAG = 123456782;
1369 const char SUBTAG[] = "test-subtag";
1370 const int UID = -1;
Mark Salyzyn42ae8272015-12-03 15:37:00 -08001371 const int DATA_LEN = SIZEOF_MAX_PAYLOAD_BUF;
William Luh964428c2015-08-13 10:41:58 -07001372 struct logger_list *logger_list;
1373
1374 pid_t pid = getpid();
1375
1376 ASSERT_TRUE(NULL != (logger_list = android_logger_list_open(
1377 LOG_ID_EVENTS, ANDROID_LOG_RDONLY | ANDROID_LOG_NONBLOCK, 1000, pid)));
1378
1379 ASSERT_LT(0, android_errorWriteWithInfoLog(
1380 TAG, SUBTAG, UID, max_payload_buf, DATA_LEN));
1381
1382 sleep(2);
1383
1384 int count = 0;
1385
1386 for (;;) {
1387 log_msg log_msg;
1388 if (android_logger_list_read(logger_list, &log_msg) <= 0) {
1389 break;
1390 }
1391
1392 char *eventData = log_msg.msg();
1393 char *original = eventData;
1394
1395 // Tag
1396 int tag = get4LE(eventData);
1397 eventData += 4;
1398
1399 if (tag != TAG) {
1400 continue;
1401 }
1402
1403 // List type
1404 ASSERT_EQ(EVENT_TYPE_LIST, eventData[0]);
1405 eventData++;
1406
1407 // Number of elements in list
1408 ASSERT_EQ(3, eventData[0]);
1409 eventData++;
1410
1411 // Element #1: string type for subtag
1412 ASSERT_EQ(EVENT_TYPE_STRING, eventData[0]);
1413 eventData++;
1414
1415 ASSERT_EQ((int) strlen(SUBTAG), get4LE(eventData));
1416 eventData +=4;
1417
1418 if (memcmp(SUBTAG, eventData, strlen(SUBTAG))) {
1419 continue;
1420 }
1421 eventData += strlen(SUBTAG);
1422
1423 // Element #2: int type for uid
1424 ASSERT_EQ(EVENT_TYPE_INT, eventData[0]);
1425 eventData++;
1426
1427 ASSERT_EQ(UID, get4LE(eventData));
1428 eventData += 4;
1429
1430 // Element #3: string type for data
1431 ASSERT_EQ(EVENT_TYPE_STRING, eventData[0]);
1432 eventData++;
1433
1434 size_t dataLen = get4LE(eventData);
1435 eventData += 4;
1436
1437 if (memcmp(max_payload_buf, eventData, dataLen)) {
1438 continue;
1439 }
1440 eventData += dataLen;
1441
Mark Salyzyn42ae8272015-12-03 15:37:00 -08001442 // 4 bytes for the tag, and 512 bytes for the log since the
1443 // max_payload_buf should be truncated.
William Luh964428c2015-08-13 10:41:58 -07001444 ASSERT_EQ(4 + 512, eventData - original);
1445
1446 ++count;
1447 }
1448
1449 EXPECT_EQ(1, count);
1450
1451 android_logger_list_close(logger_list);
1452}
1453
1454TEST(liblog, android_errorWriteWithInfoLog__android_logger_list_read__null_data) {
1455 const int TAG = 123456783;
1456 const char SUBTAG[] = "test-subtag";
1457 const int UID = -1;
1458 const int DATA_LEN = 200;
1459 struct logger_list *logger_list;
1460
1461 pid_t pid = getpid();
1462
1463 ASSERT_TRUE(NULL != (logger_list = android_logger_list_open(
1464 LOG_ID_EVENTS, ANDROID_LOG_RDONLY | ANDROID_LOG_NONBLOCK, 1000, pid)));
1465
1466 ASSERT_GT(0, android_errorWriteWithInfoLog(
1467 TAG, SUBTAG, UID, NULL, DATA_LEN));
1468
1469 sleep(2);
1470
1471 int count = 0;
1472
1473 for (;;) {
1474 log_msg log_msg;
1475 if (android_logger_list_read(logger_list, &log_msg) <= 0) {
1476 break;
1477 }
1478
1479 char *eventData = log_msg.msg();
1480
1481 // Tag
1482 int tag = get4LE(eventData);
1483 eventData += 4;
1484
1485 if (tag == TAG) {
1486 // This tag should not have been written because the data was null
1487 count++;
1488 break;
1489 }
1490 }
1491
1492 EXPECT_EQ(0, count);
1493
1494 android_logger_list_close(logger_list);
1495}
1496
1497TEST(liblog, android_errorWriteWithInfoLog__android_logger_list_read__subtag_too_long) {
1498 const int TAG = 123456784;
1499 const char SUBTAG[] = "abcdefghijklmnopqrstuvwxyz now i know my abc";
1500 const int UID = -1;
1501 const int DATA_LEN = 200;
1502 struct logger_list *logger_list;
1503
1504 pid_t pid = getpid();
1505
1506 ASSERT_TRUE(NULL != (logger_list = android_logger_list_open(
1507 LOG_ID_EVENTS, ANDROID_LOG_RDONLY | ANDROID_LOG_NONBLOCK, 1000, pid)));
1508
1509 ASSERT_LT(0, android_errorWriteWithInfoLog(
1510 TAG, SUBTAG, UID, max_payload_buf, DATA_LEN));
1511
1512 sleep(2);
1513
1514 int count = 0;
1515
1516 for (;;) {
1517 log_msg log_msg;
1518 if (android_logger_list_read(logger_list, &log_msg) <= 0) {
1519 break;
1520 }
1521
1522 char *eventData = log_msg.msg();
1523
1524 // Tag
1525 int tag = get4LE(eventData);
1526 eventData += 4;
1527
1528 if (tag != TAG) {
1529 continue;
1530 }
1531
1532 // List type
1533 ASSERT_EQ(EVENT_TYPE_LIST, eventData[0]);
1534 eventData++;
1535
1536 // Number of elements in list
1537 ASSERT_EQ(3, eventData[0]);
1538 eventData++;
1539
1540 // Element #1: string type for subtag
1541 ASSERT_EQ(EVENT_TYPE_STRING, eventData[0]);
1542 eventData++;
1543
1544 // The subtag is longer than 32 and should be truncated to that.
1545 ASSERT_EQ(32, get4LE(eventData));
1546 eventData +=4;
1547
1548 if (memcmp(SUBTAG, eventData, 32)) {
1549 continue;
1550 }
1551 eventData += 32;
1552
1553 // Element #2: int type for uid
1554 ASSERT_EQ(EVENT_TYPE_INT, eventData[0]);
1555 eventData++;
1556
1557 ASSERT_EQ(UID, get4LE(eventData));
1558 eventData += 4;
1559
1560 // Element #3: string type for data
1561 ASSERT_EQ(EVENT_TYPE_STRING, eventData[0]);
1562 eventData++;
1563
1564 ASSERT_EQ(DATA_LEN, get4LE(eventData));
1565 eventData += 4;
1566
1567 if (memcmp(max_payload_buf, eventData, DATA_LEN)) {
1568 continue;
1569 }
1570
1571 ++count;
1572 }
1573
1574 EXPECT_EQ(1, count);
1575
1576 android_logger_list_close(logger_list);
1577}
1578
1579TEST(liblog, android_errorWriteLog__android_logger_list_read__success) {
1580 const int TAG = 123456785;
1581 const char SUBTAG[] = "test-subtag";
1582 struct logger_list *logger_list;
1583
1584 pid_t pid = getpid();
1585
1586 ASSERT_TRUE(NULL != (logger_list = android_logger_list_open(
1587 LOG_ID_EVENTS, ANDROID_LOG_RDONLY | ANDROID_LOG_NONBLOCK, 1000, pid)));
1588
1589 ASSERT_LT(0, android_errorWriteLog(TAG, SUBTAG));
1590
1591 sleep(2);
1592
1593 int count = 0;
1594
1595 for (;;) {
1596 log_msg log_msg;
1597 if (android_logger_list_read(logger_list, &log_msg) <= 0) {
1598 break;
1599 }
1600
1601 char *eventData = log_msg.msg();
1602
1603 // Tag
1604 int tag = get4LE(eventData);
1605 eventData += 4;
1606
1607 if (tag != TAG) {
1608 continue;
1609 }
1610
1611 // List type
1612 ASSERT_EQ(EVENT_TYPE_LIST, eventData[0]);
1613 eventData++;
1614
1615 // Number of elements in list
1616 ASSERT_EQ(3, eventData[0]);
1617 eventData++;
1618
1619 // Element #1: string type for subtag
1620 ASSERT_EQ(EVENT_TYPE_STRING, eventData[0]);
1621 eventData++;
1622
1623 ASSERT_EQ((int) strlen(SUBTAG), get4LE(eventData));
1624 eventData +=4;
1625
1626 if (memcmp(SUBTAG, eventData, strlen(SUBTAG))) {
1627 continue;
1628 }
1629 ++count;
1630 }
1631
1632 EXPECT_EQ(1, count);
1633
1634 android_logger_list_close(logger_list);
1635}
1636
1637TEST(liblog, android_errorWriteLog__android_logger_list_read__null_subtag) {
1638 const int TAG = 123456786;
1639 struct logger_list *logger_list;
1640
1641 pid_t pid = getpid();
1642
1643 ASSERT_TRUE(NULL != (logger_list = android_logger_list_open(
1644 LOG_ID_EVENTS, ANDROID_LOG_RDONLY | ANDROID_LOG_NONBLOCK, 1000, pid)));
1645
1646 ASSERT_GT(0, android_errorWriteLog(TAG, NULL));
1647
1648 sleep(2);
1649
1650 int count = 0;
1651
1652 for (;;) {
1653 log_msg log_msg;
1654 if (android_logger_list_read(logger_list, &log_msg) <= 0) {
1655 break;
1656 }
1657
1658 char *eventData = log_msg.msg();
1659
1660 // Tag
1661 int tag = get4LE(eventData);
1662 eventData += 4;
1663
1664 if (tag == TAG) {
1665 // This tag should not have been written because the data was null
1666 count++;
1667 break;
1668 }
1669 }
1670
1671 EXPECT_EQ(0, count);
1672
1673 android_logger_list_close(logger_list);
1674}