1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/********************************************************************
2ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * COPYRIGHT:
327f654740f2a26ad62a5c155af9199af9e69b889claireho * Copyright (c) 1997-2010, International Business Machines Corporation and
4ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * others. All Rights Reserved.
5ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ********************************************************************/
6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/ucnv.h"
8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/ucnv_err.h"
9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "cintltst.h"
11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "ustr_cnv.h"
1227f654740f2a26ad62a5c155af9199af9e69b889claireho#include <string.h>
13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid TestDefaultConverterError(void); /* keep gcc happy */
1427f654740f2a26ad62a5c155af9199af9e69b889clairehovoid TestDefaultConverterSet(void); /* keep gcc happy */
15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* This makes sure that a converter isn't leaked when an error is passed to
18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    u_getDefaultConverter */
19ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid TestDefaultConverterError(void) {
20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UErrorCode          err                 =   U_ZERO_ERROR;
21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* Remove the default converter */
23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ucnv_close(u_getDefaultConverter(&err));
24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(err)) {
26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("Didn't expect a failure yet %s\n", myErrorName(err));
27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return;
28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* Set to any radom error state */
31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    err = U_FILE_ACCESS_ERROR;
32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (u_getDefaultConverter(&err) != NULL) {
33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        log_err("Didn't expect to get a converter on a failure\n");
34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3727f654740f2a26ad62a5c155af9199af9e69b889claireho/* Get the default converter. Copy its name. Put it back. */
3827f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void copyDefaultConverterName(char *out, UErrorCode *status) {
3927f654740f2a26ad62a5c155af9199af9e69b889claireho    UConverter *defConv;
4027f654740f2a26ad62a5c155af9199af9e69b889claireho    const char *itsName;
4127f654740f2a26ad62a5c155af9199af9e69b889claireho    out[0]=0;
4227f654740f2a26ad62a5c155af9199af9e69b889claireho    if(U_FAILURE(*status)) return;
4327f654740f2a26ad62a5c155af9199af9e69b889claireho    defConv = u_getDefaultConverter(status);
4427f654740f2a26ad62a5c155af9199af9e69b889claireho    /* get its name */
4527f654740f2a26ad62a5c155af9199af9e69b889claireho    itsName = ucnv_getName(defConv, status);
4627f654740f2a26ad62a5c155af9199af9e69b889claireho    if(U_FAILURE(*status)) return;
4727f654740f2a26ad62a5c155af9199af9e69b889claireho    strcpy(out, itsName);
4827f654740f2a26ad62a5c155af9199af9e69b889claireho    /* put it back. */
4927f654740f2a26ad62a5c155af9199af9e69b889claireho    u_releaseDefaultConverter(defConv);
5027f654740f2a26ad62a5c155af9199af9e69b889claireho}
5127f654740f2a26ad62a5c155af9199af9e69b889claireho
5227f654740f2a26ad62a5c155af9199af9e69b889claireho/*
5327f654740f2a26ad62a5c155af9199af9e69b889claireho  Changing the default name may not affect the actual name from u_getDefaultConverter
5427f654740f2a26ad62a5c155af9199af9e69b889claireho   ( for example, if UTF-8 is the fixed converter ).
5527f654740f2a26ad62a5c155af9199af9e69b889claireho  But, if it does cause a change, that change should be reflected when the converter is
5627f654740f2a26ad62a5c155af9199af9e69b889claireho  set back.
5727f654740f2a26ad62a5c155af9199af9e69b889claireho*/
5827f654740f2a26ad62a5c155af9199af9e69b889clairehovoid TestDefaultConverterSet(void) {
5927f654740f2a26ad62a5c155af9199af9e69b889claireho    UErrorCode status = U_ZERO_ERROR;
6027f654740f2a26ad62a5c155af9199af9e69b889claireho    static char defaultName[UCNV_MAX_CONVERTER_NAME_LENGTH + 1];
6127f654740f2a26ad62a5c155af9199af9e69b889claireho    static char nameBeforeSet[UCNV_MAX_CONVERTER_NAME_LENGTH + 1];
6227f654740f2a26ad62a5c155af9199af9e69b889claireho    static char nameAfterSet[UCNV_MAX_CONVERTER_NAME_LENGTH + 1];
6327f654740f2a26ad62a5c155af9199af9e69b889claireho    static char nameAfterRestore[UCNV_MAX_CONVERTER_NAME_LENGTH + 1];
6427f654740f2a26ad62a5c155af9199af9e69b889claireho    static const char SET_TO[]="iso-8859-3";
6527f654740f2a26ad62a5c155af9199af9e69b889claireho    strcpy(defaultName, ucnv_getDefaultName());
6627f654740f2a26ad62a5c155af9199af9e69b889claireho
6727f654740f2a26ad62a5c155af9199af9e69b889claireho    log_verbose("getDefaultName returned %s\n", defaultName);
6827f654740f2a26ad62a5c155af9199af9e69b889claireho
6927f654740f2a26ad62a5c155af9199af9e69b889claireho   /* first, flush any extant converter */
7027f654740f2a26ad62a5c155af9199af9e69b889claireho   u_flushDefaultConverter();
7127f654740f2a26ad62a5c155af9199af9e69b889claireho   copyDefaultConverterName(nameBeforeSet, &status);
7227f654740f2a26ad62a5c155af9199af9e69b889claireho   log_verbose("name from u_getDefaultConverter() = %s\n", nameBeforeSet);
7327f654740f2a26ad62a5c155af9199af9e69b889claireho   u_flushDefaultConverter();
7427f654740f2a26ad62a5c155af9199af9e69b889claireho   ucnv_setDefaultName(SET_TO);
7527f654740f2a26ad62a5c155af9199af9e69b889claireho   copyDefaultConverterName(nameAfterSet, &status);
7627f654740f2a26ad62a5c155af9199af9e69b889claireho   log_verbose("name from u_getDefaultConverter() after set to %s (%s) = %s\n", SET_TO, ucnv_getDefaultName(), nameAfterSet);
7727f654740f2a26ad62a5c155af9199af9e69b889claireho   ucnv_setDefaultName(defaultName);
7827f654740f2a26ad62a5c155af9199af9e69b889claireho   copyDefaultConverterName(nameAfterRestore, &status);
7927f654740f2a26ad62a5c155af9199af9e69b889claireho   log_verbose("name from u_getDefaultConverter() after restore = %s\n", nameAfterRestore);
8027f654740f2a26ad62a5c155af9199af9e69b889claireho   u_flushDefaultConverter();
8127f654740f2a26ad62a5c155af9199af9e69b889claireho
8227f654740f2a26ad62a5c155af9199af9e69b889claireho   if(U_FAILURE(status)) {
8327f654740f2a26ad62a5c155af9199af9e69b889claireho      log_err("Error in test: %s\n", u_errorName(status));
8427f654740f2a26ad62a5c155af9199af9e69b889claireho   } else {
8527f654740f2a26ad62a5c155af9199af9e69b889claireho      if(!strcmp(nameBeforeSet, nameAfterSet)) { /* changing the default didn't affect. */
8627f654740f2a26ad62a5c155af9199af9e69b889claireho          log_info("Skipping test: ucnv_setDefaultName() did not affect actual name of %s\n", nameBeforeSet);
8727f654740f2a26ad62a5c155af9199af9e69b889claireho      } else {
8827f654740f2a26ad62a5c155af9199af9e69b889claireho          if(strcmp(nameBeforeSet, nameAfterRestore)) {
8927f654740f2a26ad62a5c155af9199af9e69b889claireho               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);
9027f654740f2a26ad62a5c155af9199af9e69b889claireho          } else {
9127f654740f2a26ad62a5c155af9199af9e69b889claireho              log_verbose("Test passed. \n");
9227f654740f2a26ad62a5c155af9199af9e69b889claireho          }
9327f654740f2a26ad62a5c155af9199af9e69b889claireho      }
9427f654740f2a26ad62a5c155af9199af9e69b889claireho   }
9527f654740f2a26ad62a5c155af9199af9e69b889claireho}
96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
98