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 28 extern "C" { 29 #include <unistd.h> 30 } 31 32 #include <atf-c++.hpp> 33 34 class getopt_app : public atf::application::app { 35 public: 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 78 ATF_TEST_CASE_WITHOUT_HEAD(getopt); 79 ATF_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 87 ATF_INIT_TEST_CASES(tcs) 88 { 89 ATF_ADD_TEST_CASE(tcs, getopt); 90 } 91