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