diff options
Diffstat (limited to 't/t_openpam_readword.c')
-rw-r--r-- | t/t_openpam_readword.c | 306 |
1 files changed, 225 insertions, 81 deletions
diff --git a/t/t_openpam_readword.c b/t/t_openpam_readword.c index d2d6bd5ffd28..767696e52a55 100644 --- a/t/t_openpam_readword.c +++ b/t/t_openpam_readword.c @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2012 Dag-Erling Smørgrav + * Copyright (c) 2012-2015 Dag-Erling Smørgrav * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -26,7 +26,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: t_openpam_readword.c 648 2013-03-05 17:54:27Z des $ + * $Id: t_openpam_readword.c 922 2017-02-19 19:28:30Z des $ */ #ifdef HAVE_CONFIG_H @@ -39,10 +39,18 @@ #include <string.h> #include <unistd.h> +#include <cryb/test.h> + #include <security/pam_appl.h> #include <security/openpam.h> -#include "t.h" +#define T_FUNC(n, d) \ + static const char *t_ ## n ## _desc = d; \ + static int t_ ## n ## _func(OPENPAM_UNUSED(char **desc), \ + OPENPAM_UNUSED(void *arg)) + +#define T(n) \ + t_add_test(&t_ ## n ## _func, NULL, t_ ## n ## _desc) /* * Read a word from the temp file and verify that the result matches our @@ -56,49 +64,49 @@ orw_expect(struct t_file *tf, const char *expected, int lines, int eof, int eol) int ch, lineno = 0; char *got; size_t len; + int ret; got = openpam_readword(tf->file, &lineno, &len); + ret = 1; if (t_ferror(tf)) err(1, "%s(): %s", __func__, tf->name); if (expected != NULL && got == NULL) { t_verbose("expected <<%s>>, got nothing\n", expected); - return (0); - } - if (expected == NULL && got != NULL) { + ret = 0; + } else if (expected == NULL && got != NULL) { t_verbose("expected nothing, got <<%s>>\n", got); - return (0); - } - if (expected != NULL && got != NULL && strcmp(expected, got) != 0) { + ret = 0; + } else if (expected != NULL && got != NULL && strcmp(expected, got) != 0) { t_verbose("expected <<%s>>, got <<%s>>\n", expected, got); - return (0); + ret = 0; } + free(got); if (lineno != lines) { t_verbose("expected to advance %d lines, advanced %d lines\n", lines, lineno); - return (0); + ret = 0; } if (eof && !t_feof(tf)) { t_verbose("expected EOF, but didn't get it\n"); - return (0); + ret = 0; } if (!eof && t_feof(tf)) { t_verbose("didn't expect EOF, but got it anyway\n"); - return (0); + ret = 0; } ch = fgetc(tf->file); if (t_ferror(tf)) err(1, "%s(): %s", __func__, tf->name); if (eol && ch != '\n') { t_verbose("expected EOL, but didn't get it\n"); - return (0); - } - if (!eol && ch == '\n') { + ret = 0; + } else if (!eol && ch == '\n') { t_verbose("didn't expect EOL, but got it anyway\n"); - return (0); + ret = 0; } if (ch != EOF) ungetc(ch, tf->file); - return (1); + return (ret); } @@ -195,6 +203,45 @@ T_FUNC(whitespace_before_comment, "whitespace before comment") return (ret); } +T_FUNC(single_quoted_comment, "single-quoted comment") +{ + struct t_file *tf; + int ret; + + tf = t_fopen(NULL); + t_fprintf(tf, " '# comment'\n"); + t_frewind(tf); + ret = orw_expect(tf, "# comment", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); + t_fclose(tf); + return (ret); +} + +T_FUNC(double_quoted_comment, "double-quoted comment") +{ + struct t_file *tf; + int ret; + + tf = t_fopen(NULL); + t_fprintf(tf, " \"# comment\"\n"); + t_frewind(tf); + ret = orw_expect(tf, "# comment", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); + t_fclose(tf); + return (ret); +} + +T_FUNC(comment_at_eof, "comment at end of file") +{ + struct t_file *tf; + int ret; + + tf = t_fopen(NULL); + t_fprintf(tf, "# comment"); + t_frewind(tf); + ret = orw_expect(tf, NULL, 0 /*lines*/, 1 /*eof*/, 0 /*eol*/); + t_fclose(tf); + return (ret); +} + /*************************************************************************** * Simple cases - no quotes or escapes @@ -414,6 +461,33 @@ T_FUNC(escaped_letter, "escaped letter") return (ret); } +T_FUNC(escaped_comment, "escaped comment") +{ + struct t_file *tf; + int ret; + + tf = t_fopen(NULL); + t_fprintf(tf, " \\# comment\n"); + t_frewind(tf); + ret = orw_expect(tf, "#", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) && + orw_expect(tf, "comment", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); + t_fclose(tf); + return (ret); +} + +T_FUNC(escape_at_eof, "escape at end of file") +{ + struct t_file *tf; + int ret; + + tf = t_fopen(NULL); + t_fprintf(tf, "z\\"); + t_frewind(tf); + ret = orw_expect(tf, NULL, 0 /*lines*/, 1 /*eof*/, 0 /*eol*/); + t_fclose(tf); + return (ret); +} + /*************************************************************************** * Quotes @@ -820,78 +894,148 @@ T_FUNC(escaped_double_quote_within_double_quotes, /*************************************************************************** + * Line continuation + */ + +T_FUNC(line_continuation_within_whitespace, "line continuation within whitespace") +{ + struct t_file *tf; + int ret; + + tf = t_fopen(NULL); + t_fprintf(tf, "hello \\\n world\n"); + t_frewind(tf); + ret = orw_expect(tf, "hello", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) && + orw_expect(tf, "world", 1 /*lines*/, 0 /*eof*/, 1 /*eol*/); + t_fclose(tf); + return (ret); +} + +T_FUNC(line_continuation_before_whitespace, "line continuation before whitespace") +{ + struct t_file *tf; + int ret; + + tf = t_fopen(NULL); + t_fprintf(tf, "hello\\\n world\n"); + t_frewind(tf); + ret = orw_expect(tf, "hello", 1 /*lines*/, 0 /*eof*/, 0 /*eol*/) && + orw_expect(tf, "world", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); + t_fclose(tf); + return (ret); +} + +T_FUNC(line_continuation_after_whitespace, "line continuation after whitespace") +{ + struct t_file *tf; + int ret; + + tf = t_fopen(NULL); + t_fprintf(tf, "hello \\\nworld\n"); + t_frewind(tf); + ret = orw_expect(tf, "hello", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) && + orw_expect(tf, "world", 1 /*lines*/, 0 /*eof*/, 1 /*eol*/); + t_fclose(tf); + return (ret); +} + +T_FUNC(line_continuation_within_word, "line continuation within word") +{ + struct t_file *tf; + int ret; + + tf = t_fopen(NULL); + t_fprintf(tf, "hello\\\nworld\n"); + t_frewind(tf); + ret = orw_expect(tf, "helloworld", 1 /*lines*/, 0 /*eof*/, 1 /*eol*/); + t_fclose(tf); + return (ret); +} + + +/*************************************************************************** * Boilerplate */ -const struct t_test *t_plan[] = { - T(empty_input), - T(empty_line), - T(single_whitespace), - T(multiple_whitespace), - T(comment), - T(whitespace_before_comment), - - T(single_word), - T(single_whitespace_before_word), - T(double_whitespace_before_word), - T(single_whitespace_after_word), - T(double_whitespace_after_word), - T(comment_after_word), - T(word_containing_hash), - T(two_words), - - T(naked_escape), - T(escaped_escape), - T(escaped_whitespace), - T(escaped_newline_before_word), - T(escaped_newline_within_word), - T(escaped_newline_after_word), - T(escaped_letter), - - T(naked_single_quote), - T(naked_double_quote), - T(empty_single_quotes), - T(empty_double_quotes), - T(single_quotes_within_double_quotes), - T(double_quotes_within_single_quotes), - T(single_quoted_whitespace), - T(double_quoted_whitespace), - T(single_quoted_words), - T(double_quoted_words), - - T(single_quote_before_word), - T(double_quote_before_word), - T(single_quote_within_word), - T(double_quote_within_word), - T(single_quote_after_word), - T(double_quote_after_word), - - T(escaped_single_quote), - T(escaped_double_quote), - T(escaped_whitespace_within_single_quotes), - T(escaped_whitespace_within_double_quotes), - T(escaped_letter_within_single_quotes), - T(escaped_letter_within_double_quotes), - T(escaped_escape_within_single_quotes), - T(escaped_escape_within_double_quotes), - T(escaped_single_quote_within_single_quotes), - T(escaped_double_quote_within_single_quotes), - T(escaped_single_quote_within_double_quotes), - T(escaped_double_quote_within_double_quotes), - - NULL -}; - -const struct t_test ** +static int t_prepare(int argc, char *argv[]) { (void)argc; (void)argv; - return (t_plan); + + T(empty_input); + T(empty_line); + T(unterminated_line); + T(single_whitespace); + T(multiple_whitespace); + T(comment); + T(whitespace_before_comment); + T(single_quoted_comment); + T(double_quoted_comment); + T(comment_at_eof); + + T(single_word); + T(single_whitespace_before_word); + T(double_whitespace_before_word); + T(single_whitespace_after_word); + T(double_whitespace_after_word); + T(comment_after_word); + T(word_containing_hash); + T(two_words); + + T(naked_escape); + T(escaped_escape); + T(escaped_whitespace); + T(escaped_newline_before_word); + T(escaped_newline_within_word); + T(escaped_newline_after_word); + T(escaped_letter); + T(escaped_comment); + T(escape_at_eof); + + T(naked_single_quote); + T(naked_double_quote); + T(empty_single_quotes); + T(empty_double_quotes); + T(single_quotes_within_double_quotes); + T(double_quotes_within_single_quotes); + T(single_quoted_whitespace); + T(double_quoted_whitespace); + T(single_quoted_words); + T(double_quoted_words); + + T(single_quote_before_word); + T(double_quote_before_word); + T(single_quote_within_word); + T(double_quote_within_word); + T(single_quote_after_word); + T(double_quote_after_word); + + T(escaped_single_quote); + T(escaped_double_quote); + T(escaped_whitespace_within_single_quotes); + T(escaped_whitespace_within_double_quotes); + T(escaped_letter_within_single_quotes); + T(escaped_letter_within_double_quotes); + T(escaped_escape_within_single_quotes); + T(escaped_escape_within_double_quotes); + T(escaped_single_quote_within_single_quotes); + T(escaped_double_quote_within_single_quotes); + T(escaped_single_quote_within_double_quotes); + T(escaped_double_quote_within_double_quotes); + + T(line_continuation_within_whitespace); + T(line_continuation_before_whitespace); + T(line_continuation_after_whitespace); + T(line_continuation_within_word); + + return (0); } -void -t_cleanup(void) +int +main(int argc, char *argv[]) { + + t_main(t_prepare, NULL, argc, argv); } |