1// Copyright (c) 2009 The NetBSD Foundation, Inc.
2// All rights reserved.
3//
4// Redistribution and use in source and binary forms, with or without
5// modification, are permitted provided that the following conditions
6// are met:
7// 1. Redistributions of source code must retain the above copyright
8//    notice, this list of conditions and the following disclaimer.
9// 2. Redistributions in binary form must reproduce the above copyright
10//    notice, this list of conditions and the following disclaimer in the
11//    documentation and/or other materials provided with the distribution.
12//
13// THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
14// CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
15// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
16// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17// IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
18// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
20// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
22// IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
23// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
24// IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25
26#include "atf-c++/detail/application.hpp"
27
28extern "C" {
29#include <unistd.h>
30}
31
32#include <atf-c++.hpp>
33
34class getopt_app : public atf::application::app {
35public:
36    getopt_app(void) : app("description", "manpage") {}
37
38    int main(void)
39    {
40        // Provide an option that is unknown to the application driver and
41        // one that is, together with an argument that would be swallowed by
42        // the test program option if it were recognized.
43        int argc = 4;
44        char arg1[] = "progname";
45        char arg2[] = "-Z";
46        char arg3[] = "-s";
47        char arg4[] = "foo";
48        char *const argv[] = { arg1, arg2, arg3, arg4, NULL };
49
50        int ch;
51        bool zflag;
52
53        // Given that this obviously is an application, and that we used the
54        // same driver to start, we can test getopt(3) right here without doing
55        // any fancy stuff.
56        zflag = false;
57        while ((ch = ::getopt(argc, argv, ":Z")) != -1) {
58            switch (ch) {
59            case 'Z':
60                zflag = true;
61                break;
62
63            case '?':
64            default:
65                if (optopt != 's')
66                    ATF_FAIL("Unexpected unknown option found");
67            }
68        }
69
70        ATF_REQUIRE(zflag);
71        ATF_REQUIRE_EQ(1, argc - optind);
72        ATF_REQUIRE_EQ(std::string("foo"), argv[optind]);
73
74        return 0;
75    }
76};
77
78ATF_TEST_CASE_WITHOUT_HEAD(getopt);
79ATF_TEST_CASE_BODY(getopt)
80{
81    int argc = 1;
82    char arg1[] = "progname";
83    char *const argv[] = { arg1, NULL };
84    ATF_REQUIRE_EQ(0, getopt_app().run(argc, argv));
85}
86
87ATF_INIT_TEST_CASES(tcs)
88{
89    ATF_ADD_TEST_CASE(tcs, getopt);
90}
91