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