1b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd
2b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   See the file COPYING for copying permission.
3b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
4b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   runtest.c : run the Expat test suite
5b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project*/
6b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
7b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef HAVE_EXPAT_CONFIG_H
8b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include <expat_config.h>
9b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif
10b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
11b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include <assert.h>
12b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include <stdlib.h>
13b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include <stdio.h>
14b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include <string.h>
1535e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes#include <stdint.h>
16b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
17b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include "expat.h"
18b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include "chardata.h"
19b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include "minicheck.h"
20b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
21d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes#if defined(__amigaos__) && defined(__USE_INLINE__)
22b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include <proto/expat.h>
23b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif
24b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
25b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef XML_LARGE_SIZE
26b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define XML_FMT_INT_MOD "ll"
27b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#else
28b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define XML_FMT_INT_MOD "l"
29b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif
30b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
31b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic XML_Parser parser;
32b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
33b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
34b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void
35b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectbasic_setup(void)
36b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
37b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    parser = XML_ParserCreate(NULL);
38b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (parser == NULL)
39b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        fail("Parser not created.");
40b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
41b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
42b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void
43b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectbasic_teardown(void)
44b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
45b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (parser != NULL)
46b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        XML_ParserFree(parser);
47b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
48b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
49b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* Generate a failure using the parser state to create an error message;
50b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   this should be used when the parser reports an error we weren't
51b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   expecting.
52b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project*/
53b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void
54b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project_xml_failure(XML_Parser parser, const char *file, int line)
55b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
56b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char buffer[1024];
57d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes    enum XML_Error err = XML_GetErrorCode(parser);
58b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    sprintf(buffer,
59d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes            "    %d: %s (line %" XML_FMT_INT_MOD "u, offset %"\
60d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes                XML_FMT_INT_MOD "u)\n    reported from %s, line %d\n",
61d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes            err,
62d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes            XML_ErrorString(err),
63b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            XML_GetCurrentLineNumber(parser),
64b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            XML_GetCurrentColumnNumber(parser),
65b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            file, line);
66b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    _fail_unless(0, file, line, buffer);
67b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
68b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
69b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define xml_failure(parser) _xml_failure((parser), __FILE__, __LINE__)
70b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
71b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void
72b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project_expect_failure(char *text, enum XML_Error errorCode, char *errorMessage,
73b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                char *file, int lineno)
74b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
75b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_OK)
76b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        /* Hackish use of _fail_unless() macro, but let's us report
77b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project           the right filename and line number. */
78b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        _fail_unless(0, file, lineno, errorMessage);
79b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (XML_GetErrorCode(parser) != errorCode)
80b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        _xml_failure(parser, file, lineno);
81b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
82b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
83b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define expect_failure(text, errorCode, errorMessage) \
84b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        _expect_failure((text), (errorCode), (errorMessage), \
85b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                        __FILE__, __LINE__)
86b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
87b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* Dummy handlers for when we need to set a handler to tickle a bug,
88b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   but it doesn't need to do anything.
89b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project*/
90b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
91b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void XMLCALL
92b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectdummy_start_doctype_handler(void           *userData,
93b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                            const XML_Char *doctypeName,
94b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                            const XML_Char *sysid,
95b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                            const XML_Char *pubid,
96b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                            int            has_internal_subset)
97b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{}
98b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
99b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void XMLCALL
100b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectdummy_end_doctype_handler(void *userData)
101b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{}
102b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
103b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void XMLCALL
104b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectdummy_entity_decl_handler(void           *userData,
105b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                          const XML_Char *entityName,
106b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                          int            is_parameter_entity,
107b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                          const XML_Char *value,
108b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                          int            value_length,
109b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                          const XML_Char *base,
110b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                          const XML_Char *systemId,
111b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                          const XML_Char *publicId,
112b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                          const XML_Char *notationName)
113b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{}
114b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
115b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void XMLCALL
116b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectdummy_notation_decl_handler(void *userData,
117b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                            const XML_Char *notationName,
118b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                            const XML_Char *base,
119b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                            const XML_Char *systemId,
120b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                            const XML_Char *publicId)
121b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{}
122b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
123b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void XMLCALL
124b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectdummy_element_decl_handler(void *userData,
125b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                           const XML_Char *name,
126b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                           XML_Content *model)
127b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{}
128b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
129b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void XMLCALL
130b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectdummy_attlist_decl_handler(void           *userData,
131b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                           const XML_Char *elname,
132b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                           const XML_Char *attname,
133b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                           const XML_Char *att_type,
134b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                           const XML_Char *dflt,
135b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                           int            isrequired)
136b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{}
137b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
138b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void XMLCALL
139b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectdummy_comment_handler(void *userData, const XML_Char *data)
140b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{}
141b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
142b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void XMLCALL
143b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectdummy_pi_handler(void *userData, const XML_Char *target, const XML_Char *data)
144b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{}
145b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
146b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void XMLCALL
147b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectdummy_start_element(void *userData,
148b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                    const XML_Char *name, const XML_Char **atts)
149b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{}
150b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
151b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
152b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/*
153b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project * Character & encoding tests.
154b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project */
155b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
156b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectSTART_TEST(test_nul_byte)
157b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
158b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char text[] = "<doc>\0</doc>";
159b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
160b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    /* test that a NUL byte (in US-ASCII data) is an error */
161b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (XML_Parse(parser, text, sizeof(text) - 1, XML_TRUE) == XML_STATUS_OK)
162b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        fail("Parser did not report error on NUL-byte.");
163b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (XML_GetErrorCode(parser) != XML_ERROR_INVALID_TOKEN)
164b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        xml_failure(parser);
165b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
166b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectEND_TEST
167b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
168b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
169b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectSTART_TEST(test_u0000_char)
170b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
171b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    /* test that a NUL byte (in US-ASCII data) is an error */
172b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    expect_failure("<doc>&#0;</doc>",
173b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                   XML_ERROR_BAD_CHAR_REF,
174b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                   "Parser did not report error on NUL-byte.");
175b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
176b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectEND_TEST
177b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
178b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectSTART_TEST(test_bom_utf8)
179b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
180b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    /* This test is really just making sure we don't core on a UTF-8 BOM. */
181b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char *text = "\357\273\277<e/>";
182b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
183b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR)
184b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        xml_failure(parser);
185b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
186b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectEND_TEST
187b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
188b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectSTART_TEST(test_bom_utf16_be)
189b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
190b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char text[] = "\376\377\0<\0e\0/\0>";
191b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
192b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (XML_Parse(parser, text, sizeof(text)-1, XML_TRUE) == XML_STATUS_ERROR)
193b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        xml_failure(parser);
194b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
195b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectEND_TEST
196b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
197b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectSTART_TEST(test_bom_utf16_le)
198b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
199b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char text[] = "\377\376<\0e\0/\0>\0";
200b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
201b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (XML_Parse(parser, text, sizeof(text)-1, XML_TRUE) == XML_STATUS_ERROR)
202b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        xml_failure(parser);
203b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
204b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectEND_TEST
205b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
206b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void XMLCALL
207b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectaccumulate_characters(void *userData, const XML_Char *s, int len)
208b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
209b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    CharData_AppendXMLChars((CharData *)userData, s, len);
210b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
211b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
212b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void XMLCALL
213b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectaccumulate_attribute(void *userData, const XML_Char *name,
214b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                     const XML_Char **atts)
215b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
216b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    CharData *storage = (CharData *)userData;
217b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (storage->count < 0 && atts != NULL && atts[0] != NULL) {
218b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        /* "accumulate" the value of the first attribute we see */
219b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        CharData_AppendXMLChars(storage, atts[1], -1);
220b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
221b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
222b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
223b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
224b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void
225b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project_run_character_check(XML_Char *text, XML_Char *expected,
226b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                     const char *file, int line)
227b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
228b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    CharData storage;
229b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
230b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    CharData_Init(&storage);
231b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_SetUserData(parser, &storage);
232b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_SetCharacterDataHandler(parser, accumulate_characters);
233b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR)
234b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        _xml_failure(parser, file, line);
235b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    CharData_CheckXMLChars(&storage, expected);
236b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
237b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
238b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define run_character_check(text, expected) \
239b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        _run_character_check(text, expected, __FILE__, __LINE__)
240b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
241b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void
242b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project_run_attribute_check(XML_Char *text, XML_Char *expected,
243b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                     const char *file, int line)
244b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
245b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    CharData storage;
246b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
247b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    CharData_Init(&storage);
248b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_SetUserData(parser, &storage);
249b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_SetStartElementHandler(parser, accumulate_attribute);
250b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR)
251b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        _xml_failure(parser, file, line);
252b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    CharData_CheckXMLChars(&storage, expected);
253b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
254b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
255b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#define run_attribute_check(text, expected) \
256b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        _run_attribute_check(text, expected, __FILE__, __LINE__)
257b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
258b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* Regression test for SF bug #491986. */
259b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectSTART_TEST(test_danish_latin1)
260b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
261b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char *text =
262b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<?xml version='1.0' encoding='iso-8859-1'?>\n"
263b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<e>J\xF8rgen \xE6\xF8\xE5\xC6\xD8\xC5</e>";
264b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    run_character_check(text,
265b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project             "J\xC3\xB8rgen \xC3\xA6\xC3\xB8\xC3\xA5\xC3\x86\xC3\x98\xC3\x85");
266b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
267b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectEND_TEST
268b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
269b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
270b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* Regression test for SF bug #514281. */
271b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectSTART_TEST(test_french_charref_hexidecimal)
272b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
273b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char *text =
274b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<?xml version='1.0' encoding='iso-8859-1'?>\n"
275b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<doc>&#xE9;&#xE8;&#xE0;&#xE7;&#xEA;&#xC8;</doc>";
276b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    run_character_check(text,
277b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                        "\xC3\xA9\xC3\xA8\xC3\xA0\xC3\xA7\xC3\xAA\xC3\x88");
278b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
279b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectEND_TEST
280b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
281b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectSTART_TEST(test_french_charref_decimal)
282b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
283b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char *text =
284b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<?xml version='1.0' encoding='iso-8859-1'?>\n"
285b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<doc>&#233;&#232;&#224;&#231;&#234;&#200;</doc>";
286b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    run_character_check(text,
287b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                        "\xC3\xA9\xC3\xA8\xC3\xA0\xC3\xA7\xC3\xAA\xC3\x88");
288b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
289b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectEND_TEST
290b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
291b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectSTART_TEST(test_french_latin1)
292b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
293b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char *text =
294b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<?xml version='1.0' encoding='iso-8859-1'?>\n"
295b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<doc>\xE9\xE8\xE0\xE7\xEa\xC8</doc>";
296b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    run_character_check(text,
297b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                        "\xC3\xA9\xC3\xA8\xC3\xA0\xC3\xA7\xC3\xAA\xC3\x88");
298b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
299b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectEND_TEST
300b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
301b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectSTART_TEST(test_french_utf8)
302b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
303b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char *text =
304b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<?xml version='1.0' encoding='utf-8'?>\n"
305b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<doc>\xC3\xA9</doc>";
306b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    run_character_check(text, "\xC3\xA9");
307b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
308b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectEND_TEST
309b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
310b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* Regression test for SF bug #600479.
311b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   XXX There should be a test that exercises all legal XML Unicode
312b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   characters as PCDATA and attribute value content, and XML Name
313b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   characters as part of element and attribute names.
314b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project*/
315b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectSTART_TEST(test_utf8_false_rejection)
316b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
317b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char *text = "<doc>\xEF\xBA\xBF</doc>";
318b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    run_character_check(text, "\xEF\xBA\xBF");
319b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
320b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectEND_TEST
321b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
322b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* Regression test for SF bug #477667.
323b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   This test assures that any 8-bit character followed by a 7-bit
324b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   character will not be mistakenly interpreted as a valid UTF-8
325b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   sequence.
326b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project*/
327b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectSTART_TEST(test_illegal_utf8)
328b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
329b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char text[100];
330b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    int i;
331b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
332b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    for (i = 128; i <= 255; ++i) {
333b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        sprintf(text, "<e>%ccd</e>", i);
334b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_OK) {
335b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            sprintf(text,
336b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                    "expected token error for '%c' (ordinal %d) in UTF-8 text",
337b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                    i, i);
338b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            fail(text);
339b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
340b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        else if (XML_GetErrorCode(parser) != XML_ERROR_INVALID_TOKEN)
341b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            xml_failure(parser);
342b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        /* Reset the parser since we use the same parser repeatedly. */
343b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        XML_ParserReset(parser, NULL);
344b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
345b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
346b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectEND_TEST
347b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
348b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectSTART_TEST(test_utf16)
349b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
350b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    /* <?xml version="1.0" encoding="UTF-16"?>
351b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project       <doc a='123'>some text</doc>
352b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    */
353b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char text[] =
354b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "\000<\000?\000x\000m\000\154\000 \000v\000e\000r\000s\000i\000o"
355b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "\000n\000=\000'\0001\000.\000\060\000'\000 \000e\000n\000c\000o"
356b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "\000d\000i\000n\000g\000=\000'\000U\000T\000F\000-\0001\000\066"
357b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "\000'\000?\000>\000\n"
358b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "\000<\000d\000o\000c\000 \000a\000=\000'\0001\0002\0003\000'"
359b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "\000>\000s\000o\000m\000e\000 \000t\000e\000x\000t\000<\000/"
360b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "\000d\000o\000c\000>";
361b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (XML_Parse(parser, text, sizeof(text)-1, XML_TRUE) == XML_STATUS_ERROR)
362b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        xml_failure(parser);
363b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
364b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectEND_TEST
365b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
366b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectSTART_TEST(test_utf16_le_epilog_newline)
367b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
368d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes    unsigned int first_chunk_bytes = 17;
369b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char text[] =
370b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "\xFF\xFE"                      /* BOM */
371b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<\000e\000/\000>\000"          /* document element */
372b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "\r\000\n\000\r\000\n\000";     /* epilog */
373b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
374b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (first_chunk_bytes >= sizeof(text) - 1)
375b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        fail("bad value of first_chunk_bytes");
376b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (  XML_Parse(parser, text, first_chunk_bytes, XML_FALSE)
377b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          == XML_STATUS_ERROR)
378b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        xml_failure(parser);
379b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    else {
380b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        enum XML_Status rc;
381b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        rc = XML_Parse(parser, text + first_chunk_bytes,
382b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                       sizeof(text) - first_chunk_bytes - 1, XML_TRUE);
383b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (rc == XML_STATUS_ERROR)
384b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            xml_failure(parser);
385b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
386b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
387b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectEND_TEST
388b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
389b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* Regression test for SF bug #481609, #774028. */
390b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectSTART_TEST(test_latin1_umlauts)
391b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
392b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char *text =
393b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<?xml version='1.0' encoding='iso-8859-1'?>\n"
394b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<e a='\xE4 \xF6 \xFC &#228; &#246; &#252; &#x00E4; &#x0F6; &#xFC; >'\n"
395b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "  >\xE4 \xF6 \xFC &#228; &#246; &#252; &#x00E4; &#x0F6; &#xFC; ></e>";
396b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char *utf8 =
397b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "\xC3\xA4 \xC3\xB6 \xC3\xBC "
398b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "\xC3\xA4 \xC3\xB6 \xC3\xBC "
399b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "\xC3\xA4 \xC3\xB6 \xC3\xBC >";
400b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    run_character_check(text, utf8);
401b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_ParserReset(parser, NULL);
402b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    run_attribute_check(text, utf8);
403b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
404b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectEND_TEST
405b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
406b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* Regression test #1 for SF bug #653180. */
407b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectSTART_TEST(test_line_number_after_parse)
408b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
409b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char *text =
410b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<tag>\n"
411b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "\n"
412b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "\n</tag>";
413b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_Size lineno;
414b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
415b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (XML_Parse(parser, text, strlen(text), XML_FALSE) == XML_STATUS_ERROR)
416b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        xml_failure(parser);
417b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    lineno = XML_GetCurrentLineNumber(parser);
418b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (lineno != 4) {
419b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        char buffer[100];
420b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        sprintf(buffer,
421b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            "expected 4 lines, saw %" XML_FMT_INT_MOD "u", lineno);
422b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        fail(buffer);
423b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
424b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
425b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectEND_TEST
426b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
427b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* Regression test #2 for SF bug #653180. */
428b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectSTART_TEST(test_column_number_after_parse)
429b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
430b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char *text = "<tag></tag>";
431b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_Size colno;
432b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
433b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (XML_Parse(parser, text, strlen(text), XML_FALSE) == XML_STATUS_ERROR)
434b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        xml_failure(parser);
435b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    colno = XML_GetCurrentColumnNumber(parser);
436b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (colno != 11) {
437b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        char buffer[100];
438b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        sprintf(buffer,
439b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            "expected 11 columns, saw %" XML_FMT_INT_MOD "u", colno);
440b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        fail(buffer);
441b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
442b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
443b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectEND_TEST
444b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
445b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void XMLCALL
446b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstart_element_event_handler2(void *userData, const XML_Char *name,
447b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project			     const XML_Char **attr)
448b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
449b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    CharData *storage = (CharData *) userData;
450b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char buffer[100];
451b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
452b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    sprintf(buffer,
453b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<%s> at col:%" XML_FMT_INT_MOD "u line:%"\
454b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            XML_FMT_INT_MOD "u\n", name,
455b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project	    XML_GetCurrentColumnNumber(parser),
456b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project	    XML_GetCurrentLineNumber(parser));
457b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    CharData_AppendString(storage, buffer);
458b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
459b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
460b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void XMLCALL
461b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectend_element_event_handler2(void *userData, const XML_Char *name)
462b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
463b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    CharData *storage = (CharData *) userData;
464b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char buffer[100];
465b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
466b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    sprintf(buffer,
467b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "</%s> at col:%" XML_FMT_INT_MOD "u line:%"\
468b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            XML_FMT_INT_MOD "u\n", name,
469b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project	    XML_GetCurrentColumnNumber(parser),
470b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project	    XML_GetCurrentLineNumber(parser));
471b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    CharData_AppendString(storage, buffer);
472b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
473b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
474b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* Regression test #3 for SF bug #653180. */
475b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectSTART_TEST(test_line_and_column_numbers_inside_handlers)
476b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
477b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char *text =
478b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<a>\n"        /* Unix end-of-line */
479b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "  <b>\r\n"    /* Windows end-of-line */
480b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "    <c/>\r"   /* Mac OS end-of-line */
481b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "  </b>\n"
482b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "  <d>\n"
483b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "    <f/>\n"
484b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "  </d>\n"
485b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "</a>";
486b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char *expected =
487b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<a> at col:0 line:1\n"
488b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<b> at col:2 line:2\n"
489b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<c> at col:4 line:3\n"
490b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "</c> at col:8 line:3\n"
491b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "</b> at col:2 line:4\n"
492b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<d> at col:2 line:5\n"
493b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<f> at col:4 line:6\n"
494b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "</f> at col:8 line:6\n"
495b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "</d> at col:2 line:7\n"
496b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "</a> at col:0 line:8\n";
497b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    CharData storage;
498b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
499b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    CharData_Init(&storage);
500b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_SetUserData(parser, &storage);
501b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_SetStartElementHandler(parser, start_element_event_handler2);
502b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_SetEndElementHandler(parser, end_element_event_handler2);
503b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR)
504b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        xml_failure(parser);
505b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
506b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    CharData_CheckString(&storage, expected);
507b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
508b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectEND_TEST
509b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
510b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* Regression test #4 for SF bug #653180. */
511b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectSTART_TEST(test_line_number_after_error)
512b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
513b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char *text =
514b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<a>\n"
515b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "  <b>\n"
516b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "  </a>";  /* missing </b> */
517b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_Size lineno;
518b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (XML_Parse(parser, text, strlen(text), XML_FALSE) != XML_STATUS_ERROR)
519b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        fail("Expected a parse error");
520b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
521b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    lineno = XML_GetCurrentLineNumber(parser);
522b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (lineno != 3) {
523b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        char buffer[100];
524b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        sprintf(buffer, "expected 3 lines, saw %" XML_FMT_INT_MOD "u", lineno);
525b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        fail(buffer);
526b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
527b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
528b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectEND_TEST
529b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
530b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* Regression test #5 for SF bug #653180. */
531b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectSTART_TEST(test_column_number_after_error)
532b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
533b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char *text =
534b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<a>\n"
535b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "  <b>\n"
536b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "  </a>";  /* missing </b> */
537b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_Size colno;
538b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (XML_Parse(parser, text, strlen(text), XML_FALSE) != XML_STATUS_ERROR)
539b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        fail("Expected a parse error");
540b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
541b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    colno = XML_GetCurrentColumnNumber(parser);
542b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (colno != 4) {
543b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        char buffer[100];
544b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        sprintf(buffer,
545b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            "expected 4 columns, saw %" XML_FMT_INT_MOD "u", colno);
546b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        fail(buffer);
547b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
548b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
549b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectEND_TEST
550b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
551b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* Regression test for SF bug #478332. */
552b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectSTART_TEST(test_really_long_lines)
553b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
554b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    /* This parses an input line longer than INIT_DATA_BUF_SIZE
555b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project       characters long (defined to be 1024 in xmlparse.c).  We take a
556b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project       really cheesy approach to building the input buffer, because
557b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project       this avoids writing bugs in buffer-filling code.
558b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    */
559b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char *text =
560b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<e>"
561b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        /* 64 chars */
562b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
563b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        /* until we have at least 1024 characters on the line: */
564b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
565b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
566b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
567b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
568b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
569b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
570b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
571b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
572b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
573b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
574b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
575b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
576b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
577b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
578b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
579b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-+"
580b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "</e>";
581b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR)
582b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        xml_failure(parser);
583b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
584b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectEND_TEST
585b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
586b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
587b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/*
588b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project * Element event tests.
589b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project */
590b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
591b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void XMLCALL
592b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectend_element_event_handler(void *userData, const XML_Char *name)
593b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
594b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    CharData *storage = (CharData *) userData;
595b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    CharData_AppendString(storage, "/");
596b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    CharData_AppendXMLChars(storage, name, -1);
597b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
598b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
599b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectSTART_TEST(test_end_element_events)
600b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
601b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char *text = "<a><b><c/></b><d><f/></d></a>";
602b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char *expected = "/c/b/f/d/a";
603b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    CharData storage;
604b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
605b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    CharData_Init(&storage);
606b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_SetUserData(parser, &storage);
607b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_SetEndElementHandler(parser, end_element_event_handler);
608b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR)
609b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        xml_failure(parser);
610b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    CharData_CheckString(&storage, expected);
611b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
612b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectEND_TEST
613b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
614b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
615b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/*
616b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project * Attribute tests.
617b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project */
618b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
619b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* Helpers used by the following test; this checks any "attr" and "refs"
620b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   attributes to make sure whitespace has been normalized.
621b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
622b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   Return true if whitespace has been normalized in a string, using
623b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   the rules for attribute value normalization.  The 'is_cdata' flag
624b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   is needed since CDATA attributes don't need to have multiple
625b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   whitespace characters collapsed to a single space, while other
626b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   attribute data types do.  (Section 3.3.3 of the recommendation.)
627b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project*/
628b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic int
629b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectis_whitespace_normalized(const XML_Char *s, int is_cdata)
630b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
631b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    int blanks = 0;
632b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    int at_start = 1;
633b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    while (*s) {
634b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (*s == ' ')
635b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            ++blanks;
636b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        else if (*s == '\t' || *s == '\n' || *s == '\r')
637b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            return 0;
638b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        else {
639b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            if (at_start) {
640b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                at_start = 0;
641b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                if (blanks && !is_cdata)
642b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                    /* illegal leading blanks */
643b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                    return 0;
644b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            }
645b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            else if (blanks > 1 && !is_cdata)
646b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                return 0;
647b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            blanks = 0;
648b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
649b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        ++s;
650b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
651b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (blanks && !is_cdata)
652b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return 0;
653b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return 1;
654b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
655b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
656b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* Check the attribute whitespace checker: */
657b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void
658b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projecttesthelper_is_whitespace_normalized(void)
659b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
660b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    assert(is_whitespace_normalized("abc", 0));
661b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    assert(is_whitespace_normalized("abc", 1));
662b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    assert(is_whitespace_normalized("abc def ghi", 0));
663b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    assert(is_whitespace_normalized("abc def ghi", 1));
664b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    assert(!is_whitespace_normalized(" abc def ghi", 0));
665b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    assert(is_whitespace_normalized(" abc def ghi", 1));
666b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    assert(!is_whitespace_normalized("abc  def ghi", 0));
667b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    assert(is_whitespace_normalized("abc  def ghi", 1));
668b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    assert(!is_whitespace_normalized("abc def ghi ", 0));
669b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    assert(is_whitespace_normalized("abc def ghi ", 1));
670b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    assert(!is_whitespace_normalized(" ", 0));
671b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    assert(is_whitespace_normalized(" ", 1));
672b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    assert(!is_whitespace_normalized("\t", 0));
673b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    assert(!is_whitespace_normalized("\t", 1));
674b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    assert(!is_whitespace_normalized("\n", 0));
675b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    assert(!is_whitespace_normalized("\n", 1));
676b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    assert(!is_whitespace_normalized("\r", 0));
677b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    assert(!is_whitespace_normalized("\r", 1));
678b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    assert(!is_whitespace_normalized("abc\t def", 1));
679b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
680b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
681b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void XMLCALL
682b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectcheck_attr_contains_normalized_whitespace(void *userData,
683b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                          const XML_Char *name,
684b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                          const XML_Char **atts)
685b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
686b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    int i;
687b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    for (i = 0; atts[i] != NULL; i += 2) {
688b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        const XML_Char *attrname = atts[i];
689b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        const XML_Char *value = atts[i + 1];
690b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (strcmp("attr", attrname) == 0
691b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            || strcmp("ents", attrname) == 0
692b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            || strcmp("refs", attrname) == 0) {
693b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            if (!is_whitespace_normalized(value, 0)) {
694b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                char buffer[256];
695b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                sprintf(buffer, "attribute value not normalized: %s='%s'",
696b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                        attrname, value);
697b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                fail(buffer);
698b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            }
699b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
700b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
701b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
702b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
703b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectSTART_TEST(test_attr_whitespace_normalization)
704b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
705b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char *text =
706b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<!DOCTYPE doc [\n"
707b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "  <!ATTLIST doc\n"
708b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "            attr NMTOKENS #REQUIRED\n"
709b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "            ents ENTITIES #REQUIRED\n"
710b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "            refs IDREFS   #REQUIRED>\n"
711b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "]>\n"
712b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<doc attr='    a  b c\t\td\te\t' refs=' id-1   \t  id-2\t\t'  \n"
713b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "     ents=' ent-1   \t\r\n"
714b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "            ent-2  ' >\n"
715b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "  <e id='id-1'/>\n"
716b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "  <e id='id-2'/>\n"
717b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "</doc>";
718b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
719b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_SetStartElementHandler(parser,
720b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                               check_attr_contains_normalized_whitespace);
721b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR)
722b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        xml_failure(parser);
723b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
724b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectEND_TEST
725b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
726b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
727b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/*
728b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project * XML declaration tests.
729b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project */
730b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
731b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectSTART_TEST(test_xmldecl_misplaced)
732b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
733b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    expect_failure("\n"
734b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                   "<?xml version='1.0'?>\n"
735b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                   "<a/>",
736b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                   XML_ERROR_MISPLACED_XML_PI,
737b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                   "failed to report misplaced XML declaration");
738b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
739b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectEND_TEST
740b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
741b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* Regression test for SF bug #584832. */
742b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic int XMLCALL
743b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectUnknownEncodingHandler(void *data,const XML_Char *encoding,XML_Encoding *info)
744b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
745b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (strcmp(encoding,"unsupported-encoding") == 0) {
746b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        int i;
747b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        for (i = 0; i < 256; ++i)
748b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            info->map[i] = i;
749b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        info->data = NULL;
750b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        info->convert = NULL;
751b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        info->release = NULL;
752b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_STATUS_OK;
753b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
754b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return XML_STATUS_ERROR;
755b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
756b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
757b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectSTART_TEST(test_unknown_encoding_internal_entity)
758b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
759b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char *text =
760b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<?xml version='1.0' encoding='unsupported-encoding'?>\n"
761b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<!DOCTYPE test [<!ENTITY foo 'bar'>]>\n"
762b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<test a='&foo;'/>";
763b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
764b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_SetUnknownEncodingHandler(parser, UnknownEncodingHandler, NULL);
765b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR)
766b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        xml_failure(parser);
767b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
768b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectEND_TEST
769b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
770b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* Regression test for SF bug #620106. */
771b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic int XMLCALL
772b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectexternal_entity_loader_set_encoding(XML_Parser parser,
773b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                    const XML_Char *context,
774b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                    const XML_Char *base,
775b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                    const XML_Char *systemId,
776b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                    const XML_Char *publicId)
777b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
778b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    /* This text says it's an unsupported encoding, but it's really
779b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project       UTF-8, which we tell Expat using XML_SetEncoding().
780b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    */
781b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char *text =
782b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<?xml encoding='iso-8859-3'?>"
783b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "\xC3\xA9";
784b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_Parser extparser;
785b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
786b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    extparser = XML_ExternalEntityParserCreate(parser, context, NULL);
787b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (extparser == NULL)
788b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        fail("Could not create external entity parser.");
789b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (!XML_SetEncoding(extparser, "utf-8"))
790b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        fail("XML_SetEncoding() ignored for external entity");
791b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (  XML_Parse(extparser, text, strlen(text), XML_TRUE)
792b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          == XML_STATUS_ERROR) {
793b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        xml_failure(parser);
794b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return 0;
795b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
796b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return 1;
797b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
798b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
799b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectSTART_TEST(test_ext_entity_set_encoding)
800b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
801b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char *text =
802b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<!DOCTYPE doc [\n"
803b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "  <!ENTITY en SYSTEM 'http://xml.libexpat.org/dummy.ent'>\n"
804b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "]>\n"
805b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<doc>&en;</doc>";
806b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
807b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_SetExternalEntityRefHandler(parser,
808b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                    external_entity_loader_set_encoding);
809b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    run_character_check(text, "\xC3\xA9");
810b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
811b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectEND_TEST
812b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
813b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* Test that no error is reported for unknown entities if we don't
814b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   read an external subset.  This was fixed in Expat 1.95.5.
815b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project*/
816b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectSTART_TEST(test_wfc_undeclared_entity_unread_external_subset) {
817b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char *text =
818b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<!DOCTYPE doc SYSTEM 'foo'>\n"
819b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<doc>&entity;</doc>";
820b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
821b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR)
822b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        xml_failure(parser);
823b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
824b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectEND_TEST
825b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
826b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* Test that an error is reported for unknown entities if we don't
827b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   have an external subset.
828b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project*/
829b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectSTART_TEST(test_wfc_undeclared_entity_no_external_subset) {
830b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    expect_failure("<doc>&entity;</doc>",
831b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                   XML_ERROR_UNDEFINED_ENTITY,
832b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                   "Parser did not report undefined entity w/out a DTD.");
833b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
834b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectEND_TEST
835b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
836b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* Test that an error is reported for unknown entities if we don't
837b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   read an external subset, but have been declared standalone.
838b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project*/
839b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectSTART_TEST(test_wfc_undeclared_entity_standalone) {
840b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char *text =
841b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<?xml version='1.0' encoding='us-ascii' standalone='yes'?>\n"
842b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<!DOCTYPE doc SYSTEM 'foo'>\n"
843b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<doc>&entity;</doc>";
844b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
845b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    expect_failure(text,
846b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                   XML_ERROR_UNDEFINED_ENTITY,
847b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                   "Parser did not report undefined entity (standalone).");
848b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
849b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectEND_TEST
850b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
851b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic int XMLCALL
852b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectexternal_entity_loader(XML_Parser parser,
853b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                       const XML_Char *context,
854b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                       const XML_Char *base,
855b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                       const XML_Char *systemId,
856b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                       const XML_Char *publicId)
857b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
858b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char *text = (char *)XML_GetUserData(parser);
859b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_Parser extparser;
860b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
861b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    extparser = XML_ExternalEntityParserCreate(parser, context, NULL);
862b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (extparser == NULL)
863b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        fail("Could not create external entity parser.");
864b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (  XML_Parse(extparser, text, strlen(text), XML_TRUE)
865b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project          == XML_STATUS_ERROR) {
866b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        xml_failure(parser);
867b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return XML_STATUS_ERROR;
868b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
869b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return XML_STATUS_OK;
870b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
871b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
872b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* Test that an error is reported for unknown entities if we have read
873b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   an external subset, and standalone is true.
874b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project*/
875b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectSTART_TEST(test_wfc_undeclared_entity_with_external_subset_standalone) {
876b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char *text =
877b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<?xml version='1.0' encoding='us-ascii' standalone='yes'?>\n"
878b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<!DOCTYPE doc SYSTEM 'foo'>\n"
879b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<doc>&entity;</doc>";
880b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char *foo_text =
881b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<!ELEMENT doc (#PCDATA)*>";
882b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
883b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_SetParamEntityParsing(parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
884b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_SetUserData(parser, foo_text);
885b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_SetExternalEntityRefHandler(parser, external_entity_loader);
886b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    expect_failure(text,
887b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                   XML_ERROR_UNDEFINED_ENTITY,
888b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                   "Parser did not report undefined entity (external DTD).");
889b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
890b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectEND_TEST
891b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
892b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* Test that no error is reported for unknown entities if we have read
893b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   an external subset, and standalone is false.
894b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project*/
895b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectSTART_TEST(test_wfc_undeclared_entity_with_external_subset) {
896b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char *text =
897b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<?xml version='1.0' encoding='us-ascii'?>\n"
898b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<!DOCTYPE doc SYSTEM 'foo'>\n"
899b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<doc>&entity;</doc>";
900b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char *foo_text =
901b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<!ELEMENT doc (#PCDATA)*>";
902b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
903b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_SetParamEntityParsing(parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
904b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_SetUserData(parser, foo_text);
905b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_SetExternalEntityRefHandler(parser, external_entity_loader);
906b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR)
907b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        xml_failure(parser);
908b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
909b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectEND_TEST
910b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
911b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectSTART_TEST(test_wfc_no_recursive_entity_refs)
912b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
913b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char *text =
914b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<!DOCTYPE doc [\n"
915b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "  <!ENTITY entity '&#38;entity;'>\n"
916b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "]>\n"
917b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<doc>&entity;</doc>";
918b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
919b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    expect_failure(text,
920b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                   XML_ERROR_RECURSIVE_ENTITY_REF,
921b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                   "Parser did not report recursive entity reference.");
922b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
923b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectEND_TEST
924b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
925b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* Regression test for SF bug #483514. */
926b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectSTART_TEST(test_dtd_default_handling)
927b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
928b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char *text =
929b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<!DOCTYPE doc [\n"
930b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<!ENTITY e SYSTEM 'http://xml.libexpat.org/e'>\n"
931b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<!NOTATION n SYSTEM 'http://xml.libexpat.org/n'>\n"
932b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<!ELEMENT doc EMPTY>\n"
933b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<!ATTLIST doc a CDATA #IMPLIED>\n"
934b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<?pi in dtd?>\n"
935b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<!--comment in dtd-->\n"
936b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "]><doc/>";
937b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
938b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_SetDefaultHandler(parser, accumulate_characters);
939b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_SetDoctypeDeclHandler(parser,
940b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                              dummy_start_doctype_handler,
941b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                              dummy_end_doctype_handler);
942b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_SetEntityDeclHandler(parser, dummy_entity_decl_handler);
943b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_SetNotationDeclHandler(parser, dummy_notation_decl_handler);
944b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_SetElementDeclHandler(parser, dummy_element_decl_handler);
945b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_SetAttlistDeclHandler(parser, dummy_attlist_decl_handler);
946b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_SetProcessingInstructionHandler(parser, dummy_pi_handler);
947b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_SetCommentHandler(parser, dummy_comment_handler);
948b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    run_character_check(text, "\n\n\n\n\n\n\n<doc/>");
949b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
950b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectEND_TEST
951b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
952b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* See related SF bug #673791.
953b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   When namespace processing is enabled, setting the namespace URI for
954b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   a prefix is not allowed; this test ensures that it *is* allowed
955b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   when namespace processing is not enabled.
956b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   (See Namespaces in XML, section 2.)
957b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project*/
958b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectSTART_TEST(test_empty_ns_without_namespaces)
959b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
960b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char *text =
961b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<doc xmlns:prefix='http://www.example.com/'>\n"
962b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "  <e xmlns:prefix=''/>\n"
963b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "</doc>";
964b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
965b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR)
966b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        xml_failure(parser);
967b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
968b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectEND_TEST
969b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
970b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* Regression test for SF bug #824420.
971b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   Checks that an xmlns:prefix attribute set in an attribute's default
972b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   value isn't misinterpreted.
973b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project*/
974b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectSTART_TEST(test_ns_in_attribute_default_without_namespaces)
975b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
976b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char *text =
977b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<!DOCTYPE e:element [\n"
978b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "  <!ATTLIST e:element\n"
979b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "    xmlns:e CDATA 'http://example.com/'>\n"
980b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "      ]>\n"
981b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<e:element/>";
982b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
983b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR)
984b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        xml_failure(parser);
985b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
986b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectEND_TEST
987b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
988d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughesstatic char *long_character_data_text =
989d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes    "<?xml version='1.0' encoding='iso-8859-1'?><s>"
990d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes    "012345678901234567890123456789012345678901234567890123456789"
991d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes    "012345678901234567890123456789012345678901234567890123456789"
992d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes    "012345678901234567890123456789012345678901234567890123456789"
993d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes    "012345678901234567890123456789012345678901234567890123456789"
994d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes    "012345678901234567890123456789012345678901234567890123456789"
995d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes    "012345678901234567890123456789012345678901234567890123456789"
996d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes    "012345678901234567890123456789012345678901234567890123456789"
997d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes    "012345678901234567890123456789012345678901234567890123456789"
998d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes    "012345678901234567890123456789012345678901234567890123456789"
999d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes    "012345678901234567890123456789012345678901234567890123456789"
1000d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes    "012345678901234567890123456789012345678901234567890123456789"
1001d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes    "012345678901234567890123456789012345678901234567890123456789"
1002d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes    "012345678901234567890123456789012345678901234567890123456789"
1003d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes    "012345678901234567890123456789012345678901234567890123456789"
1004d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes    "012345678901234567890123456789012345678901234567890123456789"
1005d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes    "012345678901234567890123456789012345678901234567890123456789"
1006d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes    "012345678901234567890123456789012345678901234567890123456789"
1007d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes    "012345678901234567890123456789012345678901234567890123456789"
1008d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes    "012345678901234567890123456789012345678901234567890123456789"
1009d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes    "012345678901234567890123456789012345678901234567890123456789"
1010d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes    "</s>";
1011d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes
1012d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughesstatic XML_Bool resumable = XML_FALSE;
1013d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes
1014d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughesstatic void
1015d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughesclearing_aborting_character_handler(void *userData,
1016d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes                                    const XML_Char *s, int len)
1017d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes{
1018d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes    XML_StopParser(parser, resumable);
1019d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes    XML_SetCharacterDataHandler(parser, NULL);
1020d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes}
1021d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes
1022d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes/* Regression test for SF bug #1515266: missing check of stopped
1023d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes   parser in doContext() 'for' loop. */
1024d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott HughesSTART_TEST(test_stop_parser_between_char_data_calls)
1025d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes{
1026d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes    /* The sample data must be big enough that there are two calls to
1027d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes       the character data handler from within the inner "for" loop of
1028d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes       the XML_TOK_DATA_CHARS case in doContent(), and the character
1029d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes       handler must stop the parser and clear the character data
1030d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes       handler.
1031d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes    */
1032d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes    char *text = long_character_data_text;
1033d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes
1034d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes    XML_SetCharacterDataHandler(parser, clearing_aborting_character_handler);
1035d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes    resumable = XML_FALSE;
1036d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes    if (XML_Parse(parser, text, strlen(text), XML_TRUE) != XML_STATUS_ERROR)
1037d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes        xml_failure(parser);
1038d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes    if (XML_GetErrorCode(parser) != XML_ERROR_ABORTED)
1039d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes        xml_failure(parser);
1040d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes}
1041d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott HughesEND_TEST
1042d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes
1043d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes/* Regression test for SF bug #1515266: missing check of stopped
1044d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes   parser in doContext() 'for' loop. */
1045d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott HughesSTART_TEST(test_suspend_parser_between_char_data_calls)
1046d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes{
1047d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes    /* The sample data must be big enough that there are two calls to
1048d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes       the character data handler from within the inner "for" loop of
1049d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes       the XML_TOK_DATA_CHARS case in doContent(), and the character
1050d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes       handler must stop the parser and clear the character data
1051d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes       handler.
1052d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes    */
1053d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes    char *text = long_character_data_text;
1054d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes
1055d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes    XML_SetCharacterDataHandler(parser, clearing_aborting_character_handler);
1056d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes    resumable = XML_TRUE;
1057d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes    if (XML_Parse(parser, text, strlen(text), XML_TRUE) != XML_STATUS_SUSPENDED)
1058d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes        xml_failure(parser);
1059d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes    if (XML_GetErrorCode(parser) != XML_ERROR_NONE)
1060d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes        xml_failure(parser);
1061d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes}
1062d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott HughesEND_TEST
1063d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes
1064b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1065b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/*
1066b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project * Namespaces tests.
1067b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project */
1068b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1069b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void
1070b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectnamespace_setup(void)
1071b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1072b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    parser = XML_ParserCreateNS(NULL, ' ');
1073b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (parser == NULL)
1074b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        fail("Parser not created.");
1075b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1076b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1077b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void
1078b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectnamespace_teardown(void)
1079b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1080b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    basic_teardown();
1081b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1082b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1083b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* Check that an element name and attribute name match the expected values.
1084b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   The expected values are passed as an array reference of string pointers
1085b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   provided as the userData argument; the first is the expected
1086b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   element name, and the second is the expected attribute name.
1087b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project*/
1088b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void XMLCALL
1089b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projecttriplet_start_checker(void *userData, const XML_Char *name,
1090b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                      const XML_Char **atts)
1091b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1092b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char **elemstr = (char **)userData;
1093b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char buffer[1024];
1094b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (strcmp(elemstr[0], name) != 0) {
1095b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        sprintf(buffer, "unexpected start string: '%s'", name);
1096b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        fail(buffer);
1097b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
1098b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (strcmp(elemstr[1], atts[0]) != 0) {
1099b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        sprintf(buffer, "unexpected attribute string: '%s'", atts[0]);
1100b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        fail(buffer);
1101b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
1102b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1103b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1104b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* Check that the element name passed to the end-element handler matches
1105b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   the expected value.  The expected value is passed as the first element
1106b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   in an array of strings passed as the userData argument.
1107b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project*/
1108b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void XMLCALL
1109b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projecttriplet_end_checker(void *userData, const XML_Char *name)
1110b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1111b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char **elemstr = (char **)userData;
1112b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (strcmp(elemstr[0], name) != 0) {
1113b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        char buffer[1024];
1114b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        sprintf(buffer, "unexpected end string: '%s'", name);
1115b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        fail(buffer);
1116b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
1117b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1118b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1119b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectSTART_TEST(test_return_ns_triplet)
1120b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1121b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char *text =
1122b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<foo:e xmlns:foo='http://expat.sf.net/' bar:a='12'\n"
1123b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "       xmlns:bar='http://expat.sf.net/'></foo:e>";
1124b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char *elemstr[] = {
1125b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "http://expat.sf.net/ e foo",
1126b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "http://expat.sf.net/ a bar"
1127b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    };
1128b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_SetReturnNSTriplet(parser, XML_TRUE);
1129b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_SetUserData(parser, elemstr);
1130b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_SetElementHandler(parser, triplet_start_checker, triplet_end_checker);
1131b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR)
1132b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        xml_failure(parser);
1133b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1134b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectEND_TEST
1135b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1136b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void XMLCALL
1137b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectoverwrite_start_checker(void *userData, const XML_Char *name,
1138b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                        const XML_Char **atts)
1139b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1140b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    CharData *storage = (CharData *) userData;
1141b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    CharData_AppendString(storage, "start ");
1142b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    CharData_AppendXMLChars(storage, name, -1);
1143b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    while (*atts != NULL) {
1144b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        CharData_AppendString(storage, "\nattribute ");
1145b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        CharData_AppendXMLChars(storage, *atts, -1);
1146b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        atts += 2;
1147b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
1148b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    CharData_AppendString(storage, "\n");
1149b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1150b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1151b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void XMLCALL
1152b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectoverwrite_end_checker(void *userData, const XML_Char *name)
1153b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1154b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    CharData *storage = (CharData *) userData;
1155b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    CharData_AppendString(storage, "end ");
1156b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    CharData_AppendXMLChars(storage, name, -1);
1157b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    CharData_AppendString(storage, "\n");
1158b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1159b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1160b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void
1161b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectrun_ns_tagname_overwrite_test(char *text, char *result)
1162b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1163b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    CharData storage;
1164b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    CharData_Init(&storage);
1165b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_SetUserData(parser, &storage);
1166b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_SetElementHandler(parser,
1167b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                          overwrite_start_checker, overwrite_end_checker);
1168b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR)
1169b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        xml_failure(parser);
1170b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    CharData_CheckString(&storage, result);
1171b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1172b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1173b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* Regression test for SF bug #566334. */
1174b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectSTART_TEST(test_ns_tagname_overwrite)
1175b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1176b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char *text =
1177b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<n:e xmlns:n='http://xml.libexpat.org/'>\n"
1178b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "  <n:f n:attr='foo'/>\n"
1179b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "  <n:g n:attr2='bar'/>\n"
1180b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "</n:e>";
1181b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char *result =
1182b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "start http://xml.libexpat.org/ e\n"
1183b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "start http://xml.libexpat.org/ f\n"
1184b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "attribute http://xml.libexpat.org/ attr\n"
1185b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "end http://xml.libexpat.org/ f\n"
1186b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "start http://xml.libexpat.org/ g\n"
1187b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "attribute http://xml.libexpat.org/ attr2\n"
1188b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "end http://xml.libexpat.org/ g\n"
1189b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "end http://xml.libexpat.org/ e\n";
1190b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    run_ns_tagname_overwrite_test(text, result);
1191b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1192b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectEND_TEST
1193b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1194b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* Regression test for SF bug #566334. */
1195b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectSTART_TEST(test_ns_tagname_overwrite_triplet)
1196b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1197b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char *text =
1198b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<n:e xmlns:n='http://xml.libexpat.org/'>\n"
1199b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "  <n:f n:attr='foo'/>\n"
1200b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "  <n:g n:attr2='bar'/>\n"
1201b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "</n:e>";
1202b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char *result =
1203b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "start http://xml.libexpat.org/ e n\n"
1204b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "start http://xml.libexpat.org/ f n\n"
1205b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "attribute http://xml.libexpat.org/ attr n\n"
1206b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "end http://xml.libexpat.org/ f n\n"
1207b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "start http://xml.libexpat.org/ g n\n"
1208b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "attribute http://xml.libexpat.org/ attr2 n\n"
1209b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "end http://xml.libexpat.org/ g n\n"
1210b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "end http://xml.libexpat.org/ e n\n";
1211b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_SetReturnNSTriplet(parser, XML_TRUE);
1212b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    run_ns_tagname_overwrite_test(text, result);
1213b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1214b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectEND_TEST
1215b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1216b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1217b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* Regression test for SF bug #620343. */
1218b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void XMLCALL
1219b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstart_element_fail(void *userData,
1220b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                   const XML_Char *name, const XML_Char **atts)
1221b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1222b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    /* We should never get here. */
1223b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    fail("should never reach start_element_fail()");
1224b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1225b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1226b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic void XMLCALL
1227b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstart_ns_clearing_start_element(void *userData,
1228b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                const XML_Char *prefix,
1229b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                                const XML_Char *uri)
1230b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1231b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_SetStartElementHandler((XML_Parser) userData, NULL);
1232b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1233b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1234b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectSTART_TEST(test_start_ns_clears_start_element)
1235b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1236b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    /* This needs to use separate start/end tags; using the empty tag
1237b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project       syntax doesn't cause the problematic path through Expat to be
1238b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project       taken.
1239b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    */
1240b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char *text = "<e xmlns='http://xml.libexpat.org/'></e>";
1241b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1242b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_SetStartElementHandler(parser, start_element_fail);
1243b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_SetStartNamespaceDeclHandler(parser, start_ns_clearing_start_element);
1244b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_UseParserAsHandlerArg(parser);
1245b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR)
1246b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        xml_failure(parser);
1247b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1248b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectEND_TEST
1249b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1250b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* Regression test for SF bug #616863. */
1251b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic int XMLCALL
1252b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectexternal_entity_handler(XML_Parser parser,
1253b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                        const XML_Char *context,
1254b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                        const XML_Char *base,
1255b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                        const XML_Char *systemId,
1256b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                        const XML_Char *publicId)
1257b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
125835e432dd3af2c56c00fc64ca340d1e615030f0a3Elliott Hughes    intptr_t callno = 1 + (intptr_t)XML_GetUserData(parser);
1259b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char *text;
1260b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_Parser p2;
1261b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1262b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (callno == 1)
1263b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        text = ("<!ELEMENT doc (e+)>\n"
1264b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                "<!ATTLIST doc xmlns CDATA #IMPLIED>\n"
1265b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                "<!ELEMENT e EMPTY>\n");
1266b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    else
1267b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        text = ("<?xml version='1.0' encoding='us-ascii'?>"
1268b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                "<e/>");
1269b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1270b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_SetUserData(parser, (void *) callno);
1271b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    p2 = XML_ExternalEntityParserCreate(parser, context, NULL);
1272b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (XML_Parse(p2, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR) {
1273b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        xml_failure(p2);
1274b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return 0;
1275b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
1276b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_ParserFree(p2);
1277b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return 1;
1278b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1279b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1280b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectSTART_TEST(test_default_ns_from_ext_subset_and_ext_ge)
1281b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1282b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char *text =
1283b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<?xml version='1.0'?>\n"
1284b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<!DOCTYPE doc SYSTEM 'http://xml.libexpat.org/doc.dtd' [\n"
1285b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "  <!ENTITY en SYSTEM 'http://xml.libexpat.org/entity.ent'>\n"
1286b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "]>\n"
1287b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<doc xmlns='http://xml.libexpat.org/ns1'>\n"
1288b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "&en;\n"
1289b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "</doc>";
1290b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1291b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_SetParamEntityParsing(parser, XML_PARAM_ENTITY_PARSING_ALWAYS);
1292b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_SetExternalEntityRefHandler(parser, external_entity_handler);
1293b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    /* We actually need to set this handler to tickle this bug. */
1294b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_SetStartElementHandler(parser, dummy_start_element);
1295b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_SetUserData(parser, NULL);
1296b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR)
1297b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        xml_failure(parser);
1298b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1299b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectEND_TEST
1300b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1301b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* Regression test #1 for SF bug #673791. */
1302b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectSTART_TEST(test_ns_prefix_with_empty_uri_1)
1303b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1304b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char *text =
1305b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<doc xmlns:prefix='http://xml.libexpat.org/'>\n"
1306b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "  <e xmlns:prefix=''/>\n"
1307b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "</doc>";
1308b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1309b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    expect_failure(text,
1310b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                   XML_ERROR_UNDECLARING_PREFIX,
1311b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                   "Did not report re-setting namespace"
1312b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                   " URI with prefix to ''.");
1313b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1314b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectEND_TEST
1315b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1316b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* Regression test #2 for SF bug #673791. */
1317b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectSTART_TEST(test_ns_prefix_with_empty_uri_2)
1318b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1319b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char *text =
1320b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<?xml version='1.0'?>\n"
1321b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<docelem xmlns:pre=''/>";
1322b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1323b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    expect_failure(text,
1324b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                   XML_ERROR_UNDECLARING_PREFIX,
1325b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                   "Did not report setting namespace URI with prefix to ''.");
1326b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1327b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectEND_TEST
1328b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1329b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* Regression test #3 for SF bug #673791. */
1330b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectSTART_TEST(test_ns_prefix_with_empty_uri_3)
1331b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1332b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char *text =
1333b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<!DOCTYPE doc [\n"
1334b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "  <!ELEMENT doc EMPTY>\n"
1335b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "  <!ATTLIST doc\n"
1336b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "    xmlns:prefix CDATA ''>\n"
1337b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "]>\n"
1338b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<doc/>";
1339b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1340b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    expect_failure(text,
1341b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                   XML_ERROR_UNDECLARING_PREFIX,
1342b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                   "Didn't report attr default setting NS w/ prefix to ''.");
1343b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1344b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectEND_TEST
1345b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1346b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* Regression test #4 for SF bug #673791. */
1347b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectSTART_TEST(test_ns_prefix_with_empty_uri_4)
1348b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1349b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char *text =
1350b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<!DOCTYPE doc [\n"
1351b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "  <!ELEMENT prefix:doc EMPTY>\n"
1352b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "  <!ATTLIST prefix:doc\n"
1353b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "    xmlns:prefix CDATA 'http://xml.libexpat.org/'>\n"
1354b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "]>\n"
1355b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<prefix:doc/>";
1356b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    /* Packaged info expected by the end element handler;
1357b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project       the weird structuring lets us re-use the triplet_end_checker()
1358b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project       function also used for another test. */
1359b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char *elemstr[] = {
1360b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "http://xml.libexpat.org/ doc prefix"
1361b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    };
1362b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_SetReturnNSTriplet(parser, XML_TRUE);
1363b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_SetUserData(parser, elemstr);
1364b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    XML_SetEndElementHandler(parser, triplet_end_checker);
1365b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR)
1366b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        xml_failure(parser);
1367b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1368b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectEND_TEST
1369b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1370b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectSTART_TEST(test_ns_default_with_empty_uri)
1371b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1372b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char *text =
1373b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<doc xmlns='http://xml.libexpat.org/'>\n"
1374b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "  <e xmlns=''/>\n"
1375b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "</doc>";
1376b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (XML_Parse(parser, text, strlen(text), XML_TRUE) == XML_STATUS_ERROR)
1377b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        xml_failure(parser);
1378b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1379b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectEND_TEST
1380b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1381b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* Regression test for SF bug #692964: two prefixes for one namespace. */
1382b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectSTART_TEST(test_ns_duplicate_attrs_diff_prefixes)
1383b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1384b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char *text =
1385b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "<doc xmlns:a='http://xml.libexpat.org/a'\n"
1386b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "     xmlns:b='http://xml.libexpat.org/a'\n"
1387b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        "     a:a='v' b:a='v' />";
1388b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    expect_failure(text,
1389b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                   XML_ERROR_DUPLICATE_ATTRIBUTE,
1390b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                   "did not report multiple attributes with same URI+name");
1391b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1392b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectEND_TEST
1393b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1394b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* Regression test for SF bug #695401: unbound prefix. */
1395b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectSTART_TEST(test_ns_unbound_prefix_on_attribute)
1396b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1397b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char *text = "<doc a:attr=''/>";
1398b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    expect_failure(text,
1399b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                   XML_ERROR_UNBOUND_PREFIX,
1400b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                   "did not report unbound prefix on attribute");
1401b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1402b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectEND_TEST
1403b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1404b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* Regression test for SF bug #695401: unbound prefix. */
1405b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectSTART_TEST(test_ns_unbound_prefix_on_element)
1406b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1407b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char *text = "<a:doc/>";
1408b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    expect_failure(text,
1409b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                   XML_ERROR_UNBOUND_PREFIX,
1410b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                   "did not report unbound prefix on element");
1411b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1412b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectEND_TEST
1413b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1414b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic Suite *
1415b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectmake_suite(void)
1416b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1417b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    Suite *s = suite_create("basic");
1418b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    TCase *tc_basic = tcase_create("basic tests");
1419b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    TCase *tc_namespace = tcase_create("XML namespaces");
1420b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1421b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    suite_add_tcase(s, tc_basic);
1422b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tcase_add_checked_fixture(tc_basic, basic_setup, basic_teardown);
1423b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tcase_add_test(tc_basic, test_nul_byte);
1424b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tcase_add_test(tc_basic, test_u0000_char);
1425b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tcase_add_test(tc_basic, test_bom_utf8);
1426b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tcase_add_test(tc_basic, test_bom_utf16_be);
1427b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tcase_add_test(tc_basic, test_bom_utf16_le);
1428b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tcase_add_test(tc_basic, test_illegal_utf8);
1429b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tcase_add_test(tc_basic, test_utf16);
1430b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tcase_add_test(tc_basic, test_utf16_le_epilog_newline);
1431b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tcase_add_test(tc_basic, test_latin1_umlauts);
1432b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    /* Regression test for SF bug #491986. */
1433b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tcase_add_test(tc_basic, test_danish_latin1);
1434b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    /* Regression test for SF bug #514281. */
1435b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tcase_add_test(tc_basic, test_french_charref_hexidecimal);
1436b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tcase_add_test(tc_basic, test_french_charref_decimal);
1437b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tcase_add_test(tc_basic, test_french_latin1);
1438b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tcase_add_test(tc_basic, test_french_utf8);
1439b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tcase_add_test(tc_basic, test_utf8_false_rejection);
1440b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tcase_add_test(tc_basic, test_line_number_after_parse);
1441b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tcase_add_test(tc_basic, test_column_number_after_parse);
1442b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tcase_add_test(tc_basic, test_line_and_column_numbers_inside_handlers);
1443b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tcase_add_test(tc_basic, test_line_number_after_error);
1444b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tcase_add_test(tc_basic, test_column_number_after_error);
1445b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tcase_add_test(tc_basic, test_really_long_lines);
1446b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tcase_add_test(tc_basic, test_end_element_events);
1447b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tcase_add_test(tc_basic, test_attr_whitespace_normalization);
1448b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tcase_add_test(tc_basic, test_xmldecl_misplaced);
1449b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tcase_add_test(tc_basic, test_unknown_encoding_internal_entity);
1450b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tcase_add_test(tc_basic,
1451b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                   test_wfc_undeclared_entity_unread_external_subset);
1452b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tcase_add_test(tc_basic, test_wfc_undeclared_entity_no_external_subset);
1453b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tcase_add_test(tc_basic, test_wfc_undeclared_entity_standalone);
1454b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tcase_add_test(tc_basic, test_wfc_undeclared_entity_with_external_subset);
1455b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tcase_add_test(tc_basic,
1456b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                   test_wfc_undeclared_entity_with_external_subset_standalone);
1457b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tcase_add_test(tc_basic, test_wfc_no_recursive_entity_refs);
1458b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tcase_add_test(tc_basic, test_ext_entity_set_encoding);
1459b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tcase_add_test(tc_basic, test_dtd_default_handling);
1460b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tcase_add_test(tc_basic, test_empty_ns_without_namespaces);
1461b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tcase_add_test(tc_basic, test_ns_in_attribute_default_without_namespaces);
1462d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes    tcase_add_test(tc_basic, test_stop_parser_between_char_data_calls);
1463d07d5a72938fd52415368c2320fc29575ae9a0c3Elliott Hughes    tcase_add_test(tc_basic, test_suspend_parser_between_char_data_calls);
1464b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1465b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    suite_add_tcase(s, tc_namespace);
1466b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tcase_add_checked_fixture(tc_namespace,
1467b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                              namespace_setup, namespace_teardown);
1468b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tcase_add_test(tc_namespace, test_return_ns_triplet);
1469b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tcase_add_test(tc_namespace, test_ns_tagname_overwrite);
1470b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tcase_add_test(tc_namespace, test_ns_tagname_overwrite_triplet);
1471b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tcase_add_test(tc_namespace, test_start_ns_clears_start_element);
1472b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tcase_add_test(tc_namespace, test_default_ns_from_ext_subset_and_ext_ge);
1473b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tcase_add_test(tc_namespace, test_ns_prefix_with_empty_uri_1);
1474b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tcase_add_test(tc_namespace, test_ns_prefix_with_empty_uri_2);
1475b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tcase_add_test(tc_namespace, test_ns_prefix_with_empty_uri_3);
1476b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tcase_add_test(tc_namespace, test_ns_prefix_with_empty_uri_4);
1477b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tcase_add_test(tc_namespace, test_ns_default_with_empty_uri);
1478b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tcase_add_test(tc_namespace, test_ns_duplicate_attrs_diff_prefixes);
1479b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tcase_add_test(tc_namespace, test_ns_unbound_prefix_on_attribute);
1480b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    tcase_add_test(tc_namespace, test_ns_unbound_prefix_on_element);
1481b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1482b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return s;
1483b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1484b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1485b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1486b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectint
1487b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectmain(int argc, char *argv[])
1488b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
1489b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    int i, nf;
1490b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    int verbosity = CK_NORMAL;
1491b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    Suite *s = make_suite();
1492b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    SRunner *sr = srunner_create(s);
1493b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1494b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    /* run the tests for internal helper functions */
1495b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    testhelper_is_whitespace_normalized();
1496b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1497b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    for (i = 1; i < argc; ++i) {
1498b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        char *opt = argv[i];
1499b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (strcmp(opt, "-v") == 0 || strcmp(opt, "--verbose") == 0)
1500b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            verbosity = CK_VERBOSE;
1501b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        else if (strcmp(opt, "-q") == 0 || strcmp(opt, "--quiet") == 0)
1502b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            verbosity = CK_SILENT;
1503b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        else {
1504b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            fprintf(stderr, "runtests: unknown option '%s'\n", opt);
1505b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            return 2;
1506b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        }
1507b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
1508b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (verbosity != CK_SILENT)
1509b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        printf("Expat version: %s\n", XML_ExpatVersion());
1510b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    srunner_run_all(sr, verbosity);
1511b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    nf = srunner_ntests_failed(sr);
1512b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    srunner_free(sr);
1513b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
1514b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return (nf == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
1515b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
1516