1 #include <QTest> 2 #include <QSignalSpy> 3 4 #include "log.h" 5 #include "test_utils.h" 6 7 #include "data/logdata.h" 8 #include "data/logfiltereddata.h" 9 10 #include "gmock/gmock.h" 11 12 #define TMPDIR "/tmp" 13 14 static const qint64 VBL_NB_LINES = 4999999LL; 15 static const int VBL_LINE_PER_PAGE = 70; 16 static const char* vbl_format="LOGDATA is a part of glogg, we are going to test it thoroughly, this is line\t\t%07d\n"; 17 static const int VBL_LINE_LENGTH = (76+2+7) ; // Without the final '\n' ! 18 static const int VBL_VISIBLE_LINE_LENGTH = (76+8+4+7); // Without the final '\n' ! 19 20 class PerfLogFilteredData : public testing::Test { 21 public: 22 PerfLogFilteredData() 23 : log_data_(), filtered_data_( log_data_.getNewFilteredData() ), 24 progressSpy( filtered_data_.get(), SIGNAL( searchProgressed( int, int ) ) ) { 25 FILELog::setReportingLevel( logERROR ); 26 27 generateDataFiles(); 28 29 QSignalSpy endSpy( &log_data_, SIGNAL( loadingFinished( LoadingStatus ) ) ); 30 31 log_data_.attachFile( TMPDIR "/verybiglog.txt" ); 32 if ( ! endSpy.wait( 999000 ) ) 33 std::cerr << "Unable to attach the file!"; 34 } 35 36 LogData log_data_; 37 std::unique_ptr<LogFilteredData> filtered_data_; 38 QSignalSpy progressSpy; 39 40 void search() { 41 int percent = 0; 42 do { 43 if ( progressSpy.wait( 10000 ) ) 44 percent = qvariant_cast<int>(progressSpy.last().at(1)); 45 else 46 std::cout << "Missed...\n"; 47 std::cout << "Progress " << percent << std::endl; 48 } while ( percent < 100 ); 49 } 50 51 bool generateDataFiles() { 52 char newLine[90]; 53 54 QFile file( TMPDIR "/verybiglog.txt" ); 55 if ( file.open( QIODevice::WriteOnly ) ) { 56 for (int i = 0; i < VBL_NB_LINES; i++) { 57 snprintf(newLine, 89, vbl_format, i); 58 file.write( newLine, qstrlen(newLine) ); 59 } 60 } 61 else { 62 return false; 63 } 64 file.close(); 65 66 return true; 67 } 68 }; 69 70 TEST_F( PerfLogFilteredData, allMatchingSearch ) { 71 { 72 TestTimer t; 73 filtered_data_->runSearch( QRegExp( "glogg.*this" ) ); 74 search(); 75 } 76 ASSERT_THAT( filtered_data_->getNbLine(), VBL_NB_LINES ); 77 } 78 79 TEST_F( PerfLogFilteredData, someMatchingSearch ) { 80 { 81 TestTimer t; 82 filtered_data_->runSearch( QRegExp( "1?3|34" ) ); 83 search(); 84 } 85 ASSERT_THAT( filtered_data_->getNbLine(), 2874236 ); 86 } 87 88 TEST_F( PerfLogFilteredData, noneMatchingSearch ) { 89 { 90 TestTimer t; 91 filtered_data_->runSearch( QRegExp( "a1?3|(w|f)f34|blah" ) ); 92 search(); 93 } 94 ASSERT_THAT( filtered_data_->getNbLine(), 0 ); 95 } 96 97 TEST_F( PerfLogFilteredData, browsingSearchResults ) { 98 filtered_data_->runSearch( QRegExp( "1?3|34" ) ); 99 search(); 100 ASSERT_THAT( filtered_data_->getNbLine(), 2874236 ); 101 102 // Read page by page from the beginning and the end, using the QStringList 103 // function 104 std::cout << "Start reading..." << std::endl; 105 QStringList list; 106 { 107 TestTimer t; 108 109 const int nb_results = filtered_data_->getNbLine(); 110 for (int page = 0; page < (nb_results/VBL_LINE_PER_PAGE)-1; page++) 111 { 112 list = filtered_data_->getExpandedLines( 113 page * VBL_LINE_PER_PAGE, VBL_LINE_PER_PAGE ); 114 ASSERT_THAT(list.count(), VBL_LINE_PER_PAGE); 115 int page_from_end = (nb_results/VBL_LINE_PER_PAGE) - page - 1; 116 list = filtered_data_->getExpandedLines( 117 page_from_end * VBL_LINE_PER_PAGE, VBL_LINE_PER_PAGE ); 118 ASSERT_THAT(list.count(), VBL_LINE_PER_PAGE); 119 } 120 } 121 } 122 123