xref: /aosp_15_r20/system/logging/liblog/tests/liblog_test.cpp (revision 598139dc91b21518d67c408eaea2644226490971)
1*598139dcSAndroid Build Coastguard Worker /*
2*598139dcSAndroid Build Coastguard Worker  * Copyright (C) 2013-2016 The Android Open Source Project
3*598139dcSAndroid Build Coastguard Worker  *
4*598139dcSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*598139dcSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*598139dcSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*598139dcSAndroid Build Coastguard Worker  *
8*598139dcSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*598139dcSAndroid Build Coastguard Worker  *
10*598139dcSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*598139dcSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*598139dcSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*598139dcSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*598139dcSAndroid Build Coastguard Worker  * limitations under the License.
15*598139dcSAndroid Build Coastguard Worker  */
16*598139dcSAndroid Build Coastguard Worker 
17*598139dcSAndroid Build Coastguard Worker #include <ctype.h>
18*598139dcSAndroid Build Coastguard Worker #include <dirent.h>
19*598139dcSAndroid Build Coastguard Worker #include <errno.h>
20*598139dcSAndroid Build Coastguard Worker #include <fcntl.h>
21*598139dcSAndroid Build Coastguard Worker #include <inttypes.h>
22*598139dcSAndroid Build Coastguard Worker #include <pthread.h>
23*598139dcSAndroid Build Coastguard Worker #include <semaphore.h>
24*598139dcSAndroid Build Coastguard Worker #include <signal.h>
25*598139dcSAndroid Build Coastguard Worker #include <stdio.h>
26*598139dcSAndroid Build Coastguard Worker #include <string.h>
27*598139dcSAndroid Build Coastguard Worker #include <sys/types.h>
28*598139dcSAndroid Build Coastguard Worker #include <unistd.h>
29*598139dcSAndroid Build Coastguard Worker 
30*598139dcSAndroid Build Coastguard Worker #include <memory>
31*598139dcSAndroid Build Coastguard Worker #include <string>
32*598139dcSAndroid Build Coastguard Worker 
33*598139dcSAndroid Build Coastguard Worker #include <android-base/file.h>
34*598139dcSAndroid Build Coastguard Worker #include <android-base/macros.h>
35*598139dcSAndroid Build Coastguard Worker #include <android-base/properties.h>
36*598139dcSAndroid Build Coastguard Worker #include <android-base/scopeguard.h>
37*598139dcSAndroid Build Coastguard Worker #include <android-base/stringprintf.h>
38*598139dcSAndroid Build Coastguard Worker #ifdef __ANDROID__  // includes sys/properties.h which does not exist outside
39*598139dcSAndroid Build Coastguard Worker #include <cutils/properties.h>
40*598139dcSAndroid Build Coastguard Worker #endif
41*598139dcSAndroid Build Coastguard Worker #include <gtest/gtest.h>
42*598139dcSAndroid Build Coastguard Worker #include <log/log_event_list.h>
43*598139dcSAndroid Build Coastguard Worker #include <log/log_properties.h>
44*598139dcSAndroid Build Coastguard Worker #include <log/log_read.h>
45*598139dcSAndroid Build Coastguard Worker #include <log/logprint.h>
46*598139dcSAndroid Build Coastguard Worker #include <private/android_filesystem_config.h>
47*598139dcSAndroid Build Coastguard Worker #include <private/android_logger.h>
48*598139dcSAndroid Build Coastguard Worker 
49*598139dcSAndroid Build Coastguard Worker #include "test_utils.h"
50*598139dcSAndroid Build Coastguard Worker 
51*598139dcSAndroid Build Coastguard Worker using android::base::make_scope_guard;
52*598139dcSAndroid Build Coastguard Worker 
53*598139dcSAndroid Build Coastguard Worker // #define ENABLE_FLAKY_TESTS
54*598139dcSAndroid Build Coastguard Worker 
55*598139dcSAndroid Build Coastguard Worker // enhanced version of LOG_FAILURE_RETRY to add support for EAGAIN and
56*598139dcSAndroid Build Coastguard Worker // non-syscall libs. Since we are only using this in the emergency of
57*598139dcSAndroid Build Coastguard Worker // a signal to stuff a terminating code into the logs, we will spin rather
58*598139dcSAndroid Build Coastguard Worker // than try a usleep.
59*598139dcSAndroid Build Coastguard Worker #define LOG_FAILURE_RETRY(exp)                                           \
60*598139dcSAndroid Build Coastguard Worker   ({                                                                     \
61*598139dcSAndroid Build Coastguard Worker     typeof(exp) _rc;                                                     \
62*598139dcSAndroid Build Coastguard Worker     do {                                                                 \
63*598139dcSAndroid Build Coastguard Worker       _rc = (exp);                                                       \
64*598139dcSAndroid Build Coastguard Worker     } while (((_rc == -1) && ((errno == EINTR) || (errno == EAGAIN))) || \
65*598139dcSAndroid Build Coastguard Worker              (_rc == -EINTR) || (_rc == -EAGAIN));                       \
66*598139dcSAndroid Build Coastguard Worker     _rc;                                                                 \
67*598139dcSAndroid Build Coastguard Worker   })
68*598139dcSAndroid Build Coastguard Worker 
69*598139dcSAndroid Build Coastguard Worker // std::unique_ptr doesn't let you provide a pointer to a deleter (android_logger_list_close()) if
70*598139dcSAndroid Build Coastguard Worker // the type (struct logger_list) is an incomplete type, so we create ListCloser instead.
71*598139dcSAndroid Build Coastguard Worker struct ListCloser {
operator ()ListCloser72*598139dcSAndroid Build Coastguard Worker   void operator()(struct logger_list* list) { android_logger_list_close(list); }
73*598139dcSAndroid Build Coastguard Worker };
74*598139dcSAndroid Build Coastguard Worker 
75*598139dcSAndroid Build Coastguard Worker // This function is meant to be used for most log tests, it does the following:
76*598139dcSAndroid Build Coastguard Worker // 1) Open the log_buffer with a blocking reader
77*598139dcSAndroid Build Coastguard Worker // 2) Write the messages via write_messages
78*598139dcSAndroid Build Coastguard Worker // 3) Set an alarm for 2 seconds as a timeout
79*598139dcSAndroid Build Coastguard Worker // 4) Read until check_message returns true, which should be used to indicate the target message
80*598139dcSAndroid Build Coastguard Worker //    is found
81*598139dcSAndroid Build Coastguard Worker // 5) Open log_buffer with a non_blocking reader and dump all messages
82*598139dcSAndroid Build Coastguard Worker // 6) Count the number of times check_messages returns true for these messages and assert it's
83*598139dcSAndroid Build Coastguard Worker //    only 1.
84*598139dcSAndroid Build Coastguard Worker template <typename FWrite, typename FCheck>
RunLogTests(log_id_t log_buffer,FWrite write_messages,FCheck check_message)85*598139dcSAndroid Build Coastguard Worker static void RunLogTests(log_id_t log_buffer, FWrite write_messages, FCheck check_message) {
86*598139dcSAndroid Build Coastguard Worker   pid_t pid = getpid();
87*598139dcSAndroid Build Coastguard Worker 
88*598139dcSAndroid Build Coastguard Worker   auto logger_list = std::unique_ptr<struct logger_list, ListCloser>{
89*598139dcSAndroid Build Coastguard Worker       android_logger_list_open(log_buffer, 0, INT_MAX, pid)};
90*598139dcSAndroid Build Coastguard Worker   ASSERT_TRUE(logger_list);
91*598139dcSAndroid Build Coastguard Worker 
92*598139dcSAndroid Build Coastguard Worker   write_messages();
93*598139dcSAndroid Build Coastguard Worker 
94*598139dcSAndroid Build Coastguard Worker   alarm(getAlarmSeconds(2));
95*598139dcSAndroid Build Coastguard Worker   auto alarm_guard = android::base::make_scope_guard([] { alarm(0); });
96*598139dcSAndroid Build Coastguard Worker   bool found = false;
97*598139dcSAndroid Build Coastguard Worker   while (!found) {
98*598139dcSAndroid Build Coastguard Worker     log_msg log_msg;
99*598139dcSAndroid Build Coastguard Worker     ASSERT_GT(android_logger_list_read(logger_list.get(), &log_msg), 0);
100*598139dcSAndroid Build Coastguard Worker 
101*598139dcSAndroid Build Coastguard Worker     ASSERT_EQ(log_buffer, log_msg.id());
102*598139dcSAndroid Build Coastguard Worker     ASSERT_EQ(pid, log_msg.entry.pid);
103*598139dcSAndroid Build Coastguard Worker 
104*598139dcSAndroid Build Coastguard Worker     ASSERT_NE(nullptr, log_msg.msg());
105*598139dcSAndroid Build Coastguard Worker 
106*598139dcSAndroid Build Coastguard Worker     check_message(log_msg, &found);
107*598139dcSAndroid Build Coastguard Worker   }
108*598139dcSAndroid Build Coastguard Worker 
109*598139dcSAndroid Build Coastguard Worker   auto logger_list_non_block = std::unique_ptr<struct logger_list, ListCloser>{
110*598139dcSAndroid Build Coastguard Worker       android_logger_list_open(log_buffer, ANDROID_LOG_NONBLOCK, INT_MAX, pid)};
111*598139dcSAndroid Build Coastguard Worker   ASSERT_TRUE(logger_list_non_block);
112*598139dcSAndroid Build Coastguard Worker 
113*598139dcSAndroid Build Coastguard Worker   size_t count = 0;
114*598139dcSAndroid Build Coastguard Worker   while (true) {
115*598139dcSAndroid Build Coastguard Worker     log_msg log_msg;
116*598139dcSAndroid Build Coastguard Worker     auto ret = android_logger_list_read(logger_list_non_block.get(), &log_msg);
117*598139dcSAndroid Build Coastguard Worker     if (ret == -EAGAIN) {
118*598139dcSAndroid Build Coastguard Worker       break;
119*598139dcSAndroid Build Coastguard Worker     }
120*598139dcSAndroid Build Coastguard Worker     ASSERT_GT(ret, 0);
121*598139dcSAndroid Build Coastguard Worker 
122*598139dcSAndroid Build Coastguard Worker     ASSERT_EQ(log_buffer, log_msg.id());
123*598139dcSAndroid Build Coastguard Worker     ASSERT_EQ(pid, log_msg.entry.pid);
124*598139dcSAndroid Build Coastguard Worker 
125*598139dcSAndroid Build Coastguard Worker     ASSERT_NE(nullptr, log_msg.msg());
126*598139dcSAndroid Build Coastguard Worker 
127*598139dcSAndroid Build Coastguard Worker     found = false;
128*598139dcSAndroid Build Coastguard Worker     check_message(log_msg, &found);
129*598139dcSAndroid Build Coastguard Worker     if (found) {
130*598139dcSAndroid Build Coastguard Worker       ++count;
131*598139dcSAndroid Build Coastguard Worker     }
132*598139dcSAndroid Build Coastguard Worker   }
133*598139dcSAndroid Build Coastguard Worker 
134*598139dcSAndroid Build Coastguard Worker   EXPECT_EQ(1U, count);
135*598139dcSAndroid Build Coastguard Worker }
136*598139dcSAndroid Build Coastguard Worker 
TEST(liblog,__android_log_btwrite)137*598139dcSAndroid Build Coastguard Worker TEST(liblog, __android_log_btwrite) {
138*598139dcSAndroid Build Coastguard Worker   int intBuf = 0xDEADBEEF;
139*598139dcSAndroid Build Coastguard Worker   EXPECT_LT(0,
140*598139dcSAndroid Build Coastguard Worker             __android_log_btwrite(0, EVENT_TYPE_INT, &intBuf, sizeof(intBuf)));
141*598139dcSAndroid Build Coastguard Worker   long long longBuf = 0xDEADBEEFA55A5AA5;
142*598139dcSAndroid Build Coastguard Worker   EXPECT_LT(
143*598139dcSAndroid Build Coastguard Worker       0, __android_log_btwrite(0, EVENT_TYPE_LONG, &longBuf, sizeof(longBuf)));
144*598139dcSAndroid Build Coastguard Worker   char Buf[] = "\20\0\0\0DeAdBeEfA55a5aA5";
145*598139dcSAndroid Build Coastguard Worker   EXPECT_LT(0,
146*598139dcSAndroid Build Coastguard Worker             __android_log_btwrite(0, EVENT_TYPE_STRING, Buf, sizeof(Buf) - 1));
147*598139dcSAndroid Build Coastguard Worker }
148*598139dcSAndroid Build Coastguard Worker 
149*598139dcSAndroid Build Coastguard Worker #if defined(__ANDROID__)
popenToString(const std::string & command)150*598139dcSAndroid Build Coastguard Worker static std::string popenToString(const std::string& command) {
151*598139dcSAndroid Build Coastguard Worker   std::string ret;
152*598139dcSAndroid Build Coastguard Worker 
153*598139dcSAndroid Build Coastguard Worker   FILE* fp = popen(command.c_str(), "re");
154*598139dcSAndroid Build Coastguard Worker   if (fp) {
155*598139dcSAndroid Build Coastguard Worker     if (!android::base::ReadFdToString(fileno(fp), &ret)) ret = "";
156*598139dcSAndroid Build Coastguard Worker     pclose(fp);
157*598139dcSAndroid Build Coastguard Worker   }
158*598139dcSAndroid Build Coastguard Worker   return ret;
159*598139dcSAndroid Build Coastguard Worker }
160*598139dcSAndroid Build Coastguard Worker 
isPmsgActive()161*598139dcSAndroid Build Coastguard Worker static bool isPmsgActive() {
162*598139dcSAndroid Build Coastguard Worker   pid_t pid = getpid();
163*598139dcSAndroid Build Coastguard Worker 
164*598139dcSAndroid Build Coastguard Worker   std::string myPidFds =
165*598139dcSAndroid Build Coastguard Worker       popenToString(android::base::StringPrintf("ls -l /proc/%d/fd", pid));
166*598139dcSAndroid Build Coastguard Worker   if (myPidFds.length() == 0) return true;  // guess it is?
167*598139dcSAndroid Build Coastguard Worker 
168*598139dcSAndroid Build Coastguard Worker   return std::string::npos != myPidFds.find(" -> /dev/pmsg0");
169*598139dcSAndroid Build Coastguard Worker }
170*598139dcSAndroid Build Coastguard Worker 
isLogdwActive()171*598139dcSAndroid Build Coastguard Worker static bool isLogdwActive() {
172*598139dcSAndroid Build Coastguard Worker   std::string logdwSignature =
173*598139dcSAndroid Build Coastguard Worker       popenToString("grep -a /dev/socket/logdw /proc/net/unix");
174*598139dcSAndroid Build Coastguard Worker   size_t beginning = logdwSignature.find(' ');
175*598139dcSAndroid Build Coastguard Worker   if (beginning == std::string::npos) return true;
176*598139dcSAndroid Build Coastguard Worker   beginning = logdwSignature.find(' ', beginning + 1);
177*598139dcSAndroid Build Coastguard Worker   if (beginning == std::string::npos) return true;
178*598139dcSAndroid Build Coastguard Worker   size_t end = logdwSignature.find(' ', beginning + 1);
179*598139dcSAndroid Build Coastguard Worker   if (end == std::string::npos) return true;
180*598139dcSAndroid Build Coastguard Worker   end = logdwSignature.find(' ', end + 1);
181*598139dcSAndroid Build Coastguard Worker   if (end == std::string::npos) return true;
182*598139dcSAndroid Build Coastguard Worker   end = logdwSignature.find(' ', end + 1);
183*598139dcSAndroid Build Coastguard Worker   if (end == std::string::npos) return true;
184*598139dcSAndroid Build Coastguard Worker   end = logdwSignature.find(' ', end + 1);
185*598139dcSAndroid Build Coastguard Worker   if (end == std::string::npos) return true;
186*598139dcSAndroid Build Coastguard Worker   std::string allLogdwEndpoints = popenToString(
187*598139dcSAndroid Build Coastguard Worker       "grep -a ' 00000002" + logdwSignature.substr(beginning, end - beginning) +
188*598139dcSAndroid Build Coastguard Worker       " ' /proc/net/unix | " +
189*598139dcSAndroid Build Coastguard Worker       "sed -n 's/.* \\([0-9][0-9]*\\)$/ -> socket:[\\1]/p'");
190*598139dcSAndroid Build Coastguard Worker   if (allLogdwEndpoints.length() == 0) return true;
191*598139dcSAndroid Build Coastguard Worker 
192*598139dcSAndroid Build Coastguard Worker   // NB: allLogdwEndpoints has some false positives in it, but those
193*598139dcSAndroid Build Coastguard Worker   // strangers do not overlap with the simplistic activities inside this
194*598139dcSAndroid Build Coastguard Worker   // test suite.
195*598139dcSAndroid Build Coastguard Worker 
196*598139dcSAndroid Build Coastguard Worker   pid_t pid = getpid();
197*598139dcSAndroid Build Coastguard Worker 
198*598139dcSAndroid Build Coastguard Worker   std::string myPidFds =
199*598139dcSAndroid Build Coastguard Worker       popenToString(android::base::StringPrintf("ls -l /proc/%d/fd", pid));
200*598139dcSAndroid Build Coastguard Worker   if (myPidFds.length() == 0) return true;
201*598139dcSAndroid Build Coastguard Worker 
202*598139dcSAndroid Build Coastguard Worker   // NB: fgrep with multiple strings is broken in Android
203*598139dcSAndroid Build Coastguard Worker   for (beginning = 0;
204*598139dcSAndroid Build Coastguard Worker        (end = allLogdwEndpoints.find('\n', beginning)) != std::string::npos;
205*598139dcSAndroid Build Coastguard Worker        beginning = end + 1) {
206*598139dcSAndroid Build Coastguard Worker     if (myPidFds.find(allLogdwEndpoints.substr(beginning, end - beginning)) !=
207*598139dcSAndroid Build Coastguard Worker         std::string::npos)
208*598139dcSAndroid Build Coastguard Worker       return true;
209*598139dcSAndroid Build Coastguard Worker   }
210*598139dcSAndroid Build Coastguard Worker   return false;
211*598139dcSAndroid Build Coastguard Worker }
212*598139dcSAndroid Build Coastguard Worker 
213*598139dcSAndroid Build Coastguard Worker static bool tested__android_log_close;
214*598139dcSAndroid Build Coastguard Worker #endif
215*598139dcSAndroid Build Coastguard Worker 
TEST(liblog,__android_log_btwrite__android_logger_list_read)216*598139dcSAndroid Build Coastguard Worker TEST(liblog, __android_log_btwrite__android_logger_list_read) {
217*598139dcSAndroid Build Coastguard Worker #ifdef __ANDROID__
218*598139dcSAndroid Build Coastguard Worker   log_time ts(CLOCK_MONOTONIC);
219*598139dcSAndroid Build Coastguard Worker   log_time ts1(ts);
220*598139dcSAndroid Build Coastguard Worker 
221*598139dcSAndroid Build Coastguard Worker   bool has_pstore = access("/dev/pmsg0", W_OK) == 0;
222*598139dcSAndroid Build Coastguard Worker 
223*598139dcSAndroid Build Coastguard Worker   auto write_function = [&] {
224*598139dcSAndroid Build Coastguard Worker     EXPECT_LT(0, __android_log_btwrite(0, EVENT_TYPE_LONG, &ts, sizeof(ts)));
225*598139dcSAndroid Build Coastguard Worker     // Check that we can close and reopen the logger
226*598139dcSAndroid Build Coastguard Worker     bool logdwActiveAfter__android_log_btwrite;
227*598139dcSAndroid Build Coastguard Worker     if (getuid() == AID_ROOT) {
228*598139dcSAndroid Build Coastguard Worker       tested__android_log_close = true;
229*598139dcSAndroid Build Coastguard Worker       if (has_pstore) {
230*598139dcSAndroid Build Coastguard Worker         bool pmsgActiveAfter__android_log_btwrite = isPmsgActive();
231*598139dcSAndroid Build Coastguard Worker         EXPECT_TRUE(pmsgActiveAfter__android_log_btwrite);
232*598139dcSAndroid Build Coastguard Worker       }
233*598139dcSAndroid Build Coastguard Worker       logdwActiveAfter__android_log_btwrite = isLogdwActive();
234*598139dcSAndroid Build Coastguard Worker       EXPECT_TRUE(logdwActiveAfter__android_log_btwrite);
235*598139dcSAndroid Build Coastguard Worker     } else if (!tested__android_log_close) {
236*598139dcSAndroid Build Coastguard Worker       fprintf(stderr, "WARNING: can not test __android_log_close()\n");
237*598139dcSAndroid Build Coastguard Worker     }
238*598139dcSAndroid Build Coastguard Worker     __android_log_close();
239*598139dcSAndroid Build Coastguard Worker     if (getuid() == AID_ROOT) {
240*598139dcSAndroid Build Coastguard Worker       if (has_pstore) {
241*598139dcSAndroid Build Coastguard Worker         bool pmsgActiveAfter__android_log_close = isPmsgActive();
242*598139dcSAndroid Build Coastguard Worker         EXPECT_FALSE(pmsgActiveAfter__android_log_close);
243*598139dcSAndroid Build Coastguard Worker       }
244*598139dcSAndroid Build Coastguard Worker       bool logdwActiveAfter__android_log_close = isLogdwActive();
245*598139dcSAndroid Build Coastguard Worker       EXPECT_FALSE(logdwActiveAfter__android_log_close);
246*598139dcSAndroid Build Coastguard Worker     }
247*598139dcSAndroid Build Coastguard Worker 
248*598139dcSAndroid Build Coastguard Worker     ts1 = log_time(CLOCK_MONOTONIC);
249*598139dcSAndroid Build Coastguard Worker     EXPECT_LT(0, __android_log_btwrite(0, EVENT_TYPE_LONG, &ts1, sizeof(ts1)));
250*598139dcSAndroid Build Coastguard Worker     if (getuid() == AID_ROOT) {
251*598139dcSAndroid Build Coastguard Worker       if (has_pstore) {
252*598139dcSAndroid Build Coastguard Worker         bool pmsgActiveAfter__android_log_btwrite = isPmsgActive();
253*598139dcSAndroid Build Coastguard Worker         EXPECT_TRUE(pmsgActiveAfter__android_log_btwrite);
254*598139dcSAndroid Build Coastguard Worker       }
255*598139dcSAndroid Build Coastguard Worker       logdwActiveAfter__android_log_btwrite = isLogdwActive();
256*598139dcSAndroid Build Coastguard Worker       EXPECT_TRUE(logdwActiveAfter__android_log_btwrite);
257*598139dcSAndroid Build Coastguard Worker     }
258*598139dcSAndroid Build Coastguard Worker   };
259*598139dcSAndroid Build Coastguard Worker 
260*598139dcSAndroid Build Coastguard Worker   int count = 0;
261*598139dcSAndroid Build Coastguard Worker   int second_count = 0;
262*598139dcSAndroid Build Coastguard Worker 
263*598139dcSAndroid Build Coastguard Worker   auto check_function = [&](log_msg log_msg, bool* found) {
264*598139dcSAndroid Build Coastguard Worker     if ((log_msg.entry.len != sizeof(android_log_event_long_t)) ||
265*598139dcSAndroid Build Coastguard Worker         (log_msg.id() != LOG_ID_EVENTS)) {
266*598139dcSAndroid Build Coastguard Worker       return;
267*598139dcSAndroid Build Coastguard Worker     }
268*598139dcSAndroid Build Coastguard Worker 
269*598139dcSAndroid Build Coastguard Worker     android_log_event_long_t* eventData;
270*598139dcSAndroid Build Coastguard Worker     eventData = reinterpret_cast<android_log_event_long_t*>(log_msg.msg());
271*598139dcSAndroid Build Coastguard Worker 
272*598139dcSAndroid Build Coastguard Worker     if (!eventData || (eventData->payload.type != EVENT_TYPE_LONG)) {
273*598139dcSAndroid Build Coastguard Worker       return;
274*598139dcSAndroid Build Coastguard Worker     }
275*598139dcSAndroid Build Coastguard Worker 
276*598139dcSAndroid Build Coastguard Worker     log_time* tx = reinterpret_cast<log_time*>(&eventData->payload.data);
277*598139dcSAndroid Build Coastguard Worker     if (ts == *tx) {
278*598139dcSAndroid Build Coastguard Worker       ++count;
279*598139dcSAndroid Build Coastguard Worker     } else if (ts1 == *tx) {
280*598139dcSAndroid Build Coastguard Worker       ++second_count;
281*598139dcSAndroid Build Coastguard Worker     }
282*598139dcSAndroid Build Coastguard Worker 
283*598139dcSAndroid Build Coastguard Worker     if (count == 1 && second_count == 1) {
284*598139dcSAndroid Build Coastguard Worker       count = 0;
285*598139dcSAndroid Build Coastguard Worker       second_count = 0;
286*598139dcSAndroid Build Coastguard Worker       *found = true;
287*598139dcSAndroid Build Coastguard Worker     }
288*598139dcSAndroid Build Coastguard Worker   };
289*598139dcSAndroid Build Coastguard Worker 
290*598139dcSAndroid Build Coastguard Worker   RunLogTests(LOG_ID_EVENTS, write_function, check_function);
291*598139dcSAndroid Build Coastguard Worker 
292*598139dcSAndroid Build Coastguard Worker #else
293*598139dcSAndroid Build Coastguard Worker   GTEST_LOG_(INFO) << "This test does nothing.\n";
294*598139dcSAndroid Build Coastguard Worker #endif
295*598139dcSAndroid Build Coastguard Worker }
296*598139dcSAndroid Build Coastguard Worker 
TEST(liblog,__android_log_write__android_logger_list_read)297*598139dcSAndroid Build Coastguard Worker TEST(liblog, __android_log_write__android_logger_list_read) {
298*598139dcSAndroid Build Coastguard Worker #ifdef __ANDROID__
299*598139dcSAndroid Build Coastguard Worker   pid_t pid = getpid();
300*598139dcSAndroid Build Coastguard Worker 
301*598139dcSAndroid Build Coastguard Worker   struct timespec ts;
302*598139dcSAndroid Build Coastguard Worker   clock_gettime(CLOCK_MONOTONIC, &ts);
303*598139dcSAndroid Build Coastguard Worker   std::string buf = android::base::StringPrintf("pid=%u ts=%ld.%09ld", pid, ts.tv_sec, ts.tv_nsec);
304*598139dcSAndroid Build Coastguard Worker   static const char tag[] = "liblog.__android_log_write__android_logger_list_read";
305*598139dcSAndroid Build Coastguard Worker   static const char prio = ANDROID_LOG_DEBUG;
306*598139dcSAndroid Build Coastguard Worker 
307*598139dcSAndroid Build Coastguard Worker   std::string expected_message =
308*598139dcSAndroid Build Coastguard Worker       std::string(&prio, sizeof(prio)) + tag + std::string("", 1) + buf + std::string("", 1);
309*598139dcSAndroid Build Coastguard Worker 
310*598139dcSAndroid Build Coastguard Worker   auto write_function = [&] { ASSERT_LT(0, __android_log_write(prio, tag, buf.c_str())); };
311*598139dcSAndroid Build Coastguard Worker 
312*598139dcSAndroid Build Coastguard Worker   auto check_function = [&](log_msg log_msg, bool* found) {
313*598139dcSAndroid Build Coastguard Worker     if (log_msg.entry.len != expected_message.length()) {
314*598139dcSAndroid Build Coastguard Worker       return;
315*598139dcSAndroid Build Coastguard Worker     }
316*598139dcSAndroid Build Coastguard Worker 
317*598139dcSAndroid Build Coastguard Worker     if (expected_message != std::string(log_msg.msg(), log_msg.entry.len)) {
318*598139dcSAndroid Build Coastguard Worker       return;
319*598139dcSAndroid Build Coastguard Worker     }
320*598139dcSAndroid Build Coastguard Worker 
321*598139dcSAndroid Build Coastguard Worker     *found = true;
322*598139dcSAndroid Build Coastguard Worker   };
323*598139dcSAndroid Build Coastguard Worker 
324*598139dcSAndroid Build Coastguard Worker   RunLogTests(LOG_ID_MAIN, write_function, check_function);
325*598139dcSAndroid Build Coastguard Worker 
326*598139dcSAndroid Build Coastguard Worker #else
327*598139dcSAndroid Build Coastguard Worker   GTEST_LOG_(INFO) << "This test does nothing.\n";
328*598139dcSAndroid Build Coastguard Worker #endif
329*598139dcSAndroid Build Coastguard Worker }
330*598139dcSAndroid Build Coastguard Worker 
bswrite_test(const char * message)331*598139dcSAndroid Build Coastguard Worker static void bswrite_test(const char* message) {
332*598139dcSAndroid Build Coastguard Worker #ifdef __ANDROID__
333*598139dcSAndroid Build Coastguard Worker   pid_t pid = getpid();
334*598139dcSAndroid Build Coastguard Worker 
335*598139dcSAndroid Build Coastguard Worker   size_t num_lines = 1, size = 0, length = 0, total = 0;
336*598139dcSAndroid Build Coastguard Worker   const char* cp = message;
337*598139dcSAndroid Build Coastguard Worker   while (*cp) {
338*598139dcSAndroid Build Coastguard Worker     if (*cp == '\n') {
339*598139dcSAndroid Build Coastguard Worker       if (cp[1]) {
340*598139dcSAndroid Build Coastguard Worker         ++num_lines;
341*598139dcSAndroid Build Coastguard Worker       }
342*598139dcSAndroid Build Coastguard Worker     } else {
343*598139dcSAndroid Build Coastguard Worker       ++size;
344*598139dcSAndroid Build Coastguard Worker     }
345*598139dcSAndroid Build Coastguard Worker     ++cp;
346*598139dcSAndroid Build Coastguard Worker     ++total;
347*598139dcSAndroid Build Coastguard Worker     ++length;
348*598139dcSAndroid Build Coastguard Worker     if ((LOGGER_ENTRY_MAX_PAYLOAD - 4 - 1 - 4) <= length) {
349*598139dcSAndroid Build Coastguard Worker       break;
350*598139dcSAndroid Build Coastguard Worker     }
351*598139dcSAndroid Build Coastguard Worker   }
352*598139dcSAndroid Build Coastguard Worker   while (*cp) {
353*598139dcSAndroid Build Coastguard Worker     ++cp;
354*598139dcSAndroid Build Coastguard Worker     ++total;
355*598139dcSAndroid Build Coastguard Worker   }
356*598139dcSAndroid Build Coastguard Worker 
357*598139dcSAndroid Build Coastguard Worker   auto write_function = [&] { EXPECT_LT(0, __android_log_bswrite(0, message)); };
358*598139dcSAndroid Build Coastguard Worker 
359*598139dcSAndroid Build Coastguard Worker   auto check_function = [&](log_msg log_msg, bool* found) {
360*598139dcSAndroid Build Coastguard Worker     if ((size_t)log_msg.entry.len != (sizeof(android_log_event_string_t) + length) ||
361*598139dcSAndroid Build Coastguard Worker         log_msg.id() != LOG_ID_EVENTS) {
362*598139dcSAndroid Build Coastguard Worker       return;
363*598139dcSAndroid Build Coastguard Worker     }
364*598139dcSAndroid Build Coastguard Worker 
365*598139dcSAndroid Build Coastguard Worker     android_log_event_string_t* eventData;
366*598139dcSAndroid Build Coastguard Worker     eventData = reinterpret_cast<android_log_event_string_t*>(log_msg.msg());
367*598139dcSAndroid Build Coastguard Worker 
368*598139dcSAndroid Build Coastguard Worker     if (!eventData || (eventData->type != EVENT_TYPE_STRING)) {
369*598139dcSAndroid Build Coastguard Worker       return;
370*598139dcSAndroid Build Coastguard Worker     }
371*598139dcSAndroid Build Coastguard Worker 
372*598139dcSAndroid Build Coastguard Worker     size_t len = eventData->length;
373*598139dcSAndroid Build Coastguard Worker     if (len == total) {
374*598139dcSAndroid Build Coastguard Worker       *found = true;
375*598139dcSAndroid Build Coastguard Worker 
376*598139dcSAndroid Build Coastguard Worker       AndroidLogFormat* logformat = android_log_format_new();
377*598139dcSAndroid Build Coastguard Worker       EXPECT_TRUE(NULL != logformat);
378*598139dcSAndroid Build Coastguard Worker       AndroidLogEntry entry;
379*598139dcSAndroid Build Coastguard Worker       char msgBuf[1024];
380*598139dcSAndroid Build Coastguard Worker       if (length != total) {
381*598139dcSAndroid Build Coastguard Worker         fprintf(stderr, "Expect \"Binary log entry conversion failed\"\n");
382*598139dcSAndroid Build Coastguard Worker       }
383*598139dcSAndroid Build Coastguard Worker       int processBinaryLogBuffer = android_log_processBinaryLogBuffer(
384*598139dcSAndroid Build Coastguard Worker           &log_msg.entry, &entry, nullptr, msgBuf, sizeof(msgBuf));
385*598139dcSAndroid Build Coastguard Worker       EXPECT_EQ((length == total) ? 0 : -1, processBinaryLogBuffer);
386*598139dcSAndroid Build Coastguard Worker       if ((processBinaryLogBuffer == 0) || entry.message) {
387*598139dcSAndroid Build Coastguard Worker         size_t line_overhead = 20;
388*598139dcSAndroid Build Coastguard Worker         if (pid > 99999) ++line_overhead;
389*598139dcSAndroid Build Coastguard Worker         if (pid > 999999) ++line_overhead;
390*598139dcSAndroid Build Coastguard Worker         fflush(stderr);
391*598139dcSAndroid Build Coastguard Worker         if (processBinaryLogBuffer) {
392*598139dcSAndroid Build Coastguard Worker           EXPECT_GT((line_overhead * num_lines) + size,
393*598139dcSAndroid Build Coastguard Worker                     android_log_printLogLine(logformat, stderr, &entry));
394*598139dcSAndroid Build Coastguard Worker         } else {
395*598139dcSAndroid Build Coastguard Worker           EXPECT_EQ((line_overhead * num_lines) + size,
396*598139dcSAndroid Build Coastguard Worker                     android_log_printLogLine(logformat, stderr, &entry));
397*598139dcSAndroid Build Coastguard Worker         }
398*598139dcSAndroid Build Coastguard Worker       }
399*598139dcSAndroid Build Coastguard Worker       android_log_format_free(logformat);
400*598139dcSAndroid Build Coastguard Worker     }
401*598139dcSAndroid Build Coastguard Worker   };
402*598139dcSAndroid Build Coastguard Worker 
403*598139dcSAndroid Build Coastguard Worker   RunLogTests(LOG_ID_EVENTS, write_function, check_function);
404*598139dcSAndroid Build Coastguard Worker 
405*598139dcSAndroid Build Coastguard Worker #else
406*598139dcSAndroid Build Coastguard Worker   message = NULL;
407*598139dcSAndroid Build Coastguard Worker   GTEST_LOG_(INFO) << "This test does nothing.\n";
408*598139dcSAndroid Build Coastguard Worker #endif
409*598139dcSAndroid Build Coastguard Worker }
410*598139dcSAndroid Build Coastguard Worker 
TEST(liblog,__android_log_bswrite_and_print)411*598139dcSAndroid Build Coastguard Worker TEST(liblog, __android_log_bswrite_and_print) {
412*598139dcSAndroid Build Coastguard Worker   bswrite_test("Hello World");
413*598139dcSAndroid Build Coastguard Worker }
414*598139dcSAndroid Build Coastguard Worker 
TEST(liblog,__android_log_bswrite_and_print__empty_string)415*598139dcSAndroid Build Coastguard Worker TEST(liblog, __android_log_bswrite_and_print__empty_string) {
416*598139dcSAndroid Build Coastguard Worker   bswrite_test("");
417*598139dcSAndroid Build Coastguard Worker }
418*598139dcSAndroid Build Coastguard Worker 
TEST(liblog,__android_log_bswrite_and_print__newline_prefix)419*598139dcSAndroid Build Coastguard Worker TEST(liblog, __android_log_bswrite_and_print__newline_prefix) {
420*598139dcSAndroid Build Coastguard Worker   bswrite_test("\nHello World\n");
421*598139dcSAndroid Build Coastguard Worker }
422*598139dcSAndroid Build Coastguard Worker 
TEST(liblog,__android_log_bswrite_and_print__newline_space_prefix)423*598139dcSAndroid Build Coastguard Worker TEST(liblog, __android_log_bswrite_and_print__newline_space_prefix) {
424*598139dcSAndroid Build Coastguard Worker   bswrite_test("\n Hello World \n");
425*598139dcSAndroid Build Coastguard Worker }
426*598139dcSAndroid Build Coastguard Worker 
TEST(liblog,__android_log_bswrite_and_print__multiple_newline)427*598139dcSAndroid Build Coastguard Worker TEST(liblog, __android_log_bswrite_and_print__multiple_newline) {
428*598139dcSAndroid Build Coastguard Worker   bswrite_test("one\ntwo\nthree\nfour\nfive\nsix\nseven\neight\nnine\nten");
429*598139dcSAndroid Build Coastguard Worker }
430*598139dcSAndroid Build Coastguard Worker 
buf_write_test(const char * message)431*598139dcSAndroid Build Coastguard Worker static void buf_write_test(const char* message) {
432*598139dcSAndroid Build Coastguard Worker #ifdef __ANDROID__
433*598139dcSAndroid Build Coastguard Worker   pid_t pid = getpid();
434*598139dcSAndroid Build Coastguard Worker 
435*598139dcSAndroid Build Coastguard Worker   static const char tag[] = "TEST__android_log_buf_write";
436*598139dcSAndroid Build Coastguard Worker 
437*598139dcSAndroid Build Coastguard Worker   auto write_function = [&] {
438*598139dcSAndroid Build Coastguard Worker     EXPECT_LT(0, __android_log_buf_write(LOG_ID_MAIN, ANDROID_LOG_INFO, tag, message));
439*598139dcSAndroid Build Coastguard Worker   };
440*598139dcSAndroid Build Coastguard Worker   size_t num_lines = 1, size = 0, length = 0;
441*598139dcSAndroid Build Coastguard Worker   const char* cp = message;
442*598139dcSAndroid Build Coastguard Worker   while (*cp) {
443*598139dcSAndroid Build Coastguard Worker     if (*cp == '\n') {
444*598139dcSAndroid Build Coastguard Worker       if (cp[1]) {
445*598139dcSAndroid Build Coastguard Worker         ++num_lines;
446*598139dcSAndroid Build Coastguard Worker       }
447*598139dcSAndroid Build Coastguard Worker     } else {
448*598139dcSAndroid Build Coastguard Worker       ++size;
449*598139dcSAndroid Build Coastguard Worker     }
450*598139dcSAndroid Build Coastguard Worker     ++length;
451*598139dcSAndroid Build Coastguard Worker     if ((LOGGER_ENTRY_MAX_PAYLOAD - 2 - sizeof(tag)) <= length) {
452*598139dcSAndroid Build Coastguard Worker       break;
453*598139dcSAndroid Build Coastguard Worker     }
454*598139dcSAndroid Build Coastguard Worker     ++cp;
455*598139dcSAndroid Build Coastguard Worker   }
456*598139dcSAndroid Build Coastguard Worker 
457*598139dcSAndroid Build Coastguard Worker   auto check_function = [&](log_msg log_msg, bool* found) {
458*598139dcSAndroid Build Coastguard Worker     if ((size_t)log_msg.entry.len != (sizeof(tag) + length + 2) || log_msg.id() != LOG_ID_MAIN) {
459*598139dcSAndroid Build Coastguard Worker       return;
460*598139dcSAndroid Build Coastguard Worker     }
461*598139dcSAndroid Build Coastguard Worker 
462*598139dcSAndroid Build Coastguard Worker     *found = true;
463*598139dcSAndroid Build Coastguard Worker 
464*598139dcSAndroid Build Coastguard Worker     AndroidLogFormat* logformat = android_log_format_new();
465*598139dcSAndroid Build Coastguard Worker     EXPECT_TRUE(NULL != logformat);
466*598139dcSAndroid Build Coastguard Worker     AndroidLogEntry entry;
467*598139dcSAndroid Build Coastguard Worker     int processLogBuffer = android_log_processLogBuffer(&log_msg.entry, &entry);
468*598139dcSAndroid Build Coastguard Worker     EXPECT_EQ(0, processLogBuffer);
469*598139dcSAndroid Build Coastguard Worker     if (processLogBuffer == 0) {
470*598139dcSAndroid Build Coastguard Worker       size_t line_overhead = 11;
471*598139dcSAndroid Build Coastguard Worker       if (pid > 99999) ++line_overhead;
472*598139dcSAndroid Build Coastguard Worker       if (pid > 999999) ++line_overhead;
473*598139dcSAndroid Build Coastguard Worker       fflush(stderr);
474*598139dcSAndroid Build Coastguard Worker       EXPECT_EQ(((line_overhead + sizeof(tag)) * num_lines) + size,
475*598139dcSAndroid Build Coastguard Worker                 android_log_printLogLine(logformat, stderr, &entry));
476*598139dcSAndroid Build Coastguard Worker     }
477*598139dcSAndroid Build Coastguard Worker     android_log_format_free(logformat);
478*598139dcSAndroid Build Coastguard Worker   };
479*598139dcSAndroid Build Coastguard Worker 
480*598139dcSAndroid Build Coastguard Worker   RunLogTests(LOG_ID_MAIN, write_function, check_function);
481*598139dcSAndroid Build Coastguard Worker 
482*598139dcSAndroid Build Coastguard Worker #else
483*598139dcSAndroid Build Coastguard Worker   message = NULL;
484*598139dcSAndroid Build Coastguard Worker   GTEST_LOG_(INFO) << "This test does nothing.\n";
485*598139dcSAndroid Build Coastguard Worker #endif
486*598139dcSAndroid Build Coastguard Worker }
487*598139dcSAndroid Build Coastguard Worker 
TEST(liblog,__android_log_buf_write_and_print__empty)488*598139dcSAndroid Build Coastguard Worker TEST(liblog, __android_log_buf_write_and_print__empty) {
489*598139dcSAndroid Build Coastguard Worker   buf_write_test("");
490*598139dcSAndroid Build Coastguard Worker }
491*598139dcSAndroid Build Coastguard Worker 
TEST(liblog,__android_log_buf_write_and_print__newline_prefix)492*598139dcSAndroid Build Coastguard Worker TEST(liblog, __android_log_buf_write_and_print__newline_prefix) {
493*598139dcSAndroid Build Coastguard Worker   buf_write_test("\nHello World\n");
494*598139dcSAndroid Build Coastguard Worker }
495*598139dcSAndroid Build Coastguard Worker 
TEST(liblog,__android_log_buf_write_and_print__newline_space_prefix)496*598139dcSAndroid Build Coastguard Worker TEST(liblog, __android_log_buf_write_and_print__newline_space_prefix) {
497*598139dcSAndroid Build Coastguard Worker   buf_write_test("\n Hello World \n");
498*598139dcSAndroid Build Coastguard Worker }
499*598139dcSAndroid Build Coastguard Worker 
500*598139dcSAndroid Build Coastguard Worker #ifdef ENABLE_FLAKY_TESTS
501*598139dcSAndroid Build Coastguard Worker #ifdef __ANDROID__
502*598139dcSAndroid Build Coastguard Worker static unsigned signaled;
503*598139dcSAndroid Build Coastguard Worker static log_time signal_time;
504*598139dcSAndroid Build Coastguard Worker 
505*598139dcSAndroid Build Coastguard Worker /*
506*598139dcSAndroid Build Coastguard Worker  *  Strictly, we are not allowed to log messages in a signal context, but we
507*598139dcSAndroid Build Coastguard Worker  * do make an effort to keep the failure surface minimized, and this in-effect
508*598139dcSAndroid Build Coastguard Worker  * should catch any regressions in that effort. The odds of a logged message
509*598139dcSAndroid Build Coastguard Worker  * in a signal handler causing a lockup problem should be _very_ small.
510*598139dcSAndroid Build Coastguard Worker  */
caught_blocking_signal(int)511*598139dcSAndroid Build Coastguard Worker static void caught_blocking_signal(int /*signum*/) {
512*598139dcSAndroid Build Coastguard Worker   unsigned long long v = 0xDEADBEEFA55A0000ULL;
513*598139dcSAndroid Build Coastguard Worker 
514*598139dcSAndroid Build Coastguard Worker   v += getpid() & 0xFFFF;
515*598139dcSAndroid Build Coastguard Worker 
516*598139dcSAndroid Build Coastguard Worker   ++signaled;
517*598139dcSAndroid Build Coastguard Worker   if ((signal_time.tv_sec == 0) && (signal_time.tv_nsec == 0)) {
518*598139dcSAndroid Build Coastguard Worker     signal_time = log_time(CLOCK_MONOTONIC);
519*598139dcSAndroid Build Coastguard Worker     signal_time.tv_sec += 2;
520*598139dcSAndroid Build Coastguard Worker   }
521*598139dcSAndroid Build Coastguard Worker 
522*598139dcSAndroid Build Coastguard Worker   LOG_FAILURE_RETRY(__android_log_btwrite(0, EVENT_TYPE_LONG, &v, sizeof(v)));
523*598139dcSAndroid Build Coastguard Worker }
524*598139dcSAndroid Build Coastguard Worker 
525*598139dcSAndroid Build Coastguard Worker // Fill in current process user and system time in 10ms increments
get_ticks(unsigned long long * uticks,unsigned long long * sticks)526*598139dcSAndroid Build Coastguard Worker static void get_ticks(unsigned long long* uticks, unsigned long long* sticks) {
527*598139dcSAndroid Build Coastguard Worker   *uticks = *sticks = 0;
528*598139dcSAndroid Build Coastguard Worker 
529*598139dcSAndroid Build Coastguard Worker   pid_t pid = getpid();
530*598139dcSAndroid Build Coastguard Worker 
531*598139dcSAndroid Build Coastguard Worker   char buffer[512];
532*598139dcSAndroid Build Coastguard Worker   snprintf(buffer, sizeof(buffer), "/proc/%u/stat", pid);
533*598139dcSAndroid Build Coastguard Worker 
534*598139dcSAndroid Build Coastguard Worker   FILE* fp = fopen(buffer, "re");
535*598139dcSAndroid Build Coastguard Worker   if (!fp) {
536*598139dcSAndroid Build Coastguard Worker     return;
537*598139dcSAndroid Build Coastguard Worker   }
538*598139dcSAndroid Build Coastguard Worker 
539*598139dcSAndroid Build Coastguard Worker   char* cp = fgets(buffer, sizeof(buffer), fp);
540*598139dcSAndroid Build Coastguard Worker   fclose(fp);
541*598139dcSAndroid Build Coastguard Worker   if (!cp) {
542*598139dcSAndroid Build Coastguard Worker     return;
543*598139dcSAndroid Build Coastguard Worker   }
544*598139dcSAndroid Build Coastguard Worker 
545*598139dcSAndroid Build Coastguard Worker   pid_t d;
546*598139dcSAndroid Build Coastguard Worker   char s[sizeof(buffer)];
547*598139dcSAndroid Build Coastguard Worker   char c;
548*598139dcSAndroid Build Coastguard Worker   long long ll;
549*598139dcSAndroid Build Coastguard Worker   unsigned long long ull;
550*598139dcSAndroid Build Coastguard Worker 
551*598139dcSAndroid Build Coastguard Worker   if (15 != sscanf(buffer,
552*598139dcSAndroid Build Coastguard Worker                    "%d %s %c %lld %lld %lld %lld %lld %llu %llu %llu %llu %llu "
553*598139dcSAndroid Build Coastguard Worker                    "%llu %llu ",
554*598139dcSAndroid Build Coastguard Worker                    &d, s, &c, &ll, &ll, &ll, &ll, &ll, &ull, &ull, &ull, &ull,
555*598139dcSAndroid Build Coastguard Worker                    &ull, uticks, sticks)) {
556*598139dcSAndroid Build Coastguard Worker     *uticks = *sticks = 0;
557*598139dcSAndroid Build Coastguard Worker   }
558*598139dcSAndroid Build Coastguard Worker }
559*598139dcSAndroid Build Coastguard Worker #endif
560*598139dcSAndroid Build Coastguard Worker 
TEST(liblog,android_logger_list_read__cpu_signal)561*598139dcSAndroid Build Coastguard Worker TEST(liblog, android_logger_list_read__cpu_signal) {
562*598139dcSAndroid Build Coastguard Worker #ifdef __ANDROID__
563*598139dcSAndroid Build Coastguard Worker   struct logger_list* logger_list;
564*598139dcSAndroid Build Coastguard Worker   unsigned long long v = 0xDEADBEEFA55A0000ULL;
565*598139dcSAndroid Build Coastguard Worker 
566*598139dcSAndroid Build Coastguard Worker   pid_t pid = getpid();
567*598139dcSAndroid Build Coastguard Worker 
568*598139dcSAndroid Build Coastguard Worker   v += pid & 0xFFFF;
569*598139dcSAndroid Build Coastguard Worker 
570*598139dcSAndroid Build Coastguard Worker   ASSERT_TRUE(NULL != (logger_list = android_logger_list_open(LOG_ID_EVENTS, 0, INT_MAX, pid)));
571*598139dcSAndroid Build Coastguard Worker 
572*598139dcSAndroid Build Coastguard Worker   int count = 0;
573*598139dcSAndroid Build Coastguard Worker 
574*598139dcSAndroid Build Coastguard Worker   int signals = 0;
575*598139dcSAndroid Build Coastguard Worker 
576*598139dcSAndroid Build Coastguard Worker   unsigned long long uticks_start;
577*598139dcSAndroid Build Coastguard Worker   unsigned long long sticks_start;
578*598139dcSAndroid Build Coastguard Worker   get_ticks(&uticks_start, &sticks_start);
579*598139dcSAndroid Build Coastguard Worker 
580*598139dcSAndroid Build Coastguard Worker   const unsigned alarm_time = getAlarmSeconds(10);
581*598139dcSAndroid Build Coastguard Worker 
582*598139dcSAndroid Build Coastguard Worker   memset(&signal_time, 0, sizeof(signal_time));
583*598139dcSAndroid Build Coastguard Worker 
584*598139dcSAndroid Build Coastguard Worker   signal(SIGALRM, caught_blocking_signal);
585*598139dcSAndroid Build Coastguard Worker   alarm(alarm_time);
586*598139dcSAndroid Build Coastguard Worker 
587*598139dcSAndroid Build Coastguard Worker   signaled = 0;
588*598139dcSAndroid Build Coastguard Worker 
589*598139dcSAndroid Build Coastguard Worker   do {
590*598139dcSAndroid Build Coastguard Worker     log_msg log_msg;
591*598139dcSAndroid Build Coastguard Worker     if (android_logger_list_read(logger_list, &log_msg) <= 0) {
592*598139dcSAndroid Build Coastguard Worker       break;
593*598139dcSAndroid Build Coastguard Worker     }
594*598139dcSAndroid Build Coastguard Worker 
595*598139dcSAndroid Build Coastguard Worker     alarm(alarm_time);
596*598139dcSAndroid Build Coastguard Worker 
597*598139dcSAndroid Build Coastguard Worker     ++count;
598*598139dcSAndroid Build Coastguard Worker 
599*598139dcSAndroid Build Coastguard Worker     ASSERT_EQ(log_msg.entry.pid, pid);
600*598139dcSAndroid Build Coastguard Worker 
601*598139dcSAndroid Build Coastguard Worker     if ((log_msg.entry.len != sizeof(android_log_event_long_t)) ||
602*598139dcSAndroid Build Coastguard Worker         (log_msg.id() != LOG_ID_EVENTS)) {
603*598139dcSAndroid Build Coastguard Worker       continue;
604*598139dcSAndroid Build Coastguard Worker     }
605*598139dcSAndroid Build Coastguard Worker 
606*598139dcSAndroid Build Coastguard Worker     android_log_event_long_t* eventData;
607*598139dcSAndroid Build Coastguard Worker     eventData = reinterpret_cast<android_log_event_long_t*>(log_msg.msg());
608*598139dcSAndroid Build Coastguard Worker 
609*598139dcSAndroid Build Coastguard Worker     if (!eventData || (eventData->payload.type != EVENT_TYPE_LONG)) {
610*598139dcSAndroid Build Coastguard Worker       continue;
611*598139dcSAndroid Build Coastguard Worker     }
612*598139dcSAndroid Build Coastguard Worker 
613*598139dcSAndroid Build Coastguard Worker     char* cp = reinterpret_cast<char*>(&eventData->payload.data);
614*598139dcSAndroid Build Coastguard Worker     unsigned long long l = cp[0] & 0xFF;
615*598139dcSAndroid Build Coastguard Worker     l |= (unsigned long long)(cp[1] & 0xFF) << 8;
616*598139dcSAndroid Build Coastguard Worker     l |= (unsigned long long)(cp[2] & 0xFF) << 16;
617*598139dcSAndroid Build Coastguard Worker     l |= (unsigned long long)(cp[3] & 0xFF) << 24;
618*598139dcSAndroid Build Coastguard Worker     l |= (unsigned long long)(cp[4] & 0xFF) << 32;
619*598139dcSAndroid Build Coastguard Worker     l |= (unsigned long long)(cp[5] & 0xFF) << 40;
620*598139dcSAndroid Build Coastguard Worker     l |= (unsigned long long)(cp[6] & 0xFF) << 48;
621*598139dcSAndroid Build Coastguard Worker     l |= (unsigned long long)(cp[7] & 0xFF) << 56;
622*598139dcSAndroid Build Coastguard Worker 
623*598139dcSAndroid Build Coastguard Worker     if (l == v) {
624*598139dcSAndroid Build Coastguard Worker       ++signals;
625*598139dcSAndroid Build Coastguard Worker       break;
626*598139dcSAndroid Build Coastguard Worker     }
627*598139dcSAndroid Build Coastguard Worker   } while (!signaled || (log_time(CLOCK_MONOTONIC) < signal_time));
628*598139dcSAndroid Build Coastguard Worker   alarm(0);
629*598139dcSAndroid Build Coastguard Worker   signal(SIGALRM, SIG_DFL);
630*598139dcSAndroid Build Coastguard Worker 
631*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(1, count);
632*598139dcSAndroid Build Coastguard Worker 
633*598139dcSAndroid Build Coastguard Worker   EXPECT_EQ(1, signals);
634*598139dcSAndroid Build Coastguard Worker 
635*598139dcSAndroid Build Coastguard Worker   android_logger_list_close(logger_list);
636*598139dcSAndroid Build Coastguard Worker 
637*598139dcSAndroid Build Coastguard Worker   unsigned long long uticks_end;
638*598139dcSAndroid Build Coastguard Worker   unsigned long long sticks_end;
639*598139dcSAndroid Build Coastguard Worker   get_ticks(&uticks_end, &sticks_end);
640*598139dcSAndroid Build Coastguard Worker 
641*598139dcSAndroid Build Coastguard Worker   // Less than 1% in either user or system time, or both
642*598139dcSAndroid Build Coastguard Worker   const unsigned long long one_percent_ticks = alarm_time;
643*598139dcSAndroid Build Coastguard Worker   unsigned long long user_ticks = uticks_end - uticks_start;
644*598139dcSAndroid Build Coastguard Worker   unsigned long long system_ticks = sticks_end - sticks_start;
645*598139dcSAndroid Build Coastguard Worker   EXPECT_GT(one_percent_ticks, user_ticks);
646*598139dcSAndroid Build Coastguard Worker   EXPECT_GT(one_percent_ticks, system_ticks);
647*598139dcSAndroid Build Coastguard Worker   EXPECT_GT(one_percent_ticks, user_ticks + system_ticks);
648*598139dcSAndroid Build Coastguard Worker #else
649*598139dcSAndroid Build Coastguard Worker   GTEST_LOG_(INFO) << "This test does nothing.\n";
650*598139dcSAndroid Build Coastguard Worker #endif
651*598139dcSAndroid Build Coastguard Worker }
652*598139dcSAndroid Build Coastguard Worker 
653*598139dcSAndroid Build Coastguard Worker #ifdef __ANDROID__
654*598139dcSAndroid Build Coastguard Worker /*
655*598139dcSAndroid Build Coastguard Worker  *  Strictly, we are not allowed to log messages in a signal context, the
656*598139dcSAndroid Build Coastguard Worker  * correct way to handle this is to ensure the messages are constructed in
657*598139dcSAndroid Build Coastguard Worker  * a thread; the signal handler should only unblock the thread.
658*598139dcSAndroid Build Coastguard Worker  */
659*598139dcSAndroid Build Coastguard Worker static sem_t thread_trigger;
660*598139dcSAndroid Build Coastguard Worker 
caught_blocking_thread(int)661*598139dcSAndroid Build Coastguard Worker static void caught_blocking_thread(int /*signum*/) {
662*598139dcSAndroid Build Coastguard Worker   sem_post(&thread_trigger);
663*598139dcSAndroid Build Coastguard Worker }
664*598139dcSAndroid Build Coastguard Worker 
running_thread(void *)665*598139dcSAndroid Build Coastguard Worker static void* running_thread(void*) {
666*598139dcSAndroid Build Coastguard Worker   unsigned long long v = 0xDEADBEAFA55A0000ULL;
667*598139dcSAndroid Build Coastguard Worker 
668*598139dcSAndroid Build Coastguard Worker   v += getpid() & 0xFFFF;
669*598139dcSAndroid Build Coastguard Worker 
670*598139dcSAndroid Build Coastguard Worker   struct timespec timeout;
671*598139dcSAndroid Build Coastguard Worker   clock_gettime(CLOCK_REALTIME, &timeout);
672*598139dcSAndroid Build Coastguard Worker   timeout.tv_sec += 55;
673*598139dcSAndroid Build Coastguard Worker   sem_timedwait(&thread_trigger, &timeout);
674*598139dcSAndroid Build Coastguard Worker 
675*598139dcSAndroid Build Coastguard Worker   ++signaled;
676*598139dcSAndroid Build Coastguard Worker   if ((signal_time.tv_sec == 0) && (signal_time.tv_nsec == 0)) {
677*598139dcSAndroid Build Coastguard Worker     signal_time = log_time(CLOCK_MONOTONIC);
678*598139dcSAndroid Build Coastguard Worker     signal_time.tv_sec += 2;
679*598139dcSAndroid Build Coastguard Worker   }
680*598139dcSAndroid Build Coastguard Worker 
681*598139dcSAndroid Build Coastguard Worker   LOG_FAILURE_RETRY(__android_log_btwrite(0, EVENT_TYPE_LONG, &v, sizeof(v)));
682*598139dcSAndroid Build Coastguard Worker 
683*598139dcSAndroid Build Coastguard Worker   return NULL;
684*598139dcSAndroid Build Coastguard Worker }
685*598139dcSAndroid Build Coastguard Worker 
start_thread()686*598139dcSAndroid Build Coastguard Worker static int start_thread() {
687*598139dcSAndroid Build Coastguard Worker   sem_init(&thread_trigger, 0, 0);
688*598139dcSAndroid Build Coastguard Worker 
689*598139dcSAndroid Build Coastguard Worker   pthread_attr_t attr;
690*598139dcSAndroid Build Coastguard Worker   if (pthread_attr_init(&attr)) {
691*598139dcSAndroid Build Coastguard Worker     return -1;
692*598139dcSAndroid Build Coastguard Worker   }
693*598139dcSAndroid Build Coastguard Worker 
694*598139dcSAndroid Build Coastguard Worker   struct sched_param param = {};
695*598139dcSAndroid Build Coastguard Worker   pthread_attr_setschedparam(&attr, &param);
696*598139dcSAndroid Build Coastguard Worker   pthread_attr_setschedpolicy(&attr, SCHED_BATCH);
697*598139dcSAndroid Build Coastguard Worker 
698*598139dcSAndroid Build Coastguard Worker   if (pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED)) {
699*598139dcSAndroid Build Coastguard Worker     pthread_attr_destroy(&attr);
700*598139dcSAndroid Build Coastguard Worker     return -1;
701*598139dcSAndroid Build Coastguard Worker   }
702*598139dcSAndroid Build Coastguard Worker 
703*598139dcSAndroid Build Coastguard Worker   pthread_t thread;
704*598139dcSAndroid Build Coastguard Worker   if (pthread_create(&thread, &attr, running_thread, NULL)) {
705*598139dcSAndroid Build Coastguard Worker     pthread_attr_destroy(&attr);
706*598139dcSAndroid Build Coastguard Worker     return -1;
707*598139dcSAndroid Build Coastguard Worker   }
708*598139dcSAndroid Build Coastguard Worker 
709*598139dcSAndroid Build Coastguard Worker   pthread_attr_destroy(&attr);
710*598139dcSAndroid Build Coastguard Worker   return 0;
711*598139dcSAndroid Build Coastguard Worker }
712*598139dcSAndroid Build Coastguard Worker #endif
713*598139dcSAndroid Build Coastguard Worker 
TEST(liblog,android_logger_list_read__cpu_thread)714*598139dcSAndroid Build Coastguard Worker TEST(liblog, android_logger_list_read__cpu_thread) {
715*598139dcSAndroid Build Coastguard Worker #ifdef __ANDROID__
716*598139dcSAndroid Build Coastguard Worker   struct logger_list* logger_list;
717*598139dcSAndroid Build Coastguard Worker   unsigned long long v = 0xDEADBEAFA55A0000ULL;
718*598139dcSAndroid Build Coastguard Worker 
719*598139dcSAndroid Build Coastguard Worker   pid_t pid = getpid();
720*598139dcSAndroid Build Coastguard Worker 
721*598139dcSAndroid Build Coastguard Worker   v += pid & 0xFFFF;
722*598139dcSAndroid Build Coastguard Worker 
723*598139dcSAndroid Build Coastguard Worker   ASSERT_TRUE(NULL != (logger_list = android_logger_list_open(LOG_ID_EVENTS, 0, INT_MAX, pid)));
724*598139dcSAndroid Build Coastguard Worker 
725*598139dcSAndroid Build Coastguard Worker   int count = 0;
726*598139dcSAndroid Build Coastguard Worker 
727*598139dcSAndroid Build Coastguard Worker   int signals = 0;
728*598139dcSAndroid Build Coastguard Worker 
729*598139dcSAndroid Build Coastguard Worker   unsigned long long uticks_start;
730*598139dcSAndroid Build Coastguard Worker   unsigned long long sticks_start;
731*598139dcSAndroid Build Coastguard Worker   get_ticks(&uticks_start, &sticks_start);
732*598139dcSAndroid Build Coastguard Worker 
733*598139dcSAndroid Build Coastguard Worker   const unsigned alarm_time = getAlarmSeconds(10);
734*598139dcSAndroid Build Coastguard Worker 
735*598139dcSAndroid Build Coastguard Worker   memset(&signal_time, 0, sizeof(signal_time));
736*598139dcSAndroid Build Coastguard Worker 
737*598139dcSAndroid Build Coastguard Worker   signaled = 0;
738*598139dcSAndroid Build Coastguard Worker   EXPECT_EQ(0, start_thread());
739*598139dcSAndroid Build Coastguard Worker 
740*598139dcSAndroid Build Coastguard Worker   signal(SIGALRM, caught_blocking_thread);
741*598139dcSAndroid Build Coastguard Worker   alarm(alarm_time);
742*598139dcSAndroid Build Coastguard Worker 
743*598139dcSAndroid Build Coastguard Worker   do {
744*598139dcSAndroid Build Coastguard Worker     log_msg log_msg;
745*598139dcSAndroid Build Coastguard Worker     if (LOG_FAILURE_RETRY(android_logger_list_read(logger_list, &log_msg)) <= 0) {
746*598139dcSAndroid Build Coastguard Worker       break;
747*598139dcSAndroid Build Coastguard Worker     }
748*598139dcSAndroid Build Coastguard Worker 
749*598139dcSAndroid Build Coastguard Worker     alarm(alarm_time);
750*598139dcSAndroid Build Coastguard Worker 
751*598139dcSAndroid Build Coastguard Worker     ++count;
752*598139dcSAndroid Build Coastguard Worker 
753*598139dcSAndroid Build Coastguard Worker     ASSERT_EQ(log_msg.entry.pid, pid);
754*598139dcSAndroid Build Coastguard Worker 
755*598139dcSAndroid Build Coastguard Worker     if ((log_msg.entry.len != sizeof(android_log_event_long_t)) ||
756*598139dcSAndroid Build Coastguard Worker         (log_msg.id() != LOG_ID_EVENTS)) {
757*598139dcSAndroid Build Coastguard Worker       continue;
758*598139dcSAndroid Build Coastguard Worker     }
759*598139dcSAndroid Build Coastguard Worker 
760*598139dcSAndroid Build Coastguard Worker     android_log_event_long_t* eventData;
761*598139dcSAndroid Build Coastguard Worker     eventData = reinterpret_cast<android_log_event_long_t*>(log_msg.msg());
762*598139dcSAndroid Build Coastguard Worker 
763*598139dcSAndroid Build Coastguard Worker     if (!eventData || (eventData->payload.type != EVENT_TYPE_LONG)) {
764*598139dcSAndroid Build Coastguard Worker       continue;
765*598139dcSAndroid Build Coastguard Worker     }
766*598139dcSAndroid Build Coastguard Worker 
767*598139dcSAndroid Build Coastguard Worker     char* cp = reinterpret_cast<char*>(&eventData->payload.data);
768*598139dcSAndroid Build Coastguard Worker     unsigned long long l = cp[0] & 0xFF;
769*598139dcSAndroid Build Coastguard Worker     l |= (unsigned long long)(cp[1] & 0xFF) << 8;
770*598139dcSAndroid Build Coastguard Worker     l |= (unsigned long long)(cp[2] & 0xFF) << 16;
771*598139dcSAndroid Build Coastguard Worker     l |= (unsigned long long)(cp[3] & 0xFF) << 24;
772*598139dcSAndroid Build Coastguard Worker     l |= (unsigned long long)(cp[4] & 0xFF) << 32;
773*598139dcSAndroid Build Coastguard Worker     l |= (unsigned long long)(cp[5] & 0xFF) << 40;
774*598139dcSAndroid Build Coastguard Worker     l |= (unsigned long long)(cp[6] & 0xFF) << 48;
775*598139dcSAndroid Build Coastguard Worker     l |= (unsigned long long)(cp[7] & 0xFF) << 56;
776*598139dcSAndroid Build Coastguard Worker 
777*598139dcSAndroid Build Coastguard Worker     if (l == v) {
778*598139dcSAndroid Build Coastguard Worker       ++signals;
779*598139dcSAndroid Build Coastguard Worker       break;
780*598139dcSAndroid Build Coastguard Worker     }
781*598139dcSAndroid Build Coastguard Worker   } while (!signaled || (log_time(CLOCK_MONOTONIC) < signal_time));
782*598139dcSAndroid Build Coastguard Worker   alarm(0);
783*598139dcSAndroid Build Coastguard Worker   signal(SIGALRM, SIG_DFL);
784*598139dcSAndroid Build Coastguard Worker 
785*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(1, count);
786*598139dcSAndroid Build Coastguard Worker 
787*598139dcSAndroid Build Coastguard Worker   EXPECT_EQ(1, signals);
788*598139dcSAndroid Build Coastguard Worker 
789*598139dcSAndroid Build Coastguard Worker   android_logger_list_close(logger_list);
790*598139dcSAndroid Build Coastguard Worker 
791*598139dcSAndroid Build Coastguard Worker   unsigned long long uticks_end;
792*598139dcSAndroid Build Coastguard Worker   unsigned long long sticks_end;
793*598139dcSAndroid Build Coastguard Worker   get_ticks(&uticks_end, &sticks_end);
794*598139dcSAndroid Build Coastguard Worker 
795*598139dcSAndroid Build Coastguard Worker   // Less than 1% in either user or system time, or both
796*598139dcSAndroid Build Coastguard Worker   const unsigned long long one_percent_ticks = alarm_time;
797*598139dcSAndroid Build Coastguard Worker   unsigned long long user_ticks = uticks_end - uticks_start;
798*598139dcSAndroid Build Coastguard Worker   unsigned long long system_ticks = sticks_end - sticks_start;
799*598139dcSAndroid Build Coastguard Worker   EXPECT_GT(one_percent_ticks, user_ticks);
800*598139dcSAndroid Build Coastguard Worker   EXPECT_GT(one_percent_ticks, system_ticks);
801*598139dcSAndroid Build Coastguard Worker   EXPECT_GT(one_percent_ticks, user_ticks + system_ticks);
802*598139dcSAndroid Build Coastguard Worker #else
803*598139dcSAndroid Build Coastguard Worker   GTEST_LOG_(INFO) << "This test does nothing.\n";
804*598139dcSAndroid Build Coastguard Worker #endif
805*598139dcSAndroid Build Coastguard Worker }
806*598139dcSAndroid Build Coastguard Worker #endif  // ENABLE_FLAKY_TESTS
807*598139dcSAndroid Build Coastguard Worker 
808*598139dcSAndroid Build Coastguard Worker static const char max_payload_buf[] =
809*598139dcSAndroid Build Coastguard Worker     "LEONATO\n\
810*598139dcSAndroid Build Coastguard Worker I learn in this letter that Don Peter of Arragon\n\
811*598139dcSAndroid Build Coastguard Worker comes this night to Messina\n\
812*598139dcSAndroid Build Coastguard Worker MESSENGER\n\
813*598139dcSAndroid Build Coastguard Worker He is very near by this: he was not three leagues off\n\
814*598139dcSAndroid Build Coastguard Worker when I left him\n\
815*598139dcSAndroid Build Coastguard Worker LEONATO\n\
816*598139dcSAndroid Build Coastguard Worker How many gentlemen have you lost in this action?\n\
817*598139dcSAndroid Build Coastguard Worker MESSENGER\n\
818*598139dcSAndroid Build Coastguard Worker But few of any sort, and none of name\n\
819*598139dcSAndroid Build Coastguard Worker LEONATO\n\
820*598139dcSAndroid Build Coastguard Worker A victory is twice itself when the achiever brings\n\
821*598139dcSAndroid Build Coastguard Worker home full numbers. I find here that Don Peter hath\n\
822*598139dcSAndroid Build Coastguard Worker bestowed much honour on a young Florentine called Claudio\n\
823*598139dcSAndroid Build Coastguard Worker MESSENGER\n\
824*598139dcSAndroid Build Coastguard Worker Much deserved on his part and equally remembered by\n\
825*598139dcSAndroid Build Coastguard Worker Don Pedro: he hath borne himself beyond the\n\
826*598139dcSAndroid Build Coastguard Worker promise of his age, doing, in the figure of a lamb,\n\
827*598139dcSAndroid Build Coastguard Worker the feats of a lion: he hath indeed better\n\
828*598139dcSAndroid Build Coastguard Worker bettered expectation than you must expect of me to\n\
829*598139dcSAndroid Build Coastguard Worker tell you how\n\
830*598139dcSAndroid Build Coastguard Worker LEONATO\n\
831*598139dcSAndroid Build Coastguard Worker He hath an uncle here in Messina will be very much\n\
832*598139dcSAndroid Build Coastguard Worker glad of it.\n\
833*598139dcSAndroid Build Coastguard Worker MESSENGER\n\
834*598139dcSAndroid Build Coastguard Worker I have already delivered him letters, and there\n\
835*598139dcSAndroid Build Coastguard Worker appears much joy in him; even so much that joy could\n\
836*598139dcSAndroid Build Coastguard Worker not show itself modest enough without a badge of\n\
837*598139dcSAndroid Build Coastguard Worker bitterness.\n\
838*598139dcSAndroid Build Coastguard Worker LEONATO\n\
839*598139dcSAndroid Build Coastguard Worker Did he break out into tears?\n\
840*598139dcSAndroid Build Coastguard Worker MESSENGER\n\
841*598139dcSAndroid Build Coastguard Worker In great measure.\n\
842*598139dcSAndroid Build Coastguard Worker LEONATO\n\
843*598139dcSAndroid Build Coastguard Worker A kind overflow of kindness: there are no faces\n\
844*598139dcSAndroid Build Coastguard Worker truer than those that are so washed. How much\n\
845*598139dcSAndroid Build Coastguard Worker better is it to weep at joy than to joy at weeping!\n\
846*598139dcSAndroid Build Coastguard Worker BEATRICE\n\
847*598139dcSAndroid Build Coastguard Worker I pray you, is Signior Mountanto returned from the\n\
848*598139dcSAndroid Build Coastguard Worker wars or no?\n\
849*598139dcSAndroid Build Coastguard Worker MESSENGER\n\
850*598139dcSAndroid Build Coastguard Worker I know none of that name, lady: there was none such\n\
851*598139dcSAndroid Build Coastguard Worker in the army of any sort.\n\
852*598139dcSAndroid Build Coastguard Worker LEONATO\n\
853*598139dcSAndroid Build Coastguard Worker What is he that you ask for, niece?\n\
854*598139dcSAndroid Build Coastguard Worker HERO\n\
855*598139dcSAndroid Build Coastguard Worker My cousin means Signior Benedick of Padua.\n\
856*598139dcSAndroid Build Coastguard Worker MESSENGER\n\
857*598139dcSAndroid Build Coastguard Worker O, he's returned; and as pleasant as ever he was.\n\
858*598139dcSAndroid Build Coastguard Worker BEATRICE\n\
859*598139dcSAndroid Build Coastguard Worker He set up his bills here in Messina and challenged\n\
860*598139dcSAndroid Build Coastguard Worker Cupid at the flight; and my uncle's fool, reading\n\
861*598139dcSAndroid Build Coastguard Worker the challenge, subscribed for Cupid, and challenged\n\
862*598139dcSAndroid Build Coastguard Worker him at the bird-bolt. I pray you, how many hath he\n\
863*598139dcSAndroid Build Coastguard Worker killed and eaten in these wars? But how many hath\n\
864*598139dcSAndroid Build Coastguard Worker he killed? for indeed I promised to eat all of his killing.\n\
865*598139dcSAndroid Build Coastguard Worker LEONATO\n\
866*598139dcSAndroid Build Coastguard Worker Faith, niece, you tax Signior Benedick too much;\n\
867*598139dcSAndroid Build Coastguard Worker but he'll be meet with you, I doubt it not.\n\
868*598139dcSAndroid Build Coastguard Worker MESSENGER\n\
869*598139dcSAndroid Build Coastguard Worker He hath done good service, lady, in these wars.\n\
870*598139dcSAndroid Build Coastguard Worker BEATRICE\n\
871*598139dcSAndroid Build Coastguard Worker You had musty victual, and he hath holp to eat it:\n\
872*598139dcSAndroid Build Coastguard Worker he is a very valiant trencherman; he hath an\n\
873*598139dcSAndroid Build Coastguard Worker excellent stomach.\n\
874*598139dcSAndroid Build Coastguard Worker MESSENGER\n\
875*598139dcSAndroid Build Coastguard Worker And a good soldier too, lady.\n\
876*598139dcSAndroid Build Coastguard Worker BEATRICE\n\
877*598139dcSAndroid Build Coastguard Worker And a good soldier to a lady: but what is he to a lord?\n\
878*598139dcSAndroid Build Coastguard Worker MESSENGER\n\
879*598139dcSAndroid Build Coastguard Worker A lord to a lord, a man to a man; stuffed with all\n\
880*598139dcSAndroid Build Coastguard Worker honourable virtues.\n\
881*598139dcSAndroid Build Coastguard Worker BEATRICE\n\
882*598139dcSAndroid Build Coastguard Worker It is so, indeed; he is no less than a stuffed man:\n\
883*598139dcSAndroid Build Coastguard Worker but for the stuffing,--well, we are all mortal.\n\
884*598139dcSAndroid Build Coastguard Worker LEONATO\n\
885*598139dcSAndroid Build Coastguard Worker You must not, sir, mistake my niece. There is a\n\
886*598139dcSAndroid Build Coastguard Worker kind of merry war betwixt Signior Benedick and her:\n\
887*598139dcSAndroid Build Coastguard Worker they never meet but there's a skirmish of wit\n\
888*598139dcSAndroid Build Coastguard Worker between them.\n\
889*598139dcSAndroid Build Coastguard Worker BEATRICE\n\
890*598139dcSAndroid Build Coastguard Worker Alas! he gets nothing by that. In our last\n\
891*598139dcSAndroid Build Coastguard Worker conflict four of his five wits went halting off, and\n\
892*598139dcSAndroid Build Coastguard Worker now is the whole man governed with one: so that if\n\
893*598139dcSAndroid Build Coastguard Worker he have wit enough to keep himself warm, let him\n\
894*598139dcSAndroid Build Coastguard Worker bear it for a difference between himself and his\n\
895*598139dcSAndroid Build Coastguard Worker horse; for it is all the wealth that he hath left,\n\
896*598139dcSAndroid Build Coastguard Worker to be known a reasonable creature. Who is his\n\
897*598139dcSAndroid Build Coastguard Worker companion now? He hath every month a new sworn brother.\n\
898*598139dcSAndroid Build Coastguard Worker MESSENGER\n\
899*598139dcSAndroid Build Coastguard Worker Is't possible?\n\
900*598139dcSAndroid Build Coastguard Worker BEATRICE\n\
901*598139dcSAndroid Build Coastguard Worker Very easily possible: he wears his faith but as\n\
902*598139dcSAndroid Build Coastguard Worker the fashion of his hat; it ever changes with the\n\
903*598139dcSAndroid Build Coastguard Worker next block.\n\
904*598139dcSAndroid Build Coastguard Worker MESSENGER\n\
905*598139dcSAndroid Build Coastguard Worker I see, lady, the gentleman is not in your books.\n\
906*598139dcSAndroid Build Coastguard Worker BEATRICE\n\
907*598139dcSAndroid Build Coastguard Worker No; an he were, I would burn my study. But, I pray\n\
908*598139dcSAndroid Build Coastguard Worker you, who is his companion? Is there no young\n\
909*598139dcSAndroid Build Coastguard Worker squarer now that will make a voyage with him to the devil?\n\
910*598139dcSAndroid Build Coastguard Worker MESSENGER\n\
911*598139dcSAndroid Build Coastguard Worker He is most in the company of the right noble Claudio.\n\
912*598139dcSAndroid Build Coastguard Worker BEATRICE\n\
913*598139dcSAndroid Build Coastguard Worker O Lord, he will hang upon him like a disease: he\n\
914*598139dcSAndroid Build Coastguard Worker is sooner caught than the pestilence, and the taker\n\
915*598139dcSAndroid Build Coastguard Worker runs presently mad. God help the noble Claudio! if\n\
916*598139dcSAndroid Build Coastguard Worker he have caught the Benedick, it will cost him a\n\
917*598139dcSAndroid Build Coastguard Worker thousand pound ere a' be cured.\n\
918*598139dcSAndroid Build Coastguard Worker MESSENGER\n\
919*598139dcSAndroid Build Coastguard Worker I will hold friends with you, lady.\n\
920*598139dcSAndroid Build Coastguard Worker BEATRICE\n\
921*598139dcSAndroid Build Coastguard Worker Do, good friend.\n\
922*598139dcSAndroid Build Coastguard Worker LEONATO\n\
923*598139dcSAndroid Build Coastguard Worker You will never run mad, niece.\n\
924*598139dcSAndroid Build Coastguard Worker BEATRICE\n\
925*598139dcSAndroid Build Coastguard Worker No, not till a hot January.\n\
926*598139dcSAndroid Build Coastguard Worker MESSENGER\n\
927*598139dcSAndroid Build Coastguard Worker Don Pedro is approached.\n\
928*598139dcSAndroid Build Coastguard Worker Enter DON PEDRO, DON JOHN, CLAUDIO, BENEDICK, and BALTHASAR\n\
929*598139dcSAndroid Build Coastguard Worker \n\
930*598139dcSAndroid Build Coastguard Worker DON PEDRO\n\
931*598139dcSAndroid Build Coastguard Worker Good Signior Leonato, you are come to meet your\n\
932*598139dcSAndroid Build Coastguard Worker trouble: the fashion of the world is to avoid\n\
933*598139dcSAndroid Build Coastguard Worker cost, and you encounter it\n\
934*598139dcSAndroid Build Coastguard Worker LEONATO\n\
935*598139dcSAndroid Build Coastguard Worker Never came trouble to my house in the likeness of your grace,\n\
936*598139dcSAndroid Build Coastguard Worker for trouble being gone, comfort should remain, but\n\
937*598139dcSAndroid Build Coastguard Worker when you depart from me, sorrow abides and happiness\n\
938*598139dcSAndroid Build Coastguard Worker takes his leave.";
939*598139dcSAndroid Build Coastguard Worker 
TEST(liblog,max_payload)940*598139dcSAndroid Build Coastguard Worker TEST(liblog, max_payload) {
941*598139dcSAndroid Build Coastguard Worker #ifdef __ANDROID__
942*598139dcSAndroid Build Coastguard Worker   static const char max_payload_tag[] = "TEST_max_payload_and_longish_tag_XXXX";
943*598139dcSAndroid Build Coastguard Worker #define SIZEOF_MAX_PAYLOAD_BUF (LOGGER_ENTRY_MAX_PAYLOAD - sizeof(max_payload_tag) - 1)
944*598139dcSAndroid Build Coastguard Worker 
945*598139dcSAndroid Build Coastguard Worker   pid_t pid = getpid();
946*598139dcSAndroid Build Coastguard Worker   char tag[sizeof(max_payload_tag)];
947*598139dcSAndroid Build Coastguard Worker   memcpy(tag, max_payload_tag, sizeof(tag));
948*598139dcSAndroid Build Coastguard Worker   snprintf(tag + sizeof(tag) - 5, 5, "%04X", pid & 0xFFFF);
949*598139dcSAndroid Build Coastguard Worker 
950*598139dcSAndroid Build Coastguard Worker   auto write_function = [&] {
951*598139dcSAndroid Build Coastguard Worker     LOG_FAILURE_RETRY(
952*598139dcSAndroid Build Coastguard Worker         __android_log_buf_write(LOG_ID_SYSTEM, ANDROID_LOG_INFO, tag, max_payload_buf));
953*598139dcSAndroid Build Coastguard Worker   };
954*598139dcSAndroid Build Coastguard Worker 
955*598139dcSAndroid Build Coastguard Worker   ssize_t max_len = 0;
956*598139dcSAndroid Build Coastguard Worker   auto check_function = [&](log_msg log_msg, bool* found) {
957*598139dcSAndroid Build Coastguard Worker     char* data = log_msg.msg();
958*598139dcSAndroid Build Coastguard Worker 
959*598139dcSAndroid Build Coastguard Worker     if (!data || strcmp(++data, tag)) {
960*598139dcSAndroid Build Coastguard Worker       return;
961*598139dcSAndroid Build Coastguard Worker     }
962*598139dcSAndroid Build Coastguard Worker 
963*598139dcSAndroid Build Coastguard Worker     data += strlen(data) + 1;
964*598139dcSAndroid Build Coastguard Worker 
965*598139dcSAndroid Build Coastguard Worker     const char* left = data;
966*598139dcSAndroid Build Coastguard Worker     const char* right = max_payload_buf;
967*598139dcSAndroid Build Coastguard Worker     while (*left && *right && (*left == *right)) {
968*598139dcSAndroid Build Coastguard Worker       ++left;
969*598139dcSAndroid Build Coastguard Worker       ++right;
970*598139dcSAndroid Build Coastguard Worker     }
971*598139dcSAndroid Build Coastguard Worker 
972*598139dcSAndroid Build Coastguard Worker     if (max_len <= (left - data)) {
973*598139dcSAndroid Build Coastguard Worker       max_len = left - data + 1;
974*598139dcSAndroid Build Coastguard Worker     }
975*598139dcSAndroid Build Coastguard Worker 
976*598139dcSAndroid Build Coastguard Worker     if (max_len > 512) {
977*598139dcSAndroid Build Coastguard Worker       *found = true;
978*598139dcSAndroid Build Coastguard Worker     }
979*598139dcSAndroid Build Coastguard Worker   };
980*598139dcSAndroid Build Coastguard Worker 
981*598139dcSAndroid Build Coastguard Worker   RunLogTests(LOG_ID_SYSTEM, write_function, check_function);
982*598139dcSAndroid Build Coastguard Worker 
983*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(SIZEOF_MAX_PAYLOAD_BUF, static_cast<size_t>(max_len));
984*598139dcSAndroid Build Coastguard Worker #else
985*598139dcSAndroid Build Coastguard Worker   GTEST_LOG_(INFO) << "This test does nothing.\n";
986*598139dcSAndroid Build Coastguard Worker #endif
987*598139dcSAndroid Build Coastguard Worker }
988*598139dcSAndroid Build Coastguard Worker 
TEST(liblog,__android_log_buf_print__maxtag)989*598139dcSAndroid Build Coastguard Worker TEST(liblog, __android_log_buf_print__maxtag) {
990*598139dcSAndroid Build Coastguard Worker #ifdef __ANDROID__
991*598139dcSAndroid Build Coastguard Worker   auto write_function = [&] {
992*598139dcSAndroid Build Coastguard Worker     EXPECT_LT(0, __android_log_buf_print(LOG_ID_MAIN, ANDROID_LOG_INFO, max_payload_buf,
993*598139dcSAndroid Build Coastguard Worker                                          max_payload_buf));
994*598139dcSAndroid Build Coastguard Worker   };
995*598139dcSAndroid Build Coastguard Worker 
996*598139dcSAndroid Build Coastguard Worker   auto check_function = [&](log_msg log_msg, bool* found) {
997*598139dcSAndroid Build Coastguard Worker     if ((size_t)log_msg.entry.len < LOGGER_ENTRY_MAX_PAYLOAD) {
998*598139dcSAndroid Build Coastguard Worker       return;
999*598139dcSAndroid Build Coastguard Worker     }
1000*598139dcSAndroid Build Coastguard Worker 
1001*598139dcSAndroid Build Coastguard Worker     *found = true;
1002*598139dcSAndroid Build Coastguard Worker 
1003*598139dcSAndroid Build Coastguard Worker     AndroidLogFormat* logformat = android_log_format_new();
1004*598139dcSAndroid Build Coastguard Worker     EXPECT_TRUE(NULL != logformat);
1005*598139dcSAndroid Build Coastguard Worker     AndroidLogEntry entry;
1006*598139dcSAndroid Build Coastguard Worker     int processLogBuffer = android_log_processLogBuffer(&log_msg.entry, &entry);
1007*598139dcSAndroid Build Coastguard Worker     EXPECT_EQ(0, processLogBuffer);
1008*598139dcSAndroid Build Coastguard Worker     if (processLogBuffer == 0) {
1009*598139dcSAndroid Build Coastguard Worker       fflush(stderr);
1010*598139dcSAndroid Build Coastguard Worker       int printLogLine = android_log_printLogLine(logformat, stderr, &entry);
1011*598139dcSAndroid Build Coastguard Worker       // Legacy tag truncation
1012*598139dcSAndroid Build Coastguard Worker       EXPECT_LE(128, printLogLine);
1013*598139dcSAndroid Build Coastguard Worker       // Measured maximum if we try to print part of the tag as message
1014*598139dcSAndroid Build Coastguard Worker       EXPECT_GT(LOGGER_ENTRY_MAX_PAYLOAD * 13 / 8, printLogLine);
1015*598139dcSAndroid Build Coastguard Worker     }
1016*598139dcSAndroid Build Coastguard Worker     android_log_format_free(logformat);
1017*598139dcSAndroid Build Coastguard Worker   };
1018*598139dcSAndroid Build Coastguard Worker 
1019*598139dcSAndroid Build Coastguard Worker   RunLogTests(LOG_ID_MAIN, write_function, check_function);
1020*598139dcSAndroid Build Coastguard Worker 
1021*598139dcSAndroid Build Coastguard Worker #else
1022*598139dcSAndroid Build Coastguard Worker   GTEST_LOG_(INFO) << "This test does nothing.\n";
1023*598139dcSAndroid Build Coastguard Worker #endif
1024*598139dcSAndroid Build Coastguard Worker }
1025*598139dcSAndroid Build Coastguard Worker 
1026*598139dcSAndroid Build Coastguard Worker // Note: This test is tautological. android_logger_list_read() calls recv() with
1027*598139dcSAndroid Build Coastguard Worker // LOGGER_ENTRY_MAX_PAYLOAD as its size argument, so it's not possible for this test to read a
1028*598139dcSAndroid Build Coastguard Worker // payload larger than that size.
TEST(liblog,too_big_payload)1029*598139dcSAndroid Build Coastguard Worker TEST(liblog, too_big_payload) {
1030*598139dcSAndroid Build Coastguard Worker #ifdef __ANDROID__
1031*598139dcSAndroid Build Coastguard Worker   pid_t pid = getpid();
1032*598139dcSAndroid Build Coastguard Worker   static const char big_payload_tag[] = "TEST_big_payload_XXXX";
1033*598139dcSAndroid Build Coastguard Worker   char tag[sizeof(big_payload_tag)];
1034*598139dcSAndroid Build Coastguard Worker   memcpy(tag, big_payload_tag, sizeof(tag));
1035*598139dcSAndroid Build Coastguard Worker   snprintf(tag + sizeof(tag) - 5, 5, "%04X", pid & 0xFFFF);
1036*598139dcSAndroid Build Coastguard Worker 
1037*598139dcSAndroid Build Coastguard Worker   std::string longString(3266519, 'x');
1038*598139dcSAndroid Build Coastguard Worker   ssize_t ret;
1039*598139dcSAndroid Build Coastguard Worker 
1040*598139dcSAndroid Build Coastguard Worker   auto write_function = [&] {
1041*598139dcSAndroid Build Coastguard Worker     ret = LOG_FAILURE_RETRY(
1042*598139dcSAndroid Build Coastguard Worker         __android_log_buf_write(LOG_ID_SYSTEM, ANDROID_LOG_INFO, tag, longString.c_str()));
1043*598139dcSAndroid Build Coastguard Worker   };
1044*598139dcSAndroid Build Coastguard Worker 
1045*598139dcSAndroid Build Coastguard Worker   auto check_function = [&](log_msg log_msg, bool* found) {
1046*598139dcSAndroid Build Coastguard Worker     char* data = log_msg.msg();
1047*598139dcSAndroid Build Coastguard Worker 
1048*598139dcSAndroid Build Coastguard Worker     if (!data || strcmp(++data, tag)) {
1049*598139dcSAndroid Build Coastguard Worker       return;
1050*598139dcSAndroid Build Coastguard Worker     }
1051*598139dcSAndroid Build Coastguard Worker 
1052*598139dcSAndroid Build Coastguard Worker     data += strlen(data) + 1;
1053*598139dcSAndroid Build Coastguard Worker 
1054*598139dcSAndroid Build Coastguard Worker     const char* left = data;
1055*598139dcSAndroid Build Coastguard Worker     const char* right = longString.c_str();
1056*598139dcSAndroid Build Coastguard Worker     while (*left && *right && (*left == *right)) {
1057*598139dcSAndroid Build Coastguard Worker       ++left;
1058*598139dcSAndroid Build Coastguard Worker       ++right;
1059*598139dcSAndroid Build Coastguard Worker     }
1060*598139dcSAndroid Build Coastguard Worker 
1061*598139dcSAndroid Build Coastguard Worker     ssize_t len = left - data + 1;
1062*598139dcSAndroid Build Coastguard Worker     // Check that we don't see any entries larger than the max payload.
1063*598139dcSAndroid Build Coastguard Worker     EXPECT_LE(static_cast<size_t>(len), LOGGER_ENTRY_MAX_PAYLOAD - sizeof(big_payload_tag));
1064*598139dcSAndroid Build Coastguard Worker 
1065*598139dcSAndroid Build Coastguard Worker     // Once we've found our expected entry, break.
1066*598139dcSAndroid Build Coastguard Worker     if (len == LOGGER_ENTRY_MAX_PAYLOAD - sizeof(big_payload_tag)) {
1067*598139dcSAndroid Build Coastguard Worker       *found = true;
1068*598139dcSAndroid Build Coastguard Worker     }
1069*598139dcSAndroid Build Coastguard Worker   };
1070*598139dcSAndroid Build Coastguard Worker 
1071*598139dcSAndroid Build Coastguard Worker   RunLogTests(LOG_ID_SYSTEM, write_function, check_function);
1072*598139dcSAndroid Build Coastguard Worker 
1073*598139dcSAndroid Build Coastguard Worker #else
1074*598139dcSAndroid Build Coastguard Worker   GTEST_LOG_(INFO) << "This test does nothing.\n";
1075*598139dcSAndroid Build Coastguard Worker #endif
1076*598139dcSAndroid Build Coastguard Worker }
1077*598139dcSAndroid Build Coastguard Worker 
TEST(liblog,dual_reader)1078*598139dcSAndroid Build Coastguard Worker TEST(liblog, dual_reader) {
1079*598139dcSAndroid Build Coastguard Worker #ifdef __ANDROID__
1080*598139dcSAndroid Build Coastguard Worker   static const int expected_count1 = 25;
1081*598139dcSAndroid Build Coastguard Worker   static const int expected_count2 = 25;
1082*598139dcSAndroid Build Coastguard Worker 
1083*598139dcSAndroid Build Coastguard Worker   pid_t pid = getpid();
1084*598139dcSAndroid Build Coastguard Worker 
1085*598139dcSAndroid Build Coastguard Worker   auto logger_list1 = std::unique_ptr<struct logger_list, ListCloser>{
1086*598139dcSAndroid Build Coastguard Worker       android_logger_list_open(LOG_ID_MAIN, 0, expected_count1, pid)};
1087*598139dcSAndroid Build Coastguard Worker   ASSERT_TRUE(logger_list1);
1088*598139dcSAndroid Build Coastguard Worker 
1089*598139dcSAndroid Build Coastguard Worker   auto logger_list2 = std::unique_ptr<struct logger_list, ListCloser>{
1090*598139dcSAndroid Build Coastguard Worker       android_logger_list_open(LOG_ID_MAIN, 0, expected_count2, pid)};
1091*598139dcSAndroid Build Coastguard Worker   ASSERT_TRUE(logger_list2);
1092*598139dcSAndroid Build Coastguard Worker 
1093*598139dcSAndroid Build Coastguard Worker   for (int i = 25; i > 0; --i) {
1094*598139dcSAndroid Build Coastguard Worker     static const char fmt[] = "dual_reader %02d";
1095*598139dcSAndroid Build Coastguard Worker     char buffer[sizeof(fmt) + 8];
1096*598139dcSAndroid Build Coastguard Worker     snprintf(buffer, sizeof(buffer), fmt, i);
1097*598139dcSAndroid Build Coastguard Worker     LOG_FAILURE_RETRY(__android_log_buf_write(LOG_ID_MAIN, ANDROID_LOG_INFO,
1098*598139dcSAndroid Build Coastguard Worker                                               "liblog", buffer));
1099*598139dcSAndroid Build Coastguard Worker   }
1100*598139dcSAndroid Build Coastguard Worker 
1101*598139dcSAndroid Build Coastguard Worker   alarm(getAlarmSeconds(2));
1102*598139dcSAndroid Build Coastguard Worker   auto alarm_guard = android::base::make_scope_guard([] { alarm(0); });
1103*598139dcSAndroid Build Coastguard Worker 
1104*598139dcSAndroid Build Coastguard Worker   // Wait until we see all messages with the blocking reader.
1105*598139dcSAndroid Build Coastguard Worker   int count1 = 0;
1106*598139dcSAndroid Build Coastguard Worker   int count2 = 0;
1107*598139dcSAndroid Build Coastguard Worker 
1108*598139dcSAndroid Build Coastguard Worker   while (count1 != expected_count2 || count2 != expected_count2) {
1109*598139dcSAndroid Build Coastguard Worker     log_msg log_msg;
1110*598139dcSAndroid Build Coastguard Worker     if (count1 < expected_count1) {
1111*598139dcSAndroid Build Coastguard Worker       ASSERT_GT(android_logger_list_read(logger_list1.get(), &log_msg), 0);
1112*598139dcSAndroid Build Coastguard Worker       count1++;
1113*598139dcSAndroid Build Coastguard Worker     }
1114*598139dcSAndroid Build Coastguard Worker     if (count2 < expected_count2) {
1115*598139dcSAndroid Build Coastguard Worker       ASSERT_GT(android_logger_list_read(logger_list2.get(), &log_msg), 0);
1116*598139dcSAndroid Build Coastguard Worker       count2++;
1117*598139dcSAndroid Build Coastguard Worker     }
1118*598139dcSAndroid Build Coastguard Worker   }
1119*598139dcSAndroid Build Coastguard Worker 
1120*598139dcSAndroid Build Coastguard Worker   // Test again with the nonblocking reader.
1121*598139dcSAndroid Build Coastguard Worker   auto logger_list_non_block1 = std::unique_ptr<struct logger_list, ListCloser>{
1122*598139dcSAndroid Build Coastguard Worker       android_logger_list_open(LOG_ID_MAIN, ANDROID_LOG_NONBLOCK, expected_count1, pid)};
1123*598139dcSAndroid Build Coastguard Worker   ASSERT_TRUE(logger_list_non_block1);
1124*598139dcSAndroid Build Coastguard Worker 
1125*598139dcSAndroid Build Coastguard Worker   auto logger_list_non_block2 = std::unique_ptr<struct logger_list, ListCloser>{
1126*598139dcSAndroid Build Coastguard Worker       android_logger_list_open(LOG_ID_MAIN, ANDROID_LOG_NONBLOCK, expected_count2, pid)};
1127*598139dcSAndroid Build Coastguard Worker   ASSERT_TRUE(logger_list_non_block2);
1128*598139dcSAndroid Build Coastguard Worker   count1 = 0;
1129*598139dcSAndroid Build Coastguard Worker   count2 = 0;
1130*598139dcSAndroid Build Coastguard Worker   bool done1 = false;
1131*598139dcSAndroid Build Coastguard Worker   bool done2 = false;
1132*598139dcSAndroid Build Coastguard Worker 
1133*598139dcSAndroid Build Coastguard Worker   while (!done1 || !done2) {
1134*598139dcSAndroid Build Coastguard Worker     log_msg log_msg;
1135*598139dcSAndroid Build Coastguard Worker 
1136*598139dcSAndroid Build Coastguard Worker     if (!done1) {
1137*598139dcSAndroid Build Coastguard Worker       if (android_logger_list_read(logger_list_non_block1.get(), &log_msg) <= 0) {
1138*598139dcSAndroid Build Coastguard Worker         done1 = true;
1139*598139dcSAndroid Build Coastguard Worker       } else {
1140*598139dcSAndroid Build Coastguard Worker         ++count1;
1141*598139dcSAndroid Build Coastguard Worker       }
1142*598139dcSAndroid Build Coastguard Worker     }
1143*598139dcSAndroid Build Coastguard Worker 
1144*598139dcSAndroid Build Coastguard Worker     if (!done2) {
1145*598139dcSAndroid Build Coastguard Worker       if (android_logger_list_read(logger_list_non_block2.get(), &log_msg) <= 0) {
1146*598139dcSAndroid Build Coastguard Worker         done2 = true;
1147*598139dcSAndroid Build Coastguard Worker       } else {
1148*598139dcSAndroid Build Coastguard Worker         ++count2;
1149*598139dcSAndroid Build Coastguard Worker       }
1150*598139dcSAndroid Build Coastguard Worker     }
1151*598139dcSAndroid Build Coastguard Worker   }
1152*598139dcSAndroid Build Coastguard Worker 
1153*598139dcSAndroid Build Coastguard Worker   EXPECT_EQ(expected_count1, count1);
1154*598139dcSAndroid Build Coastguard Worker   EXPECT_EQ(expected_count2, count2);
1155*598139dcSAndroid Build Coastguard Worker #else
1156*598139dcSAndroid Build Coastguard Worker   GTEST_LOG_(INFO) << "This test does nothing.\n";
1157*598139dcSAndroid Build Coastguard Worker #endif
1158*598139dcSAndroid Build Coastguard Worker }
1159*598139dcSAndroid Build Coastguard Worker 
checkPriForTag(AndroidLogFormat * p_format,const char * tag,android_LogPriority pri)1160*598139dcSAndroid Build Coastguard Worker static bool checkPriForTag(AndroidLogFormat* p_format, const char* tag,
1161*598139dcSAndroid Build Coastguard Worker                            android_LogPriority pri) {
1162*598139dcSAndroid Build Coastguard Worker   return android_log_shouldPrintLine(p_format, tag, pri) &&
1163*598139dcSAndroid Build Coastguard Worker          !android_log_shouldPrintLine(p_format, tag,
1164*598139dcSAndroid Build Coastguard Worker                                       (android_LogPriority)(pri - 1));
1165*598139dcSAndroid Build Coastguard Worker }
1166*598139dcSAndroid Build Coastguard Worker 
TEST(liblog,filterRule)1167*598139dcSAndroid Build Coastguard Worker TEST(liblog, filterRule) {
1168*598139dcSAndroid Build Coastguard Worker   static const char tag[] = "random";
1169*598139dcSAndroid Build Coastguard Worker 
1170*598139dcSAndroid Build Coastguard Worker   AndroidLogFormat* p_format = android_log_format_new();
1171*598139dcSAndroid Build Coastguard Worker 
1172*598139dcSAndroid Build Coastguard Worker   android_log_addFilterRule(p_format, "*:i");
1173*598139dcSAndroid Build Coastguard Worker 
1174*598139dcSAndroid Build Coastguard Worker   EXPECT_TRUE(checkPriForTag(p_format, tag, ANDROID_LOG_INFO));
1175*598139dcSAndroid Build Coastguard Worker   EXPECT_TRUE(android_log_shouldPrintLine(p_format, tag, ANDROID_LOG_DEBUG) ==
1176*598139dcSAndroid Build Coastguard Worker               0);
1177*598139dcSAndroid Build Coastguard Worker   android_log_addFilterRule(p_format, "*");
1178*598139dcSAndroid Build Coastguard Worker   EXPECT_TRUE(checkPriForTag(p_format, tag, ANDROID_LOG_DEBUG));
1179*598139dcSAndroid Build Coastguard Worker   EXPECT_TRUE(android_log_shouldPrintLine(p_format, tag, ANDROID_LOG_DEBUG) > 0);
1180*598139dcSAndroid Build Coastguard Worker   android_log_addFilterRule(p_format, "*:v");
1181*598139dcSAndroid Build Coastguard Worker   EXPECT_TRUE(checkPriForTag(p_format, tag, ANDROID_LOG_VERBOSE));
1182*598139dcSAndroid Build Coastguard Worker   EXPECT_TRUE(android_log_shouldPrintLine(p_format, tag, ANDROID_LOG_DEBUG) > 0);
1183*598139dcSAndroid Build Coastguard Worker   android_log_addFilterRule(p_format, "*:i");
1184*598139dcSAndroid Build Coastguard Worker   EXPECT_TRUE(checkPriForTag(p_format, tag, ANDROID_LOG_INFO));
1185*598139dcSAndroid Build Coastguard Worker   EXPECT_TRUE(android_log_shouldPrintLine(p_format, tag, ANDROID_LOG_DEBUG) ==
1186*598139dcSAndroid Build Coastguard Worker               0);
1187*598139dcSAndroid Build Coastguard Worker 
1188*598139dcSAndroid Build Coastguard Worker   android_log_addFilterRule(p_format, tag);
1189*598139dcSAndroid Build Coastguard Worker   EXPECT_TRUE(checkPriForTag(p_format, tag, ANDROID_LOG_VERBOSE));
1190*598139dcSAndroid Build Coastguard Worker   EXPECT_TRUE(android_log_shouldPrintLine(p_format, tag, ANDROID_LOG_DEBUG) > 0);
1191*598139dcSAndroid Build Coastguard Worker   android_log_addFilterRule(p_format, "random:v");
1192*598139dcSAndroid Build Coastguard Worker   EXPECT_TRUE(checkPriForTag(p_format, tag, ANDROID_LOG_VERBOSE));
1193*598139dcSAndroid Build Coastguard Worker   EXPECT_TRUE(android_log_shouldPrintLine(p_format, tag, ANDROID_LOG_DEBUG) > 0);
1194*598139dcSAndroid Build Coastguard Worker   android_log_addFilterRule(p_format, "random:d");
1195*598139dcSAndroid Build Coastguard Worker   EXPECT_TRUE(checkPriForTag(p_format, tag, ANDROID_LOG_DEBUG));
1196*598139dcSAndroid Build Coastguard Worker   EXPECT_TRUE(android_log_shouldPrintLine(p_format, tag, ANDROID_LOG_DEBUG) > 0);
1197*598139dcSAndroid Build Coastguard Worker   android_log_addFilterRule(p_format, "random:w");
1198*598139dcSAndroid Build Coastguard Worker   EXPECT_TRUE(checkPriForTag(p_format, tag, ANDROID_LOG_WARN));
1199*598139dcSAndroid Build Coastguard Worker   EXPECT_TRUE(android_log_shouldPrintLine(p_format, tag, ANDROID_LOG_DEBUG) ==
1200*598139dcSAndroid Build Coastguard Worker               0);
1201*598139dcSAndroid Build Coastguard Worker 
1202*598139dcSAndroid Build Coastguard Worker   android_log_addFilterRule(p_format, "crap:*");
1203*598139dcSAndroid Build Coastguard Worker   EXPECT_TRUE(checkPriForTag(p_format, "crap", ANDROID_LOG_VERBOSE));
1204*598139dcSAndroid Build Coastguard Worker   EXPECT_TRUE(
1205*598139dcSAndroid Build Coastguard Worker       android_log_shouldPrintLine(p_format, "crap", ANDROID_LOG_VERBOSE) > 0);
1206*598139dcSAndroid Build Coastguard Worker 
1207*598139dcSAndroid Build Coastguard Worker   // invalid expression
1208*598139dcSAndroid Build Coastguard Worker   EXPECT_TRUE(android_log_addFilterRule(p_format, "random:z") < 0);
1209*598139dcSAndroid Build Coastguard Worker   EXPECT_TRUE(checkPriForTag(p_format, tag, ANDROID_LOG_WARN));
1210*598139dcSAndroid Build Coastguard Worker   EXPECT_TRUE(android_log_shouldPrintLine(p_format, tag, ANDROID_LOG_DEBUG) ==
1211*598139dcSAndroid Build Coastguard Worker               0);
1212*598139dcSAndroid Build Coastguard Worker 
1213*598139dcSAndroid Build Coastguard Worker   // Issue #550946
1214*598139dcSAndroid Build Coastguard Worker   EXPECT_TRUE(android_log_addFilterString(p_format, " ") == 0);
1215*598139dcSAndroid Build Coastguard Worker   EXPECT_TRUE(checkPriForTag(p_format, tag, ANDROID_LOG_WARN));
1216*598139dcSAndroid Build Coastguard Worker 
1217*598139dcSAndroid Build Coastguard Worker   // note trailing space
1218*598139dcSAndroid Build Coastguard Worker   EXPECT_TRUE(android_log_addFilterString(p_format, "*:s random:d ") == 0);
1219*598139dcSAndroid Build Coastguard Worker   EXPECT_TRUE(checkPriForTag(p_format, tag, ANDROID_LOG_DEBUG));
1220*598139dcSAndroid Build Coastguard Worker 
1221*598139dcSAndroid Build Coastguard Worker   EXPECT_TRUE(android_log_addFilterString(p_format, "*:s random:z") < 0);
1222*598139dcSAndroid Build Coastguard Worker 
1223*598139dcSAndroid Build Coastguard Worker #if 0  // bitrot, seek update
1224*598139dcSAndroid Build Coastguard Worker     char defaultBuffer[512];
1225*598139dcSAndroid Build Coastguard Worker 
1226*598139dcSAndroid Build Coastguard Worker     android_log_formatLogLine(p_format,
1227*598139dcSAndroid Build Coastguard Worker         defaultBuffer, sizeof(defaultBuffer), 0, ANDROID_LOG_ERROR, 123,
1228*598139dcSAndroid Build Coastguard Worker         123, 123, tag, "nofile", strlen("Hello"), "Hello", NULL);
1229*598139dcSAndroid Build Coastguard Worker 
1230*598139dcSAndroid Build Coastguard Worker     fprintf(stderr, "%s\n", defaultBuffer);
1231*598139dcSAndroid Build Coastguard Worker #endif
1232*598139dcSAndroid Build Coastguard Worker 
1233*598139dcSAndroid Build Coastguard Worker   android_log_format_free(p_format);
1234*598139dcSAndroid Build Coastguard Worker }
1235*598139dcSAndroid Build Coastguard Worker 
1236*598139dcSAndroid Build Coastguard Worker #ifdef ENABLE_FLAKY_TESTS
TEST(liblog,is_loggable)1237*598139dcSAndroid Build Coastguard Worker TEST(liblog, is_loggable) {
1238*598139dcSAndroid Build Coastguard Worker #ifdef __ANDROID__
1239*598139dcSAndroid Build Coastguard Worker   static const char tag[] = "is_loggable";
1240*598139dcSAndroid Build Coastguard Worker   static const char log_namespace[] = "persist.log.tag.";
1241*598139dcSAndroid Build Coastguard Worker   static const size_t base_offset = 8; /* skip "persist." */
1242*598139dcSAndroid Build Coastguard Worker   // sizeof("string") = strlen("string") + 1
1243*598139dcSAndroid Build Coastguard Worker   char key[sizeof(log_namespace) + sizeof(tag) - 1];
1244*598139dcSAndroid Build Coastguard Worker   char hold[4][PROP_VALUE_MAX] = {};
1245*598139dcSAndroid Build Coastguard Worker   static const struct {
1246*598139dcSAndroid Build Coastguard Worker     int level;
1247*598139dcSAndroid Build Coastguard Worker     char type;
1248*598139dcSAndroid Build Coastguard Worker   } levels[] = {
1249*598139dcSAndroid Build Coastguard Worker       {ANDROID_LOG_VERBOSE, 'v'}, {ANDROID_LOG_DEBUG, 'd'},
1250*598139dcSAndroid Build Coastguard Worker       {ANDROID_LOG_INFO, 'i'},    {ANDROID_LOG_WARN, 'w'},
1251*598139dcSAndroid Build Coastguard Worker       {ANDROID_LOG_ERROR, 'e'},   {ANDROID_LOG_FATAL, 'a'},
1252*598139dcSAndroid Build Coastguard Worker       {ANDROID_LOG_SILENT, 's'},  {-2, 'g'},  // Illegal value, resort to default
1253*598139dcSAndroid Build Coastguard Worker   };
1254*598139dcSAndroid Build Coastguard Worker 
1255*598139dcSAndroid Build Coastguard Worker   // Set up initial test condition
1256*598139dcSAndroid Build Coastguard Worker   snprintf(key, sizeof(key), "%s%s", log_namespace, tag);
1257*598139dcSAndroid Build Coastguard Worker   property_get(key, hold[0], "");
1258*598139dcSAndroid Build Coastguard Worker   property_set(key, "");
1259*598139dcSAndroid Build Coastguard Worker   property_get(key + base_offset, hold[1], "");
1260*598139dcSAndroid Build Coastguard Worker   property_set(key + base_offset, "");
1261*598139dcSAndroid Build Coastguard Worker   strcpy(key, log_namespace);
1262*598139dcSAndroid Build Coastguard Worker   key[sizeof(log_namespace) - 2] = '\0';
1263*598139dcSAndroid Build Coastguard Worker   property_get(key, hold[2], "");
1264*598139dcSAndroid Build Coastguard Worker   property_set(key, "");
1265*598139dcSAndroid Build Coastguard Worker   property_get(key, hold[3], "");
1266*598139dcSAndroid Build Coastguard Worker   property_set(key + base_offset, "");
1267*598139dcSAndroid Build Coastguard Worker 
1268*598139dcSAndroid Build Coastguard Worker   // All combinations of level and defaults
1269*598139dcSAndroid Build Coastguard Worker   for (size_t i = 0; i < (sizeof(levels) / sizeof(levels[0])); ++i) {
1270*598139dcSAndroid Build Coastguard Worker     if (levels[i].level == -2) {
1271*598139dcSAndroid Build Coastguard Worker       continue;
1272*598139dcSAndroid Build Coastguard Worker     }
1273*598139dcSAndroid Build Coastguard Worker     for (size_t j = 0; j < (sizeof(levels) / sizeof(levels[0])); ++j) {
1274*598139dcSAndroid Build Coastguard Worker       if (levels[j].level == -2) {
1275*598139dcSAndroid Build Coastguard Worker         continue;
1276*598139dcSAndroid Build Coastguard Worker       }
1277*598139dcSAndroid Build Coastguard Worker       fprintf(stderr, "i=%zu j=%zu\r", i, j);
1278*598139dcSAndroid Build Coastguard Worker       bool android_log_is_loggable = __android_log_is_loggable_len(
1279*598139dcSAndroid Build Coastguard Worker           levels[i].level, tag, strlen(tag), levels[j].level);
1280*598139dcSAndroid Build Coastguard Worker       if ((levels[i].level < levels[j].level) || (levels[j].level == -1)) {
1281*598139dcSAndroid Build Coastguard Worker         if (android_log_is_loggable) {
1282*598139dcSAndroid Build Coastguard Worker           fprintf(stderr, "\n");
1283*598139dcSAndroid Build Coastguard Worker         }
1284*598139dcSAndroid Build Coastguard Worker         EXPECT_FALSE(android_log_is_loggable);
1285*598139dcSAndroid Build Coastguard Worker         for (size_t k = 10; k; --k) {
1286*598139dcSAndroid Build Coastguard Worker           EXPECT_FALSE(__android_log_is_loggable_len(
1287*598139dcSAndroid Build Coastguard Worker               levels[i].level, tag, strlen(tag), levels[j].level));
1288*598139dcSAndroid Build Coastguard Worker         }
1289*598139dcSAndroid Build Coastguard Worker       } else {
1290*598139dcSAndroid Build Coastguard Worker         if (!android_log_is_loggable) {
1291*598139dcSAndroid Build Coastguard Worker           fprintf(stderr, "\n");
1292*598139dcSAndroid Build Coastguard Worker         }
1293*598139dcSAndroid Build Coastguard Worker         EXPECT_TRUE(android_log_is_loggable);
1294*598139dcSAndroid Build Coastguard Worker         for (size_t k = 10; k; --k) {
1295*598139dcSAndroid Build Coastguard Worker           EXPECT_TRUE(__android_log_is_loggable_len(
1296*598139dcSAndroid Build Coastguard Worker               levels[i].level, tag, strlen(tag), levels[j].level));
1297*598139dcSAndroid Build Coastguard Worker         }
1298*598139dcSAndroid Build Coastguard Worker       }
1299*598139dcSAndroid Build Coastguard Worker     }
1300*598139dcSAndroid Build Coastguard Worker   }
1301*598139dcSAndroid Build Coastguard Worker 
1302*598139dcSAndroid Build Coastguard Worker   // All combinations of level and tag and global properties
1303*598139dcSAndroid Build Coastguard Worker   for (size_t i = 0; i < (sizeof(levels) / sizeof(levels[0])); ++i) {
1304*598139dcSAndroid Build Coastguard Worker     if (levels[i].level == -2) {
1305*598139dcSAndroid Build Coastguard Worker       continue;
1306*598139dcSAndroid Build Coastguard Worker     }
1307*598139dcSAndroid Build Coastguard Worker     for (size_t j = 0; j < (sizeof(levels) / sizeof(levels[0])); ++j) {
1308*598139dcSAndroid Build Coastguard Worker       char buf[2];
1309*598139dcSAndroid Build Coastguard Worker       buf[0] = levels[j].type;
1310*598139dcSAndroid Build Coastguard Worker       buf[1] = '\0';
1311*598139dcSAndroid Build Coastguard Worker 
1312*598139dcSAndroid Build Coastguard Worker       snprintf(key, sizeof(key), "%s%s", log_namespace, tag);
1313*598139dcSAndroid Build Coastguard Worker       fprintf(stderr, "i=%zu j=%zu property_set(\"%s\",\"%s\")\r", i, j, key,
1314*598139dcSAndroid Build Coastguard Worker               buf);
1315*598139dcSAndroid Build Coastguard Worker       usleep(20000);
1316*598139dcSAndroid Build Coastguard Worker       property_set(key, buf);
1317*598139dcSAndroid Build Coastguard Worker       bool android_log_is_loggable = __android_log_is_loggable_len(
1318*598139dcSAndroid Build Coastguard Worker           levels[i].level, tag, strlen(tag), ANDROID_LOG_DEBUG);
1319*598139dcSAndroid Build Coastguard Worker       if ((levels[i].level < levels[j].level) || (levels[j].level == -1) ||
1320*598139dcSAndroid Build Coastguard Worker           ((levels[i].level < ANDROID_LOG_DEBUG) && (levels[j].level == -2))) {
1321*598139dcSAndroid Build Coastguard Worker         if (android_log_is_loggable) {
1322*598139dcSAndroid Build Coastguard Worker           fprintf(stderr, "\n");
1323*598139dcSAndroid Build Coastguard Worker         }
1324*598139dcSAndroid Build Coastguard Worker         EXPECT_FALSE(android_log_is_loggable);
1325*598139dcSAndroid Build Coastguard Worker         for (size_t k = 10; k; --k) {
1326*598139dcSAndroid Build Coastguard Worker           EXPECT_FALSE(__android_log_is_loggable_len(
1327*598139dcSAndroid Build Coastguard Worker               levels[i].level, tag, strlen(tag), ANDROID_LOG_DEBUG));
1328*598139dcSAndroid Build Coastguard Worker         }
1329*598139dcSAndroid Build Coastguard Worker       } else {
1330*598139dcSAndroid Build Coastguard Worker         if (!android_log_is_loggable) {
1331*598139dcSAndroid Build Coastguard Worker           fprintf(stderr, "\n");
1332*598139dcSAndroid Build Coastguard Worker         }
1333*598139dcSAndroid Build Coastguard Worker         EXPECT_TRUE(android_log_is_loggable);
1334*598139dcSAndroid Build Coastguard Worker         for (size_t k = 10; k; --k) {
1335*598139dcSAndroid Build Coastguard Worker           EXPECT_TRUE(__android_log_is_loggable_len(
1336*598139dcSAndroid Build Coastguard Worker               levels[i].level, tag, strlen(tag), ANDROID_LOG_DEBUG));
1337*598139dcSAndroid Build Coastguard Worker         }
1338*598139dcSAndroid Build Coastguard Worker       }
1339*598139dcSAndroid Build Coastguard Worker       usleep(20000);
1340*598139dcSAndroid Build Coastguard Worker       property_set(key, "");
1341*598139dcSAndroid Build Coastguard Worker 
1342*598139dcSAndroid Build Coastguard Worker       fprintf(stderr, "i=%zu j=%zu property_set(\"%s\",\"%s\")\r", i, j,
1343*598139dcSAndroid Build Coastguard Worker               key + base_offset, buf);
1344*598139dcSAndroid Build Coastguard Worker       property_set(key + base_offset, buf);
1345*598139dcSAndroid Build Coastguard Worker       android_log_is_loggable = __android_log_is_loggable_len(
1346*598139dcSAndroid Build Coastguard Worker           levels[i].level, tag, strlen(tag), ANDROID_LOG_DEBUG);
1347*598139dcSAndroid Build Coastguard Worker       if ((levels[i].level < levels[j].level) || (levels[j].level == -1) ||
1348*598139dcSAndroid Build Coastguard Worker           ((levels[i].level < ANDROID_LOG_DEBUG) && (levels[j].level == -2))) {
1349*598139dcSAndroid Build Coastguard Worker         if (android_log_is_loggable) {
1350*598139dcSAndroid Build Coastguard Worker           fprintf(stderr, "\n");
1351*598139dcSAndroid Build Coastguard Worker         }
1352*598139dcSAndroid Build Coastguard Worker         EXPECT_FALSE(android_log_is_loggable);
1353*598139dcSAndroid Build Coastguard Worker         for (size_t k = 10; k; --k) {
1354*598139dcSAndroid Build Coastguard Worker           EXPECT_FALSE(__android_log_is_loggable_len(
1355*598139dcSAndroid Build Coastguard Worker               levels[i].level, tag, strlen(tag), ANDROID_LOG_DEBUG));
1356*598139dcSAndroid Build Coastguard Worker         }
1357*598139dcSAndroid Build Coastguard Worker       } else {
1358*598139dcSAndroid Build Coastguard Worker         if (!android_log_is_loggable) {
1359*598139dcSAndroid Build Coastguard Worker           fprintf(stderr, "\n");
1360*598139dcSAndroid Build Coastguard Worker         }
1361*598139dcSAndroid Build Coastguard Worker         EXPECT_TRUE(android_log_is_loggable);
1362*598139dcSAndroid Build Coastguard Worker         for (size_t k = 10; k; --k) {
1363*598139dcSAndroid Build Coastguard Worker           EXPECT_TRUE(__android_log_is_loggable_len(
1364*598139dcSAndroid Build Coastguard Worker               levels[i].level, tag, strlen(tag), ANDROID_LOG_DEBUG));
1365*598139dcSAndroid Build Coastguard Worker         }
1366*598139dcSAndroid Build Coastguard Worker       }
1367*598139dcSAndroid Build Coastguard Worker       usleep(20000);
1368*598139dcSAndroid Build Coastguard Worker       property_set(key + base_offset, "");
1369*598139dcSAndroid Build Coastguard Worker 
1370*598139dcSAndroid Build Coastguard Worker       strcpy(key, log_namespace);
1371*598139dcSAndroid Build Coastguard Worker       key[sizeof(log_namespace) - 2] = '\0';
1372*598139dcSAndroid Build Coastguard Worker       fprintf(stderr, "i=%zu j=%zu property_set(\"%s\",\"%s\")\r", i, j, key,
1373*598139dcSAndroid Build Coastguard Worker               buf);
1374*598139dcSAndroid Build Coastguard Worker       property_set(key, buf);
1375*598139dcSAndroid Build Coastguard Worker       android_log_is_loggable = __android_log_is_loggable_len(
1376*598139dcSAndroid Build Coastguard Worker           levels[i].level, tag, strlen(tag), ANDROID_LOG_DEBUG);
1377*598139dcSAndroid Build Coastguard Worker       if ((levels[i].level < levels[j].level) || (levels[j].level == -1) ||
1378*598139dcSAndroid Build Coastguard Worker           ((levels[i].level < ANDROID_LOG_DEBUG) && (levels[j].level == -2))) {
1379*598139dcSAndroid Build Coastguard Worker         if (android_log_is_loggable) {
1380*598139dcSAndroid Build Coastguard Worker           fprintf(stderr, "\n");
1381*598139dcSAndroid Build Coastguard Worker         }
1382*598139dcSAndroid Build Coastguard Worker         EXPECT_FALSE(android_log_is_loggable);
1383*598139dcSAndroid Build Coastguard Worker         for (size_t k = 10; k; --k) {
1384*598139dcSAndroid Build Coastguard Worker           EXPECT_FALSE(__android_log_is_loggable_len(
1385*598139dcSAndroid Build Coastguard Worker               levels[i].level, tag, strlen(tag), ANDROID_LOG_DEBUG));
1386*598139dcSAndroid Build Coastguard Worker         }
1387*598139dcSAndroid Build Coastguard Worker       } else {
1388*598139dcSAndroid Build Coastguard Worker         if (!android_log_is_loggable) {
1389*598139dcSAndroid Build Coastguard Worker           fprintf(stderr, "\n");
1390*598139dcSAndroid Build Coastguard Worker         }
1391*598139dcSAndroid Build Coastguard Worker         EXPECT_TRUE(android_log_is_loggable);
1392*598139dcSAndroid Build Coastguard Worker         for (size_t k = 10; k; --k) {
1393*598139dcSAndroid Build Coastguard Worker           EXPECT_TRUE(__android_log_is_loggable_len(
1394*598139dcSAndroid Build Coastguard Worker               levels[i].level, tag, strlen(tag), ANDROID_LOG_DEBUG));
1395*598139dcSAndroid Build Coastguard Worker         }
1396*598139dcSAndroid Build Coastguard Worker       }
1397*598139dcSAndroid Build Coastguard Worker       usleep(20000);
1398*598139dcSAndroid Build Coastguard Worker       property_set(key, "");
1399*598139dcSAndroid Build Coastguard Worker 
1400*598139dcSAndroid Build Coastguard Worker       fprintf(stderr, "i=%zu j=%zu property_set(\"%s\",\"%s\")\r", i, j,
1401*598139dcSAndroid Build Coastguard Worker               key + base_offset, buf);
1402*598139dcSAndroid Build Coastguard Worker       property_set(key + base_offset, buf);
1403*598139dcSAndroid Build Coastguard Worker       android_log_is_loggable = __android_log_is_loggable_len(
1404*598139dcSAndroid Build Coastguard Worker           levels[i].level, tag, strlen(tag), ANDROID_LOG_DEBUG);
1405*598139dcSAndroid Build Coastguard Worker       if ((levels[i].level < levels[j].level) || (levels[j].level == -1) ||
1406*598139dcSAndroid Build Coastguard Worker           ((levels[i].level < ANDROID_LOG_DEBUG) && (levels[j].level == -2))) {
1407*598139dcSAndroid Build Coastguard Worker         if (android_log_is_loggable) {
1408*598139dcSAndroid Build Coastguard Worker           fprintf(stderr, "\n");
1409*598139dcSAndroid Build Coastguard Worker         }
1410*598139dcSAndroid Build Coastguard Worker         EXPECT_FALSE(android_log_is_loggable);
1411*598139dcSAndroid Build Coastguard Worker         for (size_t k = 10; k; --k) {
1412*598139dcSAndroid Build Coastguard Worker           EXPECT_FALSE(__android_log_is_loggable_len(
1413*598139dcSAndroid Build Coastguard Worker               levels[i].level, tag, strlen(tag), ANDROID_LOG_DEBUG));
1414*598139dcSAndroid Build Coastguard Worker         }
1415*598139dcSAndroid Build Coastguard Worker       } else {
1416*598139dcSAndroid Build Coastguard Worker         if (!android_log_is_loggable) {
1417*598139dcSAndroid Build Coastguard Worker           fprintf(stderr, "\n");
1418*598139dcSAndroid Build Coastguard Worker         }
1419*598139dcSAndroid Build Coastguard Worker         EXPECT_TRUE(android_log_is_loggable);
1420*598139dcSAndroid Build Coastguard Worker         for (size_t k = 10; k; --k) {
1421*598139dcSAndroid Build Coastguard Worker           EXPECT_TRUE(__android_log_is_loggable_len(
1422*598139dcSAndroid Build Coastguard Worker               levels[i].level, tag, strlen(tag), ANDROID_LOG_DEBUG));
1423*598139dcSAndroid Build Coastguard Worker         }
1424*598139dcSAndroid Build Coastguard Worker       }
1425*598139dcSAndroid Build Coastguard Worker       usleep(20000);
1426*598139dcSAndroid Build Coastguard Worker       property_set(key + base_offset, "");
1427*598139dcSAndroid Build Coastguard Worker     }
1428*598139dcSAndroid Build Coastguard Worker   }
1429*598139dcSAndroid Build Coastguard Worker 
1430*598139dcSAndroid Build Coastguard Worker   // All combinations of level and tag properties, but with global set to INFO
1431*598139dcSAndroid Build Coastguard Worker   strcpy(key, log_namespace);
1432*598139dcSAndroid Build Coastguard Worker   key[sizeof(log_namespace) - 2] = '\0';
1433*598139dcSAndroid Build Coastguard Worker   usleep(20000);
1434*598139dcSAndroid Build Coastguard Worker   property_set(key, "I");
1435*598139dcSAndroid Build Coastguard Worker   snprintf(key, sizeof(key), "%s%s", log_namespace, tag);
1436*598139dcSAndroid Build Coastguard Worker   for (size_t i = 0; i < (sizeof(levels) / sizeof(levels[0])); ++i) {
1437*598139dcSAndroid Build Coastguard Worker     if (levels[i].level == -2) {
1438*598139dcSAndroid Build Coastguard Worker       continue;
1439*598139dcSAndroid Build Coastguard Worker     }
1440*598139dcSAndroid Build Coastguard Worker     for (size_t j = 0; j < (sizeof(levels) / sizeof(levels[0])); ++j) {
1441*598139dcSAndroid Build Coastguard Worker       char buf[2];
1442*598139dcSAndroid Build Coastguard Worker       buf[0] = levels[j].type;
1443*598139dcSAndroid Build Coastguard Worker       buf[1] = '\0';
1444*598139dcSAndroid Build Coastguard Worker 
1445*598139dcSAndroid Build Coastguard Worker       fprintf(stderr, "i=%zu j=%zu property_set(\"%s\",\"%s\")\r", i, j, key,
1446*598139dcSAndroid Build Coastguard Worker               buf);
1447*598139dcSAndroid Build Coastguard Worker       usleep(20000);
1448*598139dcSAndroid Build Coastguard Worker       property_set(key, buf);
1449*598139dcSAndroid Build Coastguard Worker       bool android_log_is_loggable = __android_log_is_loggable_len(
1450*598139dcSAndroid Build Coastguard Worker           levels[i].level, tag, strlen(tag), ANDROID_LOG_DEBUG);
1451*598139dcSAndroid Build Coastguard Worker       if ((levels[i].level < levels[j].level) || (levels[j].level == -1) ||
1452*598139dcSAndroid Build Coastguard Worker           ((levels[i].level < ANDROID_LOG_INFO)  // Yes INFO
1453*598139dcSAndroid Build Coastguard Worker            && (levels[j].level == -2))) {
1454*598139dcSAndroid Build Coastguard Worker         if (android_log_is_loggable) {
1455*598139dcSAndroid Build Coastguard Worker           fprintf(stderr, "\n");
1456*598139dcSAndroid Build Coastguard Worker         }
1457*598139dcSAndroid Build Coastguard Worker         EXPECT_FALSE(android_log_is_loggable);
1458*598139dcSAndroid Build Coastguard Worker         for (size_t k = 10; k; --k) {
1459*598139dcSAndroid Build Coastguard Worker           EXPECT_FALSE(__android_log_is_loggable_len(
1460*598139dcSAndroid Build Coastguard Worker               levels[i].level, tag, strlen(tag), ANDROID_LOG_DEBUG));
1461*598139dcSAndroid Build Coastguard Worker         }
1462*598139dcSAndroid Build Coastguard Worker       } else {
1463*598139dcSAndroid Build Coastguard Worker         if (!android_log_is_loggable) {
1464*598139dcSAndroid Build Coastguard Worker           fprintf(stderr, "\n");
1465*598139dcSAndroid Build Coastguard Worker         }
1466*598139dcSAndroid Build Coastguard Worker         EXPECT_TRUE(android_log_is_loggable);
1467*598139dcSAndroid Build Coastguard Worker         for (size_t k = 10; k; --k) {
1468*598139dcSAndroid Build Coastguard Worker           EXPECT_TRUE(__android_log_is_loggable_len(
1469*598139dcSAndroid Build Coastguard Worker               levels[i].level, tag, strlen(tag), ANDROID_LOG_DEBUG));
1470*598139dcSAndroid Build Coastguard Worker         }
1471*598139dcSAndroid Build Coastguard Worker       }
1472*598139dcSAndroid Build Coastguard Worker       usleep(20000);
1473*598139dcSAndroid Build Coastguard Worker       property_set(key, "");
1474*598139dcSAndroid Build Coastguard Worker 
1475*598139dcSAndroid Build Coastguard Worker       fprintf(stderr, "i=%zu j=%zu property_set(\"%s\",\"%s\")\r", i, j,
1476*598139dcSAndroid Build Coastguard Worker               key + base_offset, buf);
1477*598139dcSAndroid Build Coastguard Worker       property_set(key + base_offset, buf);
1478*598139dcSAndroid Build Coastguard Worker       android_log_is_loggable = __android_log_is_loggable_len(
1479*598139dcSAndroid Build Coastguard Worker           levels[i].level, tag, strlen(tag), ANDROID_LOG_DEBUG);
1480*598139dcSAndroid Build Coastguard Worker       if ((levels[i].level < levels[j].level) || (levels[j].level == -1) ||
1481*598139dcSAndroid Build Coastguard Worker           ((levels[i].level < ANDROID_LOG_INFO)  // Yes INFO
1482*598139dcSAndroid Build Coastguard Worker            && (levels[j].level == -2))) {
1483*598139dcSAndroid Build Coastguard Worker         if (android_log_is_loggable) {
1484*598139dcSAndroid Build Coastguard Worker           fprintf(stderr, "\n");
1485*598139dcSAndroid Build Coastguard Worker         }
1486*598139dcSAndroid Build Coastguard Worker         EXPECT_FALSE(android_log_is_loggable);
1487*598139dcSAndroid Build Coastguard Worker         for (size_t k = 10; k; --k) {
1488*598139dcSAndroid Build Coastguard Worker           EXPECT_FALSE(__android_log_is_loggable_len(
1489*598139dcSAndroid Build Coastguard Worker               levels[i].level, tag, strlen(tag), ANDROID_LOG_DEBUG));
1490*598139dcSAndroid Build Coastguard Worker         }
1491*598139dcSAndroid Build Coastguard Worker       } else {
1492*598139dcSAndroid Build Coastguard Worker         if (!android_log_is_loggable) {
1493*598139dcSAndroid Build Coastguard Worker           fprintf(stderr, "\n");
1494*598139dcSAndroid Build Coastguard Worker         }
1495*598139dcSAndroid Build Coastguard Worker         EXPECT_TRUE(android_log_is_loggable);
1496*598139dcSAndroid Build Coastguard Worker         for (size_t k = 10; k; --k) {
1497*598139dcSAndroid Build Coastguard Worker           EXPECT_TRUE(__android_log_is_loggable_len(
1498*598139dcSAndroid Build Coastguard Worker               levels[i].level, tag, strlen(tag), ANDROID_LOG_DEBUG));
1499*598139dcSAndroid Build Coastguard Worker         }
1500*598139dcSAndroid Build Coastguard Worker       }
1501*598139dcSAndroid Build Coastguard Worker       usleep(20000);
1502*598139dcSAndroid Build Coastguard Worker       property_set(key + base_offset, "");
1503*598139dcSAndroid Build Coastguard Worker     }
1504*598139dcSAndroid Build Coastguard Worker   }
1505*598139dcSAndroid Build Coastguard Worker 
1506*598139dcSAndroid Build Coastguard Worker   // reset parms
1507*598139dcSAndroid Build Coastguard Worker   snprintf(key, sizeof(key), "%s%s", log_namespace, tag);
1508*598139dcSAndroid Build Coastguard Worker   usleep(20000);
1509*598139dcSAndroid Build Coastguard Worker   property_set(key, hold[0]);
1510*598139dcSAndroid Build Coastguard Worker   property_set(key + base_offset, hold[1]);
1511*598139dcSAndroid Build Coastguard Worker   strcpy(key, log_namespace);
1512*598139dcSAndroid Build Coastguard Worker   key[sizeof(log_namespace) - 2] = '\0';
1513*598139dcSAndroid Build Coastguard Worker   property_set(key, hold[2]);
1514*598139dcSAndroid Build Coastguard Worker   property_set(key + base_offset, hold[3]);
1515*598139dcSAndroid Build Coastguard Worker #else
1516*598139dcSAndroid Build Coastguard Worker   GTEST_LOG_(INFO) << "This test does nothing.\n";
1517*598139dcSAndroid Build Coastguard Worker #endif
1518*598139dcSAndroid Build Coastguard Worker }
1519*598139dcSAndroid Build Coastguard Worker #endif  // ENABLE_FLAKY_TESTS
1520*598139dcSAndroid Build Coastguard Worker 
1521*598139dcSAndroid Build Coastguard Worker #ifdef ENABLE_FLAKY_TESTS
1522*598139dcSAndroid Build Coastguard Worker // Following tests the specific issues surrounding error handling wrt logd.
1523*598139dcSAndroid Build Coastguard Worker // Kills logd and toss all collected data, equivalent to logcat -b all -c,
1524*598139dcSAndroid Build Coastguard Worker // except we also return errors to the logging callers.
1525*598139dcSAndroid Build Coastguard Worker #ifdef __ANDROID__
1526*598139dcSAndroid Build Coastguard Worker // helper to liblog.enoent to count end-to-end matching logging messages.
count_matching_ts(log_time ts)1527*598139dcSAndroid Build Coastguard Worker static int count_matching_ts(log_time ts) {
1528*598139dcSAndroid Build Coastguard Worker   usleep(1000000);
1529*598139dcSAndroid Build Coastguard Worker 
1530*598139dcSAndroid Build Coastguard Worker   pid_t pid = getpid();
1531*598139dcSAndroid Build Coastguard Worker 
1532*598139dcSAndroid Build Coastguard Worker   struct logger_list* logger_list =
1533*598139dcSAndroid Build Coastguard Worker       android_logger_list_open(LOG_ID_EVENTS, ANDROID_LOG_NONBLOCK, INT_MAX, pid);
1534*598139dcSAndroid Build Coastguard Worker 
1535*598139dcSAndroid Build Coastguard Worker   int count = 0;
1536*598139dcSAndroid Build Coastguard Worker   if (logger_list == NULL) return count;
1537*598139dcSAndroid Build Coastguard Worker 
1538*598139dcSAndroid Build Coastguard Worker   for (;;) {
1539*598139dcSAndroid Build Coastguard Worker     log_msg log_msg;
1540*598139dcSAndroid Build Coastguard Worker     if (android_logger_list_read(logger_list, &log_msg) <= 0) break;
1541*598139dcSAndroid Build Coastguard Worker 
1542*598139dcSAndroid Build Coastguard Worker     if (log_msg.entry.len != sizeof(android_log_event_long_t)) continue;
1543*598139dcSAndroid Build Coastguard Worker     if (log_msg.id() != LOG_ID_EVENTS) continue;
1544*598139dcSAndroid Build Coastguard Worker 
1545*598139dcSAndroid Build Coastguard Worker     android_log_event_long_t* eventData;
1546*598139dcSAndroid Build Coastguard Worker     eventData = reinterpret_cast<android_log_event_long_t*>(log_msg.msg());
1547*598139dcSAndroid Build Coastguard Worker     if (!eventData) continue;
1548*598139dcSAndroid Build Coastguard Worker     if (eventData->payload.type != EVENT_TYPE_LONG) continue;
1549*598139dcSAndroid Build Coastguard Worker 
1550*598139dcSAndroid Build Coastguard Worker     log_time tx(reinterpret_cast<char*>(&eventData->payload.data));
1551*598139dcSAndroid Build Coastguard Worker     if (ts != tx) continue;
1552*598139dcSAndroid Build Coastguard Worker 
1553*598139dcSAndroid Build Coastguard Worker     // found event message with matching timestamp signature in payload
1554*598139dcSAndroid Build Coastguard Worker     ++count;
1555*598139dcSAndroid Build Coastguard Worker   }
1556*598139dcSAndroid Build Coastguard Worker   android_logger_list_close(logger_list);
1557*598139dcSAndroid Build Coastguard Worker 
1558*598139dcSAndroid Build Coastguard Worker   return count;
1559*598139dcSAndroid Build Coastguard Worker }
1560*598139dcSAndroid Build Coastguard Worker 
TEST(liblog,enoent)1561*598139dcSAndroid Build Coastguard Worker TEST(liblog, enoent) {
1562*598139dcSAndroid Build Coastguard Worker #ifdef __ANDROID__
1563*598139dcSAndroid Build Coastguard Worker   if (getuid() != 0) {
1564*598139dcSAndroid Build Coastguard Worker     GTEST_SKIP() << "Skipping test, must be run as root.";
1565*598139dcSAndroid Build Coastguard Worker     return;
1566*598139dcSAndroid Build Coastguard Worker   }
1567*598139dcSAndroid Build Coastguard Worker 
1568*598139dcSAndroid Build Coastguard Worker   log_time ts(CLOCK_MONOTONIC);
1569*598139dcSAndroid Build Coastguard Worker   EXPECT_LT(0, __android_log_btwrite(0, EVENT_TYPE_LONG, &ts, sizeof(ts)));
1570*598139dcSAndroid Build Coastguard Worker   EXPECT_EQ(1, count_matching_ts(ts));
1571*598139dcSAndroid Build Coastguard Worker 
1572*598139dcSAndroid Build Coastguard Worker   // This call will fail unless we are root, beware of any
1573*598139dcSAndroid Build Coastguard Worker   // test prior to this one playing with setuid and causing interference.
1574*598139dcSAndroid Build Coastguard Worker   // We need to run before these tests so that they do not interfere with
1575*598139dcSAndroid Build Coastguard Worker   // this test.
1576*598139dcSAndroid Build Coastguard Worker   //
1577*598139dcSAndroid Build Coastguard Worker   // Stopping the logger can affect some other test's expectations as they
1578*598139dcSAndroid Build Coastguard Worker   // count on the log buffers filled with existing content, and this
1579*598139dcSAndroid Build Coastguard Worker   // effectively does a logcat -c emptying it.  So we want this test to be
1580*598139dcSAndroid Build Coastguard Worker   // as near as possible to the bottom of the file.  For example
1581*598139dcSAndroid Build Coastguard Worker   // liblog.android_logger_get_ is one of those tests that has no recourse
1582*598139dcSAndroid Build Coastguard Worker   // and that would be adversely affected by emptying the log if it was run
1583*598139dcSAndroid Build Coastguard Worker   // right after this test.
1584*598139dcSAndroid Build Coastguard Worker   system("stop logd");
1585*598139dcSAndroid Build Coastguard Worker   usleep(1000000);
1586*598139dcSAndroid Build Coastguard Worker 
1587*598139dcSAndroid Build Coastguard Worker   // A clean stop like we are testing returns -ENOENT, but in the _real_
1588*598139dcSAndroid Build Coastguard Worker   // world we could get -ENOTCONN or -ECONNREFUSED depending on timing.
1589*598139dcSAndroid Build Coastguard Worker   // Alas we can not test these other return values; accept that they
1590*598139dcSAndroid Build Coastguard Worker   // are treated equally within the open-retry logic in liblog.
1591*598139dcSAndroid Build Coastguard Worker   ts = log_time(CLOCK_MONOTONIC);
1592*598139dcSAndroid Build Coastguard Worker   int ret = __android_log_btwrite(0, EVENT_TYPE_LONG, &ts, sizeof(ts));
1593*598139dcSAndroid Build Coastguard Worker   std::string content = android::base::StringPrintf(
1594*598139dcSAndroid Build Coastguard Worker       "__android_log_btwrite(0, EVENT_TYPE_LONG, &ts, sizeof(ts)) = %d %s\n",
1595*598139dcSAndroid Build Coastguard Worker       ret, (ret <= 0) ? strerror(-ret) : "(content sent)");
1596*598139dcSAndroid Build Coastguard Worker   EXPECT_TRUE(ret == -ENOENT || ret == -ENOTCONN || ret == -ECONNREFUSED) << content;
1597*598139dcSAndroid Build Coastguard Worker   ret = __android_log_btwrite(0, EVENT_TYPE_LONG, &ts, sizeof(ts));
1598*598139dcSAndroid Build Coastguard Worker   content = android::base::StringPrintf(
1599*598139dcSAndroid Build Coastguard Worker       "__android_log_btwrite(0, EVENT_TYPE_LONG, &ts, sizeof(ts)) = %d %s\n",
1600*598139dcSAndroid Build Coastguard Worker       ret, (ret <= 0) ? strerror(-ret) : "(content sent)");
1601*598139dcSAndroid Build Coastguard Worker   EXPECT_TRUE(ret == -ENOENT || ret == -ENOTCONN || ret == -ECONNREFUSED) << content;
1602*598139dcSAndroid Build Coastguard Worker   EXPECT_EQ(0, count_matching_ts(ts));
1603*598139dcSAndroid Build Coastguard Worker 
1604*598139dcSAndroid Build Coastguard Worker   system("start logd");
1605*598139dcSAndroid Build Coastguard Worker   usleep(1000000);
1606*598139dcSAndroid Build Coastguard Worker 
1607*598139dcSAndroid Build Coastguard Worker   EXPECT_EQ(0, count_matching_ts(ts));
1608*598139dcSAndroid Build Coastguard Worker 
1609*598139dcSAndroid Build Coastguard Worker   ts = log_time(CLOCK_MONOTONIC);
1610*598139dcSAndroid Build Coastguard Worker   EXPECT_LT(0, __android_log_btwrite(0, EVENT_TYPE_LONG, &ts, sizeof(ts)));
1611*598139dcSAndroid Build Coastguard Worker   EXPECT_EQ(1, count_matching_ts(ts));
1612*598139dcSAndroid Build Coastguard Worker 
1613*598139dcSAndroid Build Coastguard Worker #else
1614*598139dcSAndroid Build Coastguard Worker   GTEST_LOG_(INFO) << "This test does nothing.\n";
1615*598139dcSAndroid Build Coastguard Worker #endif
1616*598139dcSAndroid Build Coastguard Worker }
1617*598139dcSAndroid Build Coastguard Worker #endif  // __ANDROID__
1618*598139dcSAndroid Build Coastguard Worker #endif  // ENABLE_FLAKY_TESTS
1619*598139dcSAndroid Build Coastguard Worker 
1620*598139dcSAndroid Build Coastguard Worker // Below this point we run risks of setuid(AID_SYSTEM) which may affect others.
1621*598139dcSAndroid Build Coastguard Worker 
1622*598139dcSAndroid Build Coastguard Worker // Do not retest properties, and cannot log into LOG_ID_SECURITY
TEST(liblog,__security)1623*598139dcSAndroid Build Coastguard Worker TEST(liblog, __security) {
1624*598139dcSAndroid Build Coastguard Worker #ifdef __ANDROID__
1625*598139dcSAndroid Build Coastguard Worker   static const char persist_key[] = "persist.logd.security";
1626*598139dcSAndroid Build Coastguard Worker   char persist[PROP_VALUE_MAX];
1627*598139dcSAndroid Build Coastguard Worker   char persist_hold[PROP_VALUE_MAX];
1628*598139dcSAndroid Build Coastguard Worker 
1629*598139dcSAndroid Build Coastguard Worker   property_get(persist_key, persist, "");
1630*598139dcSAndroid Build Coastguard Worker   fprintf(stderr, "INFO: getprop %s -> %s\n", persist_key, persist);
1631*598139dcSAndroid Build Coastguard Worker   strncpy(persist_hold, persist, PROP_VALUE_MAX);
1632*598139dcSAndroid Build Coastguard Worker 
1633*598139dcSAndroid Build Coastguard Worker   if (!strcasecmp(persist, "true")) {
1634*598139dcSAndroid Build Coastguard Worker     EXPECT_TRUE(__android_log_security());
1635*598139dcSAndroid Build Coastguard Worker   } else {
1636*598139dcSAndroid Build Coastguard Worker     EXPECT_FALSE(__android_log_security());
1637*598139dcSAndroid Build Coastguard Worker   }
1638*598139dcSAndroid Build Coastguard Worker 
1639*598139dcSAndroid Build Coastguard Worker   uid_t uid = getuid();
1640*598139dcSAndroid Build Coastguard Worker   gid_t gid = getgid();
1641*598139dcSAndroid Build Coastguard Worker   bool perm = (gid == AID_ROOT) || (uid == AID_ROOT);
1642*598139dcSAndroid Build Coastguard Worker   if (!perm) {
1643*598139dcSAndroid Build Coastguard Worker     GTEST_LOG_(INFO) << "Not enough permissions to change properties.\n";
1644*598139dcSAndroid Build Coastguard Worker     return;
1645*598139dcSAndroid Build Coastguard Worker   }
1646*598139dcSAndroid Build Coastguard Worker 
1647*598139dcSAndroid Build Coastguard Worker   property_set(persist_key, "TRUE");
1648*598139dcSAndroid Build Coastguard Worker   property_get(persist_key, persist, "");
1649*598139dcSAndroid Build Coastguard Worker   EXPECT_STREQ("TRUE", persist);
1650*598139dcSAndroid Build Coastguard Worker   EXPECT_TRUE(__android_log_security());
1651*598139dcSAndroid Build Coastguard Worker 
1652*598139dcSAndroid Build Coastguard Worker   property_set(persist_key, "FALSE");
1653*598139dcSAndroid Build Coastguard Worker   property_get(persist_key, persist, "");
1654*598139dcSAndroid Build Coastguard Worker   EXPECT_STREQ("FALSE", persist);
1655*598139dcSAndroid Build Coastguard Worker   EXPECT_FALSE(__android_log_security());
1656*598139dcSAndroid Build Coastguard Worker 
1657*598139dcSAndroid Build Coastguard Worker   property_set(persist_key, "true");
1658*598139dcSAndroid Build Coastguard Worker   property_get(persist_key, persist, "");
1659*598139dcSAndroid Build Coastguard Worker   EXPECT_STREQ("true", persist);
1660*598139dcSAndroid Build Coastguard Worker   EXPECT_TRUE(__android_log_security());
1661*598139dcSAndroid Build Coastguard Worker 
1662*598139dcSAndroid Build Coastguard Worker   property_set(persist_key, "false");
1663*598139dcSAndroid Build Coastguard Worker   property_get(persist_key, persist, "");
1664*598139dcSAndroid Build Coastguard Worker   EXPECT_STREQ("false", persist);
1665*598139dcSAndroid Build Coastguard Worker   EXPECT_FALSE(__android_log_security());
1666*598139dcSAndroid Build Coastguard Worker 
1667*598139dcSAndroid Build Coastguard Worker   property_set(persist_key, "");
1668*598139dcSAndroid Build Coastguard Worker   property_get(persist_key, persist, "");
1669*598139dcSAndroid Build Coastguard Worker   EXPECT_STREQ("", persist);
1670*598139dcSAndroid Build Coastguard Worker   EXPECT_FALSE(__android_log_security());
1671*598139dcSAndroid Build Coastguard Worker 
1672*598139dcSAndroid Build Coastguard Worker   property_set(persist_key, persist_hold);
1673*598139dcSAndroid Build Coastguard Worker   property_get(persist_key, persist, "");
1674*598139dcSAndroid Build Coastguard Worker   EXPECT_STREQ(persist_hold, persist);
1675*598139dcSAndroid Build Coastguard Worker #else
1676*598139dcSAndroid Build Coastguard Worker   GTEST_LOG_(INFO) << "This test does nothing.\n";
1677*598139dcSAndroid Build Coastguard Worker #endif
1678*598139dcSAndroid Build Coastguard Worker }
1679*598139dcSAndroid Build Coastguard Worker 
1680*598139dcSAndroid Build Coastguard Worker #ifdef ENABLE_FLAKY_TESTS
TEST(liblog,__security_buffer)1681*598139dcSAndroid Build Coastguard Worker TEST(liblog, __security_buffer) {
1682*598139dcSAndroid Build Coastguard Worker #ifdef __ANDROID__
1683*598139dcSAndroid Build Coastguard Worker   struct logger_list* logger_list;
1684*598139dcSAndroid Build Coastguard Worker   android_event_long_t buffer;
1685*598139dcSAndroid Build Coastguard Worker 
1686*598139dcSAndroid Build Coastguard Worker   static const char persist_key[] = "persist.logd.security";
1687*598139dcSAndroid Build Coastguard Worker   char persist[PROP_VALUE_MAX];
1688*598139dcSAndroid Build Coastguard Worker   bool set_persist = false;
1689*598139dcSAndroid Build Coastguard Worker   bool allow_security = false;
1690*598139dcSAndroid Build Coastguard Worker 
1691*598139dcSAndroid Build Coastguard Worker   if (__android_log_security()) {
1692*598139dcSAndroid Build Coastguard Worker     allow_security = true;
1693*598139dcSAndroid Build Coastguard Worker   } else {
1694*598139dcSAndroid Build Coastguard Worker     property_get(persist_key, persist, "");
1695*598139dcSAndroid Build Coastguard Worker     if (strcasecmp(persist, "true")) {
1696*598139dcSAndroid Build Coastguard Worker       property_set(persist_key, "TRUE");
1697*598139dcSAndroid Build Coastguard Worker       if (__android_log_security()) {
1698*598139dcSAndroid Build Coastguard Worker         allow_security = true;
1699*598139dcSAndroid Build Coastguard Worker         set_persist = true;
1700*598139dcSAndroid Build Coastguard Worker       } else {
1701*598139dcSAndroid Build Coastguard Worker         property_set(persist_key, persist);
1702*598139dcSAndroid Build Coastguard Worker       }
1703*598139dcSAndroid Build Coastguard Worker     }
1704*598139dcSAndroid Build Coastguard Worker   }
1705*598139dcSAndroid Build Coastguard Worker 
1706*598139dcSAndroid Build Coastguard Worker   if (!allow_security) {
1707*598139dcSAndroid Build Coastguard Worker     fprintf(stderr,
1708*598139dcSAndroid Build Coastguard Worker             "WARNING: "
1709*598139dcSAndroid Build Coastguard Worker             "security buffer disabled, bypassing end-to-end test\n");
1710*598139dcSAndroid Build Coastguard Worker 
1711*598139dcSAndroid Build Coastguard Worker     log_time ts(CLOCK_MONOTONIC);
1712*598139dcSAndroid Build Coastguard Worker 
1713*598139dcSAndroid Build Coastguard Worker     buffer.type = EVENT_TYPE_LONG;
1714*598139dcSAndroid Build Coastguard Worker     buffer.data = *(static_cast<uint64_t*>((void*)&ts));
1715*598139dcSAndroid Build Coastguard Worker 
1716*598139dcSAndroid Build Coastguard Worker     // expect failure!
1717*598139dcSAndroid Build Coastguard Worker     ASSERT_GE(0, __android_log_security_bwrite(0, &buffer, sizeof(buffer)));
1718*598139dcSAndroid Build Coastguard Worker 
1719*598139dcSAndroid Build Coastguard Worker     return;
1720*598139dcSAndroid Build Coastguard Worker   }
1721*598139dcSAndroid Build Coastguard Worker 
1722*598139dcSAndroid Build Coastguard Worker   /* Matches clientHasLogCredentials() in logd */
1723*598139dcSAndroid Build Coastguard Worker   uid_t uid = getuid();
1724*598139dcSAndroid Build Coastguard Worker   gid_t gid = getgid();
1725*598139dcSAndroid Build Coastguard Worker   bool clientHasLogCredentials = true;
1726*598139dcSAndroid Build Coastguard Worker   if ((uid != AID_SYSTEM) && (uid != AID_ROOT) && (uid != AID_LOG) &&
1727*598139dcSAndroid Build Coastguard Worker       (gid != AID_SYSTEM) && (gid != AID_ROOT) && (gid != AID_LOG)) {
1728*598139dcSAndroid Build Coastguard Worker     uid_t euid = geteuid();
1729*598139dcSAndroid Build Coastguard Worker     if ((euid != AID_SYSTEM) && (euid != AID_ROOT) && (euid != AID_LOG)) {
1730*598139dcSAndroid Build Coastguard Worker       gid_t egid = getegid();
1731*598139dcSAndroid Build Coastguard Worker       if ((egid != AID_SYSTEM) && (egid != AID_ROOT) && (egid != AID_LOG)) {
1732*598139dcSAndroid Build Coastguard Worker         int num_groups = getgroups(0, NULL);
1733*598139dcSAndroid Build Coastguard Worker         if (num_groups > 0) {
1734*598139dcSAndroid Build Coastguard Worker           gid_t groups[num_groups];
1735*598139dcSAndroid Build Coastguard Worker           num_groups = getgroups(num_groups, groups);
1736*598139dcSAndroid Build Coastguard Worker           while (num_groups > 0) {
1737*598139dcSAndroid Build Coastguard Worker             if (groups[num_groups - 1] == AID_LOG) {
1738*598139dcSAndroid Build Coastguard Worker               break;
1739*598139dcSAndroid Build Coastguard Worker             }
1740*598139dcSAndroid Build Coastguard Worker             --num_groups;
1741*598139dcSAndroid Build Coastguard Worker           }
1742*598139dcSAndroid Build Coastguard Worker         }
1743*598139dcSAndroid Build Coastguard Worker         if (num_groups <= 0) {
1744*598139dcSAndroid Build Coastguard Worker           clientHasLogCredentials = false;
1745*598139dcSAndroid Build Coastguard Worker         }
1746*598139dcSAndroid Build Coastguard Worker       }
1747*598139dcSAndroid Build Coastguard Worker     }
1748*598139dcSAndroid Build Coastguard Worker   }
1749*598139dcSAndroid Build Coastguard Worker   if (!clientHasLogCredentials) {
1750*598139dcSAndroid Build Coastguard Worker     fprintf(stderr,
1751*598139dcSAndroid Build Coastguard Worker             "WARNING: "
1752*598139dcSAndroid Build Coastguard Worker             "not in system context, bypassing end-to-end test\n");
1753*598139dcSAndroid Build Coastguard Worker 
1754*598139dcSAndroid Build Coastguard Worker     log_time ts(CLOCK_MONOTONIC);
1755*598139dcSAndroid Build Coastguard Worker 
1756*598139dcSAndroid Build Coastguard Worker     buffer.type = EVENT_TYPE_LONG;
1757*598139dcSAndroid Build Coastguard Worker     buffer.data = *(static_cast<uint64_t*>((void*)&ts));
1758*598139dcSAndroid Build Coastguard Worker 
1759*598139dcSAndroid Build Coastguard Worker     // expect failure!
1760*598139dcSAndroid Build Coastguard Worker     ASSERT_GE(0, __android_log_security_bwrite(0, &buffer, sizeof(buffer)));
1761*598139dcSAndroid Build Coastguard Worker 
1762*598139dcSAndroid Build Coastguard Worker     return;
1763*598139dcSAndroid Build Coastguard Worker   }
1764*598139dcSAndroid Build Coastguard Worker 
1765*598139dcSAndroid Build Coastguard Worker   EXPECT_EQ(0, setuid(AID_SYSTEM));  // only one that can read security buffer
1766*598139dcSAndroid Build Coastguard Worker 
1767*598139dcSAndroid Build Coastguard Worker   uid = getuid();
1768*598139dcSAndroid Build Coastguard Worker   gid = getgid();
1769*598139dcSAndroid Build Coastguard Worker   pid_t pid = getpid();
1770*598139dcSAndroid Build Coastguard Worker 
1771*598139dcSAndroid Build Coastguard Worker   ASSERT_TRUE(NULL != (logger_list = android_logger_list_open(LOG_ID_SECURITY, ANDROID_LOG_NONBLOCK,
1772*598139dcSAndroid Build Coastguard Worker                                                               INT_MAX, pid)));
1773*598139dcSAndroid Build Coastguard Worker 
1774*598139dcSAndroid Build Coastguard Worker   log_time ts(CLOCK_MONOTONIC);
1775*598139dcSAndroid Build Coastguard Worker 
1776*598139dcSAndroid Build Coastguard Worker   buffer.type = EVENT_TYPE_LONG;
1777*598139dcSAndroid Build Coastguard Worker   buffer.data = *(static_cast<uint64_t*>((void*)&ts));
1778*598139dcSAndroid Build Coastguard Worker 
1779*598139dcSAndroid Build Coastguard Worker   ASSERT_LT(0, __android_log_security_bwrite(0, &buffer, sizeof(buffer)));
1780*598139dcSAndroid Build Coastguard Worker   usleep(1000000);
1781*598139dcSAndroid Build Coastguard Worker 
1782*598139dcSAndroid Build Coastguard Worker   int count = 0;
1783*598139dcSAndroid Build Coastguard Worker 
1784*598139dcSAndroid Build Coastguard Worker   for (;;) {
1785*598139dcSAndroid Build Coastguard Worker     log_msg log_msg;
1786*598139dcSAndroid Build Coastguard Worker     if (android_logger_list_read(logger_list, &log_msg) <= 0) {
1787*598139dcSAndroid Build Coastguard Worker       break;
1788*598139dcSAndroid Build Coastguard Worker     }
1789*598139dcSAndroid Build Coastguard Worker 
1790*598139dcSAndroid Build Coastguard Worker     ASSERT_EQ(log_msg.entry.pid, pid);
1791*598139dcSAndroid Build Coastguard Worker 
1792*598139dcSAndroid Build Coastguard Worker     if ((log_msg.entry.len != sizeof(android_log_event_long_t)) ||
1793*598139dcSAndroid Build Coastguard Worker         (log_msg.id() != LOG_ID_SECURITY)) {
1794*598139dcSAndroid Build Coastguard Worker       continue;
1795*598139dcSAndroid Build Coastguard Worker     }
1796*598139dcSAndroid Build Coastguard Worker 
1797*598139dcSAndroid Build Coastguard Worker     android_log_event_long_t* eventData;
1798*598139dcSAndroid Build Coastguard Worker     eventData = reinterpret_cast<android_log_event_long_t*>(log_msg.msg());
1799*598139dcSAndroid Build Coastguard Worker 
1800*598139dcSAndroid Build Coastguard Worker     if (!eventData || (eventData->payload.type != EVENT_TYPE_LONG)) {
1801*598139dcSAndroid Build Coastguard Worker       continue;
1802*598139dcSAndroid Build Coastguard Worker     }
1803*598139dcSAndroid Build Coastguard Worker 
1804*598139dcSAndroid Build Coastguard Worker     log_time tx(reinterpret_cast<char*>(&eventData->payload.data));
1805*598139dcSAndroid Build Coastguard Worker     if (ts == tx) {
1806*598139dcSAndroid Build Coastguard Worker       ++count;
1807*598139dcSAndroid Build Coastguard Worker     }
1808*598139dcSAndroid Build Coastguard Worker   }
1809*598139dcSAndroid Build Coastguard Worker 
1810*598139dcSAndroid Build Coastguard Worker   if (set_persist) {
1811*598139dcSAndroid Build Coastguard Worker     property_set(persist_key, persist);
1812*598139dcSAndroid Build Coastguard Worker   }
1813*598139dcSAndroid Build Coastguard Worker 
1814*598139dcSAndroid Build Coastguard Worker   android_logger_list_close(logger_list);
1815*598139dcSAndroid Build Coastguard Worker 
1816*598139dcSAndroid Build Coastguard Worker   bool clientHasSecurityCredentials = (uid == AID_SYSTEM) || (gid == AID_SYSTEM);
1817*598139dcSAndroid Build Coastguard Worker   if (!clientHasSecurityCredentials) {
1818*598139dcSAndroid Build Coastguard Worker     fprintf(stderr,
1819*598139dcSAndroid Build Coastguard Worker             "WARNING: "
1820*598139dcSAndroid Build Coastguard Worker             "not system, content submitted but can not check end-to-end\n");
1821*598139dcSAndroid Build Coastguard Worker   }
1822*598139dcSAndroid Build Coastguard Worker   EXPECT_EQ(clientHasSecurityCredentials ? 1 : 0, count);
1823*598139dcSAndroid Build Coastguard Worker #else
1824*598139dcSAndroid Build Coastguard Worker   GTEST_LOG_(INFO) << "This test does nothing.\n";
1825*598139dcSAndroid Build Coastguard Worker #endif
1826*598139dcSAndroid Build Coastguard Worker }
1827*598139dcSAndroid Build Coastguard Worker #endif  // ENABLE_FLAKY_TESTS
1828*598139dcSAndroid Build Coastguard Worker 
1829*598139dcSAndroid Build Coastguard Worker #ifdef __ANDROID__
android_errorWriteWithInfoLog_helper(int tag,const char * subtag,int uid,const char * payload,int data_len)1830*598139dcSAndroid Build Coastguard Worker static void android_errorWriteWithInfoLog_helper(int tag, const char* subtag, int uid,
1831*598139dcSAndroid Build Coastguard Worker                                                  const char* payload, int data_len) {
1832*598139dcSAndroid Build Coastguard Worker   auto write_function = [&] {
1833*598139dcSAndroid Build Coastguard Worker     int ret = android_errorWriteWithInfoLog(tag, subtag, uid, payload, data_len);
1834*598139dcSAndroid Build Coastguard Worker     ASSERT_LT(0, ret);
1835*598139dcSAndroid Build Coastguard Worker   };
1836*598139dcSAndroid Build Coastguard Worker 
1837*598139dcSAndroid Build Coastguard Worker   auto check_function = [&](log_msg log_msg, bool* found) {
1838*598139dcSAndroid Build Coastguard Worker     char* event_data = log_msg.msg();
1839*598139dcSAndroid Build Coastguard Worker     char* original = event_data;
1840*598139dcSAndroid Build Coastguard Worker 
1841*598139dcSAndroid Build Coastguard Worker     // Tag
1842*598139dcSAndroid Build Coastguard Worker     auto* event_header = reinterpret_cast<android_event_header_t*>(event_data);
1843*598139dcSAndroid Build Coastguard Worker     event_data += sizeof(android_event_header_t);
1844*598139dcSAndroid Build Coastguard Worker     if (event_header->tag != tag) {
1845*598139dcSAndroid Build Coastguard Worker       return;
1846*598139dcSAndroid Build Coastguard Worker     }
1847*598139dcSAndroid Build Coastguard Worker 
1848*598139dcSAndroid Build Coastguard Worker     // List type
1849*598139dcSAndroid Build Coastguard Worker     auto* event_list = reinterpret_cast<android_event_list_t*>(event_data);
1850*598139dcSAndroid Build Coastguard Worker     ASSERT_EQ(EVENT_TYPE_LIST, event_list->type);
1851*598139dcSAndroid Build Coastguard Worker     ASSERT_EQ(3, event_list->element_count);
1852*598139dcSAndroid Build Coastguard Worker     event_data += sizeof(android_event_list_t);
1853*598139dcSAndroid Build Coastguard Worker 
1854*598139dcSAndroid Build Coastguard Worker     // Element #1: string type for subtag
1855*598139dcSAndroid Build Coastguard Worker     auto* event_string_subtag = reinterpret_cast<android_event_string_t*>(event_data);
1856*598139dcSAndroid Build Coastguard Worker     ASSERT_EQ(EVENT_TYPE_STRING, event_string_subtag->type);
1857*598139dcSAndroid Build Coastguard Worker     int32_t subtag_len = strlen(subtag);
1858*598139dcSAndroid Build Coastguard Worker     if (subtag_len > 32) {
1859*598139dcSAndroid Build Coastguard Worker       subtag_len = 32;
1860*598139dcSAndroid Build Coastguard Worker     }
1861*598139dcSAndroid Build Coastguard Worker     ASSERT_EQ(subtag_len, event_string_subtag->length);
1862*598139dcSAndroid Build Coastguard Worker     if (memcmp(subtag, &event_string_subtag->data, subtag_len)) {
1863*598139dcSAndroid Build Coastguard Worker       return;
1864*598139dcSAndroid Build Coastguard Worker     }
1865*598139dcSAndroid Build Coastguard Worker     event_data += sizeof(android_event_string_t) + subtag_len;
1866*598139dcSAndroid Build Coastguard Worker 
1867*598139dcSAndroid Build Coastguard Worker     // Element #2: int type for uid
1868*598139dcSAndroid Build Coastguard Worker     auto* event_int_uid = reinterpret_cast<android_event_int_t*>(event_data);
1869*598139dcSAndroid Build Coastguard Worker     ASSERT_EQ(EVENT_TYPE_INT, event_int_uid->type);
1870*598139dcSAndroid Build Coastguard Worker     ASSERT_EQ(uid, event_int_uid->data);
1871*598139dcSAndroid Build Coastguard Worker     event_data += sizeof(android_event_int_t);
1872*598139dcSAndroid Build Coastguard Worker 
1873*598139dcSAndroid Build Coastguard Worker     // Element #3: string type for data
1874*598139dcSAndroid Build Coastguard Worker     auto* event_string_data = reinterpret_cast<android_event_string_t*>(event_data);
1875*598139dcSAndroid Build Coastguard Worker     ASSERT_EQ(EVENT_TYPE_STRING, event_string_data->type);
1876*598139dcSAndroid Build Coastguard Worker     int32_t message_data_len = event_string_data->length;
1877*598139dcSAndroid Build Coastguard Worker     if (data_len < 512) {
1878*598139dcSAndroid Build Coastguard Worker       ASSERT_EQ(data_len, message_data_len);
1879*598139dcSAndroid Build Coastguard Worker     }
1880*598139dcSAndroid Build Coastguard Worker     if (memcmp(payload, &event_string_data->data, message_data_len) != 0) {
1881*598139dcSAndroid Build Coastguard Worker       return;
1882*598139dcSAndroid Build Coastguard Worker     }
1883*598139dcSAndroid Build Coastguard Worker     event_data += sizeof(android_event_string_t);
1884*598139dcSAndroid Build Coastguard Worker 
1885*598139dcSAndroid Build Coastguard Worker     if (data_len >= 512) {
1886*598139dcSAndroid Build Coastguard Worker       event_data += message_data_len;
1887*598139dcSAndroid Build Coastguard Worker       // 4 bytes for the tag, and max_payload_buf should be truncated.
1888*598139dcSAndroid Build Coastguard Worker       ASSERT_LE(4 + 512, event_data - original);       // worst expectations
1889*598139dcSAndroid Build Coastguard Worker       ASSERT_GT(4 + data_len, event_data - original);  // must be truncated
1890*598139dcSAndroid Build Coastguard Worker     }
1891*598139dcSAndroid Build Coastguard Worker     *found = true;
1892*598139dcSAndroid Build Coastguard Worker   };
1893*598139dcSAndroid Build Coastguard Worker 
1894*598139dcSAndroid Build Coastguard Worker   RunLogTests(LOG_ID_EVENTS, write_function, check_function);
1895*598139dcSAndroid Build Coastguard Worker }
1896*598139dcSAndroid Build Coastguard Worker #endif
1897*598139dcSAndroid Build Coastguard Worker 
1898*598139dcSAndroid Build Coastguard Worker // Make multiple tests and re-tests orthogonal to prevent falsing.
1899*598139dcSAndroid Build Coastguard Worker #ifdef TEST_LOGGER
1900*598139dcSAndroid Build Coastguard Worker #define UNIQUE_TAG(X) \
1901*598139dcSAndroid Build Coastguard Worker   (0x12340000 + (((X) + sizeof(int) + sizeof(void*)) << 8) + TEST_LOGGER)
1902*598139dcSAndroid Build Coastguard Worker #else
1903*598139dcSAndroid Build Coastguard Worker #define UNIQUE_TAG(X) \
1904*598139dcSAndroid Build Coastguard Worker   (0x12340000 + (((X) + sizeof(int) + sizeof(void*)) << 8) + 0xBA)
1905*598139dcSAndroid Build Coastguard Worker #endif
1906*598139dcSAndroid Build Coastguard Worker 
TEST(liblog,android_errorWriteWithInfoLog__android_logger_list_read__typical)1907*598139dcSAndroid Build Coastguard Worker TEST(liblog, android_errorWriteWithInfoLog__android_logger_list_read__typical) {
1908*598139dcSAndroid Build Coastguard Worker #ifdef __ANDROID__
1909*598139dcSAndroid Build Coastguard Worker   android_errorWriteWithInfoLog_helper(UNIQUE_TAG(1), "test-subtag", -1, max_payload_buf, 200);
1910*598139dcSAndroid Build Coastguard Worker #else
1911*598139dcSAndroid Build Coastguard Worker   GTEST_LOG_(INFO) << "This test does nothing.\n";
1912*598139dcSAndroid Build Coastguard Worker #endif
1913*598139dcSAndroid Build Coastguard Worker }
1914*598139dcSAndroid Build Coastguard Worker 
TEST(liblog,android_errorWriteWithInfoLog__android_logger_list_read__data_too_large)1915*598139dcSAndroid Build Coastguard Worker TEST(liblog,
1916*598139dcSAndroid Build Coastguard Worker      android_errorWriteWithInfoLog__android_logger_list_read__data_too_large) {
1917*598139dcSAndroid Build Coastguard Worker #ifdef __ANDROID__
1918*598139dcSAndroid Build Coastguard Worker   android_errorWriteWithInfoLog_helper(UNIQUE_TAG(2), "test-subtag", -1, max_payload_buf,
1919*598139dcSAndroid Build Coastguard Worker                                        sizeof(max_payload_buf));
1920*598139dcSAndroid Build Coastguard Worker #else
1921*598139dcSAndroid Build Coastguard Worker   GTEST_LOG_(INFO) << "This test does nothing.\n";
1922*598139dcSAndroid Build Coastguard Worker #endif
1923*598139dcSAndroid Build Coastguard Worker }
1924*598139dcSAndroid Build Coastguard Worker 
TEST(liblog,android_errorWriteWithInfoLog__android_logger_list_read__null_data)1925*598139dcSAndroid Build Coastguard Worker TEST(liblog,
1926*598139dcSAndroid Build Coastguard Worker      android_errorWriteWithInfoLog__android_logger_list_read__null_data) {
1927*598139dcSAndroid Build Coastguard Worker #ifdef __ANDROID__
1928*598139dcSAndroid Build Coastguard Worker   int retval_android_errorWriteWithinInfoLog =
1929*598139dcSAndroid Build Coastguard Worker       android_errorWriteWithInfoLog(UNIQUE_TAG(3), "test-subtag", -1, nullptr, 200);
1930*598139dcSAndroid Build Coastguard Worker   ASSERT_GT(0, retval_android_errorWriteWithinInfoLog);
1931*598139dcSAndroid Build Coastguard Worker #else
1932*598139dcSAndroid Build Coastguard Worker   GTEST_LOG_(INFO) << "This test does nothing.\n";
1933*598139dcSAndroid Build Coastguard Worker #endif
1934*598139dcSAndroid Build Coastguard Worker }
1935*598139dcSAndroid Build Coastguard Worker 
TEST(liblog,android_errorWriteWithInfoLog__android_logger_list_read__subtag_too_long)1936*598139dcSAndroid Build Coastguard Worker TEST(liblog,
1937*598139dcSAndroid Build Coastguard Worker      android_errorWriteWithInfoLog__android_logger_list_read__subtag_too_long) {
1938*598139dcSAndroid Build Coastguard Worker #ifdef __ANDROID__
1939*598139dcSAndroid Build Coastguard Worker   android_errorWriteWithInfoLog_helper(
1940*598139dcSAndroid Build Coastguard Worker       UNIQUE_TAG(4), "abcdefghijklmnopqrstuvwxyz now i know my abc", -1, max_payload_buf, 200);
1941*598139dcSAndroid Build Coastguard Worker #else
1942*598139dcSAndroid Build Coastguard Worker   GTEST_LOG_(INFO) << "This test does nothing.\n";
1943*598139dcSAndroid Build Coastguard Worker #endif
1944*598139dcSAndroid Build Coastguard Worker }
1945*598139dcSAndroid Build Coastguard Worker 
TEST(liblog,__android_log_bswrite_and_print___max)1946*598139dcSAndroid Build Coastguard Worker TEST(liblog, __android_log_bswrite_and_print___max) {
1947*598139dcSAndroid Build Coastguard Worker   bswrite_test(max_payload_buf);
1948*598139dcSAndroid Build Coastguard Worker }
1949*598139dcSAndroid Build Coastguard Worker 
TEST(liblog,__android_log_buf_write_and_print__max)1950*598139dcSAndroid Build Coastguard Worker TEST(liblog, __android_log_buf_write_and_print__max) {
1951*598139dcSAndroid Build Coastguard Worker   buf_write_test(max_payload_buf);
1952*598139dcSAndroid Build Coastguard Worker }
1953*598139dcSAndroid Build Coastguard Worker 
TEST(liblog,android_errorWriteLog__android_logger_list_read__success)1954*598139dcSAndroid Build Coastguard Worker TEST(liblog, android_errorWriteLog__android_logger_list_read__success) {
1955*598139dcSAndroid Build Coastguard Worker #ifdef __ANDROID__
1956*598139dcSAndroid Build Coastguard Worker   int kTag = UNIQUE_TAG(5);
1957*598139dcSAndroid Build Coastguard Worker   const char* kSubTag = "test-subtag";
1958*598139dcSAndroid Build Coastguard Worker 
1959*598139dcSAndroid Build Coastguard Worker   auto write_function = [&] {
1960*598139dcSAndroid Build Coastguard Worker     int retval_android_errorWriteLog = android_errorWriteLog(kTag, kSubTag);
1961*598139dcSAndroid Build Coastguard Worker     ASSERT_LT(0, retval_android_errorWriteLog);
1962*598139dcSAndroid Build Coastguard Worker   };
1963*598139dcSAndroid Build Coastguard Worker 
1964*598139dcSAndroid Build Coastguard Worker   auto check_function = [&](log_msg log_msg, bool* found) {
1965*598139dcSAndroid Build Coastguard Worker     char* event_data = log_msg.msg();
1966*598139dcSAndroid Build Coastguard Worker 
1967*598139dcSAndroid Build Coastguard Worker     // Tag
1968*598139dcSAndroid Build Coastguard Worker     auto* event_header = reinterpret_cast<android_event_header_t*>(event_data);
1969*598139dcSAndroid Build Coastguard Worker     event_data += sizeof(android_event_header_t);
1970*598139dcSAndroid Build Coastguard Worker     if (event_header->tag != kTag) {
1971*598139dcSAndroid Build Coastguard Worker       return;
1972*598139dcSAndroid Build Coastguard Worker     }
1973*598139dcSAndroid Build Coastguard Worker 
1974*598139dcSAndroid Build Coastguard Worker     // List type
1975*598139dcSAndroid Build Coastguard Worker     auto* event_list = reinterpret_cast<android_event_list_t*>(event_data);
1976*598139dcSAndroid Build Coastguard Worker     ASSERT_EQ(EVENT_TYPE_LIST, event_list->type);
1977*598139dcSAndroid Build Coastguard Worker     ASSERT_EQ(3, event_list->element_count);
1978*598139dcSAndroid Build Coastguard Worker     event_data += sizeof(android_event_list_t);
1979*598139dcSAndroid Build Coastguard Worker 
1980*598139dcSAndroid Build Coastguard Worker     // Element #1: string type for subtag
1981*598139dcSAndroid Build Coastguard Worker     auto* event_string_subtag = reinterpret_cast<android_event_string_t*>(event_data);
1982*598139dcSAndroid Build Coastguard Worker     ASSERT_EQ(EVENT_TYPE_STRING, event_string_subtag->type);
1983*598139dcSAndroid Build Coastguard Worker     int32_t subtag_len = strlen(kSubTag);
1984*598139dcSAndroid Build Coastguard Worker     ASSERT_EQ(subtag_len, event_string_subtag->length);
1985*598139dcSAndroid Build Coastguard Worker     if (memcmp(kSubTag, &event_string_subtag->data, subtag_len) == 0) {
1986*598139dcSAndroid Build Coastguard Worker       *found = true;
1987*598139dcSAndroid Build Coastguard Worker     }
1988*598139dcSAndroid Build Coastguard Worker   };
1989*598139dcSAndroid Build Coastguard Worker 
1990*598139dcSAndroid Build Coastguard Worker   RunLogTests(LOG_ID_EVENTS, write_function, check_function);
1991*598139dcSAndroid Build Coastguard Worker 
1992*598139dcSAndroid Build Coastguard Worker #else
1993*598139dcSAndroid Build Coastguard Worker   GTEST_LOG_(INFO) << "This test does nothing.\n";
1994*598139dcSAndroid Build Coastguard Worker #endif
1995*598139dcSAndroid Build Coastguard Worker }
1996*598139dcSAndroid Build Coastguard Worker 
TEST(liblog,android_errorWriteLog__android_logger_list_read__null_subtag)1997*598139dcSAndroid Build Coastguard Worker TEST(liblog, android_errorWriteLog__android_logger_list_read__null_subtag) {
1998*598139dcSAndroid Build Coastguard Worker #ifdef __ANDROID__
1999*598139dcSAndroid Build Coastguard Worker   EXPECT_LT(android_errorWriteLog(UNIQUE_TAG(6), nullptr), 0);
2000*598139dcSAndroid Build Coastguard Worker #else
2001*598139dcSAndroid Build Coastguard Worker   GTEST_LOG_(INFO) << "This test does nothing.\n";
2002*598139dcSAndroid Build Coastguard Worker #endif
2003*598139dcSAndroid Build Coastguard Worker }
2004*598139dcSAndroid Build Coastguard Worker 
2005*598139dcSAndroid Build Coastguard Worker // Do not retest logger list handling
2006*598139dcSAndroid Build Coastguard Worker #ifdef __ANDROID__
is_real_element(int type)2007*598139dcSAndroid Build Coastguard Worker static int is_real_element(int type) {
2008*598139dcSAndroid Build Coastguard Worker   return ((type == EVENT_TYPE_INT) || (type == EVENT_TYPE_LONG) ||
2009*598139dcSAndroid Build Coastguard Worker           (type == EVENT_TYPE_STRING) || (type == EVENT_TYPE_FLOAT));
2010*598139dcSAndroid Build Coastguard Worker }
2011*598139dcSAndroid Build Coastguard Worker 
android_log_buffer_to_string(const char * msg,size_t len,char * strOut,size_t strOutLen)2012*598139dcSAndroid Build Coastguard Worker static int android_log_buffer_to_string(const char* msg, size_t len,
2013*598139dcSAndroid Build Coastguard Worker                                         char* strOut, size_t strOutLen) {
2014*598139dcSAndroid Build Coastguard Worker   android_log_context context = create_android_log_parser(msg, len);
2015*598139dcSAndroid Build Coastguard Worker   android_log_list_element elem = {};
2016*598139dcSAndroid Build Coastguard Worker   bool overflow = false;
2017*598139dcSAndroid Build Coastguard Worker   /* Reserve 1 byte for null terminator. */
2018*598139dcSAndroid Build Coastguard Worker   size_t origStrOutLen = strOutLen--;
2019*598139dcSAndroid Build Coastguard Worker 
2020*598139dcSAndroid Build Coastguard Worker   if (!context) {
2021*598139dcSAndroid Build Coastguard Worker     return -EBADF;
2022*598139dcSAndroid Build Coastguard Worker   }
2023*598139dcSAndroid Build Coastguard Worker 
2024*598139dcSAndroid Build Coastguard Worker   size_t outCount;
2025*598139dcSAndroid Build Coastguard Worker 
2026*598139dcSAndroid Build Coastguard Worker   do {
2027*598139dcSAndroid Build Coastguard Worker     elem = android_log_read_next(context);
2028*598139dcSAndroid Build Coastguard Worker     switch ((int)elem.type) {
2029*598139dcSAndroid Build Coastguard Worker       case EVENT_TYPE_LIST:
2030*598139dcSAndroid Build Coastguard Worker         if (strOutLen == 0) {
2031*598139dcSAndroid Build Coastguard Worker           overflow = true;
2032*598139dcSAndroid Build Coastguard Worker         } else {
2033*598139dcSAndroid Build Coastguard Worker           *strOut++ = '[';
2034*598139dcSAndroid Build Coastguard Worker           strOutLen--;
2035*598139dcSAndroid Build Coastguard Worker         }
2036*598139dcSAndroid Build Coastguard Worker         break;
2037*598139dcSAndroid Build Coastguard Worker 
2038*598139dcSAndroid Build Coastguard Worker       case EVENT_TYPE_LIST_STOP:
2039*598139dcSAndroid Build Coastguard Worker         if (strOutLen == 0) {
2040*598139dcSAndroid Build Coastguard Worker           overflow = true;
2041*598139dcSAndroid Build Coastguard Worker         } else {
2042*598139dcSAndroid Build Coastguard Worker           *strOut++ = ']';
2043*598139dcSAndroid Build Coastguard Worker           strOutLen--;
2044*598139dcSAndroid Build Coastguard Worker         }
2045*598139dcSAndroid Build Coastguard Worker         break;
2046*598139dcSAndroid Build Coastguard Worker 
2047*598139dcSAndroid Build Coastguard Worker       case EVENT_TYPE_INT:
2048*598139dcSAndroid Build Coastguard Worker         /*
2049*598139dcSAndroid Build Coastguard Worker          * snprintf also requires room for the null terminator, which
2050*598139dcSAndroid Build Coastguard Worker          * we don't care about  but we have allocated enough room for
2051*598139dcSAndroid Build Coastguard Worker          * that
2052*598139dcSAndroid Build Coastguard Worker          */
2053*598139dcSAndroid Build Coastguard Worker         outCount = snprintf(strOut, strOutLen + 1, "%" PRId32, elem.data.int32);
2054*598139dcSAndroid Build Coastguard Worker         if (outCount <= strOutLen) {
2055*598139dcSAndroid Build Coastguard Worker           strOut += outCount;
2056*598139dcSAndroid Build Coastguard Worker           strOutLen -= outCount;
2057*598139dcSAndroid Build Coastguard Worker         } else {
2058*598139dcSAndroid Build Coastguard Worker           overflow = true;
2059*598139dcSAndroid Build Coastguard Worker         }
2060*598139dcSAndroid Build Coastguard Worker         break;
2061*598139dcSAndroid Build Coastguard Worker 
2062*598139dcSAndroid Build Coastguard Worker       case EVENT_TYPE_LONG:
2063*598139dcSAndroid Build Coastguard Worker         /*
2064*598139dcSAndroid Build Coastguard Worker          * snprintf also requires room for the null terminator, which
2065*598139dcSAndroid Build Coastguard Worker          * we don't care about but we have allocated enough room for
2066*598139dcSAndroid Build Coastguard Worker          * that
2067*598139dcSAndroid Build Coastguard Worker          */
2068*598139dcSAndroid Build Coastguard Worker         outCount = snprintf(strOut, strOutLen + 1, "%" PRId64, elem.data.int64);
2069*598139dcSAndroid Build Coastguard Worker         if (outCount <= strOutLen) {
2070*598139dcSAndroid Build Coastguard Worker           strOut += outCount;
2071*598139dcSAndroid Build Coastguard Worker           strOutLen -= outCount;
2072*598139dcSAndroid Build Coastguard Worker         } else {
2073*598139dcSAndroid Build Coastguard Worker           overflow = true;
2074*598139dcSAndroid Build Coastguard Worker         }
2075*598139dcSAndroid Build Coastguard Worker         break;
2076*598139dcSAndroid Build Coastguard Worker 
2077*598139dcSAndroid Build Coastguard Worker       case EVENT_TYPE_FLOAT:
2078*598139dcSAndroid Build Coastguard Worker         /*
2079*598139dcSAndroid Build Coastguard Worker          * snprintf also requires room for the null terminator, which
2080*598139dcSAndroid Build Coastguard Worker          * we don't care about but we have allocated enough room for
2081*598139dcSAndroid Build Coastguard Worker          * that
2082*598139dcSAndroid Build Coastguard Worker          */
2083*598139dcSAndroid Build Coastguard Worker         outCount = snprintf(strOut, strOutLen + 1, "%f", elem.data.float32);
2084*598139dcSAndroid Build Coastguard Worker         if (outCount <= strOutLen) {
2085*598139dcSAndroid Build Coastguard Worker           strOut += outCount;
2086*598139dcSAndroid Build Coastguard Worker           strOutLen -= outCount;
2087*598139dcSAndroid Build Coastguard Worker         } else {
2088*598139dcSAndroid Build Coastguard Worker           overflow = true;
2089*598139dcSAndroid Build Coastguard Worker         }
2090*598139dcSAndroid Build Coastguard Worker         break;
2091*598139dcSAndroid Build Coastguard Worker 
2092*598139dcSAndroid Build Coastguard Worker       default:
2093*598139dcSAndroid Build Coastguard Worker         elem.complete = true;
2094*598139dcSAndroid Build Coastguard Worker         break;
2095*598139dcSAndroid Build Coastguard Worker 
2096*598139dcSAndroid Build Coastguard Worker       case EVENT_TYPE_UNKNOWN:
2097*598139dcSAndroid Build Coastguard Worker #if 0  // Ideal purity in the test, we want to complain about UNKNOWN showing up
2098*598139dcSAndroid Build Coastguard Worker             if (elem.complete) {
2099*598139dcSAndroid Build Coastguard Worker                 break;
2100*598139dcSAndroid Build Coastguard Worker             }
2101*598139dcSAndroid Build Coastguard Worker #endif
2102*598139dcSAndroid Build Coastguard Worker         elem.data.string = const_cast<char*>("<unknown>");
2103*598139dcSAndroid Build Coastguard Worker         elem.len = strlen(elem.data.string);
2104*598139dcSAndroid Build Coastguard Worker         FALLTHROUGH_INTENDED;
2105*598139dcSAndroid Build Coastguard Worker       case EVENT_TYPE_STRING:
2106*598139dcSAndroid Build Coastguard Worker         if (elem.len <= strOutLen) {
2107*598139dcSAndroid Build Coastguard Worker           memcpy(strOut, elem.data.string, elem.len);
2108*598139dcSAndroid Build Coastguard Worker           strOut += elem.len;
2109*598139dcSAndroid Build Coastguard Worker           strOutLen -= elem.len;
2110*598139dcSAndroid Build Coastguard Worker         } else if (strOutLen > 0) {
2111*598139dcSAndroid Build Coastguard Worker           /* copy what we can */
2112*598139dcSAndroid Build Coastguard Worker           memcpy(strOut, elem.data.string, strOutLen);
2113*598139dcSAndroid Build Coastguard Worker           strOut += strOutLen;
2114*598139dcSAndroid Build Coastguard Worker           strOutLen = 0;
2115*598139dcSAndroid Build Coastguard Worker           overflow = true;
2116*598139dcSAndroid Build Coastguard Worker         }
2117*598139dcSAndroid Build Coastguard Worker         break;
2118*598139dcSAndroid Build Coastguard Worker     }
2119*598139dcSAndroid Build Coastguard Worker 
2120*598139dcSAndroid Build Coastguard Worker     if (elem.complete) {
2121*598139dcSAndroid Build Coastguard Worker       break;
2122*598139dcSAndroid Build Coastguard Worker     }
2123*598139dcSAndroid Build Coastguard Worker     /* Determine whether to put a comma or not. */
2124*598139dcSAndroid Build Coastguard Worker     if (!overflow &&
2125*598139dcSAndroid Build Coastguard Worker         (is_real_element(elem.type) || (elem.type == EVENT_TYPE_LIST_STOP))) {
2126*598139dcSAndroid Build Coastguard Worker       android_log_list_element next = android_log_peek_next(context);
2127*598139dcSAndroid Build Coastguard Worker       if (!next.complete &&
2128*598139dcSAndroid Build Coastguard Worker           (is_real_element(next.type) || (next.type == EVENT_TYPE_LIST))) {
2129*598139dcSAndroid Build Coastguard Worker         if (strOutLen == 0) {
2130*598139dcSAndroid Build Coastguard Worker           overflow = true;
2131*598139dcSAndroid Build Coastguard Worker         } else {
2132*598139dcSAndroid Build Coastguard Worker           *strOut++ = ',';
2133*598139dcSAndroid Build Coastguard Worker           strOutLen--;
2134*598139dcSAndroid Build Coastguard Worker         }
2135*598139dcSAndroid Build Coastguard Worker       }
2136*598139dcSAndroid Build Coastguard Worker     }
2137*598139dcSAndroid Build Coastguard Worker   } while ((elem.type != EVENT_TYPE_UNKNOWN) && !overflow && !elem.complete);
2138*598139dcSAndroid Build Coastguard Worker 
2139*598139dcSAndroid Build Coastguard Worker   android_log_destroy(&context);
2140*598139dcSAndroid Build Coastguard Worker 
2141*598139dcSAndroid Build Coastguard Worker   if (overflow) {
2142*598139dcSAndroid Build Coastguard Worker     if (strOutLen < origStrOutLen) {
2143*598139dcSAndroid Build Coastguard Worker       /* leave an indicator */
2144*598139dcSAndroid Build Coastguard Worker       *(strOut - 1) = '!';
2145*598139dcSAndroid Build Coastguard Worker     } else {
2146*598139dcSAndroid Build Coastguard Worker       /* nothing was written at all */
2147*598139dcSAndroid Build Coastguard Worker       *strOut++ = '!';
2148*598139dcSAndroid Build Coastguard Worker     }
2149*598139dcSAndroid Build Coastguard Worker   }
2150*598139dcSAndroid Build Coastguard Worker   *strOut++ = '\0';
2151*598139dcSAndroid Build Coastguard Worker 
2152*598139dcSAndroid Build Coastguard Worker   if ((elem.type == EVENT_TYPE_UNKNOWN) && !elem.complete) {
2153*598139dcSAndroid Build Coastguard Worker     fprintf(stderr, "Binary log entry conversion failed\n");
2154*598139dcSAndroid Build Coastguard Worker     return -EINVAL;
2155*598139dcSAndroid Build Coastguard Worker   }
2156*598139dcSAndroid Build Coastguard Worker 
2157*598139dcSAndroid Build Coastguard Worker   return 0;
2158*598139dcSAndroid Build Coastguard Worker }
2159*598139dcSAndroid Build Coastguard Worker #endif  // __ANDROID__
2160*598139dcSAndroid Build Coastguard Worker 
2161*598139dcSAndroid Build Coastguard Worker #ifdef __ANDROID__
event_test_int32(uint32_t tag,size_t & expected_len)2162*598139dcSAndroid Build Coastguard Worker static const char* event_test_int32(uint32_t tag, size_t& expected_len) {
2163*598139dcSAndroid Build Coastguard Worker   android_log_context ctx;
2164*598139dcSAndroid Build Coastguard Worker 
2165*598139dcSAndroid Build Coastguard Worker   EXPECT_TRUE(NULL != (ctx = create_android_logger(tag)));
2166*598139dcSAndroid Build Coastguard Worker   if (!ctx) {
2167*598139dcSAndroid Build Coastguard Worker     return NULL;
2168*598139dcSAndroid Build Coastguard Worker   }
2169*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_int32(ctx, 0x40302010));
2170*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_list(ctx, LOG_ID_EVENTS));
2171*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_destroy(&ctx));
2172*598139dcSAndroid Build Coastguard Worker   EXPECT_TRUE(NULL == ctx);
2173*598139dcSAndroid Build Coastguard Worker 
2174*598139dcSAndroid Build Coastguard Worker   expected_len = sizeof(uint32_t) + sizeof(uint8_t) + sizeof(uint32_t);
2175*598139dcSAndroid Build Coastguard Worker 
2176*598139dcSAndroid Build Coastguard Worker   return "1076895760";
2177*598139dcSAndroid Build Coastguard Worker }
2178*598139dcSAndroid Build Coastguard Worker 
event_test_int64(uint32_t tag,size_t & expected_len)2179*598139dcSAndroid Build Coastguard Worker static const char* event_test_int64(uint32_t tag, size_t& expected_len) {
2180*598139dcSAndroid Build Coastguard Worker   android_log_context ctx;
2181*598139dcSAndroid Build Coastguard Worker 
2182*598139dcSAndroid Build Coastguard Worker   EXPECT_TRUE(NULL != (ctx = create_android_logger(tag)));
2183*598139dcSAndroid Build Coastguard Worker   if (!ctx) {
2184*598139dcSAndroid Build Coastguard Worker     return NULL;
2185*598139dcSAndroid Build Coastguard Worker   }
2186*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_int64(ctx, 0x8070605040302010));
2187*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_list(ctx, LOG_ID_EVENTS));
2188*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_destroy(&ctx));
2189*598139dcSAndroid Build Coastguard Worker   EXPECT_TRUE(NULL == ctx);
2190*598139dcSAndroid Build Coastguard Worker 
2191*598139dcSAndroid Build Coastguard Worker   expected_len = sizeof(uint32_t) + sizeof(uint8_t) + sizeof(uint64_t);
2192*598139dcSAndroid Build Coastguard Worker 
2193*598139dcSAndroid Build Coastguard Worker   return "-9191740941672636400";
2194*598139dcSAndroid Build Coastguard Worker }
2195*598139dcSAndroid Build Coastguard Worker 
event_test_list_int64(uint32_t tag,size_t & expected_len)2196*598139dcSAndroid Build Coastguard Worker static const char* event_test_list_int64(uint32_t tag, size_t& expected_len) {
2197*598139dcSAndroid Build Coastguard Worker   android_log_context ctx;
2198*598139dcSAndroid Build Coastguard Worker 
2199*598139dcSAndroid Build Coastguard Worker   EXPECT_TRUE(NULL != (ctx = create_android_logger(tag)));
2200*598139dcSAndroid Build Coastguard Worker   if (!ctx) {
2201*598139dcSAndroid Build Coastguard Worker     return NULL;
2202*598139dcSAndroid Build Coastguard Worker   }
2203*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_list_begin(ctx));
2204*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_int64(ctx, 0x8070605040302010));
2205*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_list_end(ctx));
2206*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_list(ctx, LOG_ID_EVENTS));
2207*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_destroy(&ctx));
2208*598139dcSAndroid Build Coastguard Worker   EXPECT_TRUE(NULL == ctx);
2209*598139dcSAndroid Build Coastguard Worker 
2210*598139dcSAndroid Build Coastguard Worker   expected_len = sizeof(uint32_t) + sizeof(uint8_t) + sizeof(uint8_t) +
2211*598139dcSAndroid Build Coastguard Worker                  sizeof(uint8_t) + sizeof(uint64_t);
2212*598139dcSAndroid Build Coastguard Worker 
2213*598139dcSAndroid Build Coastguard Worker   return "[-9191740941672636400]";
2214*598139dcSAndroid Build Coastguard Worker }
2215*598139dcSAndroid Build Coastguard Worker 
event_test_simple_automagic_list(uint32_t tag,size_t & expected_len)2216*598139dcSAndroid Build Coastguard Worker static const char* event_test_simple_automagic_list(uint32_t tag,
2217*598139dcSAndroid Build Coastguard Worker                                                     size_t& expected_len) {
2218*598139dcSAndroid Build Coastguard Worker   android_log_context ctx;
2219*598139dcSAndroid Build Coastguard Worker 
2220*598139dcSAndroid Build Coastguard Worker   EXPECT_TRUE(NULL != (ctx = create_android_logger(tag)));
2221*598139dcSAndroid Build Coastguard Worker   if (!ctx) {
2222*598139dcSAndroid Build Coastguard Worker     return NULL;
2223*598139dcSAndroid Build Coastguard Worker   }
2224*598139dcSAndroid Build Coastguard Worker   // The convenience API where we allow a simple list to be
2225*598139dcSAndroid Build Coastguard Worker   // created without explicit begin or end calls.
2226*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_int32(ctx, 0x40302010));
2227*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_int64(ctx, 0x8070605040302010));
2228*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_list(ctx, LOG_ID_EVENTS));
2229*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_destroy(&ctx));
2230*598139dcSAndroid Build Coastguard Worker   EXPECT_TRUE(NULL == ctx);
2231*598139dcSAndroid Build Coastguard Worker 
2232*598139dcSAndroid Build Coastguard Worker   expected_len = sizeof(uint32_t) + sizeof(uint8_t) + sizeof(uint8_t) +
2233*598139dcSAndroid Build Coastguard Worker                  sizeof(uint8_t) + sizeof(uint32_t) + sizeof(uint8_t) +
2234*598139dcSAndroid Build Coastguard Worker                  sizeof(uint64_t);
2235*598139dcSAndroid Build Coastguard Worker 
2236*598139dcSAndroid Build Coastguard Worker   return "[1076895760,-9191740941672636400]";
2237*598139dcSAndroid Build Coastguard Worker }
2238*598139dcSAndroid Build Coastguard Worker 
event_test_list_empty(uint32_t tag,size_t & expected_len)2239*598139dcSAndroid Build Coastguard Worker static const char* event_test_list_empty(uint32_t tag, size_t& expected_len) {
2240*598139dcSAndroid Build Coastguard Worker   android_log_context ctx;
2241*598139dcSAndroid Build Coastguard Worker 
2242*598139dcSAndroid Build Coastguard Worker   EXPECT_TRUE(NULL != (ctx = create_android_logger(tag)));
2243*598139dcSAndroid Build Coastguard Worker   if (!ctx) {
2244*598139dcSAndroid Build Coastguard Worker     return NULL;
2245*598139dcSAndroid Build Coastguard Worker   }
2246*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_list_begin(ctx));
2247*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_list_end(ctx));
2248*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_list(ctx, LOG_ID_EVENTS));
2249*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_destroy(&ctx));
2250*598139dcSAndroid Build Coastguard Worker   EXPECT_TRUE(NULL == ctx);
2251*598139dcSAndroid Build Coastguard Worker 
2252*598139dcSAndroid Build Coastguard Worker   expected_len = sizeof(uint32_t) + sizeof(uint8_t) + sizeof(uint8_t);
2253*598139dcSAndroid Build Coastguard Worker 
2254*598139dcSAndroid Build Coastguard Worker   return "[]";
2255*598139dcSAndroid Build Coastguard Worker }
2256*598139dcSAndroid Build Coastguard Worker 
event_test_complex_nested_list(uint32_t tag,size_t & expected_len)2257*598139dcSAndroid Build Coastguard Worker static const char* event_test_complex_nested_list(uint32_t tag,
2258*598139dcSAndroid Build Coastguard Worker                                                   size_t& expected_len) {
2259*598139dcSAndroid Build Coastguard Worker   android_log_context ctx;
2260*598139dcSAndroid Build Coastguard Worker 
2261*598139dcSAndroid Build Coastguard Worker   EXPECT_TRUE(NULL != (ctx = create_android_logger(tag)));
2262*598139dcSAndroid Build Coastguard Worker   if (!ctx) {
2263*598139dcSAndroid Build Coastguard Worker     return NULL;
2264*598139dcSAndroid Build Coastguard Worker   }
2265*598139dcSAndroid Build Coastguard Worker 
2266*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_list_begin(ctx));  // [
2267*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_int32(ctx, 0x01020304));
2268*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_int64(ctx, 0x0102030405060708));
2269*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_string8(ctx, "Hello World"));
2270*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_list_begin(ctx));  // [
2271*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_int32(ctx, 1));
2272*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_int32(ctx, 2));
2273*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_int32(ctx, 3));
2274*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_int32(ctx, 4));
2275*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_list_end(ctx));  // ]
2276*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_float32(ctx, 1.0102030405060708));
2277*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_list_end(ctx));  // ]
2278*598139dcSAndroid Build Coastguard Worker 
2279*598139dcSAndroid Build Coastguard Worker   //
2280*598139dcSAndroid Build Coastguard Worker   // This one checks for the automagic list creation because a list
2281*598139dcSAndroid Build Coastguard Worker   // begin and end was missing for it! This is actually an <oops> corner
2282*598139dcSAndroid Build Coastguard Worker   // case, and not the behavior we morally support. The automagic API is to
2283*598139dcSAndroid Build Coastguard Worker   // allow for a simple case of a series of objects in a single list. e.g.
2284*598139dcSAndroid Build Coastguard Worker   //   int32,int32,int32,string -> [int32,int32,int32,string]
2285*598139dcSAndroid Build Coastguard Worker   //
2286*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_string8(ctx, "dlroW olleH"));
2287*598139dcSAndroid Build Coastguard Worker 
2288*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_list(ctx, LOG_ID_EVENTS));
2289*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_destroy(&ctx));
2290*598139dcSAndroid Build Coastguard Worker   EXPECT_TRUE(NULL == ctx);
2291*598139dcSAndroid Build Coastguard Worker 
2292*598139dcSAndroid Build Coastguard Worker   expected_len = sizeof(uint32_t) + sizeof(uint8_t) + sizeof(uint8_t) +
2293*598139dcSAndroid Build Coastguard Worker                  sizeof(uint8_t) + sizeof(uint8_t) + sizeof(uint8_t) +
2294*598139dcSAndroid Build Coastguard Worker                  sizeof(uint32_t) + sizeof(uint8_t) + sizeof(uint64_t) +
2295*598139dcSAndroid Build Coastguard Worker                  sizeof(uint8_t) + sizeof(uint32_t) + sizeof("Hello World") -
2296*598139dcSAndroid Build Coastguard Worker                  1 + sizeof(uint8_t) + sizeof(uint8_t) +
2297*598139dcSAndroid Build Coastguard Worker                  4 * (sizeof(uint8_t) + sizeof(uint32_t)) + sizeof(uint8_t) +
2298*598139dcSAndroid Build Coastguard Worker                  sizeof(uint32_t) + sizeof(uint8_t) + sizeof(uint32_t) +
2299*598139dcSAndroid Build Coastguard Worker                  sizeof("dlroW olleH") - 1;
2300*598139dcSAndroid Build Coastguard Worker 
2301*598139dcSAndroid Build Coastguard Worker   return "[[16909060,72623859790382856,Hello World,[1,2,3,4],1.010203],dlroW "
2302*598139dcSAndroid Build Coastguard Worker          "olleH]";
2303*598139dcSAndroid Build Coastguard Worker }
2304*598139dcSAndroid Build Coastguard Worker 
event_test_7_level_prefix(uint32_t tag,size_t & expected_len)2305*598139dcSAndroid Build Coastguard Worker static const char* event_test_7_level_prefix(uint32_t tag,
2306*598139dcSAndroid Build Coastguard Worker                                              size_t& expected_len) {
2307*598139dcSAndroid Build Coastguard Worker   android_log_context ctx;
2308*598139dcSAndroid Build Coastguard Worker 
2309*598139dcSAndroid Build Coastguard Worker   EXPECT_TRUE(NULL != (ctx = create_android_logger(tag)));
2310*598139dcSAndroid Build Coastguard Worker   if (!ctx) {
2311*598139dcSAndroid Build Coastguard Worker     return NULL;
2312*598139dcSAndroid Build Coastguard Worker   }
2313*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_list_begin(ctx));
2314*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_list_begin(ctx));
2315*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_list_begin(ctx));
2316*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_list_begin(ctx));
2317*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_list_begin(ctx));
2318*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_list_begin(ctx));
2319*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_list_begin(ctx));
2320*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_int32(ctx, 1));
2321*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_list_end(ctx));
2322*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_int32(ctx, 2));
2323*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_list_end(ctx));
2324*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_int32(ctx, 3));
2325*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_list_end(ctx));
2326*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_int32(ctx, 4));
2327*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_list_end(ctx));
2328*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_int32(ctx, 5));
2329*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_list_end(ctx));
2330*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_int32(ctx, 6));
2331*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_list_end(ctx));
2332*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_int32(ctx, 7));
2333*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_list_end(ctx));
2334*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_list(ctx, LOG_ID_EVENTS));
2335*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_destroy(&ctx));
2336*598139dcSAndroid Build Coastguard Worker   EXPECT_TRUE(NULL == ctx);
2337*598139dcSAndroid Build Coastguard Worker 
2338*598139dcSAndroid Build Coastguard Worker   expected_len = sizeof(uint32_t) + 7 * (sizeof(uint8_t) + sizeof(uint8_t) +
2339*598139dcSAndroid Build Coastguard Worker                                          sizeof(uint8_t) + sizeof(uint32_t));
2340*598139dcSAndroid Build Coastguard Worker 
2341*598139dcSAndroid Build Coastguard Worker   return "[[[[[[[1],2],3],4],5],6],7]";
2342*598139dcSAndroid Build Coastguard Worker }
2343*598139dcSAndroid Build Coastguard Worker 
event_test_7_level_suffix(uint32_t tag,size_t & expected_len)2344*598139dcSAndroid Build Coastguard Worker static const char* event_test_7_level_suffix(uint32_t tag,
2345*598139dcSAndroid Build Coastguard Worker                                              size_t& expected_len) {
2346*598139dcSAndroid Build Coastguard Worker   android_log_context ctx;
2347*598139dcSAndroid Build Coastguard Worker 
2348*598139dcSAndroid Build Coastguard Worker   EXPECT_TRUE(NULL != (ctx = create_android_logger(tag)));
2349*598139dcSAndroid Build Coastguard Worker   if (!ctx) {
2350*598139dcSAndroid Build Coastguard Worker     return NULL;
2351*598139dcSAndroid Build Coastguard Worker   }
2352*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_list_begin(ctx));
2353*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_int32(ctx, 1));
2354*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_list_begin(ctx));
2355*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_int32(ctx, 2));
2356*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_list_begin(ctx));
2357*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_int32(ctx, 3));
2358*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_list_begin(ctx));
2359*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_int32(ctx, 4));
2360*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_list_begin(ctx));
2361*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_int32(ctx, 5));
2362*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_list_begin(ctx));
2363*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_int32(ctx, 6));
2364*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_list_end(ctx));
2365*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_list_end(ctx));
2366*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_list_end(ctx));
2367*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_list_end(ctx));
2368*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_list_end(ctx));
2369*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_list_end(ctx));
2370*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_write_list(ctx, LOG_ID_EVENTS));
2371*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_destroy(&ctx));
2372*598139dcSAndroid Build Coastguard Worker   EXPECT_TRUE(NULL == ctx);
2373*598139dcSAndroid Build Coastguard Worker 
2374*598139dcSAndroid Build Coastguard Worker   expected_len = sizeof(uint32_t) + 6 * (sizeof(uint8_t) + sizeof(uint8_t) +
2375*598139dcSAndroid Build Coastguard Worker                                          sizeof(uint8_t) + sizeof(uint32_t));
2376*598139dcSAndroid Build Coastguard Worker 
2377*598139dcSAndroid Build Coastguard Worker   return "[1,[2,[3,[4,[5,[6]]]]]]";
2378*598139dcSAndroid Build Coastguard Worker }
2379*598139dcSAndroid Build Coastguard Worker 
event_test_android_log_error_write(uint32_t tag,size_t & expected_len)2380*598139dcSAndroid Build Coastguard Worker static const char* event_test_android_log_error_write(uint32_t tag,
2381*598139dcSAndroid Build Coastguard Worker                                                       size_t& expected_len) {
2382*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(
2383*598139dcSAndroid Build Coastguard Worker       0, __android_log_error_write(tag, "Hello World", 42, "dlroW olleH", 11));
2384*598139dcSAndroid Build Coastguard Worker 
2385*598139dcSAndroid Build Coastguard Worker   expected_len = sizeof(uint32_t) + sizeof(uint8_t) + sizeof(uint8_t) +
2386*598139dcSAndroid Build Coastguard Worker                  sizeof(uint8_t) + sizeof(uint32_t) + sizeof("Hello World") -
2387*598139dcSAndroid Build Coastguard Worker                  1 + sizeof(uint8_t) + sizeof(uint32_t) + sizeof(uint8_t) +
2388*598139dcSAndroid Build Coastguard Worker                  sizeof(uint32_t) + sizeof("dlroW olleH") - 1;
2389*598139dcSAndroid Build Coastguard Worker 
2390*598139dcSAndroid Build Coastguard Worker   return "[Hello World,42,dlroW olleH]";
2391*598139dcSAndroid Build Coastguard Worker }
2392*598139dcSAndroid Build Coastguard Worker 
event_test_android_log_error_write_null(uint32_t tag,size_t & expected_len)2393*598139dcSAndroid Build Coastguard Worker static const char* event_test_android_log_error_write_null(uint32_t tag,
2394*598139dcSAndroid Build Coastguard Worker                                                            size_t& expected_len) {
2395*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, __android_log_error_write(tag, "Hello World", 42, NULL, 0));
2396*598139dcSAndroid Build Coastguard Worker 
2397*598139dcSAndroid Build Coastguard Worker   expected_len = sizeof(uint32_t) + sizeof(uint8_t) + sizeof(uint8_t) +
2398*598139dcSAndroid Build Coastguard Worker                  sizeof(uint8_t) + sizeof(uint32_t) + sizeof("Hello World") -
2399*598139dcSAndroid Build Coastguard Worker                  1 + sizeof(uint8_t) + sizeof(uint32_t) + sizeof(uint8_t) +
2400*598139dcSAndroid Build Coastguard Worker                  sizeof(uint32_t) + sizeof("") - 1;
2401*598139dcSAndroid Build Coastguard Worker 
2402*598139dcSAndroid Build Coastguard Worker   return "[Hello World,42,]";
2403*598139dcSAndroid Build Coastguard Worker }
2404*598139dcSAndroid Build Coastguard Worker 
2405*598139dcSAndroid Build Coastguard Worker // make sure all user buffers are flushed
print_barrier()2406*598139dcSAndroid Build Coastguard Worker static void print_barrier() {
2407*598139dcSAndroid Build Coastguard Worker   std::cout.flush();
2408*598139dcSAndroid Build Coastguard Worker   fflush(stdout);
2409*598139dcSAndroid Build Coastguard Worker   std::cerr.flush();
2410*598139dcSAndroid Build Coastguard Worker   fflush(stderr);  // everything else is paranoia ...
2411*598139dcSAndroid Build Coastguard Worker }
2412*598139dcSAndroid Build Coastguard Worker 
create_android_logger(const char * (* fn)(uint32_t tag,size_t & expected_len))2413*598139dcSAndroid Build Coastguard Worker static void create_android_logger(const char* (*fn)(uint32_t tag,
2414*598139dcSAndroid Build Coastguard Worker                                                     size_t& expected_len)) {
2415*598139dcSAndroid Build Coastguard Worker   size_t expected_len;
2416*598139dcSAndroid Build Coastguard Worker   const char* expected_string;
2417*598139dcSAndroid Build Coastguard Worker   auto write_function = [&] {
2418*598139dcSAndroid Build Coastguard Worker     expected_string = (*fn)(1005, expected_len);
2419*598139dcSAndroid Build Coastguard Worker     ASSERT_NE(nullptr, expected_string);
2420*598139dcSAndroid Build Coastguard Worker   };
2421*598139dcSAndroid Build Coastguard Worker 
2422*598139dcSAndroid Build Coastguard Worker   pid_t pid = getpid();
2423*598139dcSAndroid Build Coastguard Worker   auto check_function = [&](log_msg log_msg, bool* found) {
2424*598139dcSAndroid Build Coastguard Worker     if (static_cast<size_t>(log_msg.entry.len) != expected_len) {
2425*598139dcSAndroid Build Coastguard Worker       return;
2426*598139dcSAndroid Build Coastguard Worker     }
2427*598139dcSAndroid Build Coastguard Worker 
2428*598139dcSAndroid Build Coastguard Worker     char* eventData = log_msg.msg();
2429*598139dcSAndroid Build Coastguard Worker 
2430*598139dcSAndroid Build Coastguard Worker     AndroidLogFormat* logformat = android_log_format_new();
2431*598139dcSAndroid Build Coastguard Worker     EXPECT_TRUE(NULL != logformat);
2432*598139dcSAndroid Build Coastguard Worker     AndroidLogEntry entry;
2433*598139dcSAndroid Build Coastguard Worker     char msgBuf[1024];
2434*598139dcSAndroid Build Coastguard Worker     int processBinaryLogBuffer =
2435*598139dcSAndroid Build Coastguard Worker         android_log_processBinaryLogBuffer(&log_msg.entry, &entry, nullptr, msgBuf, sizeof(msgBuf));
2436*598139dcSAndroid Build Coastguard Worker     EXPECT_EQ(0, processBinaryLogBuffer);
2437*598139dcSAndroid Build Coastguard Worker     if (processBinaryLogBuffer == 0) {
2438*598139dcSAndroid Build Coastguard Worker       int line_overhead = 20;
2439*598139dcSAndroid Build Coastguard Worker       if (pid > 99999) ++line_overhead;
2440*598139dcSAndroid Build Coastguard Worker       if (pid > 999999) ++line_overhead;
2441*598139dcSAndroid Build Coastguard Worker       print_barrier();
2442*598139dcSAndroid Build Coastguard Worker       int printLogLine = android_log_printLogLine(logformat, stderr, &entry);
2443*598139dcSAndroid Build Coastguard Worker       print_barrier();
2444*598139dcSAndroid Build Coastguard Worker       EXPECT_EQ(line_overhead + (int)strlen(expected_string), printLogLine);
2445*598139dcSAndroid Build Coastguard Worker     }
2446*598139dcSAndroid Build Coastguard Worker     android_log_format_free(logformat);
2447*598139dcSAndroid Build Coastguard Worker 
2448*598139dcSAndroid Build Coastguard Worker     // test buffer reading API
2449*598139dcSAndroid Build Coastguard Worker     int buffer_to_string = -1;
2450*598139dcSAndroid Build Coastguard Worker     if (eventData) {
2451*598139dcSAndroid Build Coastguard Worker       auto* event_header = reinterpret_cast<android_event_header_t*>(eventData);
2452*598139dcSAndroid Build Coastguard Worker       eventData += sizeof(android_event_header_t);
2453*598139dcSAndroid Build Coastguard Worker       snprintf(msgBuf, sizeof(msgBuf), "I/[%" PRId32 "]", event_header->tag);
2454*598139dcSAndroid Build Coastguard Worker       print_barrier();
2455*598139dcSAndroid Build Coastguard Worker       fprintf(stderr, "%-10s(%5u): ", msgBuf, pid);
2456*598139dcSAndroid Build Coastguard Worker       memset(msgBuf, 0, sizeof(msgBuf));
2457*598139dcSAndroid Build Coastguard Worker       buffer_to_string =
2458*598139dcSAndroid Build Coastguard Worker           android_log_buffer_to_string(eventData, log_msg.entry.len, msgBuf, sizeof(msgBuf));
2459*598139dcSAndroid Build Coastguard Worker       fprintf(stderr, "%s\n", msgBuf);
2460*598139dcSAndroid Build Coastguard Worker       print_barrier();
2461*598139dcSAndroid Build Coastguard Worker     }
2462*598139dcSAndroid Build Coastguard Worker     EXPECT_EQ(0, buffer_to_string);
2463*598139dcSAndroid Build Coastguard Worker     EXPECT_STREQ(expected_string, msgBuf);
2464*598139dcSAndroid Build Coastguard Worker     *found = true;
2465*598139dcSAndroid Build Coastguard Worker   };
2466*598139dcSAndroid Build Coastguard Worker 
2467*598139dcSAndroid Build Coastguard Worker   RunLogTests(LOG_ID_EVENTS, write_function, check_function);
2468*598139dcSAndroid Build Coastguard Worker }
2469*598139dcSAndroid Build Coastguard Worker #endif
2470*598139dcSAndroid Build Coastguard Worker 
TEST(liblog,create_android_logger_int32)2471*598139dcSAndroid Build Coastguard Worker TEST(liblog, create_android_logger_int32) {
2472*598139dcSAndroid Build Coastguard Worker #ifdef __ANDROID__
2473*598139dcSAndroid Build Coastguard Worker   create_android_logger(event_test_int32);
2474*598139dcSAndroid Build Coastguard Worker #else
2475*598139dcSAndroid Build Coastguard Worker   GTEST_LOG_(INFO) << "This test does nothing.\n";
2476*598139dcSAndroid Build Coastguard Worker #endif
2477*598139dcSAndroid Build Coastguard Worker }
2478*598139dcSAndroid Build Coastguard Worker 
TEST(liblog,create_android_logger_int64)2479*598139dcSAndroid Build Coastguard Worker TEST(liblog, create_android_logger_int64) {
2480*598139dcSAndroid Build Coastguard Worker #ifdef __ANDROID__
2481*598139dcSAndroid Build Coastguard Worker   create_android_logger(event_test_int64);
2482*598139dcSAndroid Build Coastguard Worker #else
2483*598139dcSAndroid Build Coastguard Worker   GTEST_LOG_(INFO) << "This test does nothing.\n";
2484*598139dcSAndroid Build Coastguard Worker #endif
2485*598139dcSAndroid Build Coastguard Worker }
2486*598139dcSAndroid Build Coastguard Worker 
TEST(liblog,create_android_logger_list_int64)2487*598139dcSAndroid Build Coastguard Worker TEST(liblog, create_android_logger_list_int64) {
2488*598139dcSAndroid Build Coastguard Worker #ifdef __ANDROID__
2489*598139dcSAndroid Build Coastguard Worker   create_android_logger(event_test_list_int64);
2490*598139dcSAndroid Build Coastguard Worker #else
2491*598139dcSAndroid Build Coastguard Worker   GTEST_LOG_(INFO) << "This test does nothing.\n";
2492*598139dcSAndroid Build Coastguard Worker #endif
2493*598139dcSAndroid Build Coastguard Worker }
2494*598139dcSAndroid Build Coastguard Worker 
TEST(liblog,create_android_logger_simple_automagic_list)2495*598139dcSAndroid Build Coastguard Worker TEST(liblog, create_android_logger_simple_automagic_list) {
2496*598139dcSAndroid Build Coastguard Worker #ifdef __ANDROID__
2497*598139dcSAndroid Build Coastguard Worker   create_android_logger(event_test_simple_automagic_list);
2498*598139dcSAndroid Build Coastguard Worker #else
2499*598139dcSAndroid Build Coastguard Worker   GTEST_LOG_(INFO) << "This test does nothing.\n";
2500*598139dcSAndroid Build Coastguard Worker #endif
2501*598139dcSAndroid Build Coastguard Worker }
2502*598139dcSAndroid Build Coastguard Worker 
TEST(liblog,create_android_logger_list_empty)2503*598139dcSAndroid Build Coastguard Worker TEST(liblog, create_android_logger_list_empty) {
2504*598139dcSAndroid Build Coastguard Worker #ifdef __ANDROID__
2505*598139dcSAndroid Build Coastguard Worker   create_android_logger(event_test_list_empty);
2506*598139dcSAndroid Build Coastguard Worker #else
2507*598139dcSAndroid Build Coastguard Worker   GTEST_LOG_(INFO) << "This test does nothing.\n";
2508*598139dcSAndroid Build Coastguard Worker #endif
2509*598139dcSAndroid Build Coastguard Worker }
2510*598139dcSAndroid Build Coastguard Worker 
TEST(liblog,create_android_logger_complex_nested_list)2511*598139dcSAndroid Build Coastguard Worker TEST(liblog, create_android_logger_complex_nested_list) {
2512*598139dcSAndroid Build Coastguard Worker #ifdef __ANDROID__
2513*598139dcSAndroid Build Coastguard Worker   create_android_logger(event_test_complex_nested_list);
2514*598139dcSAndroid Build Coastguard Worker #else
2515*598139dcSAndroid Build Coastguard Worker   GTEST_LOG_(INFO) << "This test does nothing.\n";
2516*598139dcSAndroid Build Coastguard Worker #endif
2517*598139dcSAndroid Build Coastguard Worker }
2518*598139dcSAndroid Build Coastguard Worker 
TEST(liblog,create_android_logger_7_level_prefix)2519*598139dcSAndroid Build Coastguard Worker TEST(liblog, create_android_logger_7_level_prefix) {
2520*598139dcSAndroid Build Coastguard Worker #ifdef __ANDROID__
2521*598139dcSAndroid Build Coastguard Worker   create_android_logger(event_test_7_level_prefix);
2522*598139dcSAndroid Build Coastguard Worker #else
2523*598139dcSAndroid Build Coastguard Worker   GTEST_LOG_(INFO) << "This test does nothing.\n";
2524*598139dcSAndroid Build Coastguard Worker #endif
2525*598139dcSAndroid Build Coastguard Worker }
2526*598139dcSAndroid Build Coastguard Worker 
TEST(liblog,create_android_logger_7_level_suffix)2527*598139dcSAndroid Build Coastguard Worker TEST(liblog, create_android_logger_7_level_suffix) {
2528*598139dcSAndroid Build Coastguard Worker #ifdef __ANDROID__
2529*598139dcSAndroid Build Coastguard Worker   create_android_logger(event_test_7_level_suffix);
2530*598139dcSAndroid Build Coastguard Worker #else
2531*598139dcSAndroid Build Coastguard Worker   GTEST_LOG_(INFO) << "This test does nothing.\n";
2532*598139dcSAndroid Build Coastguard Worker #endif
2533*598139dcSAndroid Build Coastguard Worker }
2534*598139dcSAndroid Build Coastguard Worker 
TEST(liblog,create_android_logger_android_log_error_write)2535*598139dcSAndroid Build Coastguard Worker TEST(liblog, create_android_logger_android_log_error_write) {
2536*598139dcSAndroid Build Coastguard Worker #ifdef __ANDROID__
2537*598139dcSAndroid Build Coastguard Worker   create_android_logger(event_test_android_log_error_write);
2538*598139dcSAndroid Build Coastguard Worker #else
2539*598139dcSAndroid Build Coastguard Worker   GTEST_LOG_(INFO) << "This test does nothing.\n";
2540*598139dcSAndroid Build Coastguard Worker #endif
2541*598139dcSAndroid Build Coastguard Worker }
2542*598139dcSAndroid Build Coastguard Worker 
TEST(liblog,create_android_logger_android_log_error_write_null)2543*598139dcSAndroid Build Coastguard Worker TEST(liblog, create_android_logger_android_log_error_write_null) {
2544*598139dcSAndroid Build Coastguard Worker #ifdef __ANDROID__
2545*598139dcSAndroid Build Coastguard Worker   create_android_logger(event_test_android_log_error_write_null);
2546*598139dcSAndroid Build Coastguard Worker #else
2547*598139dcSAndroid Build Coastguard Worker   GTEST_LOG_(INFO) << "This test does nothing.\n";
2548*598139dcSAndroid Build Coastguard Worker #endif
2549*598139dcSAndroid Build Coastguard Worker }
2550*598139dcSAndroid Build Coastguard Worker 
TEST(liblog,create_android_logger_overflow)2551*598139dcSAndroid Build Coastguard Worker TEST(liblog, create_android_logger_overflow) {
2552*598139dcSAndroid Build Coastguard Worker   android_log_context ctx;
2553*598139dcSAndroid Build Coastguard Worker 
2554*598139dcSAndroid Build Coastguard Worker   EXPECT_TRUE(NULL != (ctx = create_android_logger(1005)));
2555*598139dcSAndroid Build Coastguard Worker   if (ctx) {
2556*598139dcSAndroid Build Coastguard Worker     for (size_t i = 0; i < ANDROID_MAX_LIST_NEST_DEPTH; ++i) {
2557*598139dcSAndroid Build Coastguard Worker       EXPECT_LE(0, android_log_write_list_begin(ctx));
2558*598139dcSAndroid Build Coastguard Worker     }
2559*598139dcSAndroid Build Coastguard Worker     EXPECT_GT(0, android_log_write_list_begin(ctx));
2560*598139dcSAndroid Build Coastguard Worker     /* One more for good measure, must be permanently unhappy */
2561*598139dcSAndroid Build Coastguard Worker     EXPECT_GT(0, android_log_write_list_begin(ctx));
2562*598139dcSAndroid Build Coastguard Worker     EXPECT_LE(0, android_log_destroy(&ctx));
2563*598139dcSAndroid Build Coastguard Worker     EXPECT_TRUE(NULL == ctx);
2564*598139dcSAndroid Build Coastguard Worker   }
2565*598139dcSAndroid Build Coastguard Worker 
2566*598139dcSAndroid Build Coastguard Worker   ASSERT_TRUE(NULL != (ctx = create_android_logger(1005)));
2567*598139dcSAndroid Build Coastguard Worker   for (size_t i = 0; i < ANDROID_MAX_LIST_NEST_DEPTH; ++i) {
2568*598139dcSAndroid Build Coastguard Worker     EXPECT_LE(0, android_log_write_list_begin(ctx));
2569*598139dcSAndroid Build Coastguard Worker     EXPECT_LE(0, android_log_write_int32(ctx, i));
2570*598139dcSAndroid Build Coastguard Worker   }
2571*598139dcSAndroid Build Coastguard Worker   EXPECT_GT(0, android_log_write_list_begin(ctx));
2572*598139dcSAndroid Build Coastguard Worker   /* One more for good measure, must be permanently unhappy */
2573*598139dcSAndroid Build Coastguard Worker   EXPECT_GT(0, android_log_write_list_begin(ctx));
2574*598139dcSAndroid Build Coastguard Worker   EXPECT_LE(0, android_log_destroy(&ctx));
2575*598139dcSAndroid Build Coastguard Worker   ASSERT_TRUE(NULL == ctx);
2576*598139dcSAndroid Build Coastguard Worker }
2577*598139dcSAndroid Build Coastguard Worker 
2578*598139dcSAndroid Build Coastguard Worker #ifdef ENABLE_FLAKY_TESTS
2579*598139dcSAndroid Build Coastguard Worker #ifdef __ANDROID__
2580*598139dcSAndroid Build Coastguard Worker #ifndef NO_PSTORE
2581*598139dcSAndroid Build Coastguard Worker static const char __pmsg_file[] =
2582*598139dcSAndroid Build Coastguard Worker     "/data/william-shakespeare/MuchAdoAboutNothing.txt";
2583*598139dcSAndroid Build Coastguard Worker #endif /* NO_PSTORE */
2584*598139dcSAndroid Build Coastguard Worker #endif
2585*598139dcSAndroid Build Coastguard Worker 
TEST(liblog,__android_log_pmsg_file_write)2586*598139dcSAndroid Build Coastguard Worker TEST(liblog, __android_log_pmsg_file_write) {
2587*598139dcSAndroid Build Coastguard Worker #ifdef __ANDROID__
2588*598139dcSAndroid Build Coastguard Worker #ifndef NO_PSTORE
2589*598139dcSAndroid Build Coastguard Worker   __android_log_close();
2590*598139dcSAndroid Build Coastguard Worker   if (getuid() == AID_ROOT) {
2591*598139dcSAndroid Build Coastguard Worker     tested__android_log_close = true;
2592*598139dcSAndroid Build Coastguard Worker     bool pmsgActiveAfter__android_log_close = isPmsgActive();
2593*598139dcSAndroid Build Coastguard Worker     bool logdwActiveAfter__android_log_close = isLogdwActive();
2594*598139dcSAndroid Build Coastguard Worker     EXPECT_FALSE(pmsgActiveAfter__android_log_close);
2595*598139dcSAndroid Build Coastguard Worker     EXPECT_FALSE(logdwActiveAfter__android_log_close);
2596*598139dcSAndroid Build Coastguard Worker   } else if (!tested__android_log_close) {
2597*598139dcSAndroid Build Coastguard Worker     fprintf(stderr, "WARNING: can not test __android_log_close()\n");
2598*598139dcSAndroid Build Coastguard Worker   }
2599*598139dcSAndroid Build Coastguard Worker   int return__android_log_pmsg_file_write = __android_log_pmsg_file_write(
2600*598139dcSAndroid Build Coastguard Worker       LOG_ID_CRASH, ANDROID_LOG_VERBOSE, __pmsg_file, max_payload_buf,
2601*598139dcSAndroid Build Coastguard Worker       sizeof(max_payload_buf));
2602*598139dcSAndroid Build Coastguard Worker   EXPECT_LT(0, return__android_log_pmsg_file_write);
2603*598139dcSAndroid Build Coastguard Worker   if (return__android_log_pmsg_file_write == -ENOMEM) {
2604*598139dcSAndroid Build Coastguard Worker     fprintf(stderr,
2605*598139dcSAndroid Build Coastguard Worker             "Kernel does not have space allocated to pmsg pstore driver "
2606*598139dcSAndroid Build Coastguard Worker             "configured\n");
2607*598139dcSAndroid Build Coastguard Worker   } else if (!return__android_log_pmsg_file_write) {
2608*598139dcSAndroid Build Coastguard Worker     fprintf(stderr,
2609*598139dcSAndroid Build Coastguard Worker             "Reboot, ensure file %s matches\n"
2610*598139dcSAndroid Build Coastguard Worker             "with liblog.__android_log_msg_file_read test\n",
2611*598139dcSAndroid Build Coastguard Worker             __pmsg_file);
2612*598139dcSAndroid Build Coastguard Worker   }
2613*598139dcSAndroid Build Coastguard Worker   bool pmsgActiveAfter__android_pmsg_file_write;
2614*598139dcSAndroid Build Coastguard Worker   bool logdwActiveAfter__android_pmsg_file_write;
2615*598139dcSAndroid Build Coastguard Worker   if (getuid() == AID_ROOT) {
2616*598139dcSAndroid Build Coastguard Worker     pmsgActiveAfter__android_pmsg_file_write = isPmsgActive();
2617*598139dcSAndroid Build Coastguard Worker     logdwActiveAfter__android_pmsg_file_write = isLogdwActive();
2618*598139dcSAndroid Build Coastguard Worker     EXPECT_FALSE(pmsgActiveAfter__android_pmsg_file_write);
2619*598139dcSAndroid Build Coastguard Worker     EXPECT_FALSE(logdwActiveAfter__android_pmsg_file_write);
2620*598139dcSAndroid Build Coastguard Worker   }
2621*598139dcSAndroid Build Coastguard Worker   EXPECT_LT(
2622*598139dcSAndroid Build Coastguard Worker       0, __android_log_buf_print(LOG_ID_MAIN, ANDROID_LOG_INFO,
2623*598139dcSAndroid Build Coastguard Worker                                  "TEST__android_log_pmsg_file_write", "main"));
2624*598139dcSAndroid Build Coastguard Worker   if (getuid() == AID_ROOT) {
2625*598139dcSAndroid Build Coastguard Worker     bool pmsgActiveAfter__android_log_buf_print = isPmsgActive();
2626*598139dcSAndroid Build Coastguard Worker     bool logdwActiveAfter__android_log_buf_print = isLogdwActive();
2627*598139dcSAndroid Build Coastguard Worker     EXPECT_TRUE(pmsgActiveAfter__android_log_buf_print);
2628*598139dcSAndroid Build Coastguard Worker     EXPECT_TRUE(logdwActiveAfter__android_log_buf_print);
2629*598139dcSAndroid Build Coastguard Worker   }
2630*598139dcSAndroid Build Coastguard Worker   EXPECT_LT(0, __android_log_pmsg_file_write(LOG_ID_CRASH, ANDROID_LOG_VERBOSE,
2631*598139dcSAndroid Build Coastguard Worker                                              __pmsg_file, max_payload_buf,
2632*598139dcSAndroid Build Coastguard Worker                                              sizeof(max_payload_buf)));
2633*598139dcSAndroid Build Coastguard Worker   if (getuid() == AID_ROOT) {
2634*598139dcSAndroid Build Coastguard Worker     pmsgActiveAfter__android_pmsg_file_write = isPmsgActive();
2635*598139dcSAndroid Build Coastguard Worker     logdwActiveAfter__android_pmsg_file_write = isLogdwActive();
2636*598139dcSAndroid Build Coastguard Worker     EXPECT_TRUE(pmsgActiveAfter__android_pmsg_file_write);
2637*598139dcSAndroid Build Coastguard Worker     EXPECT_TRUE(logdwActiveAfter__android_pmsg_file_write);
2638*598139dcSAndroid Build Coastguard Worker   }
2639*598139dcSAndroid Build Coastguard Worker #else  /* NO_PSTORE */
2640*598139dcSAndroid Build Coastguard Worker   GTEST_LOG_(INFO) << "This test does nothing because of NO_PSTORE.\n";
2641*598139dcSAndroid Build Coastguard Worker #endif /* NO_PSTORE */
2642*598139dcSAndroid Build Coastguard Worker #else
2643*598139dcSAndroid Build Coastguard Worker   GTEST_LOG_(INFO) << "This test does nothing.\n";
2644*598139dcSAndroid Build Coastguard Worker #endif
2645*598139dcSAndroid Build Coastguard Worker }
2646*598139dcSAndroid Build Coastguard Worker 
2647*598139dcSAndroid Build Coastguard Worker #ifdef __ANDROID__
2648*598139dcSAndroid Build Coastguard Worker #ifndef NO_PSTORE
__pmsg_fn(log_id_t logId,char prio,const char * filename,const char * buf,size_t len,void * arg)2649*598139dcSAndroid Build Coastguard Worker static ssize_t __pmsg_fn(log_id_t logId, char prio, const char* filename,
2650*598139dcSAndroid Build Coastguard Worker                          const char* buf, size_t len, void* arg) {
2651*598139dcSAndroid Build Coastguard Worker   EXPECT_TRUE(NULL == arg);
2652*598139dcSAndroid Build Coastguard Worker   EXPECT_EQ(LOG_ID_CRASH, logId);
2653*598139dcSAndroid Build Coastguard Worker   EXPECT_EQ(ANDROID_LOG_VERBOSE, prio);
2654*598139dcSAndroid Build Coastguard Worker   EXPECT_FALSE(NULL == strstr(__pmsg_file, filename));
2655*598139dcSAndroid Build Coastguard Worker   EXPECT_EQ(len, sizeof(max_payload_buf));
2656*598139dcSAndroid Build Coastguard Worker   EXPECT_STREQ(max_payload_buf, buf);
2657*598139dcSAndroid Build Coastguard Worker 
2658*598139dcSAndroid Build Coastguard Worker   ++signaled;
2659*598139dcSAndroid Build Coastguard Worker   if ((len != sizeof(max_payload_buf)) || strcmp(max_payload_buf, buf)) {
2660*598139dcSAndroid Build Coastguard Worker     fprintf(stderr, "comparison fails on content \"%s\"\n", buf);
2661*598139dcSAndroid Build Coastguard Worker   }
2662*598139dcSAndroid Build Coastguard Worker   return arg || (LOG_ID_CRASH != logId) || (ANDROID_LOG_VERBOSE != prio) ||
2663*598139dcSAndroid Build Coastguard Worker                  !strstr(__pmsg_file, filename) ||
2664*598139dcSAndroid Build Coastguard Worker                  (len != sizeof(max_payload_buf)) ||
2665*598139dcSAndroid Build Coastguard Worker                  !!strcmp(max_payload_buf, buf)
2666*598139dcSAndroid Build Coastguard Worker              ? -ENOEXEC
2667*598139dcSAndroid Build Coastguard Worker              : 1;
2668*598139dcSAndroid Build Coastguard Worker }
2669*598139dcSAndroid Build Coastguard Worker #endif /* NO_PSTORE */
2670*598139dcSAndroid Build Coastguard Worker #endif
2671*598139dcSAndroid Build Coastguard Worker 
TEST(liblog,__android_log_pmsg_file_read)2672*598139dcSAndroid Build Coastguard Worker TEST(liblog, __android_log_pmsg_file_read) {
2673*598139dcSAndroid Build Coastguard Worker #ifdef __ANDROID__
2674*598139dcSAndroid Build Coastguard Worker #ifndef NO_PSTORE
2675*598139dcSAndroid Build Coastguard Worker   signaled = 0;
2676*598139dcSAndroid Build Coastguard Worker 
2677*598139dcSAndroid Build Coastguard Worker   __android_log_close();
2678*598139dcSAndroid Build Coastguard Worker   if (getuid() == AID_ROOT) {
2679*598139dcSAndroid Build Coastguard Worker     tested__android_log_close = true;
2680*598139dcSAndroid Build Coastguard Worker     bool pmsgActiveAfter__android_log_close = isPmsgActive();
2681*598139dcSAndroid Build Coastguard Worker     bool logdwActiveAfter__android_log_close = isLogdwActive();
2682*598139dcSAndroid Build Coastguard Worker     EXPECT_FALSE(pmsgActiveAfter__android_log_close);
2683*598139dcSAndroid Build Coastguard Worker     EXPECT_FALSE(logdwActiveAfter__android_log_close);
2684*598139dcSAndroid Build Coastguard Worker   } else if (!tested__android_log_close) {
2685*598139dcSAndroid Build Coastguard Worker     fprintf(stderr, "WARNING: can not test __android_log_close()\n");
2686*598139dcSAndroid Build Coastguard Worker   }
2687*598139dcSAndroid Build Coastguard Worker 
2688*598139dcSAndroid Build Coastguard Worker   ssize_t ret = __android_log_pmsg_file_read(LOG_ID_CRASH, ANDROID_LOG_VERBOSE,
2689*598139dcSAndroid Build Coastguard Worker                                              __pmsg_file, __pmsg_fn, NULL);
2690*598139dcSAndroid Build Coastguard Worker 
2691*598139dcSAndroid Build Coastguard Worker   if (getuid() == AID_ROOT) {
2692*598139dcSAndroid Build Coastguard Worker     bool pmsgActiveAfter__android_log_pmsg_file_read = isPmsgActive();
2693*598139dcSAndroid Build Coastguard Worker     bool logdwActiveAfter__android_log_pmsg_file_read = isLogdwActive();
2694*598139dcSAndroid Build Coastguard Worker     EXPECT_FALSE(pmsgActiveAfter__android_log_pmsg_file_read);
2695*598139dcSAndroid Build Coastguard Worker     EXPECT_FALSE(logdwActiveAfter__android_log_pmsg_file_read);
2696*598139dcSAndroid Build Coastguard Worker   }
2697*598139dcSAndroid Build Coastguard Worker 
2698*598139dcSAndroid Build Coastguard Worker   if (ret == -ENOENT) {
2699*598139dcSAndroid Build Coastguard Worker     fprintf(stderr,
2700*598139dcSAndroid Build Coastguard Worker             "No pre-boot results of liblog.__android_log_mesg_file_write to "
2701*598139dcSAndroid Build Coastguard Worker             "compare with,\n"
2702*598139dcSAndroid Build Coastguard Worker             "false positive test result.\n");
2703*598139dcSAndroid Build Coastguard Worker     return;
2704*598139dcSAndroid Build Coastguard Worker   }
2705*598139dcSAndroid Build Coastguard Worker 
2706*598139dcSAndroid Build Coastguard Worker   EXPECT_LT(0, ret);
2707*598139dcSAndroid Build Coastguard Worker   EXPECT_EQ(1U, signaled);
2708*598139dcSAndroid Build Coastguard Worker #else  /* NO_PSTORE */
2709*598139dcSAndroid Build Coastguard Worker   GTEST_LOG_(INFO) << "This test does nothing because of NO_PSTORE.\n";
2710*598139dcSAndroid Build Coastguard Worker #endif /* NO_PSTORE */
2711*598139dcSAndroid Build Coastguard Worker #else
2712*598139dcSAndroid Build Coastguard Worker   GTEST_LOG_(INFO) << "This test does nothing.\n";
2713*598139dcSAndroid Build Coastguard Worker #endif
2714*598139dcSAndroid Build Coastguard Worker }
2715*598139dcSAndroid Build Coastguard Worker #endif  // ENABLE_FLAKY_TESTS
2716