blob: c22ab15757080de74e0f3b2c199b3f2a4420b345 [file] [log] [blame]
#!/bin/bash
# Copyright 2015 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.
# Works only in the chromium chroot.
export LC_ALL=C
TRIM_TEMP_TEMPLACE=test_trim.XXXXXX
TRIM_TEMP=$(mktemp -d --tmpdir "${TRIM_TEMP_TEMPLACE}")
CHROMEOS_TRIM_DIR="${TRIM_TEMP}"
# Source the script to test.
. scripts/chromeos-trim --test
MOCK_PARTITION_SIZE=4095
MEGA_BYTES=$(( 1024 * 1024 ))
STATEFUL="testful"
PARTITION_DEV_STATS="./tests/partition_high_write_stats"
MOCK_DEVICE_STATS="./tests/device_stats"
CURRENT_STAT_FILE_LINE="${TRIM_TEMP}/current_line"
sleep() {
echo "sleep: $*"
}
fstrim() {
# We mock that each run trim 1MB.
echo "fstrim: $* [ ${STATEFUL} : 1 MB (${MEGA_BYTES} bytes) trimmed ]"
}
get_stateful_total_space_blocks() {
# We assume $1 is 1M.
echo ${MOCK_PARTITION_SIZE}
}
get_disk_time_ms() {
local current_line
if [ -f "${CURRENT_STAT_FILE_LINE}" ]; then
. "${CURRENT_STAT_FILE_LINE}"
else
current_line=1
fi
head -${current_line} "${MOCK_DEVICE_STATS}" | tail -1 | awk '{print $10}'
: $(( current_line += 1 ))
echo "current_line=${current_line}" > "${CURRENT_STAT_FILE_LINE}"
}
log_msg() {
# Remove time reference to prevent flaky tests.
echo "$*" | grep -v "second"
}
run_do_trim() {
local result_exp=$1
local result_actual="${TRIM_TEMP}/result_actual"
do_trim > "${result_actual}"
diff -q "${result_exp}" "${result_actual}"
}
# Simple test to check we can read write.
read_status_file
duration=20
trim_status="${TRIM_TEST_ONLY}"
write_status_file
duration=0
trim_status="${TRIM_NOT_SUPPORTED}"
read_status_file
if [ ${duration} -eq 0 ]; then
echo "Unable to read status file: Got ${duration}, expected 20."
exit 1
fi
if [ "${trim_status}" != "${TRIM_TEST_ONLY}" ]; then
echo "Invalid trim status."
exit 1
fi
# Do a run with a write bump in device stats.
run_do_trim "./tests/good_golden_run" || exit 1
exp_trim_ammount=$(get_stateful_total_space_blocks)
: $(( exp_trim_ammount /= FSTRIM_SLICE_MB ))
# We purposely set the partition size to not divide by FRSTRIM_SLICE_MB, so add 1.
: $(( exp_trim_ammount += 1 ))
if [ $(( trimmed_amount / MEGA_BYTES )) -ne ${exp_trim_ammount} ]; then
echo "Invalid number of runs : " \
"$(( trimmed_amount / MEGA_BYTES ))"
exit 1
fi
# Artificially reduce the time allowed to 1 second.
MAX_TRIM_WORKER_TIME_SEC=3
DELAY_BTW_FSTRIM_SEC=1
CURRENT_DATE_FILE="${TRIM_TEMP}/current_date"
date() {
if [ -f "${CURRENT_DATE_FILE}" ]; then
. "${CURRENT_DATE_FILE}"
else
current_date=0
fi
: $(( current_date += 1 ))
echo "current_date=${current_date}" > "${CURRENT_DATE_FILE}"
echo "${current_date}"
}
run_do_trim "./tests/interrupted_golden_run" || exit 1
# Check trim failure are reported properly
fstrim() {
echo "Error Trimming"
exit 1
}
run_do_trim "./tests/failed_fstrim_golden_run" || exit 1
rm -rf "${TRIM_TEMP}"