1 /*	$NetBSD: tp_test.c,v 1.3 2014/12/10 04:38:03 christos Exp $	*/
2 
3 /*
4  * Automated Testing Framework (atf)
5  *
6  * Copyright (c) 2010 The NetBSD Foundation, Inc.
7  * All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  * 1. Redistributions of source code must retain the above copyright
13  *    notice, this list of conditions and the following disclaimer.
14  * 2. Redistributions in binary form must reproduce the above copyright
15  *    notice, this list of conditions and the following disclaimer in the
16  *    documentation and/or other materials provided with the distribution.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
19  * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
20  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
21  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22  * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
23  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
25  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
27  * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
28  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
29  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30  */
31 
32 #include <string.h>
33 #include <unistd.h>
34 
35 #include <atf-c.h>
36 
37 #include "detail/test_helpers.h"
38 
39 ATF_TC(getopt);
40 ATF_TC_HEAD(getopt, tc)
41 {
42     atf_tc_set_md_var(tc, "descr", "Checks if getopt(3) global state is "
43         "reset by the test program driver so that test cases can use "
44         "getopt(3) again");
45 }
46 ATF_TC_BODY(getopt, tc)
47 {
48     /* Provide an option that is unknown to the test program driver and
49      * one that is, together with an argument that would be swallowed by
50      * the test program option if it were recognized. */
51     int argc = 4;
52     char arg1[] = "progname";
53     char arg2[] = "-Z";
54     char arg3[] = "-s";
55     char arg4[] = "foo";
56     char *const argv[] = { arg1, arg2, arg3, arg4, NULL };
57 
58     int ch;
59     bool zflag;
60 
61     /* Given that this obviously is a test program, and that we used the
62      * same driver to start, we can test getopt(3) right here without doing
63      * any fancy stuff. */
64     zflag = false;
65     while ((ch = getopt(argc, argv, ":Z")) != -1) {
66         switch (ch) {
67         case 'Z':
68             zflag = true;
69             break;
70 
71         case '?':
72         default:
73             if (optopt != 's')
74                 atf_tc_fail("Unexpected unknown option -%c found", optopt);
75         }
76     }
77 
78     ATF_REQUIRE(zflag);
79     ATF_REQUIRE_EQ_MSG(1, argc - optind, "Invalid number of arguments left "
80         "after the call to getopt(3)");
81     ATF_CHECK_STREQ_MSG("foo", argv[optind], "The non-option argument is "
82         "invalid");
83 }
84 
85 /* ---------------------------------------------------------------------
86  * Tests cases for the header file.
87  * --------------------------------------------------------------------- */
88 
89 HEADER_TC(include, "atf-c/tp.h");
90 
91 /* ---------------------------------------------------------------------
92  * Main.
93  * --------------------------------------------------------------------- */
94 
95 ATF_TP_ADD_TCS(tp)
96 {
97     ATF_TP_ADD_TC(tp, getopt);
98 
99     /* Add the test cases for the header file. */
100     ATF_TP_ADD_TC(tp, include);
101 
102     return atf_no_error();
103 }
104