Skip to content

Commit 0ee332b

Browse files
committed
ci(TEST-62-CPIO): add CPIO test
Provides some coverage for the skipcpio and padcpio binaries. Signed-off-by: David Disseldorp <ddiss@suse.de>
1 parent 7df678e commit 0ee332b

File tree

2 files changed

+164
-0
lines changed

2 files changed

+164
-0
lines changed

test/TEST-62-CPIO/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
-include ../Makefile.testdir

test/TEST-62-CPIO/test.sh

Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
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

Comments
 (0)