Skip to content
Snippets Groups Projects
Commit c18cda24 authored by Jonathan Schöbel's avatar Jonathan Schöbel
Browse files

Validator: separated tests

parent b33fae5d
No related branches found
No related tags found
No related merge requests found
......@@ -28,7 +28,7 @@ long_line_behaviour=1
long_line_column=72
[files]
current_page=35
current_page=42
FILE_NAME_0=139;None;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2FREADME;0;8
FILE_NAME_1=134;None;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2F.gitignore;0;8
FILE_NAME_2=1737;Sh;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fconfigure.ac;0;8
......@@ -71,7 +71,7 @@ FILE_NAME_38=924;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fpr
FILE_NAME_39=18;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Flog.h;0;4
FILE_NAME_40=20;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Fmacro.h;0;8
FILE_NAME_41=20;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fsrc%2Flib%2Fsefht%2Fsefht.h;0;8
FILE_NAME_42=2902;Make;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2FMakefile.am;0;8
FILE_NAME_42=702;Make;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2FMakefile.am;0;8
FILE_NAME_43=218;Sh;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2Fno_test.sh.in;0;8
FILE_NAME_44=23;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2Ftest_cms.c;0;8
FILE_NAME_45=24;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2Ftest_data.c;0;8
......@@ -81,11 +81,12 @@ FILE_NAME_48=5714;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fp
FILE_NAME_49=24;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2Ftest_attr.c;0;8
FILE_NAME_50=4221;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2Ftest_text.c;0;8
FILE_NAME_51=994;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2Ftest_text_mark.c;0;8
FILE_NAME_52=10556;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2Ftest_validator.c;0;8
FILE_NAME_53=536;None;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftodo.txt;0;8
FILE_NAME_54=201;YAML;0;EUTF-8;0;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2F.gitlab-ci.yml;0;4
FILE_NAME_55=71;Sh;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fgitlab-ci%2Fupload.sh.in;0;8
FILE_NAME_56=806;Sh;0;EUTF-8;0;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fgitlab-ci%2Frelease.sh.in;0;4
FILE_NAME_52=2177;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2Ftest_validator.c;0;8
FILE_NAME_53=10866;C;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftests%2Ftest_validator_tag.c;0;8
FILE_NAME_54=536;None;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Ftodo.txt;0;8
FILE_NAME_55=201;YAML;0;EUTF-8;0;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2F.gitlab-ci.yml;0;4
FILE_NAME_56=71;Sh;0;EUTF-8;1;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fgitlab-ci%2Fupload.sh.in;0;8
FILE_NAME_57=806;Sh;0;EUTF-8;0;1;0;%2Fhome%2Fjonathan%2FDokumente%2Fprojekte%2Fprgm%2Finternet%2Fweb%2FSeFHT%2Fgitlab-ci%2Frelease.sh.in;0;4
[VTE]
last_dir=/home/jonathan/Documents/projects/prgm/internet/web/SeFHT/tests
......
......@@ -20,6 +20,7 @@ check_PROGRAMS += sefht_text_fragment_test
check_PROGRAMS += sefht_text_test
check_PROGRAMS += sefht_text_mark_test
check_PROGRAMS += sefht_validator_test
check_PROGRAMS += sefht_validator_tag_test
XFAIL_TESTS =
XFAIL_TESTS += sefht_fragment_test
......@@ -89,3 +90,7 @@ sefht_text_mark_test_LDADD += $(LDADD)
sefht_validator_test_SOURCES = test_validator.c
sefht_validator_test_LDADD =
sefht_validator_test_LDADD += $(LDADD)
sefht_validator_tag_test_SOURCES = test_validator_tag.c
sefht_validator_tag_test_LDADD =
sefht_validator_tag_test_LDADD += $(LDADD)
......@@ -37,16 +37,6 @@
#include "macro.h"
#include "status.h"
/* override HTML spec */
#include "validator_html.h"
const struct HTML_TAG_DEFINITION HTML_[] = {
{"html"},
{"aside"},
{"html"},
{"body"}
};
#define HTML5 HTML_
/* C file is needed, because we want to override SIZE_MAX */
#include "validator.c"
......@@ -58,9 +48,6 @@ START_TEST(test_validator_no_status)
validator = SH_Validator_new (NULL);
ck_assert_ptr_ne (NULL, validator);
ck_assert_int_eq (0, validator->tag_n);
ck_assert_int_eq (TAG_ERR, validator->last_tag);
SH_Validator_free (validator);
}
END_TEST
......@@ -75,9 +62,6 @@ START_TEST(test_validator_with_status)
ck_assert_ptr_ne (NULL, validator);
ck_assert_int_eq (status.status, SUCCESS);
ck_assert_int_eq (0, validator->tag_n);
ck_assert_int_eq (TAG_ERR, validator->last_tag);
SH_Validator_free (validator);
}
END_TEST
......@@ -90,22 +74,6 @@ START_TEST(test_validator_spec_no_status)
validator = SH_Validator_new_html5 (NULL);
ck_assert_ptr_ne (NULL, validator);
ck_assert_ptr_ne (NULL, validator->tags);
ck_assert_int_eq (3, validator->tag_n);
ck_assert_int_eq (3, validator->last_tag);
ck_assert_int_eq (1, validator->tags[0].id);
ck_assert_ptr_ne (HTML_[1].tag, validator->tags[0].name);
ck_assert_str_eq (HTML_[1].tag, validator->tags[0].name);
ck_assert_int_eq (2, validator->tags[1].id);
ck_assert_ptr_ne (HTML_[3].tag, validator->tags[1].name);
ck_assert_str_eq (HTML_[3].tag, validator->tags[1].name);
ck_assert_int_eq (3, validator->tags[2].id);
ck_assert_ptr_ne (HTML_[0].tag, validator->tags[2].name);
ck_assert_str_eq (HTML_[0].tag, validator->tags[2].name);
/* cleanup */
SH_Validator_free (validator);
}
......@@ -122,260 +90,6 @@ START_TEST(test_validator_spec_with_status)
ck_assert_ptr_ne (NULL, validator);
ck_assert_int_eq (SUCCESS, status.status);
ck_assert_ptr_ne (NULL, validator->tags);
ck_assert_int_eq (3, validator->tag_n);
ck_assert_int_eq (3, validator->last_tag);
ck_assert_int_eq (1, validator->tags[0].id);
ck_assert_ptr_ne (HTML_[1].tag, validator->tags[0].name);
ck_assert_str_eq (HTML_[1].tag, validator->tags[0].name);
ck_assert_int_eq (2, validator->tags[1].id);
ck_assert_ptr_ne (HTML_[3].tag, validator->tags[1].name);
ck_assert_str_eq (HTML_[3].tag, validator->tags[1].name);
ck_assert_int_eq (3, validator->tags[2].id);
ck_assert_ptr_ne (HTML_[0].tag, validator->tags[2].name);
ck_assert_str_eq (HTML_[0].tag, validator->tags[2].name);
/* cleanup */
SH_Validator_free (validator);
}
END_TEST
START_TEST(test_validator_tag_register_no_status)
{
struct SH_Validator * validator;
const char * tag1 = "html";
const char * tag2 = "head";
const char * tag3 = "article";
const char * tag4 = "p";
const char * tag5 = "img";
char * tagN;
Tag tag;
Tag tag_;
/* setup */
validator = SH_Validator_new (NULL);
ck_assert_ptr_ne (NULL, validator);
/* test - register */
tag = SH_Validator_register_tag (validator, tag1, NULL);
ck_assert_int_eq (1, tag);
ck_assert_int_eq (validator->tag_n, 1);
ck_assert_int_eq (validator->last_tag, tag);
ck_assert_int_eq (validator->tags[0].id, tag);
ck_assert_str_eq (validator->tags[0].name, tag1);
/* test - duplicate registration */
tag_ = SH_Validator_register_tag (validator, tag1, NULL);
ck_assert_int_eq (tag_, tag);
ck_assert_int_eq (validator->tag_n, 1);
ck_assert_int_eq (validator->last_tag, tag);
ck_assert_int_eq (validator->tags[0].id, tag);
ck_assert_str_eq (validator->tags[0].name, tag1);
/* test - order */
tag = SH_Validator_register_tag (validator, tag3, NULL);
ck_assert_int_eq (tag, 2);
tag = SH_Validator_register_tag (validator, tag4, NULL);
ck_assert_int_eq (tag, 3);
tag = SH_Validator_register_tag (validator, tag5, NULL);
ck_assert_int_eq (tag, 4);
ck_assert_int_eq (validator->tag_n, 4);
ck_assert_str_eq (validator->tags[0].name, tag3);
ck_assert_str_eq (validator->tags[1].name, tag1);
ck_assert_str_eq (validator->tags[2].name, tag5);
ck_assert_str_eq (validator->tags[3].name, tag4);
/* test - overflow detection */
/* make method fail by filling with garbage until
* upper boundary is reached */
/* ensure enough space inside string*/
/* log10 +1 = number length */
/* +3 "tag" */
/* +1 '\0' */
/* = +5 */
tagN = calloc (((int) floor (log10 ((double) SIZE_MAX))) + 5,
sizeof (char));
/* fill with garbage */
do
{
sprintf (tagN, "tag%zu", validator->tag_n);
}
while (TAG_ERR != SH_Validator_register_tag (validator, tagN, NULL));
free (tagN);
/* test overflow #1 */
tag = SH_Validator_register_tag (validator, tag2, NULL);
ck_assert_int_eq (TAG_ERR, tag);
ck_assert_int_eq (validator->tag_n, 10);
/* test overflow #2 */
validator->tag_n = 1;
validator->last_tag = TAG_MAX;
tag = SH_Validator_register_tag (validator, tag2, NULL);
ck_assert_int_eq (TAG_ERR, tag);
ck_assert_int_eq (validator->tag_n, 1);
ck_assert_int_eq (validator->last_tag, TAG_MAX);
/* cleanup */
/* also free garbage created for overflow test */
validator->tag_n = 10;
SH_Validator_free (validator);
}
START_TEST(test_validator_tag_register_with_status)
{
struct SH_Status status;
struct SH_Validator * validator;
const char * tag1 = "html";
const char * tag2 = "head";
const char * tag3 = "article";
const char * tag4 = "p";
const char * tag5 = "img";
char * tagN;
Tag tag;
Tag tag_;
/* setup */
validator = SH_Validator_new (NULL);
ck_assert_ptr_ne (NULL, validator);
/* test - register */
_status_preinit (status);
tag = SH_Validator_register_tag (validator, tag1, &status);
ck_assert_int_eq (1, tag);
ck_assert_int_eq (SUCCESS, status.status);
ck_assert_int_eq (validator->tag_n, 1);
ck_assert_int_eq (validator->last_tag, tag);
ck_assert_int_eq (validator->tags[0].id, tag);
ck_assert_str_eq (validator->tags[0].name, tag1);
/* test - duplicate registration */
_status_preinit (status);
tag_ = SH_Validator_register_tag (validator, tag1, &status);
ck_assert_int_eq (tag_, tag);
ck_assert_int_eq (SUCCESS, status.status);
ck_assert_int_eq (validator->tag_n, 1);
ck_assert_int_eq (validator->last_tag, tag);
ck_assert_int_eq (validator->tags[0].id, tag);
ck_assert_str_eq (validator->tags[0].name, tag1);
/* test - order */
_status_preinit (status);
tag = SH_Validator_register_tag (validator, tag3, &status);
ck_assert_int_eq (tag, 2);
ck_assert_int_eq (status.status, SUCCESS);
_status_preinit (status);
tag = SH_Validator_register_tag (validator, tag4, &status);
ck_assert_int_eq (tag, 3);
ck_assert_int_eq (status.status, SUCCESS);
_status_preinit (status);
tag = SH_Validator_register_tag (validator, tag5, &status);
ck_assert_int_eq (tag, 4);
ck_assert_int_eq (status.status, SUCCESS);
ck_assert_int_eq (validator->tag_n, 4);
ck_assert_str_eq (validator->tags[0].name, tag3);
ck_assert_str_eq (validator->tags[1].name, tag1);
ck_assert_str_eq (validator->tags[2].name, tag5);
ck_assert_str_eq (validator->tags[3].name, tag4);
/* test - overflow detection */
/* make method fail by filling with garbage until
* upper boundary is reached */
/* ensure enough space inside string*/
/* log10 +1 = number length */
/* +3 "tag" */
/* +1 '\0' */
/* = +5 */
tagN = calloc (((int) floor (log10 ((double) SIZE_MAX))) + 5,
sizeof (char));
/* fill with garbage */
do
{
sprintf (tagN, "tag%zu", validator->tag_n);
}
while (TAG_ERR != SH_Validator_register_tag (validator, tagN, NULL));
free (tagN);
/* test overflow #1 */
_status_preinit (status);
tag = SH_Validator_register_tag (validator, tag2, &status);
ck_assert_int_eq (TAG_ERR, tag);
ck_assert_int_eq (E_DOMAIN, status.status);
ck_assert_int_eq (validator->tag_n, 10);
/* test overflow #2 */
validator->tag_n = 1;
validator->last_tag = TAG_MAX;
_status_preinit (status);
tag = SH_Validator_register_tag (validator, tag2, &status);
ck_assert_int_eq (TAG_ERR, tag);
ck_assert_int_eq (E_DOMAIN, status.status);
ck_assert_int_eq (validator->tag_n, 1);
ck_assert_int_eq (validator->last_tag, TAG_MAX);
/* cleanup */
/* also free garbage created for overflow test */
validator->tag_n = 10;
SH_Validator_free (validator);
}
START_TEST(test_validator_tag_check)
{
struct SH_Validator * validator;
const char * tag1 = "html";
const char * tag2 = "html";
const char * tag3 = "head";
Tag tag;
bool result;
/* setup */
validator = SH_Validator_new (NULL);
ck_assert_ptr_ne (NULL, validator);
tag = SH_Validator_register_tag (validator, tag1, NULL);
ck_assert_int_ne (TAG_ERR, tag);
/* test */
result = SH_Validator_check_tag (validator, tag1);
ck_assert_int_eq (TRUE, result);
result = SH_Validator_check_tag (validator, tag2);
ck_assert_int_eq (TRUE, result);
result = SH_Validator_check_tag (validator, tag3);
ck_assert_int_eq (FALSE, result);
/* cleanup */
SH_Validator_free (validator);
}
......@@ -395,9 +109,6 @@ Suite * validator_suite (void)
tcase_add_test (tc_core, test_validator_with_status);
tcase_add_test (tc_core, test_validator_spec_no_status);
tcase_add_test (tc_core, test_validator_spec_with_status);
tcase_add_test (tc_core, test_validator_tag_register_no_status);
tcase_add_test (tc_core, test_validator_tag_register_with_status);
tcase_add_test (tc_core, test_validator_tag_check);
suite_add_tcase (s, tc_core);
return s;
......
/*
* test_validator_tag.c
*
* Copyright 2023 Jonathan Schöbel <jonathan@xn--schbel-yxa.info>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*
*
*/
#include <check.h>
#include <math.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
/* lower SIZE_MAX as we try to reach it */
#include <limits.h>
#undef SIZE_MAX
#define SIZE_MAX 10 * sizeof (struct tag_info)
#include "macro.h"
#include "status.h"
/* override HTML spec */
#include "validator_html.h"
const struct HTML_TAG_DEFINITION HTML_[] = {
{"html"},
{"aside"},
{"html"},
{"body"}
};
#define HTML5 HTML_
/* C file is needed, because we want to override SIZE_MAX */
#include "validator.c"
START_TEST(test_validator_no_status)
{
struct SH_Validator * validator;
validator = SH_Validator_new (NULL);
ck_assert_ptr_ne (NULL, validator);
ck_assert_int_eq (0, validator->tag_n);
ck_assert_int_eq (TAG_ERR, validator->last_tag);
SH_Validator_free (validator);
}
END_TEST
START_TEST(test_validator_with_status)
{
struct SH_Status status;
struct SH_Validator * validator;
_status_preinit (status);
validator = SH_Validator_new (&status);
ck_assert_ptr_ne (NULL, validator);
ck_assert_int_eq (status.status, SUCCESS);
ck_assert_int_eq (0, validator->tag_n);
ck_assert_int_eq (TAG_ERR, validator->last_tag);
SH_Validator_free (validator);
}
END_TEST
START_TEST(test_validator_spec_no_status)
{
struct SH_Validator * validator;
/* test */
validator = SH_Validator_new_html5 (NULL);
ck_assert_ptr_ne (NULL, validator);
ck_assert_ptr_ne (NULL, validator->tags);
ck_assert_int_eq (3, validator->tag_n);
ck_assert_int_eq (3, validator->last_tag);
ck_assert_int_eq (1, validator->tags[0].id);
ck_assert_ptr_ne (HTML_[1].tag, validator->tags[0].name);
ck_assert_str_eq (HTML_[1].tag, validator->tags[0].name);
ck_assert_int_eq (2, validator->tags[1].id);
ck_assert_ptr_ne (HTML_[3].tag, validator->tags[1].name);
ck_assert_str_eq (HTML_[3].tag, validator->tags[1].name);
ck_assert_int_eq (3, validator->tags[2].id);
ck_assert_ptr_ne (HTML_[0].tag, validator->tags[2].name);
ck_assert_str_eq (HTML_[0].tag, validator->tags[2].name);
/* cleanup */
SH_Validator_free (validator);
}
END_TEST
START_TEST(test_validator_spec_with_status)
{
struct SH_Status status;
struct SH_Validator * validator;
/* test */
_status_preinit (status);
validator = SH_Validator_new_html5 (&status);
ck_assert_ptr_ne (NULL, validator);
ck_assert_int_eq (SUCCESS, status.status);
ck_assert_ptr_ne (NULL, validator->tags);
ck_assert_int_eq (3, validator->tag_n);
ck_assert_int_eq (3, validator->last_tag);
ck_assert_int_eq (1, validator->tags[0].id);
ck_assert_ptr_ne (HTML_[1].tag, validator->tags[0].name);
ck_assert_str_eq (HTML_[1].tag, validator->tags[0].name);
ck_assert_int_eq (2, validator->tags[1].id);
ck_assert_ptr_ne (HTML_[3].tag, validator->tags[1].name);
ck_assert_str_eq (HTML_[3].tag, validator->tags[1].name);
ck_assert_int_eq (3, validator->tags[2].id);
ck_assert_ptr_ne (HTML_[0].tag, validator->tags[2].name);
ck_assert_str_eq (HTML_[0].tag, validator->tags[2].name);
/* cleanup */
SH_Validator_free (validator);
}
END_TEST
START_TEST(test_validator_tag_register_no_status)
{
struct SH_Validator * validator;
const char * tag1 = "html";
const char * tag2 = "head";
const char * tag3 = "article";
const char * tag4 = "p";
const char * tag5 = "img";
char * tagN;
Tag tag;
Tag tag_;
/* setup */
validator = SH_Validator_new (NULL);
ck_assert_ptr_ne (NULL, validator);
/* test - register */
tag = SH_Validator_register_tag (validator, tag1, NULL);
ck_assert_int_eq (1, tag);
ck_assert_int_eq (validator->tag_n, 1);
ck_assert_int_eq (validator->last_tag, tag);
ck_assert_int_eq (validator->tags[0].id, tag);
ck_assert_str_eq (validator->tags[0].name, tag1);
/* test - duplicate registration */
tag_ = SH_Validator_register_tag (validator, tag1, NULL);
ck_assert_int_eq (tag_, tag);
ck_assert_int_eq (validator->tag_n, 1);
ck_assert_int_eq (validator->last_tag, tag);
ck_assert_int_eq (validator->tags[0].id, tag);
ck_assert_str_eq (validator->tags[0].name, tag1);
/* test - order */
tag = SH_Validator_register_tag (validator, tag3, NULL);
ck_assert_int_eq (tag, 2);
tag = SH_Validator_register_tag (validator, tag4, NULL);
ck_assert_int_eq (tag, 3);
tag = SH_Validator_register_tag (validator, tag5, NULL);
ck_assert_int_eq (tag, 4);
ck_assert_int_eq (validator->tag_n, 4);
ck_assert_str_eq (validator->tags[0].name, tag3);
ck_assert_str_eq (validator->tags[1].name, tag1);
ck_assert_str_eq (validator->tags[2].name, tag5);
ck_assert_str_eq (validator->tags[3].name, tag4);
/* test - overflow detection */
/* make method fail by filling with garbage until
* upper boundary is reached */
/* ensure enough space inside string*/
/* log10 +1 = number length */
/* +3 "tag" */
/* +1 '\0' */
/* = +5 */
tagN = calloc (((int) floor (log10 ((double) SIZE_MAX))) + 5,
sizeof (char));
/* fill with garbage */
do
{
sprintf (tagN, "tag%zu", validator->tag_n);
}
while (TAG_ERR != SH_Validator_register_tag (validator, tagN, NULL));
free (tagN);
/* test overflow #1 */
tag = SH_Validator_register_tag (validator, tag2, NULL);
ck_assert_int_eq (TAG_ERR, tag);
ck_assert_int_eq (validator->tag_n, 10);
/* test overflow #2 */
validator->tag_n = 1;
validator->last_tag = TAG_MAX;
tag = SH_Validator_register_tag (validator, tag2, NULL);
ck_assert_int_eq (TAG_ERR, tag);
ck_assert_int_eq (validator->tag_n, 1);
ck_assert_int_eq (validator->last_tag, TAG_MAX);
/* cleanup */
/* also free garbage created for overflow test */
validator->tag_n = 10;
SH_Validator_free (validator);
}
START_TEST(test_validator_tag_register_with_status)
{
struct SH_Status status;
struct SH_Validator * validator;
const char * tag1 = "html";
const char * tag2 = "head";
const char * tag3 = "article";
const char * tag4 = "p";
const char * tag5 = "img";
char * tagN;
Tag tag;
Tag tag_;
/* setup */
validator = SH_Validator_new (NULL);
ck_assert_ptr_ne (NULL, validator);
/* test - register */
_status_preinit (status);
tag = SH_Validator_register_tag (validator, tag1, &status);
ck_assert_int_eq (1, tag);
ck_assert_int_eq (SUCCESS, status.status);
ck_assert_int_eq (validator->tag_n, 1);
ck_assert_int_eq (validator->last_tag, tag);
ck_assert_int_eq (validator->tags[0].id, tag);
ck_assert_str_eq (validator->tags[0].name, tag1);
/* test - duplicate registration */
_status_preinit (status);
tag_ = SH_Validator_register_tag (validator, tag1, &status);
ck_assert_int_eq (tag_, tag);
ck_assert_int_eq (SUCCESS, status.status);
ck_assert_int_eq (validator->tag_n, 1);
ck_assert_int_eq (validator->last_tag, tag);
ck_assert_int_eq (validator->tags[0].id, tag);
ck_assert_str_eq (validator->tags[0].name, tag1);
/* test - order */
_status_preinit (status);
tag = SH_Validator_register_tag (validator, tag3, &status);
ck_assert_int_eq (tag, 2);
ck_assert_int_eq (status.status, SUCCESS);
_status_preinit (status);
tag = SH_Validator_register_tag (validator, tag4, &status);
ck_assert_int_eq (tag, 3);
ck_assert_int_eq (status.status, SUCCESS);
_status_preinit (status);
tag = SH_Validator_register_tag (validator, tag5, &status);
ck_assert_int_eq (tag, 4);
ck_assert_int_eq (status.status, SUCCESS);
ck_assert_int_eq (validator->tag_n, 4);
ck_assert_str_eq (validator->tags[0].name, tag3);
ck_assert_str_eq (validator->tags[1].name, tag1);
ck_assert_str_eq (validator->tags[2].name, tag5);
ck_assert_str_eq (validator->tags[3].name, tag4);
/* test - overflow detection */
/* make method fail by filling with garbage until
* upper boundary is reached */
/* ensure enough space inside string*/
/* log10 +1 = number length */
/* +3 "tag" */
/* +1 '\0' */
/* = +5 */
tagN = calloc (((int) floor (log10 ((double) SIZE_MAX))) + 5,
sizeof (char));
/* fill with garbage */
do
{
sprintf (tagN, "tag%zu", validator->tag_n);
}
while (TAG_ERR != SH_Validator_register_tag (validator, tagN, NULL));
free (tagN);
/* test overflow #1 */
_status_preinit (status);
tag = SH_Validator_register_tag (validator, tag2, &status);
ck_assert_int_eq (TAG_ERR, tag);
ck_assert_int_eq (E_DOMAIN, status.status);
ck_assert_int_eq (validator->tag_n, 10);
/* test overflow #2 */
validator->tag_n = 1;
validator->last_tag = TAG_MAX;
_status_preinit (status);
tag = SH_Validator_register_tag (validator, tag2, &status);
ck_assert_int_eq (TAG_ERR, tag);
ck_assert_int_eq (E_DOMAIN, status.status);
ck_assert_int_eq (validator->tag_n, 1);
ck_assert_int_eq (validator->last_tag, TAG_MAX);
/* cleanup */
/* also free garbage created for overflow test */
validator->tag_n = 10;
SH_Validator_free (validator);
}
START_TEST(test_validator_tag_check)
{
struct SH_Validator * validator;
const char * tag1 = "html";
const char * tag2 = "html";
const char * tag3 = "head";
Tag tag;
bool result;
/* setup */
validator = SH_Validator_new (NULL);
ck_assert_ptr_ne (NULL, validator);
tag = SH_Validator_register_tag (validator, tag1, NULL);
ck_assert_int_ne (TAG_ERR, tag);
/* test */
result = SH_Validator_check_tag (validator, tag1);
ck_assert_int_eq (TRUE, result);
result = SH_Validator_check_tag (validator, tag2);
ck_assert_int_eq (TRUE, result);
result = SH_Validator_check_tag (validator, tag3);
ck_assert_int_eq (FALSE, result);
/* cleanup */
SH_Validator_free (validator);
}
END_TEST
Suite * test_suite (void)
{
Suite *s;
TCase *tc_core;
s = suite_create ("Testsuite SeFHT Validator Tag");
/* Core test case */
tc_core = tcase_create ("Core");
tcase_add_test (tc_core, test_validator_no_status);
tcase_add_test (tc_core, test_validator_with_status);
tcase_add_test (tc_core, test_validator_spec_no_status);
tcase_add_test (tc_core, test_validator_spec_with_status);
tcase_add_test (tc_core, test_validator_tag_register_no_status);
tcase_add_test (tc_core, test_validator_tag_register_with_status);
tcase_add_test (tc_core, test_validator_tag_check);
suite_add_tcase (s, tc_core);
return s;
}
int main (void)
{
int number_failed;
Suite *s;
SRunner *sr;
s = test_suite ();
sr = srunner_create (s);
srunner_run_all (sr, CK_NORMAL);
number_failed = srunner_ntests_failed (sr);
srunner_free (sr);
return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment