xref: /aosp_15_r20/external/rootdev/rootdev_test.sh (revision 9bcc1fc0ac6cc0ff33916f8e6ce540d24c01bac6)
1*9bcc1fc0SBob Badour#!/bin/bash
2*9bcc1fc0SBob Badour# Copyright 2010 The Chromium OS Authors. All rights reserved.
3*9bcc1fc0SBob Badour# Use of this source code is governed by a BSD-style license that can be
4*9bcc1fc0SBob Badour# found in the LICENSE file.
5*9bcc1fc0SBob Badour#
6*9bcc1fc0SBob Badour# Simple functional test harness for rootdev
7*9bcc1fc0SBob Badour# TODO(wad) rootdev should be rewritten in C++ and gmocked.
8*9bcc1fc0SBob Badour
9*9bcc1fc0SBob Badourset -u
10*9bcc1fc0SBob Badour
11*9bcc1fc0SBob Badourwarn () {
12*9bcc1fc0SBob Badour  echo "WARN: $@" 1>&2
13*9bcc1fc0SBob Badour}
14*9bcc1fc0SBob Badour
15*9bcc1fc0SBob Badourerror () {
16*9bcc1fc0SBob Badour  echo "ERROR: $@" 1>&2
17*9bcc1fc0SBob Badour  exit 1
18*9bcc1fc0SBob Badour}
19*9bcc1fc0SBob Badour
20*9bcc1fc0SBob BadourPASS_COUNT=0
21*9bcc1fc0SBob Badourpass () {
22*9bcc1fc0SBob Badour  echo "PASS:$1" 1>&2
23*9bcc1fc0SBob Badour  PASS_COUNT=$((PASS_COUNT + 1))
24*9bcc1fc0SBob Badour  return 0
25*9bcc1fc0SBob Badour}
26*9bcc1fc0SBob Badour
27*9bcc1fc0SBob BadourFAIL_COUNT=0
28*9bcc1fc0SBob Badourfail () {
29*9bcc1fc0SBob Badour  echo "FAIL:$1" 1>&2
30*9bcc1fc0SBob Badour  FAIL_COUNT=$((FAIL_COUNT + 1))
31*9bcc1fc0SBob Badour  return 0
32*9bcc1fc0SBob Badour}
33*9bcc1fc0SBob Badour
34*9bcc1fc0SBob BadourWORKDIR=
35*9bcc1fc0SBob Badourcleanup () {
36*9bcc1fc0SBob Badour  if [ -n "$WORKDIR" ]; then
37*9bcc1fc0SBob Badour    rm -rf "$WORKDIR"
38*9bcc1fc0SBob Badour  fi
39*9bcc1fc0SBob Badour  trap - EXIT
40*9bcc1fc0SBob Badour}
41*9bcc1fc0SBob Badour
42*9bcc1fc0SBob Badoursetup () {
43*9bcc1fc0SBob Badour  WORKDIR=$(mktemp -d rootdev_test.XXXXXXX)
44*9bcc1fc0SBob Badour  if [ ! -d "$WORKDIR" ]; then
45*9bcc1fc0SBob Badour    error "Failed to create temporary work dir"
46*9bcc1fc0SBob Badour  fi
47*9bcc1fc0SBob Badour  trap cleanup EXIT
48*9bcc1fc0SBob Badour}
49*9bcc1fc0SBob Badour
50*9bcc1fc0SBob Badourrun_test () {
51*9bcc1fc0SBob Badour  setup
52*9bcc1fc0SBob Badour  echo "RUN:$1" 1>&2
53*9bcc1fc0SBob Badour  eval $1
54*9bcc1fc0SBob Badour  ret=$?
55*9bcc1fc0SBob Badour  cleanup
56*9bcc1fc0SBob Badour  if [ $ret -eq 0 ]; then
57*9bcc1fc0SBob Badour    pass $1
58*9bcc1fc0SBob Badour  else
59*9bcc1fc0SBob Badour    fail $1
60*9bcc1fc0SBob Badour  fi
61*9bcc1fc0SBob Badour}
62*9bcc1fc0SBob Badour
63*9bcc1fc0SBob Badourexpect () {
64*9bcc1fc0SBob Badour  cond="$1"
65*9bcc1fc0SBob Badour  eval test $1
66*9bcc1fc0SBob Badour  if [ $? -ne 0 ]; then
67*9bcc1fc0SBob Badour    warn "expect: $1"
68*9bcc1fc0SBob Badour    return 1
69*9bcc1fc0SBob Badour  fi
70*9bcc1fc0SBob Badour  return 0
71*9bcc1fc0SBob Badour}
72*9bcc1fc0SBob Badour
73*9bcc1fc0SBob BadourROOTDEV=${1:-./rootdev}
74*9bcc1fc0SBob Badourif [[ ! -e ${ROOTDEV} ]]; then
75*9bcc1fc0SBob Badour  error "could not find rootdev '${ROOTDEV}'"
76*9bcc1fc0SBob Badourfi
77*9bcc1fc0SBob Badour
78*9bcc1fc0SBob Badourif [ "${USER:-}" != "root" ]; then
79*9bcc1fc0SBob Badour  error "Must be run as root to use mknod (${USER:-})"
80*9bcc1fc0SBob Badourfi
81*9bcc1fc0SBob Badour
82*9bcc1fc0SBob Badourt00_bad_sys_dir () {
83*9bcc1fc0SBob Badour  out=$("${ROOTDEV}" --block $WORKDIR 2>/dev/null)
84*9bcc1fc0SBob Badour  expect "$? -ne 0" || return 1
85*9bcc1fc0SBob Badour  expect "-z '$out'" || return 1
86*9bcc1fc0SBob Badour}
87*9bcc1fc0SBob Badourrun_test t00_bad_sys_dir
88*9bcc1fc0SBob Badour
89*9bcc1fc0SBob Badourh00_setup_sda_tree() {
90*9bcc1fc0SBob Badour  local block=$1
91*9bcc1fc0SBob Badour  local dev=$2
92*9bcc1fc0SBob Badour  mkdir -p $block
93*9bcc1fc0SBob Badour  mkdir -p $dev
94*9bcc1fc0SBob Badour  mkdir -p $block/sda/sda1
95*9bcc1fc0SBob Badour  mkdir -p $block/sda/sda2
96*9bcc1fc0SBob Badour  echo "10:0" > $block/sda/dev
97*9bcc1fc0SBob Badour  echo "10:1" > $block/sda/sda1/dev
98*9bcc1fc0SBob Badour  echo "10:2" > $block/sda/sda2/dev
99*9bcc1fc0SBob Badour  mknod $dev/sda1 b 10 1
100*9bcc1fc0SBob Badour  mknod $dev/sda2 b 10 2
101*9bcc1fc0SBob Badour  mknod $dev/sda b 10 0
102*9bcc1fc0SBob Badour}
103*9bcc1fc0SBob Badour
104*9bcc1fc0SBob Badourt01_sys_dev_match () {
105*9bcc1fc0SBob Badour  local block=$WORKDIR/sys/block
106*9bcc1fc0SBob Badour  local dev=$WORKDIR/dev
107*9bcc1fc0SBob Badour  h00_setup_sda_tree $block $dev
108*9bcc1fc0SBob Badour
109*9bcc1fc0SBob Badour  out=$("${ROOTDEV}" --dev $dev --block $block --major 10 --minor 1 2>/dev/null)
110*9bcc1fc0SBob Badour  expect "$? -eq 0" || return 1
111*9bcc1fc0SBob Badour  expect "'$dev/sda1' = '$out'" || return 1
112*9bcc1fc0SBob Badour}
113*9bcc1fc0SBob Badourrun_test t01_sys_dev_match
114*9bcc1fc0SBob Badour
115*9bcc1fc0SBob Badourt02_sys_dev_match_block () {
116*9bcc1fc0SBob Badour  local block=$WORKDIR/sys/block
117*9bcc1fc0SBob Badour  local dev=$WORKDIR/dev
118*9bcc1fc0SBob Badour  h00_setup_sda_tree $block $dev
119*9bcc1fc0SBob Badour
120*9bcc1fc0SBob Badour  out=$("${ROOTDEV}" --dev $dev --block $block --major 10 --minor 0 2>/dev/null)
121*9bcc1fc0SBob Badour  expect "$? -eq 0" || return 1
122*9bcc1fc0SBob Badour  expect "'$dev/sda' = '$out'" || return 1
123*9bcc1fc0SBob Badour}
124*9bcc1fc0SBob Badourrun_test t02_sys_dev_match_block
125*9bcc1fc0SBob Badour
126*9bcc1fc0SBob Badourt03_sys_dev_match_block_no_dev () {
127*9bcc1fc0SBob Badour  local block=$WORKDIR/sys/block
128*9bcc1fc0SBob Badour  local dev=$WORKDIR/dev
129*9bcc1fc0SBob Badour  h00_setup_sda_tree $block $dev
130*9bcc1fc0SBob Badour  rm $dev/sda
131*9bcc1fc0SBob Badour
132*9bcc1fc0SBob Badour  out=$("${ROOTDEV}" --dev $dev --block $block --major 10 --minor 0 2>/dev/null)
133*9bcc1fc0SBob Badour  expect "$? -eq 1" || return 1
134*9bcc1fc0SBob Badour  expect "'$dev/sda' = '$out'" || return 1
135*9bcc1fc0SBob Badour}
136*9bcc1fc0SBob Badourrun_test t03_sys_dev_match_block_no_dev
137*9bcc1fc0SBob Badour
138*9bcc1fc0SBob Badourt04_sys_dev_match_block_no_dev_ignore () {
139*9bcc1fc0SBob Badour  local block=$WORKDIR/sys/block
140*9bcc1fc0SBob Badour  local dev=$WORKDIR/dev
141*9bcc1fc0SBob Badour  h00_setup_sda_tree $block $dev
142*9bcc1fc0SBob Badour  rm $dev/sda
143*9bcc1fc0SBob Badour
144*9bcc1fc0SBob Badour  out=$("${ROOTDEV}" -i --dev $dev --block $block --major 10 --minor 0 2>/dev/null)
145*9bcc1fc0SBob Badour  expect "$? -eq 0" || return 1
146*9bcc1fc0SBob Badour  expect "'$dev/sda' = '$out'" || return 1
147*9bcc1fc0SBob Badour}
148*9bcc1fc0SBob Badourrun_test t04_sys_dev_match_block_no_dev_ignore
149*9bcc1fc0SBob Badour
150*9bcc1fc0SBob Badour
151*9bcc1fc0SBob Badourh01_setup_dm_tree() {
152*9bcc1fc0SBob Badour  local block=$1
153*9bcc1fc0SBob Badour  local dev=$2
154*9bcc1fc0SBob Badour  mkdir -p $block
155*9bcc1fc0SBob Badour  mkdir -p $dev
156*9bcc1fc0SBob Badour  mkdir -p $block/dm-0
157*9bcc1fc0SBob Badour  mkdir -p $block/dm-0/slaves/sda1
158*9bcc1fc0SBob Badour  echo "254:0" > $block/dm-0/dev
159*9bcc1fc0SBob Badour  echo "10:1" > $block/dm-0/slaves/sda1/dev
160*9bcc1fc0SBob Badour  mknod $dev/dm-0 b 254 0
161*9bcc1fc0SBob Badour}
162*9bcc1fc0SBob Badour
163*9bcc1fc0SBob Badourt05_match_dm () {
164*9bcc1fc0SBob Badour  local block=$WORKDIR/sys/block
165*9bcc1fc0SBob Badour  local dev=$WORKDIR/dev
166*9bcc1fc0SBob Badour  h00_setup_sda_tree $block $dev
167*9bcc1fc0SBob Badour  h01_setup_dm_tree $block $dev
168*9bcc1fc0SBob Badour
169*9bcc1fc0SBob Badour  out=$("${ROOTDEV}" --dev $dev --block $block --major 254 --minor 0 \
170*9bcc1fc0SBob Badour        2>/dev/null)
171*9bcc1fc0SBob Badour  expect "$? -eq 0" || return 1
172*9bcc1fc0SBob Badour  expect "'$dev/dm-0' = '$out'" || return 1
173*9bcc1fc0SBob Badour}
174*9bcc1fc0SBob Badourrun_test t05_match_dm
175*9bcc1fc0SBob Badour
176*9bcc1fc0SBob Badourt06_match_dm_slave () {
177*9bcc1fc0SBob Badour  local block=$WORKDIR/sys/block
178*9bcc1fc0SBob Badour  local dev=$WORKDIR/dev
179*9bcc1fc0SBob Badour  h00_setup_sda_tree $block $dev
180*9bcc1fc0SBob Badour  h01_setup_dm_tree $block $dev
181*9bcc1fc0SBob Badour
182*9bcc1fc0SBob Badour  out=$("${ROOTDEV}" -s --dev $dev --block $block --major 254 --minor 0 \
183*9bcc1fc0SBob Badour        2>/dev/null)
184*9bcc1fc0SBob Badour  expect "$? -eq 0" || return 1
185*9bcc1fc0SBob Badour  expect "'$dev/sda1' = '$out'" || return 1
186*9bcc1fc0SBob Badour}
187*9bcc1fc0SBob Badourrun_test t06_match_dm_slave
188*9bcc1fc0SBob Badour
189*9bcc1fc0SBob Badourt07_safe_fail_on_no_slave () {
190*9bcc1fc0SBob Badour  local block=$WORKDIR/sys/block
191*9bcc1fc0SBob Badour  local dev=$WORKDIR/dev
192*9bcc1fc0SBob Badour  h00_setup_sda_tree $block $dev
193*9bcc1fc0SBob Badour  h01_setup_dm_tree $block $dev
194*9bcc1fc0SBob Badour
195*9bcc1fc0SBob Badour  out=$("${ROOTDEV}" -s --dev $dev --block $block --major 10 --minor 1 \
196*9bcc1fc0SBob Badour        2>/dev/null)
197*9bcc1fc0SBob Badour  expect "$? -eq 0" || return 1
198*9bcc1fc0SBob Badour  expect "'$dev/sda1' = '$out'" || return 1
199*9bcc1fc0SBob Badour}
200*9bcc1fc0SBob Badourrun_test t07_safe_fail_on_no_slave
201*9bcc1fc0SBob Badour
202*9bcc1fc0SBob Badourt08_safe_fail_on_no_slave_dev () {
203*9bcc1fc0SBob Badour  local block=$WORKDIR/sys/block
204*9bcc1fc0SBob Badour  local dev=$WORKDIR/dev
205*9bcc1fc0SBob Badour  h00_setup_sda_tree $block $dev
206*9bcc1fc0SBob Badour  h01_setup_dm_tree $block $dev
207*9bcc1fc0SBob Badour  # If the matching dev node is missing, an error code will be returned
208*9bcc1fc0SBob Badour  # but the path will still represent the slave.
209*9bcc1fc0SBob Badour  rm $dev/sda1
210*9bcc1fc0SBob Badour
211*9bcc1fc0SBob Badour  out=$("${ROOTDEV}" -s --dev $dev --block $block --major 254 --minor 0 \
212*9bcc1fc0SBob Badour        2>/dev/null)
213*9bcc1fc0SBob Badour  expect "$? -eq 1" || return 1
214*9bcc1fc0SBob Badour  expect "'$dev/sda1' = '$out'" || return 1
215*9bcc1fc0SBob Badour}
216*9bcc1fc0SBob Badourrun_test t08_safe_fail_on_no_slave_dev
217*9bcc1fc0SBob Badour
218*9bcc1fc0SBob Badourt09_safe_fail_on_no_slave_dev_ignore () {
219*9bcc1fc0SBob Badour  local block=$WORKDIR/sys/block
220*9bcc1fc0SBob Badour  local dev=$WORKDIR/dev
221*9bcc1fc0SBob Badour  h00_setup_sda_tree $block $dev
222*9bcc1fc0SBob Badour  h01_setup_dm_tree $block $dev
223*9bcc1fc0SBob Badour  # If the matching dev node is missing, an error code will be returned
224*9bcc1fc0SBob Badour  # but the path will still represent the slave.
225*9bcc1fc0SBob Badour  rm $dev/sda1
226*9bcc1fc0SBob Badour
227*9bcc1fc0SBob Badour  out=$("${ROOTDEV}" -i -s --dev $dev --block $block --major 254 --minor 0 \
228*9bcc1fc0SBob Badour        2>/dev/null)
229*9bcc1fc0SBob Badour  expect "$? -eq 0" || return 1
230*9bcc1fc0SBob Badour  expect "'$dev/sda1' = '$out'" || return 1
231*9bcc1fc0SBob Badour}
232*9bcc1fc0SBob Badourrun_test t09_safe_fail_on_no_slave_dev_ignore
233*9bcc1fc0SBob Badour
234*9bcc1fc0SBob Badourh02_setup_mmc_tree() {
235*9bcc1fc0SBob Badour  local block=$1
236*9bcc1fc0SBob Badour  local dev=$2
237*9bcc1fc0SBob Badour  mkdir -p $block
238*9bcc1fc0SBob Badour  mkdir -p $dev
239*9bcc1fc0SBob Badour  mkdir -p $block/mmcblk0/mmcblk0p1
240*9bcc1fc0SBob Badour  mkdir -p $block/mmcblk0/mmcblk0p2
241*9bcc1fc0SBob Badour  echo "11:0" > $block/mmcblk0/dev
242*9bcc1fc0SBob Badour  echo "11:1" > $block/mmcblk0/mmcblk0p1/dev
243*9bcc1fc0SBob Badour  echo "11:2" > $block/mmcblk0/mmcblk0p2/dev
244*9bcc1fc0SBob Badour  mknod $dev/mmcblk0 b 11 0
245*9bcc1fc0SBob Badour  mknod $dev/mmcblk0p1 b 11 1
246*9bcc1fc0SBob Badour  mknod $dev/mmcblk0p2 b 11 2
247*9bcc1fc0SBob Badour}
248*9bcc1fc0SBob Badour
249*9bcc1fc0SBob Badourt10_mmcdev () {
250*9bcc1fc0SBob Badour  local block=$WORKDIR/sys/block
251*9bcc1fc0SBob Badour  local dev=$WORKDIR/dev
252*9bcc1fc0SBob Badour  h02_setup_mmc_tree $block $dev
253*9bcc1fc0SBob Badour  out=$("${ROOTDEV}" --dev $dev --block $block --major 11 --minor 2 \
254*9bcc1fc0SBob Badour        2>/dev/null)
255*9bcc1fc0SBob Badour  expect "$? -eq 0" || return 1
256*9bcc1fc0SBob Badour  expect "'$dev/mmcblk0p2' = '$out'" || return 1
257*9bcc1fc0SBob Badour}
258*9bcc1fc0SBob Badourrun_test t10_mmcdev
259*9bcc1fc0SBob Badour
260*9bcc1fc0SBob Badourt11_mmcdev_strip () {
261*9bcc1fc0SBob Badour  local block=$WORKDIR/sys/block
262*9bcc1fc0SBob Badour  local dev=$WORKDIR/dev
263*9bcc1fc0SBob Badour  h02_setup_mmc_tree $block $dev
264*9bcc1fc0SBob Badour  out=$("${ROOTDEV}" -d --dev $dev --block $block --major 11 --minor 2 \
265*9bcc1fc0SBob Badour        2>/dev/null)
266*9bcc1fc0SBob Badour  expect "$? -eq 0" || return 1
267*9bcc1fc0SBob Badour  expect "'$dev/mmcblk0' = '$out'" || return 1
268*9bcc1fc0SBob Badour}
269*9bcc1fc0SBob Badourrun_test t11_mmcdev_strip
270*9bcc1fc0SBob Badour
271*9bcc1fc0SBob Badourt12_sda_strip () {
272*9bcc1fc0SBob Badour  local block=$WORKDIR/sys/block
273*9bcc1fc0SBob Badour  local dev=$WORKDIR/dev
274*9bcc1fc0SBob Badour  h00_setup_sda_tree $block $dev
275*9bcc1fc0SBob Badour  out=$("${ROOTDEV}" -d --dev $dev --block $block --major 10 --minor 2 \
276*9bcc1fc0SBob Badour        2>/dev/null)
277*9bcc1fc0SBob Badour  expect "$? -eq 0" || return 1
278*9bcc1fc0SBob Badour  expect "'$dev/sda' = '$out'" || return 1
279*9bcc1fc0SBob Badour}
280*9bcc1fc0SBob Badourrun_test t12_sda_strip
281*9bcc1fc0SBob Badour
282*9bcc1fc0SBob Badour# TODO(wad) add node creation tests
283*9bcc1fc0SBob Badour
284*9bcc1fc0SBob BadourTEST_COUNT=$((PASS_COUNT + FAIL_COUNT))
285*9bcc1fc0SBob Badour
286*9bcc1fc0SBob Badourecho "----"
287*9bcc1fc0SBob Badourecho "Test passed:  $PASS_COUNT / $TEST_COUNT"
288*9bcc1fc0SBob Badourecho "Test failed:  $FAIL_COUNT / $TEST_COUNT"
289*9bcc1fc0SBob Badour
290*9bcc1fc0SBob Badourif [ $FAIL_COUNT -ne 0 ]; then
291*9bcc1fc0SBob Badour  exit 1
292*9bcc1fc0SBob Badourfi
293