#!/bin/bash function default_dates() { case "${OSTYPE}" in darwin*) date "+%Y-%m-%d" ;; *) date --rfc-3339=date ;; esac } function default_minutes() { case "${OSTYPE}" in darwin*) echo "0$( jot -r 1 0 59 )" | sed -E "s|.+(..)|\1|g" ;; *) echo "0$( rand -M 60 )" | sed "s|.\+\(..\)\$|\1|g" ;; esac } function default_hours() { seq -w 0 23 } if ! command -v faketime >/dev/null 2>&1 ; then echo "timemachine requires libfaketime to be installed!" exit 1 fi # parse options/arguments until [[ -z "${1}" ]] ; do case "${1}" in --minute) shift minutes="${minutes} ${1}" ;; --hour) shift hours="${hours} ${1}" ;; --date) shift dates="${dates} ${1}" ;; --fail-at-end) fail_at_end=1 ;; -*) echo "Unknown option '${1}'" exit 1 ;; *) tests="${tests} ${1}" ;; esac shift done for date in ${dates-$( default_dates )} ; do for minute in ${minutes-$( default_minutes )} ; do for hour in ${hours-$( default_hours )} ; do date_time="${date}T${hour}:${minute}" for single_test in ${tests} ; do echo "Running test ${single_test} at ${date_time}" faketime "${date_time}" "${single_test}" if [[ $? -ne 0 ]] ; then echo "Test ${single_test} broke at ${date_time}!" [[ ${fail_at_end-0} -ne 0 ]] || break 2 fi done done done done