1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-12-27 07:50:57 +01:00

Add test coverage that our definition of BMP agrees with MySQL

Summary:
Ref T1191. Test that MySQL's rules match those of `phutil_is_utf8_with_only_bmp_characters()`:

  - Build a string with //every// character that we consider to be a BMP character.
  - Write it into MySQL.
  - Read it back out.
  - Make sure MySQL didn't truncate it.

Test Plan: Ran unit test. This test runs pretty quickly (50ms), the string with every character isn't all that enormous.

Reviewers: btrahan, arice

Reviewed By: arice

CC: chad, arice, aran

Maniphest Tasks: T1191

Differential Revision: https://secure.phabricator.com/D8314
This commit is contained in:
epriestley 2014-02-23 16:20:38 -08:00
parent bbf40146fb
commit 70b008d18d
3 changed files with 57 additions and 0 deletions

View file

@ -0,0 +1,2 @@
ALTER TABLE {$NAMESPACE}_harbormaster.harbormaster_scratchtable
ADD bigData LONGTEXT COLLATE utf8_bin;

View file

@ -9,5 +9,6 @@
final class HarbormasterScratchTable extends HarbormasterDAO {
protected $data;
protected $bigData;
}

View file

@ -3,6 +3,12 @@
final class PhabricatorInfrastructureTestCase
extends PhabricatorTestCase {
protected function getPhabricatorTestCaseConfiguration() {
return array(
self::PHABRICATOR_TESTCONFIG_BUILD_STORAGE_FIXTURES => true,
);
}
/**
* This is more of an acceptance test case instead of a unittest. It verifies
* that all symbols can be loaded correctly. It can catch problems like
@ -22,6 +28,54 @@ final class PhabricatorInfrastructureTestCase
'In test cases, all applications should default to installed.');
}
public function testMySQLAgreesWithUsAboutBMP() {
// Build a string with every BMP character in it, then insert it into MySQL
// and read it back. We expect to get the same string out that we put in,
// demonstrating that strings which pass our BMP checks are also valid in
// MySQL and no silent data truncation will occur.
$buf = '';
for ($ii = 0x01; $ii <= 0x7F; $ii++) {
$buf .= chr($ii);
}
for ($ii = 0xC2; $ii <= 0xDF; $ii++) {
for ($jj = 0x80; $jj <= 0xBF; $jj++) {
$buf .= chr($ii).chr($jj);
}
}
// NOTE: This is \xE0\xA0\xZZ.
for ($ii = 0xE0; $ii <= 0xE0; $ii++) {
for ($jj = 0xA0; $jj <= 0xBF; $jj++) {
for ($kk = 0x80; $kk <= 0xBF; $kk++) {
$buf .= chr($ii).chr($jj).chr($kk);
}
}
}
// NOTE: This is \xE1\xZZ\xZZ through \xEF\xZZ\xZZ.
for ($ii = 0xE1; $ii <= 0xEF; $ii++) {
for ($jj = 0x80; $jj <= 0xBF; $jj++) {
for ($kk = 0x80; $kk <= 0xBF; $kk++) {
$buf .= chr($ii).chr($jj).chr($kk);
}
}
}
$this->assertEqual(194431, strlen($buf));
$this->assertEqual(true, phutil_is_utf8_with_only_bmp_characters($buf));
$write = id(new HarbormasterScratchTable())
->setData('all.utf8.bmp')
->setBigData($buf)
->save();
$read = id(new HarbormasterScratchTable())->load($write->getID());
$this->assertEqual($buf, $read->getBigData());
}
}