1 // Copyright 2012 Google 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 are 6 // met: 7 // 8 // * Redistributions of source code must retain the above copyright 9 // notice, this list of conditions and the following disclaimer. 10 // * Redistributions in binary form must reproduce the above copyright 11 // notice, this list of conditions and the following disclaimer in the 12 // documentation and/or other materials provided with the distribution. 13 // * Neither the name of Google Inc. nor the names of its contributors 14 // may be used to endorse or promote products derived from this software 15 // without specific prior written permission. 16 // 17 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 20 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 21 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 22 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 29 #include <err.h> 30 #include <stdio.h> 31 #include <stdlib.h> 32 #include <string.h> 33 #include <unistd.h> 34 35 #include "defs.h" 36 37 38 /// Exit code to report internal, unexpected errors. 39 static const int EXIT_BOGUS = 123; 40 41 42 /// Test case that always fails. 43 static int 44 fail_helper(void) 45 { 46 fprintf(stdout, "First line to stdout\n"); 47 fprintf(stderr, "First line to stderr\n"); 48 return 78; 49 } 50 51 52 /// Test case that always passes. 53 static int 54 pass_helper(void) 55 { 56 fprintf(stdout, "First line to stdout\n"); 57 fprintf(stdout, "Second line to stdout\n"); 58 fprintf(stderr, "First line to stderr\n"); 59 fprintf(stderr, "Second line to stderr\n"); 60 return EXIT_SUCCESS; 61 } 62 63 64 /// Test case that always dies due to a signal and dumps core. 65 static int 66 signal_helper(void) 67 { 68 fprintf(stderr, "About to die due to SIGABRT!\n"); 69 abort(); 70 } 71 72 73 /// Test case that sleeps for a long time. 74 static int 75 sleep_helper(void) 76 { 77 sleep(300); 78 return EXIT_FAILURE; 79 } 80 81 82 /// Dispatcher for individual testers based on the HELPER environment variable. 83 /// 84 /// \param argc Number of arguments to the command. 85 /// \param unused_argv Arguments to the command. 86 /// 87 /// \return An exit code. 88 int 89 main(const int argc, char* const* const KYUA_DEFS_UNUSED_PARAM(argv)) 90 { 91 if (argc != 1) 92 errx(EXIT_BOGUS, "No arguments allowed"); 93 94 const char* helper_name = getenv("HELPER"); 95 if (helper_name == NULL) { 96 errx(EXIT_BOGUS, "Must set HELPER to the name of the desired helper"); 97 } 98 99 if (strcmp(helper_name, "fail") == 0) { 100 return fail_helper(); 101 } else if (strcmp(helper_name, "pass") == 0) { 102 return pass_helper(); 103 } else if (strcmp(helper_name, "signal") == 0) { 104 return signal_helper(); 105 } else if (strcmp(helper_name, "sleep") == 0) { 106 return sleep_helper(); 107 } else { 108 errx(EXIT_BOGUS, "Unknown helper '%s'", helper_name); 109 } 110 } 111