1<?php
2
3use dokuwiki\ChangeLog\ChangeLog;
4use dokuwiki\ChangeLog\PageChangeLog;
5
6/**
7 * Tests for requesting revisioninfo of a revision of a page with getRevisionInfo()
8 *
9 * This class uses the files:
10 * - data/pages/mailinglist.txt
11 * - data/meta/mailinglist.changes
12 */
13class changelog_getrelativerevision_test extends DokuWikiTest {
14
15    private $logline = "1362525899	127.0.0.1	E	mailinglist	pubcie	[Data entry] 	\n";
16    private $pageid = 'mailinglist';
17
18    function setup() : void {
19        parent::setup();
20        global $cache_revinfo;
21        $cache =& $cache_revinfo;
22        unset($cache['nonexist']);
23        unset($cache['mailinglist']);
24    }
25
26    /**
27     * no nonexist.changes meta file available
28     */
29    function test_changemetadatanotexists() {
30        $rev = 1362525899;
31        $dir = 1;
32        $id = 'nonexist';
33        $revsexpected = false;
34
35        $pagelog = new PageChangeLog($id, $chunk_size = 8192);
36        $revs = $pagelog->getRelativeRevision($rev, $dir);
37        $this->assertEquals($revsexpected, $revs);
38    }
39
40    /**
41     * no nonexist.changes meta file available
42     */
43    function test_nodirection() {
44        $rev = 1362525899;
45        $dir = 0;
46        $revsexpected = false;
47
48        $pagelog = new PageChangeLog($this->pageid, $chunk_size = 8192);
49        $revs = $pagelog->getRelativeRevision($rev, $dir);
50        $this->assertEquals($revsexpected, $revs);
51    }
52
53    /**
54     * start at exact current revision of mailinglist page
55     *
56     */
57    function test_startatexactcurrentrev() {
58        $rev = 1385051947;
59        $dir = 1;
60        $revsexpectedpos = false;
61        $revsexpectedneg = 1374261194;
62
63        //set a known timestamp
64        touch(wikiFN($this->pageid), $rev);
65
66        $pagelog = new PageChangeLog($this->pageid, $chunk_size = 8192);
67        $revs = $pagelog->getRelativeRevision($rev, $dir);
68        $this->assertEquals($revsexpectedpos, $revs);
69
70        $revs = $pagelog->getRelativeRevision($rev, -$dir);
71        $this->assertEquals($revsexpectedneg, $revs);
72    }
73
74    /**
75     * start at exact last revision of mailinglist page
76     *
77     */
78    function test_startatexactlastrev() {
79        $rev = 1360110636;
80        $dir = 1;
81        $revsexpectedpos = 1361901536;
82        $revsexpectedneg = false;
83
84        $pagelog = new PageChangeLog($this->pageid, $chunk_size = 8192);
85        $revs = $pagelog->getRelativeRevision($rev, $dir);
86        $this->assertEquals($revsexpectedpos, $revs);
87
88        $revs = $pagelog->getRelativeRevision($rev, -$dir);
89        $this->assertEquals($revsexpectedneg, $revs);
90    }
91
92    /**
93     * start at exact one before last revision of mailinglist page
94     *
95     */
96    function test_requestlastrevisions() {
97        $rev = 1361901536;
98        $dir = -1;
99        $revsexpectedlast = 1360110636;
100        $revsexpectedbeforelast = false;
101
102        $pagelog = new PageChangeLog($this->pageid, $chunk_size = 8192);
103        $revs = $pagelog->getRelativeRevision($rev, $dir);
104        $this->assertEquals($revsexpectedlast, $revs);
105
106        $revs = $pagelog->getRelativeRevision($rev, 2 * $dir);
107        $this->assertEquals($revsexpectedbeforelast, $revs);
108    }
109
110    /**
111     * request existing rev and check cache
112     */
113    function test_requestrev_checkcache() {
114        $rev = 1362525359;
115        $dir = 1;
116        $revexpected = 1362525899;
117        $infoexpected = ChangeLog::parseLogLine($this->logline);
118        $infoexpected['mode'] = 'page';
119
120        $pagelog = new PageChangeLog($this->pageid, $chunk_size = 8192);
121        $revfound = $pagelog->getRelativeRevision($rev, $dir);
122        $this->assertEquals($revexpected, $revfound);
123
124        //checked info returned from cache
125        $info = $pagelog->getRevisionInfo($revfound);
126        $this->assertEquals($infoexpected, $info);
127    }
128
129    /**
130     * request existing rev
131     */
132    function test_requestnextrev() {
133        $rev = 1362525899;
134
135        $pagelog = new PageChangeLog($this->pageid, $chunk_size = 8192);
136
137        $dir = 1;
138        $revexpected = 1362525926;
139        $revfound = $pagelog->getRelativeRevision($rev, $dir);
140        $this->assertEquals($revexpected, $revfound);
141
142        $dir = 2;
143        $revexpected = 1362526039;
144        $revfound = $pagelog->getRelativeRevision($rev, $dir);
145        $this->assertEquals($revexpected, $revfound);
146
147        $dir = -1;
148        $revexpected = 1362525359;
149        $revfound = $pagelog->getRelativeRevision($rev, $dir);
150        $this->assertEquals($revexpected, $revfound);
151
152        $dir = -2;
153        $revexpected = 1362525145;
154        $revfound = $pagelog->getRelativeRevision($rev, $dir);
155        $this->assertEquals($revexpected, $revfound);
156    }
157
158    /**
159     * request existing rev with chucked reading
160     */
161    function test_requestnextrev_chuncked() {
162        $rev = 1362525899;
163
164        $pagelog = new PageChangeLog($this->pageid, $chunk_size = 512);
165
166        $dir = 1;
167        $revexpected = 1362525926;
168        $revfound = $pagelog->getRelativeRevision($rev, $dir);
169        $this->assertEquals($revexpected, $revfound);
170
171        $dir = 2;
172        $revexpected = 1362526039;
173        $revfound = $pagelog->getRelativeRevision($rev, $dir);
174        $this->assertEquals($revexpected, $revfound);
175
176        $dir = -1;
177        $revexpected = 1362525359;
178        $revfound = $pagelog->getRelativeRevision($rev, $dir);
179        $this->assertEquals($revexpected, $revfound);
180
181        $dir = -2;
182        $revexpected = 1362525145;
183        $revfound = $pagelog->getRelativeRevision($rev, $dir);
184        $this->assertEquals($revexpected, $revfound);
185    }
186
187
188    /**
189     * request existing rev with chucked reading, chunk size smaller than line length
190     */
191    function test_requestnextrev_chunkshorterthanlines() {
192        $rev = 1362525899;
193
194        $pagelog = new PageChangeLog($this->pageid, $chunk_size = 20);
195
196        $dir = 1;
197        $revexpected = 1362525926;
198        $revfound = $pagelog->getRelativeRevision($rev, $dir);
199        $this->assertEquals($revexpected, $revfound);
200
201        $dir = 2;
202        $revexpected = 1362526039;
203        $revfound = $pagelog->getRelativeRevision($rev, $dir);
204        $this->assertEquals($revexpected, $revfound);
205
206        $dir = -1;
207        $revexpected = 1362525359;
208        $revfound = $pagelog->getRelativeRevision($rev, $dir);
209        $this->assertEquals($revexpected, $revfound);
210
211        $dir = -2;
212        $revexpected = 1362525145;
213        $revfound = $pagelog->getRelativeRevision($rev, $dir);
214        $this->assertEquals($revexpected, $revfound);
215    }
216
217    /**
218     * request existing rev
219     */
220    function test_requestnextfifthrev() {
221        $rev = 1362525899;
222        $dir = 5;
223        $revexpected = 1362526767;
224
225        $pagelog = new PageChangeLog($this->pageid, $chunk_size = 8192);
226        $revfound = $pagelog->getRelativeRevision($rev, $dir);
227        $this->assertEquals($revexpected, $revfound);
228    }
229
230    /**
231     * request existing rev with chucked reading
232     */
233    function test_requestnextfifthrev_chuncked() {
234        $rev = 1362525899;
235        $dir = 5;
236        $revexpected = 1362526767;
237
238        $pagelog = new PageChangeLog($this->pageid, $chunk_size = 512);
239        $revfound = $pagelog->getRelativeRevision($rev, $dir);
240        $this->assertEquals($revexpected, $revfound);
241    }
242
243    /**
244     * request existing rev
245     */
246    function test_requestprevrev() {
247        $rev = 1362525899;
248        $dir1 = -1;
249        $dir5 = -5;
250        $revexpected1 = 1362525359;
251        $revexpected5 = 1360110636;
252
253        $pagelog = new PageChangeLog($this->pageid, $chunk_size = 8192);
254        $revfound1 = $pagelog->getRelativeRevision($rev, $dir1);
255        $this->assertEquals($revexpected1, $revfound1);
256
257        $revfound5 = $pagelog->getRelativeRevision($rev, $dir5);
258        $this->assertEquals($revexpected5, $revfound5);
259    }
260
261    /**
262     * request existing rev with chucked reading
263     */
264    function test_requestprevrev_chuncked() {
265        $rev = 1362525899;
266        $dir1 = -1;
267        $dir5 = -5;
268        $revexpected1 = 1362525359;
269        $revexpected5 = 1360110636;
270
271        $pagelog = new PageChangeLog($this->pageid, $chunk_size = 512);
272        $revfound1 = $pagelog->getRelativeRevision($rev, $dir1);
273        $this->assertEquals($revexpected1, $revfound1);
274
275        $revfound5 = $pagelog->getRelativeRevision($rev, $dir5);
276        $this->assertEquals($revexpected5, $revfound5);
277    }
278
279    /**
280     * request after recentest version in changelog
281     */
282    function test_requestrecentestlogline_next() {
283        $rev = 1374261194;
284        $dir = 1;
285        $revexpected = false;
286
287        $pagelog = new PageChangeLog($this->pageid, $chunk_size = 8192);
288        $revfound = $pagelog->getRelativeRevision($rev, $dir);
289        $this->assertEquals($revexpected, $revfound);
290    }
291
292    /**
293     * request after recentest version in changelog, with chuncked reading
294     */
295    function test_requestrecentestlogline_next_chuncked() {
296        $rev = 1374261194;
297        $dir = 1;
298        $revexpected = false;
299
300        $pagelog = new PageChangeLog($this->pageid, $chunk_size = 512);
301        $revfound = $pagelog->getRelativeRevision($rev, $dir);
302        $this->assertEquals($revexpected, $revfound);
303    }
304
305    /**
306     * request before current version
307     */
308    function test_requestrecentestlogline_prev() {
309        $rev = 1374261194;
310        $dir = -1;
311        $revexpected = 1371579614;
312
313        $pagelog = new PageChangeLog($this->pageid, $chunk_size = 8192);
314        $revfound = $pagelog->getRelativeRevision($rev, $dir);
315        $this->assertEquals($revexpected, $revfound);
316    }
317
318    /**
319     * request before current version, with chuncked reading
320     */
321    function test_requestrecentestlogline_prev_chuncked() {
322        $rev = 1374261194;
323        $dir = -1;
324        $revexpected = 1371579614;
325
326        $pagelog = new PageChangeLog($this->pageid, $chunk_size = 512);
327        $revfound = $pagelog->getRelativeRevision($rev, $dir);
328        $this->assertEquals($revexpected, $revfound);
329    }
330
331    /**
332     * Request negative revision
333     * looks in positive direction, so it catches the oldest revision
334     */
335    function test_negativerev_posdir() {
336        $rev = -10;
337        $dir = 1;
338        $revexpected = 1360110636;
339
340        $pagelog = new PageChangeLog($this->pageid, $chunk_size = 8192);
341        $revfound = $pagelog->getRelativeRevision($rev, $dir);
342        $this->assertEquals($revexpected, $revfound);
343    }
344
345    /**
346     * Request negative revision
347     * looks in negative direction, but there is nothing
348     */
349    function test_negativerev_negdir() {
350        $rev = -10;
351        $dir = -1;
352        $revexpected = false;
353
354        $pagelog = new PageChangeLog($this->pageid, $chunk_size = 8192);
355        $revfound = $pagelog->getRelativeRevision($rev, $dir);
356        $this->assertEquals($revexpected, $revfound);
357    }
358
359    /**
360     * Start at non existing revision somewhere between existing revisions
361     */
362    function test_startatnotexistingrev_next() {
363        $rev = 1362525890;
364        $dir = 1;
365        $revexpected = 1362525899;
366
367        $pagelog = new PageChangeLog($this->pageid, $chunk_size = 8192);
368        $revfound = $pagelog->getRelativeRevision($rev, $dir);
369        $this->assertEquals($revexpected, $revfound);
370    }
371
372    /**
373     * Start at non existing revision somewhere between existing revisions
374     */
375    function test_startatnotexistingrev_prev() {
376        $rev = 1362525890;
377        $dir = -1;
378        $revexpected = 1362525359;
379
380        $pagelog = new PageChangeLog($this->pageid, $chunk_size = 8192);
381        $revfound = $pagelog->getRelativeRevision($rev, $dir);
382        $this->assertEquals($revexpected, $revfound);
383    }
384
385    function test_iscurrentpagerevision() {
386        $rev = 1385051947;
387        $currentexpected = true;
388
389        //set a known timestamp
390        touch(wikiFN($this->pageid), $rev);
391
392        $pagelog = new PageChangeLog($this->pageid, $chunk_size = 8192);
393        $current = $pagelog->isCurrentRevision($rev);
394        $this->assertEquals($currentexpected, $current);
395    }
396
397    function test_isnotcurrentpagerevision() {
398        $rev = 1385051947;
399        $not_current_rev = $rev - 1;
400        $currentexpected = false;
401
402        //set a known timestamp
403        touch(wikiFN($this->pageid), $rev);
404
405        $pagelog = new PageChangeLog($this->pageid, $chunk_size = 8192);
406        $current = $pagelog->isCurrentRevision($not_current_rev);
407        $this->assertEquals($currentexpected, $current);
408    }
409
410    function test_notexistingcurrentpage() {
411        $rev = 1385051947;
412        $currentexpected = false;
413
414        $pagelog = new PageChangeLog('nonexistingpage', $chunk_size = 8192);
415        $current = $pagelog->isCurrentRevision($rev);
416        $this->assertEquals($currentexpected, $current);
417    }
418}
419