1 /******************************************************************** 2 * COPYRIGHT: 3 * Copyright (c) 1997-2010, International Business Machines Corporation and 4 * others. All Rights Reserved. 5 ********************************************************************/ 6 7 #include "unicode/ucnv.h" 8 #include "unicode/ucnv_err.h" 9 10 #include "cintltst.h" 11 #include "ustr_cnv.h" 12 #include <string.h> 13 void TestDefaultConverterError(void); /* keep gcc happy */ 14 void TestDefaultConverterSet(void); /* keep gcc happy */ 15 16 17 /* This makes sure that a converter isn't leaked when an error is passed to 18 u_getDefaultConverter */ 19 void TestDefaultConverterError(void) { 20 UErrorCode err = U_ZERO_ERROR; 21 22 /* Remove the default converter */ 23 ucnv_close(u_getDefaultConverter(&err)); 24 25 if (U_FAILURE(err)) { 26 log_err("Didn't expect a failure yet %s\n", myErrorName(err)); 27 return; 28 } 29 30 /* Set to any radom error state */ 31 err = U_FILE_ACCESS_ERROR; 32 if (u_getDefaultConverter(&err) != NULL) { 33 log_err("Didn't expect to get a converter on a failure\n"); 34 } 35 } 36 37 /* Get the default converter. Copy its name. Put it back. */ 38 static void copyDefaultConverterName(char *out, UErrorCode *status) { 39 UConverter *defConv; 40 const char *itsName; 41 out[0]=0; 42 if(U_FAILURE(*status)) return; 43 defConv = u_getDefaultConverter(status); 44 /* get its name */ 45 itsName = ucnv_getName(defConv, status); 46 if(U_FAILURE(*status)) return; 47 strcpy(out, itsName); 48 /* put it back. */ 49 u_releaseDefaultConverter(defConv); 50 } 51 52 /* 53 Changing the default name may not affect the actual name from u_getDefaultConverter 54 ( for example, if UTF-8 is the fixed converter ). 55 But, if it does cause a change, that change should be reflected when the converter is 56 set back. 57 */ 58 void TestDefaultConverterSet(void) { 59 UErrorCode status = U_ZERO_ERROR; 60 static char defaultName[UCNV_MAX_CONVERTER_NAME_LENGTH + 1]; 61 static char nameBeforeSet[UCNV_MAX_CONVERTER_NAME_LENGTH + 1]; 62 static char nameAfterSet[UCNV_MAX_CONVERTER_NAME_LENGTH + 1]; 63 static char nameAfterRestore[UCNV_MAX_CONVERTER_NAME_LENGTH + 1]; 64 static const char SET_TO[]="iso-8859-3"; 65 strcpy(defaultName, ucnv_getDefaultName()); 66 67 log_verbose("getDefaultName returned %s\n", defaultName); 68 69 /* first, flush any extant converter */ 70 u_flushDefaultConverter(); 71 copyDefaultConverterName(nameBeforeSet, &status); 72 log_verbose("name from u_getDefaultConverter() = %s\n", nameBeforeSet); 73 u_flushDefaultConverter(); 74 ucnv_setDefaultName(SET_TO); 75 copyDefaultConverterName(nameAfterSet, &status); 76 log_verbose("name from u_getDefaultConverter() after set to %s (%s) = %s\n", SET_TO, ucnv_getDefaultName(), nameAfterSet); 77 ucnv_setDefaultName(defaultName); 78 copyDefaultConverterName(nameAfterRestore, &status); 79 log_verbose("name from u_getDefaultConverter() after restore = %s\n", nameAfterRestore); 80 u_flushDefaultConverter(); 81 82 if(U_FAILURE(status)) { 83 log_err("Error in test: %s\n", u_errorName(status)); 84 } else { 85 if(!strcmp(nameBeforeSet, nameAfterSet)) { /* changing the default didn't affect. */ 86 log_info("Skipping test: ucnv_setDefaultName() did not affect actual name of %s\n", nameBeforeSet); 87 } else { 88 if(strcmp(nameBeforeSet, nameAfterRestore)) { 89 log_err("Error: u_getDefaultConverter() is still returning %s (expected %s) even though default converter was set back to %s (was %s)\n", nameAfterRestore, nameBeforeSet, defaultName , SET_TO); 90 } else { 91 log_verbose("Test passed. \n"); 92 } 93 } 94 } 95 } 96 97 98