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