source: icXML/icXML-devel/tests/src/XSTSHarness/XSTSHarnessHandlers.cpp @ 2733

Last change on this file since 2733 was 2733, checked in by cameron, 6 years ago

More path fixes.

File size: 16.6 KB
Line 
1/*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements.  See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License.  You may obtain a copy of the License at
8 *
9 *      http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18/*
19 * $Id: XSTSHarnessHandlers.cpp 833057 2009-11-05 15:25:10Z borisk $
20 */
21
22// ---------------------------------------------------------------------------
23//  Includes
24// ---------------------------------------------------------------------------
25#include "XSTSHarnessHandlers.hpp"
26#include <xercesc/sax2/Attributes.hpp>
27#include <xercesc/sax/SAXParseException.hpp>
28#include <xercesc/sax/SAXException.hpp>
29#include <xercesc/validators/common/Grammar.hpp>
30#include <xercesc/util/OutOfMemoryException.hpp>
31#include <icxercesc/parsers/SAX2XMLReaderImpl.hpp>
32
33// ---------------------------------------------------------------------------
34//  XSTSHarnessHandlers: Constructors and Destructor
35// ---------------------------------------------------------------------------
36XSTSHarnessHandlers::XSTSHarnessHandlers(const XMLCh* baseURL) : BaseHarnessHandlers(baseURL)
37{
38    fParser = XMLReaderFactory::createXMLReader();
39    fParser->setFeature(XMLUni::fgSAX2CoreNameSpaces, true);
40    fParser->setFeature(XMLUni::fgSAX2CoreNameSpacePrefixes, true);
41    fParser->setFeature(XMLUni::fgSAX2CoreValidation, true);
42    fParser->setFeature(XMLUni::fgXercesSchema, true);
43    fParser->setFeature(XMLUni::fgXercesHandleMultipleImports, true);
44    fParser->setFeature(XMLUni::fgXercesSchemaFullChecking, true);
45    fParser->setFeature(XMLUni::fgXercesDynamic, false);
46    fParser->setFeature(XMLUni::fgXercesUseCachedGrammarInParse, true);
47    fParser->setFeature(XMLUni::fgXercesIdentityConstraintChecking, true);
48    fParser->setErrorHandler(&fErrorHandler);
49    ((SAX2XMLReaderImpl*)fParser)->setXMLEntityResolver(&fEntityResolver);
50}
51
52XSTSHarnessHandlers::~XSTSHarnessHandlers()
53{
54    delete fParser;
55}
56
57static XMLCh urlW3C[]={ chLatin_h, chLatin_t, chLatin_t, chLatin_p, chColon, chForwardSlash, chForwardSlash,
58                        chLatin_w, chLatin_w, chLatin_w, chPeriod, chLatin_w, chDigit_3, chPeriod, chLatin_o, chLatin_r, chLatin_g, chForwardSlash,
59                        chLatin_X, chLatin_M, chLatin_L, chForwardSlash,
60                        chLatin_S, chLatin_c, chLatin_h, chLatin_e, chLatin_m, chLatin_a, chNull };
61
62static XMLCh szTestSuite[]={ chLatin_T, chLatin_e, chLatin_s, chLatin_t, chLatin_S, chLatin_u, chLatin_i, chLatin_t, chLatin_e, chNull };
63static XMLCh szTestGroup[]={ chLatin_t, chLatin_e, chLatin_s, chLatin_t, chLatin_G, chLatin_r, chLatin_o, chLatin_u, chLatin_p, chNull };
64static XMLCh szSchemaTest[]={ chLatin_s, chLatin_c, chLatin_h, chLatin_e, chLatin_m, chLatin_a, chLatin_T, chLatin_e, chLatin_s, chLatin_t, chNull };
65static XMLCh szInstanceTest[]={ chLatin_i, chLatin_n, chLatin_s, chLatin_t, chLatin_a, chLatin_n, chLatin_c, chLatin_e, chLatin_T, chLatin_e, chLatin_s, chLatin_t, chNull };
66static XMLCh szDocumentationReference[]={ chLatin_d, chLatin_o, chLatin_c, chLatin_u, chLatin_m, chLatin_e, chLatin_n, chLatin_t, chLatin_a, chLatin_t, chLatin_i, chLatin_o, chLatin_n,
67                                          chLatin_R, chLatin_e, chLatin_f, chLatin_e, chLatin_r, chLatin_e, chLatin_n, chLatin_c, chLatin_e, chNull };
68static XMLCh szSchemaDocument[]={ chLatin_s, chLatin_c, chLatin_h, chLatin_e, chLatin_m, chLatin_a, chLatin_D, chLatin_o, chLatin_c, chLatin_u, chLatin_m, chLatin_e, chLatin_n, chLatin_t, chNull };
69static XMLCh szInstanceDocument[]={ chLatin_i, chLatin_n, chLatin_s, chLatin_t, chLatin_a, chLatin_n, chLatin_c, chLatin_e, chLatin_D, chLatin_o, chLatin_c, chLatin_u, chLatin_m, chLatin_e, chLatin_n, chLatin_t, chNull };
70static XMLCh szExpected[]={ chLatin_e, chLatin_x, chLatin_p, chLatin_e, chLatin_c, chLatin_t, chLatin_e, chLatin_d, chNull };
71static XMLCh szValidity[]={ chLatin_v, chLatin_a, chLatin_l, chLatin_i, chLatin_d, chLatin_i, chLatin_t, chLatin_y, chNull };
72
73static XMLCh szXLINK[]={ chLatin_h, chLatin_t, chLatin_t, chLatin_p, chColon, chForwardSlash, chForwardSlash,
74                         chLatin_w, chLatin_w, chLatin_w, chPeriod, chLatin_w, chDigit_3, chPeriod, chLatin_o, chLatin_r, chLatin_g, chForwardSlash,
75                         chDigit_1, chDigit_9, chDigit_9, chDigit_9, chForwardSlash,
76                         chLatin_x, chLatin_l, chLatin_i, chLatin_n, chLatin_k, chNull };
77static XMLCh szHREF[]={ chLatin_h, chLatin_r, chLatin_e, chLatin_f, chNull };
78static XMLCh szNAME[]={ chLatin_n, chLatin_a, chLatin_m, chLatin_e, chNull };
79static XMLCh szVALID[]={ chLatin_v, chLatin_a, chLatin_l, chLatin_i, chLatin_d, chNull };
80static XMLCh szINVALID[]={ chLatin_i, chLatin_n, chLatin_v, chLatin_a, chLatin_l, chLatin_i, chLatin_d, chNull };
81
82
83static XMLCh szTestSuite2[]={ chLatin_h, chLatin_t, chLatin_t, chLatin_p, chColon, chForwardSlash, chForwardSlash,
84                        chLatin_w, chLatin_w, chLatin_w, chPeriod, chLatin_w, chDigit_3, chPeriod, chLatin_o, chLatin_r, chLatin_g, chForwardSlash,
85                        chLatin_X, chLatin_M, chLatin_L, chForwardSlash,
86                        chDigit_2, chDigit_0, chDigit_0, chDigit_4, chForwardSlash,
87                        chLatin_x, chLatin_m, chLatin_l, chDash, chLatin_s, chLatin_c, chLatin_h, chLatin_e, chLatin_m, chLatin_a, chDash,
88                        chLatin_t, chLatin_e, chLatin_s, chLatin_t, chDash, chLatin_s, chLatin_u, chLatin_i, chLatin_t, chLatin_e, chForwardSlash, chNull };
89
90static XMLCh szTestSetRef[]={ chLatin_t, chLatin_e, chLatin_s, chLatin_t, chLatin_S, chLatin_e, chLatin_t, chLatin_R, chLatin_e, chLatin_f, chNull };
91
92// ---------------------------------------------------------------------------
93//  XSTSHarnessHandlers: Implementation of the SAX DocumentHandler interface
94// ---------------------------------------------------------------------------
95void XSTSHarnessHandlers::startElement(const XMLCh* const uri
96                                   , const XMLCh* const localname
97                                   , const XMLCh* const /* qname */
98                                   , const Attributes& attrs)
99{
100    if(XMLString::equals(uri, szTestSuite) || XMLString::equals(uri, szTestSuite2))
101    {
102        if(XMLString::equals(localname, szTestSetRef))
103        {
104            XMLURL testSet, backupBase(fBaseURL);
105            testSet.setURL(fBaseURL, attrs.getValue(szXLINK, szHREF));
106
107            fBaseURL=testSet;
108            SAX2XMLReader* parser = XMLReaderFactory::createXMLReader();
109            try
110            {
111                parser->setFeature(XMLUni::fgSAX2CoreNameSpaces, true);
112                parser->setContentHandler(this);
113                parser->setErrorHandler(this);
114                parser->parse(testSet.getURLText());
115            }
116            catch (...)
117            {
118            }
119            delete parser;
120            fBaseURL=backupBase;
121
122        }
123        else if(XMLString::equals(localname, szTestGroup))
124        {
125            fCurrentTest.fExpectedResult=unknown;
126            fCurrentTest.fSpecReference.setURL(urlW3C);
127            fCurrentTest.fTestName[0]=0;
128            fCurrentTest.fXMLName.setURL(dummy);
129            fCurrentTest.fXSDNames.removeAllElements();
130            StrX x(attrs.getValue(szNAME));
131            const char* groupName=x.localForm();
132            if(XMLString::equals(groupName,"addB194") ||
133               XMLString::equals(groupName,"particlesZ033_c") ||
134               XMLString::equals(groupName,"particlesZ033_d") ||
135               XMLString::equals(groupName,"particlesZ033_e") ||
136               XMLString::equals(groupName,"particlesZ033_f") ||
137               XMLString::equals(groupName,"particlesZ033_g") ||
138               XMLString::equals(groupName,"particlesZ035_a") ||
139               XMLString::equals(groupName,"particlesZ036_b1") ||
140               XMLString::equals(groupName,"particlesZ036_b2") ||
141               XMLString::equals(groupName,"particlesZ036_c") ||
142               XMLString::equals(groupName,"wildG032")
143               )
144                fCurrentTest.fSkipped=true;
145            else
146                fCurrentTest.fSkipped=false;
147            fParser->resetCachedGrammarPool();
148        }
149        else if(XMLString::equals(localname, szDocumentationReference))
150        {
151            const XMLCh* ref=attrs.getValue(szXLINK, szHREF);
152            if(ref && *ref)
153                fCurrentTest.fSpecReference.setURL(ref);
154            else
155                fCurrentTest.fSpecReference.setURL(dummy);
156        }
157        else if(XMLString::equals(localname, szSchemaTest) ||
158                XMLString::equals(localname, szInstanceTest))
159        {
160            XMLString::copyString(fCurrentTest.fTestName, attrs.getValue(szNAME));
161        }
162        else if(XMLString::equals(localname, szSchemaDocument))
163        {
164            fCurrentTest.fXSDNames.addElement(new XMLURL(fBaseURL, attrs.getValue(szXLINK, szHREF)));
165        }
166        else if(XMLString::equals(localname, szInstanceDocument))
167        {
168            fCurrentTest.fXMLName.setURL(fBaseURL, attrs.getValue(szXLINK, szHREF));
169        }
170        else if(XMLString::equals(localname, szExpected))
171        {
172            const XMLCh* validity=attrs.getValue(szValidity);
173            if(XMLString::equals(validity, szVALID))
174                fCurrentTest.fExpectedResult=valid;
175            else if(XMLString::equals(validity, szINVALID))
176                fCurrentTest.fExpectedResult=invalid;
177            else
178                fCurrentTest.fExpectedResult=unknown;
179        }
180    }
181}
182
183void XSTSHarnessHandlers::endElement(const XMLCh* const uri,
184                                         const XMLCh* const localname,
185                                         const XMLCh* const /*qname*/)
186{
187    if(XMLString::equals(uri, szTestSuite) || XMLString::equals(uri, szTestSuite2))
188    {
189        if(XMLString::equals(localname, szSchemaTest))
190        {
191            if(fCurrentTest.fSkipped)
192            {
193                fTests++;
194                fFailures++;
195                XERCES_STD_QUALIFIER cout << "Test " << StrX(fCurrentTest.fTestName) << " skipped" << XERCES_STD_QUALIFIER endl;
196                return;
197            }
198            bool success=true, fatalFailure=false;
199            try
200            {
201                fErrorHandler.resetErrors();
202                for(XMLSize_t i=0;i<fCurrentTest.fXSDNames.size();i++)
203                {
204                    Grammar* grammar=fParser->loadGrammar(fCurrentTest.fXSDNames.elementAt(i)->getURLText(), Grammar::SchemaGrammarType, true);
205                    success=(success && (grammar!=NULL));
206                }
207            }
208            catch (const OutOfMemoryException&)
209            {
210                fatalFailure=true;
211                XERCES_STD_QUALIFIER cout << "Test " << StrX(fCurrentTest.fTestName) << " ran out of memory" << XERCES_STD_QUALIFIER endl;
212                success=false;
213            }
214            catch(const XMLException& exc)
215            {
216                XERCES_STD_QUALIFIER cout << "Test " << StrX(fCurrentTest.fTestName) << " threw " << StrX(exc.getMessage()) << XERCES_STD_QUALIFIER endl;
217                success=false;
218            }
219            catch (...)
220            {
221                fatalFailure=true;
222                XERCES_STD_QUALIFIER cout << "Test " << StrX(fCurrentTest.fTestName) << " crashed" << XERCES_STD_QUALIFIER endl;
223                success=false;
224                exit(1);
225            }
226            fTests++;
227            if(fatalFailure)
228            {
229                // skip the rest of the group, as we had problems with the schema itself
230                fCurrentTest.fSkipped=true;
231                fFailures++;
232                for(XMLSize_t i=0;i<fCurrentTest.fXSDNames.size();i++)
233                    printFile(*fCurrentTest.fXSDNames.elementAt(i));
234            }
235            else
236            {
237                if(success && !fErrorHandler.getSawErrors())
238                {
239                    if(fCurrentTest.fExpectedResult!=valid)
240                    {
241                        // skip the rest of the group, as we had problems with the schema itself
242                        fCurrentTest.fSkipped=true;
243                        fFailures++;
244                        XERCES_STD_QUALIFIER cout << "Test " << StrX(fCurrentTest.fTestName) << " succeeded but was expected to fail" << XERCES_STD_QUALIFIER endl;
245                        for(XMLSize_t i=0;i<fCurrentTest.fXSDNames.size();i++)
246                            printFile(*fCurrentTest.fXSDNames.elementAt(i));
247                    }
248                }
249                else
250                {
251                    if(fCurrentTest.fExpectedResult!=invalid)
252                    {
253                        // skip the rest of the group, as we had problems with the schema itself
254                        fCurrentTest.fSkipped=true;
255                        fFailures++;
256                        XERCES_STD_QUALIFIER cout << "Test " << StrX(fCurrentTest.fTestName) << " failed but was expected to pass" << XERCES_STD_QUALIFIER endl;
257                        XERCES_STD_QUALIFIER cout << "Reported error: " << StrX(fErrorHandler.getErrorText()) << XERCES_STD_QUALIFIER endl;
258                        for(XMLSize_t i=0;i<fCurrentTest.fXSDNames.size();i++)
259                            printFile(*fCurrentTest.fXSDNames.elementAt(i));
260                    }
261                }
262            }
263        }
264        else if(XMLString::equals(localname, szInstanceTest))
265        {
266            if(fCurrentTest.fSkipped)
267            {
268                fTests++;
269                fFailures++;
270                XERCES_STD_QUALIFIER cout << "Test " << StrX(fCurrentTest.fTestName) << " skipped" << XERCES_STD_QUALIFIER endl;
271                return;
272            }
273            bool success=true, fatalFailure=false;
274            try
275            {
276                fErrorHandler.resetErrors();
277                fParser->parse(fCurrentTest.fXMLName.getURLText());
278            }
279            catch (const OutOfMemoryException&)
280            {
281                fatalFailure=true;
282                XERCES_STD_QUALIFIER cout << "Test " << StrX(fCurrentTest.fTestName) << " ran out of memory" << XERCES_STD_QUALIFIER endl;
283                success=false;
284            }
285            catch(const XMLException& exc)
286            {
287                XERCES_STD_QUALIFIER cout << "Test " << StrX(fCurrentTest.fTestName) << " threw " << StrX(exc.getMessage()) << XERCES_STD_QUALIFIER endl;
288                success=false;
289            }
290            catch (...)
291            {
292                fatalFailure=true;
293                XERCES_STD_QUALIFIER cout << "Test " << StrX(fCurrentTest.fTestName) << " crashed" << XERCES_STD_QUALIFIER endl;
294                success=false;
295                exit(1);
296            }
297            fTests++;
298            if(fatalFailure)
299            {
300                fFailures++;
301                for(XMLSize_t i=0;i<fCurrentTest.fXSDNames.size();i++)
302                    printFile(*fCurrentTest.fXSDNames.elementAt(i));
303                printFile(fCurrentTest.fXMLName);
304            }
305            else
306            {
307                if(success && !fErrorHandler.getSawErrors())
308                {
309                    if(fCurrentTest.fExpectedResult!=valid)
310                    {
311                        fFailures++;
312                        XERCES_STD_QUALIFIER cout << "Test " << StrX(fCurrentTest.fTestName) << " succeeded but was expected to fail" << XERCES_STD_QUALIFIER endl;
313                        for(XMLSize_t i=0;i<fCurrentTest.fXSDNames.size();i++)
314                            printFile(*fCurrentTest.fXSDNames.elementAt(i));
315                        printFile(fCurrentTest.fXMLName);
316                    }
317                }
318                else
319                {
320                    if(fCurrentTest.fExpectedResult!=invalid)
321                    {
322                        fFailures++;
323                        XERCES_STD_QUALIFIER cout << "Test " << StrX(fCurrentTest.fTestName) << " failed but was expected to pass" << XERCES_STD_QUALIFIER endl;
324                        XERCES_STD_QUALIFIER cout << "Reported error: " << StrX(fErrorHandler.getErrorText()) << XERCES_STD_QUALIFIER endl;
325                        for(XMLSize_t i=0;i<fCurrentTest.fXSDNames.size();i++)
326                            printFile(*fCurrentTest.fXSDNames.elementAt(i));
327                        printFile(fCurrentTest.fXMLName);
328                    }
329                }
330            }
331        }
332    }
333}
Note: See TracBrowser for help on using the repository browser.