Merge "Improve 1-letter variable names in MutableContext and implementations"
[lhc/web/wiklou.git] / tests / phpunit / includes / Storage / SqlBlobStoreTest.php
1 <?php
2
3 namespace MediaWiki\Tests\Storage;
4
5 use Language;
6 use MediaWiki\MediaWikiServices;
7 use MediaWiki\Storage\SqlBlobStore;
8 use MediaWikiTestCase;
9 use stdClass;
10 use TitleValue;
11
12 /**
13 * @covers \MediaWiki\Storage\SqlBlobStore
14 * @group Database
15 */
16 class SqlBlobStoreTest extends MediaWikiTestCase {
17
18 /**
19 * @return SqlBlobStore
20 */
21 public function getBlobStore( $legacyEncoding = false, $compressRevisions = false ) {
22 $services = MediaWikiServices::getInstance();
23
24 $store = new SqlBlobStore(
25 $services->getDBLoadBalancer(),
26 $services->getMainWANObjectCache()
27 );
28
29 if ( $compressRevisions ) {
30 $store->setCompressBlobs( $compressRevisions );
31 }
32 if ( $legacyEncoding ) {
33 $store->setLegacyEncoding( $legacyEncoding, Language::factory( 'en' ) );
34 }
35
36 return $store;
37 }
38
39 /**
40 * @covers \MediaWiki\Storage\SqlBlobStore::getCompressBlobs()
41 * @covers \MediaWiki\Storage\SqlBlobStore::setCompressBlobs()
42 */
43 public function testGetSetCompressRevisions() {
44 $store = $this->getBlobStore();
45 $this->assertFalse( $store->getCompressBlobs() );
46 $store->setCompressBlobs( true );
47 $this->assertTrue( $store->getCompressBlobs() );
48 }
49
50 /**
51 * @covers \MediaWiki\Storage\SqlBlobStore::getLegacyEncoding()
52 * @covers \MediaWiki\Storage\SqlBlobStore::getLegacyEncodingConversionLang()
53 * @covers \MediaWiki\Storage\SqlBlobStore::setLegacyEncoding()
54 */
55 public function testGetSetLegacyEncoding() {
56 $store = $this->getBlobStore();
57 $this->assertFalse( $store->getLegacyEncoding() );
58 $this->assertNull( $store->getLegacyEncodingConversionLang() );
59 $en = Language::factory( 'en' );
60 $store->setLegacyEncoding( 'foo', $en );
61 $this->assertSame( 'foo', $store->getLegacyEncoding() );
62 $this->assertSame( $en, $store->getLegacyEncodingConversionLang() );
63 }
64
65 /**
66 * @covers \MediaWiki\Storage\SqlBlobStore::getCacheExpiry()
67 * @covers \MediaWiki\Storage\SqlBlobStore::setCacheExpiry()
68 */
69 public function testGetSetCacheExpiry() {
70 $store = $this->getBlobStore();
71 $this->assertSame( 604800, $store->getCacheExpiry() );
72 $store->setCacheExpiry( 12 );
73 $this->assertSame( 12, $store->getCacheExpiry() );
74 }
75
76 /**
77 * @covers \MediaWiki\Storage\SqlBlobStore::getUseExternalStore()
78 * @covers \MediaWiki\Storage\SqlBlobStore::setUseExternalStore()
79 */
80 public function testGetSetUseExternalStore() {
81 $store = $this->getBlobStore();
82 $this->assertFalse( $store->getUseExternalStore() );
83 $store->setUseExternalStore( true );
84 $this->assertTrue( $store->getUseExternalStore() );
85 }
86
87 public function provideDecompress() {
88 yield '(no legacy encoding), false in false out' => [ false, false, [], false ];
89 yield '(no legacy encoding), empty in empty out' => [ false, '', [], '' ];
90 yield '(no legacy encoding), empty in empty out' => [ false, 'A', [], 'A' ];
91 yield '(no legacy encoding), string in with gzip flag returns string' => [
92 // gzip string below generated with gzdeflate( 'AAAABBAAA' )
93 false, "sttttr\002\022\000", [ 'gzip' ], 'AAAABBAAA',
94 ];
95 yield '(no legacy encoding), string in with object flag returns false' => [
96 // gzip string below generated with serialize( 'JOJO' )
97 false, "s:4:\"JOJO\";", [ 'object' ], false,
98 ];
99 yield '(no legacy encoding), serialized object in with object flag returns string' => [
100 false,
101 // Using a TitleValue object as it has a getText method (which is needed)
102 serialize( new TitleValue( 0, 'HHJJDDFF' ) ),
103 [ 'object' ],
104 'HHJJDDFF',
105 ];
106 yield '(no legacy encoding), serialized object in with object & gzip flag returns string' => [
107 false,
108 // Using a TitleValue object as it has a getText method (which is needed)
109 gzdeflate( serialize( new TitleValue( 0, '8219JJJ840' ) ) ),
110 [ 'object', 'gzip' ],
111 '8219JJJ840',
112 ];
113 yield '(ISO-8859-1 encoding), string in string out' => [
114 'ISO-8859-1',
115 iconv( 'utf-8', 'ISO-8859-1', "1®Àþ1" ),
116 [],
117 '1®Àþ1',
118 ];
119 yield '(ISO-8859-1 encoding), serialized object in with gzip flags returns string' => [
120 'ISO-8859-1',
121 gzdeflate( iconv( 'utf-8', 'ISO-8859-1', "4®Àþ4" ) ),
122 [ 'gzip' ],
123 '4®Àþ4',
124 ];
125 yield '(ISO-8859-1 encoding), serialized object in with object flags returns string' => [
126 'ISO-8859-1',
127 serialize( new TitleValue( 0, iconv( 'utf-8', 'ISO-8859-1', "3®Àþ3" ) ) ),
128 [ 'object' ],
129 '3®Àþ3',
130 ];
131 yield '(ISO-8859-1 encoding), serialized object in with object & gzip flags returns string' => [
132 'ISO-8859-1',
133 gzdeflate( serialize( new TitleValue( 0, iconv( 'utf-8', 'ISO-8859-1', "2®Àþ2" ) ) ) ),
134 [ 'gzip', 'object' ],
135 '2®Àþ2',
136 ];
137 yield 'T184749 (windows-1252 encoding), string in string out' => [
138 'windows-1252',
139 iconv( 'utf-8', 'windows-1252', "sammansättningar" ),
140 [],
141 'sammansättningar',
142 ];
143 yield 'T184749 (windows-1252 encoding), string in string out with gzip' => [
144 'windows-1252',
145 gzdeflate( iconv( 'utf-8', 'windows-1252', "sammansättningar" ) ),
146 [ 'gzip' ],
147 'sammansättningar',
148 ];
149 }
150
151 /**
152 * @dataProvider provideDecompress
153 * @covers \MediaWiki\Storage\SqlBlobStore::decompressData
154 *
155 * @param string|bool $legacyEncoding
156 * @param mixed $data
157 * @param array $flags
158 * @param mixed $expected
159 */
160 public function testDecompressData( $legacyEncoding, $data, $flags, $expected ) {
161 $store = $this->getBlobStore( $legacyEncoding );
162 $this->assertSame(
163 $expected,
164 $store->decompressData( $data, $flags )
165 );
166 }
167
168 /**
169 * @covers \MediaWiki\Storage\SqlBlobStore::compressData
170 */
171 public function testCompressRevisionTextUtf8() {
172 $store = $this->getBlobStore();
173 $row = new stdClass;
174 $row->old_text = "Wiki est l'\xc3\xa9cole superieur !";
175 $row->old_flags = $store->compressData( $row->old_text );
176 $this->assertTrue( false !== strpos( $row->old_flags, 'utf-8' ),
177 "Flags should contain 'utf-8'" );
178 $this->assertFalse( false !== strpos( $row->old_flags, 'gzip' ),
179 "Flags should not contain 'gzip'" );
180 $this->assertEquals( "Wiki est l'\xc3\xa9cole superieur !",
181 $row->old_text, "Direct check" );
182 }
183
184 /**
185 * @covers \MediaWiki\Storage\SqlBlobStore::compressData
186 */
187 public function testCompressRevisionTextUtf8Gzip() {
188 $store = $this->getBlobStore( false, true );
189 $this->checkPHPExtension( 'zlib' );
190
191 $row = new stdClass;
192 $row->old_text = "Wiki est l'\xc3\xa9cole superieur !";
193 $row->old_flags = $store->compressData( $row->old_text );
194 $this->assertTrue( false !== strpos( $row->old_flags, 'utf-8' ),
195 "Flags should contain 'utf-8'" );
196 $this->assertTrue( false !== strpos( $row->old_flags, 'gzip' ),
197 "Flags should contain 'gzip'" );
198 $this->assertEquals( "Wiki est l'\xc3\xa9cole superieur !",
199 gzinflate( $row->old_text ), "Direct check" );
200 }
201
202 public function provideBlobs() {
203 yield [ '' ];
204 yield [ 'someText' ];
205 yield [ "sammansättningar" ];
206 }
207
208 /**
209 * @dataProvider provideBlobs
210 * @covers \MediaWiki\Storage\SqlBlobStore::storeBlob
211 * @covers \MediaWiki\Storage\SqlBlobStore::getBlob
212 */
213 public function testSimpleStoreGetBlobSimpleRoundtrip( $blob ) {
214 $store = $this->getBlobStore();
215 $address = $store->storeBlob( $blob );
216 $this->assertSame( $blob, $store->getBlob( $address ) );
217 }
218
219 /**
220 * @dataProvider provideBlobs
221 * @covers \MediaWiki\Storage\SqlBlobStore::storeBlob
222 * @covers \MediaWiki\Storage\SqlBlobStore::getBlob
223 */
224 public function testSimpleStoreGetBlobSimpleRoundtripWindowsLegacyEncoding( $blob ) {
225 $store = $this->getBlobStore( 'windows-1252' );
226 $address = $store->storeBlob( $blob );
227 $this->assertSame( $blob, $store->getBlob( $address ) );
228 }
229
230 /**
231 * @dataProvider provideBlobs
232 * @covers \MediaWiki\Storage\SqlBlobStore::storeBlob
233 * @covers \MediaWiki\Storage\SqlBlobStore::getBlob
234 */
235 public function testSimpleStoreGetBlobSimpleRoundtripWindowsLegacyEncodingGzip( $blob ) {
236 $store = $this->getBlobStore( 'windows-1252', true );
237 $address = $store->storeBlob( $blob );
238 $this->assertSame( $blob, $store->getBlob( $address ) );
239 }
240
241 }