(List (Com {[LIT_CHARS set]} {[LIT_CHARS -o]} {[LIT_CHARS nounset]} ) (Com {[LIT_CHARS set]} {[LIT_CHARS -o]} {[LIT_CHARS pipefail]} ) (Com {[LIT_CHARS set]} {[LIT_CHARS -o]} {[LIT_CHARS errexit]} ) (FunctionDef usage [] (List (Com {[LIT_CHARS cat]} < (HereDocRedirectNode here_end='EOF' do_expansion=True body_word={[DQ [LIT_CHARS "Runs toybox tests, making sure to build the required binaries.\n"][LIT_CHARS "\n"][LIT_CHARS "Usage:\n"][LIT_CHARS " ./test.sh all [OPTION] # Run all tests\n"][LIT_CHARS " ./test.sh single [OPTION] COMMAND... # Run tests for the given commands\n"][LIT_CHARS "\n"][LIT_CHARS "Options:\n"][LIT_CHARS " -asan Run under AddressSanitizer\n"][LIT_CHARS " -msan Run under MemorySanitizer\n"][LIT_CHARS " -ubsan Run under UndefinedBehaviorSanitizer\n"][LIT_CHARS " -sancov Run under SanitizerCoverage\n"][LIT_CHARS "\n"][LIT_CHARS "See http://clang.llvm.org/docs/index.html for details on these tools.\n"][LIT_CHARS "\n"][LIT_CHARS "Environment variables:\n"][LIT_CHARS " TEST_HOST:\n"][LIT_CHARS " Test the command on the host instead of toybox. Respected by\n"][LIT_CHARS " scripts/test.sh.\n"][LIT_CHARS " VERBOSE=1, VERBOSE=fail, DEBUG:\n"][LIT_CHARS " Show more test output. Respected by scripts/runtest.sh.\n"][LIT_CHARS " CLANG_DIR:\n"][LIT_CHARS " Directory of Clang pre-built binaries, available at\n"][LIT_CHARS " http://llvm.org/releases/download.html. You should set CLANG_DIR when\n"][LIT_CHARS " running with the sanitizers; otherwise it will use 'clang' in your PATH\n"][LIT_CHARS " (which is often old).\n"][LIT_CHARS "\n"][LIT_CHARS "Example:\n"][LIT_CHARS " "][LIT_OTHER "$"][LIT_CHARS " export CLANG_DIR=~/install/clang+llvm-3.8.0-x86_64-linux-gnu-ubuntu-14.04\n"][LIT_CHARS " "][LIT_OTHER "$"][LIT_CHARS " ./test.sh all # Run all tests normally\n"][LIT_CHARS " "][LIT_OTHER "$"][LIT_CHARS " ./test.sh single -asan grep sed # Run grep and sed tests under ASAN\n"][LIT_CHARS "\n"]]} 0), > ) (Com {[LIT_CHARS exit]} ) ) ) (= scope= flags=2 words=[] bindings=[('TOPDIR', {[VarSub TOPDIR test_op=VS_TEST_COLON_HYPHEN {[VarSub PWD]}]})]) (= scope= flags=2 words=[] bindings=[('CLANG_DIR', {[VarSub CLANG_DIR test_op=VS_TEST_COLON_HYPHEN {}]})]) (If (Com {[LIT_DBRACKET_LIKE "["]} {[LIT_CHARS -n]} {[DQ [VarSub CLANG_DIR]]} {[LIT_DBRACKET_LIKE "]"]} ) (List (= scope= flags=0 words=[] bindings=[('sym', {[VarSub CLANG_DIR] [LIT_CHARS /bin/llvm-symbolizer]})]) (= scope= flags=1 words=[] bindings=[('ASAN_SYMBOLIZER_PATH', {[VarSub sym]})]) (= scope= flags=1 words=[] bindings=[('MSAN_SYMBOLIZER_PATH', {[VarSub sym]})]) (= scope= flags=1 words=[] bindings=[('UBSAN_SYMBOLIZER_PATH', {[VarSub sym]})]) ) ) (FunctionDef die [] (List (Com {[LIT_CHARS echo]} {[DQ [VarSub @]]} ) (Com {[LIT_CHARS exit]} {[LIT_CHARS 1]} ) ) ) (= scope= flags=0 words=[] bindings=[('TOYBOX_BIN', {[LIT_CHARS toybox]})]) (= scope= flags=0 words=[] bindings=[('SAN_FLAG', {[SQ ]})]) (FunctionDef process_flag [] (List (= scope= flags=0 words=[] bindings=[('flag', {[VarSub 1]})]) (= scope= flags=0 words=[] bindings=[('ret', {[LIT_CHARS 0]})]) (Case to_match={[VarSub flag]}, pat_word_list=[[{[LIT_CHARS -asan]}], [{[LIT_CHARS -msan]}], [{[LIT_CHARS -ubsan]}], [{[LIT_CHARS -sancov]}], [{[LIT_CHARS -] [LIT_OTHER "*"]}], [{[LIT_OTHER "*"]}]] (List (= scope= flags=0 words=[] bindings=[('TOYBOX_BIN', {[LIT_CHARS toybox_asan]})]) (= scope= flags=0 words=[] bindings=[('SAN_FLAG', {[VarSub flag]})]) ) (List (= scope= flags=0 words=[] bindings=[('TOYBOX_BIN', {[LIT_CHARS toybox_msan]})]) (= scope= flags=0 words=[] bindings=[('SAN_FLAG', {[VarSub flag]})]) ) (List (= scope= flags=0 words=[] bindings=[('TOYBOX_BIN', {[LIT_CHARS toybox_ubsan]})]) (= scope= flags=0 words=[] bindings=[('SAN_FLAG', {[VarSub flag]})]) (= scope= flags=1 words=[] bindings=[('UBSAN_OPTIONS', {[SQ ]})]) ) (List (= scope= flags=0 words=[] bindings=[('TOYBOX_BIN', {[LIT_CHARS toybox_sancov_func]})]) (= scope= flags=0 words=[] bindings=[('SAN_FLAG', {[VarSub flag]})]) (= scope= flags=0 words=[] bindings=[('cov_dir', {[LIT_CHARS /tmp/sancov]})]) (Com {[LIT_CHARS mkdir]} {[LIT_CHARS -p]} {[VarSub cov_dir]} ) (= scope= flags=1 words=[] bindings=[('MSAN_OPTIONS', {[DQ [LIT_CHARS "coverage=1:coverage_dir="][VarSub cov_dir]]})]) (Com {[LIT_CHARS echo]} {[VarSub MSAN_OPTIONS]} ) ) (Com {[LIT_CHARS die]} {[DQ [LIT_CHARS "Invalid flag "][VarSub flag]]} ) (= scope= flags=0 words=[] bindings=[('ret', {[LIT_CHARS 1]})]) ) (Com {[LIT_CHARS return]} {[VarSub ret]} ) ) ) (FunctionDef toys_to_link [] (Pipeline (Com {[LIT_CHARS grep]} {[SQ ]} {[LIT_CHARS toys/] [LIT_OTHER "*"] [LIT_CHARS /] [LIT_OTHER "*"] [LIT_CHARS .c]} ) (Com {[LIT_CHARS grep]} {[LIT_CHARS -v]} {[LIT_CHARS TOYFLAG_NOFORK]} ) (Com {[LIT_CHARS grep]} {[LIT_CHARS -v]} {[DQ [LIT_CHARS "0))"]]} ) (Com {[LIT_CHARS sed]} {[LIT_CHARS -rn]} {[SQ ]} ) (Com {[LIT_CHARS sort]} ) ) ) (FunctionDef make_toybox_tree [] (List (= scope= flags=0 words=[] bindings=[('tree_dir', {[VarSub 1]})]) (= scope= flags=0 words=[] bindings=[('toybox_bin', {[VarSub 2]})]) (Com {[LIT_CHARS rm]} {[LIT_CHARS -rf]} {[VarSub tree_dir]} ) (Com {[LIT_CHARS mkdir]} {[LIT_CHARS -p]} {[VarSub tree_dir]} ) (Pipeline (Com {[LIT_CHARS toys_to_link]} ) (Com {[LIT_CHARS xargs]} {[LIT_CHARS -I]} {[LIT_LBRACE "{"] [LIT_RBRACE "}"]} {[LIT_CHARS --]} {[LIT_CHARS ln]} {[LIT_CHARS -s]} {[VarSub toybox_bin]} {[VarSub tree_dir] [LIT_CHARS /] [LIT_LBRACE "{"] [LIT_RBRACE "}"]} ) ) ) ) (FunctionDef all [] (List (If (Com {[LIT_DBRACKET_LIKE "["]} {[VarSub #]} {[LIT_CHARS -gt]} {[LIT_CHARS 0]} {[LIT_DBRACKET_LIKE "]"]} ) (AndOr OP_AND_IF (Com {[LIT_CHARS process_flag]} {[VarSub 1]} ) (Com {[LIT_CHARS shift]} ) ) ) (Com {[LIT_CHARS make]} {[VarSub TOYBOX_BIN]} ) (= scope= flags=0 words=[] bindings=[('tree_dir', {[LIT_CHARS generated/tree/all] [VarSub SAN_FLAG]})]) (Com {[LIT_CHARS make_toybox_tree]} {[VarSub tree_dir]} {[LIT_CHARS ../../../] [VarSub TOYBOX_BIN]} ) (Com {[LIT_CHARS scripts/test.sh]} {[LIT_CHARS all]} more_env=[('TOYBOX_TREE_DIR', {[VarSub TOPDIR] [LIT_CHARS /] [VarSub tree_dir]})] ) ) ) (FunctionDef single [] (List (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[VarSub #]} {[LIT_CHARS -eq]} {[LIT_CHARS 0]} {[LIT_DBRACKET_LIKE "]"]} ) (Com {[LIT_CHARS die]} {[DQ [LIT_CHARS "At least one command is required."]]} ) ) (AndOr OP_AND_IF (Com {[LIT_CHARS process_flag]} {[VarSub 1]} ) (Com {[LIT_CHARS shift]} ) ) (Com {[LIT_CHARS make]} {[VarSub TOYBOX_BIN]} ) (For cmd [{[DQ [VarSub @]]}]) (List (= scope= flags=0 words=[{[LIT_CHARS tree_dir]}] bindings=[]) (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[LIT_CHARS -z]} {[DQ [VarSub SAN_FLAG]]} {[LIT_DBRACKET_LIKE "]"]} ) (AndOr OP_OR_IF (= scope= flags=0 words=[] bindings=[('tree_dir', {[LIT_CHARS generated/tree/] [VarSub cmd]})]) (= scope= flags=0 words=[] bindings=[('tree_dir', {[LIT_CHARS generated/tree/all] [VarSub SAN_FLAG]})]) ) ) (Com {[LIT_CHARS make_toybox_tree]} {[VarSub tree_dir]} {[LIT_CHARS ../../../] [VarSub TOYBOX_BIN]} ) (If (Com {[LIT_DBRACKET_LIKE "["]} {[LIT_CHARS -z]} {[DQ [VarSub SAN_FLAG]]} {[LIT_DBRACKET_LIKE "]"]} ) (List (Com {[LIT_CHARS make]} {[LIT_CHARS generated/single/] [VarSub cmd]} ) (Com {[LIT_CHARS cp]} {[LIT_CHARS -v]} {[LIT_CHARS -f]} {[LIT_CHARS generated/single/] [VarSub cmd]} {[VarSub tree_dir]} ) ) ) (Com {[LIT_CHARS scripts/test.sh]} {[LIT_CHARS single]} {[VarSub cmd]} more_env=[('TOYBOX_TREE_DIR', {[VarSub TOPDIR] [LIT_CHARS /] [VarSub tree_dir]})] ) ) ) ) ) (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[VarSub #]} {[LIT_CHARS -eq]} {[LIT_CHARS 0]} {[LIT_DBRACKET_LIKE "]"]} ) (Com {[LIT_CHARS usage]} ) ) (Case to_match={[VarSub 1]}, pat_word_list=[[{[LIT_CHARS single]}, {[LIT_CHARS all]}], [{[LIT_OTHER "*"]}]] (Com {[DQ [VarSub @]]} ) (Com {[LIT_CHARS usage]} ) ) )