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