t_mtree.sh revision 272343
1272343Sngie# $NetBSD: t_mtree.sh,v 1.6 2013/02/05 16:49:42 christos Exp $ 2272343Sngie# 3272343Sngie# Copyright (c) 2009, 2012 The NetBSD Foundation, Inc. 4272343Sngie# All rights reserved. 5272343Sngie# 6272343Sngie# Redistribution and use in source and binary forms, with or without 7272343Sngie# modification, are permitted provided that the following conditions 8272343Sngie# are met: 9272343Sngie# 1. Redistributions of source code must retain the above copyright 10272343Sngie# notice, this list of conditions and the following disclaimer. 11272343Sngie# 2. Redistributions in binary form must reproduce the above copyright 12272343Sngie# notice, this list of conditions and the following disclaimer in the 13272343Sngie# documentation and/or other materials provided with the distribution. 14272343Sngie# 15272343Sngie# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 16272343Sngie# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 17272343Sngie# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 18272343Sngie# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 19272343Sngie# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 20272343Sngie# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 21272343Sngie# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 22272343Sngie# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 23272343Sngie# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 24272343Sngie# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 25272343Sngie# POSSIBILITY OF SUCH DAMAGE. 26272343Sngie# 27272343Sngie 28272343Sngie# Postprocess mtree output, canonicalising portions that 29272343Sngie# are expected to differ from one run to another. 30272343Sngie# 31272343Sngie 32272343Sngieh_postprocess() 33272343Sngie{ 34272343Sngie sed -e ' 35272343Sngie /^# user: /s/:.*/: x/ 36272343Sngie /^# machine: /s/:.*/: x/ 37272343Sngie /^# tree: /s/:.*/: x/ 38272343Sngie /^# date: /s/:.*/: x/ 39272343Sngie ' \ 40272343Sngie -e '/type=dir/s/ size=[0-9]*//' 41272343Sngie} 42272343Sngie 43272343Sngieh_check() 44272343Sngie{ 45272343Sngie diff -Nru "$1" "$2" || atf_fail "files $1 and $2 differ" 46272343Sngie} 47272343Sngie 48272343Sngie 49272343Sngieatf_test_case mtree_create 50272343Sngieatf_test_case netbsd6_create 51272343Sngiecreate_head() 52272343Sngie{ 53272343Sngie atf_set "descr" "Create a specfile describing a directory tree" 54272343Sngie} 55272343Sngie 56272343Sngiecreate_setup() 57272343Sngie{ 58272343Sngie # create some directories 59272343Sngie rm -fr create 60272343Sngie mkdir -p create/a/1 create/a/2 create/b 61272343Sngie # create some files 62272343Sngie for file in create/top.file.1 \ 63272343Sngie create/a/a.file.1 \ 64272343Sngie create/a/a.file.2 \ 65272343Sngie create/a/1/a1.file.1 \ 66272343Sngie create/b/b.file.1 \ 67272343Sngie create/b/b.file.2 68272343Sngie do 69272343Sngie echo "$file" >$file 70272343Sngie done 71272343Sngie # hard link to file in same dir 72272343Sngie ln create/b/b.file.1 create/b/b.hardlink.1 73272343Sngie # hard link to file in another dir 74272343Sngie ln create/b/b.file.2 create/a/a.hardlink.b2 75272343Sngie # symlink to file 76272343Sngie ln -s a.file.1 create/a.symlink.1 77272343Sngie # symlink to dir 78272343Sngie ln -s b create/top.symlink.b 79272343Sngie # dangling symlink 80272343Sngie ln -s nonexistent create/top.dangling 81272343Sngie} 82272343Sngie 83272343Sngiecreate_body() 84272343Sngie{ 85272343Sngie create_setup 86272343Sngie 87272343Sngie # run mtree and check output 88272343Sngie ( cd create && mtree -F ${FLAVOR} -c -k type,nlink,link,size,sha256 ) >output.raw \ 89272343Sngie || atf_fail "mtree exit status $?" 90272343Sngie h_postprocess <output.raw >output 91272343Sngie h_check "$(atf_get_srcdir)/${FLAVOR}_d_create.out" output 92272343Sngie} 93272343Sngie 94272343Sngiemtree_create_head() 95272343Sngie{ 96272343Sngie FLAVOR=mtree create_head 97272343Sngie} 98272343Sngienetbsd6_create_head() 99272343Sngie{ 100272343Sngie FLAVOR=netbsd6 create_head 101272343Sngie} 102272343Sngie 103272343Sngiemtree_create_body() 104272343Sngie{ 105272343Sngie FLAVOR=mtree create_body 106272343Sngie} 107272343Sngienetbsd6_create_body() 108272343Sngie{ 109272343Sngie FLAVOR=netbsd6 create_body 110272343Sngie} 111272343Sngie 112272343Sngie 113272343Sngieatf_test_case mtree_check 114272343Sngieatf_test_case netbsd6_check 115272343Sngiecheck_head() 116272343Sngie{ 117272343Sngie atf_set "descr" "Check a directory tree against a specfile" 118272343Sngie} 119272343Sngie 120272343Sngiecheck_body() 121272343Sngie{ 122272343Sngie # we use the same directory tree and specfile as in the "create" test 123272343Sngie create_setup 124272343Sngie 125272343Sngie # run mtree and check output 126272343Sngie ( cd create && mtree -F ${FLAVOR} ) <"$(atf_get_srcdir)/${FLAVOR}_d_create.out" >output \ 127272343Sngie || atf_fail "mtree exit status $?" 128272343Sngie h_check /dev/null output 129272343Sngie} 130272343Sngie 131272343Sngiemtree_check_head() 132272343Sngie{ 133272343Sngie FLAVOR=mtree check_head 134272343Sngie} 135272343Sngienetbsd6_check_head() 136272343Sngie{ 137272343Sngie FLAVOR=netbsd6 check_head 138272343Sngie} 139272343Sngie 140272343Sngiemtree_check_body() 141272343Sngie{ 142272343Sngie FLAVOR=mtree check_body 143272343Sngie} 144272343Sngienetbsd6_check_body() 145272343Sngie{ 146272343Sngie FLAVOR=netbsd6 check_body 147272343Sngie} 148272343Sngie 149272343Sngie 150272343Sngieatf_test_case mtree_convert_C 151272343Sngieatf_test_case netbsd6_convert_C 152272343Sngieconvert_C_head() 153272343Sngie{ 154272343Sngie atf_set "descr" "Convert a specfile to mtree -C format, unsorted" 155272343Sngie} 156272343Sngie 157272343Sngieconvert_C_body() 158272343Sngie{ 159272343Sngie mtree -F ${FLAVOR} -C -K all <"$(atf_get_srcdir)/d_convert.in" >output 160272343Sngie h_check "$(atf_get_srcdir)/d_convert_C.out" output 161272343Sngie} 162272343Sngie 163272343Sngiemtree_convert_C_head() 164272343Sngie{ 165272343Sngie FLAVOR=mtree convert_C_head 166272343Sngie} 167272343Sngienetbsd6_convert_C_head() 168272343Sngie{ 169272343Sngie FLAVOR=netbsd6 convert_C_head 170272343Sngie} 171272343Sngie 172272343Sngiemtree_convert_C_body() 173272343Sngie{ 174272343Sngie FLAVOR=mtree convert_C_body 175272343Sngie} 176272343Sngienetbsd6_convert_C_body() 177272343Sngie{ 178272343Sngie FLAVOR=netbsd6 convert_C_body 179272343Sngie} 180272343Sngie 181272343Sngie 182272343Sngieatf_test_case mtree_convert_C_S 183272343Sngieatf_test_case netbsd6_convert_C_S 184272343Sngieconvert_C_S_head() 185272343Sngie{ 186272343Sngie atf_set "descr" "Convert a specfile to mtree -C format, sorted" 187272343Sngie} 188272343Sngie 189272343Sngieconvert_C_S_body() 190272343Sngie{ 191272343Sngie mtree -F ${FLAVOR} -C -S -K all <"$(atf_get_srcdir)/d_convert.in" >output 192272343Sngie h_check "$(atf_get_srcdir)/d_convert_C_S.out" output 193272343Sngie} 194272343Sngie 195272343Sngiemtree_convert_C_S_head() 196272343Sngie{ 197272343Sngie FLAVOR=mtree convert_C_S_head 198272343Sngie} 199272343Sngienetbsd6_convert_C_S_head() 200272343Sngie{ 201272343Sngie FLAVOR=netbsd6 convert_C_S_head 202272343Sngie} 203272343Sngie 204272343Sngiemtree_convert_C_S_body() 205272343Sngie{ 206272343Sngie FLAVOR=mtree convert_C_S_body 207272343Sngie} 208272343Sngienetbsd6_convert_C_S_body() 209272343Sngie{ 210272343Sngie FLAVOR=netbsd6 convert_C_S_body 211272343Sngie} 212272343Sngie 213272343Sngie 214272343Sngieatf_test_case mtree_convert_D 215272343Sngieatf_test_case netbsd6_convert_D 216272343Sngieconvert_D_head() 217272343Sngie{ 218272343Sngie atf_set "descr" "Convert a specfile to mtree -D format, unsorted" 219272343Sngie} 220272343Sngie 221272343Sngieconvert_D_body() 222272343Sngie{ 223272343Sngie mtree -F ${FLAVOR} -D -K all <"$(atf_get_srcdir)/d_convert.in" >output 224272343Sngie h_check "$(atf_get_srcdir)/d_convert_D.out" output 225272343Sngie} 226272343Sngie 227272343Sngiemtree_convert_D_head() 228272343Sngie{ 229272343Sngie FLAVOR=mtree convert_D_head 230272343Sngie} 231272343Sngienetbsd6_convert_D_head() 232272343Sngie{ 233272343Sngie FLAVOR=netbsd6 convert_D_head 234272343Sngie} 235272343Sngie 236272343Sngiemtree_convert_D_body() 237272343Sngie{ 238272343Sngie FLAVOR=mtree convert_D_body 239272343Sngie} 240272343Sngienetbsd6_convert_D_body() 241272343Sngie{ 242272343Sngie FLAVOR=netbsd6 convert_D_body 243272343Sngie} 244272343Sngie 245272343Sngie 246272343Sngieatf_test_case mtree_convert_D_S 247272343Sngieatf_test_case netbsd6_convert_D_S 248272343Sngieconvert_D_S_head() 249272343Sngie{ 250272343Sngie atf_set "descr" "Convert a specfile to mtree -D format, sorted" 251272343Sngie} 252272343Sngie 253272343Sngieconvert_D_S_body() 254272343Sngie{ 255272343Sngie mtree -F ${FLAVOR} -D -S -K all <"$(atf_get_srcdir)/d_convert.in" >output 256272343Sngie h_check "$(atf_get_srcdir)/d_convert_D_S.out" output 257272343Sngie} 258272343Sngie 259272343Sngiemtree_convert_D_S_head() 260272343Sngie{ 261272343Sngie FLAVOR=mtree convert_D_S_head 262272343Sngie} 263272343Sngienetbsd6_convert_D_S_head() 264272343Sngie{ 265272343Sngie FLAVOR=netbsd6 convert_D_S_head 266272343Sngie} 267272343Sngie 268272343Sngiemtree_convert_D_S_body() 269272343Sngie{ 270272343Sngie FLAVOR=mtree convert_D_S_body 271272343Sngie} 272272343Sngienetbsd6_convert_D_S_body() 273272343Sngie{ 274272343Sngie FLAVOR=netbsd6 convert_D_S_body 275272343Sngie} 276272343Sngie 277272343Sngie 278272343Sngieatf_test_case mtree_ignore 279272343Sngieatf_test_case netbs6_ignore 280272343Sngieignore_head() 281272343Sngie{ 282272343Sngie atf_set "descr" "Test that -d ignores symlinks (PR bin/41061)" 283272343Sngie} 284272343Sngie 285272343Sngieignore_body() 286272343Sngie{ 287272343Sngie mkdir newdir 288272343Sngie mtree -F ${FLAVOR} -c | mtree -F ${FLAVOR} -Ck uid,gid,mode > mtree.spec 289272343Sngie ln -s newdir otherdir 290272343Sngie 291272343Sngie # This yields "extra: otherdir" even with -d. 292272343Sngie # (PR bin/41061) 293272343Sngie atf_check -s ignore -o empty -e empty -x "mtree -F ${FLAVOR} -d < mtree.spec" 294272343Sngie 295272343Sngie # Delete the symlink and re-verify. 296272343Sngie # 297272343Sngie rm otherdir 298272343Sngie atf_check -s ignore -o empty -e empty -x "mtree -F ${FLAVOR} -d < mtree.spec" 299272343Sngie} 300272343Sngie 301272343Sngiemtree_ignore_head() 302272343Sngie{ 303272343Sngie FLAVOR=mtree ignore_head 304272343Sngie} 305272343Sngienetbsd6_ignore_head() 306272343Sngie{ 307272343Sngie FLAVOR=netbsd6 ignore_head 308272343Sngie} 309272343Sngie 310272343Sngiemtree_ignore_body() 311272343Sngie{ 312272343Sngie FLAVOR=mtree ignore_body 313272343Sngie} 314272343Sngienetbsd6_ignore_body() 315272343Sngie{ 316272343Sngie FLAVOR=netbsd6 ignore_body 317272343Sngie} 318272343Sngie 319272343Sngie 320272343Sngieatf_test_case mtree_merge 321272343Sngieatf_test_case netbsd6_merge 322272343Sngiemerge_head() 323272343Sngie{ 324272343Sngie atf_set "descr" "Merge records of different type" 325272343Sngie} 326272343Sngie 327272343Sngiemerge_body() 328272343Sngie{ 329272343Sngie mtree -F ${FLAVOR} -C -M -K all <"$(atf_get_srcdir)/d_merge.in" >output 330272343Sngie h_check "$(atf_get_srcdir)/d_merge_C_M.out" output 331272343Sngie # same again, with sorting 332272343Sngie mtree -F ${FLAVOR} -C -M -S -K all <"$(atf_get_srcdir)/d_merge.in" >output 333272343Sngie h_check "$(atf_get_srcdir)/d_merge_C_M_S.out" output 334272343Sngie} 335272343Sngie 336272343Sngiemtree_merge_head() 337272343Sngie{ 338272343Sngie FLAVOR=mtree merge_head 339272343Sngie} 340272343Sngienetbsd6_merge_head() 341272343Sngie{ 342272343Sngie FLAVOR=netbsd6 merge_head 343272343Sngie} 344272343Sngie 345272343Sngiemtree_merge_body() 346272343Sngie{ 347272343Sngie FLAVOR=mtree merge_body 348272343Sngie} 349272343Sngienetbsd6_merge_body() 350272343Sngie{ 351272343Sngie FLAVOR=netbsd6 merge_body 352272343Sngie} 353272343Sngie 354272343Sngie 355272343Sngieatf_test_case mtree_nonemptydir 356272343Sngieatf_test_case netbsd6_nonemptydir 357272343Sngienonemptydir_head() 358272343Sngie{ 359272343Sngie atf_set "descr" "Test that new non-empty " \ 360272343Sngie "directories are recorded (PR bin/25693)" 361272343Sngie} 362272343Sngie 363272343Sngienonemptydir_body() 364272343Sngie{ 365272343Sngie mkdir testdir 366272343Sngie cd testdir 367272343Sngie 368272343Sngie mtree -F ${FLAVOR} -c > mtree.spec 369272343Sngie 370272343Sngie if [ ! -f mtree.spec ]; then 371272343Sngie atf_fail "mtree failed" 372272343Sngie fi 373272343Sngie 374272343Sngie touch bar 375272343Sngie atf_check -s ignore -o save:output -x "mtree -F ${FLAVOR} -f mtree.spec" 376272343Sngie 377272343Sngie if [ ! -n "$(egrep "extra: bar" output)" ]; then 378272343Sngie atf_fail "mtree did not record changes (PR bin/25693)" 379272343Sngie fi 380272343Sngie} 381272343Sngie 382272343Sngiemtree_nonemptydir_head() 383272343Sngie{ 384272343Sngie FLAVOR=mtree nonemptydir_head 385272343Sngie} 386272343Sngienetbsd6_nonemptydir_head() 387272343Sngie{ 388272343Sngie FLAVOR=netbsd6 nonemptydir_head 389272343Sngie} 390272343Sngie 391272343Sngiemtree_nonemptydir_body() 392272343Sngie{ 393272343Sngie FLAVOR=mtree nonemptydir_body 394272343Sngie} 395272343Sngienetbsd6_nonemptydir_body() 396272343Sngie{ 397272343Sngie FLAVOR=netbsd6 nonemptydir_body 398272343Sngie} 399272343Sngie 400272343Sngie 401272343Sngieatf_init_test_cases() 402272343Sngie{ 403272343Sngie atf_add_test_case mtree_create 404272343Sngie atf_add_test_case mtree_check 405272343Sngie atf_add_test_case mtree_convert_C 406272343Sngie atf_add_test_case mtree_convert_C_S 407272343Sngie atf_add_test_case mtree_convert_D 408272343Sngie atf_add_test_case mtree_convert_D_S 409272343Sngie atf_add_test_case mtree_ignore 410272343Sngie atf_add_test_case mtree_merge 411272343Sngie atf_add_test_case mtree_nonemptydir 412272343Sngie 413272343Sngie atf_add_test_case netbsd6_create 414272343Sngie atf_add_test_case netbsd6_check 415272343Sngie atf_add_test_case netbsd6_convert_C 416272343Sngie atf_add_test_case netbsd6_convert_C_S 417272343Sngie atf_add_test_case netbsd6_convert_D 418272343Sngie atf_add_test_case netbsd6_convert_D_S 419272343Sngie atf_add_test_case netbsd6_ignore 420272343Sngie atf_add_test_case netbsd6_merge 421272343Sngie atf_add_test_case netbsd6_nonemptydir 422272343Sngie} 423