diff options
Diffstat (limited to 'rootdev_test.sh')
-rwxr-xr-x | rootdev_test.sh | 291 |
1 files changed, 291 insertions, 0 deletions
diff --git a/rootdev_test.sh b/rootdev_test.sh new file mode 100755 index 0000000..8c188c3 --- /dev/null +++ b/rootdev_test.sh @@ -0,0 +1,291 @@ +#!/bin/sh +# Copyright (C) 2010 The Chromium OS Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. +# +# Simple functional test harness for rootdev +# TODO(wad) rootdev should be rewritten in C++ and gmocked. + +set -u + +warn () { + echo "WARN: $@" 1>&2 +} + +error () { + echo "ERROR: $@" 1>&2 + exit 1 +} + +PASS_COUNT=0 +pass () { + echo "PASS:$1" 1>&2 + PASS_COUNT=$((PASS_COUNT + 1)) + return 0 +} + +FAIL_COUNT=0 +fail () { + echo "FAIL:$1" 1>&2 + FAIL_COUNT=$((FAIL_COUNT + 1)) + return 0 +} + +WORKDIR= +cleanup () { + if [ -n "$WORKDIR" ]; then + rm -rf "$WORKDIR" + fi + trap - EXIT +} + +setup () { + WORKDIR=$(mktemp -d rootdev_test.XXXXXXX) + if [ ! -d "$WORKDIR" ]; then + error "Failed to create temporary work dir" + fi + trap cleanup EXIT +} + +run_test () { + setup + echo "RUN:$1" 1>&2 + eval $1 + ret=$? + cleanup + if [ $ret -eq 0 ]; then + pass $1 + else + fail $1 + fi +} + +expect () { + cond="$1" + eval test $1 + if [ $? -ne 0 ]; then + warn "expect: $1" + return 1 + fi + return 0 +} + +if [ ! -e ./rootdev ]; then + error "rootdev must be in the cwd" +fi + +if [ "$USER" != "root" ]; then + error "Must be run as root to use mknod ($USER)" +fi + +t00_bad_sys_dir () { + out=$(./rootdev --block $WORKDIR 2>/dev/null) + expect "$? -ne 0" || return 1 + expect "-z '$out'" || return 1 +} +run_test t00_bad_sys_dir + +h00_setup_sda_tree() { + local block=$1 + local dev=$2 + mkdir -p $block + mkdir -p $dev + mkdir -p $block/sda/sda1 + mkdir -p $block/sda/sda2 + echo "10:0" > $block/sda/dev + echo "10:1" > $block/sda/sda1/dev + echo "10:2" > $block/sda/sda2/dev + mknod $dev/sda1 b 10 1 + mknod $dev/sda2 b 10 2 + mknod $dev/sda b 10 0 +} + +t01_sys_dev_match () { + local block=$WORKDIR/sys/block + local dev=$WORKDIR/dev + h00_setup_sda_tree $block $dev + + out=$(./rootdev --dev $dev --block $block --major 10 --minor 1 2>/dev/null) + expect "$? -eq 0" || return 1 + expect "'$dev/sda1' = '$out'" || return 1 +} +run_test t01_sys_dev_match + +t02_sys_dev_match_block () { + local block=$WORKDIR/sys/block + local dev=$WORKDIR/dev + h00_setup_sda_tree $block $dev + + out=$(./rootdev --dev $dev --block $block --major 10 --minor 0 2>/dev/null) + expect "$? -eq 0" || return 1 + expect "'$dev/sda' = '$out'" || return 1 +} +run_test t02_sys_dev_match_block + +t03_sys_dev_match_block_no_dev () { + local block=$WORKDIR/sys/block + local dev=$WORKDIR/dev + h00_setup_sda_tree $block $dev + rm $dev/sda + + out=$(./rootdev --dev $dev --block $block --major 10 --minor 0 2>/dev/null) + expect "$? -eq 1" || return 1 + expect "'$dev/sda' = '$out'" || return 1 +} +run_test t03_sys_dev_match_block_no_dev + +t04_sys_dev_match_block_no_dev_ignore () { + local block=$WORKDIR/sys/block + local dev=$WORKDIR/dev + h00_setup_sda_tree $block $dev + rm $dev/sda + + out=$(./rootdev -i --dev $dev --block $block --major 10 --minor 0 2>/dev/null) + expect "$? -eq 0" || return 1 + expect "'$dev/sda' = '$out'" || return 1 +} +run_test t04_sys_dev_match_block_no_dev_ignore + + +h01_setup_dm_tree() { + local block=$1 + local dev=$2 + mkdir -p $block + mkdir -p $dev + mkdir -p $block/dm-0 + mkdir -p $block/dm-0/slaves/sda1 + echo "254:0" > $block/dm-0/dev + echo "10:1" > $block/dm-0/slaves/sda1/dev + mknod $dev/dm-0 b 254 0 +} + +t05_match_dm () { + local block=$WORKDIR/sys/block + local dev=$WORKDIR/dev + h00_setup_sda_tree $block $dev + h01_setup_dm_tree $block $dev + + out=$(./rootdev --dev $dev --block $block --major 254 --minor 0 \ + 2>/dev/null) + expect "$? -eq 0" || return 1 + expect "'$dev/dm-0' = '$out'" || return 1 +} +run_test t05_match_dm + +t06_match_dm_slave () { + local block=$WORKDIR/sys/block + local dev=$WORKDIR/dev + h00_setup_sda_tree $block $dev + h01_setup_dm_tree $block $dev + + out=$(./rootdev -s --dev $dev --block $block --major 254 --minor 0 \ + 2>/dev/null) + expect "$? -eq 0" || return 1 + expect "'$dev/sda1' = '$out'" || return 1 +} +run_test t06_match_dm_slave + +t07_safe_fail_on_no_slave () { + local block=$WORKDIR/sys/block + local dev=$WORKDIR/dev + h00_setup_sda_tree $block $dev + h01_setup_dm_tree $block $dev + + out=$(./rootdev -s --dev $dev --block $block --major 10 --minor 1 \ + 2>/dev/null) + expect "$? -eq 0" || return 1 + expect "'$dev/sda1' = '$out'" || return 1 +} +run_test t07_safe_fail_on_no_slave + +t08_safe_fail_on_no_slave_dev () { + local block=$WORKDIR/sys/block + local dev=$WORKDIR/dev + h00_setup_sda_tree $block $dev + h01_setup_dm_tree $block $dev + # If the matching dev node is missing, an error code will be returned + # but the path will still represent the slave. + rm $dev/sda1 + + out=$(./rootdev -s --dev $dev --block $block --major 254 --minor 0 \ + 2>/dev/null) + expect "$? -eq 1" || return 1 + expect "'$dev/sda1' = '$out'" || return 1 +} +run_test t08_safe_fail_on_no_slave_dev + +t09_safe_fail_on_no_slave_dev_ignore () { + local block=$WORKDIR/sys/block + local dev=$WORKDIR/dev + h00_setup_sda_tree $block $dev + h01_setup_dm_tree $block $dev + # If the matching dev node is missing, an error code will be returned + # but the path will still represent the slave. + rm $dev/sda1 + + out=$(./rootdev -i -s --dev $dev --block $block --major 254 --minor 0 \ + 2>/dev/null) + expect "$? -eq 0" || return 1 + expect "'$dev/sda1' = '$out'" || return 1 +} +run_test t09_safe_fail_on_no_slave_dev_ignore + +h02_setup_mmc_tree() { + local block=$1 + local dev=$2 + mkdir -p $block + mkdir -p $dev + mkdir -p $block/mmcblk0/mmcblk0p1 + mkdir -p $block/mmcblk0/mmcblk0p2 + echo "11:0" > $block/mmcblk0/dev + echo "11:1" > $block/mmcblk0/mmcblk0p1/dev + echo "11:2" > $block/mmcblk0/mmcblk0p2/dev + mknod $dev/mmcblk0 b 11 0 + mknod $dev/mmcblk0p1 b 11 1 + mknod $dev/mmcblk0p2 b 11 2 +} + +t10_mmcdev () { + local block=$WORKDIR/sys/block + local dev=$WORKDIR/dev + h02_setup_mmc_tree $block $dev + out=$(./rootdev --dev $dev --block $block --major 11 --minor 2 \ + 2>/dev/null) + expect "$? -eq 0" || return 1 + expect "'$dev/mmcblk0p2' = '$out'" || return 1 +} +run_test t10_mmcdev + +t11_mmcdev_strip () { + local block=$WORKDIR/sys/block + local dev=$WORKDIR/dev + h02_setup_mmc_tree $block $dev + out=$(./rootdev -d --dev $dev --block $block --major 11 --minor 2 \ + 2>/dev/null) + expect "$? -eq 0" || return 1 + expect "'$dev/mmcblk0' = '$out'" || return 1 +} +run_test t11_mmcdev_strip + +t12_sda_strip () { + local block=$WORKDIR/sys/block + local dev=$WORKDIR/dev + h00_setup_sda_tree $block $dev + out=$(./rootdev -d --dev $dev --block $block --major 10 --minor 2 \ + 2>/dev/null) + expect "$? -eq 0" || return 1 + expect "'$dev/sda' = '$out'" || return 1 +} +run_test t12_sda_strip + +# TODO(wad) add node creation tests + +TEST_COUNT=$((PASS_COUNT + FAIL_COUNT)) + +echo "----" +echo "Test passed: $PASS_COUNT / $TEST_COUNT" +echo "Test failed: $FAIL_COUNT / $TEST_COUNT" + +if [ $FAIL_COUNT -ne 0 ]; then + exit 1 +fi |