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