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