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 */
TestDefaultConverterError(void)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. */
copyDefaultConverterName(char * out,UErrorCode * status)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 */
TestDefaultConverterSet(void)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