• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
~TestLog()15 TestLog::~TestLog() {}
16 
~IcuTestErrorCode()17 IcuTestErrorCode::~IcuTestErrorCode() {
18     // Safe because our handleFailure() does not throw exceptions.
19     if(isFailure()) { handleFailure(); }
20 }
21 
logIfFailureAndReset(const char * fmt,...)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 
logDataIfFailureAndReset(const char * fmt,...)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 
handleFailure() const60 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 
getTestDataModule(const char * name,TestLog & log,UErrorCode & status)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 
TestDataModule(const char * name,TestLog & log,UErrorCode &)91 TestDataModule::TestDataModule(const char* name, TestLog& log, UErrorCode& /*status*/)
92 : testName(name),
93 fInfo(NULL),
94 fLog(log)
95 {
96 }
97 
~TestDataModule()98 TestDataModule::~TestDataModule() {
99   if(fInfo != NULL) {
100     delete fInfo;
101   }
102 }
103 
getName() const104 const char * TestDataModule::getName() const
105 {
106   return testName;
107 }
108 
109 
110 
~RBTestDataModule()111 RBTestDataModule::~RBTestDataModule()
112 {
113   ures_close(fTestData);
114   ures_close(fModuleBundle);
115   ures_close(fInfoRB);
116   uprv_free(tdpath);
117 }
118 
RBTestDataModule(const char * name,TestLog & log,UErrorCode & status)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 
getInfo(const DataMap * & info,UErrorCode &) const142 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 
createTestData(int32_t index,UErrorCode & status) const152 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 
createTestData(const char * name,UErrorCode & status) const180 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*
getTestBundle(const char * bundleName,UErrorCode & status)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