Backup Bouncer

Backup Bouncer is a test designed to see whether a backup program preserves all of the filesystem attributes on HFS+, the filesystem used on Mac OSX.

HashBackup passes Backup Bouncer 100%. Below are the test results and a script that can be used to reproduce these results.

Backup Bouncer Test Results  May 2016
Run on OSX 10.6.8 (Snow Leopard)

1. Download Backup-Bouncer-master.zip into a directory
2. copy bb.sh (at the end of this file) to this directory
3. sudo sh bb.sh to run the Backup Bouncer test

Results of the test:

+ rm -rf Backup-Bouncer-master
+ unzip Backup-Bouncer-master.zip
Archive:  Backup-Bouncer-master.zip
   creating: Backup-Bouncer-master/
  inflating: Backup-Bouncer-master/BackupBouncer.kpf
  inflating: Backup-Bouncer-master/LICENSE.txt
  inflating: Backup-Bouncer-master/Makefile
  inflating: Backup-Bouncer-master/README.SNOW_LEOPARD.txt
  inflating: Backup-Bouncer-master/README.txt
 extracting: Backup-Bouncer-master/VERSION.txt
  inflating: Backup-Bouncer-master/autopilot
  inflating: Backup-Bouncer-master/bbouncer
   creating: Backup-Bouncer-master/copiers.d/
  inflating: Backup-Bouncer-master/copiers.d/10-rsync-apple.cp
  inflating: Backup-Bouncer-master/copiers.d/15-rsync-macports.cp
  inflating: Backup-Bouncer-master/copiers.d/16-rsync-fink.cp
  inflating: Backup-Bouncer-master/copiers.d/30-cp-apple.cp
  inflating: Backup-Bouncer-master/copiers.d/40-ditto.cp
  inflating: Backup-Bouncer-master/copiers.d/50-tar.cp
  inflating: Backup-Bouncer-master/copiers.d/60-pax.cp
  inflating: Backup-Bouncer-master/copiers.d/70-xar-apple.cp
  inflating: Backup-Bouncer-master/copiers.d/75-xar-svn.cp
   creating: Backup-Bouncer-master/scripts/
  inflating: Backup-Bouncer-master/scripts/test-asr
   creating: Backup-Bouncer-master/tests.d/
  inflating: Backup-Bouncer-master/tests.d/00-basic-permissions.test
  inflating: Backup-Bouncer-master/tests.d/05-timestamps.test
  inflating: Backup-Bouncer-master/tests.d/10-symlinks.test
  inflating: Backup-Bouncer-master/tests.d/15-symlink-ownership.test
  inflating: Backup-Bouncer-master/tests.d/20-hardlinks.test
  inflating: Backup-Bouncer-master/tests.d/25-aliases.test.disabled
  inflating: Backup-Bouncer-master/tests.d/30-resource-forks.test
  inflating: Backup-Bouncer-master/tests.d/40-finder-flags.test
  inflating: Backup-Bouncer-master/tests.d/45-finder-locks.test
  inflating: Backup-Bouncer-master/tests.d/50-creation-date.test
  inflating: Backup-Bouncer-master/tests.d/60-bsd-flags.test
  inflating: Backup-Bouncer-master/tests.d/70-extended-attrs.test
  inflating: Backup-Bouncer-master/tests.d/80-access-control-lists.test
  inflating: Backup-Bouncer-master/tests.d/90-fifo.test
  inflating: Backup-Bouncer-master/tests.d/95-devices.test
  inflating: Backup-Bouncer-master/tests.d/99-combo-tests.test
   creating: Backup-Bouncer-master/util/
  inflating: Backup-Bouncer-master/util/Makefile
  inflating: Backup-Bouncer-master/util/copy-runner
  inflating: Backup-Bouncer-master/util/hardlink-util.c
  inflating: Backup-Bouncer-master/util/lsalias
  inflating: Backup-Bouncer-master/util/make_alias
  inflating: Backup-Bouncer-master/util/test-runner
  inflating: Backup-Bouncer-master/util/xattr-util.c
+ cd Backup-Bouncer-master
+ make
cd util && make
cc -Wall    xattr-util.c   -o xattr-util
xattr-util.c: In function ‘main’:
xattr-util.c:107: warning: unused variable ‘value’
cc -Wall    hardlink-util.c   -o hardlink-util

# NOTE: below, Backup Bouncer is patched to remove the nodump bit.
# HashBackup respects the nodump bit and does not save files, but
# Backup Bouncer expects files with nodump to be saved (bug in BB).
# The patch is shown in the shell script at the end.

+ patch --context -p1
patching file tests.d/60-bsd-flags.test
+ patch --context -p1
patching file tests.d/99-combo-tests.test
+ umount -f /Volumes/bbtest
+ rm -f bbtest.sparseimage
+ ./bbouncer create-vol bbtest
created: /hbtest/Backup-Bouncer-master/bbtest.sparseimage
/dev/disk18        GUID_partition_scheme
/dev/disk18s1           Apple_HFS                          /Volumes/bbtest
+ ./bbouncer create /Volumes/bbtest
Cleaning: 00-basic-permissions
Cleaning:        05-timestamps
Cleaning:          10-symlinks
Cleaning: 15-symlink-ownership
Cleaning:         20-hardlinks
Cleaning:    30-resource-forks
Cleaning:      40-finder-flags
Cleaning:      45-finder-locks
Cleaning:     50-creation-date
Cleaning:         60-bsd-flags
Cleaning:    70-extended-attrs
Cleaning: 80-access-control-lists
Cleaning:              90-fifo
Cleaning:           95-devices
Cleaning:       99-combo-tests
Creating: 00-basic-permissions ... ok
Creating:        05-timestamps ... ok
Creating:          10-symlinks ... ok
Creating: 15-symlink-ownership ... ok
Creating:         20-hardlinks ... ok
Creating:    30-resource-forks ... ok
Creating:      40-finder-flags ... ok
Creating:      45-finder-locks ... ok
Creating:     50-creation-date ... ok
Creating:         60-bsd-flags ... ok
Creating:    70-extended-attrs ... ok
Creating: 80-access-control-lists ... ok
Creating:              90-fifo ... ok
Creating:           95-devices ... ok
Creating:       99-combo-tests ... ok
+ hb init -c hb
HashBackup build #1521 Copyright 2009-2016 HashBackup, LLC
Backup directory: /hbtest/Backup-Bouncer-master/hb
Permissions set for owner access only
Created key file /hbtest/Backup-Bouncer-master/hb/key.conf
Key file set to read-only
Setting include/exclude defaults: /hbtest/Backup-Bouncer-master/hb/inex.conf

VERY IMPORTANT: your backup is encrypted and can only be accessed with
the encryption key, stored in the file:
    /hbtest/Backup-Bouncer-master/hb/key.conf

You MUST make copies of this file and store them in a secure location,
separate from your computer and backup data.  If your hard drive fails,
you will need this key to restore your files.  If you setup any
remote destinations in dest.conf, that file should be copied too.

Backup directory initialized
+ hb backup -c hb /Volumes/bbtest -v3
HashBackup build #1525 Copyright 2009-2016 HashBackup, LLC
Backup directory: /hbtest/Backup-Bouncer-master/hb
Copied HB program to /hbtest/Backup-Bouncer-master/hb/hb#1525
This is backup version: 0
Dedup is not enabled
/Volumes/bbtest
/Volumes/bbtest/.Trashes
/Volumes/bbtest/.Trashes/501
/Volumes/bbtest/.fseventsd
/Volumes/bbtest/.fseventsd/fseventsd-uuid
/Volumes/bbtest/00-basic-permissions
/Volumes/bbtest/00-basic-permissions/owned-by-me
/Volumes/bbtest/00-basic-permissions/owned-by-root
/Volumes/bbtest/00-basic-permissions/owned-by-www
/Volumes/bbtest/00-basic-permissions/some-dir
/Volumes/bbtest/05-timestamps
/Volumes/bbtest/05-timestamps/some-dir
/Volumes/bbtest/05-timestamps/some-file
/Volumes/bbtest/05-timestamps/some-hardlink
/Volumes/bbtest/10-symlinks
/Volumes/bbtest/10-symlinks/broken_symlink
/Volumes/bbtest/10-symlinks/link2broken_symlink
/Volumes/bbtest/10-symlinks/some-file
/Volumes/bbtest/10-symlinks/symlink1
/Volumes/bbtest/10-symlinks/symlink2
/Volumes/bbtest/10-symlinks/symlink3
/Volumes/bbtest/15-symlink-ownership
/Volumes/bbtest/15-symlink-ownership/some-file
/Volumes/bbtest/15-symlink-ownership/symlink1
/Volumes/bbtest/15-symlink-ownership/symlink2
/Volumes/bbtest/15-symlink-ownership/symlink3
/Volumes/bbtest/20-hardlinks
/Volumes/bbtest/20-hardlinks/link1
/Volumes/bbtest/20-hardlinks/link2
/Volumes/bbtest/20-hardlinks/link3
/Volumes/bbtest/20-hardlinks/some-file
/Volumes/bbtest/30-resource-forks
/Volumes/bbtest/30-resource-forks/hl-rfork1
/Volumes/bbtest/30-resource-forks/hl-rfork2
/Volumes/bbtest/30-resource-forks/some-file
/Volumes/bbtest/40-finder-flags
/Volumes/bbtest/40-finder-flags/bundle-dir
/Volumes/bbtest/40-finder-flags/bundle-dir/stuff
/Volumes/bbtest/40-finder-flags/hidden-extension.txt
/Volumes/bbtest/40-finder-flags/invisible-dir
/Volumes/bbtest/40-finder-flags/mucho-flags-dir
/Volumes/bbtest/40-finder-flags/mucho-flags-file
/Volumes/bbtest/40-finder-flags/system-file
/Volumes/bbtest/40-finder-flags/type-and-creator
/Volumes/bbtest/45-finder-locks
/Volumes/bbtest/45-finder-locks/locked-file
/Volumes/bbtest/50-creation-date
/Volumes/bbtest/50-creation-date/creation-date-test
/Volumes/bbtest/60-bsd-flags
/Volumes/bbtest/60-bsd-flags/dir-with-flags
/Volumes/bbtest/60-bsd-flags/file-with-flags
/Volumes/bbtest/70-extended-attrs
/Volumes/bbtest/70-extended-attrs/dir-with-xattrs
/Volumes/bbtest/70-extended-attrs/symlink-with-xattrs
/Volumes/bbtest/70-extended-attrs/xattr-test
/Volumes/bbtest/80-access-control-lists
/Volumes/bbtest/80-access-control-lists/acl-test
/Volumes/bbtest/80-access-control-lists/acl-test-dir
/Volumes/bbtest/90-fifo
/Volumes/bbtest/90-fifo/some-fifo
/Volumes/bbtest/95-devices
/Volumes/bbtest/95-devices/devvn0
/Volumes/bbtest/95-devices/devzero
/Volumes/bbtest/99-combo-tests
/Volumes/bbtest/99-combo-tests/many-metadata
/Volumes/bbtest/99-combo-tests/xattr-with-rfork
/Volumes/bbtest/bbouncer-vol

Time: 0.2s
Checked: 69 paths, 365 bytes, 365 B
Saved: 69 paths, 162 bytes, 162 B
Excluded: 0
Dupbytes: 42, 42 B, 25%
Space: 240 B, 139 KB total
No errors
+ hb get -c hb /Volumes/bbtest
HashBackup build #1525 Copyright 2009-2016 HashBackup, LLC
Backup directory: /hbtest/Backup-Bouncer-master/hb
Most recent backup version: 0
Restoring most recent version

Restoring bbtest to /hbtest/Backup-Bouncer-master
/hbtest/Backup-Bouncer-master/bbtest
/hbtest/Backup-Bouncer-master/bbtest/.Trashes
/hbtest/Backup-Bouncer-master/bbtest/.Trashes/501
/hbtest/Backup-Bouncer-master/bbtest/.fseventsd
/hbtest/Backup-Bouncer-master/bbtest/.fseventsd/fseventsd-uuid
/hbtest/Backup-Bouncer-master/bbtest/00-basic-permissions
/hbtest/Backup-Bouncer-master/bbtest/00-basic-permissions/owned-by-me
/hbtest/Backup-Bouncer-master/bbtest/00-basic-permissions/owned-by-root
/hbtest/Backup-Bouncer-master/bbtest/00-basic-permissions/owned-by-www
/hbtest/Backup-Bouncer-master/bbtest/00-basic-permissions/some-dir
/hbtest/Backup-Bouncer-master/bbtest/05-timestamps
/hbtest/Backup-Bouncer-master/bbtest/05-timestamps/some-dir
/hbtest/Backup-Bouncer-master/bbtest/05-timestamps/some-file
/hbtest/Backup-Bouncer-master/bbtest/05-timestamps/some-hardlink
/hbtest/Backup-Bouncer-master/bbtest/10-symlinks
/hbtest/Backup-Bouncer-master/bbtest/10-symlinks/broken_symlink
/hbtest/Backup-Bouncer-master/bbtest/10-symlinks/link2broken_symlink
/hbtest/Backup-Bouncer-master/bbtest/10-symlinks/some-file
/hbtest/Backup-Bouncer-master/bbtest/10-symlinks/symlink1
/hbtest/Backup-Bouncer-master/bbtest/10-symlinks/symlink2
/hbtest/Backup-Bouncer-master/bbtest/10-symlinks/symlink3
/hbtest/Backup-Bouncer-master/bbtest/15-symlink-ownership
/hbtest/Backup-Bouncer-master/bbtest/15-symlink-ownership/some-file
/hbtest/Backup-Bouncer-master/bbtest/15-symlink-ownership/symlink1
/hbtest/Backup-Bouncer-master/bbtest/15-symlink-ownership/symlink2
/hbtest/Backup-Bouncer-master/bbtest/15-symlink-ownership/symlink3
/hbtest/Backup-Bouncer-master/bbtest/20-hardlinks
/hbtest/Backup-Bouncer-master/bbtest/20-hardlinks/link1
/hbtest/Backup-Bouncer-master/bbtest/20-hardlinks/link2
/hbtest/Backup-Bouncer-master/bbtest/20-hardlinks/link3
/hbtest/Backup-Bouncer-master/bbtest/20-hardlinks/some-file
/hbtest/Backup-Bouncer-master/bbtest/30-resource-forks
/hbtest/Backup-Bouncer-master/bbtest/30-resource-forks/hl-rfork1
/hbtest/Backup-Bouncer-master/bbtest/30-resource-forks/hl-rfork2
/hbtest/Backup-Bouncer-master/bbtest/30-resource-forks/some-file
/hbtest/Backup-Bouncer-master/bbtest/40-finder-flags
/hbtest/Backup-Bouncer-master/bbtest/40-finder-flags/bundle-dir
/hbtest/Backup-Bouncer-master/bbtest/40-finder-flags/bundle-dir/stuff
/hbtest/Backup-Bouncer-master/bbtest/40-finder-flags/hidden-extension.txt
/hbtest/Backup-Bouncer-master/bbtest/40-finder-flags/invisible-dir
/hbtest/Backup-Bouncer-master/bbtest/40-finder-flags/mucho-flags-dir
/hbtest/Backup-Bouncer-master/bbtest/40-finder-flags/mucho-flags-file
/hbtest/Backup-Bouncer-master/bbtest/40-finder-flags/system-file
/hbtest/Backup-Bouncer-master/bbtest/40-finder-flags/type-and-creator
/hbtest/Backup-Bouncer-master/bbtest/45-finder-locks
/hbtest/Backup-Bouncer-master/bbtest/45-finder-locks/locked-file
/hbtest/Backup-Bouncer-master/bbtest/50-creation-date
/hbtest/Backup-Bouncer-master/bbtest/50-creation-date/creation-date-test
/hbtest/Backup-Bouncer-master/bbtest/60-bsd-flags
/hbtest/Backup-Bouncer-master/bbtest/60-bsd-flags/dir-with-flags
/hbtest/Backup-Bouncer-master/bbtest/60-bsd-flags/file-with-flags
/hbtest/Backup-Bouncer-master/bbtest/70-extended-attrs
/hbtest/Backup-Bouncer-master/bbtest/70-extended-attrs/dir-with-xattrs
/hbtest/Backup-Bouncer-master/bbtest/70-extended-attrs/symlink-with-xattrs
/hbtest/Backup-Bouncer-master/bbtest/70-extended-attrs/xattr-test
/hbtest/Backup-Bouncer-master/bbtest/80-access-control-lists
/hbtest/Backup-Bouncer-master/bbtest/80-access-control-lists/acl-test
/hbtest/Backup-Bouncer-master/bbtest/80-access-control-lists/acl-test-dir
/hbtest/Backup-Bouncer-master/bbtest/90-fifo
/hbtest/Backup-Bouncer-master/bbtest/90-fifo/some-fifo
/hbtest/Backup-Bouncer-master/bbtest/95-devices
/hbtest/Backup-Bouncer-master/bbtest/95-devices/devvn0
/hbtest/Backup-Bouncer-master/bbtest/95-devices/devzero
/hbtest/Backup-Bouncer-master/bbtest/99-combo-tests
/hbtest/Backup-Bouncer-master/bbtest/99-combo-tests/many-metadata
/hbtest/Backup-Bouncer-master/bbtest/99-combo-tests/xattr-with-rfork
/hbtest/Backup-Bouncer-master/bbtest/bbouncer-vol
Restored /Volumes/bbtest to /hbtest/Backup-Bouncer-master/bbtest
No errors
+ ./bbouncer verify /Volumes/bbtest bbtest
Verifying:    basic-permissions ... ok (Critical)
Verifying:           timestamps ... ok (Critical)
Verifying:             symlinks ... ok (Critical)
Verifying:    symlink-ownership ... ok
Verifying:            hardlinks ... ok (Important)
Verifying:       resource-forks ... ok (Critical)
Verifying:         finder-flags ... ok (Critical)
Verifying:         finder-locks ... ok
Verifying:        creation-date ... ok
Verifying:            bsd-flags ... ok
Verifying:       extended-attrs ... ok (Important)
Verifying: access-control-lists ... ok (Important)
Verifying:                 fifo ... ok
Verifying:              devices ... ok
Verifying:          combo-tests ... ok
sh-3.2#

Script used to run Backup Bouncer test for HashBackup. Must be run as root to pass the BB test!

#--------- Begin Script ----------------
# unpack Backup Bouncer

# echo commands

set -x
rm -rf Backup-Bouncer-master
unzip Backup-Bouncer-master.zip

# make Backup Bouncer

cd Backup-Bouncer-master
make

# patch BB to remove the nodump attribute
# nodump means "don't save this file", HB honors that,
# but BB expects HB to save the file

patch --context -p1 <<EOF
*** a/tests.d/60-bsd-flags.test
--- b/tests.d/60-bsd-flags.test
***************
*** 38,43 ****
      mkdir dir-with-flags
!     chflags uappnd,uchg,nodump,opaque dir-with-flags

      touch file-with-flags
!     chflags uappnd,uchg,nodump,opaque file-with-flags

--- 38,43 ----
      mkdir dir-with-flags
!     chflags uappnd,uchg,opaque dir-with-flags

      touch file-with-flags
!     chflags uappnd,uchg,opaque file-with-flags

EOF

patch --context -p1 <<EOF
*** a/tests.d/99-combo-tests.test
--- b/tests.d/99-combo-tests.test
***************
*** 31,33 ****
      sudo chown www:www many-metadata
!     chflags uappnd,nodump many-metadata
      # Lock the file to make sure the copier doesn't lock it too early
--- 31,33 ----
      sudo chown www:www many-metadata
!     chflags uappnd many-metadata
      # Lock the file to make sure the copier doesn't lock it too early
EOF

# create BB volume and test data

umount -f /Volumes/bbtest
rm -f bbtest.sparseimage
./bbouncer create-vol bbtest
./bbouncer create /Volumes/bbtest

# create the HashBackup backup directory

hb init -c hb

# backup the source directory, then restore it

hb backup -c hb /Volumes/bbtest -v3
hb get -c hb /Volumes/bbtest

# let Backup Bouncer verify the restore

./bbouncer verify /Volumes/bbtest bbtest

#-------- End Script ------------