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