|
|
#include "unity/unity.h" |
|
|
#include <libxml/HTMLtree.h> |
|
|
|
|
|
#include <libxml/tree.h> |
|
|
#include <libxml/xmlIO.h> |
|
|
#include <libxml/parser.h> |
|
|
#include <string.h> |
|
|
#include <stdlib.h> |
|
|
|
|
|
|
|
|
extern void test_htmlDtdDumpOutput(xmlOutputBufferPtr buf, xmlDocPtr doc, const char *encoding); |
|
|
|
|
|
static char* run_dump_and_get_string(xmlDocPtr doc) { |
|
|
xmlBufferPtr xbuf = xmlBufferCreate(); |
|
|
TEST_ASSERT_NOT_NULL_MESSAGE(xbuf, "Failed to create xmlBuffer"); |
|
|
|
|
|
xmlOutputBufferPtr out = xmlOutputBufferCreateBuffer(xbuf, NULL); |
|
|
TEST_ASSERT_NOT_NULL_MESSAGE(out, "Failed to create xmlOutputBuffer"); |
|
|
|
|
|
test_htmlDtdDumpOutput(out, doc, "utf-8"); |
|
|
|
|
|
|
|
|
xmlOutputBufferFlush(out); |
|
|
|
|
|
const xmlChar *content = xmlBufferContent(xbuf); |
|
|
int len = xmlBufferLength(xbuf); |
|
|
if (len < 0) len = 0; |
|
|
|
|
|
char *ret = (char *)malloc((size_t)len + 1); |
|
|
TEST_ASSERT_NOT_NULL_MESSAGE(ret, "malloc failed"); |
|
|
if (len > 0 && content != NULL) { |
|
|
memcpy(ret, content, (size_t)len); |
|
|
} |
|
|
ret[len] = '\0'; |
|
|
|
|
|
xmlOutputBufferClose(out); |
|
|
xmlBufferFree(xbuf); |
|
|
|
|
|
return ret; |
|
|
} |
|
|
|
|
|
void setUp(void) { |
|
|
xmlInitParser(); |
|
|
} |
|
|
|
|
|
void tearDown(void) { |
|
|
xmlCleanupParser(); |
|
|
} |
|
|
|
|
|
static xmlDocPtr make_doc(void) { |
|
|
xmlDocPtr doc = xmlNewDoc(BAD_CAST "1.0"); |
|
|
TEST_ASSERT_NOT_NULL_MESSAGE(doc, "xmlNewDoc failed"); |
|
|
return doc; |
|
|
} |
|
|
|
|
|
void test_htmlDtdDumpOutput_no_subset_outputs_nothing(void) { |
|
|
xmlDocPtr doc = make_doc(); |
|
|
|
|
|
char *out = run_dump_and_get_string(doc); |
|
|
TEST_ASSERT_NOT_NULL(out); |
|
|
TEST_ASSERT_EQUAL_STRING("", out); |
|
|
|
|
|
free(out); |
|
|
xmlFreeDoc(doc); |
|
|
} |
|
|
|
|
|
void test_htmlDtdDumpOutput_name_only(void) { |
|
|
xmlDocPtr doc = make_doc(); |
|
|
xmlDtdPtr dtd = xmlCreateIntSubset(doc, BAD_CAST "html", NULL, NULL); |
|
|
TEST_ASSERT_NOT_NULL_MESSAGE(dtd, "xmlCreateIntSubset failed"); |
|
|
|
|
|
char *out = run_dump_and_get_string(doc); |
|
|
TEST_ASSERT_EQUAL_STRING("<!DOCTYPE html>\n", out); |
|
|
|
|
|
free(out); |
|
|
xmlFreeDoc(doc); |
|
|
} |
|
|
|
|
|
void test_htmlDtdDumpOutput_public_only(void) { |
|
|
xmlDocPtr doc = make_doc(); |
|
|
xmlDtdPtr dtd = xmlCreateIntSubset(doc, BAD_CAST "html", |
|
|
BAD_CAST "PUBLIC_ID", |
|
|
NULL); |
|
|
TEST_ASSERT_NOT_NULL_MESSAGE(dtd, "xmlCreateIntSubset failed"); |
|
|
|
|
|
char *out = run_dump_and_get_string(doc); |
|
|
TEST_ASSERT_EQUAL_STRING("<!DOCTYPE html PUBLIC \"PUBLIC_ID\">\n", out); |
|
|
|
|
|
free(out); |
|
|
xmlFreeDoc(doc); |
|
|
} |
|
|
|
|
|
void test_htmlDtdDumpOutput_system_only_non_legacy(void) { |
|
|
xmlDocPtr doc = make_doc(); |
|
|
xmlDtdPtr dtd = xmlCreateIntSubset(doc, BAD_CAST "html", |
|
|
NULL, |
|
|
BAD_CAST "http://example.com/sys.dtd"); |
|
|
TEST_ASSERT_NOT_NULL_MESSAGE(dtd, "xmlCreateIntSubset failed"); |
|
|
|
|
|
char *out = run_dump_and_get_string(doc); |
|
|
TEST_ASSERT_EQUAL_STRING("<!DOCTYPE html SYSTEM \"http://example.com/sys.dtd\">\n", out); |
|
|
|
|
|
free(out); |
|
|
xmlFreeDoc(doc); |
|
|
} |
|
|
|
|
|
void test_htmlDtdDumpOutput_system_only_legacy_compat_suppressed(void) { |
|
|
xmlDocPtr doc = make_doc(); |
|
|
xmlDtdPtr dtd = xmlCreateIntSubset(doc, BAD_CAST "html", |
|
|
NULL, |
|
|
BAD_CAST "about:legacy-compat"); |
|
|
TEST_ASSERT_NOT_NULL_MESSAGE(dtd, "xmlCreateIntSubset failed"); |
|
|
|
|
|
char *out = run_dump_and_get_string(doc); |
|
|
|
|
|
TEST_ASSERT_EQUAL_STRING("<!DOCTYPE html>\n", out); |
|
|
|
|
|
free(out); |
|
|
xmlFreeDoc(doc); |
|
|
} |
|
|
|
|
|
void test_htmlDtdDumpOutput_public_and_system(void) { |
|
|
xmlDocPtr doc = make_doc(); |
|
|
xmlDtdPtr dtd = xmlCreateIntSubset(doc, BAD_CAST "html", |
|
|
BAD_CAST "-//W3C//DTD HTML 4.01//EN", |
|
|
BAD_CAST "http://www.w3.org/TR/html4/strict.dtd"); |
|
|
TEST_ASSERT_NOT_NULL_MESSAGE(dtd, "xmlCreateIntSubset failed"); |
|
|
|
|
|
char *out = run_dump_and_get_string(doc); |
|
|
TEST_ASSERT_EQUAL_STRING("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">\n", out); |
|
|
|
|
|
free(out); |
|
|
xmlFreeDoc(doc); |
|
|
} |
|
|
|
|
|
int main(void) { |
|
|
UNITY_BEGIN(); |
|
|
|
|
|
RUN_TEST(test_htmlDtdDumpOutput_no_subset_outputs_nothing); |
|
|
RUN_TEST(test_htmlDtdDumpOutput_name_only); |
|
|
RUN_TEST(test_htmlDtdDumpOutput_public_only); |
|
|
RUN_TEST(test_htmlDtdDumpOutput_system_only_non_legacy); |
|
|
RUN_TEST(test_htmlDtdDumpOutput_system_only_legacy_compat_suppressed); |
|
|
RUN_TEST(test_htmlDtdDumpOutput_public_and_system); |
|
|
|
|
|
return UNITY_END(); |
|
|
} |