xref: /freebsd-src/contrib/openpam/t/t_openpam_readlinev.c (revision 3ba4c8c81a28de3e00ccf6d7f92c6f8e58bef456)
12f3ed619SDag-Erling Smørgrav /*-
2*49e56509SDag-Erling Smørgrav  * Copyright (c) 2012-2017 Dag-Erling Smørgrav
32f3ed619SDag-Erling Smørgrav  * All rights reserved.
42f3ed619SDag-Erling Smørgrav  *
52f3ed619SDag-Erling Smørgrav  * Redistribution and use in source and binary forms, with or without
62f3ed619SDag-Erling Smørgrav  * modification, are permitted provided that the following conditions
72f3ed619SDag-Erling Smørgrav  * are met:
82f3ed619SDag-Erling Smørgrav  * 1. Redistributions of source code must retain the above copyright
9ce77a8d6SDag-Erling Smørgrav  *    notice, this list of conditions and the following disclaimer.
102f3ed619SDag-Erling Smørgrav  * 2. Redistributions in binary form must reproduce the above copyright
112f3ed619SDag-Erling Smørgrav  *    notice, this list of conditions and the following disclaimer in the
122f3ed619SDag-Erling Smørgrav  *    documentation and/or other materials provided with the distribution.
132f3ed619SDag-Erling Smørgrav  * 3. The name of the author may not be used to endorse or promote
142f3ed619SDag-Erling Smørgrav  *    products derived from this software without specific prior written
152f3ed619SDag-Erling Smørgrav  *    permission.
162f3ed619SDag-Erling Smørgrav  *
172f3ed619SDag-Erling Smørgrav  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
182f3ed619SDag-Erling Smørgrav  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
192f3ed619SDag-Erling Smørgrav  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
202f3ed619SDag-Erling Smørgrav  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
212f3ed619SDag-Erling Smørgrav  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
222f3ed619SDag-Erling Smørgrav  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
232f3ed619SDag-Erling Smørgrav  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
242f3ed619SDag-Erling Smørgrav  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
252f3ed619SDag-Erling Smørgrav  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
262f3ed619SDag-Erling Smørgrav  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
272f3ed619SDag-Erling Smørgrav  * SUCH DAMAGE.
282f3ed619SDag-Erling Smørgrav  */
292f3ed619SDag-Erling Smørgrav 
302f3ed619SDag-Erling Smørgrav #ifdef HAVE_CONFIG_H
312f3ed619SDag-Erling Smørgrav # include "config.h"
322f3ed619SDag-Erling Smørgrav #endif
332f3ed619SDag-Erling Smørgrav 
342f3ed619SDag-Erling Smørgrav #include <err.h>
35f3b0ac34SDag-Erling Smørgrav #include <stdint.h>
362f3ed619SDag-Erling Smørgrav #include <stdio.h>
372f3ed619SDag-Erling Smørgrav #include <stdlib.h>
382f3ed619SDag-Erling Smørgrav #include <string.h>
392f3ed619SDag-Erling Smørgrav 
40f3b0ac34SDag-Erling Smørgrav #include <cryb/test.h>
41f3b0ac34SDag-Erling Smørgrav 
422f3ed619SDag-Erling Smørgrav #include <security/pam_appl.h>
432f3ed619SDag-Erling Smørgrav #include <security/openpam.h>
442f3ed619SDag-Erling Smørgrav 
452f3ed619SDag-Erling Smørgrav #include "openpam_impl.h"
46f3b0ac34SDag-Erling Smørgrav 
47f3b0ac34SDag-Erling Smørgrav #define T_FUNC(n, d)							\
48f3b0ac34SDag-Erling Smørgrav 	static const char *t_ ## n ## _desc = d;			\
49f3b0ac34SDag-Erling Smørgrav 	static int t_ ## n ## _func(OPENPAM_UNUSED(char **desc),	\
50f3b0ac34SDag-Erling Smørgrav 	    OPENPAM_UNUSED(void *arg))
51f3b0ac34SDag-Erling Smørgrav 
52f3b0ac34SDag-Erling Smørgrav #define T(n)								\
53*49e56509SDag-Erling Smørgrav 	t_add_test(&t_ ## n ## _func, NULL, "%s", t_ ## n ## _desc)
542f3ed619SDag-Erling Smørgrav 
552f3ed619SDag-Erling Smørgrav /*
562f3ed619SDag-Erling Smørgrav  * Read a line from the temp file and verify that the result matches our
572f3ed619SDag-Erling Smørgrav  * expectations: whether a line was read at all, how many and which words
582f3ed619SDag-Erling Smørgrav  * it contained, how many lines were read (in case of quoted or escaped
592f3ed619SDag-Erling Smørgrav  * newlines) and whether we reached the end of the file.
602f3ed619SDag-Erling Smørgrav  */
612f3ed619SDag-Erling Smørgrav static int
orlv_expect(struct t_file * tf,const char ** expectedv,int lines,int eof)62ce77a8d6SDag-Erling Smørgrav orlv_expect(struct t_file *tf, const char **expectedv, int lines, int eof)
632f3ed619SDag-Erling Smørgrav {
642f3ed619SDag-Erling Smørgrav 	int expectedc, gotc, i, lineno = 0;
652f3ed619SDag-Erling Smørgrav 	char **gotv;
66f3b0ac34SDag-Erling Smørgrav 	int ret;
672f3ed619SDag-Erling Smørgrav 
68f3b0ac34SDag-Erling Smørgrav 	ret = 1;
692f3ed619SDag-Erling Smørgrav 	expectedc = 0;
702f3ed619SDag-Erling Smørgrav 	if (expectedv != NULL)
712f3ed619SDag-Erling Smørgrav 		while (expectedv[expectedc] != NULL)
722f3ed619SDag-Erling Smørgrav 			++expectedc;
73ce77a8d6SDag-Erling Smørgrav 	gotv = openpam_readlinev(tf->file, &lineno, &gotc);
74ce77a8d6SDag-Erling Smørgrav 	if (t_ferror(tf))
75ce77a8d6SDag-Erling Smørgrav 		err(1, "%s(): %s", __func__, tf->name);
762f3ed619SDag-Erling Smørgrav 	if (expectedv != NULL && gotv == NULL) {
77*49e56509SDag-Erling Smørgrav 		t_printv("expected %d words, got nothing\n", expectedc);
78f3b0ac34SDag-Erling Smørgrav 		ret = 0;
79f3b0ac34SDag-Erling Smørgrav 	} else if (expectedv == NULL && gotv != NULL) {
80*49e56509SDag-Erling Smørgrav 		t_printv("expected nothing, got %d words\n", gotc);
81f3b0ac34SDag-Erling Smørgrav 		ret = 0;
82f3b0ac34SDag-Erling Smørgrav 	} else if (expectedv != NULL && gotv != NULL) {
832f3ed619SDag-Erling Smørgrav 		if (expectedc != gotc) {
84*49e56509SDag-Erling Smørgrav 			t_printv("expected %d words, got %d\n",
852f3ed619SDag-Erling Smørgrav 			    expectedc, gotc);
86f3b0ac34SDag-Erling Smørgrav 			ret = 0;
872f3ed619SDag-Erling Smørgrav 		}
882f3ed619SDag-Erling Smørgrav 		for (i = 0; i < gotc; ++i) {
892f3ed619SDag-Erling Smørgrav 			if (strcmp(expectedv[i], gotv[i]) != 0) {
90*49e56509SDag-Erling Smørgrav 				t_printv("word %d: expected <<%s>>, "
912f3ed619SDag-Erling Smørgrav 				    "got <<%s>>\n", i, expectedv[i], gotv[i]);
92f3b0ac34SDag-Erling Smørgrav 				ret = 0;
93f3b0ac34SDag-Erling Smørgrav 			}
942f3ed619SDag-Erling Smørgrav 		}
952f3ed619SDag-Erling Smørgrav 	}
962f3ed619SDag-Erling Smørgrav 	FREEV(gotc, gotv);
972f3ed619SDag-Erling Smørgrav 	if (lineno != lines) {
98*49e56509SDag-Erling Smørgrav 		t_printv("expected to advance %d lines, advanced %d lines\n",
992f3ed619SDag-Erling Smørgrav 		    lines, lineno);
100f3b0ac34SDag-Erling Smørgrav 		ret = 0;
1012f3ed619SDag-Erling Smørgrav 	}
102ce77a8d6SDag-Erling Smørgrav 	if (eof && !t_feof(tf)) {
103*49e56509SDag-Erling Smørgrav 		t_printv("expected EOF, but didn't get it\n");
104f3b0ac34SDag-Erling Smørgrav 		ret = 0;
105f3b0ac34SDag-Erling Smørgrav 	} else if (!eof && t_feof(tf)) {
106*49e56509SDag-Erling Smørgrav 		t_printv("didn't expect EOF, but got it anyway\n");
107f3b0ac34SDag-Erling Smørgrav 		ret = 0;
1082f3ed619SDag-Erling Smørgrav 	}
109f3b0ac34SDag-Erling Smørgrav 	return (ret);
1102f3ed619SDag-Erling Smørgrav }
1112f3ed619SDag-Erling Smørgrav 
1122f3ed619SDag-Erling Smørgrav 
1132f3ed619SDag-Erling Smørgrav /***************************************************************************
1142f3ed619SDag-Erling Smørgrav  * Commonly-used lines
1152f3ed619SDag-Erling Smørgrav  */
1162f3ed619SDag-Erling Smørgrav 
1172f3ed619SDag-Erling Smørgrav static const char *empty[] = {
1182f3ed619SDag-Erling Smørgrav 	NULL
1192f3ed619SDag-Erling Smørgrav };
1202f3ed619SDag-Erling Smørgrav 
1212f3ed619SDag-Erling Smørgrav static const char *hello[] = {
1222f3ed619SDag-Erling Smørgrav 	"hello",
1232f3ed619SDag-Erling Smørgrav 	NULL
1242f3ed619SDag-Erling Smørgrav };
1252f3ed619SDag-Erling Smørgrav 
1262f3ed619SDag-Erling Smørgrav static const char *hello_world[] = {
1272f3ed619SDag-Erling Smørgrav 	"hello",
1282f3ed619SDag-Erling Smørgrav 	"world",
1292f3ed619SDag-Erling Smørgrav 	NULL
1302f3ed619SDag-Erling Smørgrav };
1312f3ed619SDag-Erling Smørgrav 
132f3b0ac34SDag-Erling Smørgrav static const char *numbers[] = {
133f3b0ac34SDag-Erling Smørgrav 	"zero", "one", "two", "three", "four", "five", "six", "seven",
134f3b0ac34SDag-Erling Smørgrav 	"eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen",
135f3b0ac34SDag-Erling Smørgrav 	"fifteen", "sixteen", "seventeen", "nineteen", "twenty",
136f3b0ac34SDag-Erling Smørgrav 	"twenty-one", "twenty-two", "twenty-three", "twenty-four",
137f3b0ac34SDag-Erling Smørgrav 	"twenty-five", "twenty-six", "twenty-seven", "twenty-eight",
138f3b0ac34SDag-Erling Smørgrav 	"twenty-nine", "thirty", "thirty-one", "thirty-two", "thirty-three",
139f3b0ac34SDag-Erling Smørgrav 	"thirty-four", "thirty-five", "thirty-six", "thirty-seven",
140f3b0ac34SDag-Erling Smørgrav 	"thirty-eight", "thirty-nine", "fourty", "fourty-one", "fourty-two",
141f3b0ac34SDag-Erling Smørgrav 	"fourty-three", "fourty-four", "fourty-five", "fourty-six",
142f3b0ac34SDag-Erling Smørgrav 	"fourty-seven", "fourty-eight", "fourty-nine", "fifty", "fifty-one",
143f3b0ac34SDag-Erling Smørgrav 	"fifty-two", "fifty-three", "fifty-four", "fifty-five", "fifty-six",
144f3b0ac34SDag-Erling Smørgrav 	"fifty-seven", "fifty-eight", "fifty-nine", "sixty", "sixty-one",
145f3b0ac34SDag-Erling Smørgrav 	"sixty-two", "sixty-three",
146f3b0ac34SDag-Erling Smørgrav 	NULL
147f3b0ac34SDag-Erling Smørgrav };
148f3b0ac34SDag-Erling Smørgrav 
1492f3ed619SDag-Erling Smørgrav 
1502f3ed619SDag-Erling Smørgrav /***************************************************************************
1512f3ed619SDag-Erling Smørgrav  * Lines without words
1522f3ed619SDag-Erling Smørgrav  */
1532f3ed619SDag-Erling Smørgrav 
1542f3ed619SDag-Erling Smørgrav T_FUNC(empty_input, "empty input")
1552f3ed619SDag-Erling Smørgrav {
156ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
1572f3ed619SDag-Erling Smørgrav 	int ret;
1582f3ed619SDag-Erling Smørgrav 
159ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
160ce77a8d6SDag-Erling Smørgrav 	ret = orlv_expect(tf, NULL, 0 /*lines*/, 1 /*eof*/);
161ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
1622f3ed619SDag-Erling Smørgrav 	return (ret);
1632f3ed619SDag-Erling Smørgrav }
1642f3ed619SDag-Erling Smørgrav 
1652f3ed619SDag-Erling Smørgrav T_FUNC(empty_line, "empty line")
1662f3ed619SDag-Erling Smørgrav {
167ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
1682f3ed619SDag-Erling Smørgrav 	int ret;
1692f3ed619SDag-Erling Smørgrav 
170ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
171ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "\n");
172ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
173ce77a8d6SDag-Erling Smørgrav 	ret = orlv_expect(tf, empty, 1 /*lines*/, 0 /*eof*/);
174ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
1752f3ed619SDag-Erling Smørgrav 	return (ret);
1762f3ed619SDag-Erling Smørgrav }
1772f3ed619SDag-Erling Smørgrav 
1782f3ed619SDag-Erling Smørgrav T_FUNC(unterminated_empty_line, "unterminated empty line")
1792f3ed619SDag-Erling Smørgrav {
180ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
1812f3ed619SDag-Erling Smørgrav 	int ret;
1822f3ed619SDag-Erling Smørgrav 
183ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
184ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, " ");
185ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
186ce77a8d6SDag-Erling Smørgrav 	ret = orlv_expect(tf, NULL, 0 /*lines*/, 1 /*eof*/);
187ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
1882f3ed619SDag-Erling Smørgrav 	return (ret);
1892f3ed619SDag-Erling Smørgrav }
1902f3ed619SDag-Erling Smørgrav 
1912f3ed619SDag-Erling Smørgrav T_FUNC(whitespace, "whitespace")
1922f3ed619SDag-Erling Smørgrav {
193ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
1942f3ed619SDag-Erling Smørgrav 	int ret;
1952f3ed619SDag-Erling Smørgrav 
196ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
197ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, " \n");
198ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
199ce77a8d6SDag-Erling Smørgrav 	ret = orlv_expect(tf, empty, 1 /*lines*/, 0 /*eof*/);
200ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
2012f3ed619SDag-Erling Smørgrav 	return (ret);
2022f3ed619SDag-Erling Smørgrav }
2032f3ed619SDag-Erling Smørgrav 
2042f3ed619SDag-Erling Smørgrav T_FUNC(comment, "comment")
2052f3ed619SDag-Erling Smørgrav {
206ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
2072f3ed619SDag-Erling Smørgrav 	int ret;
2082f3ed619SDag-Erling Smørgrav 
209ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
210ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "# comment\n");
211ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
212ce77a8d6SDag-Erling Smørgrav 	ret = orlv_expect(tf, empty, 1 /*lines*/, 0 /*eof*/);
213ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
2142f3ed619SDag-Erling Smørgrav 	return (ret);
2152f3ed619SDag-Erling Smørgrav }
2162f3ed619SDag-Erling Smørgrav 
2172f3ed619SDag-Erling Smørgrav T_FUNC(whitespace_before_comment, "whitespace before comment")
2182f3ed619SDag-Erling Smørgrav {
219ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
2202f3ed619SDag-Erling Smørgrav 	int ret;
2212f3ed619SDag-Erling Smørgrav 
222ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
223ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, " # comment\n");
224ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
225ce77a8d6SDag-Erling Smørgrav 	ret = orlv_expect(tf, empty, 1 /*lines*/, 0 /*eof*/);
226ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
2272f3ed619SDag-Erling Smørgrav 	return (ret);
2282f3ed619SDag-Erling Smørgrav }
2292f3ed619SDag-Erling Smørgrav 
230f3b0ac34SDag-Erling Smørgrav T_FUNC(line_continuation_within_whitespace, "line continuation within whitespace")
231f3b0ac34SDag-Erling Smørgrav {
232f3b0ac34SDag-Erling Smørgrav 	struct t_file *tf;
233f3b0ac34SDag-Erling Smørgrav 	int ret;
234f3b0ac34SDag-Erling Smørgrav 
235f3b0ac34SDag-Erling Smørgrav 	tf = t_fopen(NULL);
236f3b0ac34SDag-Erling Smørgrav 	t_fprintf(tf, "%s \\\n %s\n", hello_world[0], hello_world[1]);
237f3b0ac34SDag-Erling Smørgrav 	t_frewind(tf);
238f3b0ac34SDag-Erling Smørgrav 	ret = orlv_expect(tf, hello_world, 2 /*lines*/, 0 /*eof*/) &&
239f3b0ac34SDag-Erling Smørgrav 	    orlv_expect(tf, NULL, 0 /*lines*/, 1 /*eof*/);
240f3b0ac34SDag-Erling Smørgrav 	t_fclose(tf);
241f3b0ac34SDag-Erling Smørgrav 	return (ret);
242f3b0ac34SDag-Erling Smørgrav }
243f3b0ac34SDag-Erling Smørgrav 
2442f3ed619SDag-Erling Smørgrav 
2452f3ed619SDag-Erling Smørgrav /***************************************************************************
2462f3ed619SDag-Erling Smørgrav  * Simple words
2472f3ed619SDag-Erling Smørgrav  */
2482f3ed619SDag-Erling Smørgrav 
2492f3ed619SDag-Erling Smørgrav T_FUNC(one_word, "one word")
2502f3ed619SDag-Erling Smørgrav {
251ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
2522f3ed619SDag-Erling Smørgrav 	int ret;
2532f3ed619SDag-Erling Smørgrav 
254ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
255ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "hello\n");
256ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
257ce77a8d6SDag-Erling Smørgrav 	ret = orlv_expect(tf, hello, 1 /*lines*/, 0 /*eof*/);
258ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
2592f3ed619SDag-Erling Smørgrav 	return (ret);
2602f3ed619SDag-Erling Smørgrav }
2612f3ed619SDag-Erling Smørgrav 
2622f3ed619SDag-Erling Smørgrav T_FUNC(two_words, "two words")
2632f3ed619SDag-Erling Smørgrav {
264ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
2652f3ed619SDag-Erling Smørgrav 	int ret;
2662f3ed619SDag-Erling Smørgrav 
267ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
268ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "hello world\n");
269ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
270ce77a8d6SDag-Erling Smørgrav 	ret = orlv_expect(tf, hello_world, 1 /*lines*/, 0 /*eof*/);
271ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
2722f3ed619SDag-Erling Smørgrav 	return (ret);
2732f3ed619SDag-Erling Smørgrav }
2742f3ed619SDag-Erling Smørgrav 
275f3b0ac34SDag-Erling Smørgrav T_FUNC(many_words, "many words")
276f3b0ac34SDag-Erling Smørgrav {
277f3b0ac34SDag-Erling Smørgrav 	struct t_file *tf;
278f3b0ac34SDag-Erling Smørgrav 	const char **word;
279f3b0ac34SDag-Erling Smørgrav 	int ret;
280f3b0ac34SDag-Erling Smørgrav 
281f3b0ac34SDag-Erling Smørgrav 	tf = t_fopen(NULL);
282f3b0ac34SDag-Erling Smørgrav 	for (word = numbers; *word; ++word)
283f3b0ac34SDag-Erling Smørgrav 		t_fprintf(tf, " %s", *word);
284f3b0ac34SDag-Erling Smørgrav 	t_fprintf(tf, "\n");
285f3b0ac34SDag-Erling Smørgrav 	t_frewind(tf);
286f3b0ac34SDag-Erling Smørgrav 	ret = orlv_expect(tf, numbers, 1 /*lines*/, 0 /*eof*/);
287f3b0ac34SDag-Erling Smørgrav 	t_fclose(tf);
288f3b0ac34SDag-Erling Smørgrav 	return (ret);
289f3b0ac34SDag-Erling Smørgrav }
290f3b0ac34SDag-Erling Smørgrav 
2912f3ed619SDag-Erling Smørgrav T_FUNC(unterminated_line, "unterminated line")
2922f3ed619SDag-Erling Smørgrav {
293ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
2942f3ed619SDag-Erling Smørgrav 	int ret;
2952f3ed619SDag-Erling Smørgrav 
296ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
297ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "hello world");
298ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
299ce77a8d6SDag-Erling Smørgrav 	ret = orlv_expect(tf, hello_world, 0 /*lines*/, 1 /*eof*/);
300ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
3012f3ed619SDag-Erling Smørgrav 	return (ret);
3022f3ed619SDag-Erling Smørgrav }
3032f3ed619SDag-Erling Smørgrav 
3042f3ed619SDag-Erling Smørgrav 
3052f3ed619SDag-Erling Smørgrav /***************************************************************************
3062f3ed619SDag-Erling Smørgrav  * Boilerplate
3072f3ed619SDag-Erling Smørgrav  */
3082f3ed619SDag-Erling Smørgrav 
309f3b0ac34SDag-Erling Smørgrav static int
t_prepare(int argc,char * argv[])3102f3ed619SDag-Erling Smørgrav t_prepare(int argc, char *argv[])
3112f3ed619SDag-Erling Smørgrav {
3122f3ed619SDag-Erling Smørgrav 
3132f3ed619SDag-Erling Smørgrav 	(void)argc;
3142f3ed619SDag-Erling Smørgrav 	(void)argv;
315f3b0ac34SDag-Erling Smørgrav 
316f3b0ac34SDag-Erling Smørgrav 	T(empty_input);
317f3b0ac34SDag-Erling Smørgrav 	T(empty_line);
318f3b0ac34SDag-Erling Smørgrav 	T(unterminated_empty_line);
319f3b0ac34SDag-Erling Smørgrav 	T(whitespace);
320f3b0ac34SDag-Erling Smørgrav 	T(comment);
321f3b0ac34SDag-Erling Smørgrav 	T(whitespace_before_comment);
322f3b0ac34SDag-Erling Smørgrav 	T(line_continuation_within_whitespace);
323f3b0ac34SDag-Erling Smørgrav 
324f3b0ac34SDag-Erling Smørgrav 	T(one_word);
325f3b0ac34SDag-Erling Smørgrav 	T(two_words);
326f3b0ac34SDag-Erling Smørgrav 	T(many_words);
327f3b0ac34SDag-Erling Smørgrav 	T(unterminated_line);
328f3b0ac34SDag-Erling Smørgrav 
329f3b0ac34SDag-Erling Smørgrav 	return (0);
3302f3ed619SDag-Erling Smørgrav }
3312f3ed619SDag-Erling Smørgrav 
332f3b0ac34SDag-Erling Smørgrav int
main(int argc,char * argv[])333f3b0ac34SDag-Erling Smørgrav main(int argc, char *argv[])
3342f3ed619SDag-Erling Smørgrav {
335f3b0ac34SDag-Erling Smørgrav 
336f3b0ac34SDag-Erling Smørgrav 	t_main(t_prepare, NULL, argc, argv);
3372f3ed619SDag-Erling Smørgrav }
338