Remove comments literally documenting unit tests being unit tests
[lhc/web/wiklou.git] / tests / phpunit / maintenance / backupPrefetchTest.php
1 <?php
2
3 namespace MediaWiki\Tests\Maintenance;
4
5 use BaseDump;
6 use MediaWikiTestCase;
7
8 /**
9 * @group Dump
10 * @covers BaseDump
11 */
12 class BaseDumpTest extends MediaWikiTestCase {
13
14 /**
15 * @var BaseDump The BaseDump instance used within a test.
16 *
17 * If set, this BaseDump gets automatically closed in tearDown.
18 */
19 private $dump = null;
20
21 protected function tearDown() {
22 if ( $this->dump !== null ) {
23 $this->dump->close();
24 }
25
26 // T39458, parent teardown need to be done after closing the
27 // dump or it might cause some permissions errors.
28 parent::tearDown();
29 }
30
31 /**
32 * asserts that a prefetch yields an expected string
33 *
34 * @param string|null $expected The exepcted result of the prefetch
35 * @param int $page The page number to prefetch the text for
36 * @param int $revision The revision number to prefetch the text for
37 */
38 private function assertPrefetchEquals( $expected, $page, $revision ) {
39 $this->assertEquals( $expected, $this->dump->prefetch( $page, $revision ),
40 "Prefetch of page $page revision $revision" );
41 }
42
43 function testSequential() {
44 $fname = $this->setUpPrefetch();
45 $this->dump = new BaseDump( $fname );
46
47 $this->assertPrefetchEquals( "BackupDumperTestP1Text1", 1, 1 );
48 $this->assertPrefetchEquals( "BackupDumperTestP2Text1", 2, 2 );
49 $this->assertPrefetchEquals( "BackupDumperTestP2Text4 some additional Text", 2, 5 );
50 $this->assertPrefetchEquals( "Talk about BackupDumperTestP1 Text1", 4, 8 );
51 }
52
53 function testSynchronizeRevisionMissToRevision() {
54 $fname = $this->setUpPrefetch();
55 $this->dump = new BaseDump( $fname );
56
57 $this->assertPrefetchEquals( "BackupDumperTestP2Text1", 2, 2 );
58 $this->assertPrefetchEquals( null, 2, 3 );
59 $this->assertPrefetchEquals( "BackupDumperTestP2Text4 some additional Text", 2, 5 );
60 }
61
62 function testSynchronizeRevisionMissToPage() {
63 $fname = $this->setUpPrefetch();
64 $this->dump = new BaseDump( $fname );
65
66 $this->assertPrefetchEquals( "BackupDumperTestP2Text1", 2, 2 );
67 $this->assertPrefetchEquals( null, 2, 40 );
68 $this->assertPrefetchEquals( "Talk about BackupDumperTestP1 Text1", 4, 8 );
69 }
70
71 function testSynchronizePageMiss() {
72 $fname = $this->setUpPrefetch();
73 $this->dump = new BaseDump( $fname );
74
75 $this->assertPrefetchEquals( "BackupDumperTestP2Text1", 2, 2 );
76 $this->assertPrefetchEquals( null, 3, 40 );
77 $this->assertPrefetchEquals( "Talk about BackupDumperTestP1 Text1", 4, 8 );
78 }
79
80 function testPageMissAtEnd() {
81 $fname = $this->setUpPrefetch();
82 $this->dump = new BaseDump( $fname );
83
84 $this->assertPrefetchEquals( "BackupDumperTestP2Text1", 2, 2 );
85 $this->assertPrefetchEquals( null, 6, 40 );
86 }
87
88 function testRevisionMissAtEnd() {
89 $fname = $this->setUpPrefetch();
90 $this->dump = new BaseDump( $fname );
91
92 $this->assertPrefetchEquals( "BackupDumperTestP2Text1", 2, 2 );
93 $this->assertPrefetchEquals( null, 4, 40 );
94 }
95
96 function testSynchronizePageMissAtStart() {
97 $fname = $this->setUpPrefetch();
98 $this->dump = new BaseDump( $fname );
99
100 $this->assertPrefetchEquals( null, 0, 2 );
101 $this->assertPrefetchEquals( "BackupDumperTestP2Text1", 2, 2 );
102 }
103
104 function testSynchronizeRevisionMissAtStart() {
105 $fname = $this->setUpPrefetch();
106 $this->dump = new BaseDump( $fname );
107
108 $this->assertPrefetchEquals( null, 1, -2 );
109 $this->assertPrefetchEquals( "BackupDumperTestP2Text1", 2, 2 );
110 }
111
112 function testSequentialAcrossFiles() {
113 $fname1 = $this->setUpPrefetch( [ 1 ] );
114 $fname2 = $this->setUpPrefetch( [ 2, 4 ] );
115 $this->dump = new BaseDump( $fname1 . ";" . $fname2 );
116
117 $this->assertPrefetchEquals( "BackupDumperTestP1Text1", 1, 1 );
118 $this->assertPrefetchEquals( "BackupDumperTestP2Text1", 2, 2 );
119 $this->assertPrefetchEquals( "BackupDumperTestP2Text4 some additional Text", 2, 5 );
120 $this->assertPrefetchEquals( "Talk about BackupDumperTestP1 Text1", 4, 8 );
121 }
122
123 function testSynchronizeSkipAcrossFile() {
124 $fname1 = $this->setUpPrefetch( [ 1 ] );
125 $fname2 = $this->setUpPrefetch( [ 2 ] );
126 $fname3 = $this->setUpPrefetch( [ 4 ] );
127 $this->dump = new BaseDump( $fname1 . ";" . $fname2 . ";" . $fname3 );
128
129 $this->assertPrefetchEquals( "BackupDumperTestP1Text1", 1, 1 );
130 $this->assertPrefetchEquals( "Talk about BackupDumperTestP1 Text1", 4, 8 );
131 }
132
133 function testSynchronizeMissInWholeFirstFile() {
134 $fname1 = $this->setUpPrefetch( [ 1 ] );
135 $fname2 = $this->setUpPrefetch( [ 2 ] );
136 $this->dump = new BaseDump( $fname1 . ";" . $fname2 );
137
138 $this->assertPrefetchEquals( "BackupDumperTestP2Text1", 2, 2 );
139 }
140
141 /**
142 * Constructs a temporary file that can be used for prefetching
143 *
144 * The temporary file is removed by DumpBackup upon tearDown.
145 *
146 * @param array $requested_pages The indices of the page parts that should
147 * go into the prefetch file. 1,2,4 are available.
148 * @return string The file name of the created temporary file
149 */
150 private function setUpPrefetch( $requested_pages = [ 1, 2, 4 ] ) {
151 // The file name, where we store the prepared prefetch file
152 $fname = $this->getNewTempFile();
153
154 // The header of every prefetch file
155 // phpcs:ignore Generic.Files.LineLength
156 $header = '<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.7/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mediawiki.org/xml/export-0.7/ http://www.mediawiki.org/xml/export-0.7.xsd" version="0.7" xml:lang="en">
157 <siteinfo>
158 <sitename>wikisvn</sitename>
159 <base>http://localhost/wiki-svn/index.php/Main_Page</base>
160 <generator>MediaWiki 1.21alpha</generator>
161 <case>first-letter</case>
162 <namespaces>
163 <namespace key="-2" case="first-letter">Media</namespace>
164 <namespace key="-1" case="first-letter">Special</namespace>
165 <namespace key="0" case="first-letter" />
166 <namespace key="1" case="first-letter">Talk</namespace>
167 <namespace key="2" case="first-letter">User</namespace>
168 <namespace key="3" case="first-letter">User talk</namespace>
169 <namespace key="4" case="first-letter">Wikisvn</namespace>
170 <namespace key="5" case="first-letter">Wikisvn talk</namespace>
171 <namespace key="6" case="first-letter">File</namespace>
172 <namespace key="7" case="first-letter">File talk</namespace>
173 <namespace key="8" case="first-letter">MediaWiki</namespace>
174 <namespace key="9" case="first-letter">MediaWiki talk</namespace>
175 <namespace key="10" case="first-letter">Template</namespace>
176 <namespace key="11" case="first-letter">Template talk</namespace>
177 <namespace key="12" case="first-letter">Help</namespace>
178 <namespace key="13" case="first-letter">Help talk</namespace>
179 <namespace key="14" case="first-letter">Category</namespace>
180 <namespace key="15" case="first-letter">Category talk</namespace>
181 </namespaces>
182 </siteinfo>
183 ';
184
185 // An array holding the pages that are available for prefetch
186 $available_pages = [];
187
188 // Simple plain page
189 $available_pages[1] = ' <page>
190 <title>BackupDumperTestP1</title>
191 <ns>0</ns>
192 <id>1</id>
193 <revision>
194 <id>1</id>
195 <timestamp>2012-04-01T16:46:05Z</timestamp>
196 <contributor>
197 <ip>127.0.0.1</ip>
198 </contributor>
199 <comment>BackupDumperTestP1Summary1</comment>
200 <sha1>0bolhl6ol7i6x0e7yq91gxgaan39j87</sha1>
201 <text xml:space="preserve">BackupDumperTestP1Text1</text>
202 <model name="wikitext">1</model>
203 <format mime="text/x-wiki">1</format>
204 </revision>
205 </page>
206 ';
207 // Page with more than one revisions. Hole in rev ids.
208 $available_pages[2] = ' <page>
209 <title>BackupDumperTestP2</title>
210 <ns>0</ns>
211 <id>2</id>
212 <revision>
213 <id>2</id>
214 <timestamp>2012-04-01T16:46:05Z</timestamp>
215 <contributor>
216 <ip>127.0.0.1</ip>
217 </contributor>
218 <comment>BackupDumperTestP2Summary1</comment>
219 <sha1>jprywrymfhysqllua29tj3sc7z39dl2</sha1>
220 <text xml:space="preserve">BackupDumperTestP2Text1</text>
221 <model name="wikitext">1</model>
222 <format mime="text/x-wiki">1</format>
223 </revision>
224 <revision>
225 <id>5</id>
226 <parentid>2</parentid>
227 <timestamp>2012-04-01T16:46:05Z</timestamp>
228 <contributor>
229 <ip>127.0.0.1</ip>
230 </contributor>
231 <comment>BackupDumperTestP2Summary4 extra</comment>
232 <sha1>6o1ciaxa6pybnqprmungwofc4lv00wv</sha1>
233 <text xml:space="preserve">BackupDumperTestP2Text4 some additional Text</text>
234 <model name="wikitext">1</model>
235 <format mime="text/x-wiki">1</format>
236 </revision>
237 </page>
238 ';
239 // Page with id higher than previous id + 1
240 $available_pages[4] = ' <page>
241 <title>Talk:BackupDumperTestP1</title>
242 <ns>1</ns>
243 <id>4</id>
244 <revision>
245 <id>8</id>
246 <timestamp>2012-04-01T16:46:05Z</timestamp>
247 <contributor>
248 <ip>127.0.0.1</ip>
249 </contributor>
250 <comment>Talk BackupDumperTestP1 Summary1</comment>
251 <sha1>nktofwzd0tl192k3zfepmlzxoax1lpe</sha1>
252 <model name="wikitext">1</model>
253 <format mime="text/x-wiki">1</format>
254 <text xml:space="preserve">Talk about BackupDumperTestP1 Text1</text>
255 </revision>
256 </page>
257 ';
258
259 // The common ending for all files
260 $tail = '</mediawiki>
261 ';
262
263 // Putting together the content of the prefetch files
264 $content = $header;
265 foreach ( $requested_pages as $i ) {
266 $this->assertTrue( array_key_exists( $i, $available_pages ),
267 "Check for availability of requested page " . $i );
268 $content .= $available_pages[$i];
269 }
270 $content .= $tail;
271
272 $this->assertEquals( strlen( $content ), file_put_contents(
273 $fname, $content ), "Length of prepared prefetch" );
274
275 return $fname;
276 }
277 }