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