| #include "unity/unity.h" |
| #include <libxml/HTMLparser.h> |
|
|
| #include <stdlib.h> |
| #include <string.h> |
| #include <stdint.h> |
|
|
| |
| void test_htmlSkipBogusDoctype(htmlParserCtxtPtr ctxt); |
|
|
| static htmlParserCtxtPtr make_ctxt_from_str(const char *s) { |
| |
| return htmlCreateMemoryParserCtxt(s, (int)strlen(s)); |
| } |
|
|
| void setUp(void) { |
| |
| } |
|
|
| void tearDown(void) { |
| |
| } |
|
|
| |
| void test_htmlSkipBogusDoctype_basic(void) { |
| const char *buf = "bogus>"; |
| htmlParserCtxtPtr ctxt = make_ctxt_from_str(buf); |
| TEST_ASSERT_NOT_NULL(ctxt); |
| TEST_ASSERT_NOT_NULL(ctxt->input); |
|
|
| |
| ctxt->input->line = 1; |
| ctxt->input->col = 1; |
|
|
| test_htmlSkipBogusDoctype(ctxt); |
|
|
| |
| int offset = (int)(ctxt->input->cur - ctxt->input->base); |
| TEST_ASSERT_EQUAL_INT(6, offset); |
| |
| TEST_ASSERT_EQUAL_INT(1, ctxt->input->line); |
| TEST_ASSERT_EQUAL_INT(7, ctxt->input->col); |
|
|
| htmlFreeParserCtxt(ctxt); |
| } |
|
|
| |
| void test_htmlSkipBogusDoctype_with_newlines(void) { |
| const char *buf = "ab\ncd>"; |
| htmlParserCtxtPtr ctxt = make_ctxt_from_str(buf); |
| TEST_ASSERT_NOT_NULL(ctxt); |
| TEST_ASSERT_NOT_NULL(ctxt->input); |
|
|
| ctxt->input->line = 1; |
| ctxt->input->col = 1; |
|
|
| test_htmlSkipBogusDoctype(ctxt); |
|
|
| int offset = (int)(ctxt->input->cur - ctxt->input->base); |
| TEST_ASSERT_EQUAL_INT(6, offset); |
|
|
| |
| TEST_ASSERT_EQUAL_INT(2, ctxt->input->line); |
|
|
| |
| |
| |
| TEST_ASSERT_EQUAL_INT(4, ctxt->input->col); |
|
|
| htmlFreeParserCtxt(ctxt); |
| } |
|
|
| |
| void test_htmlSkipBogusDoctype_no_gt_reaches_eof(void) { |
| const char *buf = "no gt present"; |
| const int len = (int)strlen(buf); |
| htmlParserCtxtPtr ctxt = make_ctxt_from_str(buf); |
| TEST_ASSERT_NOT_NULL(ctxt); |
| TEST_ASSERT_NOT_NULL(ctxt->input); |
|
|
| ctxt->input->line = 5; |
| ctxt->input->col = 10; |
|
|
| test_htmlSkipBogusDoctype(ctxt); |
|
|
| |
| int offset = (int)(ctxt->input->cur - ctxt->input->base); |
| TEST_ASSERT_EQUAL_INT(len, offset); |
|
|
| |
| TEST_ASSERT_EQUAL_INT(5, ctxt->input->line); |
| TEST_ASSERT_EQUAL_INT(10 + len, ctxt->input->col); |
|
|
| htmlFreeParserCtxt(ctxt); |
| } |
|
|
| |
| void test_htmlSkipBogusDoctype_zero_avail_noop(void) { |
| const char *buf = ">"; |
| htmlParserCtxtPtr ctxt = make_ctxt_from_str(buf); |
| TEST_ASSERT_NOT_NULL(ctxt); |
| TEST_ASSERT_NOT_NULL(ctxt->input); |
|
|
| |
| ctxt->input->cur = ctxt->input->end; |
| ctxt->input->line = 3; |
| ctxt->input->col = 7; |
|
|
| test_htmlSkipBogusDoctype(ctxt); |
|
|
| |
| TEST_ASSERT_TRUE(ctxt->input->cur == ctxt->input->end); |
| TEST_ASSERT_EQUAL_INT(3, ctxt->input->line); |
| TEST_ASSERT_EQUAL_INT(7, ctxt->input->col); |
|
|
| htmlFreeParserCtxt(ctxt); |
| } |
|
|
| |
| void test_htmlSkipBogusDoctype_long_input(void) { |
| |
| const int xcount = 200; |
| const int total = xcount + 1; |
| char *buf = (char *)malloc((size_t)total + 1); |
| TEST_ASSERT_NOT_NULL(buf); |
| memset(buf, 'x', (size_t)xcount); |
| buf[xcount] = '>'; |
| buf[total] = '\0'; |
|
|
| htmlParserCtxtPtr ctxt = make_ctxt_from_str(buf); |
| TEST_ASSERT_NOT_NULL(ctxt); |
| TEST_ASSERT_NOT_NULL(ctxt->input); |
|
|
| ctxt->input->line = 1; |
| ctxt->input->col = 1; |
|
|
| test_htmlSkipBogusDoctype(ctxt); |
|
|
| int offset = (int)(ctxt->input->cur - ctxt->input->base); |
| TEST_ASSERT_EQUAL_INT(total, offset); |
| TEST_ASSERT_EQUAL_INT(1, ctxt->input->line); |
| TEST_ASSERT_EQUAL_INT(1 + total, ctxt->input->col); |
|
|
| htmlFreeParserCtxt(ctxt); |
| free(buf); |
| } |
|
|
| int main(void) { |
| UNITY_BEGIN(); |
|
|
| RUN_TEST(test_htmlSkipBogusDoctype_basic); |
| RUN_TEST(test_htmlSkipBogusDoctype_with_newlines); |
| RUN_TEST(test_htmlSkipBogusDoctype_no_gt_reaches_eof); |
| RUN_TEST(test_htmlSkipBogusDoctype_zero_avail_noop); |
| RUN_TEST(test_htmlSkipBogusDoctype_long_input); |
|
|
| return UNITY_END(); |
| } |