19879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn/*
29879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn * Copyright (C) 2013-2014 The Android Open Source Project
39879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn *
49879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn * Licensed under the Apache License, Version 2.0 (the "License");
59879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn * you may not use this file except in compliance with the License.
69879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn * You may obtain a copy of the License at
79879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn *
89879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn *      http://www.apache.org/licenses/LICENSE-2.0
99879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn *
109879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn * Unless required by applicable law or agreed to in writing, software
119879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn * distributed under the License is distributed on an "AS IS" BASIS,
129879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn * See the License for the specific language governing permissions and
149879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn * limitations under the License.
159879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn */
169879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn
179879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn#include <stdio.h>
189879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn#include <stdlib.h>
199879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn#include <string.h>
209879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn
219879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn#include <gtest/gtest.h>
229879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn
239879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzynstatic const char begin[] = "--------- beginning of ";
249879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn
259879ac8e1290d744fc4363e6a976516053d5f64dMark SalyzynTEST(logcat, sorted_order) {
269879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn    FILE *fp;
279879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn
289879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn    ASSERT_TRUE(NULL != (fp = popen(
299879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn      "logcat -v time -b radio -b events -b system -b main -d 2>/dev/null",
309879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn      "r")));
319879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn
329879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn    class timestamp {
339879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn    private:
349879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn        int month;
359879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn        int day;
369879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn        int hour;
379879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn        int minute;
389879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn        int second;
399879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn        int millisecond;
409879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn        bool ok;
419879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn
429879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn    public:
439879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn        void init(const char *buffer)
449879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn        {
459879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn            ok = false;
469879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn            if (buffer != NULL) {
479879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn                ok = sscanf(buffer, "%d-%d %d:%d:%d.%d ",
489879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn                    &month, &day, &hour, &minute, &second, &millisecond) == 6;
499879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn            }
509879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn        }
519879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn
529879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn        timestamp(const char *buffer)
539879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn        {
549879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn            init(buffer);
559879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn        }
569879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn
579879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn        bool operator< (timestamp &T)
589879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn        {
599879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn            return !ok || !T.ok
609879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn             || (month < T.month)
619879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn             || ((month == T.month)
629879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn              && ((day < T.day)
639879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn               || ((day == T.day)
649879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn                && ((hour < T.hour)
659879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn                 || ((hour == T.hour)
669879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn                  && ((minute < T.minute)
679879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn                   || ((minute == T.minute)
689879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn                    && ((second < T.second)
699879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn                     || ((second == T.second)
709879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn                      && (millisecond < T.millisecond))))))))));
719879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn        }
729879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn
739879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn        bool valid(void)
749879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn        {
759879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn            return ok;
769879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn        }
779879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn    } last(NULL);
789879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn
799879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn    char *last_buffer = NULL;
809879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn    char buffer[5120];
819879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn
829879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn    int count = 0;
839879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn    int next_lt_last = 0;
849879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn
859879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn    while (fgets(buffer, sizeof(buffer), fp)) {
869879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn        if (!strncmp(begin, buffer, sizeof(begin) - 1)) {
879879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn            continue;
889879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn        }
899879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn        if (!last.valid()) {
909879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn            free(last_buffer);
919879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn            last_buffer = strdup(buffer);
929879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn            last.init(buffer);
939879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn        }
949879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn        timestamp next(buffer);
959879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn        if (next < last) {
969879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn            if (last_buffer) {
979879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn                fprintf(stderr, "<%s", last_buffer);
989879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn            }
999879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn            fprintf(stderr, ">%s", buffer);
1009879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn            ++next_lt_last;
1019879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn        }
1029879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn        if (next.valid()) {
1039879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn            free(last_buffer);
1049879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn            last_buffer = strdup(buffer);
1059879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn            last.init(buffer);
1069879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn        }
1079879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn        ++count;
1089879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn    }
1099879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn    free(last_buffer);
1109879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn
1119879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn    pclose(fp);
1129879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn
1139879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn    static const int max_ok = 2;
1149879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn
1159879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn    // Allow few fails, happens with readers active
1169879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn    fprintf(stderr, "%s: %d/%d out of order entries\n",
1179879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn            (next_lt_last)
1189879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn                ? ((next_lt_last <= max_ok)
1199879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn                    ? "WARNING"
1209879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn                    : "ERROR")
1219879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn                : "INFO",
1229879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn            next_lt_last, count);
1239879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn
1249879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn    EXPECT_GE(max_ok, next_lt_last);
1259879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn
1269879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn    // sample statistically too small
1279879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn    EXPECT_LT(100, count);
1289879ac8e1290d744fc4363e6a976516053d5f64dMark Salyzyn}
129