blob: 597d8f6942c892ebd26525ed750e0e9a37ae0b3d [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 Salyzyn819c58a2013-11-22 12:39:43 -080028
Mark Salyzyncef098e2014-01-09 09:02:55 -080029// enhanced version of LOG_FAILURE_RETRY to add support for EAGAIN and
30// non-syscall libs. Since we are only using this in the emergency of
31// a signal to stuff a terminating code into the logs, we will spin rather
32// than try a usleep.
33#define LOG_FAILURE_RETRY(exp) ({ \
34 typeof (exp) _rc; \
35 do { \
36 _rc = (exp); \
37 } while (((_rc == -1) \
38 && ((errno == EINTR) \
39 || (errno == EAGAIN))) \
40 || (_rc == -EINTR) \
41 || (_rc == -EAGAIN)); \
42 _rc; })
43
Mark Salyzyn819c58a2013-11-22 12:39:43 -080044TEST(liblog, __android_log_buf_print) {
Mark Salyzyn8196be32014-03-18 17:10:47 -070045 EXPECT_LT(0, __android_log_buf_print(LOG_ID_RADIO, ANDROID_LOG_INFO,
Mark Salyzyn819c58a2013-11-22 12:39:43 -080046 "TEST__android_log_buf_print",
47 "radio"));
48 usleep(1000);
Mark Salyzyn8196be32014-03-18 17:10:47 -070049 EXPECT_LT(0, __android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_INFO,
Mark Salyzyn819c58a2013-11-22 12:39:43 -080050 "TEST__android_log_buf_print",
51 "system"));
52 usleep(1000);
Mark Salyzyn8196be32014-03-18 17:10:47 -070053 EXPECT_LT(0, __android_log_buf_print(LOG_ID_MAIN, ANDROID_LOG_INFO,
Mark Salyzyn819c58a2013-11-22 12:39:43 -080054 "TEST__android_log_buf_print",
55 "main"));
56 usleep(1000);
57}
58
59TEST(liblog, __android_log_buf_write) {
Mark Salyzyn8196be32014-03-18 17:10:47 -070060 EXPECT_LT(0, __android_log_buf_write(LOG_ID_RADIO, ANDROID_LOG_INFO,
Mark Salyzyn819c58a2013-11-22 12:39:43 -080061 "TEST__android_log_buf_write",
62 "radio"));
63 usleep(1000);
Mark Salyzyn8196be32014-03-18 17:10:47 -070064 EXPECT_LT(0, __android_log_buf_write(LOG_ID_SYSTEM, ANDROID_LOG_INFO,
Mark Salyzyn819c58a2013-11-22 12:39:43 -080065 "TEST__android_log_buf_write",
66 "system"));
67 usleep(1000);
Mark Salyzyn8196be32014-03-18 17:10:47 -070068 EXPECT_LT(0, __android_log_buf_write(LOG_ID_MAIN, ANDROID_LOG_INFO,
Mark Salyzyn819c58a2013-11-22 12:39:43 -080069 "TEST__android_log_buf_write",
70 "main"));
71 usleep(1000);
72}
73
74TEST(liblog, __android_log_btwrite) {
75 int intBuf = 0xDEADBEEF;
Mark Salyzyn8196be32014-03-18 17:10:47 -070076 EXPECT_LT(0, __android_log_btwrite(0,
Mark Salyzyn819c58a2013-11-22 12:39:43 -080077 EVENT_TYPE_INT,
78 &intBuf, sizeof(intBuf)));
79 long long longBuf = 0xDEADBEEFA55A5AA5;
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_LONG,
82 &longBuf, sizeof(longBuf)));
83 usleep(1000);
84 char Buf[] = "\20\0\0\0DeAdBeEfA55a5aA5";
Mark Salyzyn8196be32014-03-18 17:10:47 -070085 EXPECT_LT(0, __android_log_btwrite(0,
Mark Salyzyn819c58a2013-11-22 12:39:43 -080086 EVENT_TYPE_STRING,
87 Buf, sizeof(Buf) - 1));
88 usleep(1000);
89}
90
91static void* ConcurrentPrintFn(void *arg) {
92 int ret = __android_log_buf_print(LOG_ID_MAIN, ANDROID_LOG_INFO,
Elliott Hughes5d9fe772014-02-05 17:50:35 -080093 "TEST__android_log_print", "Concurrent %" PRIuPTR,
94 reinterpret_cast<uintptr_t>(arg));
Mark Salyzyn819c58a2013-11-22 12:39:43 -080095 return reinterpret_cast<void*>(ret);
96}
97
98#define NUM_CONCURRENT 64
99#define _concurrent_name(a,n) a##__concurrent##n
100#define concurrent_name(a,n) _concurrent_name(a,n)
101
102TEST(liblog, concurrent_name(__android_log_buf_print, NUM_CONCURRENT)) {
103 pthread_t t[NUM_CONCURRENT];
104 int i;
105 for (i=0; i < NUM_CONCURRENT; i++) {
106 ASSERT_EQ(0, pthread_create(&t[i], NULL,
107 ConcurrentPrintFn,
108 reinterpret_cast<void *>(i)));
109 }
110 int ret = 0;
111 for (i=0; i < NUM_CONCURRENT; i++) {
112 void* result;
113 ASSERT_EQ(0, pthread_join(t[i], &result));
Elliott Hughes5d9fe772014-02-05 17:50:35 -0800114 int this_result = reinterpret_cast<uintptr_t>(result);
115 if ((0 == ret) && (0 != this_result)) {
116 ret = this_result;
Mark Salyzyn819c58a2013-11-22 12:39:43 -0800117 }
118 }
119 ASSERT_LT(0, ret);
120}
121
122TEST(liblog, __android_log_btwrite__android_logger_list_read) {
123 struct logger_list *logger_list;
124
125 pid_t pid = getpid();
126
Mark Salyzyn8196be32014-03-18 17:10:47 -0700127 ASSERT_TRUE(NULL != (logger_list = android_logger_list_open(
Mark Salyzyn2d3f38a2015-01-26 10:46:44 -0800128 LOG_ID_EVENTS, ANDROID_LOG_RDONLY | ANDROID_LOG_NONBLOCK, 1000, pid)));
Mark Salyzyn819c58a2013-11-22 12:39:43 -0800129
130 log_time ts(CLOCK_MONOTONIC);
131
132 ASSERT_LT(0, __android_log_btwrite(0, EVENT_TYPE_LONG, &ts, sizeof(ts)));
133 usleep(1000000);
134
135 int count = 0;
136
137 for (;;) {
138 log_msg log_msg;
139 if (android_logger_list_read(logger_list, &log_msg) <= 0) {
140 break;
141 }
142
143 ASSERT_EQ(log_msg.entry.pid, pid);
144
145 if ((log_msg.entry.len != (4 + 1 + 8))
146 || (log_msg.id() != LOG_ID_EVENTS)) {
147 continue;
148 }
149
150 char *eventData = log_msg.msg();
151
152 if (eventData[4] != EVENT_TYPE_LONG) {
153 continue;
154 }
155
156 log_time tx(eventData + 4 + 1);
157 if (ts == tx) {
158 ++count;
159 }
160 }
161
Mark Salyzyn8196be32014-03-18 17:10:47 -0700162 EXPECT_EQ(1, count);
Mark Salyzyn819c58a2013-11-22 12:39:43 -0800163
164 android_logger_list_close(logger_list);
165}
166
Mark Salyzynffbd86f2015-12-04 10:59:45 -0800167TEST(liblog, __security) {
168 static const char persist_key[] = "persist.logd.security";
169 static const char readonly_key[] = "ro.device_owner";
170 static const char nothing_val[] = "_NOTHING_TO_SEE_HERE_";
171 char persist[PROP_VALUE_MAX];
172 char readonly[PROP_VALUE_MAX];
173
174 property_get(persist_key, persist, "");
175 property_get(readonly_key, readonly, nothing_val);
176
177 if (!strcmp(readonly, nothing_val)) {
178 EXPECT_FALSE(__android_log_security());
179 fprintf(stderr, "Warning, setting ro.device_owner to a domain\n");
180 property_set(readonly_key, "com.google.android.SecOps.DeviceOwner");
181 } else if (!strcasecmp(readonly, "false") || !readonly[0]) {
182 EXPECT_FALSE(__android_log_security());
183 return;
184 }
185
186 if (!strcasecmp(persist, "true")) {
187 EXPECT_TRUE(__android_log_security());
188 } else {
189 EXPECT_FALSE(__android_log_security());
190 }
191 property_set(persist_key, "TRUE");
192 EXPECT_TRUE(__android_log_security());
193 property_set(persist_key, "FALSE");
194 EXPECT_FALSE(__android_log_security());
195 property_set(persist_key, "true");
196 EXPECT_TRUE(__android_log_security());
197 property_set(persist_key, "false");
198 EXPECT_FALSE(__android_log_security());
199 property_set(persist_key, "");
200 EXPECT_FALSE(__android_log_security());
201 property_set(persist_key, persist);
202}
203
Mark Salyzyncef098e2014-01-09 09:02:55 -0800204static unsigned signaled;
205log_time signal_time;
206
Mark Salyzyna04464a2014-04-30 08:50:53 -0700207static void caught_blocking(int /*signum*/)
Mark Salyzyncef098e2014-01-09 09:02:55 -0800208{
209 unsigned long long v = 0xDEADBEEFA55A0000ULL;
210
211 v += getpid() & 0xFFFF;
212
213 ++signaled;
214 if ((signal_time.tv_sec == 0) && (signal_time.tv_nsec == 0)) {
Mark Salyzyn7e2f83c2014-03-05 07:41:49 -0800215 signal_time = log_time(CLOCK_MONOTONIC);
Mark Salyzyncef098e2014-01-09 09:02:55 -0800216 signal_time.tv_sec += 2;
217 }
218
219 LOG_FAILURE_RETRY(__android_log_btwrite(0, EVENT_TYPE_LONG, &v, sizeof(v)));
220}
221
222// Fill in current process user and system time in 10ms increments
223static void get_ticks(unsigned long long *uticks, unsigned long long *sticks)
224{
225 *uticks = *sticks = 0;
226
227 pid_t pid = getpid();
228
229 char buffer[512];
230 snprintf(buffer, sizeof(buffer), "/proc/%u/stat", pid);
231
232 FILE *fp = fopen(buffer, "r");
233 if (!fp) {
234 return;
235 }
236
237 char *cp = fgets(buffer, sizeof(buffer), fp);
238 fclose(fp);
239 if (!cp) {
240 return;
241 }
242
243 pid_t d;
244 char s[sizeof(buffer)];
245 char c;
246 long long ll;
247 unsigned long long ull;
248
249 if (15 != sscanf(buffer,
250 "%d %s %c %lld %lld %lld %lld %lld %llu %llu %llu %llu %llu %llu %llu ",
251 &d, s, &c, &ll, &ll, &ll, &ll, &ll, &ull, &ull, &ull, &ull, &ull,
252 uticks, sticks)) {
253 *uticks = *sticks = 0;
254 }
255}
256
257TEST(liblog, android_logger_list_read__cpu) {
258 struct logger_list *logger_list;
259 unsigned long long v = 0xDEADBEEFA55A0000ULL;
260
261 pid_t pid = getpid();
262
263 v += pid & 0xFFFF;
264
Mark Salyzyn8196be32014-03-18 17:10:47 -0700265 ASSERT_TRUE(NULL != (logger_list = android_logger_list_open(
Mark Salyzyn2d3f38a2015-01-26 10:46:44 -0800266 LOG_ID_EVENTS, ANDROID_LOG_RDONLY, 1000, pid)));
Mark Salyzyncef098e2014-01-09 09:02:55 -0800267
268 int count = 0;
269
270 int signals = 0;
271
272 unsigned long long uticks_start;
273 unsigned long long sticks_start;
274 get_ticks(&uticks_start, &sticks_start);
275
276 const unsigned alarm_time = 10;
277
278 memset(&signal_time, 0, sizeof(signal_time));
279
280 signal(SIGALRM, caught_blocking);
281 alarm(alarm_time);
282
283 signaled = 0;
284
285 do {
286 log_msg log_msg;
287 if (android_logger_list_read(logger_list, &log_msg) <= 0) {
288 break;
289 }
290
291 alarm(alarm_time);
292
293 ++count;
294
295 ASSERT_EQ(log_msg.entry.pid, pid);
296
297 if ((log_msg.entry.len != (4 + 1 + 8))
298 || (log_msg.id() != LOG_ID_EVENTS)) {
299 continue;
300 }
301
302 char *eventData = log_msg.msg();
303
304 if (eventData[4] != EVENT_TYPE_LONG) {
305 continue;
306 }
307
308 unsigned long long l = eventData[4 + 1 + 0] & 0xFF;
309 l |= (unsigned long long) (eventData[4 + 1 + 1] & 0xFF) << 8;
310 l |= (unsigned long long) (eventData[4 + 1 + 2] & 0xFF) << 16;
311 l |= (unsigned long long) (eventData[4 + 1 + 3] & 0xFF) << 24;
312 l |= (unsigned long long) (eventData[4 + 1 + 4] & 0xFF) << 32;
313 l |= (unsigned long long) (eventData[4 + 1 + 5] & 0xFF) << 40;
314 l |= (unsigned long long) (eventData[4 + 1 + 6] & 0xFF) << 48;
315 l |= (unsigned long long) (eventData[4 + 1 + 7] & 0xFF) << 56;
316
317 if (l == v) {
318 ++signals;
319 break;
320 }
Mark Salyzyn8196be32014-03-18 17:10:47 -0700321 } while (!signaled || (log_time(CLOCK_MONOTONIC) < signal_time));
Mark Salyzyncef098e2014-01-09 09:02:55 -0800322 alarm(0);
323 signal(SIGALRM, SIG_DFL);
324
Mark Salyzyn8196be32014-03-18 17:10:47 -0700325 EXPECT_LT(1, count);
Mark Salyzyncef098e2014-01-09 09:02:55 -0800326
Mark Salyzyn8196be32014-03-18 17:10:47 -0700327 EXPECT_EQ(1, signals);
Mark Salyzyncef098e2014-01-09 09:02:55 -0800328
329 android_logger_list_close(logger_list);
330
331 unsigned long long uticks_end;
332 unsigned long long sticks_end;
333 get_ticks(&uticks_end, &sticks_end);
334
335 // Less than 1% in either user or system time, or both
336 const unsigned long long one_percent_ticks = alarm_time;
337 unsigned long long user_ticks = uticks_end - uticks_start;
338 unsigned long long system_ticks = sticks_end - sticks_start;
Mark Salyzyn8196be32014-03-18 17:10:47 -0700339 EXPECT_GT(one_percent_ticks, user_ticks);
340 EXPECT_GT(one_percent_ticks, system_ticks);
341 EXPECT_GT(one_percent_ticks, user_ticks + system_ticks);
342}
343
344static const char max_payload_tag[] = "TEST_max_payload_XXXX";
345static const char max_payload_buf[LOGGER_ENTRY_MAX_PAYLOAD
346 - sizeof(max_payload_tag) - 1] = "LEONATO\n\
347I learn in this letter that Don Peter of Arragon\n\
348comes this night to Messina\n\
349MESSENGER\n\
350He is very near by this: he was not three leagues off\n\
351when I left him\n\
352LEONATO\n\
353How many gentlemen have you lost in this action?\n\
354MESSENGER\n\
355But few of any sort, and none of name\n\
356LEONATO\n\
357A victory is twice itself when the achiever brings\n\
358home full numbers. I find here that Don Peter hath\n\
359bestowed much honour on a young Florentine called Claudio\n\
360MESSENGER\n\
361Much deserved on his part and equally remembered by\n\
362Don Pedro: he hath borne himself beyond the\n\
363promise of his age, doing, in the figure of a lamb,\n\
364the feats of a lion: he hath indeed better\n\
365bettered expectation than you must expect of me to\n\
366tell you how\n\
367LEONATO\n\
368He hath an uncle here in Messina will be very much\n\
369glad of it.\n\
370MESSENGER\n\
371I have already delivered him letters, and there\n\
372appears much joy in him; even so much that joy could\n\
373not show itself modest enough without a badge of\n\
374bitterness.\n\
375LEONATO\n\
376Did he break out into tears?\n\
377MESSENGER\n\
378In great measure.\n\
379LEONATO\n\
380A kind overflow of kindness: there are no faces\n\
381truer than those that are so washed. How much\n\
382better is it to weep at joy than to joy at weeping!\n\
383BEATRICE\n\
384I pray you, is Signior Mountanto returned from the\n\
385wars or no?\n\
386MESSENGER\n\
387I know none of that name, lady: there was none such\n\
388in the army of any sort.\n\
389LEONATO\n\
390What is he that you ask for, niece?\n\
391HERO\n\
392My cousin means Signior Benedick of Padua.\n\
393MESSENGER\n\
394O, he's returned; and as pleasant as ever he was.\n\
395BEATRICE\n\
396He set up his bills here in Messina and challenged\n\
397Cupid at the flight; and my uncle's fool, reading\n\
398the challenge, subscribed for Cupid, and challenged\n\
399him at the bird-bolt. I pray you, how many hath he\n\
400killed and eaten in these wars? But how many hath\n\
401he killed? for indeed I promised to eat all of his killing.\n\
402LEONATO\n\
403Faith, niece, you tax Signior Benedick too much;\n\
404but he'll be meet with you, I doubt it not.\n\
405MESSENGER\n\
406He hath done good service, lady, in these wars.\n\
407BEATRICE\n\
408You had musty victual, and he hath holp to eat it:\n\
409he is a very valiant trencherman; he hath an\n\
410excellent stomach.\n\
411MESSENGER\n\
412And a good soldier too, lady.\n\
413BEATRICE\n\
414And a good soldier to a lady: but what is he to a lord?\n\
415MESSENGER\n\
416A lord to a lord, a man to a man; stuffed with all\n\
417honourable virtues.\n\
418BEATRICE\n\
419It is so, indeed; he is no less than a stuffed man:\n\
420but for the stuffing,--well, we are all mortal.\n\
421LEONATO\n\
422You must not, sir, mistake my niece. There is a\n\
423kind of merry war betwixt Signior Benedick and her:\n\
424they never meet but there's a skirmish of wit\n\
425between them.\n\
426BEATRICE\n\
427Alas! he gets nothing by that. In our last\n\
428conflict four of his five wits went halting off, and\n\
429now is the whole man governed with one: so that if\n\
430he have wit enough to keep himself warm, let him\n\
431bear it for a difference between himself and his\n\
432horse; for it is all the wealth that he hath left,\n\
433to be known a reasonable creature. Who is his\n\
434companion now? He hath every month a new sworn brother.\n\
435MESSENGER\n\
436Is't possible?\n\
437BEATRICE\n\
438Very easily possible: he wears his faith but as\n\
439the fashion of his hat; it ever changes with the\n\
440next block.\n\
441MESSENGER\n\
442I see, lady, the gentleman is not in your books.\n\
443BEATRICE\n\
444No; an he were, I would burn my study. But, I pray\n\
445you, who is his companion? Is there no young\n\
446squarer now that will make a voyage with him to the devil?\n\
447MESSENGER\n\
448He is most in the company of the right noble Claudio.\n\
449BEATRICE\n\
450O Lord, he will hang upon him like a disease: he\n\
451is sooner caught than the pestilence, and the taker\n\
452runs presently mad. God help the noble Claudio! if\n\
453he have caught the Benedick, it will cost him a\n\
454thousand pound ere a' be cured.\n\
455MESSENGER\n\
456I will hold friends with you, lady.\n\
457BEATRICE\n\
458Do, good friend.\n\
459LEONATO\n\
460You will never run mad, niece.\n\
461BEATRICE\n\
462No, not till a hot January.\n\
463MESSENGER\n\
464Don Pedro is approached.\n\
465Enter DON PEDRO, DON JOHN, CLAUDIO, BENEDICK, and BALTHASAR\n\
466\n\
467DON PEDRO\n\
468Good Signior Leonato, you are come to meet your\n\
469trouble: the fashion of the world is to avoid\n\
470cost, and you encounter it\n\
471LEONATO\n\
472Never came trouble to my house in the likeness";
473
474TEST(liblog, max_payload) {
475 pid_t pid = getpid();
476 char tag[sizeof(max_payload_tag)];
477 memcpy(tag, max_payload_tag, sizeof(tag));
478 snprintf(tag + sizeof(tag) - 5, 5, "%04X", pid & 0xFFFF);
479
480 LOG_FAILURE_RETRY(__android_log_buf_write(LOG_ID_SYSTEM, ANDROID_LOG_INFO,
481 tag, max_payload_buf));
Mark Salyzync1584562015-03-12 15:46:29 -0700482 sleep(2);
Mark Salyzyn8196be32014-03-18 17:10:47 -0700483
484 struct logger_list *logger_list;
485
486 ASSERT_TRUE(NULL != (logger_list = android_logger_list_open(
Mark Salyzyn2d3f38a2015-01-26 10:46:44 -0800487 LOG_ID_SYSTEM, ANDROID_LOG_RDONLY, 100, 0)));
Mark Salyzyn8196be32014-03-18 17:10:47 -0700488
489 bool matches = false;
490 ssize_t max_len = 0;
491
492 for(;;) {
493 log_msg log_msg;
494 if (android_logger_list_read(logger_list, &log_msg) <= 0) {
495 break;
496 }
497
498 if ((log_msg.entry.pid != pid) || (log_msg.id() != LOG_ID_SYSTEM)) {
499 continue;
500 }
501
502 char *data = log_msg.msg() + 1;
503
504 if (strcmp(data, tag)) {
505 continue;
506 }
507
508 data += strlen(data) + 1;
509
510 const char *left = data;
511 const char *right = max_payload_buf;
512 while (*left && *right && (*left == *right)) {
513 ++left;
514 ++right;
515 }
516
517 if (max_len <= (left - data)) {
518 max_len = left - data + 1;
519 }
520
521 if (max_len > 512) {
522 matches = true;
523 break;
524 }
525 }
526
Mark Salyzyn8444eb82014-04-24 09:43:23 -0700527 android_logger_list_close(logger_list);
528
Mark Salyzyn8196be32014-03-18 17:10:47 -0700529 EXPECT_EQ(true, matches);
530
Ben Cheng1bafa522014-04-11 16:19:30 -0700531 EXPECT_LE(sizeof(max_payload_buf), static_cast<size_t>(max_len));
Mark Salyzyn8444eb82014-04-24 09:43:23 -0700532}
533
534TEST(liblog, too_big_payload) {
535 pid_t pid = getpid();
536 static const char big_payload_tag[] = "TEST_big_payload_XXXX";
537 char tag[sizeof(big_payload_tag)];
538 memcpy(tag, big_payload_tag, sizeof(tag));
539 snprintf(tag + sizeof(tag) - 5, 5, "%04X", pid & 0xFFFF);
540
541 std::string longString(3266519, 'x');
542
543 ssize_t ret = LOG_FAILURE_RETRY(__android_log_buf_write(LOG_ID_SYSTEM,
544 ANDROID_LOG_INFO, tag, longString.c_str()));
545
546 struct logger_list *logger_list;
547
548 ASSERT_TRUE(NULL != (logger_list = android_logger_list_open(
Mark Salyzyn2d3f38a2015-01-26 10:46:44 -0800549 LOG_ID_SYSTEM, ANDROID_LOG_RDONLY | ANDROID_LOG_NONBLOCK, 100, 0)));
Mark Salyzyn8444eb82014-04-24 09:43:23 -0700550
551 ssize_t max_len = 0;
552
553 for(;;) {
554 log_msg log_msg;
555 if (android_logger_list_read(logger_list, &log_msg) <= 0) {
556 break;
557 }
558
559 if ((log_msg.entry.pid != pid) || (log_msg.id() != LOG_ID_SYSTEM)) {
560 continue;
561 }
562
563 char *data = log_msg.msg() + 1;
564
565 if (strcmp(data, tag)) {
566 continue;
567 }
568
569 data += strlen(data) + 1;
570
571 const char *left = data;
572 const char *right = longString.c_str();
573 while (*left && *right && (*left == *right)) {
574 ++left;
575 ++right;
576 }
577
578 if (max_len <= (left - data)) {
579 max_len = left - data + 1;
580 }
581 }
Mark Salyzyn8196be32014-03-18 17:10:47 -0700582
583 android_logger_list_close(logger_list);
Mark Salyzyn8444eb82014-04-24 09:43:23 -0700584
585 EXPECT_LE(LOGGER_ENTRY_MAX_PAYLOAD - sizeof(big_payload_tag),
586 static_cast<size_t>(max_len));
587
Ben Cheng43232922014-05-20 10:38:24 -0700588 EXPECT_EQ(ret, max_len + static_cast<ssize_t>(sizeof(big_payload_tag)));
Mark Salyzyn8196be32014-03-18 17:10:47 -0700589}
590
591TEST(liblog, dual_reader) {
592 struct logger_list *logger_list1;
593
594 // >25 messages due to liblog.__android_log_buf_print__concurrentXX above.
595 ASSERT_TRUE(NULL != (logger_list1 = android_logger_list_open(
Mark Salyzyn2d3f38a2015-01-26 10:46:44 -0800596 LOG_ID_MAIN, ANDROID_LOG_RDONLY | ANDROID_LOG_NONBLOCK, 25, 0)));
Mark Salyzyn8196be32014-03-18 17:10:47 -0700597
598 struct logger_list *logger_list2;
599
600 if (NULL == (logger_list2 = android_logger_list_open(
Mark Salyzyn2d3f38a2015-01-26 10:46:44 -0800601 LOG_ID_MAIN, ANDROID_LOG_RDONLY | ANDROID_LOG_NONBLOCK, 15, 0))) {
Mark Salyzyn8196be32014-03-18 17:10:47 -0700602 android_logger_list_close(logger_list1);
603 ASSERT_TRUE(NULL != logger_list2);
604 }
605
606 int count1 = 0;
607 bool done1 = false;
608 int count2 = 0;
609 bool done2 = false;
610
611 do {
612 log_msg log_msg;
613
614 if (!done1) {
615 if (android_logger_list_read(logger_list1, &log_msg) <= 0) {
616 done1 = true;
617 } else {
618 ++count1;
619 }
620 }
621
622 if (!done2) {
623 if (android_logger_list_read(logger_list2, &log_msg) <= 0) {
624 done2 = true;
625 } else {
626 ++count2;
627 }
628 }
629 } while ((!done1) || (!done2));
630
631 android_logger_list_close(logger_list1);
632 android_logger_list_close(logger_list2);
633
634 EXPECT_EQ(25, count1);
635 EXPECT_EQ(15, count2);
Mark Salyzyncef098e2014-01-09 09:02:55 -0800636}
637
Mark Salyzyn819c58a2013-11-22 12:39:43 -0800638TEST(liblog, android_logger_get_) {
Mark Salyzyn2d3f38a2015-01-26 10:46:44 -0800639 struct logger_list * logger_list = android_logger_list_alloc(ANDROID_LOG_WRONLY, 0, 0);
Mark Salyzyn819c58a2013-11-22 12:39:43 -0800640
641 for(int i = LOG_ID_MIN; i < LOG_ID_MAX; ++i) {
642 log_id_t id = static_cast<log_id_t>(i);
643 const char *name = android_log_id_to_name(id);
644 if (id != android_name_to_log_id(name)) {
645 continue;
646 }
Mark Salyzync1584562015-03-12 15:46:29 -0700647 fprintf(stderr, "log buffer %s\r", name);
Mark Salyzyn819c58a2013-11-22 12:39:43 -0800648 struct logger * logger;
Mark Salyzyn8196be32014-03-18 17:10:47 -0700649 EXPECT_TRUE(NULL != (logger = android_logger_open(logger_list, id)));
650 EXPECT_EQ(id, android_logger_get_id(logger));
Mark Salyzyn7d8939e2015-12-01 12:47:43 -0800651 EXPECT_LT(0, android_logger_get_log_size(logger));
Mark Salyzync1584562015-03-12 15:46:29 -0700652 /* crash buffer is allowed to be empty, that is actually healthy! */
Mark Salyzyn7d8939e2015-12-01 12:47:43 -0800653 if (android_logger_get_log_readable_size(logger) || strcmp("crash", name)) {
654 EXPECT_LT(0, android_logger_get_log_readable_size(logger));
Mark Salyzync1584562015-03-12 15:46:29 -0700655 }
Mark Salyzyn8196be32014-03-18 17:10:47 -0700656 EXPECT_LT(0, android_logger_get_log_version(logger));
Mark Salyzyn819c58a2013-11-22 12:39:43 -0800657 }
658
659 android_logger_list_close(logger_list);
660}
Mark Salyzyn5045f572014-04-30 08:50:53 -0700661
662static bool checkPriForTag(AndroidLogFormat *p_format, const char *tag, android_LogPriority pri) {
663 return android_log_shouldPrintLine(p_format, tag, pri)
664 && !android_log_shouldPrintLine(p_format, tag, (android_LogPriority)(pri - 1));
665}
666
667TEST(liblog, filterRule) {
668 static const char tag[] = "random";
669
670 AndroidLogFormat *p_format = android_log_format_new();
671
672 android_log_addFilterRule(p_format,"*:i");
673
674 EXPECT_TRUE(checkPriForTag(p_format, tag, ANDROID_LOG_INFO));
675 EXPECT_TRUE(android_log_shouldPrintLine(p_format, tag, ANDROID_LOG_DEBUG) == 0);
676 android_log_addFilterRule(p_format, "*");
677 EXPECT_TRUE (checkPriForTag(p_format, tag, ANDROID_LOG_DEBUG));
678 EXPECT_TRUE(android_log_shouldPrintLine(p_format, tag, ANDROID_LOG_DEBUG) > 0);
679 android_log_addFilterRule(p_format, "*:v");
680 EXPECT_TRUE (checkPriForTag(p_format, tag, ANDROID_LOG_VERBOSE));
681 EXPECT_TRUE(android_log_shouldPrintLine(p_format, tag, ANDROID_LOG_DEBUG) > 0);
682 android_log_addFilterRule(p_format, "*:i");
683 EXPECT_TRUE (checkPriForTag(p_format, tag, ANDROID_LOG_INFO));
684 EXPECT_TRUE(android_log_shouldPrintLine(p_format, tag, ANDROID_LOG_DEBUG) == 0);
685
686 android_log_addFilterRule(p_format, tag);
687 EXPECT_TRUE (checkPriForTag(p_format, tag, ANDROID_LOG_VERBOSE));
688 EXPECT_TRUE(android_log_shouldPrintLine(p_format, tag, ANDROID_LOG_DEBUG) > 0);
689 android_log_addFilterRule(p_format, "random:v");
690 EXPECT_TRUE (checkPriForTag(p_format, tag, ANDROID_LOG_VERBOSE));
691 EXPECT_TRUE(android_log_shouldPrintLine(p_format, tag, ANDROID_LOG_DEBUG) > 0);
692 android_log_addFilterRule(p_format, "random:d");
693 EXPECT_TRUE (checkPriForTag(p_format, tag, ANDROID_LOG_DEBUG));
694 EXPECT_TRUE(android_log_shouldPrintLine(p_format, tag, ANDROID_LOG_DEBUG) > 0);
695 android_log_addFilterRule(p_format, "random:w");
696 EXPECT_TRUE (checkPriForTag(p_format, tag, ANDROID_LOG_WARN));
697 EXPECT_TRUE(android_log_shouldPrintLine(p_format, tag, ANDROID_LOG_DEBUG) == 0);
698
699 android_log_addFilterRule(p_format, "crap:*");
700 EXPECT_TRUE (checkPriForTag(p_format, "crap", ANDROID_LOG_VERBOSE));
701 EXPECT_TRUE(android_log_shouldPrintLine(p_format, "crap", ANDROID_LOG_VERBOSE) > 0);
702
703 // invalid expression
704 EXPECT_TRUE (android_log_addFilterRule(p_format, "random:z") < 0);
705 EXPECT_TRUE (checkPriForTag(p_format, tag, ANDROID_LOG_WARN));
706 EXPECT_TRUE(android_log_shouldPrintLine(p_format, tag, ANDROID_LOG_DEBUG) == 0);
707
708 // Issue #550946
709 EXPECT_TRUE(android_log_addFilterString(p_format, " ") == 0);
710 EXPECT_TRUE(checkPriForTag(p_format, tag, ANDROID_LOG_WARN));
711
712 // note trailing space
713 EXPECT_TRUE(android_log_addFilterString(p_format, "*:s random:d ") == 0);
714 EXPECT_TRUE(checkPriForTag(p_format, tag, ANDROID_LOG_DEBUG));
715
716 EXPECT_TRUE(android_log_addFilterString(p_format, "*:s random:z") < 0);
717
718#if 0 // bitrot, seek update
719 char defaultBuffer[512];
720
721 android_log_formatLogLine(p_format,
722 defaultBuffer, sizeof(defaultBuffer), 0, ANDROID_LOG_ERROR, 123,
723 123, 123, tag, "nofile", strlen("Hello"), "Hello", NULL);
724
725 fprintf(stderr, "%s\n", defaultBuffer);
726#endif
727
728 android_log_format_free(p_format);
729}
Mark Salyzync1584562015-03-12 15:46:29 -0700730
731TEST(liblog, is_loggable) {
732 static const char tag[] = "is_loggable";
733 static const char log_namespace[] = "persist.log.tag.";
734 static const size_t base_offset = 8; /* skip "persist." */
735 // sizeof("string") = strlen("string") + 1
736 char key[sizeof(log_namespace) + sizeof(tag) - 1];
737 char hold[4][PROP_VALUE_MAX];
738 static const struct {
739 int level;
740 char type;
741 } levels[] = {
742 { ANDROID_LOG_VERBOSE, 'v' },
743 { ANDROID_LOG_DEBUG , 'd' },
744 { ANDROID_LOG_INFO , 'i' },
745 { ANDROID_LOG_WARN , 'w' },
746 { ANDROID_LOG_ERROR , 'e' },
747 { ANDROID_LOG_FATAL , 'a' },
748 { -1 , 's' },
749 { -2 , 'g' }, // Illegal value, resort to default
750 };
751
752 // Set up initial test condition
753 memset(hold, 0, sizeof(hold));
754 snprintf(key, sizeof(key), "%s%s", log_namespace, tag);
755 property_get(key, hold[0], "");
756 property_set(key, "");
757 property_get(key + base_offset, hold[1], "");
758 property_set(key + base_offset, "");
759 strcpy(key, log_namespace);
760 key[sizeof(log_namespace) - 2] = '\0';
761 property_get(key, hold[2], "");
762 property_set(key, "");
763 property_get(key, hold[3], "");
764 property_set(key + base_offset, "");
765
766 // All combinations of level and defaults
767 for(size_t i = 0; i < (sizeof(levels) / sizeof(levels[0])); ++i) {
768 if (levels[i].level == -2) {
769 continue;
770 }
771 for(size_t j = 0; j < (sizeof(levels) / sizeof(levels[0])); ++j) {
772 if (levels[j].level == -2) {
773 continue;
774 }
775 fprintf(stderr, "i=%zu j=%zu\r", i, j);
776 if ((levels[i].level < levels[j].level)
777 || (levels[j].level == -1)) {
778 EXPECT_FALSE(__android_log_is_loggable(levels[i].level, tag,
779 levels[j].level));
780 } else {
781 EXPECT_TRUE(__android_log_is_loggable(levels[i].level, tag,
782 levels[j].level));
783 }
784 }
785 }
786
787 // All combinations of level and tag and global properties
788 for(size_t i = 0; i < (sizeof(levels) / sizeof(levels[0])); ++i) {
789 if (levels[i].level == -2) {
790 continue;
791 }
792 for(size_t j = 0; j < (sizeof(levels) / sizeof(levels[0])); ++j) {
793 char buf[2];
794 buf[0] = levels[j].type;
795 buf[1] = '\0';
796
797 snprintf(key, sizeof(key), "%s%s", log_namespace, tag);
798 fprintf(stderr, "i=%zu j=%zu property_set(\"%s\",\"%s\")\r",
799 i, j, key, buf);
800 property_set(key, buf);
801 if ((levels[i].level < levels[j].level)
802 || (levels[j].level == -1)
803 || ((levels[i].level < ANDROID_LOG_DEBUG)
804 && (levels[j].level == -2))) {
805 EXPECT_FALSE(__android_log_is_loggable(levels[i].level, tag,
806 ANDROID_LOG_DEBUG));
807 } else {
808 EXPECT_TRUE(__android_log_is_loggable(levels[i].level, tag,
809 ANDROID_LOG_DEBUG));
810 }
811 property_set(key, "");
812
813 fprintf(stderr, "i=%zu j=%zu property_set(\"%s\",\"%s\")\r",
814 i, j, key + base_offset, buf);
815 property_set(key + base_offset, buf);
816 if ((levels[i].level < levels[j].level)
817 || (levels[j].level == -1)
818 || ((levels[i].level < ANDROID_LOG_DEBUG)
819 && (levels[j].level == -2))) {
820 EXPECT_FALSE(__android_log_is_loggable(levels[i].level, tag,
821 ANDROID_LOG_DEBUG));
822 } else {
823 EXPECT_TRUE(__android_log_is_loggable(levels[i].level, tag,
824 ANDROID_LOG_DEBUG));
825 }
826 property_set(key + base_offset, "");
827
828 strcpy(key, log_namespace);
829 key[sizeof(log_namespace) - 2] = '\0';
830 fprintf(stderr, "i=%zu j=%zu property_set(\"%s\",\"%s\")\r",
831 i, j, key, buf);
832 property_set(key, buf);
833 if ((levels[i].level < levels[j].level)
834 || (levels[j].level == -1)
835 || ((levels[i].level < ANDROID_LOG_DEBUG)
836 && (levels[j].level == -2))) {
837 EXPECT_FALSE(__android_log_is_loggable(levels[i].level, tag,
838 ANDROID_LOG_DEBUG));
839 } else {
840 EXPECT_TRUE(__android_log_is_loggable(levels[i].level, tag,
841 ANDROID_LOG_DEBUG));
842 }
843 property_set(key, "");
844
845 fprintf(stderr, "i=%zu j=%zu property_set(\"%s\",\"%s\")\r",
846 i, j, key + base_offset, buf);
847 property_set(key + base_offset, buf);
848 if ((levels[i].level < levels[j].level)
849 || (levels[j].level == -1)
850 || ((levels[i].level < ANDROID_LOG_DEBUG)
851 && (levels[j].level == -2))) {
852 EXPECT_FALSE(__android_log_is_loggable(levels[i].level, tag,
853 ANDROID_LOG_DEBUG));
854 } else {
855 EXPECT_TRUE(__android_log_is_loggable(levels[i].level, tag,
856 ANDROID_LOG_DEBUG));
857 }
858 property_set(key + base_offset, "");
859 }
860 }
861
862 // All combinations of level and tag properties, but with global set to INFO
863 strcpy(key, log_namespace);
864 key[sizeof(log_namespace) - 2] = '\0';
865 property_set(key, "I");
866 snprintf(key, sizeof(key), "%s%s", log_namespace, tag);
867 for(size_t i = 0; i < (sizeof(levels) / sizeof(levels[0])); ++i) {
868 if (levels[i].level == -2) {
869 continue;
870 }
871 for(size_t j = 0; j < (sizeof(levels) / sizeof(levels[0])); ++j) {
872 char buf[2];
873 buf[0] = levels[j].type;
874 buf[1] = '\0';
875
876 fprintf(stderr, "i=%zu j=%zu property_set(\"%s\",\"%s\")\r",
877 i, j, key, buf);
878 property_set(key, buf);
879 if ((levels[i].level < levels[j].level)
880 || (levels[j].level == -1)
881 || ((levels[i].level < ANDROID_LOG_INFO) // Yes INFO
882 && (levels[j].level == -2))) {
883 EXPECT_FALSE(__android_log_is_loggable(levels[i].level, tag,
884 ANDROID_LOG_DEBUG));
885 } else {
886 EXPECT_TRUE(__android_log_is_loggable(levels[i].level, tag,
887 ANDROID_LOG_DEBUG));
888 }
889 property_set(key, "");
890
891 fprintf(stderr, "i=%zu j=%zu property_set(\"%s\",\"%s\")\r",
892 i, j, key + base_offset, buf);
893 property_set(key + base_offset, buf);
894 if ((levels[i].level < levels[j].level)
895 || (levels[j].level == -1)
896 || ((levels[i].level < ANDROID_LOG_INFO) // Yes INFO
897 && (levels[j].level == -2))) {
898 EXPECT_FALSE(__android_log_is_loggable(levels[i].level, tag,
899 ANDROID_LOG_DEBUG));
900 } else {
901 EXPECT_TRUE(__android_log_is_loggable(levels[i].level, tag,
902 ANDROID_LOG_DEBUG));
903 }
904 property_set(key + base_offset, "");
905 }
906 }
907
908 // reset parms
909 snprintf(key, sizeof(key), "%s%s", log_namespace, tag);
910 property_set(key, hold[0]);
911 property_set(key + base_offset, hold[1]);
912 strcpy(key, log_namespace);
913 key[sizeof(log_namespace) - 2] = '\0';
914 property_set(key, hold[2]);
915 property_set(key + base_offset, hold[3]);
916}
William Luh964428c2015-08-13 10:41:58 -0700917
918static inline int32_t get4LE(const char* src)
919{
920 return src[0] | (src[1] << 8) | (src[2] << 16) | (src[3] << 24);
921}
922
923TEST(liblog, android_errorWriteWithInfoLog__android_logger_list_read__typical) {
924 const int TAG = 123456781;
925 const char SUBTAG[] = "test-subtag";
926 const int UID = -1;
927 const int DATA_LEN = 200;
928 struct logger_list *logger_list;
929
930 pid_t pid = getpid();
931
932 ASSERT_TRUE(NULL != (logger_list = android_logger_list_open(
933 LOG_ID_EVENTS, ANDROID_LOG_RDONLY | ANDROID_LOG_NONBLOCK, 1000, pid)));
934
935 ASSERT_LT(0, android_errorWriteWithInfoLog(
936 TAG, SUBTAG, UID, max_payload_buf, DATA_LEN));
937
938 sleep(2);
939
940 int count = 0;
941
942 for (;;) {
943 log_msg log_msg;
944 if (android_logger_list_read(logger_list, &log_msg) <= 0) {
945 break;
946 }
947
948 char *eventData = log_msg.msg();
949
950 // Tag
951 int tag = get4LE(eventData);
952 eventData += 4;
953
954 if (tag != TAG) {
955 continue;
956 }
957
958 // List type
959 ASSERT_EQ(EVENT_TYPE_LIST, eventData[0]);
960 eventData++;
961
962 // Number of elements in list
963 ASSERT_EQ(3, eventData[0]);
964 eventData++;
965
966 // Element #1: string type for subtag
967 ASSERT_EQ(EVENT_TYPE_STRING, eventData[0]);
968 eventData++;
969
970 ASSERT_EQ((int) strlen(SUBTAG), get4LE(eventData));
971 eventData +=4;
972
973 if (memcmp(SUBTAG, eventData, strlen(SUBTAG))) {
974 continue;
975 }
976 eventData += strlen(SUBTAG);
977
978 // Element #2: int type for uid
979 ASSERT_EQ(EVENT_TYPE_INT, eventData[0]);
980 eventData++;
981
982 ASSERT_EQ(UID, get4LE(eventData));
983 eventData += 4;
984
985 // Element #3: string type for data
986 ASSERT_EQ(EVENT_TYPE_STRING, eventData[0]);
987 eventData++;
988
989 ASSERT_EQ(DATA_LEN, get4LE(eventData));
990 eventData += 4;
991
992 if (memcmp(max_payload_buf, eventData, DATA_LEN)) {
993 continue;
994 }
995
996 ++count;
997 }
998
999 EXPECT_EQ(1, count);
1000
1001 android_logger_list_close(logger_list);
1002}
1003
1004TEST(liblog, android_errorWriteWithInfoLog__android_logger_list_read__data_too_large) {
1005 const int TAG = 123456782;
1006 const char SUBTAG[] = "test-subtag";
1007 const int UID = -1;
1008 const int DATA_LEN = sizeof(max_payload_buf);
1009 struct logger_list *logger_list;
1010
1011 pid_t pid = getpid();
1012
1013 ASSERT_TRUE(NULL != (logger_list = android_logger_list_open(
1014 LOG_ID_EVENTS, ANDROID_LOG_RDONLY | ANDROID_LOG_NONBLOCK, 1000, pid)));
1015
1016 ASSERT_LT(0, android_errorWriteWithInfoLog(
1017 TAG, SUBTAG, UID, max_payload_buf, DATA_LEN));
1018
1019 sleep(2);
1020
1021 int count = 0;
1022
1023 for (;;) {
1024 log_msg log_msg;
1025 if (android_logger_list_read(logger_list, &log_msg) <= 0) {
1026 break;
1027 }
1028
1029 char *eventData = log_msg.msg();
1030 char *original = eventData;
1031
1032 // Tag
1033 int tag = get4LE(eventData);
1034 eventData += 4;
1035
1036 if (tag != TAG) {
1037 continue;
1038 }
1039
1040 // List type
1041 ASSERT_EQ(EVENT_TYPE_LIST, eventData[0]);
1042 eventData++;
1043
1044 // Number of elements in list
1045 ASSERT_EQ(3, eventData[0]);
1046 eventData++;
1047
1048 // Element #1: string type for subtag
1049 ASSERT_EQ(EVENT_TYPE_STRING, eventData[0]);
1050 eventData++;
1051
1052 ASSERT_EQ((int) strlen(SUBTAG), get4LE(eventData));
1053 eventData +=4;
1054
1055 if (memcmp(SUBTAG, eventData, strlen(SUBTAG))) {
1056 continue;
1057 }
1058 eventData += strlen(SUBTAG);
1059
1060 // Element #2: int type for uid
1061 ASSERT_EQ(EVENT_TYPE_INT, eventData[0]);
1062 eventData++;
1063
1064 ASSERT_EQ(UID, get4LE(eventData));
1065 eventData += 4;
1066
1067 // Element #3: string type for data
1068 ASSERT_EQ(EVENT_TYPE_STRING, eventData[0]);
1069 eventData++;
1070
1071 size_t dataLen = get4LE(eventData);
1072 eventData += 4;
1073
1074 if (memcmp(max_payload_buf, eventData, dataLen)) {
1075 continue;
1076 }
1077 eventData += dataLen;
1078
1079 // 4 bytes for the tag, and 512 bytes for the log since the max_payload_buf should be
1080 // truncated.
1081 ASSERT_EQ(4 + 512, eventData - original);
1082
1083 ++count;
1084 }
1085
1086 EXPECT_EQ(1, count);
1087
1088 android_logger_list_close(logger_list);
1089}
1090
1091TEST(liblog, android_errorWriteWithInfoLog__android_logger_list_read__null_data) {
1092 const int TAG = 123456783;
1093 const char SUBTAG[] = "test-subtag";
1094 const int UID = -1;
1095 const int DATA_LEN = 200;
1096 struct logger_list *logger_list;
1097
1098 pid_t pid = getpid();
1099
1100 ASSERT_TRUE(NULL != (logger_list = android_logger_list_open(
1101 LOG_ID_EVENTS, ANDROID_LOG_RDONLY | ANDROID_LOG_NONBLOCK, 1000, pid)));
1102
1103 ASSERT_GT(0, android_errorWriteWithInfoLog(
1104 TAG, SUBTAG, UID, NULL, DATA_LEN));
1105
1106 sleep(2);
1107
1108 int count = 0;
1109
1110 for (;;) {
1111 log_msg log_msg;
1112 if (android_logger_list_read(logger_list, &log_msg) <= 0) {
1113 break;
1114 }
1115
1116 char *eventData = log_msg.msg();
1117
1118 // Tag
1119 int tag = get4LE(eventData);
1120 eventData += 4;
1121
1122 if (tag == TAG) {
1123 // This tag should not have been written because the data was null
1124 count++;
1125 break;
1126 }
1127 }
1128
1129 EXPECT_EQ(0, count);
1130
1131 android_logger_list_close(logger_list);
1132}
1133
1134TEST(liblog, android_errorWriteWithInfoLog__android_logger_list_read__subtag_too_long) {
1135 const int TAG = 123456784;
1136 const char SUBTAG[] = "abcdefghijklmnopqrstuvwxyz now i know my abc";
1137 const int UID = -1;
1138 const int DATA_LEN = 200;
1139 struct logger_list *logger_list;
1140
1141 pid_t pid = getpid();
1142
1143 ASSERT_TRUE(NULL != (logger_list = android_logger_list_open(
1144 LOG_ID_EVENTS, ANDROID_LOG_RDONLY | ANDROID_LOG_NONBLOCK, 1000, pid)));
1145
1146 ASSERT_LT(0, android_errorWriteWithInfoLog(
1147 TAG, SUBTAG, UID, max_payload_buf, DATA_LEN));
1148
1149 sleep(2);
1150
1151 int count = 0;
1152
1153 for (;;) {
1154 log_msg log_msg;
1155 if (android_logger_list_read(logger_list, &log_msg) <= 0) {
1156 break;
1157 }
1158
1159 char *eventData = log_msg.msg();
1160
1161 // Tag
1162 int tag = get4LE(eventData);
1163 eventData += 4;
1164
1165 if (tag != TAG) {
1166 continue;
1167 }
1168
1169 // List type
1170 ASSERT_EQ(EVENT_TYPE_LIST, eventData[0]);
1171 eventData++;
1172
1173 // Number of elements in list
1174 ASSERT_EQ(3, eventData[0]);
1175 eventData++;
1176
1177 // Element #1: string type for subtag
1178 ASSERT_EQ(EVENT_TYPE_STRING, eventData[0]);
1179 eventData++;
1180
1181 // The subtag is longer than 32 and should be truncated to that.
1182 ASSERT_EQ(32, get4LE(eventData));
1183 eventData +=4;
1184
1185 if (memcmp(SUBTAG, eventData, 32)) {
1186 continue;
1187 }
1188 eventData += 32;
1189
1190 // Element #2: int type for uid
1191 ASSERT_EQ(EVENT_TYPE_INT, eventData[0]);
1192 eventData++;
1193
1194 ASSERT_EQ(UID, get4LE(eventData));
1195 eventData += 4;
1196
1197 // Element #3: string type for data
1198 ASSERT_EQ(EVENT_TYPE_STRING, eventData[0]);
1199 eventData++;
1200
1201 ASSERT_EQ(DATA_LEN, get4LE(eventData));
1202 eventData += 4;
1203
1204 if (memcmp(max_payload_buf, eventData, DATA_LEN)) {
1205 continue;
1206 }
1207
1208 ++count;
1209 }
1210
1211 EXPECT_EQ(1, count);
1212
1213 android_logger_list_close(logger_list);
1214}
1215
1216TEST(liblog, android_errorWriteLog__android_logger_list_read__success) {
1217 const int TAG = 123456785;
1218 const char SUBTAG[] = "test-subtag";
1219 struct logger_list *logger_list;
1220
1221 pid_t pid = getpid();
1222
1223 ASSERT_TRUE(NULL != (logger_list = android_logger_list_open(
1224 LOG_ID_EVENTS, ANDROID_LOG_RDONLY | ANDROID_LOG_NONBLOCK, 1000, pid)));
1225
1226 ASSERT_LT(0, android_errorWriteLog(TAG, SUBTAG));
1227
1228 sleep(2);
1229
1230 int count = 0;
1231
1232 for (;;) {
1233 log_msg log_msg;
1234 if (android_logger_list_read(logger_list, &log_msg) <= 0) {
1235 break;
1236 }
1237
1238 char *eventData = log_msg.msg();
1239
1240 // Tag
1241 int tag = get4LE(eventData);
1242 eventData += 4;
1243
1244 if (tag != TAG) {
1245 continue;
1246 }
1247
1248 // List type
1249 ASSERT_EQ(EVENT_TYPE_LIST, eventData[0]);
1250 eventData++;
1251
1252 // Number of elements in list
1253 ASSERT_EQ(3, eventData[0]);
1254 eventData++;
1255
1256 // Element #1: string type for subtag
1257 ASSERT_EQ(EVENT_TYPE_STRING, eventData[0]);
1258 eventData++;
1259
1260 ASSERT_EQ((int) strlen(SUBTAG), get4LE(eventData));
1261 eventData +=4;
1262
1263 if (memcmp(SUBTAG, eventData, strlen(SUBTAG))) {
1264 continue;
1265 }
1266 ++count;
1267 }
1268
1269 EXPECT_EQ(1, count);
1270
1271 android_logger_list_close(logger_list);
1272}
1273
1274TEST(liblog, android_errorWriteLog__android_logger_list_read__null_subtag) {
1275 const int TAG = 123456786;
1276 struct logger_list *logger_list;
1277
1278 pid_t pid = getpid();
1279
1280 ASSERT_TRUE(NULL != (logger_list = android_logger_list_open(
1281 LOG_ID_EVENTS, ANDROID_LOG_RDONLY | ANDROID_LOG_NONBLOCK, 1000, pid)));
1282
1283 ASSERT_GT(0, android_errorWriteLog(TAG, NULL));
1284
1285 sleep(2);
1286
1287 int count = 0;
1288
1289 for (;;) {
1290 log_msg log_msg;
1291 if (android_logger_list_read(logger_list, &log_msg) <= 0) {
1292 break;
1293 }
1294
1295 char *eventData = log_msg.msg();
1296
1297 // Tag
1298 int tag = get4LE(eventData);
1299 eventData += 4;
1300
1301 if (tag == TAG) {
1302 // This tag should not have been written because the data was null
1303 count++;
1304 break;
1305 }
1306 }
1307
1308 EXPECT_EQ(0, count);
1309
1310 android_logger_list_close(logger_list);
1311}