X-Git-Url: https://git.saurik.com/apple/icu.git/blobdiff_plain/73c04bcfe1096173b00431f0cdc742894b15eef0..ba6d6ed23dec08b1cd5700a128c0752491c10ac9:/icuSources/test/cintltst/cintltst.c?ds=sidebyside diff --git a/icuSources/test/cintltst/cintltst.c b/icuSources/test/cintltst/cintltst.c index 1425abdb..52d274c2 100644 --- a/icuSources/test/cintltst/cintltst.c +++ b/icuSources/test/cintltst/cintltst.c @@ -1,6 +1,6 @@ /******************************************************************** * COPYRIGHT: - * Copyright (c) 1997-2005, International Business Machines Corporation and + * Copyright (c) 1997-2011, International Business Machines Corporation and * others. All Rights Reserved. ********************************************************************/ /******************************************************************************** @@ -32,7 +32,10 @@ #include "unicode/uclean.h" #include "unicode/ucal.h" #include "uoptions.h" -#include "putilimp.h" /* for uprv_getUTCtime() */ +#include "putilimp.h" /* for uprv_getRawUTCtime() */ +#ifdef URES_DEBUG +#include "uresimp.h" /* for ures_dumpCacheContents() */ +#endif #ifdef XP_MAC_CONSOLE # include @@ -60,56 +63,15 @@ void ctest_setICU_DATA(void); # define TRY_CNV_2 "sjis" #endif - -/* - * Tracing functions. - */ -static int traceFnNestingDepth = 0; -U_CDECL_BEGIN -static void U_CALLCONV TraceEntry(const void *context, int32_t fnNumber) { - char buf[500]; - utrace_format(buf, sizeof(buf), traceFnNestingDepth*3, "%s() enter.\n", utrace_functionName(fnNumber)); - buf[sizeof(buf)-1]=0; - fputs(buf, stdout); - traceFnNestingDepth++; -} - -static void U_CALLCONV TraceExit(const void *context, int32_t fnNumber, const char *fmt, va_list args) { - char buf[500]; - - if (traceFnNestingDepth>0) { - traceFnNestingDepth--; - } - utrace_format(buf, sizeof(buf), traceFnNestingDepth*3, "%s() ", utrace_functionName(fnNumber)); - buf[sizeof(buf)-1]=0; - fputs(buf, stdout); - utrace_vformat(buf, sizeof(buf), traceFnNestingDepth*3, fmt, args); - buf[sizeof(buf)-1]=0; - fputs(buf, stdout); - putc('\n', stdout); -} - -static void U_CALLCONV TraceData(const void *context, int32_t fnNumber, - int32_t level, const char *fmt, va_list args) { - char buf[500]; - utrace_vformat(buf, sizeof(buf), traceFnNestingDepth*3, fmt, args); - buf[sizeof(buf)-1]=0; - fputs(buf, stdout); - putc('\n', stdout); -} -U_CDECL_END - - +static int gOrigArgc; +static const char* const * gOrigArgv; int main(int argc, const char* const argv[]) { int nerrors = 0; - int warnOnMissingData = 0; - int i, j; UBool defaultDataFound; TestNode *root; const char *warnOrErr = "Failure"; - const char** argv2; UDate startTime, endTime; int32_t diffTime; @@ -120,73 +82,42 @@ int main(int argc, const char* const argv[]) U_MAIN_INIT_ARGS(argc, argv); - startTime = uprv_getUTCtime(); + startTime = uprv_getRawUTCtime(); - argv2 = (const char**) malloc(sizeof(char*) * argc); - if (argv2 == NULL) { - printf("*** Error: Out of memory (too many cmd line args?)\n"); - return 1; + gOrigArgc = argc; + gOrigArgv = argv; + if (!initArgs(argc, argv, NULL, NULL)) { + /* Error already displayed. */ + return -1; } - argv2[0] = argv[0]; - - - /* Checkargs */ - /* TODO: Test framework arg handling needs to be decoupled from test execution - * so that the args being processed here don't need special handling, - * separate from the other test args. + + /* Check whether ICU will initialize without forcing the build data directory into + * the ICU_DATA path. Success here means either the data dll contains data, or that + * this test program was run with ICU_DATA set externally. Failure of this check + * is normal when ICU data is not packaged into a shared library. + * + * Whether or not this test succeeds, we want to cleanup and reinitialize + * with a data path so that data loading from individual files can be tested. */ - ICU_TRACE = UTRACE_OFF; - for(i=1,j=1;i 0) { /* Loop runs once per complete execution of the tests + while (getTestOption(REPEAT_TESTS_OPTION) > 0) { /* Loop runs once per complete execution of the tests * used for -r (repeat) test option. */ - - /* Check whether ICU will initialize without forcing the build data directory into - * the ICU_DATA path. Success here means either the data dll contains data, or that - * this test program was run with ICU_DATA set externally. Failure of this check - * is normal when ICU data is not packaged into a shared library. - * - * Whether or not this test succeeds, we want to cleanup and reinitialize - * with a data path so that data loading from individual files can be tested. - */ - defaultDataFound = TRUE; - u_init(&errorCode); - if (U_FAILURE(errorCode)) { - fprintf(stderr, - "#### Note: ICU Init without build-specific setDataDirectory() failed.\n"); - defaultDataFound = FALSE; + if (!initArgs(argc, argv, NULL, NULL)) { + /* Error already displayed. */ + return -1; } - u_cleanup(); errorCode = U_ZERO_ERROR; - utrace_setFunctions(NULL, TraceEntry, TraceExit, TraceData); - utrace_setLevel(ICU_TRACE); /* Initialize ICU */ if (!defaultDataFound) { @@ -198,7 +129,7 @@ int main(int argc, const char* const argv[]) "#### ERROR! %s: u_init() failed with status = \"%s\".\n" "*** Check the ICU_DATA environment variable and \n" "*** check that the data files are present.\n", argv[0], u_errorName(errorCode)); - if(warnOnMissingData == 0) { + if(!getTestOption(WARN_ON_MISSING_DATA_OPTION)) { fprintf(stderr, "*** Exiting. Use the '-w' option if data files were\n*** purposely removed, to continue test anyway.\n"); u_cleanup(); return 1; @@ -217,7 +148,7 @@ int main(int argc, const char* const argv[]) "*** %s! The converter for " TRY_CNV_2 " cannot be opened.\n" "*** Check the ICU_DATA environment variable and \n" "*** check that the data files are present.\n", warnOrErr); - if(warnOnMissingData == 0) { + if(!getTestOption(WARN_ON_MISSING_DATA_OPTION)) { fprintf(stderr, "*** Exitting. Use the '-w' option if data files were\n*** purposely removed, to continue test anyway.\n"); u_cleanup(); return 1; @@ -233,13 +164,32 @@ int main(int argc, const char* const argv[]) "*** %s! The \"en\" locale resource bundle cannot be opened.\n" "*** Check the ICU_DATA environment variable and \n" "*** check that the data files are present.\n", warnOrErr); - if(warnOnMissingData == 0) { + if(!getTestOption(WARN_ON_MISSING_DATA_OPTION)) { fprintf(stderr, "*** Exitting. Use the '-w' option if data files were\n*** purposely removed, to continue test anyway.\n"); u_cleanup(); return 1; } } + errorCode = U_ZERO_ERROR; + rb = ures_open(NULL, NULL, &errorCode); + if(U_SUCCESS(errorCode)) { + /* ok */ + if (errorCode == U_USING_DEFAULT_WARNING || errorCode == U_USING_FALLBACK_WARNING) { + fprintf(stderr, + "#### Note: The default locale %s is not available\n", uloc_getDefault()); + } + ures_close(rb); + } else { + fprintf(stderr, + "*** %s! Can not open a resource bundle for the default locale %s\n", warnOrErr, uloc_getDefault()); + if(!getTestOption(WARN_ON_MISSING_DATA_OPTION)) { + fprintf(stderr, "*** Exitting. Use the '-w' option if data files were\n" + "*** purposely removed, to continue test anyway.\n"); + u_cleanup(); + return 1; + } + } fprintf(stdout, "Default locale for this run is %s\n", uloc_getDefault()); /* Build a tree of all tests. @@ -248,10 +198,11 @@ int main(int argc, const char* const argv[]) addAllTests(&root); /* Tests acutally run HERE. TODO: separate command line option parsing & setting from test execution!! */ - nerrors = processArgs(root, argc, argv2); + nerrors = runTestRequest(root, argc, argv); - if (--REPEAT_TESTS > 0) { - printf("Repeating tests %d more time(s)\n", REPEAT_TESTS); + setTestOption(REPEAT_TESTS_OPTION, DECREMENT_OPTION_VALUE); + if (getTestOption(REPEAT_TESTS_OPTION) > 0) { + printf("Repeating tests %d more time(s)\n", getTestOption(REPEAT_TESTS_OPTION)); } cleanUpTestTree(root); @@ -259,13 +210,23 @@ int main(int argc, const char* const argv[]) ctst_freeAll(); /* To check for leaks */ u_cleanup(); /* nuke the hashtable.. so that any still-open cnvs are leaked */ +#ifdef URES_DEBUG + if(ures_dumpCacheContents()) { + fprintf(stderr, "Error: After final u_cleanup, RB cache was not empty.\n"); + nerrors++; + } else { + fprintf(stderr,"OK: After final u_cleanup, RB cache was empty.\n"); + } +#endif #endif } /* End of loop that repeats the entire test, if requested. (Normally doesn't loop) */ - free((void*)argv2); - - endTime = uprv_getUTCtime(); + if (ALLOCATION_COUNT > 0) { + fprintf(stderr, "There were %d blocks leaked!\n", ALLOCATION_COUNT); + nerrors++; + } + endTime = uprv_getRawUTCtime(); diffTime = (int32_t)(endTime - startTime); printf("Elapsed Time: %02d:%02d:%02d.%03d\n", (int)((diffTime%U_MILLIS_PER_DAY)/U_MILLIS_PER_HOUR), @@ -372,7 +333,7 @@ const char * ctest_dataSrcDir() dataSrcDir = ".."U_FILE_SEP_STRING".."U_FILE_SEP_STRING "data" U_FILE_SEP_STRING; } else { - dataSrcDir = ".."U_FILE_SEP_STRING".."U_FILE_SEP_STRING".."U_FILE_SEP_STRING "data" U_FILE_SEP_STRING; + dataSrcDir = ".."U_FILE_SEP_STRING".."U_FILE_SEP_STRING".."U_FILE_SEP_STRING".."U_FILE_SEP_STRING "data" U_FILE_SEP_STRING; } } } @@ -439,7 +400,7 @@ const char *ctest_dataOutDir() dataOutDir = ".."U_FILE_SEP_STRING".."U_FILE_SEP_STRING "data" U_FILE_SEP_STRING "out" U_FILE_SEP_STRING; } else { - dataOutDir = ".."U_FILE_SEP_STRING".."U_FILE_SEP_STRING".."U_FILE_SEP_STRING "data" U_FILE_SEP_STRING "out" U_FILE_SEP_STRING; + dataOutDir = ".."U_FILE_SEP_STRING".."U_FILE_SEP_STRING".."U_FILE_SEP_STRING".."U_FILE_SEP_STRING "data" U_FILE_SEP_STRING "out" U_FILE_SEP_STRING; } } } @@ -468,6 +429,39 @@ void ctest_setICU_DATA() { } } +/* These tests do cleanup and reinitialize ICU in the course of their operation. + * The ICU data directory must be preserved across these operations. + * Here is a helper function to assist with that. + */ +static char *safeGetICUDataDirectory() { + const char *dataDir = u_getDataDirectory(); /* Returned string vanashes with u_cleanup */ + char *retStr = NULL; + if (dataDir != NULL) { + retStr = (char *)malloc(strlen(dataDir)+1); + strcpy(retStr, dataDir); + } + return retStr; +} + +UBool ctest_resetICU() { + UErrorCode status = U_ZERO_ERROR; + char *dataDir = safeGetICUDataDirectory(); + + u_cleanup(); + if (!initArgs(gOrigArgc, gOrigArgv, NULL, NULL)) { + /* Error already displayed. */ + return FALSE; + } + u_setDataDirectory(dataDir); + free(dataDir); + u_init(&status); + if (U_FAILURE(status)) { + log_err_status(status, "u_init failed with %s\n", u_errorName(status)); + return FALSE; + } + return TRUE; +} + UChar* CharsToUChars(const char* str) { /* Might be faster to just use uprv_strlen() as the preflight len - liu */ int32_t len = u_unescape(str, 0, 0); /* preflight */ @@ -500,7 +494,7 @@ char *aescstrdup(const UChar* unichars,int32_t length){ const void *p; UErrorCode errorCode = U_ZERO_ERROR; #if U_CHARSET_FAMILY==U_EBCDIC_FAMILY -# ifdef OS390 +# if U_PLATFORM == U_PF_OS390 static const char convName[] = "ibm-1047"; # else static const char convName[] = "ibm-37"; @@ -515,7 +509,7 @@ char *aescstrdup(const UChar* unichars,int32_t length){ newString = (char*)ctst_malloc ( sizeof(char) * 8 * (length +1)); target = newString; targetLimit = newString+sizeof(char) * 8 * (length +1); - ucnv_setFromUCallBack(conv, UCNV_FROM_U_CALLBACK_ESCAPE, UCNV_ESCAPE_JAVA, &cb, &p, &errorCode); + ucnv_setFromUCallBack(conv, UCNV_FROM_U_CALLBACK_ESCAPE, UCNV_ESCAPE_C, &cb, &p, &errorCode); ucnv_fromUnicode(conv,&target,targetLimit, &unichars, (UChar*)(unichars+length),NULL,TRUE,&errorCode); ucnv_close(conv); *target = '\0'; @@ -555,7 +549,7 @@ const char* loadTestData(UErrorCode* err){ /* Fall back did not succeed either so return */ if(U_FAILURE(*err)){ *err = U_FILE_ACCESS_ERROR; - log_err("Could not load testtypes.res in testdata bundle with path %s - %s\n", tdpath, u_errorName(*err)); + log_data_err("Could not load testtypes.res in testdata bundle with path %s - %s\n", tdpath, u_errorName(*err)); return ""; } ures_close(test); @@ -581,7 +575,7 @@ U_CFUNC void ctest_setTimeZone(const char *optionalTimeZone, UErrorCode *status) optionalTimeZone = "America/Los_Angeles"; } if (gOriginalTimeZone[0]) { - log_err("*** Error: time zone saved twice. New value will be %s\n", + log_data_err("*** Error: time zone saved twice. New value will be %s (Are you missing data?)\n", optionalTimeZone); } ucal_getDefaultTimeZone(gOriginalTimeZone, CTEST_MAX_TIMEZONE_SIZE, status); @@ -618,7 +612,7 @@ U_CFUNC void ctest_resetTimeZone(void) { #endif } -#define CTST_MAX_ALLOC 10000 +#define CTST_MAX_ALLOC 8192 /* Array used as a queue */ static void * ctst_allocated_stuff[CTST_MAX_ALLOC] = {0}; static int ctst_allocated = 0; @@ -658,7 +652,7 @@ void ctst_freeAll() { U_CFUNC UBool assertSuccess(const char* msg, UErrorCode* ec) { U_ASSERT(ec!=NULL); if (U_FAILURE(*ec)) { - log_err("FAIL: %s (%s)\n", msg, u_errorName(*ec)); + log_err_status(*ec, "FAIL: %s (%s)\n", msg, u_errorName(*ec)); return FALSE; } return TRUE; @@ -698,9 +692,19 @@ U_CFUNC UBool assertEquals(const char* message, const char* expected, *-------------------------------------------------------------------- */ -U_CFUNC UBool isICUVersionAtLeast(const UVersionInfo x) { - UVersionInfo v; - u_getVersion(v); - return (uprv_memcmp(v, x, U_MAX_VERSION_LENGTH) >= 0); +U_CFUNC UBool isICUVersionBefore(int major, int minor, int milli) { + UVersionInfo iv; + UVersionInfo ov; + ov[0] = (uint8_t)major; + ov[1] = (uint8_t)minor; + ov[2] = (uint8_t)milli; + ov[3] = 0; + u_getVersion(iv); + return uprv_memcmp(iv, ov, U_MAX_VERSION_LENGTH) < 0; } + +U_CFUNC UBool isICUVersionAtLeast(int major, int minor, int milli) { + return !isICUVersionBefore(major, minor, milli); +} + #endif