#!/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
