aboutsummaryrefslogtreecommitdiff
path: root/usr.bin/mkimg/tests/mkimg.sh
blob: 76abcebec65c4bd8aa80c445acd59c3d92abe732 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
# $FreeBSD$

mkimg_blksz_list="512 4096"
mkimg_format_list="qcow qcow2 raw vhd vhdf vmdk"
mkimg_geom_list="1x1 63x255"
mkimg_scheme_list="apm bsd ebr gpt mbr vtoc8"

bootcode()
{
    case $1 in
      bsd)	echo 8192 ;;
      gpt|mbr)	echo 512 ;;
      *)	echo 0 ;;
    esac
    return 0
}

mkcontents()
{
    local byte count name

    byte=$1
    count=$2

    name=_tmp-$byte-$count.bin
    jot -b $byte $(($count/2)) > $name
    echo $name
    return 0
}

makeimage()
{
    local blksz bootarg bootsz format geom nhds nsecs partarg pfx scheme

    format=$1
    scheme=$2
    blksz=$3
    geom=$4
    pfx=$5
    shift 5

    nsecs=${geom%x*}
    nhds=${geom#*x}

    bootsz=`bootcode $scheme`
    if test $bootsz -gt 0; then
	bootarg="-b `mkcontents B $bootsz`"
    else
	bootarg=""
    fi

    partarg=""
    for P in $*; do
	partarg="$partarg -p $P"
    done
    if test -z "$partarg"; then
	local swap ufs
	swap="-p freebsd-swap::128K"
	ufs="-p freebsd-ufs:=`mkcontents P 4194304`"
	partarg="$ufs $swap"
    fi

    imagename=$pfx-$geom-$blksz-$scheme.$format

    mkimg -y -f $format -o $imagename -s $scheme -P $blksz -H $nhds -T $nsecs \
	    $bootarg $partarg
    echo $imagename
    return 0
}

mkimg_rebase()
{
    local baseline image result tmpfile update

    image=$1
    result=$2

    baseline=$image.gz.uu
    update=yes

    if test -f $baseline; then
	tmpfile=_tmp-baseline
	uudecode -p $baseline | gunzip -c > $tmpfile
	if cmp -s $tmpfile $result; then
	    update=no
	fi
    fi

    if test $update = yes; then
	# Prevent keyword expansion when writing the keyword.
	(echo -n '# $'; echo -n FreeBSD; echo '$') > $baseline
	gzip -c $result | uuencode $image.gz >> $baseline
    fi

    rm $image $result _tmp-*
    return 0
}

mkimg_test()
{
    local blksz format geom scheme

    geom=$1
    blksz=$2
    scheme=$3
    format=$4

    case $scheme in
      ebr|mbr)
	bsd=`makeimage raw bsd $blksz $geom _tmp`
	partinfo="freebsd:=$bsd"
	;;
      *)
	partinfo=""
	;;
    esac
    image=`makeimage $format $scheme $blksz $geom img $partinfo`
    result=$image.out
    hexdump -C $image > $result
    if test "x$mkimg_update_baseline" = "xyes"; then
	mkimg_rebase $image $result
    else
	baseline=`atf_get_srcdir`/$image
	atf_check -s exit:0 cmp -s $baseline $result
    fi
    return 0
}

atf_test_case rebase
rebase_body()
{
    local nm

    mkimg_update_baseline=yes
    for nm in $mkimg_tests; do
	${nm}_body
    done
    return 0
}

atf_init_test_cases()
{
    local B F G S nm

    for G in $mkimg_geom_list; do
	for B in $mkimg_blksz_list; do
	    for S in $mkimg_scheme_list; do
		for F in $mkimg_format_list; do
		    nm="${S}_${G}_${B}_${F}"
		    atf_test_case $nm
		    eval "${nm}_body() { mkimg_test $G $B $S $F; }"
		    mkimg_tests="${mkimg_tests} ${nm}"
		    atf_add_test_case $nm
		done
	    done
	done
    done

    # XXX hack to make updating the baseline easier
    if test "${__RUNNING_INSIDE_ATF_RUN}" != "internal-yes-value"; then
	atf_add_test_case rebase
    fi
}