blob: ded231f5007e0bcda5ec7f9e8b24880275b41c0b [file] [log] [blame]
#!/bin/bash
# Copyright 2022 The Centipede Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# This sh_test runs various tests on test_fuzz_target,
# which is linked against :centipede_runner.
set -eu
source "$(dirname "$0")/../test_util.sh"
target="$(centipede::get_centipede_test_srcdir)/testing/test_fuzz_target"
non_pie_target="$(centipede::get_centipede_test_srcdir)/testing/test_fuzz_target_non_pie"
# Create input files.
oom="${TEST_TMPDIR}/oom"
slo="${TEST_TMPDIR}/slo"
f1="${TEST_TMPDIR}/f1"
func1="${TEST_TMPDIR}/func1"
minus1="${TEST_TMPDIR}/minus1"
echo -n oom > "${oom}" # Triggers OOM
echo -n slo > "${slo}" # Triggers sleep(10)
echo -n f1 > "${f1}" # Arbitrary input.
echo -n func1 > "${func1}" # Triggers a call to SingleEdgeFunc.
echo -n "-1" > "${minus1}" # Triggers return -1
# Checks that the files with coverage features for f1 and func1
# are correctly generated.
check_features_files_f1_and_f02() {
echo ======== Check features files.
# Files should exist and be non-empty.
[[ -s "${f1}-features" ]] || die "features file not found: f1"
[[ -s "${func1}-features" ]] || die "features file not found: func1"
# Files should be different, because inputs have different sizes,
# and so the coverage features for the loop in test_fuzz_target
# will be different.
cmp "${f1}-features" "${func1}-features" && die "features files are the same"
echo ======== features files are different.
}
export CENTIPEDE_RUNNER_FLAGS=\
":use_pc_features:use_cmp_features:use_dataflow_features:path_level=10:"
echo ======== Check that return -1 generates empty feature file.
"${target}" "${minus1}"
[[ -f "${minus1}-features" ]] || die "features file not found: minus1"
[[ -s "${minus1}-features" ]] && die "features file is not empty, but should be"
# Run two files separately.
# test_fuzz_target prints its input bytes in hex form,
# e.g. for 'f1' it will print '{66, 31}'
rm -fv "${TEST_TMPDIR}"/*-features
echo ======== Run f1
"${target}" "${f1}" | grep "{66, 31}"
echo ======== Run func1
"${target}" "${func1}" | grep "{66, 75, 6e, 63, 31}"
echo ======== Trying non-pie target binary
"${non_pie_target}" "${f1}" | grep "{66, 31}"
check_features_files_f1_and_f02
# Run two files in one process.
rm -fv "${TEST_TMPDIR}"/*-features
echo ======== Run f1 func1
"${target}" "${f1}" "${func1}"
check_features_files_f1_and_f02
# Check OOM. The test target allocates 4Gb, and we make sure
# this can be detected with appropriate limit (address_space_limit_mb),
# and can not be detected with a larger limit.
echo ======== Check OOM behaviour with address_space_limit_mb
CENTIPEDE_RUNNER_FLAGS=":address_space_limit_mb=4096:" $target "${oom}" \
&& die "failed to die on 4G OOM (address_space_limit_mb)"
# must pass.
CENTIPEDE_RUNNER_FLAGS=":address_space_limit_mb=8192:" $target "${oom}"
echo ======== Check OOM behaviour with rss_limit_mb
CENTIPEDE_RUNNER_FLAGS=":rss_limit_mb=4096:" $target "${oom}" \
&& die "failed to die on 4G OOM (rss_limit_mb)"
CENTIPEDE_RUNNER_FLAGS=":rss_limit_mb=8192:" $target "${oom}" # must pass
echo ======== Check timeout
CENTIPEDE_RUNNER_FLAGS=":timeout_per_input=567:" "${target}" \
2>&1 | grep "timeout_per_input:.567"
CENTIPEDE_RUNNER_FLAGS=":timeout_per_input=2:" "${target}" "${slo}" \
2>&1 | grep "Per-input timeout exceeded"
echo "PASS"