1d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn/*
2d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn * Copyright (C) 2014 The Android Open Source Project
3d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn *
4d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn * Licensed under the Apache License, Version 2.0 (the "License");
5d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn * you may not use this file except in compliance with the License.
6d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn * You may obtain a copy of the License at
7d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn *
8d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn *      http://www.apache.org/licenses/LICENSE-2.0
9d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn *
10d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn * Unless required by applicable law or agreed to in writing, software
11d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn * distributed under the License is distributed on an "AS IS" BASIS,
12d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn * See the License for the specific language governing permissions and
14d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn * limitations under the License.
15d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn */
16d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
17d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn#include <fcntl.h>
18696817d3524e2fb8bbbcc2ec3526f4383f789163Mark Salyzyn#include <poll.h>
19d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn#include <signal.h>
20d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn#include <stdio.h>
21d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn#include <string.h>
22d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
23d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn#include <gtest/gtest.h>
24d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
25d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn#include "cutils/sockets.h"
26e821dace4161c5fdf19d8af036381b850d0fb988Mark Salyzyn#include "log/log.h"
27d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn#include "log/logger.h"
28d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
29d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn#define __unused __attribute__((__unused__))
30d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
31d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn/*
32d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn * returns statistics
33d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn */
34d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzynstatic void my_android_logger_get_statistics(char *buf, size_t len)
35d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn{
3699f47a9e7c4374f2bbfc18e4a97aa7848245ea33Mark Salyzyn    snprintf(buf, len, "getStatistics 0 1 2 3 4");
37d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    int sock = socket_local_client("logd",
38d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn                                   ANDROID_SOCKET_NAMESPACE_RESERVED,
39d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn                                   SOCK_STREAM);
40d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    if (sock >= 0) {
41d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        if (write(sock, buf, strlen(buf) + 1) > 0) {
42696817d3524e2fb8bbbcc2ec3526f4383f789163Mark Salyzyn            ssize_t ret;
43696817d3524e2fb8bbbcc2ec3526f4383f789163Mark Salyzyn            while ((ret = read(sock, buf, len)) > 0) {
44696817d3524e2fb8bbbcc2ec3526f4383f789163Mark Salyzyn                if ((size_t)ret == len) {
45696817d3524e2fb8bbbcc2ec3526f4383f789163Mark Salyzyn                    break;
46696817d3524e2fb8bbbcc2ec3526f4383f789163Mark Salyzyn                }
47696817d3524e2fb8bbbcc2ec3526f4383f789163Mark Salyzyn                len -= ret;
48696817d3524e2fb8bbbcc2ec3526f4383f789163Mark Salyzyn                buf += ret;
49696817d3524e2fb8bbbcc2ec3526f4383f789163Mark Salyzyn
50696817d3524e2fb8bbbcc2ec3526f4383f789163Mark Salyzyn                struct pollfd p = {
51696817d3524e2fb8bbbcc2ec3526f4383f789163Mark Salyzyn                    .fd = sock,
52696817d3524e2fb8bbbcc2ec3526f4383f789163Mark Salyzyn                    .events = POLLIN,
53696817d3524e2fb8bbbcc2ec3526f4383f789163Mark Salyzyn                    .revents = 0
54696817d3524e2fb8bbbcc2ec3526f4383f789163Mark Salyzyn                };
55696817d3524e2fb8bbbcc2ec3526f4383f789163Mark Salyzyn
56696817d3524e2fb8bbbcc2ec3526f4383f789163Mark Salyzyn                ret = poll(&p, 1, 20);
57696817d3524e2fb8bbbcc2ec3526f4383f789163Mark Salyzyn                if ((ret <= 0) || !(p.revents & POLLIN)) {
58696817d3524e2fb8bbbcc2ec3526f4383f789163Mark Salyzyn                    break;
59696817d3524e2fb8bbbcc2ec3526f4383f789163Mark Salyzyn                }
60696817d3524e2fb8bbbcc2ec3526f4383f789163Mark Salyzyn            }
61d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        }
62d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        close(sock);
63d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    }
64d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn}
65d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
66d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzynstatic void alloc_statistics(char **buffer, size_t *length)
67d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn{
68d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    size_t len = 8192;
69d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    char *buf;
70d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
71d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    for(int retry = 32; (retry >= 0); delete [] buf, --retry) {
72d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        buf = new char [len];
73d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        my_android_logger_get_statistics(buf, len);
74d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
75d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        buf[len-1] = '\0';
76d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        size_t ret = atol(buf) + 1;
77d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        if (ret < 4) {
78d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            delete [] buf;
79d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            buf = NULL;
80d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            break;
81d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        }
82d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        bool check = ret <= len;
83d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        len = ret;
84d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        if (check) {
85d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            break;
86d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        }
87d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        len += len / 8; // allow for some slop
88d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    }
89d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    *buffer = buf;
90d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    *length = len;
91d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn}
92d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
93d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzynstatic char *find_benchmark_spam(char *cp)
94d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn{
95d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    // liblog_benchmarks has been run designed to SPAM.  The signature of
96d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    // a noisiest UID statistics is one of the following:
97d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    //
98d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    // main: UID/PID Total size/num   Now          UID/PID[?]  Total
99d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    // 0           7500306/304207     71608/3183   0/4225?     7454388/303656
100e821dace4161c5fdf19d8af036381b850d0fb988Mark Salyzyn    //    <wrap>                                                     93432/1012
101d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    // -or-
102e821dace4161c5fdf19d8af036381b850d0fb988Mark Salyzyn    // 0/gone      7454388/303656     93432/1012
103d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    //
104d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    // basically if we see a *large* number of 0/????? entries
105d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    unsigned long value;
106d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    do {
107d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        char *benchmark = strstr(cp, " 0/");
108d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        char *benchmark_newline = strstr(cp, "\n0/");
109d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        if (!benchmark) {
110d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            benchmark = benchmark_newline;
111d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        }
112d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        if (benchmark_newline && (benchmark > benchmark_newline)) {
113d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            benchmark = benchmark_newline;
114d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        }
115d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        cp = benchmark;
116d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        if (!cp) {
117d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            break;
118d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        }
119d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        cp += 3;
120d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        while (isdigit(*cp) || (*cp == 'g') || (*cp == 'o') || (*cp == 'n')) {
121d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            ++cp;
122d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        }
123d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        value = 0;
124d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        // ###? or gone
125d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        if ((*cp == '?') || (*cp == 'e')) {
126d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            while (*++cp == ' ');
127d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            while (isdigit(*cp)) {
128d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn                value = value * 10ULL + *cp - '0';
129d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn                ++cp;
130d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            }
131e821dace4161c5fdf19d8af036381b850d0fb988Mark Salyzyn            if (*cp != '/') {
132e821dace4161c5fdf19d8af036381b850d0fb988Mark Salyzyn                value = 0;
133e821dace4161c5fdf19d8af036381b850d0fb988Mark Salyzyn                continue;
134e821dace4161c5fdf19d8af036381b850d0fb988Mark Salyzyn            }
135e821dace4161c5fdf19d8af036381b850d0fb988Mark Salyzyn            while (isdigit(*++cp));
136e821dace4161c5fdf19d8af036381b850d0fb988Mark Salyzyn            while (*cp == ' ') ++cp;
137e821dace4161c5fdf19d8af036381b850d0fb988Mark Salyzyn            if (!isdigit(*cp)) {
138e821dace4161c5fdf19d8af036381b850d0fb988Mark Salyzyn                value = 0;
139e821dace4161c5fdf19d8af036381b850d0fb988Mark Salyzyn            }
140d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        }
141d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    } while ((value < 900000ULL) && *cp);
142d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    return cp;
143d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn}
144d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
145d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark SalyzynTEST(logd, statistics) {
146d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    size_t len;
147d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    char *buf;
148d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
149d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    alloc_statistics(&buf, &len);
150d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
151d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn#ifdef TARGET_USES_LOGD
152d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    ASSERT_TRUE(NULL != buf);
153d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn#else
154d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    if (!buf) {
155d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        return;
156d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    }
157d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn#endif
158d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
159d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    // remove trailing FF
160d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    char *cp = buf + len - 1;
161d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    *cp = '\0';
162d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    bool truncated = *--cp != '\f';
163d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    if (!truncated) {
164d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        *cp = '\0';
165d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    }
166d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
167d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    // squash out the byte count
168d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    cp = buf;
169d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    if (!truncated) {
170d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        while (isdigit(*cp) || (*cp == '\n')) {
171d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            ++cp;
172d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        }
173d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    }
174d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
175d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    fprintf(stderr, "%s", cp);
176d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
177d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    EXPECT_LT((size_t)64, strlen(cp));
178d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
179d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    EXPECT_EQ(0, truncated);
180d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
181d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn#ifdef TARGET_USES_LOGD
182d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    char *main_logs = strstr(cp, "\nmain:");
183d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    EXPECT_TRUE(NULL != main_logs);
184d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
185d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    char *radio_logs = strstr(cp, "\nradio:");
186d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    EXPECT_TRUE(NULL != radio_logs);
187d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
188d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    char *system_logs = strstr(cp, "\nsystem:");
189d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    EXPECT_TRUE(NULL != system_logs);
190d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
191d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    char *events_logs = strstr(cp, "\nevents:");
192d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    EXPECT_TRUE(NULL != events_logs);
193d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn#endif
194d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
195d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    // Parse timing stats
196d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
197d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    cp = strstr(cp, "Minimum time between log events per dgram_qlen:");
198d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
199d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    if (cp) {
200d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        while (*cp && (*cp != '\n')) {
201d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            ++cp;
202d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        }
203d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        if (*cp == '\n') {
204d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            ++cp;
205d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        }
206d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
207d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        char *list_of_spans = cp;
208d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        EXPECT_NE('\0', *list_of_spans);
209d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
210d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        unsigned short number_of_buckets = 0;
211d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        unsigned short *dgram_qlen = NULL;
212d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        unsigned short bucket = 0;
213d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        while (*cp && (*cp != '\n')) {
214d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            bucket = 0;
215d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            while (isdigit(*cp)) {
216d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn                bucket = bucket * 10 + *cp - '0';
217d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn                ++cp;
218d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            }
219d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            while (*cp == ' ') {
220d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn                ++cp;
221d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            }
222d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            if (!bucket) {
223d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn                break;
224d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            }
225d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            unsigned short *new_dgram_qlen = new unsigned short[number_of_buckets + 1];
226d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            EXPECT_TRUE(new_dgram_qlen != NULL);
227d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            if (dgram_qlen) {
228d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn                memcpy(new_dgram_qlen, dgram_qlen, sizeof(*dgram_qlen) * number_of_buckets);
229d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn                delete [] dgram_qlen;
230d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            }
231d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
232d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            dgram_qlen = new_dgram_qlen;
233d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            dgram_qlen[number_of_buckets++] = bucket;
234d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        }
235d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
236d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        char *end_of_spans = cp;
237d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        EXPECT_NE('\0', *end_of_spans);
238d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
239d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        EXPECT_LT(5, number_of_buckets);
240d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
241d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        unsigned long long *times = new unsigned long long [number_of_buckets];
242d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        ASSERT_TRUE(times != NULL);
243d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
244d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        memset(times, 0, sizeof(*times) * number_of_buckets);
245d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
246d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        while (*cp == '\n') {
247d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            ++cp;
248d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        }
249d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
250d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        unsigned short number_of_values = 0;
251d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        unsigned long long value;
252d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        while (*cp && (*cp != '\n')) {
253d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            EXPECT_GE(number_of_buckets, number_of_values);
254d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
255d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            value = 0;
256d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            while (isdigit(*cp)) {
257d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn                value = value * 10ULL + *cp - '0';
258d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn                ++cp;
259d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            }
260d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
261d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            switch(*cp) {
262d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            case ' ':
263d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            case '\n':
264d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn                value *= 1000ULL;
265d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn                /* FALLTHRU */
266d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            case 'm':
267d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn                value *= 1000ULL;
268d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn                /* FALLTHRU */
269d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            case 'u':
270d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn                value *= 1000ULL;
271d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn                /* FALLTHRU */
272d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            case 'n':
273d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            default:
274d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn                break;
275d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            }
276d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            while (*++cp == ' ');
277d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
278d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            if (!value) {
279d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn                break;
280d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            }
281d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
282d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            times[number_of_values] = value;
283d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            ++number_of_values;
284d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        }
285d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
286d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn#ifdef TARGET_USES_LOGD
287d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        EXPECT_EQ(number_of_values, number_of_buckets);
288d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn#endif
289d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
290d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        FILE *fp;
291d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        ASSERT_TRUE(NULL != (fp = fopen("/proc/sys/net/unix/max_dgram_qlen", "r")));
292d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
293d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        unsigned max_dgram_qlen = 0;
294d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        fscanf(fp, "%u", &max_dgram_qlen);
295d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
296d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        fclose(fp);
297d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
298d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        // Find launch point
299d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        unsigned short launch = 0;
300d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        unsigned long long total = 0;
301d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        do {
302d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            total += times[launch];
303d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        } while (((++launch < number_of_buckets)
304d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn                && ((total / launch) >= (times[launch] / 8ULL)))
305d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            || (launch == 1)); // too soon
306d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
307d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        bool failure = number_of_buckets <= launch;
308d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        if (!failure) {
309d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            unsigned short l = launch;
310d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            if (l >= number_of_buckets) {
311d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn                l = number_of_buckets - 1;
312d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            }
313d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            failure = max_dgram_qlen < dgram_qlen[l];
314d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        }
315d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
316d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        // We can get failure if at any time liblog_benchmarks has been run
317d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        // because designed to overload /proc/sys/net/unix/max_dgram_qlen even
318d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        // at excessive values like 20000. It does so to measure the raw processing
319d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        // performance of logd.
320d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        if (failure) {
321d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            cp = find_benchmark_spam(cp);
322d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        }
323d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
324d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        if (cp) {
325d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            // Fake a failure, but without the failure code
326d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            if (number_of_buckets <= launch) {
327d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn                printf ("Expected: number_of_buckets > launch, actual: %u vs %u\n",
328d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn                        number_of_buckets, launch);
329d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            }
330d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            if (launch >= number_of_buckets) {
331d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn                launch = number_of_buckets - 1;
332d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            }
333d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            if (max_dgram_qlen < dgram_qlen[launch]) {
334d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn                printf ("Expected: max_dgram_qlen >= dgram_qlen[%d],"
335d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn                            " actual: %u vs %u\n",
336d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn                        launch, max_dgram_qlen, dgram_qlen[launch]);
337d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            }
338d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        } else
339d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn#ifndef TARGET_USES_LOGD
340d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        if (total)
341d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn#endif
342d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        {
343d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            EXPECT_GT(number_of_buckets, launch);
344d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            if (launch >= number_of_buckets) {
345d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn                launch = number_of_buckets - 1;
346d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            }
347d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            EXPECT_GE(max_dgram_qlen, dgram_qlen[launch]);
348d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        }
349d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
350d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        delete [] dgram_qlen;
351d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        delete [] times;
352d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    }
353d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    delete [] buf;
354d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn}
355d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
356d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzynstatic void caught_signal(int signum __unused) { }
357d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
358d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzynstatic void dump_log_msg(const char *prefix,
359d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn                         log_msg *msg, unsigned int version, int lid) {
360d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    switch(msg->entry.hdr_size) {
361d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    case 0:
362d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        version = 1;
363d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        break;
364d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
365d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    case sizeof(msg->entry_v2):
366d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        if (version == 0) {
367d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            version = 2;
368d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        }
369d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        break;
370d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    }
371d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
372d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    fprintf(stderr, "%s: v%u[%u] ", prefix, version, msg->len());
373d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    if (version != 1) {
374d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        fprintf(stderr, "hdr_size=%u ", msg->entry.hdr_size);
375d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    }
376d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    fprintf(stderr, "pid=%u tid=%u %u.%09u ",
377d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            msg->entry.pid, msg->entry.tid, msg->entry.sec, msg->entry.nsec);
378d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    switch(version) {
379d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    case 1:
380d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn         break;
381d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    case 2:
382d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        fprintf(stderr, "euid=%u ", msg->entry_v2.euid);
383d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        break;
384d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    case 3:
385d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    default:
386d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        lid = msg->entry.lid;
387d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        break;
388d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    }
389d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
390d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    switch(lid) {
391d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    case 0:
392d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        fprintf(stderr, "lid=main ");
393d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        break;
394d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    case 1:
395d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        fprintf(stderr, "lid=radio ");
396d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        break;
397d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    case 2:
398d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        fprintf(stderr, "lid=events ");
399d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        break;
400d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    case 3:
401d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        fprintf(stderr, "lid=system ");
402d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        break;
403d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    default:
404d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        if (lid >= 0) {
405d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            fprintf(stderr, "lid=%d ", lid);
406d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        }
407d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    }
408d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
409d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    unsigned int len = msg->entry.len;
410d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    fprintf(stderr, "msg[%u]={", len);
411d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    unsigned char *cp = reinterpret_cast<unsigned char *>(msg->msg());
412d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    while(len) {
413d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        unsigned char *p = cp;
414d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        while (*p && (((' ' <= *p) && (*p < 0x7F)) || (*p == '\n'))) {
415d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            ++p;
416d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        }
417d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        if (((p - cp) > 3) && !*p && ((unsigned int)(p - cp) < len)) {
418d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            fprintf(stderr, "\"");
419d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            while (*cp) {
420d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn                fprintf(stderr, (*cp != '\n') ? "%c" : "\\n", *cp);
421d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn                ++cp;
422d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn                --len;
423d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            }
424d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            fprintf(stderr, "\"");
425d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        } else {
426d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            fprintf(stderr, "%02x", *cp);
427d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        }
428d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        ++cp;
429d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        if (--len) {
430d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            fprintf(stderr, ", ");
431d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        }
432d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    }
433d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    fprintf(stderr, "}\n");
434d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn}
435d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
436d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark SalyzynTEST(logd, both) {
437d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    log_msg msg;
438d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
439d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    // check if we can read any logs from logd
440d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    bool user_logger_available = false;
441d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    bool user_logger_content = false;
442d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
443d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    int fd = socket_local_client("logdr",
444d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn                                 ANDROID_SOCKET_NAMESPACE_RESERVED,
445d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn                                 SOCK_SEQPACKET);
446d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    if (fd >= 0) {
447d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        struct sigaction ignore, old_sigaction;
448d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        memset(&ignore, 0, sizeof(ignore));
449d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        ignore.sa_handler = caught_signal;
450d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        sigemptyset(&ignore.sa_mask);
451d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        sigaction(SIGALRM, &ignore, &old_sigaction);
452d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        unsigned int old_alarm = alarm(10);
453d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
454d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        static const char ask[] = "dumpAndClose lids=0,1,2,3";
455d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        user_logger_available = write(fd, ask, sizeof(ask)) == sizeof(ask);
456d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
457d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        user_logger_content = recv(fd, msg.buf, sizeof(msg), 0) > 0;
458d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
459d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        if (user_logger_content) {
460d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            dump_log_msg("user", &msg, 3, -1);
461d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        }
462d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
463c61895ac3a9717dac6b24ce210aab0ccae6747f4Mark Salyzyn        alarm(old_alarm);
464d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        sigaction(SIGALRM, &old_sigaction, NULL);
465d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
466d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        close(fd);
467d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    }
468d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
469d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    // check if we can read any logs from kernel logger
470d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    bool kernel_logger_available = false;
471d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    bool kernel_logger_content = false;
472d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
473d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    static const char *loggers[] = {
474d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        "/dev/log/main",   "/dev/log_main",
475d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        "/dev/log/radio",  "/dev/log_radio",
476d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        "/dev/log/events", "/dev/log_events",
477d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        "/dev/log/system", "/dev/log_system",
478d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    };
479d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
480d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    for (unsigned int i = 0; i < (sizeof(loggers) / sizeof(loggers[0])); ++i) {
481d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        fd = open(loggers[i], O_RDONLY);
482d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        if (fd < 0) {
483d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            continue;
484d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        }
485d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        kernel_logger_available = true;
486d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        fcntl(fd, F_SETFL, O_RDONLY | O_NONBLOCK);
487d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        int result = TEMP_FAILURE_RETRY(read(fd, msg.buf, sizeof(msg)));
488d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        if (result > 0) {
489d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            kernel_logger_content = true;
490d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            dump_log_msg("kernel", &msg, 0, i / 2);
491d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        }
492d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        close(fd);
493d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    }
494d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
495d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    static const char yes[] = "\xE2\x9C\x93";
496d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    static const char no[] = "\xE2\x9c\x98";
497d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    fprintf(stderr,
498d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            "LOGGER  Available  Content\n"
499d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            "user    %-13s%s\n"
500d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            "kernel  %-13s%s\n"
501d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            " status %-11s%s\n",
502d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            (user_logger_available)   ? yes : no,
503d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            (user_logger_content)     ? yes : no,
504d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            (kernel_logger_available) ? yes : no,
505d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            (kernel_logger_content)   ? yes : no,
50689472df4cd799182062656352958edb12341b411Mark Salyzyn            (user_logger_available && kernel_logger_available) ? "ERROR" : "ok",
507d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            (user_logger_content && kernel_logger_content) ? "ERROR" : "ok");
508d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
50989472df4cd799182062656352958edb12341b411Mark Salyzyn    EXPECT_EQ(0, user_logger_available && kernel_logger_available);
51089472df4cd799182062656352958edb12341b411Mark Salyzyn    EXPECT_EQ(0, !user_logger_available && !kernel_logger_available);
511d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    EXPECT_EQ(0, user_logger_content && kernel_logger_content);
512d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    EXPECT_EQ(0, !user_logger_content && !kernel_logger_content);
513d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn}
514d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
515d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn// BAD ROBOT
516d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn//   Benchmark threshold are generally considered bad form unless there is
517d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn//   is some human love applied to the continued maintenance and whether the
518d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn//   thresholds are tuned on a per-target basis. Here we check if the values
519d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn//   are more than double what is expected. Doubling will not prevent failure
520d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn//   on busy or low-end systems that could have a tendency to stretch values.
521d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn//
522d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn//   The primary goal of this test is to simulate a spammy app (benchmark
523d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn//   being the worst) and check to make sure the logger can deal with it
524d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn//   appropriately by checking all the statistics are in an expected range.
525d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn//
526d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark SalyzynTEST(logd, benchmark) {
527d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    size_t len;
528d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    char *buf;
529d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
530d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    alloc_statistics(&buf, &len);
531d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    bool benchmark_already_run = buf && find_benchmark_spam(buf);
532d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    delete [] buf;
533d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
534d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    if (benchmark_already_run) {
535d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        fprintf(stderr, "WARNING: spam already present and too much history\n"
536d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn                        "         false OK for prune by worst UID check\n");
537d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    }
538d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
539d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    FILE *fp;
540d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
541d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    // Introduce some extreme spam for the worst UID filter
542d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    ASSERT_TRUE(NULL != (fp = popen(
543d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        "/data/nativetest/liblog-benchmarks/liblog-benchmarks",
544d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        "r")));
545d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
546d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    char buffer[5120];
547d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
548d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    static const char *benchmarks[] = {
549d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        "BM_log_maximum_retry ",
550d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        "BM_log_maximum ",
551d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        "BM_clock_overhead ",
552d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        "BM_log_overhead ",
553d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        "BM_log_latency ",
554d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        "BM_log_delay "
555d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    };
556d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    static const unsigned int log_maximum_retry = 0;
557d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    static const unsigned int log_maximum = 1;
558d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    static const unsigned int clock_overhead = 2;
559d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    static const unsigned int log_overhead = 3;
560d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    static const unsigned int log_latency = 4;
561d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    static const unsigned int log_delay = 5;
562d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
563d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    unsigned long ns[sizeof(benchmarks) / sizeof(benchmarks[0])];
564d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
565d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    memset(ns, 0, sizeof(ns));
566d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
567d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    while (fgets(buffer, sizeof(buffer), fp)) {
568d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        for (unsigned i = 0; i < sizeof(ns) / sizeof(ns[0]); ++i) {
5690c57bd864d2353e8f03c8b128bdacb58fc5dce95Mark Salyzyn            char *cp = strstr(buffer, benchmarks[i]);
5700c57bd864d2353e8f03c8b128bdacb58fc5dce95Mark Salyzyn            if (!cp) {
571d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn                continue;
572d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            }
5730c57bd864d2353e8f03c8b128bdacb58fc5dce95Mark Salyzyn            sscanf(cp, "%*s %lu %lu", &ns[i], &ns[i]);
574d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn            fprintf(stderr, "%-22s%8lu\n", benchmarks[i], ns[i]);
575d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        }
576d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    }
577d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    int ret = pclose(fp);
578d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
579d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    if (!WIFEXITED(ret) || (WEXITSTATUS(ret) == 127)) {
580d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        fprintf(stderr,
581d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn                "WARNING: "
582d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn                "/data/nativetest/liblog-benchmarks/liblog-benchmarks missing\n"
583d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn                "         can not perform test\n");
584d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        return;
585d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    }
586d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
587d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn#ifdef TARGET_USES_LOGD
588d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    EXPECT_GE(100000UL, ns[log_maximum_retry]); // 42777 user
589d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn#else
590d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    EXPECT_GE(10000UL, ns[log_maximum_retry]); // 5636 kernel
591d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn#endif
592d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
593d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn#ifdef TARGET_USES_LOGD
5940c57bd864d2353e8f03c8b128bdacb58fc5dce95Mark Salyzyn    EXPECT_GE(30000UL, ns[log_maximum]); // 27305 user
595d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn#else
596d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    EXPECT_GE(10000UL, ns[log_maximum]); // 5637 kernel
597d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn#endif
598d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
5990c57bd864d2353e8f03c8b128bdacb58fc5dce95Mark Salyzyn    EXPECT_GE(4096UL, ns[clock_overhead]); // 4095
600d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
601d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn#ifdef TARGET_USES_LOGD
6020c57bd864d2353e8f03c8b128bdacb58fc5dce95Mark Salyzyn    EXPECT_GE(250000UL, ns[log_overhead]); // 121876 user
603d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn#else
604d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    EXPECT_GE(100000UL, ns[log_overhead]); // 50945 kernel
605d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn#endif
606d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
607d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn#ifdef TARGET_USES_LOGD
608d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    EXPECT_GE(7500UL, ns[log_latency]); // 3718 user space
609d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn#else
610d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    EXPECT_GE(500000UL, ns[log_latency]); // 254200 kernel
611d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn#endif
612d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
613d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn#ifdef TARGET_USES_LOGD
6140c57bd864d2353e8f03c8b128bdacb58fc5dce95Mark Salyzyn    EXPECT_GE(20000000UL, ns[log_delay]); // 10500289 user
615d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn#else
616d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    EXPECT_GE(55000UL, ns[log_delay]); // 27341 kernel
617d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn#endif
618d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
619d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    for (unsigned i = 0; i < sizeof(ns) / sizeof(ns[0]); ++i) {
620d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        EXPECT_NE(0UL, ns[i]);
621d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    }
622d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
623d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    alloc_statistics(&buf, &len);
624d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
625d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn#ifdef TARGET_USES_LOGD
626d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    bool collected_statistics = !!buf;
627d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    EXPECT_EQ(true, collected_statistics);
628d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn#else
629d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    if (!buf) {
630d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn        return;
631d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    }
632d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn#endif
633d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
634d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    ASSERT_TRUE(NULL != buf);
635e821dace4161c5fdf19d8af036381b850d0fb988Mark Salyzyn
636e821dace4161c5fdf19d8af036381b850d0fb988Mark Salyzyn    char *benchmark_statistics_found = find_benchmark_spam(buf);
637e821dace4161c5fdf19d8af036381b850d0fb988Mark Salyzyn    ASSERT_TRUE(benchmark_statistics_found != NULL);
638e821dace4161c5fdf19d8af036381b850d0fb988Mark Salyzyn
639e821dace4161c5fdf19d8af036381b850d0fb988Mark Salyzyn    // Check how effective the SPAM filter is, parse out Now size.
640e821dace4161c5fdf19d8af036381b850d0fb988Mark Salyzyn    //             Total               Now
641e821dace4161c5fdf19d8af036381b850d0fb988Mark Salyzyn    // 0/4225?     7454388/303656      31488/755
642e821dace4161c5fdf19d8af036381b850d0fb988Mark Salyzyn    //                                 ^-- benchmark_statistics_found
643e821dace4161c5fdf19d8af036381b850d0fb988Mark Salyzyn
6440c57bd864d2353e8f03c8b128bdacb58fc5dce95Mark Salyzyn    unsigned long nowSpamSize = atol(benchmark_statistics_found);
645d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn
646d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn    delete [] buf;
647e821dace4161c5fdf19d8af036381b850d0fb988Mark Salyzyn
6480c57bd864d2353e8f03c8b128bdacb58fc5dce95Mark Salyzyn    ASSERT_NE(0UL, nowSpamSize);
649e821dace4161c5fdf19d8af036381b850d0fb988Mark Salyzyn
6506e9aaae9eda474beea26802c360b45e96402399aMark Salyzyn    // Determine if we have the spam filter enabled
651e821dace4161c5fdf19d8af036381b850d0fb988Mark Salyzyn    int sock = socket_local_client("logd",
652e821dace4161c5fdf19d8af036381b850d0fb988Mark Salyzyn                                   ANDROID_SOCKET_NAMESPACE_RESERVED,
653e821dace4161c5fdf19d8af036381b850d0fb988Mark Salyzyn                                   SOCK_STREAM);
6546e9aaae9eda474beea26802c360b45e96402399aMark Salyzyn
6556e9aaae9eda474beea26802c360b45e96402399aMark Salyzyn    ASSERT_TRUE(sock >= 0);
6566e9aaae9eda474beea26802c360b45e96402399aMark Salyzyn
6576e9aaae9eda474beea26802c360b45e96402399aMark Salyzyn    static const char getPruneList[] = "getPruneList";
6586e9aaae9eda474beea26802c360b45e96402399aMark Salyzyn    if (write(sock, getPruneList, sizeof(getPruneList)) > 0) {
6596e9aaae9eda474beea26802c360b45e96402399aMark Salyzyn        char buffer[80];
6606e9aaae9eda474beea26802c360b45e96402399aMark Salyzyn        memset(buffer, 0, sizeof(buffer));
6616e9aaae9eda474beea26802c360b45e96402399aMark Salyzyn        read(sock, buffer, sizeof(buffer));
6626e9aaae9eda474beea26802c360b45e96402399aMark Salyzyn        char *cp = strchr(buffer, '\n');
6636e9aaae9eda474beea26802c360b45e96402399aMark Salyzyn        if (!cp || (cp[1] != '~') || (cp[2] != '!')) {
6646e9aaae9eda474beea26802c360b45e96402399aMark Salyzyn            close(sock);
6656e9aaae9eda474beea26802c360b45e96402399aMark Salyzyn            fprintf(stderr,
6666e9aaae9eda474beea26802c360b45e96402399aMark Salyzyn                    "WARNING: "
6676e9aaae9eda474beea26802c360b45e96402399aMark Salyzyn                    "Logger has SPAM filtration turned off \"%s\"\n", buffer);
6686e9aaae9eda474beea26802c360b45e96402399aMark Salyzyn            return;
6696e9aaae9eda474beea26802c360b45e96402399aMark Salyzyn        }
6706e9aaae9eda474beea26802c360b45e96402399aMark Salyzyn    } else {
6716e9aaae9eda474beea26802c360b45e96402399aMark Salyzyn        int save_errno = errno;
6726e9aaae9eda474beea26802c360b45e96402399aMark Salyzyn        close(sock);
6736e9aaae9eda474beea26802c360b45e96402399aMark Salyzyn        FAIL() << "Can not send " << getPruneList << " to logger -- " << strerror(save_errno);
6746e9aaae9eda474beea26802c360b45e96402399aMark Salyzyn    }
6756e9aaae9eda474beea26802c360b45e96402399aMark Salyzyn
676e821dace4161c5fdf19d8af036381b850d0fb988Mark Salyzyn    static const unsigned long expected_absolute_minimum_log_size = 65536UL;
677e821dace4161c5fdf19d8af036381b850d0fb988Mark Salyzyn    unsigned long totalSize = expected_absolute_minimum_log_size;
6786e9aaae9eda474beea26802c360b45e96402399aMark Salyzyn    static const char getSize[] = {
6796e9aaae9eda474beea26802c360b45e96402399aMark Salyzyn        'g', 'e', 't', 'L', 'o', 'g', 'S', 'i', 'z', 'e', ' ',
6806e9aaae9eda474beea26802c360b45e96402399aMark Salyzyn        LOG_ID_MAIN + '0', '\0'
6816e9aaae9eda474beea26802c360b45e96402399aMark Salyzyn    };
6826e9aaae9eda474beea26802c360b45e96402399aMark Salyzyn    if (write(sock, getSize, sizeof(getSize)) > 0) {
6836e9aaae9eda474beea26802c360b45e96402399aMark Salyzyn        char buffer[80];
6846e9aaae9eda474beea26802c360b45e96402399aMark Salyzyn        memset(buffer, 0, sizeof(buffer));
6856e9aaae9eda474beea26802c360b45e96402399aMark Salyzyn        read(sock, buffer, sizeof(buffer));
6866e9aaae9eda474beea26802c360b45e96402399aMark Salyzyn        totalSize = atol(buffer);
6876e9aaae9eda474beea26802c360b45e96402399aMark Salyzyn        if (totalSize < expected_absolute_minimum_log_size) {
6886e9aaae9eda474beea26802c360b45e96402399aMark Salyzyn            fprintf(stderr,
6896e9aaae9eda474beea26802c360b45e96402399aMark Salyzyn                    "WARNING: "
6906e9aaae9eda474beea26802c360b45e96402399aMark Salyzyn                    "Logger had unexpected referenced size \"%s\"\n", buffer);
6916e9aaae9eda474beea26802c360b45e96402399aMark Salyzyn            totalSize = expected_absolute_minimum_log_size;
692e821dace4161c5fdf19d8af036381b850d0fb988Mark Salyzyn        }
693e821dace4161c5fdf19d8af036381b850d0fb988Mark Salyzyn    }
6946e9aaae9eda474beea26802c360b45e96402399aMark Salyzyn    close(sock);
6956e9aaae9eda474beea26802c360b45e96402399aMark Salyzyn
696e821dace4161c5fdf19d8af036381b850d0fb988Mark Salyzyn    // logd allows excursions to 110% of total size
697e821dace4161c5fdf19d8af036381b850d0fb988Mark Salyzyn    totalSize = (totalSize * 11 ) / 10;
698e821dace4161c5fdf19d8af036381b850d0fb988Mark Salyzyn
699e821dace4161c5fdf19d8af036381b850d0fb988Mark Salyzyn    // 50% threshold for SPAM filter (<20% typical, lots of engineering margin)
7000c57bd864d2353e8f03c8b128bdacb58fc5dce95Mark Salyzyn    ASSERT_GT(totalSize, nowSpamSize * 2);
701d3ba665020b3fd1923c1b9ab1d63cb3dc21430acMark Salyzyn}
702