From febc05dae0613d097522ffff88aab4467f03d410 Mon Sep 17 00:00:00 2001 From: ayushchd Date: Wed, 12 Jun 2013 16:14:09 +0545 Subject: [PATCH] Unit tests for charset conversions Added test cases for: 1. libraries/char* 2. libraries/iconv* 3. libraries/kanji* --- libraries/dbi/DBIDummy.class.php | 22 +- .../libraries/PMA_charset_conversion_test.php | 61 ++++ test/libraries/PMA_iconv_wrapper_test.php | 73 +++++ test/libraries/PMA_kanji-encoding_test.php | 168 +++++++++++ test/libraries/PMA_mysql_charsets_test.php | 280 ++++++++++++++++++ 5 files changed, 603 insertions(+), 1 deletion(-) create mode 100644 test/libraries/PMA_charset_conversion_test.php create mode 100644 test/libraries/PMA_iconv_wrapper_test.php create mode 100644 test/libraries/PMA_kanji-encoding_test.php create mode 100644 test/libraries/PMA_mysql_charsets_test.php diff --git a/libraries/dbi/DBIDummy.class.php b/libraries/dbi/DBIDummy.class.php index 0a7d4a5a45..218e593c59 100644 --- a/libraries/dbi/DBIDummy.class.php +++ b/libraries/dbi/DBIDummy.class.php @@ -255,7 +255,27 @@ $GLOBALS['dummy_queries'] = array( 'query' => "SELECT `PRIVILEGE_TYPE` FROM `INFORMATION_SCHEMA`.`SCHEMA_PRIVILEGES` WHERE GRANTEE='''pma_test''@''localhost''' AND PRIVILEGE_TYPE='TRIGGER' AND TABLE_SCHEMA='pma'", 'result' => array(), ), - + array( + 'query' => 'SELECT DEFAULT_COLLATION_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = \'pma_test\' LIMIT 1', + 'columns' => array('DEFAULT_COLLATION_NAME'), + 'result' => array( + array('utf8_general_ci') + ) + ), + array( + 'query' => 'SELECT DEFAULT_COLLATION_NAME FROM data_dictionary.SCHEMAS WHERE SCHEMA_NAME = \'pma_test\' LIMIT 1', + 'columns' => array('DEFAULT_COLLATION_NAME'), + 'result' => array( + array('utf8_general_ci_pma_drizzle') + ) + ), + array( + 'query' => 'SHOW VARIABLES LIKE \'collation_database\'', + 'columns' => array('variable_name', 'variable_value'), + 'result' => array( + array('foo', 'bar'), + ) + ) ); /** * Current database. diff --git a/test/libraries/PMA_charset_conversion_test.php b/test/libraries/PMA_charset_conversion_test.php new file mode 100644 index 0000000000..495a9889ac --- /dev/null +++ b/test/libraries/PMA_charset_conversion_test.php @@ -0,0 +1,61 @@ +assertEquals( + 'test', + PMA_convertString('UTF-8', 'UTF-8', 'test') + ); + + $GLOBALS['PMA_recoding_engine'] = 6; + $this->assertEquals( + 'test', + PMA_convertString('UTF-8', 'flat', 'test') + ); + + // TODO: remove function_exists if recode_string exists on server + + if (@function_exists('recode_string')) { + $GLOBALS['PMA_recoding_engine'] = PMA_CHARSET_RECODE; + $this->assertEquals( + 'Only That ecole & Can Be My Blame', + PMA_convertString('UTF-8', 'flat', 'Only That école & Can Be My Blame') + ); + } + + $GLOBALS['PMA_recoding_engine'] = PMA_CHARSET_ICONV; + $GLOBALS['cfg']['IconvExtraParams'] = '//TRANSLIT'; + $this->assertEquals( + "This is the Euro symbol 'EUR'.", + PMA_convertString('UTF-8', 'ISO-8859-1', "This is the Euro symbol '€'.") + ); + + $GLOBALS['cfg']['IconvExtraParams'] = '//IGNORE'; + $GLOBALS['PMA_recoding_engine'] = PMA_CHARSET_ICONV_AIX; + $this->assertEquals( + "This is the Euro symbol ''.", + PMA_convertString('UTF-8', 'ISO-8859-1', "This is the Euro symbol '€'.") + ); + + } +} +?> diff --git a/test/libraries/PMA_iconv_wrapper_test.php b/test/libraries/PMA_iconv_wrapper_test.php new file mode 100644 index 0000000000..ed0e7fc23f --- /dev/null +++ b/test/libraries/PMA_iconv_wrapper_test.php @@ -0,0 +1,73 @@ +assertEquals( + iconv($in_charset_mapped, $out_charset_mapped, $str), + PMA_aix_iconv_wrapper($in_charset, $out_charset, $str) + ); + + } + + + /** + * Data provider for testIconvWrapper + * + * @return array data for testIconvWrapper test case + */ + public function IconvDataProvider() + { + return array( + array( + 'UTF-8', + 'ISO-8859-1//IGNORE', + 'UTF-8', + 'ISO-8859-1//IGNORE', + 'Euro Symbol: €' + ), + array( + 'UTF-8', + 'ISO-8859-1//IGNORE//TRANSLIT', + 'UTF-8', + 'ISO-8859-1//IGNORE', + 'Euro Symbol: €' + ), + array('UTF-8', + 'ISO-8859-9', + 'UTF-8', + 'ISO8859-9', + 'Testing "string"' + ) + ); + } +} +?> diff --git a/test/libraries/PMA_kanji-encoding_test.php b/test/libraries/PMA_kanji-encoding_test.php new file mode 100644 index 0000000000..ee562f1422 --- /dev/null +++ b/test/libraries/PMA_kanji-encoding_test.php @@ -0,0 +1,168 @@ +assertTrue(PMA_Kanji_checkEncoding()); + $this->assertEquals($expected, $GLOBALS['kanji_encoding_list']); + + } + + + /** + * Data provider for testPMA_Kanji_checkEncoding + * @return array Test data + */ + public function checkEncodingData() { + return array( + array('UTF-8', 'ASCII,SJIS,EUC-JP,JIS'), + array('EUC-JP', 'ASCII,EUC-JP,SJIS,JIS') + ); + } + + + /** + * Test for PMA_Kanji_changeOrder + * @param string $kanji_test_list current list + * @param string $expected expected list + * + * @return void + * + * @dataProvider changeOrderData + */ + public function testPMA_Kanji_changeOrder($kanji_test_list, $expected) { + $GLOBALS['kanji_encoding_list'] = $kanji_test_list; + $this->assertTrue(PMA_Kanji_changeOrder()); + $this->assertEquals($expected, $GLOBALS['kanji_encoding_list']); + } + + + /** + * Data Provider for testPMA_Kanji_changeOrder + * + * @return array Test data + */ + public function changeOrderData() { + return array( + array('ASCII,SJIS,EUC-JP,JIS', 'ASCII,EUC-JP,SJIS,JIS'), + array('ASCII,EUC-JP,SJIS,JIS', 'ASCII,SJIS,EUC-JP,JIS') + ); + } + + + /** + * Test for PMA_Kanji_strConv + * + * @return void + */ + public function testPMA_Kanji_strConv() { + + $this->assertEquals( + 'test', + PMA_Kanji_strConv('test', '', '') + ); + + $GLOBALS['kanji_encoding_list'] = 'ASCII,SJIS,EUC-JP,JIS'; + + $this->assertEquals( + 'test è', + PMA_Kanji_strConv('test è', '', '') + ); + + $this->assertEquals( + mb_convert_encoding('test è', 'ASCII', 'SJIS'), + PMA_Kanji_strConv('test è', 'ASCII', '') + ); + + $this->assertEquals( + mb_convert_kana('全角', 'KV', 'SJIS'), + PMA_Kanji_strConv('全角', '', 'kana') + ); + + } + + + /** + * Test for PMA_Kanji_fileConv + * + * @return void + */ + public function testPMA_Kanji_fileConv() { + + $file_str = "教育漢字常用漢字"; + $filename = 'test.kanji'; + $file = fopen($filename, 'w'); + fputs($file, $file_str); + fclose($file); + $GLOBALS['kanji_encoding_list'] = 'ASCII,EUC-JP,SJIS,JIS'; + + $result = PMA_Kanji_fileConv($filename, 'JIS', 'kana'); + + $string = file_get_contents($result); + PMA_Kanji_changeOrder(); + $expected = PMA_Kanji_strConv($file_str, 'JIS', 'kana'); + PMA_Kanji_changeOrder(); + $this->assertEquals($string, $expected); + unlink($result); + + } + + + /** + * Test for PMA_Kanji_encodingForm + * + * @return void + */ + public function testPMA_Kanji_encodingForm() { + + $actual = PMA_Kanji_encodingForm(); + $this->assertContains( + 'assertContains( + 'type="radio" name="knjenc"', + $actual + ); + $this->assertContains( + '', + $actual + ); + $this->assertContains( + '', + $actual + ); + $this->assertContains( + '', + $actual + ); + + } + + +} +?> diff --git a/test/libraries/PMA_mysql_charsets_test.php b/test/libraries/PMA_mysql_charsets_test.php new file mode 100644 index 0000000000..0af9831257 --- /dev/null +++ b/test/libraries/PMA_mysql_charsets_test.php @@ -0,0 +1,280 @@ +assertEquals( + $expected, + PMA_generateCharsetQueryPart($collation) + ); + } + + + /** + * Data Provider for testPMA_generateCharsetQueryPart + * + * @return array test data + */ + public function charsetQueryData() + { + return array( + array(false, "a_b_c_d", " CHARACTER SET a COLLATE a_b_c_d"), + array(false, "a_", " CHARACTER SET a COLLATE a_"), + array(false, "a", " CHARACTER SET a"), + array(true, "a_b_c_d", " COLLATE a_b_c_d") + ); + } + + + /** + * Test for PMA_getDbCollation + * + * @return void + * + */ + public function testPMA_getDbCollation() + { + + // test case for system schema + $this->assertEquals( + 'utf8_general_ci', + PMA_getDbCollation("information_schema") + ); + + // test case with no pma drizzle + if (defined('PMA_DRIZZLE')) { + runkit_constant_redefine('PMA_DRIZZLE', false); + } else { + define('PMA_DRIZZLE', false); + } + $GLOBALS['cfg']['Server']['DisableIS'] = false; + $GLOBALS['cfg']['DBG']['sql'] = false; + $this->assertEquals( + 'utf8_general_ci', + PMA_getDbCollation('pma_test') + ); + + // test case with pma drizzle as true + runkit_constant_redefine('PMA_DRIZZLE', true); + $this->assertEquals( + 'utf8_general_ci_pma_drizzle', + PMA_getDbCollation('pma_test') + ); + + + $GLOBALS['cfg']['Server']['DisableIS'] = true; + $GLOBALS['db'] = 'pma_test2'; + $this->assertEquals( + 'bar', + PMA_getDbCollation('pma_test') + ); + $this->assertNotEquals( + 'pma_test', + $GLOBALS['dummy_db'] + ); + + } + + + /** + * Test case for PMA_getCollationDescr() + * + * @param string $collation Collation for which description is reqd + * @param string $desc Expected Description + * + * @return void + * @dataProvider collationDescr + */ + public function testPMA_getCollationDescr($collation, $desc) { + $this->assertEquals( + $desc, + PMA_getCollationDescr($collation) + ); + } + + + /** + * Data Provider for testPMA_getCollationDescr() + * + * @return array Test data for testPMA_getCollationDescr() + */ + public function collationDescr() { + return array( + array('binary', 'Binary'), + array('foo_bulgarian_bar', 'Bulgarian'), + array('gb2312_chinese', 'Simplified Chinese'), + array('gbk_chinese', 'Simplified Chinese'), + array('big5_chinese', 'Traditional Chinese'), + array('foo_ci_bar', 'unknown, case-insensitive'), + array('foo_cs_bar', 'unknown, case-sensitive'), + array('foo_croatian_bar', 'Croatian'), + array('foo_czech_bar', 'Czech'), + array('foo_danish_bar', 'Danish'), + array('foo_english_bar', 'English'), + array('foo_esperanto_bar', 'Esperanto'), + array('foo_estonian_bar', 'Estonian'), + array('foo_german1_bar', 'German (dictionary)'), + array('foo_german2_bar', 'German (phone book)'), + array('foo_hungarian_bar', 'Hungarian'), + array('foo_icelandic_bar', 'Icelandic'), + array('foo_japanese_bar', 'Japanese'), + array('foo_latvian_bar', 'Latvian'), + array('foo_lithuanian_bar', 'Lithuanian'), + array('foo_korean_bar', 'Korean'), + array('foo_persian_bar', 'Persian'), + array('foo_polish_bar', 'Polish'), + array('foo_roman_bar', 'West European'), + array('foo_romanian_bar', 'Romanian'), + array('foo_slovak_bar', 'Slovak'), + array('foo_slovenian_bar', 'Slovenian'), + array('foo_spanish_bar', 'Spanish'), + array('foo_spanish2_bar', 'Traditional Spanish'), + array('foo_swedish_bar', 'Swedish'), + array('foo_thai_bar', 'Thai'), + array('foo_turkish_bar', 'Turkish'), + array('foo_ukrainian_bar', 'Ukrainian'), + array('foo_unicode_bar', 'Unicode (multilingual)'), + array('ucs2', 'Unicode (multilingual)'), + array('utf8', 'Unicode (multilingual)'), + array('ascii', 'West European (multilingual)'), + array('cp850', 'West European (multilingual)'), + array('dec8', 'West European (multilingual)'), + array('hp8', 'West European (multilingual)'), + array('latin1', 'West European (multilingual)'), + array('cp1250', 'Central European (multilingual)'), + array('cp852', 'Central European (multilingual)'), + array('latin2', 'Central European (multilingual)'), + array('macce', 'Central European (multilingual)'), + array('cp866', 'Russian'), + array('koi8r', 'Russian'), + array('gb2312', 'Simplified Chinese'), + array('gbk', 'Simplified Chinese'), + array('sjis', 'Japanese'), + array('ujis', 'Japanese'), + array('cp932', 'Japanese'), + array('eucjpms', 'Japanese'), + array('cp1257', 'Baltic (multilingual)'), + array('latin7', 'Baltic (multilingual)'), + array('armscii8', 'Armenian'), + array('armscii', 'Armenian'), + array('big5', 'Traditional Chinese'), + array('cp1251', 'Cyrillic (multilingual)'), + array('cp1256', 'Arabic'), + array('euckr', 'Korean'), + array('hebrew', 'Hebrew'), + array('geostd8', 'Georgian'), + array('greek', 'Greek'), + array('keybcs2', 'Czech-Slovak'), + array('koi8u', 'Ukrainian'), + array('latin5', 'Turkish'), + array('swe7', 'Swedish'), + array('tis620', 'Thai'), + array('foobar', 'unknown'), + array('foo_test_bar', 'unknown'), + array('foo_bin_bar', 'unknown, Binary') + ); + } + + + /** + * Test for PMA_generateCharsetDropdownBox + * + * @return void + */ + public function testPMA_generateCharsetDropdownBox() { + + $GLOBALS['mysql_charsets'] = array('latin1', 'latin2', 'latin3'); + $GLOBALS['mysql_charsets_available'] = array( + 'latin1' => true, + 'latin2' => false, + 'latin3' => true + ); + $GLOBALS['mysql_charsets_descriptions'] = array( + 'latin1' => 'abc', + 'latin2' => 'def' + ); + $GLOBALS['mysql_collations'] = array( + 'latin1' => array( + 'latin1_german1_ci', + 'latin1_swedish1_ci' + ), + 'latin2' => array('latin1_general_ci'), + 'latin3' => array() + ); + $GLOBALS['mysql_collations_available'] = array( + 'latin1_german1_ci' => true, + 'latin1_swedish1_ci' => false, + 'latin2_general_ci' => true + ); + $result = PMA_generateCharsetDropdownBox(); + + $this->assertContains('name="collation"', $result); + $this->assertNotContains('id="', $result); + $this->assertNotContains('class="autosubmit"', $result); + $this->assertContains('', $result); + $this->assertContains('assertContains('title="latin3', $result); + $this->assertContains('title="abc', $result); + $this->assertNotContains('value="latin1_swedish1_ci"', $result); + $this->assertContains('value="latin1_german1_ci"', $result); + $this->assertNotContains('value="latin2_general1_ci"', $result); + $this->assertContains('title="German', $result); + + $result = PMA_generateCharsetDropdownBox(2, null, "test_id", "latin1", + false, 0, true, false + ); + $this->assertContains('name="character_set"', $result); + $this->assertNotContains('Charset', $result); + $this->assertContains('class="autosubmit"', $result); + $this->assertContains('id="test_id"', $result); + $this->assertContains('selected="selected">latin1', $result); + } + + + /** + * Test for PMA_getServerCollation + * + * @return void + */ + public function testPMA_getServerCollation() { + + $GLOBALS['cfg']['DBG']['sql'] = false; + $this->assertEquals('utf8_general_ci', PMA_getServerCollation()); + + } +} +?>