/* * test_validator.c * * Copyright 2022 Jonathan Schöbel <jonathan@Ubermos-2019> * * 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> /* test static method */ #define static /* lower UINT_MAX as we try to reach it */ #include <limits.h> #define UINT_MAX 20 #include "macro.h" #include "error.h" /* C file is needed, because we wan't to override UINT_MAX and static */ #include "validator.c" START_TEST(test_validator) { struct SH_Error error; struct SH_Validator * validator; validator = SH_Validator_new (NULL); ck_assert_int_ne ((long int) validator, (long int) NULL); SH_Validator_free (validator, NULL); error.type = UNDEFINED; validator = SH_Validator_new (&error); ck_assert_int_ne ((long int) validator, (long int) NULL); ck_assert_int_eq (error.type, SUCCESS); error.type = UNDEFINED; SH_Validator_free (validator, &error); ck_assert_int_eq (error.type, SUCCESS); } END_TEST START_TEST(test_validator_tag) { struct SH_Error error; struct SH_Validator * validator; const char * tag1 = "html"; const char * tag2 = "head"; const char * tag3 = "body"; const char * tag4 = "link"; const char * tag5 = "main"; const char * tag6 = "article"; char * tagN; tag_t tag; tag_t tag_return; bool check; validator = SH_Validator_new (NULL); /* success without error */ tag = SH_Validator_register_tag (validator, tag1, NULL); ck_assert_int_eq (tag, 1); 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); tag_return = SH_Validator_get_tag (validator, tag1); ck_assert_int_eq (tag_return, tag); /* retry without error */ tag_return = SH_Validator_register_tag (validator, tag1, NULL); ck_assert_int_eq (tag_return, 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); /* fail without error */ /* make method fail by filling with garbage until * upper boundary is reached */ /* ensure enough space inside string*/ /* log10 +1 = number length */ /* +3 "tag" */ /* +1 NULL */ /* = +5 */ tagN = calloc (((int) floor (log10 ((double) UINT_MAX))) + 5, sizeof (char)); /* fill with garbage */ while (validator->tag_n != UINT_MAX) { printf ("tag%d\n", validator->tag_n); sprintf (tagN, "tag%d", validator->tag_n); SH_Validator_register_tag (validator, tagN, NULL); } free (tagN); tag = SH_Validator_register_tag (validator, tag2, NULL); ck_assert_int_eq (tag, TAG_ERR); ck_assert_int_eq (validator->tag_n, UINT_MAX); ck_assert_int_eq (validator->last_tag, (tag_t) UINT_MAX); tag_return = SH_Validator_get_tag (validator, tag2); ck_assert_int_eq (tag_return, TAG_ERR); /* fail2 without error */ validator->tag_n = 1; validator->last_tag = TAG_MAX; tag = SH_Validator_register_tag (validator, tag3, NULL); ck_assert_int_eq (tag, TAG_ERR); ck_assert_int_eq (validator->tag_n, 1); ck_assert_int_eq (validator->last_tag, TAG_MAX); tag_return = SH_Validator_get_tag (validator, tag3); ck_assert_int_eq (tag_return, TAG_ERR); /* also free garbage created for overflow test */ validator->tag_n = UINT_MAX; /* check tag */ check = SH_Validator_check_tag (validator, tag1); ck_assert_int_eq (check, TRUE); check = SH_Validator_check_tag (validator, tag2); ck_assert_int_eq (check, FALSE); check = SH_Validator_check_tag (validator, tag3); ck_assert_int_eq (check, FALSE); SH_Validator_free (validator, NULL); validator = SH_Validator_new (NULL); /* success with error */ validator->last_tag = 1; error.type = UNDEFINED; tag = SH_Validator_register_tag (validator, tag4, &error); ck_assert_int_eq (tag, 2); ck_assert_int_eq (error.type, SUCCESS); ck_assert_int_eq (validator->tag_n, 2); ck_assert_int_eq (validator->last_tag, tag); ck_assert_int_eq (validator->tags[1].id, tag); ck_assert_str_eq (validator->tags[1].name, tag4); tag_return = SH_Validator_get_tag (validator, tag4); ck_assert_int_eq (tag_return, tag); /* fail with error */ /* make method fail by filling with garbage until * upper boundary is reached */ /* ensure enough space inside string*/ /* log10 +1 = number length */ /* +3 "tag" */ /* +1 NULL */ /* = +5 */ tagN = calloc (((int) floor (log10 ((double) UINT_MAX))) + 5, sizeof (char)); /* fill with garbage */ while (validator->tag_n != UINT_MAX) { printf ("tag%d\n", validator->tag_n); sprintf (tagN, "tag%d", validator->tag_n); SH_Validator_register_tag (validator, tagN, NULL); } free (tagN); error.type = UNDEFINED; tag = SH_Validator_register_tag (validator, tag5, &error); ck_assert_int_eq (tag, TAG_ERR); ck_assert_int_eq (error.type, DOMAIN_ERROR); ck_assert_int_eq (validator->tag_n, UINT_MAX); ck_assert_int_eq (validator->last_tag, (tag_t) UINT_MAX); tag_return = SH_Validator_get_tag (validator, tag5); ck_assert_int_eq (tag_return, TAG_ERR); /* fail2 with error */ validator->tag_n = 2; validator->last_tag = TAG_MAX; error.type = UNDEFINED; tag = SH_Validator_register_tag (validator, tag6, &error); ck_assert_int_eq (tag, TAG_ERR); ck_assert_int_eq (error.type, DOMAIN_ERROR); ck_assert_int_eq (validator->tag_n, 2); ck_assert_int_eq (validator->last_tag, TAG_MAX); tag_return = SH_Validator_get_tag (validator, tag6); ck_assert_int_eq (tag_return, TAG_ERR); /* check tag */ check = SH_Validator_check_tag (validator, tag4); ck_assert_int_eq (check, TRUE); check = SH_Validator_check_tag (validator, tag5); ck_assert_int_eq (check, FALSE); check = SH_Validator_check_tag (validator, tag6); ck_assert_int_eq (check, FALSE); /* also free garbage created for overflow test */ validator->tag_n = UINT_MAX; SH_Validator_free (validator, NULL); } END_TEST Suite * validator_suite (void) { Suite *s; TCase *tc_core; s = suite_create ("Testsuite SeFHT Validator"); /* Core test case */ tc_core = tcase_create ("Core"); tcase_add_test (tc_core, test_validator); tcase_add_test (tc_core, test_validator_tag); suite_add_tcase (s, tc_core); return s; } int main (int argc, char **argv) { int number_failed; Suite *s; SRunner *sr; s = validator_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; }