1# 2# Copyright (c) 2016 Jilles Tjoelker 3# All rights reserved. 4# 5# Redistribution and use in source and binary forms, with or without 6# modification, are permitted provided that the following conditions 7# are met: 8# 1. Redistributions of source code must retain the above copyright 9# notice, this list of conditions and the following disclaimer. 10# 2. 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# 14# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24# SUCH DAMAGE. 25# 26# $FreeBSD$ 27# 28 29copy_to_nonexistent_with_opts() { 30 printf 'test\n123\r456\r\n789\0z' >testf 31 atf_check install "$@" testf copyf 32 cmp testf copyf || atf_fail "bad copy" 33 [ ! testf -nt copyf ] || atf_fail "bad timestamp" 34 [ ! -e copyf.bak ] || atf_fail "no backup expected" 35} 36 37atf_test_case copy_to_nonexistent 38copy_to_nonexistent_body() { 39 copy_to_nonexistent_with_opts 40} 41 42atf_test_case copy_to_nonexistent_safe 43copy_to_nonexistent_safe_body() { 44 copy_to_nonexistent_with_opts -S 45} 46 47atf_test_case copy_to_nonexistent_comparing 48copy_to_nonexistent_comparing_body() { 49 copy_to_nonexistent_with_opts -C 50} 51 52atf_test_case copy_to_nonexistent_safe_comparing 53copy_to_nonexistent_safe_comparing_body() { 54 copy_to_nonexistent_with_opts -S -C 55} 56 57atf_test_case copy_to_nonexistent_backup 58copy_to_nonexistent_backup_body() { 59 copy_to_nonexistent_with_opts -b -B.bak 60} 61 62atf_test_case copy_to_nonexistent_backup_safe 63copy_to_nonexistent_backup_safe_body() { 64 copy_to_nonexistent_with_opts -b -B.bak -S 65} 66 67atf_test_case copy_to_nonexistent_preserving 68copy_to_nonexistent_preserving_body() { 69 copy_to_nonexistent_with_opts -p 70 [ ! testf -ot copyf ] || atf_fail "bad timestamp 2" 71} 72 73copy_self_with_opts() { 74 printf 'test\n123\r456\r\n789\0z' >testf 75 printf 'test\n123\r456\r\n789\0z' >testf2 76 atf_check -s not-exit:0 -o empty -e match:. install "$@" testf testf 77 cmp testf testf2 || atf_fail "file changed after self-copy attempt" 78} 79 80atf_test_case copy_self 81copy_self_body() { 82 copy_self_with_opts 83} 84 85atf_test_case copy_self_safe 86copy_self_safe_body() { 87 copy_self_with_opts -S 88} 89 90atf_test_case copy_self_comparing 91copy_self_comparing_body() { 92 copy_self_with_opts -C 93} 94 95atf_test_case copy_self_safe_comparing 96copy_self_safe_comparing_body() { 97 copy_self_with_opts -S -C 98} 99 100overwrite_with_opts() { 101 printf 'test\n123\r456\r\n789\0z' >testf 102 printf 'test\n123\r456\r\n789\0w' >otherf 103 atf_check install "$@" testf otherf 104 cmp testf otherf || atf_fail "bad overwrite" 105 [ ! testf -nt otherf ] || atf_fail "bad timestamp" 106} 107 108atf_test_case overwrite 109overwrite_body() { 110 overwrite_with_opts 111} 112 113atf_test_case overwrite_safe 114overwrite_safe_body() { 115 overwrite_with_opts -S 116} 117 118atf_test_case overwrite_comparing 119overwrite_comparing_body() { 120 overwrite_with_opts -C 121} 122 123atf_test_case overwrite_safe_comparing 124overwrite_safe_comparing_body() { 125 overwrite_with_opts -S -C 126} 127 128overwrite_eq_with_opts() { 129 printf 'test\n123\r456\r\n789\0z' >testf 130 printf 'test\n123\r456\r\n789\0z' >otherf 131 atf_check install "$@" testf otherf 132 cmp testf otherf || atf_fail "bad overwrite" 133 [ ! testf -nt otherf ] || atf_fail "bad timestamp" 134} 135 136atf_test_case overwrite_eq 137overwrite_eq_body() { 138 overwrite_eq_with_opts 139} 140 141atf_test_case overwrite_eq_safe 142overwrite_eq_safe_body() { 143 overwrite_eq_with_opts -S 144} 145 146atf_test_case overwrite_eq_comparing 147overwrite_eq_comparing_body() { 148 overwrite_eq_with_opts -C 149} 150 151atf_test_case overwrite_eq_safe_comparing 152overwrite_eq_safe_comparing_body() { 153 overwrite_eq_with_opts -S -C 154} 155 156overwrite_backup_with_opts() { 157 printf 'test\n123\r456\r\n789\0z' >testf 158 printf 'test\n123\r456\r\n789\0w' >otherf 159 printf 'test\n123\r456\r\n789\0w' >otherf2 160 atf_check install -b -B.bak "$@" testf otherf 161 cmp testf otherf || atf_fail "bad overwrite" 162 [ ! testf -nt otherf ] || atf_fail "bad timestamp" 163 cmp otherf.bak otherf2 || atf_fail "bad backup" 164} 165 166atf_test_case overwrite_backup 167overwrite_backup_body() { 168 overwrite_backup_with_opts 169} 170 171atf_test_case overwrite_backup_safe 172overwrite_backup_safe_body() { 173 overwrite_backup_with_opts -S 174} 175 176atf_test_case overwrite_backup_comparing 177overwrite_backup_comparing_body() { 178 overwrite_backup_with_opts -C 179} 180 181atf_test_case overwrite_backup_safe_comparing 182overwrite_backup_safe_comparing_body() { 183 overwrite_backup_with_opts -S -C 184} 185 186setup_stripbin() { 187 cat <<\STRIPBIN >stripbin 188#!/bin/sh 189tr z @ <"$1" >"$1.new" && mv -- "$1.new" "$1" 190STRIPBIN 191 chmod 755 stripbin 192 export STRIPBIN="$PWD/stripbin" 193} 194 195strip_changing_with_opts() { 196 setup_stripbin 197 printf 'test\n123\r456\r\n789\0z' >testf 198 atf_check install -s "$@" testf copyf 199 [ ! testf -nt copyf ] || atf_fail "bad timestamp" 200 printf 'test\n123\r456\r\n789\0@' >otherf 201 cmp otherf copyf || atf_fail "bad stripped copy" 202} 203 204atf_test_case strip_changing 205strip_changing_body() { 206 strip_changing_with_opts 207} 208 209atf_test_case strip_changing_comparing 210strip_changing_comparing_body() { 211 strip_changing_with_opts -C 212} 213 214strip_changing_overwrite_with_opts() { 215 setup_stripbin 216 printf 'test\n123\r456\r\n789\0z' >testf 217 printf 'test\n123\r456\r\n789\0w' >copyf 218 atf_check install -s "$@" testf copyf 219 [ ! testf -nt copyf ] || atf_fail "bad timestamp" 220 printf 'test\n123\r456\r\n789\0@' >otherf 221 cmp otherf copyf || atf_fail "bad stripped copy" 222} 223 224atf_test_case strip_changing_overwrite 225strip_changing_overwrite_body() { 226 strip_changing_overwrite_with_opts 227} 228 229atf_test_case strip_changing_overwrite_comparing 230strip_changing_overwrite_comparing_body() { 231 strip_changing_overwrite_with_opts -C 232} 233 234strip_changing_overwrite_eq_with_opts() { 235 setup_stripbin 236 printf 'test\n123\r456\r\n789\0z' >testf 237 printf 'test\n123\r456\r\n789\0@' >copyf 238 atf_check install -s "$@" testf copyf 239 [ ! testf -nt copyf ] || atf_fail "bad timestamp" 240 printf 'test\n123\r456\r\n789\0@' >otherf 241 cmp otherf copyf || atf_fail "bad stripped copy" 242} 243 244atf_test_case strip_changing_overwrite_eq 245strip_changing_overwrite_eq_body() { 246 strip_changing_overwrite_eq_with_opts 247} 248 249atf_test_case strip_changing_overwrite_eq_comparing 250strip_changing_overwrite_eq_comparing_body() { 251 strip_changing_overwrite_eq_with_opts -C 252} 253 254atf_test_case strip_noop 255strip_noop_body() { 256 export STRIPBIN=true 257 printf 'test\n123\r456\r\n789\0z' >testf 258 atf_check install -s testf copyf 259 [ ! testf -nt copyf ] || atf_fail "bad timestamp" 260 printf 'test\n123\r456\r\n789\0z' >otherf 261 cmp otherf copyf || atf_fail "bad stripped copy" 262} 263 264atf_test_case hard_link 265hard_link_body() { 266 printf 'test\n123\r456\r\n789\0z' >testf 267 atf_check install -l h testf copyf 268 [ testf -ef copyf ] || atf_fail "not same file" 269 [ ! -L copyf ] || atf_fail "copy is symlink" 270} 271 272atf_test_case symbolic_link 273symbolic_link_body() { 274 printf 'test\n123\r456\r\n789\0z' >testf 275 atf_check install -l s testf copyf 276 [ testf -ef copyf ] || atf_fail "not same file" 277 [ -L copyf ] || atf_fail "copy is not symlink" 278} 279 280atf_test_case symbolic_link_absolute 281symbolic_link_absolute_body() { 282 printf 'test\n123\r456\r\n789\0z' >testf 283 atf_check install -l sa testf copyf 284 [ testf -ef copyf ] || atf_fail "not same file" 285 [ -L copyf ] || atf_fail "copy is not symlink" 286 copyf_path=$(readlink copyf) 287 testf_path="$(pwd -P)/testf" 288 if [ "$copyf_path" != "$testf_path" ]; then 289 atf_fail "unexpected symlink contents ('$copyf_path' != '$testf_path')" 290 fi 291} 292 293atf_test_case symbolic_link_relative 294symbolic_link_relative_body() { 295 printf 'test\n123\r456\r\n789\0z' >testf 296 atf_check install -l sr testf copyf 297 [ testf -ef copyf ] || atf_fail "not same file" 298 [ -L copyf ] || atf_fail "copy is not symlink" 299 copyf_path=$(readlink copyf) 300 testf_path="testf" 301 if [ "$copyf_path" != "$testf_path" ]; then 302 atf_fail "unexpected symlink contents ('$copyf_path' != '$testf_path')" 303 fi 304} 305 306atf_test_case symbolic_link_relative_absolute_source_and_dest1 307symbolic_link_relative_absolute_source_and_dest1_head() { 308 atf_set "descr" "Verify -l rs with absolute paths (.../copyf -> .../a/b/c/testf)" 309} 310symbolic_link_relative_absolute_source_and_dest1_body() { 311 src_path=a/b/c/testf 312 src_path_prefixed=$PWD/$src_path 313 dest_path=$PWD/copyf 314 315 atf_check mkdir -p a/b/c 316 atf_check touch $src_path 317 atf_check install -l sr $src_path_prefixed $dest_path 318 [ $src_path_prefixed -ef $dest_path ] || atf_fail "not same file" 319 [ -L $dest_path ] || atf_fail "copy is not symlink" 320 dest_path_relative=$(readlink $dest_path) 321 src_path_relative="$src_path" 322 if [ "$src_path_relative" != "$dest_path_relative" ]; then 323 atf_fail "unexpected symlink contents ('$src_path_relative' != '$dest_path_relative')" 324 fi 325} 326 327atf_test_case symbolic_link_relative_absolute_source_and_dest1_double_slash 328symbolic_link_relative_absolute_source_and_dest1_double_slash_head() { 329 atf_set "descr" "Verify -l rs with absolute paths (.../copyf -> .../a/b/c/testf), using double-slashes" 330} 331symbolic_link_relative_absolute_source_and_dest1_double_slash_body() { 332 src_path=a//b//c//testf 333 src_path_prefixed=$PWD/$src_path 334 dest_path=$PWD/copyf 335 336 atf_check mkdir -p a/b/c 337 atf_check touch $src_path 338 atf_check install -l sr $src_path_prefixed $dest_path 339 [ $src_path_prefixed -ef $dest_path ] || atf_fail "not same file" 340 [ -L $dest_path ] || atf_fail "copy is not symlink" 341 dest_path_relative=$(readlink $dest_path) 342 src_path_relative="$(echo $src_path | sed -e 's,//,/,g')" 343 if [ "$src_path_relative" != "$dest_path_relative" ]; then 344 atf_fail "unexpected symlink contents ('$src_path_relative' != '$dest_path_relative')" 345 fi 346} 347 348atf_test_case symbolic_link_relative_absolute_source_and_dest2 349symbolic_link_relative_absolute_source_and_dest2_head() { 350 atf_set "descr" "Verify -l rs with absolute paths (.../a/b/c/copyf -> .../testf)" 351} 352symbolic_link_relative_absolute_source_and_dest2_body() { 353 src_path=testf 354 src_path_prefixed=$PWD/$src_path 355 dest_path=$PWD/a/b/c/copyf 356 357 atf_check mkdir -p a/b/c 358 atf_check touch $src_path 359 atf_check install -l sr $src_path_prefixed $dest_path 360 [ $src_path_prefixed -ef $dest_path ] || atf_fail "not same file" 361 [ -L $dest_path ] || atf_fail "copy is not symlink" 362 dest_path_relative=$(readlink $dest_path) 363 src_path_relative="../../../$src_path" 364 if [ "$src_path_relative" != "$dest_path_relative" ]; then 365 atf_fail "unexpected symlink contents ('$src_path_relative' != '$dest_path_relative')" 366 fi 367} 368 369atf_test_case mkdir_simple 370mkdir_simple_body() { 371 atf_check install -d dir1/dir2 372 [ -d dir1 ] || atf_fail "dir1 missing" 373 [ -d dir1/dir2 ] || atf_fail "dir2 missing" 374 atf_check install -d dir1/dir2/dir3 375 [ -d dir1/dir2/dir3 ] || atf_fail "dir3 missing" 376 atf_check install -d dir1 377 atf_check install -d dir1/dir2/dir3 378} 379 380atf_test_case symbolic_link_relative_absolute_common 381symbolic_link_relative_absolute_common_head() { 382 atf_set "descr" "Verify -l rs with absolute paths having common components" 383} 384symbolic_link_relative_absolute_common_body() { 385 filename=foo.so 386 src_path=lib 387 src_path_prefixed=$PWD/$src_path 388 dest_path=$PWD/libexec/ 389 src_file=$src_path_prefixed/$filename 390 dest_file=$dest_path/$filename 391 392 atf_check mkdir $src_path_prefixed $dest_path 393 atf_check touch $src_file 394 atf_check install -l sr $src_file $dest_path 395 396 dest_path_relative=$(readlink $dest_file) 397 src_path_relative="../lib/$filename" 398 if [ "$src_path_relative" != "$dest_path_relative" ]; then 399 atf_fail "unexpected symlink contents ('$src_path_relative' != '$dest_path_relative')" 400 fi 401} 402 403atf_init_test_cases() { 404 atf_add_test_case copy_to_nonexistent 405 atf_add_test_case copy_to_nonexistent_safe 406 atf_add_test_case copy_to_nonexistent_comparing 407 atf_add_test_case copy_to_nonexistent_safe_comparing 408 atf_add_test_case copy_to_nonexistent_backup 409 atf_add_test_case copy_to_nonexistent_backup_safe 410 atf_add_test_case copy_to_nonexistent_preserving 411 atf_add_test_case copy_self 412 atf_add_test_case copy_self_safe 413 atf_add_test_case copy_self_comparing 414 atf_add_test_case copy_self_safe_comparing 415 atf_add_test_case overwrite 416 atf_add_test_case overwrite_safe 417 atf_add_test_case overwrite_comparing 418 atf_add_test_case overwrite_safe_comparing 419 atf_add_test_case overwrite_eq 420 atf_add_test_case overwrite_eq_safe 421 atf_add_test_case overwrite_eq_comparing 422 atf_add_test_case overwrite_eq_safe_comparing 423 atf_add_test_case overwrite_backup 424 atf_add_test_case overwrite_backup_safe 425 atf_add_test_case overwrite_backup_comparing 426 atf_add_test_case overwrite_backup_safe_comparing 427 atf_add_test_case strip_changing 428 atf_add_test_case strip_changing_comparing 429 atf_add_test_case strip_changing_overwrite 430 atf_add_test_case strip_changing_overwrite_comparing 431 atf_add_test_case strip_changing_overwrite_eq 432 atf_add_test_case strip_changing_overwrite_eq_comparing 433 atf_add_test_case strip_noop 434 atf_add_test_case hard_link 435 atf_add_test_case symbolic_link 436 atf_add_test_case symbolic_link_absolute 437 atf_add_test_case symbolic_link_relative 438 atf_add_test_case symbolic_link_relative_absolute_source_and_dest1 439 atf_add_test_case symbolic_link_relative_absolute_source_and_dest1_double_slash 440 atf_add_test_case symbolic_link_relative_absolute_source_and_dest2 441 atf_add_test_case symbolic_link_relative_absolute_common 442 atf_add_test_case mkdir_simple 443} 444