OLD | NEW |
1 /******************************************************************** | 1 /******************************************************************** |
2 * COPYRIGHT: | 2 * COPYRIGHT: |
3 * Copyright (c) 1998-2013, International Business Machines Corporation and | 3 * Copyright (c) 1998-2014, International Business Machines Corporation and |
4 * others. All Rights Reserved. | 4 * others. All Rights Reserved. |
5 ********************************************************************/ | 5 ********************************************************************/ |
6 /* | 6 /* |
7 * File test.c | 7 * File udatatst.c |
8 * | 8 * |
9 * Modification History: | 9 * Modification History: |
10 * | 10 * |
11 * Date Name Description | 11 * Date Name Description |
12 * 02/22/2000 Madhu Creation | 12 * 02/22/2000 Madhu Creation |
13 ****************************************************************************** | 13 ****************************************************************************** |
14 */ | 14 */ |
15 | 15 |
16 #include "unicode/utypes.h" | 16 #include "unicode/utypes.h" |
17 #include "unicode/putil.h" | 17 #include "unicode/putil.h" |
18 #include "unicode/udata.h" | 18 #include "unicode/udata.h" |
| 19 #include "unicode/ucal.h" |
19 #include "unicode/uchar.h" | 20 #include "unicode/uchar.h" |
20 #include "unicode/ucnv.h" | 21 #include "unicode/ucnv.h" |
21 #include "unicode/ures.h" | 22 #include "unicode/ures.h" |
22 #include "unicode/ustring.h" | 23 #include "unicode/ustring.h" |
23 #include "unicode/uclean.h" | 24 #include "unicode/uclean.h" |
24 #include "cmemory.h" | 25 #include "cmemory.h" |
25 #include "cstring.h" | 26 #include "cstring.h" |
26 #include "filestrm.h" | 27 #include "filestrm.h" |
27 #include "udatamem.h" | 28 #include "udatamem.h" |
28 #include "cintltst.h" | 29 #include "cintltst.h" |
(...skipping 19 matching lines...) Expand all Loading... |
48 /* swapping implementation in i18n */ | 49 /* swapping implementation in i18n */ |
49 #include "uspoof_impl.h" | 50 #include "uspoof_impl.h" |
50 | 51 |
51 U_CAPI int32_t U_EXPORT2 | 52 U_CAPI int32_t U_EXPORT2 |
52 unorm2_swap(const UDataSwapper *ds, | 53 unorm2_swap(const UDataSwapper *ds, |
53 const void *inData, int32_t length, void *outData, | 54 const void *inData, int32_t length, void *outData, |
54 UErrorCode *pErrorCode); | 55 UErrorCode *pErrorCode); |
55 | 56 |
56 /* other definitions and prototypes */ | 57 /* other definitions and prototypes */ |
57 | 58 |
58 #define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0])) | |
59 | |
60 #if !UCONFIG_NO_FILE_IO && !UCONFIG_NO_LEGACY_CONVERSION | 59 #if !UCONFIG_NO_FILE_IO && !UCONFIG_NO_LEGACY_CONVERSION |
61 static void TestUDataOpen(void); | 60 static void TestUDataOpen(void); |
62 static void TestUDataOpenChoiceDemo1(void); | 61 static void TestUDataOpenChoiceDemo1(void); |
63 static void TestUDataOpenChoiceDemo2(void); | 62 static void TestUDataOpenChoiceDemo2(void); |
64 static void TestUDataGetInfo(void); | 63 static void TestUDataGetInfo(void); |
65 static void TestUDataGetMemory(void); | 64 static void TestUDataGetMemory(void); |
66 static void TestErrorConditions(void); | 65 static void TestErrorConditions(void); |
67 static void TestAppData(void); | 66 static void TestAppData(void); |
68 static void TestSwapData(void); | 67 static void TestSwapData(void); |
69 #endif | 68 #endif |
70 static void TestUDataSetAppData(void); | 69 static void TestUDataSetAppData(void); |
71 static void TestICUDataName(void); | 70 static void TestICUDataName(void); |
72 static void PointerTableOfContents(void); | 71 static void PointerTableOfContents(void); |
73 static void SetBadCommonData(void); | 72 static void SetBadCommonData(void); |
74 static void TestUDataFileAccess(void); | 73 static void TestUDataFileAccess(void); |
75 | 74 #if !UCONFIG_NO_FORMATTING && !UCONFIG_NO_FILE_IO && !UCONFIG_NO_LEGACY_CONVERSI
ON |
| 75 static void TestTZDataDir(void); |
| 76 #endif |
76 | 77 |
77 void addUDataTest(TestNode** root); | 78 void addUDataTest(TestNode** root); |
78 | 79 |
79 void | 80 void |
80 addUDataTest(TestNode** root) | 81 addUDataTest(TestNode** root) |
81 { | 82 { |
82 #if !UCONFIG_NO_FILE_IO && !UCONFIG_NO_LEGACY_CONVERSION | 83 #if !UCONFIG_NO_FILE_IO && !UCONFIG_NO_LEGACY_CONVERSION |
83 addTest(root, &TestUDataOpen, "udatatst/TestUDataOpen" ); | 84 addTest(root, &TestUDataOpen, "udatatst/TestUDataOpen" ); |
84 addTest(root, &TestUDataOpenChoiceDemo1, "udatatst/TestUDataOpenChoiceDemo1"
); | 85 addTest(root, &TestUDataOpenChoiceDemo1, "udatatst/TestUDataOpenChoiceDemo1"
); |
85 addTest(root, &TestUDataOpenChoiceDemo2, "udatatst/TestUDataOpenChoiceDemo2"
); | 86 addTest(root, &TestUDataOpenChoiceDemo2, "udatatst/TestUDataOpenChoiceDemo2"
); |
86 addTest(root, &TestUDataGetInfo, "udatatst/TestUDataGetInfo" ); | 87 addTest(root, &TestUDataGetInfo, "udatatst/TestUDataGetInfo" ); |
87 addTest(root, &TestUDataGetMemory, "udatatst/TestUDataGetMemory" ); | 88 addTest(root, &TestUDataGetMemory, "udatatst/TestUDataGetMemory" ); |
88 addTest(root, &TestErrorConditions, "udatatst/TestErrorConditions"); | 89 addTest(root, &TestErrorConditions, "udatatst/TestErrorConditions"); |
89 addTest(root, &TestAppData, "udatatst/TestAppData" ); | 90 addTest(root, &TestAppData, "udatatst/TestAppData" ); |
90 addTest(root, &TestSwapData, "udatatst/TestSwapData" ); | 91 addTest(root, &TestSwapData, "udatatst/TestSwapData" ); |
91 #endif | 92 #endif |
92 addTest(root, &TestUDataSetAppData, "udatatst/TestUDataSetAppData" ); | 93 addTest(root, &TestUDataSetAppData, "udatatst/TestUDataSetAppData" ); |
93 addTest(root, &TestICUDataName, "udatatst/TestICUDataName" ); | 94 addTest(root, &TestICUDataName, "udatatst/TestICUDataName" ); |
94 addTest(root, &PointerTableOfContents, "udatatst/PointerTableOfContents" ); | 95 addTest(root, &PointerTableOfContents, "udatatst/PointerTableOfContents" ); |
95 addTest(root, &SetBadCommonData, "udatatst/SetBadCommonData" ); | 96 addTest(root, &SetBadCommonData, "udatatst/SetBadCommonData" ); |
96 addTest(root, &TestUDataFileAccess, "udatatst/TestUDataFileAccess" ); | 97 addTest(root, &TestUDataFileAccess, "udatatst/TestUDataFileAccess" ); |
| 98 #if !UCONFIG_NO_FORMATTING && !UCONFIG_NO_FILE_IO && !UCONFIG_NO_LEGACY_CONVERSI
ON |
| 99 addTest(root, &TestTZDataDir, "udatatst/TestTZDataDir" ); |
| 100 #endif |
97 } | 101 } |
98 | 102 |
99 #if 0 | 103 #if 0 |
100 static void lots_of_mallocs() | 104 static void lots_of_mallocs() |
101 { | 105 { |
102 int q; | 106 int q; |
103 for(q=1;q<100;q++) | 107 for(q=1;q<100;q++) |
104 { | 108 { |
105 free(malloc(q)); | 109 free(malloc(q)); |
106 malloc(q*2); | 110 malloc(q*2); |
(...skipping 1190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1297 {"*testtable32", "res", ures_swap}, | 1301 {"*testtable32", "res", ures_swap}, |
1298 | 1302 |
1299 /* ICU 4.2 resource bundle - data format 1.2 (little-endian ASCII) */ | 1303 /* ICU 4.2 resource bundle - data format 1.2 (little-endian ASCII) */ |
1300 {"*old_l_testtypes", "res", ures_swap}, | 1304 {"*old_l_testtypes", "res", ures_swap}, |
1301 /* same for big-endian EBCDIC */ | 1305 /* same for big-endian EBCDIC */ |
1302 {"*old_e_testtypes", "res", ures_swap}, | 1306 {"*old_e_testtypes", "res", ures_swap}, |
1303 | 1307 |
1304 #if !UCONFIG_NO_COLLATION | 1308 #if !UCONFIG_NO_COLLATION |
1305 /* standalone collation data files */ | 1309 /* standalone collation data files */ |
1306 {"ucadata", "icu", ucol_swap}, | 1310 {"ucadata", "icu", ucol_swap}, |
| 1311 #if 0 |
| 1312 /* Starting with ICU 53, the "inverse UCA" data is integrated into ucadata.i
cu. */ |
1307 {"invuca", "icu", ucol_swapInverseUCA}, | 1313 {"invuca", "icu", ucol_swapInverseUCA}, |
1308 #endif | 1314 #endif |
| 1315 #endif |
1309 | 1316 |
1310 #if !UCONFIG_NO_LEGACY_CONVERSION | 1317 #if !UCONFIG_NO_LEGACY_CONVERSION |
1311 /* conversion table files */ | 1318 /* conversion table files */ |
1312 | 1319 |
1313 /* SBCS conversion table file without extension */ | 1320 /* SBCS conversion table file without extension */ |
1314 {"ibm-913_P100-2000", "cnv", ucnv_swap}, | 1321 {"ibm-913_P100-2000", "cnv", ucnv_swap}, |
1315 /* EBCDIC_STATEFUL conversion table file with extension */ | 1322 /* EBCDIC_STATEFUL conversion table file with extension */ |
1316 {"ibm-1390_P110-2003", "cnv", ucnv_swap}, | 1323 {"ibm-1390_P110-2003", "cnv", ucnv_swap}, |
1317 /* DBCS extension-only conversion table file */ | 1324 /* DBCS extension-only conversion table file */ |
1318 {"ibm-16684_P110-2003", "cnv", ucnv_swap}, | 1325 {"ibm-16684_P110-2003", "cnv", ucnv_swap}, |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1357 /* | 1364 /* |
1358 * Starting with ICU4C 3.4, the core Unicode properties files | 1365 * Starting with ICU4C 3.4, the core Unicode properties files |
1359 * (uprops.icu, ucase.icu, ubidi.icu, unorm.icu) | 1366 * (uprops.icu, ucase.icu, ubidi.icu, unorm.icu) |
1360 * are hardcoded in the common DLL and therefore not included | 1367 * are hardcoded in the common DLL and therefore not included |
1361 * in the data package any more. | 1368 * in the data package any more. |
1362 * Their swapping code is moved from the common DLL to the icuswap tool so t
hat | 1369 * Their swapping code is moved from the common DLL to the icuswap tool so t
hat |
1363 * we need not jump through hoops (like adding snapshots of these files | 1370 * we need not jump through hoops (like adding snapshots of these files |
1364 * to testdata) for code coverage in tests. | 1371 * to testdata) for code coverage in tests. |
1365 * See Jitterbug 4497. | 1372 * See Jitterbug 4497. |
1366 * | 1373 * |
1367 * ICU4C 4.4 adds normalization data files again, e.g., nfc.nrm. | 1374 * ICU4C 4.4 adds normalization data files again, e.g., nfkc.nrm. |
1368 */ | 1375 */ |
1369 {"uprops", "icu", uprops_swap}, | 1376 {"uprops", "icu", uprops_swap}, |
1370 {"ucase", "icu", ucase_swap}, | 1377 {"ucase", "icu", ucase_swap}, |
1371 {"ubidi", "icu", ubidi_swap}, | 1378 {"ubidi", "icu", ubidi_swap}, |
1372 #endif | 1379 #endif |
1373 #if !UCONFIG_NO_NORMALIZATION && !UCONFIG_ONLY_COLLATION | 1380 #if !UCONFIG_NO_NORMALIZATION && !UCONFIG_ONLY_COLLATION |
1374 {"nfc", "nrm", unorm2_swap}, | 1381 {"nfkc", "nrm", unorm2_swap}, |
1375 {"confusables", "cfu", uspoof_swap}, | 1382 #if !UCONFIG_NO_REGULAR_EXPRESSIONS |
| 1383 {"confusables", "cfu", uspoof_swap}, /* spoof data missing with
out regex */ |
| 1384 #endif |
| 1385 |
1376 #endif | 1386 #endif |
1377 {"unames", "icu", uchar_swapNames} | 1387 {"unames", "icu", uchar_swapNames} |
1378 /* the last item should not be #if'ed so that it can reliably omit the last
comma */ | 1388 /* the last item should not be #if'ed so that it can reliably omit the last
comma */ |
1379 }; | 1389 }; |
1380 | 1390 |
1381 /* Large enough for the largest swappable data item. */ | 1391 /* Large enough for the largest swappable data item. */ |
1382 #define SWAP_BUFFER_SIZE 1800000 | 1392 #define SWAP_BUFFER_SIZE 1800000 |
1383 | 1393 |
1384 static void U_CALLCONV | 1394 static void U_CALLCONV |
1385 printError(void *context, const char *fmt, va_list args) { | 1395 printError(void *context, const char *fmt, va_list args) { |
(...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1669 errorCode=U_ZERO_ERROR; | 1679 errorCode=U_ZERO_ERROR; |
1670 memset(buffer, 0, sizeof(2*SWAP_BUFFER_SIZE)); | 1680 memset(buffer, 0, sizeof(2*SWAP_BUFFER_SIZE)); |
1671 ds=udata_openSwapperForInputData(buffer, 2*SWAP_BUFFER_SIZE, | 1681 ds=udata_openSwapperForInputData(buffer, 2*SWAP_BUFFER_SIZE, |
1672 !U_IS_BIG_ENDIAN, U_ASCII_FAMILY, | 1682 !U_IS_BIG_ENDIAN, U_ASCII_FAMILY, |
1673 &errorCode); | 1683 &errorCode); |
1674 if (ds != NULL || errorCode != U_UNSUPPORTED_ERROR) { | 1684 if (ds != NULL || errorCode != U_UNSUPPORTED_ERROR) { |
1675 log_err("udata_openSwapperForInputData should have returned NULL with ba
d argument\n", name); | 1685 log_err("udata_openSwapperForInputData should have returned NULL with ba
d argument\n", name); |
1676 } | 1686 } |
1677 errorCode=U_ZERO_ERROR; | 1687 errorCode=U_ZERO_ERROR; |
1678 | 1688 |
1679 /* Test argument checking. ucol_swapBinary is normally tested via ures_swap,
and isn't normally called directly. */ | 1689 /* Test argument checking. ucol_swap is normally tested via ures_swap, and i
sn't normally called directly. */ |
1680 #if !UCONFIG_NO_COLLATION | 1690 #if !UCONFIG_NO_COLLATION |
1681 ucol_swapBinary(NULL, NULL, -1, NULL, NULL); | 1691 ucol_swap(NULL, NULL, -1, NULL, &errorCode); |
1682 ucol_swapBinary(NULL, NULL, -1, NULL, &errorCode); | |
1683 if (errorCode != U_ILLEGAL_ARGUMENT_ERROR) { | 1692 if (errorCode != U_ILLEGAL_ARGUMENT_ERROR) { |
1684 log_err("ucol_swapBinary did not fail as expected\n", name); | 1693 log_err("ucol_swap did not fail as expected\n", name); |
1685 } | 1694 } |
1686 errorCode=U_ZERO_ERROR; | 1695 errorCode=U_ZERO_ERROR; |
1687 #endif | 1696 #endif |
1688 | 1697 |
1689 for(i=0; i<LENGTHOF(swapCases); ++i) { | 1698 for(i=0; i<UPRV_LENGTHOF(swapCases); ++i) { |
1690 /* build the name for logging */ | 1699 /* build the name for logging */ |
1691 errorCode=U_ZERO_ERROR; | 1700 errorCode=U_ZERO_ERROR; |
1692 if(swapCases[i].name[0]=='*') { | 1701 if(swapCases[i].name[0]=='*') { |
1693 pkg=testPath; | 1702 pkg=testPath; |
1694 nm=swapCases[i].name+1; | 1703 nm=swapCases[i].name+1; |
1695 uprv_strcpy(name, "testdata"); | 1704 uprv_strcpy(name, "testdata"); |
1696 } else if (uprv_strcmp(swapCases[i].type, "brk")==0 | 1705 } else if (uprv_strcmp(swapCases[i].type, "brk")==0 |
1697 || uprv_strcmp(swapCases[i].type, "dict")==0) { | 1706 || uprv_strcmp(swapCases[i].type, "dict")==0) { |
1698 pkg=U_ICUDATA_BRKITR; | 1707 pkg=U_ICUDATA_BRKITR; |
1699 nm=swapCases[i].name; | 1708 nm=swapCases[i].name; |
1700 uprv_strcpy(name, U_ICUDATA_BRKITR); | 1709 uprv_strcpy(name, U_ICUDATA_BRKITR); |
| 1710 #if !UCONFIG_NO_COLLATION |
1701 } else if (uprv_strcmp(swapCases[i].name, "ucadata")==0 | 1711 } else if (uprv_strcmp(swapCases[i].name, "ucadata")==0 |
1702 || uprv_strcmp(swapCases[i].name, "invuca")==0) { | 1712 || uprv_strcmp(swapCases[i].name, "invuca")==0) { |
1703 pkg=U_ICUDATA_COLL; | 1713 pkg=U_ICUDATA_COLL; |
1704 nm=swapCases[i].name; | 1714 nm=swapCases[i].name; |
1705 uprv_strcpy(name, U_ICUDATA_COLL); | 1715 uprv_strcpy(name, U_ICUDATA_COLL); |
| 1716 #endif /* !UCONFIG_NO_COLLATION */ |
1706 } else { | 1717 } else { |
1707 pkg=NULL; | 1718 pkg=NULL; |
1708 nm=swapCases[i].name; | 1719 nm=swapCases[i].name; |
1709 uprv_strcpy(name, "NULL"); | 1720 uprv_strcpy(name, "NULL"); |
1710 } | 1721 } |
1711 uprv_strcat(name, "/"); | 1722 uprv_strcat(name, "/"); |
1712 uprv_strcat(name, nm); | 1723 uprv_strcat(name, nm); |
1713 uprv_strcat(name, "."); | 1724 uprv_strcat(name, "."); |
1714 uprv_strcat(name, swapCases[i].type); | 1725 uprv_strcat(name, swapCases[i].type); |
1715 | 1726 |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1802 } | 1813 } |
1803 | 1814 |
1804 /* Check that we verify that the data isn't bad */ | 1815 /* Check that we verify that the data isn't bad */ |
1805 status = U_ZERO_ERROR; | 1816 status = U_ZERO_ERROR; |
1806 udata_setAppData("invalid path", badBuffer, &status); | 1817 udata_setAppData("invalid path", badBuffer, &status); |
1807 if (status != U_INVALID_FORMAT_ERROR) { | 1818 if (status != U_INVALID_FORMAT_ERROR) { |
1808 log_err("FAIL: udata_setAppData doesn't verify data validity.\n"); | 1819 log_err("FAIL: udata_setAppData doesn't verify data validity.\n"); |
1809 } | 1820 } |
1810 } | 1821 } |
1811 | 1822 |
| 1823 // Check the override loading of time zone .res files from a specified path |
| 1824 // |
| 1825 // Hand testing notes: |
| 1826 // 1. Run this test with the environment variable set. The following should in
duce faiures: |
| 1827 // ICU_TIMEZONE_FILES_DIR=../testdata/out/build LD_LIBRARY_PATH=../../lib
:../../stubdata:../../tools/ctestfw:$LD_LIBRARY_PATH ./cintltst /udatatst/TestT
ZDataDir |
| 1828 // 2. Build ICU with with U_TIMEZONE_FILES_DIR defined. This should also induc
e failures. |
| 1829 // CPPFLAGS=-DU_TIMEZONE_FILES_DIR\=`pwd`/test/testdata/out/testdata ./ru
nConfigureICU Linux |
| 1830 // make check |
| 1831 |
| 1832 static void TestTZDataDir(void) { |
| 1833 #if !UCONFIG_NO_FORMATTING |
| 1834 UErrorCode status = U_ZERO_ERROR; |
| 1835 const char *tzDataVersion; |
| 1836 const char *testDataPath; |
| 1837 |
| 1838 // Verify that default ICU time zone data version is something newer than 20
14a. |
| 1839 tzDataVersion = ucal_getTZDataVersion(&status); |
| 1840 // printf("tz data version is %s\n", tzDataVersion); |
| 1841 if (U_FAILURE(status)) { |
| 1842 log_data_err("Failed call to ucal_getTZDataVersion - %s\n", u_errorName(
status)); |
| 1843 return; |
| 1844 } else if (strcmp("2014a", tzDataVersion) == 0) { |
| 1845 log_err("File %s:%d - expected something newer than time zone data 2014a
.\n", __FILE__, __LINE__, tzDataVersion); |
| 1846 } |
| 1847 |
| 1848 testDataPath = loadTestData(&status); |
| 1849 // The path produced by loadTestData() will look something like |
| 1850 // whatever/.../testdata/out/testdata |
| 1851 // The test data puts an old (2014a) version of the time zone data there. |
| 1852 |
| 1853 // Switch ICU to the testdata version of zoneinfo64.res, which is verison 20
14a. |
| 1854 ctest_resetICU(); |
| 1855 u_setTimeZoneFilesDirectory(testDataPath, &status); |
| 1856 tzDataVersion = ucal_getTZDataVersion(&status); |
| 1857 if (strcmp("2014a", tzDataVersion) != 0) { |
| 1858 log_err("File %s:%d - expected \"2014a\"; actual \"%s\"\n", __FILE__, __
LINE__, tzDataVersion); |
| 1859 } |
| 1860 |
| 1861 ctest_resetICU(); // Return ICU to using its standard tz data. |
| 1862 tzDataVersion = ucal_getTZDataVersion(&status); |
| 1863 // printf("tz data version is %s\n", tzDataVersion); |
| 1864 if (strcmp("2014a", tzDataVersion) == 0) { |
| 1865 log_err("File %s:%d - expected something newer than time zone data 2014a
.\n", __FILE__, __LINE__, tzDataVersion); |
| 1866 } |
| 1867 #endif |
| 1868 } |
OLD | NEW |