1 1.1 jmmv // Copyright 2012 Google Inc. 2 1.1 jmmv // All rights reserved. 3 1.1 jmmv // 4 1.1 jmmv // Redistribution and use in source and binary forms, with or without 5 1.1 jmmv // modification, are permitted provided that the following conditions are 6 1.1 jmmv // met: 7 1.1 jmmv // 8 1.1 jmmv // * Redistributions of source code must retain the above copyright 9 1.1 jmmv // notice, this list of conditions and the following disclaimer. 10 1.1 jmmv // * Redistributions in binary form must reproduce the above copyright 11 1.1 jmmv // notice, this list of conditions and the following disclaimer in the 12 1.1 jmmv // documentation and/or other materials provided with the distribution. 13 1.1 jmmv // * Neither the name of Google Inc. nor the names of its contributors 14 1.1 jmmv // may be used to endorse or promote products derived from this software 15 1.1 jmmv // without specific prior written permission. 16 1.1 jmmv // 17 1.1 jmmv // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18 1.1 jmmv // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19 1.1 jmmv // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 20 1.1 jmmv // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 21 1.1 jmmv // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 22 1.1 jmmv // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23 1.1 jmmv // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24 1.1 jmmv // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 1.1 jmmv // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 1.1 jmmv // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 1.1 jmmv // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 1.1 jmmv 29 1.1 jmmv #include <stdlib.h> 30 1.1 jmmv 31 1.1 jmmv #include <atf-c.h> 32 1.1 jmmv 33 1.1 jmmv #define INTERFACE "atf" 34 1.1 jmmv #include "common_inttest.h" 35 1.1 jmmv 36 1.1 jmmv 37 1.1 jmmv ATF_TC(list__ok); 38 1.1 jmmv ATF_TC_HEAD(list__ok, tc) { setup(tc, true); } 39 1.1 jmmv ATF_TC_BODY(list__ok, tc) 40 1.1 jmmv { 41 1.1 jmmv char* helpers = helpers_path(tc); 42 1.1 jmmv check(EXIT_SUCCESS, 43 1.1 jmmv "test_case{name='fail'}\n" 44 1.1 jmmv "test_case{name='pass'}\n" 45 1.1 jmmv "test_case{name='signal'}\n" 46 1.1 jmmv "test_case{name='sleep'}\n" 47 1.1 jmmv "test_case{name='cleanup_check_work_directory', has_cleanup='true'}\n" 48 1.1 jmmv "test_case{name='cleanup_fail', has_cleanup='true'}\n" 49 1.1 jmmv "test_case{name='cleanup_signal', has_cleanup='true'}\n" 50 1.1 jmmv "test_case{name='cleanup_sleep', has_cleanup='true'}\n" 51 1.1 jmmv "test_case{name='body_and_cleanup_fail', has_cleanup='true'}\n" 52 1.1 jmmv "test_case{name='print_config', has_cleanup='true'}\n", 53 1.1 jmmv "", 54 1.1 jmmv "list", helpers, NULL); 55 1.1 jmmv free(helpers); 56 1.1 jmmv } 57 1.1 jmmv 58 1.1 jmmv 59 1.1 jmmv ATF_TC(test__pass); 60 1.1 jmmv ATF_TC_HEAD(test__pass, tc) { setup(tc, true); } 61 1.1 jmmv ATF_TC_BODY(test__pass, tc) 62 1.1 jmmv { 63 1.1 jmmv char* helpers = helpers_path(tc); 64 1.1 jmmv check(EXIT_SUCCESS, 65 1.1 jmmv "First line to stdout\nSecond line to stdout\n", 66 1.1 jmmv "First line to stderr\nSecond line to stderr\n", 67 1.1 jmmv "test", helpers, "pass", "test-result", NULL); 68 1.1 jmmv free(helpers); 69 1.1 jmmv 70 1.1 jmmv ATF_REQUIRE(atf_utils_compare_file("test-result", "passed\n")); 71 1.1 jmmv } 72 1.1 jmmv 73 1.1 jmmv 74 1.1 jmmv ATF_TC(test__fail); 75 1.1 jmmv ATF_TC_HEAD(test__fail, tc) { setup(tc, true); } 76 1.1 jmmv ATF_TC_BODY(test__fail, tc) 77 1.1 jmmv { 78 1.1 jmmv char* helpers = helpers_path(tc); 79 1.1 jmmv check(EXIT_FAILURE, "First line to stdout\n", "First line to stderr\n", 80 1.1 jmmv "test", helpers, "fail", "test-result", NULL); 81 1.1 jmmv free(helpers); 82 1.1 jmmv 83 1.1 jmmv ATF_REQUIRE(atf_utils_compare_file("test-result", 84 1.1 jmmv "failed: This is the failure message\n")); 85 1.1 jmmv } 86 1.1 jmmv 87 1.1 jmmv 88 1.1 jmmv ATF_TC(test__crash); 89 1.1 jmmv ATF_TC_HEAD(test__crash, tc) { setup(tc, true); } 90 1.1 jmmv ATF_TC_BODY(test__crash, tc) 91 1.1 jmmv { 92 1.1 jmmv char* helpers = helpers_path(tc); 93 1.1 jmmv check(EXIT_FAILURE, "", "save:crash.err", 94 1.1 jmmv "test", helpers, "signal", "test-result", NULL); 95 1.1 jmmv free(helpers); 96 1.1 jmmv 97 1.1 jmmv ATF_REQUIRE(atf_utils_compare_file("test-result", 98 1.1 jmmv "broken: Premature exit; test case received signal 6 (core dumped)\n")); 99 1.1 jmmv 100 1.1 jmmv ATF_REQUIRE(atf_utils_grep_file("About to die due to SIGABRT!", 101 1.1 jmmv "crash.err")); 102 1.1 jmmv ATF_REQUIRE(atf_utils_grep_file("attempting to gather stack trace", 103 1.1 jmmv "crash.err")); 104 1.1 jmmv } 105 1.1 jmmv 106 1.1 jmmv 107 1.1 jmmv ATF_TC(test__timeout); 108 1.1 jmmv ATF_TC_HEAD(test__timeout, tc) { setup(tc, true); } 109 1.1 jmmv ATF_TC_BODY(test__timeout, tc) 110 1.1 jmmv { 111 1.1 jmmv char* helpers = helpers_path(tc); 112 1.1 jmmv check(EXIT_FAILURE, "", "Subprocess timed out; sending KILL signal...\n", 113 1.1 jmmv "-t1", "test", helpers, "sleep", "test-result", NULL); 114 1.1 jmmv free(helpers); 115 1.1 jmmv 116 1.1 jmmv ATF_REQUIRE(atf_utils_compare_file("test-result", 117 1.1 jmmv "broken: Test case body timed out\n")); 118 1.1 jmmv } 119 1.1 jmmv 120 1.1 jmmv 121 1.1 jmmv ATF_TC(test__result_priority); 122 1.1 jmmv ATF_TC_HEAD(test__result_priority, tc) { setup(tc, true); } 123 1.1 jmmv ATF_TC_BODY(test__result_priority, tc) 124 1.1 jmmv { 125 1.1 jmmv char* helpers = helpers_path(tc); 126 1.1 jmmv check(EXIT_FAILURE, "Killing cleanup\n", "", 127 1.1 jmmv "test", "-vhas.cleanup=true", helpers, "body_and_cleanup_fail", 128 1.1 jmmv "test-result", NULL); 129 1.1 jmmv free(helpers); 130 1.1 jmmv 131 1.1 jmmv ATF_REQUIRE(atf_utils_compare_file("test-result", "failed: Body fails\n")); 132 1.1 jmmv } 133 1.1 jmmv 134 1.1 jmmv 135 1.1 jmmv ATF_TC(test__cleanup__ok); 136 1.1 jmmv ATF_TC_HEAD(test__cleanup__ok, tc) { setup(tc, true); } 137 1.1 jmmv ATF_TC_BODY(test__cleanup__ok, tc) 138 1.1 jmmv { 139 1.1 jmmv char* helpers = helpers_path(tc); 140 1.1 jmmv check(EXIT_SUCCESS, 141 1.1 jmmv "Body stdout\nCleanup stdout\n" 142 1.1 jmmv "Cleanup properly ran in the same directory as the body\n", 143 1.1 jmmv "Body stderr\nCleanup stderr\n", 144 1.1 jmmv "test", "-vhas.cleanup=true", helpers, "cleanup_check_work_directory", 145 1.1 jmmv "test-result", NULL); 146 1.1 jmmv free(helpers); 147 1.1 jmmv 148 1.1 jmmv ATF_REQUIRE(atf_utils_compare_file("test-result", "passed\n")); 149 1.1 jmmv } 150 1.1 jmmv 151 1.1 jmmv 152 1.1 jmmv ATF_TC(test__cleanup__fail); 153 1.1 jmmv ATF_TC_HEAD(test__cleanup__fail, tc) { setup(tc, true); } 154 1.1 jmmv ATF_TC_BODY(test__cleanup__fail, tc) 155 1.1 jmmv { 156 1.1 jmmv char* helpers = helpers_path(tc); 157 1.1 jmmv check(EXIT_FAILURE, "", "", 158 1.1 jmmv "test", "-vhas.cleanup=true", helpers, "cleanup_fail", "test-result", 159 1.1 jmmv NULL); 160 1.1 jmmv free(helpers); 161 1.1 jmmv 162 1.1 jmmv ATF_REQUIRE(atf_utils_compare_file("test-result", "broken: Test case " 163 1.1 jmmv "cleanup exited with code 1\n")); 164 1.1 jmmv } 165 1.1 jmmv 166 1.1 jmmv 167 1.1 jmmv ATF_TC(test__cleanup__crash); 168 1.1 jmmv ATF_TC_HEAD(test__cleanup__crash, tc) { setup(tc, true); } 169 1.1 jmmv ATF_TC_BODY(test__cleanup__crash, tc) 170 1.1 jmmv { 171 1.1 jmmv char* helpers = helpers_path(tc); 172 1.1 jmmv check(EXIT_FAILURE, "", "save:crash.err", 173 1.1 jmmv "test", "-vhas.cleanup=true", helpers, "cleanup_signal", 174 1.1 jmmv "test-result", NULL); 175 1.1 jmmv free(helpers); 176 1.1 jmmv 177 1.1 jmmv ATF_REQUIRE(atf_utils_compare_file("test-result", 178 1.1 jmmv "broken: Test case cleanup received signal 6 (core dumped)\n")); 179 1.1 jmmv 180 1.1 jmmv ATF_REQUIRE(atf_utils_grep_file("About to die due to SIGABRT!", 181 1.1 jmmv "crash.err")); 182 1.1 jmmv ATF_REQUIRE(atf_utils_grep_file("attempting to gather stack trace", 183 1.1 jmmv "crash.err")); 184 1.1 jmmv } 185 1.1 jmmv 186 1.1 jmmv 187 1.1 jmmv ATF_TC(test__cleanup__timeout); 188 1.1 jmmv ATF_TC_HEAD(test__cleanup__timeout, tc) { setup(tc, true); } 189 1.1 jmmv ATF_TC_BODY(test__cleanup__timeout, tc) 190 1.1 jmmv { 191 1.1 jmmv char* helpers = helpers_path(tc); 192 1.1 jmmv check(EXIT_FAILURE, "", "Subprocess timed out; sending KILL signal...\n", 193 1.1 jmmv "-t1", "test", "-vhas.cleanup=true", helpers, "cleanup_sleep", 194 1.1 jmmv "test-result", NULL); 195 1.1 jmmv free(helpers); 196 1.1 jmmv 197 1.1 jmmv ATF_REQUIRE(atf_utils_compare_file("test-result", "broken: Test case " 198 1.1 jmmv "cleanup timed out\n")); 199 1.1 jmmv } 200 1.1 jmmv 201 1.1 jmmv 202 1.1 jmmv ATF_TC(test__config__builtin); 203 1.1 jmmv ATF_TC_HEAD(test__config__builtin, tc) { setup(tc, true); } 204 1.1 jmmv ATF_TC_BODY(test__config__builtin, tc) 205 1.1 jmmv { 206 1.1 jmmv char* helpers = helpers_path(tc); 207 1.1 jmmv check(EXIT_SUCCESS, "", "", 208 1.1 jmmv "test", helpers, "print_config", "test-result", NULL); 209 1.1 jmmv free(helpers); 210 1.1 jmmv 211 1.1 jmmv ATF_REQUIRE(atf_utils_compare_file("test-result", "passed\n")); 212 1.1 jmmv } 213 1.1 jmmv 214 1.1 jmmv 215 1.1 jmmv ATF_TC(test__config__custom); 216 1.1 jmmv ATF_TC_HEAD(test__config__custom, tc) { setup(tc, true); } 217 1.1 jmmv ATF_TC_BODY(test__config__custom, tc) 218 1.1 jmmv { 219 1.1 jmmv char* helpers = helpers_path(tc); 220 1.1 jmmv check(EXIT_SUCCESS, 221 1.1 jmmv "body my-var1 value1\n" 222 1.1 jmmv "body v2 a b c foo\n" 223 1.1 jmmv "cleanup my-var1 value1\n" 224 1.1 jmmv "cleanup v2 a b c foo\n", 225 1.1 jmmv "", 226 1.1 jmmv "test", "-vmy-var1=value1", "-vv2=a b c foo", helpers, 227 1.1 jmmv "print_config", "test-result", NULL); 228 1.1 jmmv free(helpers); 229 1.1 jmmv 230 1.1 jmmv ATF_REQUIRE(atf_utils_compare_file("test-result", "passed\n")); 231 1.1 jmmv } 232 1.1 jmmv 233 1.1 jmmv 234 1.1 jmmv ATF_TC(test__invalid_test_case_name); 235 1.1 jmmv ATF_TC_HEAD(test__invalid_test_case_name, tc) { setup(tc, false); } 236 1.1 jmmv ATF_TC_BODY(test__invalid_test_case_name, tc) 237 1.1 jmmv { 238 1.1 jmmv char* helpers = helpers_path(tc); 239 1.1 jmmv check(EXIT_FAILURE, "", // TODO(jmmv): Should be EXIT_INTERNAL_ERROR. 240 1.1 jmmv "atf_helpers: ERROR: Unknown test case `foo'\n" 241 1.1 jmmv "atf_helpers: See atf-test-program(1) for usage details.\n", 242 1.1 jmmv "test", "-vhas.cleanup=false", helpers, "foo", "test-result", NULL); 243 1.1 jmmv free(helpers); 244 1.1 jmmv 245 1.1 jmmv ATF_REQUIRE(atf_utils_compare_file("test-result", 246 1.1 jmmv "broken: Premature exit; test case exited with code 1\n")); 247 1.1 jmmv } 248 1.1 jmmv 249 1.1 jmmv 250 1.1 jmmv ATF_TC(test__missing_test_program); 251 1.1 jmmv ATF_TC_HEAD(test__missing_test_program, tc) { setup(tc, false); } 252 1.1 jmmv ATF_TC_BODY(test__missing_test_program, tc) 253 1.1 jmmv { 254 1.1 jmmv check(EXIT_INTERNAL_ERROR, "", 255 1.1 jmmv "kyua-atf-tester: execvp failed: No such file or directory\n", 256 1.1 jmmv "test", "./non-existent", "pass", "test-result", NULL); 257 1.1 jmmv 258 1.1 jmmv ATF_REQUIRE(!atf_utils_file_exists("test-result")); 259 1.1 jmmv } 260 1.1 jmmv 261 1.1 jmmv 262 1.1 jmmv ATF_TP_ADD_TCS(tp) 263 1.1 jmmv { 264 1.1 jmmv ATF_TP_ADD_TC(tp, top__missing_command); 265 1.1 jmmv ATF_TP_ADD_TC(tp, top__unknown_command); 266 1.1 jmmv 267 1.1 jmmv ATF_TP_ADD_TC(tp, list__ok); 268 1.1 jmmv 269 1.1 jmmv ATF_TP_ADD_TC(tp, test__pass); 270 1.1 jmmv ATF_TP_ADD_TC(tp, test__fail); 271 1.1 jmmv ATF_TP_ADD_TC(tp, test__crash); 272 1.1 jmmv ATF_TP_ADD_TC(tp, test__timeout); 273 1.1 jmmv ATF_TP_ADD_TC(tp, test__result_priority); 274 1.1 jmmv ATF_TP_ADD_TC(tp, test__cleanup__ok); 275 1.1 jmmv ATF_TP_ADD_TC(tp, test__cleanup__fail); 276 1.1 jmmv ATF_TP_ADD_TC(tp, test__cleanup__crash); 277 1.1 jmmv ATF_TP_ADD_TC(tp, test__cleanup__timeout); 278 1.1 jmmv ATF_TP_ADD_TC(tp, test__config__builtin); 279 1.1 jmmv ATF_TP_ADD_TC(tp, test__config__custom); 280 1.1 jmmv ATF_TP_ADD_TC(tp, test__missing_test_program); 281 1.1 jmmv ATF_TP_ADD_TC(tp, test__invalid_test_case_name); 282 1.1 jmmv 283 1.1 jmmv return atf_no_error(); 284 1.1 jmmv } 285