1#!/bin/bash
2# Tests library functions and types.
3#
4# Version: 20200705
5
6EXIT_SUCCESS=0;
7EXIT_FAILURE=1;
8EXIT_IGNORE=77;
9
10LIBRARY_TESTS="chunk chunks_table error io_handle notify record record_values template_definition";
11LIBRARY_TESTS_WITH_INPUT="file support";
12OPTION_SETS="";
13
14INPUT_GLOB="*";
15
16run_test()
17{
18	local TEST_NAME=$1;
19
20	local TEST_DESCRIPTION="Testing: ${TEST_NAME}";
21	local TEST_EXECUTABLE="./evtx_test_${TEST_NAME}";
22
23	if ! test -x "${TEST_EXECUTABLE}";
24	then
25		TEST_EXECUTABLE="${TEST_EXECUTABLE}.exe";
26	fi
27
28	# TODO: add support for TEST_PROFILE and OPTION_SETS?
29	run_test_with_arguments "${TEST_DESCRIPTION}" "${TEST_EXECUTABLE}";
30	local RESULT=$?;
31
32	return ${RESULT};
33}
34
35run_test_with_input()
36{
37	local TEST_NAME=$1;
38
39	local TEST_DESCRIPTION="Testing: ${TEST_NAME}";
40	local TEST_EXECUTABLE="./evtx_test_${TEST_NAME}";
41
42	if ! test -x "${TEST_EXECUTABLE}";
43	then
44		TEST_EXECUTABLE="${TEST_EXECUTABLE}.exe";
45	fi
46
47	if ! test -d "input";
48	then
49		echo "Test input directory not found.";
50
51		return ${EXIT_IGNORE};
52	fi
53	local RESULT=`ls input/* | tr ' ' '\n' | wc -l`;
54
55	if test ${RESULT} -eq ${EXIT_SUCCESS};
56	then
57		echo "No files or directories found in the test input directory";
58
59		return ${EXIT_IGNORE};
60	fi
61
62	local TEST_PROFILE_DIRECTORY=$(get_test_profile_directory "input" "libevtx");
63
64	local IGNORE_LIST=$(read_ignore_list "${TEST_PROFILE_DIRECTORY}");
65
66	RESULT=${EXIT_SUCCESS};
67
68	for TEST_SET_INPUT_DIRECTORY in input/*;
69	do
70		if ! test -d "${TEST_SET_INPUT_DIRECTORY}";
71		then
72			continue;
73		fi
74		if check_for_directory_in_ignore_list "${TEST_SET_INPUT_DIRECTORY}" "${IGNORE_LIST}";
75		then
76			continue;
77		fi
78
79		local TEST_SET_DIRECTORY=$(get_test_set_directory "${TEST_PROFILE_DIRECTORY}" "${TEST_SET_INPUT_DIRECTORY}");
80
81		local OLDIFS=${IFS};
82
83		# IFS="\n" is not supported by all platforms.
84		IFS="
85";
86
87		if test -f "${TEST_SET_DIRECTORY}/files";
88		then
89			for INPUT_FILE in `cat ${TEST_SET_DIRECTORY}/files | sed "s?^?${TEST_SET_INPUT_DIRECTORY}/?"`;
90			do
91				if test "${OSTYPE}" = "msys";
92				then
93					# A test executable built with MinGW expects a Windows path.
94					INPUT_FILE=`echo ${INPUT_FILE} | sed 's?/?\\\\?g'`;
95				fi
96				run_test_on_input_file_with_options "${TEST_SET_DIRECTORY}" "${TEST_DESCRIPTION}" "default" "${OPTION_SETS}" "${TEST_EXECUTABLE}" "${INPUT_FILE}";
97				RESULT=$?;
98
99				if test ${RESULT} -ne ${EXIT_SUCCESS};
100				then
101					break;
102				fi
103			done
104		else
105			for INPUT_FILE in `ls -1d ${TEST_SET_INPUT_DIRECTORY}/${INPUT_GLOB}`;
106			do
107				if test "${OSTYPE}" = "msys";
108				then
109					# A test executable built with MinGW expects a Windows path.
110					INPUT_FILE=`echo ${INPUT_FILE} | sed 's?/?\\\\?g'`;
111				fi
112				run_test_on_input_file_with_options "${TEST_SET_DIRECTORY}" "${TEST_DESCRIPTION}" "default" "${OPTION_SETS}" "${TEST_EXECUTABLE}" "${INPUT_FILE}";
113				RESULT=$?;
114
115				if test ${RESULT} -ne ${EXIT_SUCCESS};
116				then
117					break;
118				fi
119			done
120		fi
121		IFS=${OLDIFS};
122
123		if test ${RESULT} -ne ${EXIT_SUCCESS};
124		then
125			break;
126		fi
127	done
128
129	return ${RESULT};
130}
131
132if test -n "${SKIP_LIBRARY_TESTS}";
133then
134	exit ${EXIT_IGNORE};
135fi
136
137TEST_RUNNER="tests/test_runner.sh";
138
139if ! test -f "${TEST_RUNNER}";
140then
141	TEST_RUNNER="./test_runner.sh";
142fi
143
144if ! test -f "${TEST_RUNNER}";
145then
146	echo "Missing test runner: ${TEST_RUNNER}";
147
148	exit ${EXIT_FAILURE};
149fi
150
151source ${TEST_RUNNER};
152
153RESULT=${EXIT_IGNORE};
154
155for TEST_NAME in ${LIBRARY_TESTS};
156do
157	run_test "${TEST_NAME}";
158	RESULT=$?;
159
160	if test ${RESULT} -ne ${EXIT_SUCCESS};
161	then
162		break;
163	fi
164done
165
166if test ${RESULT} -ne ${EXIT_SUCCESS} && test ${RESULT} -ne ${EXIT_IGNORE};
167then
168	exit ${RESULT};
169fi
170
171for TEST_NAME in ${LIBRARY_TESTS_WITH_INPUT};
172do
173	if test -d "input";
174	then
175		run_test_with_input "${TEST_NAME}";
176		RESULT=$?;
177	else
178		run_test "${TEST_NAME}";
179		RESULT=$?;
180	fi
181
182	if test ${RESULT} -ne ${EXIT_SUCCESS};
183	then
184		break;
185	fi
186done
187
188exit ${RESULT};
189
190