1 /*
2 * Copyright (C) 2009, 2010 Nicolas Bonnefon and other contributors
3 *
4 * This file is part of glogg.
5 *
6 * glogg is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * glogg is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with glogg. If not, see <http://www.gnu.org/licenses/>.
18 */
19
20 #include <QSignalSpy>
21 #include <QMutexLocker>
22 #include <QFile>
23
24 #include "testlogdata.h"
25 #include "logdata.h"
26
27 #if !defined( TMPDIR )
28 #define TMPDIR "/tmp"
29 #endif
30
31 static const qint64 VBL_NB_LINES = 4999999LL;
32 static const int VBL_LINE_PER_PAGE = 70;
33 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";
34 static const int VBL_LINE_LENGTH = (76+2+7) ; // Without the final '\n' !
35 static const int VBL_VISIBLE_LINE_LENGTH = (76+8+4+7); // Without the final '\n' !
36
37 static const qint64 SL_NB_LINES = 5000LL;
38 static const int SL_LINE_PER_PAGE = 70;
39 static const char* sl_format="LOGDATA is a part of glogg, we are going to test it thoroughly, this is line %06d\n";
40 static const int SL_LINE_LENGTH = 83; // Without the final '\n' !
41
42 static const char* partial_line_begin = "123... beginning of line.";
43 static const char* partial_line_end = " end of line 123.\n";
44
initTestCase()45 void TestLogData::initTestCase()
46 {
47 QVERIFY( generateDataFiles() );
48 }
49
simpleLoad()50 void TestLogData::simpleLoad()
51 {
52 LogData logData;
53 QSignalSpy progressSpy( &logData, SIGNAL( loadingProgressed( int ) ) );
54
55 // Register for notification file is loaded
56 connect( &logData, SIGNAL( loadingFinished( bool ) ),
57 this, SLOT( loadingFinished() ) );
58
59 QBENCHMARK {
60 logData.attachFile( TMPDIR "/verybiglog.txt" );
61 // Wait for the loading to be done
62 {
63 QApplication::exec();
64 }
65 }
66
67 // Disconnect all signals
68 disconnect( &logData, 0 );
69 }
70
multipleLoad()71 void TestLogData::multipleLoad()
72 {
73 LogData logData;
74 QSignalSpy finishedSpy( &logData, SIGNAL( loadingFinished( bool ) ) );
75
76 // Register for notification file is loaded
77 connect( &logData, SIGNAL( loadingFinished( bool ) ),
78 this, SLOT( loadingFinished() ) );
79
80 // Start loading the VBL
81 logData.attachFile( TMPDIR "/verybiglog.txt" );
82
83 // Immediately interrupt the loading
84 logData.interruptLoading();
85
86 // and wait for the signal
87 QApplication::exec();
88
89 // Check we have an empty file
90 QCOMPARE( finishedSpy.count(), 1 );
91 // TODO: check loadingFinished arg == false
92 QCOMPARE( logData.getNbLine(), 0LL );
93 QCOMPARE( logData.getMaxLength(), 0 );
94 QCOMPARE( logData.getFileSize(), 0LL );
95
96 // Restart the VBL
97 logData.attachFile( TMPDIR "/verybiglog.txt" );
98
99 // Ensure the counting has started
100 {
101 QMutex mutex;
102 QWaitCondition sleep;
103 // sleep.wait( &mutex, 10 );
104 }
105
106 // Load the SL (should block until VBL is fully indexed)
107 logData.attachFile( TMPDIR "/smalllog.txt" );
108
109 // and wait for the 2 signals (one for each file)
110 QApplication::exec();
111 QApplication::exec();
112
113 // Check we have the small log loaded
114 QCOMPARE( finishedSpy.count(), 3 );
115 QCOMPARE( logData.getNbLine(), SL_NB_LINES );
116 QCOMPARE( logData.getMaxLength(), SL_LINE_LENGTH );
117 QCOMPARE( logData.getFileSize(), SL_NB_LINES * (SL_LINE_LENGTH+1LL) );
118
119 // Restart the VBL again
120 logData.attachFile( TMPDIR "/verybiglog.txt" );
121
122 // Immediately interrupt the loading
123 logData.interruptLoading();
124
125 // and wait for the signal
126 QApplication::exec();
127
128 // Check the small log has been restored
129 QCOMPARE( finishedSpy.count(), 4 );
130 QCOMPARE( logData.getNbLine(), SL_NB_LINES );
131 QCOMPARE( logData.getMaxLength(), SL_LINE_LENGTH );
132 QCOMPARE( logData.getFileSize(), SL_NB_LINES * (SL_LINE_LENGTH+1LL) );
133
134 // Disconnect all signals
135 disconnect( &logData, 0 );
136 }
137
138 //
139 // Private functions
140 //
loadingFinished()141 void TestLogData::loadingFinished()
142 {
143 QApplication::quit();
144 }
145
generateDataFiles()146 bool TestLogData::generateDataFiles()
147 {
148 char newLine[90];
149
150 QFile file( TMPDIR "/verybiglog.txt" );
151 if ( file.open( QIODevice::WriteOnly ) ) {
152 for (int i = 0; i < VBL_NB_LINES; i++) {
153 snprintf(newLine, 89, vbl_format, i);
154 file.write( newLine, qstrlen(newLine) );
155 }
156 }
157 else {
158 return false;
159 }
160 file.close();
161
162 file.setFileName( TMPDIR "/smalllog.txt" );
163 if ( file.open( QIODevice::WriteOnly ) ) {
164 for (int i = 0; i < SL_NB_LINES; i++) {
165 snprintf(newLine, 89, sl_format, i);
166 file.write( newLine, qstrlen(newLine) );
167 }
168 }
169 else {
170 return false;
171 }
172 file.close();
173
174 return true;
175 }
176