blob: 80e0b38bc1e26163022cf09e9599fc2feba14377 [file] [log] [blame]
Karl Zhang3de5ab12021-05-31 11:45:48 +08001#!/usr/bin/env bash
2#
3# Copyright (c) 2020-2021, Arm Limited. All rights reserved.
4#
5# SPDX-License-Identifier: BSD-3-Clause
6#
7
8set -e
9
10SUITE_DIR_NAME=tfm_fuzz
11
12show_help()
13{
14 echo "Usage: $0 <template_dir> <suites_dir> "
15 echo ""
16 echo "Where: "
17 echo " template_dir: The directory containing template files for the"
18 echo " fuzzing tool"
19 echo " suites_dir: The directory to generate the test suite to."
20}
21
22if [ $# != 2 ]
23then
24 echo "Invalid number of parameters."
25 show_help
26 exit 1
27fi
28
29INPUT_DIR=$1
30SUITES_DIR=$2
31
32# Check that the input directory exists
33if [ ! -d "$INPUT_DIR" ]
34then
35 echo "Template directory '$INPUT_DIR' doesn't exist"
36 exit 1
37fi
38
39# Check that the input directory contains files
40if [ `ls "$INPUT_DIR"| wc -l` == 0 ]
41then
42 echo "Template directory '$INPUT_DIR' doesn't contain files"
43 exit 1
44fi
45
46if [ ! -d "$SUITES_DIR" ]
47then
48 echo "Suites directory '$SUITES_DIR' doesn't exist"
49 exit 1
50fi
51
52# Check whether a fuzz test suite was generated before
53if [ -d "$SUITES_DIR/$SUITE_DIR_NAME" ]
54then
55 echo "'$SUITE_DIR_NAME' exists."
56 echo "A TF fuzz test suite is already generated, please delete it before running this script"
57 exit 1
58fi
59
60#get absolute path of the suit dir TF_FUZZ
61pushd $SUITES_DIR > /dev/null
62SUITE_ABSOLUTE_DIR=`pwd`/$SUITE_DIR_NAME
63popd
64
65# creating directory for the fuzz tests tool
66echo "Creating '$SUITES_DIR/$SUITE_DIR_NAME/non_secure'"
67mkdir -p $SUITES_DIR/$SUITE_DIR_NAME/non_secure
68
69# generate additional files for the suite:
70CMAKELIST=$SUITES_DIR/$SUITE_DIR_NAME/CMakeLists.txt
71TESTSUITE=$SUITES_DIR/$SUITE_DIR_NAME/non_secure/tf_fuzz_testsuite.c
72TESTSUITE_HEADER=$SUITES_DIR/$SUITE_DIR_NAME/non_secure/tf_fuzz_testsuite.h
73
74# generate data for the testcases
75# Iterate over the testcase files and
76# - Run the fuzzer on the test template
77# - Generate a test function name, and replace the generic test_thread to that
78# in the generated c file
79# - append the generated c file to the CmakeList file.
80declare -A FILENAMES
81declare -A FUNC_NAMES
82declare -A PURPOSES
83for f in `ls $INPUT_DIR`
84do
85 FILE="$SUITES_DIR/$SUITE_DIR_NAME/non_secure/$f.c"
86 FILENAMES[$f]=$FILE
87
88 SEED=$RANDOM
89 echo "Generating testcase $f with seed $SEED"
90 ./tfz -z $INPUT_DIR/$f $FILE $SEED
91
92 echo "in File ${FILENAMES[$f]}"
93
94 PURPOSE=`grep -A 1 'Test purpose' $FILE | tail -n 1 | cut -d '*' -f 2 | sed -e 's/^[[:space:]]*//'`
95 PURPOSES[$f]=$PURPOSE
96
97 FUNC_NAME="$PURPOSE"
98 FUNC_NAME=`echo "$FUNC_NAME" | \
99 sed 's/^\s*//g; s/\s*$//g; s/\s\s*/_/g'`
100 FUNC_NAME=`echo "$FUNC_NAME" | \
101 sed 's/\-/_/g; s/"//g; s/\\\//g'`
102 FUNC_NAME=`echo "$FUNC_NAME" | \
103 sed "s/#//g; s/'//g; s/,//g; s/(//g; s/)//g"`
104 FUNC_NAMES[$f]=$FUNC_NAME
105
106 echo " Changing 'test_thread' to '${FUNC_NAMES[$f]}'"
107
108 sed -i "s/test_thread/$FUNC_NAME/g" $FILE
109
110done
111
112# generate the non-secure testsuite file
113echo '#include <stdio.h>' >> $TESTSUITE
114echo '#include <string.h>' >> $TESTSUITE
115echo '' >> $TESTSUITE
116echo '#include "tfm_api.h"' >> $TESTSUITE
117echo '#include "psa_manifest/sid.h"' >> $TESTSUITE
118echo '#include "test_framework.h"' >> $TESTSUITE
119echo '' >> $TESTSUITE
120echo '/* Forward declaring static test functions */' >> $TESTSUITE
121for f in `ls $INPUT_DIR`
122do
123 echo "static void test_${FUNC_NAMES[$f]}(struct test_result_t *ret);" >> $TESTSUITE
124done
125echo '/* Forward declaring functions */' >> $TESTSUITE
126for f in `ls $INPUT_DIR`
127do
128 echo "void ${FUNC_NAMES[$f]}(struct test_result_t *ret);" >> $TESTSUITE
129done
130echo '' >> $TESTSUITE
131echo 'static struct test_t tf_fuzz_tests[] = {' >> $TESTSUITE
132for f in `ls $INPUT_DIR`
133do
134 echo " {&test_${FUNC_NAMES[$f]}, \"${FUNC_NAMES[$f]}\", \"${PURPOSES[$f]}\", {0} }," >> $TESTSUITE
135done
136echo '}; ' >> $TESTSUITE
137echo '' >> $TESTSUITE
138echo 'void register_testsuite_tf_fuzz_test(struct test_suite_t *p_test_suite)' >> $TESTSUITE
139echo '{' >> $TESTSUITE
140echo ' uint32_t list_size;' >> $TESTSUITE
141echo '' >> $TESTSUITE
142echo ' list_size = (sizeof(tf_fuzz_tests) / sizeof(tf_fuzz_tests[0]));' >> $TESTSUITE
143echo '' >> $TESTSUITE
144echo ' set_testsuite("TF-M fuzz tests (TF_FUZZ_TEST)",' >> $TESTSUITE
145echo ' tf_fuzz_tests, list_size, p_test_suite);' >> $TESTSUITE
146echo '}' >> $TESTSUITE
147echo '' >> $TESTSUITE
148for f in `ls $INPUT_DIR`
149do
150 echo "static void test_${FUNC_NAMES[$f]}(struct test_result_t *ret)" >> $TESTSUITE
151 echo '{' >> $TESTSUITE
152 echo " ${FUNC_NAMES[$f]}(ret);" >> $TESTSUITE
153 echo ' if (ret->val != TEST_PASSED) {' >> $TESTSUITE
154 echo ' return;' >> $TESTSUITE
155 echo ' }' >> $TESTSUITE
156 echo '' >> $TESTSUITE
157 echo '}' >> $TESTSUITE
158done
159
160# generate the CmakeList file
161echo "cmake_policy(SET CMP0079 NEW)" >> $CMAKELIST
162echo "" >> $CMAKELIST
163echo "add_library(tfm_test_suite_tf_fuzz_ns STATIC EXCLUDE_FROM_ALL)" >> $CMAKELIST
164echo "" >> $CMAKELIST
165echo "target_sources(tfm_test_suite_tf_fuzz_ns" >> $CMAKELIST
166echo " PRIVATE" >> $CMAKELIST
167for f in `ls $INPUT_DIR`
168do
169 echo " $SUITE_ABSOLUTE_DIR/non_secure/$f.c" >> $CMAKELIST
170done
171echo " $SUITE_ABSOLUTE_DIR/non_secure/tf_fuzz_testsuite.c" >> $CMAKELIST
172echo ")" >> $CMAKELIST
173echo "" >> $CMAKELIST
174echo "target_include_directories(tfm_test_suite_tf_fuzz_ns" >> $CMAKELIST
175echo " PUBLIC" >> $CMAKELIST
176echo " ./non_secure" >> $CMAKELIST
177echo " PRIVATE" >> $CMAKELIST
178echo " ." >> $CMAKELIST
179echo ")" >> $CMAKELIST
180echo "" >> $CMAKELIST
181echo "target_link_libraries(tfm_test_suite_tf_fuzz_ns" >> $CMAKELIST
182echo " PRIVATE" >> $CMAKELIST
183echo " tfm_test_framework_ns" >> $CMAKELIST
184echo " tfm_test_suite_its_ns" >> $CMAKELIST
185echo ")" >> $CMAKELIST
186echo "" >> $CMAKELIST
187echo "target_link_libraries(tfm_ns_tests" >> $CMAKELIST
188echo " INTERFACE" >> $CMAKELIST
189echo " tfm_test_suite_tf_fuzz_ns" >> $CMAKELIST
190echo ")" >> $CMAKELIST
191
192# generate the testsuite header file
193echo '#ifndef __PSA_API_FUZZ_TESTSUITE_H__' >> $TESTSUITE_HEADER
194echo '#define __PSA_API_FUZZ_TESTSUITE_H__' >> $TESTSUITE_HEADER
195echo '' >> $TESTSUITE_HEADER
196echo 'void register_testsuite_tf_fuzz_test(struct test_suite_t *p_test_suite);' >> $TESTSUITE_HEADER
197echo '' >> $TESTSUITE_HEADER
198echo '#endif /* __PSA_API_FUZZ_TESTSUITE_H__ */' >> $TESTSUITE_HEADER
199
200# print some instruction on the screen
201echo ''
202echo ''
203echo '========================================================================='
204echo '= The test suite generation is done. It can be compiled to TF-M by'
205echo '= providing the following options to the CMake generate command:'
206echo '='
207echo '= -DTFM_FUZZER_TOOL_TESTS=1'
208echo '= -DTFM_FUZZER_TOOL_TESTS_CMAKE_INC_PATH='$SUITE_ABSOLUTE_DIR
209echo '========================================================================='