blob: 0c06bf246ce88d9f998d417490586c2ea02d13e8 [file] [log] [blame]
#!/bin/bash
# Copyright 2014 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.
TMP_DIR=
cleanup() {
rm -rf "${TMP_DIR}"
}
fail() {
echo "${test}: FAIL: $*" >&2
exit 1
}
pass() {
echo "${test}: PASS"
exit 0
}
test_init() {
scratch_dir="${TMP_DIR}/${test}"
export SPOOL_DIR="${scratch_dir}/spool"
mkdir -p "${SPOOL_DIR}"
trap -- EXIT INT
}
# This kills the `sleep` the periodic_scheduler uses to wait.
# Kill it manually so that we can wake it up.
wake_sched_up() {
local pid=$1 pstree sleep_pid
pstree=$(TERM=linux LC_ALL=C pstree -p -A $$)
sleep_pid=$(echo "${pstree}" |
sed -n -r '/sleep\(/s:.*\(([0-9]*)\).*:\1:p')
if [[ -z ${sleep_pid} ]]; then
fail "could not locate sleep in process tree:" $'\n' "${pstree}"
else
kill ${sleep_pid}
fi
}
# Basic test to make sure things work.
test1() {
local test=${FUNCNAME} scratch_dir pid spool_file
test_init
local test_file="${scratch_dir}/ok"
${SCHED_SHELL} "${SCHED}" 1000 300 boo touch "${test_file}" &
pid=$!
trap "kill ${pid} \$(pgrep -P ${pid})" EXIT INT
spool_file="${SPOOL_DIR}/boo"
sleep 1
if [[ -e ${test_file} ]]; then
fail "${test_file} should not exist yet"
fi
touch -t 199001010101 "${spool_file}"
wake_sched_up ${pid}
# Wait up to 60 seconds in case the build system is overloaded.
# http://crbug.com/420102
local timeout=600
while [[ ! -e ${test_file} ]]; do
sleep 0.1
if [[ $(( --timeout )) -eq 0 ]]; then
fail "${test_file} never came back"
fi
done
pass
}
main() {
if [[ $# -ne 0 ]]; then
echo "Usage: $0" >&2
exit 1
fi
echo "Note: Messages like 'Terminated sleep' are normal"
trap cleanup EXIT INT
export SCHED=$(realpath "${0%_unittest}")
# Default to the temp dir ($T) that portage has set up for us.
# This is needed when doing out of tree builds.
TMP_DIR=$(mktemp -d "${T:-${SCHED%/*}}/${SCHED##*/}.XXXXXX")
# Try to use dash if it's available as that's what we'll be using
# on the actual device at runtime.
export SCHED_SHELL=$(which dash 2>/dev/null || echo /bin/sh)
local ret pids=()
test1 &
pids+=( $! )
ret=0
for p in "${pids[@]}"; do
wait ${p}
: $(( ret |= $? ))
done
exit ${ret}
}
main "$@"