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