Changeset View
Changeset View
Standalone View
Standalone View
src/infrastructure/__tests__/PhabricatorInfrastructureTestCase.php
<?php | <?php | ||||
final class PhabricatorInfrastructureTestCase | final class PhabricatorInfrastructureTestCase | ||||
extends PhabricatorTestCase { | 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 | * 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 | * that all symbols can be loaded correctly. It can catch problems like | ||||
* missing methods in descendants of abstract base classes. | * missing methods in descendants of abstract base classes. | ||||
*/ | */ | ||||
public function testEverythingImplemented() { | public function testEverythingImplemented() { | ||||
id(new PhutilSymbolLoader())->selectAndLoadSymbols(); | id(new PhutilSymbolLoader())->selectAndLoadSymbols(); | ||||
} | } | ||||
public function testApplicationsInstalled() { | public function testApplicationsInstalled() { | ||||
$all = PhabricatorApplication::getAllApplications(); | $all = PhabricatorApplication::getAllApplications(); | ||||
$installed = PhabricatorApplication::getAllInstalledApplications(); | $installed = PhabricatorApplication::getAllInstalledApplications(); | ||||
$this->assertEqual( | $this->assertEqual( | ||||
count($all), | count($all), | ||||
count($installed), | count($installed), | ||||
'In test cases, all applications should default to installed.'); | '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()); | |||||
} | |||||
} | } | ||||