| | #include "unity/unity.h" |
| | #include <libxml/HTMLparser.h> |
| |
|
| | #include <string.h> |
| | #include <stdlib.h> |
| |
|
| | |
| | int test_htmlParseLookupGt(xmlParserCtxtPtr ctxt); |
| |
|
| | |
| | void setUp(void) { |
| | |
| | } |
| | void tearDown(void) { |
| | |
| | } |
| |
|
| | |
| | static htmlParserCtxtPtr make_ctx(const char *s) { |
| | int len = (int)strlen(s); |
| | htmlParserCtxtPtr ctxt = htmlCreateMemoryParserCtxt(s, len); |
| | TEST_ASSERT_NOT_NULL_MESSAGE(ctxt, "Failed to create HTML parser context"); |
| | TEST_ASSERT_NOT_NULL_MESSAGE(ctxt->input, "Parser input is NULL"); |
| | |
| | if (ctxt->input->base != NULL) |
| | ctxt->input->cur = ctxt->input->base; |
| | return ctxt; |
| | } |
| |
|
| | |
| | void test_htmlParseLookupGt_basic_tag(void) { |
| | htmlParserCtxtPtr ctxt = make_ctx("<a>"); |
| | ctxt->checkIndex = 0; |
| | ctxt->endCheckState = 0; |
| |
|
| | int ret = test_htmlParseLookupGt(ctxt); |
| | TEST_ASSERT_EQUAL_INT(0, ret); |
| | TEST_ASSERT_EQUAL_UINT(0, ctxt->checkIndex); |
| | TEST_ASSERT_EQUAL_INT(0, ctxt->endCheckState); |
| |
|
| | htmlFreeParserCtxt(ctxt); |
| | } |
| |
|
| | |
| | void test_htmlParseLookupGt_attrs_and_spaces(void) { |
| | htmlParserCtxtPtr ctxt = make_ctx("<a href=\"test\" >"); |
| | ctxt->checkIndex = 0; |
| | ctxt->endCheckState = 0; |
| |
|
| | int ret = test_htmlParseLookupGt(ctxt); |
| | TEST_ASSERT_EQUAL_INT(0, ret); |
| | TEST_ASSERT_EQUAL_UINT(0, ctxt->checkIndex); |
| | TEST_ASSERT_EQUAL_INT(0, ctxt->endCheckState); |
| |
|
| | htmlFreeParserCtxt(ctxt); |
| | } |
| |
|
| | |
| | void test_htmlParseLookupGt_gt_inside_single_quotes(void) { |
| | htmlParserCtxtPtr ctxt = make_ctx("<a title='> not end' data='x'>"); |
| | ctxt->checkIndex = 0; |
| | ctxt->endCheckState = 0; |
| |
|
| | int ret = test_htmlParseLookupGt(ctxt); |
| | TEST_ASSERT_EQUAL_INT(0, ret); |
| | TEST_ASSERT_EQUAL_UINT(0, ctxt->checkIndex); |
| | TEST_ASSERT_EQUAL_INT(0, ctxt->endCheckState); |
| |
|
| | htmlFreeParserCtxt(ctxt); |
| | } |
| |
|
| | |
| | void test_htmlParseLookupGt_gt_inside_double_quotes(void) { |
| | htmlParserCtxtPtr ctxt = make_ctx("<a title=\"> not end\" data=\"x\">"); |
| | ctxt->checkIndex = 0; |
| | ctxt->endCheckState = 0; |
| |
|
| | int ret = test_htmlParseLookupGt(ctxt); |
| | TEST_ASSERT_EQUAL_INT(0, ret); |
| | TEST_ASSERT_EQUAL_UINT(0, ctxt->checkIndex); |
| | TEST_ASSERT_EQUAL_INT(0, ctxt->endCheckState); |
| |
|
| | htmlFreeParserCtxt(ctxt); |
| | } |
| |
|
| | |
| | void test_htmlParseLookupGt_incomplete_no_gt(void) { |
| | const char *buf = "<a href='incomplete'"; |
| | htmlParserCtxtPtr ctxt = make_ctx(buf); |
| | ctxt->checkIndex = 0; |
| | ctxt->endCheckState = 0; |
| |
|
| | size_t expectedIndex = (size_t)(ctxt->input->end - ctxt->input->cur); |
| |
|
| | int ret = test_htmlParseLookupGt(ctxt); |
| | TEST_ASSERT_EQUAL_INT(-1, ret); |
| | TEST_ASSERT_EQUAL_size_t(expectedIndex, ctxt->checkIndex); |
| | |
| | TEST_ASSERT_TRUE(ctxt->endCheckState >= 0); |
| |
|
| | htmlFreeParserCtxt(ctxt); |
| | } |
| |
|
| | |
| | void test_htmlParseLookupGt_incomplete_repeat_call_stable(void) { |
| | const char *buf = "<a href='x' attr=y"; |
| | htmlParserCtxtPtr ctxt = make_ctx(buf); |
| | ctxt->checkIndex = 0; |
| | ctxt->endCheckState = 0; |
| |
|
| | size_t expectedIndex = (size_t)(ctxt->input->end - ctxt->input->cur); |
| |
|
| | int ret1 = test_htmlParseLookupGt(ctxt); |
| | TEST_ASSERT_EQUAL_INT(-1, ret1); |
| | int savedState = ctxt->endCheckState; |
| | size_t savedIndex = ctxt->checkIndex; |
| |
|
| | int ret2 = test_htmlParseLookupGt(ctxt); |
| | TEST_ASSERT_EQUAL_INT(-1, ret2); |
| | TEST_ASSERT_EQUAL_size_t(expectedIndex, ctxt->checkIndex); |
| | TEST_ASSERT_EQUAL_size_t(savedIndex, ctxt->checkIndex); |
| | TEST_ASSERT_EQUAL_INT(savedState, ctxt->endCheckState); |
| |
|
| | htmlFreeParserCtxt(ctxt); |
| | } |
| |
|
| | |
| | void test_htmlParseLookupGt_resume_scanning_across_buffers(void) { |
| | const char *part1 = "<a href='value'"; |
| | const char *part2 = "<a href='value' data=x>"; |
| |
|
| | |
| | htmlParserCtxtPtr ctxt1 = make_ctx(part1); |
| | ctxt1->checkIndex = 0; |
| | ctxt1->endCheckState = 0; |
| |
|
| | int ret1 = test_htmlParseLookupGt(ctxt1); |
| | TEST_ASSERT_EQUAL_INT(-1, ret1); |
| | size_t savedIndex = ctxt1->checkIndex; |
| | int savedState = ctxt1->endCheckState; |
| |
|
| | htmlFreeParserCtxt(ctxt1); |
| |
|
| | |
| | htmlParserCtxtPtr ctxt2 = make_ctx(part2); |
| | ctxt2->checkIndex = savedIndex; |
| | ctxt2->endCheckState = savedState; |
| |
|
| | int ret2 = test_htmlParseLookupGt(ctxt2); |
| | TEST_ASSERT_EQUAL_INT(0, ret2); |
| | TEST_ASSERT_EQUAL_UINT(0, ctxt2->checkIndex); |
| | TEST_ASSERT_EQUAL_INT(0, ctxt2->endCheckState); |
| |
|
| | htmlFreeParserCtxt(ctxt2); |
| | } |
| |
|
| | |
| | void test_htmlParseLookupGt_closing_tag(void) { |
| | htmlParserCtxtPtr ctxt = make_ctx("</div>"); |
| | ctxt->checkIndex = 0; |
| | ctxt->endCheckState = 0; |
| |
|
| | int ret = test_htmlParseLookupGt(ctxt); |
| | TEST_ASSERT_EQUAL_INT(0, ret); |
| | TEST_ASSERT_EQUAL_UINT(0, ctxt->checkIndex); |
| | TEST_ASSERT_EQUAL_INT(0, ctxt->endCheckState); |
| |
|
| | htmlFreeParserCtxt(ctxt); |
| | } |
| |
|
| | |
| | void test_htmlParseLookupGt_self_closing(void) { |
| | htmlParserCtxtPtr ctxt = make_ctx("<img alt='x'/>"); |
| | ctxt->checkIndex = 0; |
| | ctxt->endCheckState = 0; |
| |
|
| | int ret = test_htmlParseLookupGt(ctxt); |
| | TEST_ASSERT_EQUAL_INT(0, ret); |
| | TEST_ASSERT_EQUAL_UINT(0, ctxt->checkIndex); |
| | TEST_ASSERT_EQUAL_INT(0, ctxt->endCheckState); |
| |
|
| | htmlFreeParserCtxt(ctxt); |
| | } |
| |
|
| | int main(void) { |
| | UNITY_BEGIN(); |
| | xmlInitParser(); |
| |
|
| | RUN_TEST(test_htmlParseLookupGt_basic_tag); |
| | RUN_TEST(test_htmlParseLookupGt_attrs_and_spaces); |
| | RUN_TEST(test_htmlParseLookupGt_gt_inside_single_quotes); |
| | RUN_TEST(test_htmlParseLookupGt_gt_inside_double_quotes); |
| | RUN_TEST(test_htmlParseLookupGt_incomplete_no_gt); |
| | RUN_TEST(test_htmlParseLookupGt_incomplete_repeat_call_stable); |
| | RUN_TEST(test_htmlParseLookupGt_resume_scanning_across_buffers); |
| | RUN_TEST(test_htmlParseLookupGt_closing_tag); |
| | RUN_TEST(test_htmlParseLookupGt_self_closing); |
| |
|
| | xmlCleanupParser(); |
| | return UNITY_END(); |
| | } |