1*598139dcSAndroid Build Coastguard Worker /*
2*598139dcSAndroid Build Coastguard Worker * Copyright (C) 2013-2014 The Android Open Source Project
3*598139dcSAndroid Build Coastguard Worker *
4*598139dcSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*598139dcSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*598139dcSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*598139dcSAndroid Build Coastguard Worker *
8*598139dcSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*598139dcSAndroid Build Coastguard Worker *
10*598139dcSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*598139dcSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*598139dcSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*598139dcSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*598139dcSAndroid Build Coastguard Worker * limitations under the License.
15*598139dcSAndroid Build Coastguard Worker */
16*598139dcSAndroid Build Coastguard Worker
17*598139dcSAndroid Build Coastguard Worker #include <stdio.h>
18*598139dcSAndroid Build Coastguard Worker #include <stdlib.h>
19*598139dcSAndroid Build Coastguard Worker #include <string.h>
20*598139dcSAndroid Build Coastguard Worker
21*598139dcSAndroid Build Coastguard Worker #include <benchmark/benchmark.h>
22*598139dcSAndroid Build Coastguard Worker
23*598139dcSAndroid Build Coastguard Worker static const char begin[] = "--------- beginning of ";
24*598139dcSAndroid Build Coastguard Worker
BM_logcat_sorted_order(benchmark::State & state)25*598139dcSAndroid Build Coastguard Worker static void BM_logcat_sorted_order(benchmark::State& state) {
26*598139dcSAndroid Build Coastguard Worker FILE* fp;
27*598139dcSAndroid Build Coastguard Worker
28*598139dcSAndroid Build Coastguard Worker if (!state.KeepRunning()) return;
29*598139dcSAndroid Build Coastguard Worker
30*598139dcSAndroid Build Coastguard Worker fp = popen(
31*598139dcSAndroid Build Coastguard Worker "logcat -v time -b radio -b events -b system -b main -d 2>/dev/null",
32*598139dcSAndroid Build Coastguard Worker "r");
33*598139dcSAndroid Build Coastguard Worker if (!fp) return;
34*598139dcSAndroid Build Coastguard Worker
35*598139dcSAndroid Build Coastguard Worker class timestamp {
36*598139dcSAndroid Build Coastguard Worker private:
37*598139dcSAndroid Build Coastguard Worker int month;
38*598139dcSAndroid Build Coastguard Worker int day;
39*598139dcSAndroid Build Coastguard Worker int hour;
40*598139dcSAndroid Build Coastguard Worker int minute;
41*598139dcSAndroid Build Coastguard Worker int second;
42*598139dcSAndroid Build Coastguard Worker int millisecond;
43*598139dcSAndroid Build Coastguard Worker bool ok;
44*598139dcSAndroid Build Coastguard Worker
45*598139dcSAndroid Build Coastguard Worker public:
46*598139dcSAndroid Build Coastguard Worker void init(const char* buffer) {
47*598139dcSAndroid Build Coastguard Worker ok = false;
48*598139dcSAndroid Build Coastguard Worker if (buffer != NULL) {
49*598139dcSAndroid Build Coastguard Worker ok = sscanf(buffer, "%d-%d %d:%d:%d.%d ", &month, &day, &hour,
50*598139dcSAndroid Build Coastguard Worker &minute, &second, &millisecond) == 6;
51*598139dcSAndroid Build Coastguard Worker }
52*598139dcSAndroid Build Coastguard Worker }
53*598139dcSAndroid Build Coastguard Worker
54*598139dcSAndroid Build Coastguard Worker explicit timestamp(const char* buffer) {
55*598139dcSAndroid Build Coastguard Worker init(buffer);
56*598139dcSAndroid Build Coastguard Worker }
57*598139dcSAndroid Build Coastguard Worker
58*598139dcSAndroid Build Coastguard Worker bool operator<(timestamp& T) {
59*598139dcSAndroid Build Coastguard Worker return !ok || !T.ok || (month < T.month) ||
60*598139dcSAndroid Build Coastguard Worker ((month == T.month) &&
61*598139dcSAndroid Build Coastguard Worker ((day < T.day) ||
62*598139dcSAndroid Build Coastguard Worker ((day == T.day) &&
63*598139dcSAndroid Build Coastguard Worker ((hour < T.hour) ||
64*598139dcSAndroid Build Coastguard Worker ((hour == T.hour) &&
65*598139dcSAndroid Build Coastguard Worker ((minute < T.minute) ||
66*598139dcSAndroid Build Coastguard Worker ((minute == T.minute) &&
67*598139dcSAndroid Build Coastguard Worker ((second < T.second) ||
68*598139dcSAndroid Build Coastguard Worker ((second == T.second) &&
69*598139dcSAndroid Build Coastguard Worker (millisecond < T.millisecond))))))))));
70*598139dcSAndroid Build Coastguard Worker }
71*598139dcSAndroid Build Coastguard Worker
72*598139dcSAndroid Build Coastguard Worker bool valid(void) {
73*598139dcSAndroid Build Coastguard Worker return ok;
74*598139dcSAndroid Build Coastguard Worker }
75*598139dcSAndroid Build Coastguard Worker } last(NULL);
76*598139dcSAndroid Build Coastguard Worker
77*598139dcSAndroid Build Coastguard Worker char* last_buffer = NULL;
78*598139dcSAndroid Build Coastguard Worker char buffer[5120];
79*598139dcSAndroid Build Coastguard Worker
80*598139dcSAndroid Build Coastguard Worker int count = 0;
81*598139dcSAndroid Build Coastguard Worker int next_lt_last = 0;
82*598139dcSAndroid Build Coastguard Worker
83*598139dcSAndroid Build Coastguard Worker while (fgets(buffer, sizeof(buffer), fp)) {
84*598139dcSAndroid Build Coastguard Worker if (!strncmp(begin, buffer, sizeof(begin) - 1)) {
85*598139dcSAndroid Build Coastguard Worker continue;
86*598139dcSAndroid Build Coastguard Worker }
87*598139dcSAndroid Build Coastguard Worker if (!last.valid()) {
88*598139dcSAndroid Build Coastguard Worker free(last_buffer);
89*598139dcSAndroid Build Coastguard Worker last_buffer = strdup(buffer);
90*598139dcSAndroid Build Coastguard Worker last.init(buffer);
91*598139dcSAndroid Build Coastguard Worker }
92*598139dcSAndroid Build Coastguard Worker timestamp next(buffer);
93*598139dcSAndroid Build Coastguard Worker if (next < last) {
94*598139dcSAndroid Build Coastguard Worker if (last_buffer) {
95*598139dcSAndroid Build Coastguard Worker fprintf(stderr, "<%s", last_buffer);
96*598139dcSAndroid Build Coastguard Worker }
97*598139dcSAndroid Build Coastguard Worker fprintf(stderr, ">%s", buffer);
98*598139dcSAndroid Build Coastguard Worker ++next_lt_last;
99*598139dcSAndroid Build Coastguard Worker }
100*598139dcSAndroid Build Coastguard Worker if (next.valid()) {
101*598139dcSAndroid Build Coastguard Worker free(last_buffer);
102*598139dcSAndroid Build Coastguard Worker last_buffer = strdup(buffer);
103*598139dcSAndroid Build Coastguard Worker last.init(buffer);
104*598139dcSAndroid Build Coastguard Worker }
105*598139dcSAndroid Build Coastguard Worker ++count;
106*598139dcSAndroid Build Coastguard Worker }
107*598139dcSAndroid Build Coastguard Worker free(last_buffer);
108*598139dcSAndroid Build Coastguard Worker
109*598139dcSAndroid Build Coastguard Worker pclose(fp);
110*598139dcSAndroid Build Coastguard Worker
111*598139dcSAndroid Build Coastguard Worker static const int max_ok = 2;
112*598139dcSAndroid Build Coastguard Worker
113*598139dcSAndroid Build Coastguard Worker // Allow few fails, happens with readers active
114*598139dcSAndroid Build Coastguard Worker fprintf(stderr, "%s: %d/%d out of order entries\n",
115*598139dcSAndroid Build Coastguard Worker (next_lt_last) ? ((next_lt_last <= max_ok) ? "WARNING" : "ERROR")
116*598139dcSAndroid Build Coastguard Worker : "INFO",
117*598139dcSAndroid Build Coastguard Worker next_lt_last, count);
118*598139dcSAndroid Build Coastguard Worker
119*598139dcSAndroid Build Coastguard Worker if (next_lt_last > max_ok) {
120*598139dcSAndroid Build Coastguard Worker fprintf(stderr, "EXPECT_GE(max_ok=%d, next_lt_last=%d)\n", max_ok,
121*598139dcSAndroid Build Coastguard Worker next_lt_last);
122*598139dcSAndroid Build Coastguard Worker }
123*598139dcSAndroid Build Coastguard Worker
124*598139dcSAndroid Build Coastguard Worker // sample statistically too small
125*598139dcSAndroid Build Coastguard Worker if (count < 100) {
126*598139dcSAndroid Build Coastguard Worker fprintf(stderr, "EXPECT_LT(100, count=%d)\n", count);
127*598139dcSAndroid Build Coastguard Worker }
128*598139dcSAndroid Build Coastguard Worker
129*598139dcSAndroid Build Coastguard Worker state.KeepRunning();
130*598139dcSAndroid Build Coastguard Worker }
131*598139dcSAndroid Build Coastguard Worker BENCHMARK(BM_logcat_sorted_order);
132*598139dcSAndroid Build Coastguard Worker
133*598139dcSAndroid Build Coastguard Worker BENCHMARK_MAIN();
134