Home | History | Annotate | Download | only in ctestfw
      1 /********************************************************************
      2  * COPYRIGHT:
      3  * Copyright (c) 2002-2010, International Business Machines Corporation and
      4  * others. All Rights Reserved.
      5  ********************************************************************/
      6 
      7 /* Created by weiv 05/09/2002 */
      8 
      9 #include <stdarg.h>
     10 
     11 #include "unicode/tstdtmod.h"
     12 #include "cmemory.h"
     13 #include <stdio.h>
     14 
     15 TestLog::~TestLog() {}
     16 
     17 IcuTestErrorCode::~IcuTestErrorCode() {
     18     // Safe because our handleFailure() does not throw exceptions.
     19     if(isFailure()) { handleFailure(); }
     20 }
     21 
     22 UBool IcuTestErrorCode::logIfFailureAndReset(const char *fmt, ...) {
     23     if(isFailure()) {
     24         char buffer[4000];
     25         va_list ap;
     26         va_start(ap, fmt);
     27         vsprintf(buffer, fmt, ap);
     28         va_end(ap);
     29         UnicodeString msg(testName, -1, US_INV);
     30         msg.append(UNICODE_STRING_SIMPLE(" failure: ")).append(UnicodeString(errorName(), -1, US_INV));
     31         msg.append(UNICODE_STRING_SIMPLE(" - ")).append(UnicodeString(buffer, -1, US_INV));
     32         testClass.errln(msg);
     33         reset();
     34         return TRUE;
     35     } else {
     36         reset();
     37         return FALSE;
     38     }
     39 }
     40 
     41 UBool IcuTestErrorCode::logDataIfFailureAndReset(const char *fmt, ...) {
     42     if(isFailure()) {
     43         char buffer[4000];
     44         va_list ap;
     45         va_start(ap, fmt);
     46         vsprintf(buffer, fmt, ap);
     47         va_end(ap);
     48         UnicodeString msg(testName, -1, US_INV);
     49         msg.append(UNICODE_STRING_SIMPLE(" failure: ")).append(UnicodeString(errorName(), -1, US_INV));
     50         msg.append(UNICODE_STRING_SIMPLE(" - ")).append(UnicodeString(buffer, -1, US_INV));
     51         testClass.dataerrln(msg);
     52         reset();
     53         return TRUE;
     54     } else {
     55         reset();
     56         return FALSE;
     57     }
     58 }
     59 
     60 void IcuTestErrorCode::handleFailure() const {
     61     // testClass.errln("%s failure - %s", testName, errorName());
     62     UnicodeString msg(testName, -1, US_INV);
     63     msg.append(UNICODE_STRING_SIMPLE(" failure: ")).append(UnicodeString(errorName(), -1, US_INV));
     64 
     65     if (get() == U_MISSING_RESOURCE_ERROR) {
     66         testClass.dataerrln(msg);
     67     } else {
     68         testClass.errln(msg);
     69     }
     70 }
     71 
     72 TestDataModule *TestDataModule::getTestDataModule(const char* name, TestLog& log, UErrorCode &status)
     73 {
     74   if(U_FAILURE(status)) {
     75     return NULL;
     76   }
     77   TestDataModule *result = NULL;
     78 
     79   // TODO: probe for resource bundle and then for XML.
     80   // According to that, construct an appropriate driver object
     81 
     82   result = new RBTestDataModule(name, log, status);
     83   if(U_SUCCESS(status)) {
     84     return result;
     85   } else {
     86     delete result;
     87     return NULL;
     88   }
     89 }
     90 
     91 TestDataModule::TestDataModule(const char* name, TestLog& log, UErrorCode& /*status*/)
     92 : testName(name),
     93 fInfo(NULL),
     94 fLog(log)
     95 {
     96 }
     97 
     98 TestDataModule::~TestDataModule() {
     99   if(fInfo != NULL) {
    100     delete fInfo;
    101   }
    102 }
    103 
    104 const char * TestDataModule::getName() const
    105 {
    106   return testName;
    107 }
    108 
    109 
    110 
    111 RBTestDataModule::~RBTestDataModule()
    112 {
    113   ures_close(fTestData);
    114   ures_close(fModuleBundle);
    115   ures_close(fInfoRB);
    116   uprv_free(tdpath);
    117 }
    118 
    119 RBTestDataModule::RBTestDataModule(const char* name, TestLog& log, UErrorCode& status)
    120 : TestDataModule(name, log, status),
    121   fModuleBundle(NULL),
    122   fTestData(NULL),
    123   fInfoRB(NULL),
    124   tdpath(NULL)
    125 {
    126   fNumberOfTests = 0;
    127   fDataTestValid = TRUE;
    128   fModuleBundle = getTestBundle(name, status);
    129   if(fDataTestValid) {
    130     fTestData = ures_getByKey(fModuleBundle, "TestData", NULL, &status);
    131     fNumberOfTests = ures_getSize(fTestData);
    132     fInfoRB = ures_getByKey(fModuleBundle, "Info", NULL, &status);
    133     if(status != U_ZERO_ERROR) {
    134       log.errln(UNICODE_STRING_SIMPLE("Unable to initalize test data - missing mandatory description resources!"));
    135       fDataTestValid = FALSE;
    136     } else {
    137       fInfo = new RBDataMap(fInfoRB, status);
    138     }
    139   }
    140 }
    141 
    142 UBool RBTestDataModule::getInfo(const DataMap *& info, UErrorCode &/*status*/) const
    143 {
    144     info = fInfo;
    145     if(fInfo) {
    146         return TRUE;
    147     } else {
    148         return FALSE;
    149     }
    150 }
    151 
    152 TestData* RBTestDataModule::createTestData(int32_t index, UErrorCode &status) const
    153 {
    154   TestData *result = NULL;
    155   UErrorCode intStatus = U_ZERO_ERROR;
    156 
    157   if(fDataTestValid == TRUE) {
    158     // Both of these resources get adopted by a TestData object.
    159     UResourceBundle *DataFillIn = ures_getByIndex(fTestData, index, NULL, &status);
    160     UResourceBundle *headers = ures_getByKey(fInfoRB, "Headers", NULL, &intStatus);
    161 
    162     if(U_SUCCESS(status)) {
    163       result = new RBTestData(DataFillIn, headers, status);
    164 
    165       if(U_SUCCESS(status)) {
    166         return result;
    167       } else {
    168         delete result;
    169       }
    170     } else {
    171       ures_close(DataFillIn);
    172       ures_close(headers);
    173     }
    174   } else {
    175     status = U_MISSING_RESOURCE_ERROR;
    176   }
    177   return NULL;
    178 }
    179 
    180 TestData* RBTestDataModule::createTestData(const char* name, UErrorCode &status) const
    181 {
    182   TestData *result = NULL;
    183   UErrorCode intStatus = U_ZERO_ERROR;
    184 
    185   if(fDataTestValid == TRUE) {
    186     // Both of these resources get adopted by a TestData object.
    187     UResourceBundle *DataFillIn = ures_getByKey(fTestData, name, NULL, &status);
    188     UResourceBundle *headers = ures_getByKey(fInfoRB, "Headers", NULL, &intStatus);
    189 
    190     if(U_SUCCESS(status)) {
    191       result = new RBTestData(DataFillIn, headers, status);
    192       if(U_SUCCESS(status)) {
    193         return result;
    194       } else {
    195         delete result;
    196       }
    197     } else {
    198       ures_close(DataFillIn);
    199       ures_close(headers);
    200     }
    201   } else {
    202     status = U_MISSING_RESOURCE_ERROR;
    203   }
    204   return NULL;
    205 }
    206 
    207 
    208 
    209 //Get test data from ResourceBundles
    210 UResourceBundle*
    211 RBTestDataModule::getTestBundle(const char* bundleName, UErrorCode &status)
    212 {
    213   if(U_SUCCESS(status)) {
    214     UResourceBundle *testBundle = NULL;
    215     const char* icu_data = fLog.getTestDataPath(status);
    216     if (testBundle == NULL) {
    217         testBundle = ures_openDirect(icu_data, bundleName, &status);
    218         if (status != U_ZERO_ERROR) {
    219             fLog.dataerrln(UNICODE_STRING_SIMPLE("Could not load test data from resourcebundle: ") + UnicodeString(bundleName, -1, US_INV));
    220             fDataTestValid = FALSE;
    221         }
    222     }
    223     return testBundle;
    224   } else {
    225     return NULL;
    226   }
    227 }
    228 
    229