1271911Smarcel# $FreeBSD: releng/11.0/usr.bin/mkimg/tests/mkimg.sh 272088 2014-09-24 22:58:10Z marcel $
2271911Smarcel
3271911Smarcelmkimg_blksz_list="512 4096"
4272088Smarcelmkimg_format_list="qcow qcow2 raw vhd vhdf vmdk"
5271911Smarcelmkimg_geom_list="1x1 63x255"
6271911Smarcelmkimg_scheme_list="apm bsd ebr gpt mbr pc98 vtoc8"
7271911Smarcel
8271911Smarcelbootcode()
9271911Smarcel{
10271911Smarcel    case $1 in
11271911Smarcel      bsd|pc98)	echo 8192 ;;
12271911Smarcel      gpt|mbr)	echo 512 ;;
13271911Smarcel      *)	echo 0 ;;
14271911Smarcel    esac
15271911Smarcel    return 0
16271911Smarcel}
17271911Smarcel
18271911Smarcelmkcontents()
19271911Smarcel{
20271911Smarcel    local byte count name
21271911Smarcel
22271911Smarcel    byte=$1
23271911Smarcel    count=$2
24271911Smarcel
25271911Smarcel    name=_tmp-$byte-$count.bin
26271911Smarcel    jot -b $byte $(($count/2)) > $name
27271911Smarcel    echo $name
28271911Smarcel    return 0
29271911Smarcel}
30271911Smarcel
31271911Smarcelmakeimage()
32271911Smarcel{
33271911Smarcel    local blksz bootarg bootsz format geom nhds nsecs partarg pfx scheme
34271911Smarcel
35271911Smarcel    format=$1
36271911Smarcel    scheme=$2
37271911Smarcel    blksz=$3
38271911Smarcel    geom=$4
39271911Smarcel    pfx=$5
40271911Smarcel    shift 5
41271911Smarcel
42271911Smarcel    nsecs=${geom%x*}
43271911Smarcel    nhds=${geom#*x}
44271911Smarcel
45271911Smarcel    bootsz=`bootcode $scheme`
46271911Smarcel    if test $bootsz -gt 0; then
47271911Smarcel	bootarg="-b `mkcontents B $bootsz`"
48271911Smarcel    else
49271911Smarcel	bootarg=""
50271911Smarcel    fi
51271911Smarcel
52271911Smarcel    partarg=""
53271911Smarcel    for P in $*; do
54271911Smarcel	partarg="$partarg -p $P"
55271911Smarcel    done
56271911Smarcel    if test -z "$partarg"; then
57271911Smarcel	local swap ufs
58271911Smarcel	swap="-p freebsd-swap::128K"
59271911Smarcel	ufs="-p freebsd-ufs:=`mkcontents P 4194304`"
60271911Smarcel	partarg="$ufs $swap"
61271911Smarcel    fi
62271911Smarcel
63271911Smarcel    imagename=$pfx-$geom-$blksz-$scheme.$format
64271911Smarcel
65271911Smarcel    mkimg -y -f $format -o $imagename -s $scheme -P $blksz -H $nhds -T $nsecs \
66271911Smarcel	    $bootarg $partarg
67271911Smarcel    echo $imagename
68271911Smarcel    return 0
69271911Smarcel}
70271911Smarcel
71271979Smarcelmkimg_rebase()
72271979Smarcel{
73271979Smarcel    local baseline image result tmpfile update
74271979Smarcel
75271979Smarcel    image=$1
76271979Smarcel    result=$2
77271979Smarcel
78271979Smarcel    baseline=$image.gz.uu
79271979Smarcel    update=yes
80271979Smarcel
81271979Smarcel    if test -f $baseline; then
82271979Smarcel	tmpfile=_tmp-baseline
83271979Smarcel	uudecode -p $baseline | gunzip -c > $tmpfile
84271979Smarcel	if cmp -s $tmpfile $result; then
85271979Smarcel	    update=no
86271979Smarcel	fi
87271979Smarcel    fi
88271979Smarcel
89271979Smarcel    if test $update = yes; then
90271979Smarcel	# Prevent keyword expansion when writing the keyword.
91271979Smarcel	(echo -n '# $'; echo -n FreeBSD; echo '$') > $baseline
92271979Smarcel	gzip -c $result | uuencode $image.gz >> $baseline
93271979Smarcel    fi
94271979Smarcel
95271979Smarcel    rm $image $result _tmp-*
96271979Smarcel    return 0
97271979Smarcel}
98271979Smarcel
99271911Smarcelmkimg_test()
100271911Smarcel{
101271911Smarcel    local blksz format geom scheme
102271911Smarcel
103271911Smarcel    geom=$1
104271911Smarcel    blksz=$2
105271911Smarcel    scheme=$3
106271911Smarcel    format=$4
107271911Smarcel
108271911Smarcel    case $scheme in
109271911Smarcel      ebr|mbr|pc98)
110271911Smarcel	bsd=`makeimage raw bsd $blksz $geom _tmp`
111271911Smarcel	partinfo="freebsd:=$bsd"
112271911Smarcel	;;
113271911Smarcel      *)
114271911Smarcel	partinfo=""
115271911Smarcel	;;
116271911Smarcel    esac
117271911Smarcel    image=`makeimage $format $scheme $blksz $geom img $partinfo`
118271911Smarcel    result=$image.out
119271911Smarcel    hexdump -C $image > $result
120271911Smarcel    if test "x$mkimg_update_baseline" = "xyes"; then
121271979Smarcel	mkimg_rebase $image $result
122271911Smarcel    else
123271979Smarcel	baseline=`atf_get_srcdir`/$image
124271911Smarcel	atf_check -s exit:0 cmp -s $baseline $result
125271911Smarcel    fi
126271911Smarcel    return 0
127271911Smarcel}
128271911Smarcel
129271911Smarcelatf_test_case rebase
130271911Smarcelrebase_body()
131271911Smarcel{
132271911Smarcel    local nm
133271911Smarcel
134271911Smarcel    mkimg_update_baseline=yes
135271911Smarcel    for nm in $mkimg_tests; do
136271911Smarcel	${nm}_body
137271911Smarcel    done
138271911Smarcel    return 0
139271911Smarcel}
140271911Smarcel
141271911Smarcelatf_init_test_cases()
142271911Smarcel{
143271981Smarcel    local B F G S nm
144271911Smarcel
145271911Smarcel    for G in $mkimg_geom_list; do
146271911Smarcel	for B in $mkimg_blksz_list; do
147271911Smarcel	    for S in $mkimg_scheme_list; do
148271911Smarcel		for F in $mkimg_format_list; do
149271981Smarcel		    nm="${S}_${G}_${B}_${F}"
150271911Smarcel		    atf_test_case $nm
151271911Smarcel		    eval "${nm}_body() { mkimg_test $G $B $S $F; }"
152271911Smarcel		    mkimg_tests="${mkimg_tests} ${nm}"
153271911Smarcel		    atf_add_test_case $nm
154271911Smarcel		done
155271911Smarcel	    done
156271911Smarcel	done
157271911Smarcel    done
158271911Smarcel
159271911Smarcel    # XXX hack to make updating the baseline easier
160271911Smarcel    if test "${__RUNNING_INSIDE_ATF_RUN}" != "internal-yes-value"; then
161271911Smarcel	atf_add_test_case rebase
162271911Smarcel    fi
163271911Smarcel}
164271911Smarcel
165