You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by iv...@apache.org on 2016/10/18 08:11:58 UTC
svn commit: r1765398 -
/subversion/trunk/subversion/tests/libsvn_subr/xml-test.c
Author: ivan
Date: Tue Oct 18 08:11:58 2016
New Revision: 1765398
URL: http://svn.apache.org/viewvc?rev=1765398&view=rev
Log:
Extend XML parser tests to validate that callbacks are not invoked after
svn_xml_signal_bailout() is called.
* subversion/tests/libsvn_subr/xml-test.c
(xml_callbacks_baton_t): New.
(strbuf_start_elem, strbuf_end_elem, strbuf_cdata): Accept
xml_callbacks_baton_t * as baton.
(err_end_elem): Accept xml_callbacks_baton_t * as baton. Log invocation to
stringbuf before raising error.
(test_simple, test_invalid_xml, test_invalid_xml_signal_bailout): Use
xml_callbacks_baton_t as baton for XML parser.
(test_signal_bailout): Use xml_callbacks_baton_t as baton for XML parser
callbacks and check callback invocation log.
Modified:
subversion/trunk/subversion/tests/libsvn_subr/xml-test.c
Modified: subversion/trunk/subversion/tests/libsvn_subr/xml-test.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/libsvn_subr/xml-test.c?rev=1765398&r1=1765397&r2=1765398&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/libsvn_subr/xml-test.c (original)
+++ subversion/trunk/subversion/tests/libsvn_subr/xml-test.c Tue Oct 18 08:11:58 2016
@@ -28,23 +28,29 @@
#include "../svn_test.h"
+typedef struct xml_callbacks_baton_t
+{
+ svn_stringbuf_t *buf;
+ svn_xml_parser_t *parser;
+} xml_callbacks_baton_t;
+
/* Implements svn_xml_start_elem. Logs all invocations to svn_stringbuf_t
* provided via BATTON. */
static void
strbuf_start_elem(void *baton, const char *name, const char **atts)
{
- svn_stringbuf_t *buf = baton;
- svn_stringbuf_appendcstr(buf, "<");
- svn_stringbuf_appendcstr(buf, name);
+ xml_callbacks_baton_t *b = baton;
+ svn_stringbuf_appendcstr(b->buf, "<");
+ svn_stringbuf_appendcstr(b->buf, name);
while (*atts)
{
- svn_stringbuf_appendcstr(buf, " ");
- svn_stringbuf_appendcstr(buf, atts[0]);
- svn_stringbuf_appendcstr(buf, "=");
- svn_stringbuf_appendcstr(buf, atts[1]);
+ svn_stringbuf_appendcstr(b->buf, " ");
+ svn_stringbuf_appendcstr(b->buf, atts[0]);
+ svn_stringbuf_appendcstr(b->buf, "=");
+ svn_stringbuf_appendcstr(b->buf, atts[1]);
atts += 2;
}
- svn_stringbuf_appendcstr(buf, ">");
+ svn_stringbuf_appendcstr(b->buf, ">");
}
/* Implements svn_xml_end_elem. Logs all invocations to svn_stringbuf_t
@@ -52,10 +58,10 @@ strbuf_start_elem(void *baton, const cha
static void
strbuf_end_elem(void *baton, const char *name)
{
- svn_stringbuf_t *buf = baton;
- svn_stringbuf_appendcstr(buf, "</");
- svn_stringbuf_appendcstr(buf, name);
- svn_stringbuf_appendcstr(buf, ">");
+ xml_callbacks_baton_t *b = baton;
+ svn_stringbuf_appendcstr(b->buf, "</");
+ svn_stringbuf_appendcstr(b->buf, name);
+ svn_stringbuf_appendcstr(b->buf, ">");
}
/* Implements svn_xml_char_data. Logs all invocations to svn_stringbuf_t
@@ -63,19 +69,22 @@ strbuf_end_elem(void *baton, const char
static void
strbuf_cdata(void *baton, const char *data, apr_size_t len)
{
- svn_stringbuf_t *buf = baton;
- svn_stringbuf_appendbytes(buf, data, len);
+ xml_callbacks_baton_t *b = baton;
+ svn_stringbuf_appendbytes(b->buf, data, len);
}
-/* Implements svn_xml_end_elem. Callback used in test_signal_bailout and
- * test_invalid_xml_signal_bailout tests. BATON is 'svn_xml_parser_t **'. */
+/* Implements svn_xml_char_data. Calls strbuf_end_elem() but also
+ * signals XML parser bailout. */
static void
err_end_elem(void *baton, const char *name)
{
- svn_xml_parser_t **parser = baton;
+ xml_callbacks_baton_t *b = baton;
+
+ /* Log invocation first. */
+ strbuf_end_elem(baton, name);
svn_xml_signal_bailout(svn_error_create(APR_EGENERAL, NULL, NULL),
- *parser);
+ b->parser);
}
static svn_error_t *
@@ -83,33 +92,32 @@ test_simple(apr_pool_t *pool)
{
const char *xml = "<root><tag1>value</tag1><tag2 a='v' /></root>";
const char *p;
- svn_stringbuf_t *buf = svn_stringbuf_create_empty(pool);
- svn_xml_parser_t *parser;
+ xml_callbacks_baton_t b;
/* Test parsing XML in one chunk.*/
- parser = svn_xml_make_parser(buf, strbuf_start_elem, strbuf_end_elem,
- strbuf_cdata, pool);
+ b.buf = svn_stringbuf_create_empty(pool);
+ b.parser = svn_xml_make_parser(&b, strbuf_start_elem, strbuf_end_elem,
+ strbuf_cdata, pool);
- SVN_ERR(svn_xml_parse(parser, xml, strlen(xml), TRUE));
+ SVN_ERR(svn_xml_parse(b.parser, xml, strlen(xml), TRUE));
- SVN_TEST_STRING_ASSERT(buf->data,
+ SVN_TEST_STRING_ASSERT(b.buf->data,
"<root><tag1>value</tag1><tag2 a=v></tag2></root>");
- svn_xml_free_parser(parser);
+ svn_xml_free_parser(b.parser);
/* Test parsing XML byte by byte.*/
- buf = svn_stringbuf_create_empty(pool);
-
- parser = svn_xml_make_parser(buf, strbuf_start_elem, strbuf_end_elem,
- strbuf_cdata, pool);
+ b.buf = svn_stringbuf_create_empty(pool);
+ b.parser = svn_xml_make_parser(&b, strbuf_start_elem, strbuf_end_elem,
+ strbuf_cdata, pool);
for (p = xml; *p; p++)
{
- SVN_ERR(svn_xml_parse(parser, p, 1, FALSE));
+ SVN_ERR(svn_xml_parse(b.parser, p, 1, FALSE));
}
- SVN_ERR(svn_xml_parse(parser, NULL, 0, TRUE));
- svn_xml_free_parser(parser);
+ SVN_ERR(svn_xml_parse(b.parser, NULL, 0, TRUE));
+ svn_xml_free_parser(b.parser);
- SVN_TEST_STRING_ASSERT(buf->data,
+ SVN_TEST_STRING_ASSERT(b.buf->data,
"<root><tag1>value</tag1><tag2 a=v></tag2></root>");
return SVN_NO_ERROR;
@@ -120,14 +128,14 @@ test_invalid_xml(apr_pool_t *pool)
{
/* Invalid XML (missing </root>) */
const char *xml = "<root><tag1>value</tag1>";
- svn_stringbuf_t *buf = svn_stringbuf_create_empty(pool);
- svn_xml_parser_t *parser;
+ xml_callbacks_baton_t b;
svn_error_t *err;
- parser = svn_xml_make_parser(buf, strbuf_start_elem, strbuf_end_elem,
- strbuf_cdata, pool);
+ b.buf = svn_stringbuf_create_empty(pool);
+ b.parser = svn_xml_make_parser(&b, strbuf_start_elem, strbuf_end_elem,
+ strbuf_cdata, pool);
- err = svn_xml_parse(parser, xml, strlen(xml), TRUE);
+ err = svn_xml_parse(b.parser, xml, strlen(xml), TRUE);
SVN_TEST_ASSERT_ERROR(err, SVN_ERR_XML_MALFORMED);
@@ -139,12 +147,16 @@ test_signal_bailout(apr_pool_t *pool)
{
/* Invalid XML (missing </root>) */
const char *xml = "<root><tag1></tag1></root>";
- svn_xml_parser_t *parser;
+ xml_callbacks_baton_t b;
svn_error_t *err;
- parser = svn_xml_make_parser(&parser, NULL, err_end_elem, NULL, pool);
- err = svn_xml_parse(parser, xml, strlen(xml), TRUE);
+ b.buf = svn_stringbuf_create_empty(pool);
+ b.parser = svn_xml_make_parser(&b, strbuf_start_elem, err_end_elem,
+ strbuf_cdata, pool);
+ err = svn_xml_parse(b.parser, xml, strlen(xml), TRUE);
SVN_TEST_ASSERT_ERROR(err, APR_EGENERAL);
+ SVN_TEST_STRING_ASSERT(b.buf->data,
+ "<root><tag1></tag1>");
return SVN_NO_ERROR;
}
@@ -154,11 +166,12 @@ test_invalid_xml_signal_bailout(apr_pool
{
/* Invalid XML (missing </root>) */
const char *xml = "<root><tag1></tag1>";
- svn_xml_parser_t *parser;
+ xml_callbacks_baton_t b;
svn_error_t *err;
- parser = svn_xml_make_parser(&parser, NULL, err_end_elem, NULL, pool);
- err = svn_xml_parse(parser, xml, strlen(xml), TRUE);
+ b.buf = svn_stringbuf_create_empty(pool);
+ b.parser = svn_xml_make_parser(&b, NULL, err_end_elem, NULL, pool);
+ err = svn_xml_parse(b.parser, xml, strlen(xml), TRUE);
/* We may get SVN_ERR_XML_MALFORMED or error from err_end_elem() callback.
* This behavior depends how XML parser works: it may pre-parse data before