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