1
1
#! /usr/bin/env bash
2
+ # ------------------------------------------------------------------------------
3
+ # vim:ts=4:et
4
+ # This file is part of solidity.
5
+ #
6
+ # solidity is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU General Public License as published by
8
+ # the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+ #
11
+ # solidity is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU General Public License for more details.
15
+ #
16
+ # You should have received a copy of the GNU General Public License
17
+ # along with solidity. If not, see <http://www.gnu.org/licenses/>
18
+ #
19
+ # (c) solidity contributors.
20
+ # ------------------------------------------------------------------------------
21
+
22
+ REDIRECT_TO=" /dev/null"
23
+
24
+ set -euo pipefail
25
+
26
+ IMPORT_TEST_TYPE=
27
+ for PARAM in " $@ "
28
+ do
29
+ case " ${PARAM} " in
30
+ ast) IMPORT_TEST_TYPE=" ast" ;;
31
+ --show-errors) REDIRECT_TO=" /dev/stderr"
32
+ esac
33
+ done
2
34
3
- set -e
35
+ # Bash script to test the import/exports.
36
+ # ast import/export tests:
37
+ # - first exporting a .sol file to JSON, then loading it into the compiler
38
+ # and exporting it again. The second JSON should be identical to the first.
4
39
5
- # Bash script to test the ast-import option of the compiler by
6
- # first exporting a .sol file to JSON, then loading it into the compiler
7
- # and exporting it again. The second JSON should be identical to the first
8
40
READLINK=readlink
9
41
if [[ " $OSTYPE " == " darwin" * ]]; then
10
42
READLINK=greadlink
@@ -14,90 +46,91 @@ SOLIDITY_BUILD_DIR=${SOLIDITY_BUILD_DIR:-${REPO_ROOT}/build}
14
46
SOLC=${SOLIDITY_BUILD_DIR} /solc/solc
15
47
SPLITSOURCES=${REPO_ROOT} /scripts/splitSources.py
16
48
49
+ # shellcheck source=scripts/common.sh
50
+ source " ${REPO_ROOT} /scripts/common.sh"
51
+
17
52
SYNTAXTESTS_DIR=" ${REPO_ROOT} /test/libsolidity/syntaxTests"
18
53
ASTJSONTESTS_DIR=" ${REPO_ROOT} /test/libsolidity/ASTJSON"
19
- NSOURCES=" $( find " $SYNTAXTESTS_DIR " -type f | wc -l) "
20
-
21
- # DEV_DIR="${REPO_ROOT}/../tmp/contracts/"
22
- # NSOURCES="$(find $DEV_DIR -type f | wc -l)" #TODO use find command
23
54
24
55
FAILED=0
25
56
UNCOMPILABLE=0
26
57
TESTED=0
27
58
28
59
if [[ " $( find . -maxdepth 0 -type d -empty) " == " " ]]; then
29
- echo " Test directory not empty. Skipping!"
30
- exit 1
60
+ fail " Test directory not empty. Skipping!"
31
61
fi
32
62
33
- # function tests whether exporting and importing again leaves the JSON ast unchanged
63
+ function ast_import_export_equivalence
64
+ {
65
+ local sol_file=" $1 "
66
+ local input_files=" $2 "
67
+ # save exported json as expected result (silently)
68
+ $SOLC --combined-json ast --pretty-json --json-indent 4 " ${input_files} " > expected.json 2> ${REDIRECT_TO}
69
+ # import it, and export it again as obtained result (silently)
70
+ if ! $SOLC --import-ast --combined-json ast --pretty-json --json-indent 4 expected.json > obtained.json 2> stderr.txt
71
+ then
72
+ # For investigating, use exit 1 here so the script stops at the
73
+ # first failing test
74
+ # exit 1
75
+ FAILED=$(( FAILED + 1 ))
76
+ printError " ERROR: AST reimport failed for input file $sol_file "
77
+ printError
78
+ printError " Compiler stderr:"
79
+ cat ./stderr.txt >&2
80
+ printError
81
+ printError " Compiler stdout:"
82
+ cat ./obtained.json >&2
83
+ return 1
84
+ fi
85
+ if ! diff_files expected.json obtained.json
86
+ then
87
+ FAILED=$(( FAILED + 1 ))
88
+ fi
89
+ TESTED=$(( TESTED + 1 ))
90
+ rm expected.json obtained.json
91
+ rm -f stderr.txt
92
+ }
93
+
94
+ # function tests whether exporting and importing again is equivalent.
34
95
# Results are recorded by adding to FAILED or UNCOMPILABLE.
35
- # Also, in case of a mismatch a diff and the respective ASTs are printed
96
+ # Also, in case of a mismatch a diff is printed
36
97
# Expected parameters:
37
98
# $1 name of the file to be exported and imported
38
99
# $2 any files needed to do so that might be in parent directories
39
100
function testImportExportEquivalence {
40
- local nth_input_file=" $1 "
41
- IFS=" " read -r -a all_input_files <<< " $2"
42
-
43
- if $SOLC " $nth_input_file " " ${all_input_files[@]} " > /dev/null 2>&1
101
+ local sol_file=" $1 "
102
+ local input_files=" $2 "
103
+ if " $SOLC " --bin " ${input_files} " > ${REDIRECT_TO} 2>&1
44
104
then
45
- ! [[ -e stderr.txt ]] || { echo " stderr.txt already exists. Refusing to overwrite." ; exit 1; }
46
-
47
- # save exported json as expected result (silently)
48
- $SOLC --combined-json ast --pretty-json " $nth_input_file " " ${all_input_files[@]} " > expected.json 2> /dev/null
49
- # import it, and export it again as obtained result (silently)
50
- if ! $SOLC --import-ast --combined-json ast --pretty-json expected.json > obtained.json 2> stderr.txt
51
- then
52
- # For investigating, use exit 1 here so the script stops at the
53
- # first failing test
54
- # exit 1
55
- FAILED=$(( FAILED + 1 ))
56
- echo -e " ERROR: AST reimport failed for input file $nth_input_file "
57
- echo
58
- echo " Compiler stderr:"
59
- cat ./stderr.txt
60
- echo
61
- echo " Compiler stdout:"
62
- cat ./obtained.json
63
- return 1
64
- fi
65
- DIFF=" $( diff expected.json obtained.json) "
66
- if [ " $DIFF " != " " ]
67
- then
68
- if [ " $DIFFVIEW " == " " ]
69
- then
70
- echo -e " ERROR: JSONS differ for $1 : \n $DIFF \n"
71
- echo " Expected:"
72
- cat ./expected.json
73
- echo " Obtained:"
74
- cat ./obtained.json
75
- else
76
- # Use user supplied diff view binary
77
- $DIFFVIEW expected.json obtained.json
78
- fi
79
- FAILED=$(( FAILED + 1 ))
80
- return 2
81
- fi
82
- TESTED=$(( TESTED + 1 ))
83
- rm expected.json obtained.json
84
- rm -f stderr.txt
105
+ ! [[ -e stderr.txt ]] || fail " stderr.txt already exists. Refusing to overwrite."
106
+ case " $IMPORT_TEST_TYPE " in
107
+ ast) ast_import_export_equivalence " ${sol_file} " " ${input_files} " ;;
108
+ * ) fail " Unknown import test type. Aborting." ;;
109
+ esac
85
110
else
86
- # echo "contract $solfile could not be compiled "
87
111
UNCOMPILABLE=$(( UNCOMPILABLE + 1 ))
88
112
fi
89
- # return 0
90
113
}
91
- echo " Looking at $NSOURCES .sol files..."
92
114
93
115
WORKINGDIR=$PWD
94
116
95
- # for solfile in $(find $DEV_DIR -name *.sol)
117
+ command_available " ${SOLC} " --version
118
+ command_available jq --version
119
+
120
+ case " $IMPORT_TEST_TYPE " in
121
+ ast) TEST_DIRS=(" ${SYNTAXTESTS_DIR} " " ${ASTJSONTESTS_DIR} " ) ;;
122
+ * ) fail " Unknown import test type. Aborting. Please specify ${0} ast [--show-errors]." ;;
123
+ esac
124
+
96
125
# boost_filesystem_bug specifically tests a local fix for a boost::filesystem
97
126
# bug. Since the test involves a malformed path, there is no point in running
98
- # AST tests on it. See https://github.com/boostorg/filesystem/issues/176
99
- # shellcheck disable=SC2044
100
- for solfile in $( find " $SYNTAXTESTS_DIR " " $ASTJSONTESTS_DIR " -name " *.sol" -and -not -name " boost_filesystem_bug.sol" )
127
+ # tests on it. See https://github.com/boostorg/filesystem/issues/176
128
+ IMPORT_TEST_FILES=$( find " ${TEST_DIRS[@]} " -name " *.sol" -and -not -name " boost_filesystem_bug.sol" )
129
+
130
+ NSOURCES=" $( echo " $IMPORT_TEST_FILES " | wc -l) "
131
+ echo " Looking at $NSOURCES .sol files..."
132
+
133
+ for solfile in ${IMPORT_TEST_FILES}
101
134
do
102
135
echo -n " ."
103
136
# create a temporary sub-directory
108
141
OUTPUT=$( " $SPLITSOURCES " " $solfile " )
109
142
SPLITSOURCES_RC=$?
110
143
set -e
111
- if [ ${SPLITSOURCES_RC} == 0 ]
144
+ if [[ ${SPLITSOURCES_RC} == 0 ] ]
112
145
then
113
- # echo $OUTPUT
114
- NSOURCES=$(( NSOURCES - 1 ))
115
- for i in $OUTPUT ;
116
- do
117
- testImportExportEquivalence " $i " " $OUTPUT "
118
- NSOURCES=$(( NSOURCES + 1 ))
119
- done
146
+ IFS=' ' read -ra OUTPUT_ARRAY <<< " ${OUTPUT}"
147
+ NSOURCES=$(( NSOURCES - 1 + ${# OUTPUT_ARRAY[@]} ))
148
+ testImportExportEquivalence " $solfile " " ${OUTPUT_ARRAY[*]} "
120
149
elif [ ${SPLITSOURCES_RC} == 1 ]
121
150
then
122
- testImportExportEquivalence " $solfile "
151
+ testImportExportEquivalence " $solfile " " $solfile "
123
152
elif [ ${SPLITSOURCES_RC} == 2 ]
124
153
then
125
154
# The script will exit with return code 2, if an UnicodeDecodeError occurred.
126
155
# This is the case if e.g. some tests are using invalid utf-8 sequences. We will ignore
127
156
# these errors, but print the actual output of the script.
128
- echo -e " \n${OUTPUT} \n"
129
- testImportExportEquivalence " $solfile "
157
+ printError " \n\n ${OUTPUT} \n \n"
158
+ testImportExportEquivalence " $solfile " " $solfile "
130
159
else
131
160
# All other return codes will be treated as critical errors. The script will exit.
132
- echo -e " \nGot unexpected return code ${SPLITSOURCES_RC} from ${SPLITSOURCES} . Aborting."
133
- echo -e " \n${OUTPUT} \n"
161
+ printError " \n \nGot unexpected return code ${SPLITSOURCES_RC} from ${SPLITSOURCES} . Aborting."
162
+ printError " \n\n ${OUTPUT} \n \n"
134
163
135
164
cd " $WORKINGDIR "
136
165
# Delete temporary files
144
173
rm -rf " $FILETMP "
145
174
done
146
175
147
- echo " "
176
+ echo
148
177
149
- if [ " $ FAILED" = 0 ]
178
+ if (( FAILED == 0 ))
150
179
then
151
- echo " SUCCESS: $TESTED syntaxTests passed, $FAILED failed, $UNCOMPILABLE could not be compiled ($NSOURCES sources total)."
180
+ echo " SUCCESS: $TESTED tests passed, $FAILED failed, $UNCOMPILABLE could not be compiled ($NSOURCES sources total)."
152
181
else
153
- echo " FAILURE: Out of $NSOURCES sources, $FAILED failed, ($UNCOMPILABLE could not be compiled)."
154
- exit 1
182
+ fail " FAILURE: Out of $NSOURCES sources, $FAILED failed, ($UNCOMPILABLE could not be compiled)."
155
183
fi
0 commit comments