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