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