summaryrefslogtreecommitdiff
path: root/t/t_openpam_readword.c
diff options
context:
space:
mode:
Diffstat (limited to 't/t_openpam_readword.c')
-rw-r--r--t/t_openpam_readword.c306
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);
}