|
| 1 | +#!/bin/bash |
| 2 | +# This file is part of dracut. |
| 3 | +# SPDX-License-Identifier: GPL-2.0-or-later |
| 4 | + |
| 5 | +TEST_DESCRIPTION="test skipcpio and padcpio utilities" |
| 6 | + |
| 7 | +test_check() { |
| 8 | + which cpio dd truncate find sort diff &>/dev/null |
| 9 | +} |
| 10 | + |
| 11 | +skipcpio_simple() { |
| 12 | + mkdir -p "$CPIO_TESTDIR/skipcpio_simple/first_archive" |
| 13 | + pushd "$CPIO_TESTDIR/skipcpio_simple/first_archive" |
| 14 | + |
| 15 | + for ((i=0; i < 3; i++)); do |
| 16 | + echo "first archive file $i" >> ./$i |
| 17 | + done |
| 18 | + find . -print0 | sort -z \ |
| 19 | + | cpio -o --null -H newc --file "$CPIO_TESTDIR/skipcpio_simple.cpio" |
| 20 | + popd |
| 21 | + |
| 22 | + mkdir -p "$CPIO_TESTDIR/skipcpio_simple/second_archive" |
| 23 | + pushd "$CPIO_TESTDIR/skipcpio_simple/second_archive" |
| 24 | + |
| 25 | + for ((i=10; i < 13; i++)); do |
| 26 | + echo "second archive file $i" >> ./$i |
| 27 | + done |
| 28 | + # could also use the new cpio --chain option here... |
| 29 | + find . -print0 | sort -z \ |
| 30 | + | cpio -o --null -H newc >> "$CPIO_TESTDIR/skipcpio_simple.cpio" |
| 31 | + popd |
| 32 | + |
| 33 | + cat "$CPIO_TESTDIR/skipcpio_simple.cpio" | cpio -i --list \ |
| 34 | + > "$CPIO_TESTDIR/skipcpio_simple.list" |
| 35 | + cat <<EOF | diff - "$CPIO_TESTDIR/skipcpio_simple.list" |
| 36 | +. |
| 37 | +0 |
| 38 | +1 |
| 39 | +2 |
| 40 | +EOF |
| 41 | + |
| 42 | + $basedir/skipcpio/skipcpio "$CPIO_TESTDIR/skipcpio_simple.cpio" \ |
| 43 | + | cpio -i --list > "$CPIO_TESTDIR/skipcpio_simple.list" |
| 44 | + cat <<EOF | diff - "$CPIO_TESTDIR/skipcpio_simple.list" |
| 45 | +. |
| 46 | +10 |
| 47 | +11 |
| 48 | +12 |
| 49 | +EOF |
| 50 | +} |
| 51 | + |
| 52 | +# simple test with three filled files, all data segments should be aligned |
| 53 | +padcpio_simple() { |
| 54 | + local f1_content="This data will be aligned at 4K" |
| 55 | + local f2_content="This data will be aligned at 8K" |
| 56 | + local f3_content="This data will be aligned at 16K" |
| 57 | + |
| 58 | + mkdir -p "$CPIO_TESTDIR/padcpio_simple" |
| 59 | + echo "$f1_content" > "$CPIO_TESTDIR/padcpio_simple/f1" |
| 60 | + echo "$f2_content" > "$CPIO_TESTDIR/padcpio_simple/f2" |
| 61 | + truncate --size 6K "$CPIO_TESTDIR/padcpio_simple/f2" |
| 62 | + echo "$f3_content" > "$CPIO_TESTDIR/padcpio_simple/f3" |
| 63 | + |
| 64 | + pushd "$CPIO_TESTDIR/padcpio_simple" |
| 65 | + echo -n -e "f1\0f2\0f3\0" \ |
| 66 | + | $basedir/skipcpio/padcpio --align 4096 --paddir pad \ |
| 67 | + | cpio -o --null -H newc --file "$CPIO_TESTDIR/padcpio_simple.cpio" |
| 68 | + popd |
| 69 | + |
| 70 | + dd status=none bs=1 skip=4096 count="${#f1_content}" \ |
| 71 | + if="$CPIO_TESTDIR/padcpio_simple.cpio" | grep "$f1_content" |
| 72 | + dd status=none bs=1 skip=8192 count="${#f2_content}" \ |
| 73 | + if="$CPIO_TESTDIR/padcpio_simple.cpio" | grep "$f2_content" |
| 74 | + dd status=none bs=1 skip=16384 count="${#f3_content}" \ |
| 75 | + if="$CPIO_TESTDIR/padcpio_simple.cpio" | grep "$f3_content" |
| 76 | + cpio -i --list --file "$CPIO_TESTDIR/padcpio_simple.cpio" \ |
| 77 | + > "$CPIO_TESTDIR/padcpio_simple.list" |
| 78 | + cat <<EOF | diff - "$CPIO_TESTDIR/padcpio_simple.list" |
| 79 | +pad |
| 80 | +pad/0 |
| 81 | +f1 |
| 82 | +pad/1 |
| 83 | +f2 |
| 84 | +pad/2 |
| 85 | +f3 |
| 86 | +EOF |
| 87 | +} |
| 88 | + |
| 89 | +# three files only one above --min threshold, 4k alignment |
| 90 | +padcpio_min() { |
| 91 | + local f1_content="THIS data will be unaligned" |
| 92 | + local f2_content="this data will be unaligned" |
| 93 | + local f3_content="This data will be aligned at 4K" |
| 94 | + |
| 95 | + mkdir -p "$CPIO_TESTDIR/padcpio_min" |
| 96 | + echo "$f1_content" > "$CPIO_TESTDIR/padcpio_min/f1" |
| 97 | + echo "$f2_content" > "$CPIO_TESTDIR/padcpio_min/f2" |
| 98 | + echo "$f3_content" > "$CPIO_TESTDIR/padcpio_min/f3" |
| 99 | + truncate --size 4K "$CPIO_TESTDIR/padcpio_min/f3" |
| 100 | + |
| 101 | + pushd "$CPIO_TESTDIR/padcpio_min" |
| 102 | + find . -print0 | sort -z \ |
| 103 | + | $basedir/skipcpio/padcpio --min 4K --align 4K --paddir pad \ |
| 104 | + | cpio -o --null -H newc --file "$CPIO_TESTDIR/padcpio_min.cpio" |
| 105 | + popd |
| 106 | + |
| 107 | + dd status=none bs=1 skip=4096 count="${#f3_content}" \ |
| 108 | + if="$CPIO_TESTDIR/padcpio_min.cpio" | grep "$f3_content" |
| 109 | +} |
| 110 | + |
| 111 | +# GNU cpio defers hardlink processing until the last link is encountered. To |
| 112 | +# avoid this tracking padcpio just puts them (unaligned) at the end of the |
| 113 | +# archive. |
| 114 | +padcpio_links() { |
| 115 | + mkdir -p "$CPIO_TESTDIR/padcpio_links" |
| 116 | + echo "this is hardlinked" > "$CPIO_TESTDIR/padcpio_links/f1" |
| 117 | + ln "$CPIO_TESTDIR/padcpio_links/f1" "$CPIO_TESTDIR/padcpio_links/f2" |
| 118 | + echo "this is a symlink target" > "$CPIO_TESTDIR/padcpio_links/f3" |
| 119 | + truncate --size 6K "$CPIO_TESTDIR/padcpio_links/f3" |
| 120 | + ln -s "f3" "$CPIO_TESTDIR/padcpio_links/f4" |
| 121 | + |
| 122 | + pushd "$CPIO_TESTDIR/padcpio_links" |
| 123 | + echo -n -e "f1\0f2\0f3\0f4\0" \ |
| 124 | + | $basedir/skipcpio/padcpio --align 4096 --paddir paddy \ |
| 125 | + | cpio -o --null -H newc --file "$CPIO_TESTDIR/padcpio_links.cpio" |
| 126 | + popd |
| 127 | + |
| 128 | + cpio -i --list --file "$CPIO_TESTDIR/padcpio_links.cpio" \ |
| 129 | + > "$CPIO_TESTDIR/padcpio_links.list" |
| 130 | + cat <<EOF | diff - "$CPIO_TESTDIR/padcpio_links.list" |
| 131 | +paddy |
| 132 | +paddy/0 |
| 133 | +f3 |
| 134 | +f4 |
| 135 | +f1 |
| 136 | +f2 |
| 137 | +EOF |
| 138 | +} |
| 139 | + |
| 140 | +test_run() { |
| 141 | + set -x |
| 142 | + set -e |
| 143 | + |
| 144 | + skipcpio_simple |
| 145 | + |
| 146 | + padcpio_simple |
| 147 | + padcpio_min |
| 148 | + padcpio_links |
| 149 | + |
| 150 | + return 0 |
| 151 | +} |
| 152 | + |
| 153 | +test_setup() { |
| 154 | + export CPIO_TESTDIR=$(mktemp --directory -p "$TESTDIR" cpio-test.XXXXXXXXXX) |
| 155 | + return 0 |
| 156 | +} |
| 157 | + |
| 158 | +test_cleanup() { |
| 159 | + [ -d "$CPIO_TESTDIR" ] && rm -rf "$CPIO_TESTDIR" |
| 160 | + return 0 |
| 161 | +} |
| 162 | + |
| 163 | +. $testdir/test-functions |
0 commit comments