mirror of
				https://github.com/ethereum/solidity
				synced 2023-10-03 13:03:40 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			153 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			153 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
| #!/usr/bin/env python3
 | |
| 
 | |
| # ------------------------------------------------------------------------------
 | |
| # This file is part of solidity.
 | |
| #
 | |
| # solidity is free software: you can redistribute it and/or modify
 | |
| # it under the terms of the GNU General Public License as published by
 | |
| # the Free Software Foundation, either version 3 of the License, or
 | |
| # (at your option) any later version.
 | |
| #
 | |
| # solidity is distributed in the hope that it will be useful,
 | |
| # but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
| # GNU General Public License for more details.
 | |
| #
 | |
| # You should have received a copy of the GNU General Public License
 | |
| # along with solidity.  If not, see <http://www.gnu.org/licenses/>
 | |
| #
 | |
| # (c) 2023 solidity contributors.
 | |
| # ------------------------------------------------------------------------------
 | |
| 
 | |
| from argparse import ArgumentParser, Namespace
 | |
| import os
 | |
| from pathlib import Path
 | |
| import sys
 | |
| import subprocess
 | |
| 
 | |
| EXTERNAL_TESTS_DIR = Path(__file__).parent / "externalTests"
 | |
| 
 | |
| 
 | |
| class ExternalTestNotFound(Exception):
 | |
|     pass
 | |
| 
 | |
| 
 | |
| def detect_external_tests() -> dict:
 | |
|     return {
 | |
|         file_path.stem: file_path
 | |
|         for file_path in Path(EXTERNAL_TESTS_DIR).iterdir()
 | |
|         if file_path.is_file() and file_path.suffix == ".sh"
 | |
|     }
 | |
| 
 | |
| 
 | |
| def display_available_external_tests(_):
 | |
|     print("Available external tests:")
 | |
|     print(*detect_external_tests().keys())
 | |
| 
 | |
| 
 | |
| def run_test_scripts(solc_binary_type: str, solc_binary_path: Path, tests: dict):
 | |
|     for test_name, test_script_path in tests.items():
 | |
|         print(f"Running {test_name} external test...")
 | |
|         subprocess.run(
 | |
|             [test_script_path, solc_binary_type, solc_binary_path],
 | |
|             check=True
 | |
|         )
 | |
| 
 | |
| 
 | |
| def run_external_tests(args: dict):
 | |
|     solc_binary_type = args["solc_binary_type"]
 | |
|     solc_binary_path = args["solc_binary_path"]
 | |
| 
 | |
|     all_test_scripts = detect_external_tests()
 | |
|     selected_tests = args["selected_tests"]
 | |
|     if args["run_all"]:
 | |
|         assert len(selected_tests) == 0
 | |
|         run_test_scripts(solc_binary_type, solc_binary_path, all_test_scripts)
 | |
|         return
 | |
| 
 | |
|     if len(selected_tests) == 0:
 | |
|         raise ExternalTestNotFound(
 | |
|             "External test was not selected. Please use --run or --run-all option"
 | |
|         )
 | |
| 
 | |
|     unrecognized_tests = set(selected_tests) - set(all_test_scripts.keys())
 | |
|     if unrecognized_tests != set():
 | |
|         raise ExternalTestNotFound(
 | |
|             f"External test(s) not found: {', '.join(unrecognized_tests)}"
 | |
|         )
 | |
|     run_test_scripts(
 | |
|         solc_binary_type,
 | |
|         solc_binary_path,
 | |
|         {k: all_test_scripts[k] for k in selected_tests},
 | |
|     )
 | |
| 
 | |
| 
 | |
| def parse_commandline() -> Namespace:
 | |
|     script_description = "Script to run external Solidity tests."
 | |
| 
 | |
|     parser = ArgumentParser(description=script_description)
 | |
|     subparser = parser.add_subparsers()
 | |
|     list_command = subparser.add_parser(
 | |
|         "list",
 | |
|         help="List all available external tests.",
 | |
|     )
 | |
|     list_command.set_defaults(cmd=display_available_external_tests)
 | |
| 
 | |
|     run_command = subparser.add_parser(
 | |
|         "test",
 | |
|         help="Run external tests.",
 | |
|     )
 | |
|     run_command.set_defaults(cmd=run_external_tests)
 | |
| 
 | |
|     run_command.add_argument(
 | |
|         "--solc-binary-type",
 | |
|         dest="solc_binary_type",
 | |
|         type=str,
 | |
|         required=True,
 | |
|         choices=["native", "solcjs"],
 | |
|         help="Type of the solidity compiler binary to be used.",
 | |
|     )
 | |
|     run_command.add_argument(
 | |
|         "--solc-binary-path",
 | |
|         dest="solc_binary_path",
 | |
|         type=Path,
 | |
|         required=True,
 | |
|         help="Path to the solidity compiler binary.",
 | |
|     )
 | |
| 
 | |
|     running_mode = run_command.add_mutually_exclusive_group()
 | |
|     running_mode.add_argument(
 | |
|         "--run",
 | |
|         metavar="TEST_NAME",
 | |
|         dest="selected_tests",
 | |
|         nargs="+",
 | |
|         default=[],
 | |
|         help="List of one or more external tests to run (separated by sapce).",
 | |
|     )
 | |
|     running_mode.add_argument(
 | |
|         "--run-all",
 | |
|         dest="run_all",
 | |
|         default=False,
 | |
|         action="store_true",
 | |
|         help="Run all available external tests.",
 | |
|     )
 | |
| 
 | |
|     return parser.parse_args()
 | |
| 
 | |
| 
 | |
| def main():
 | |
|     try:
 | |
|         args = parse_commandline()
 | |
|         args.cmd(vars(args))
 | |
|         return os.EX_OK
 | |
|     except ExternalTestNotFound as exception:
 | |
|         print(f"Error: {exception}", file=sys.stderr)
 | |
|         return os.EX_NOINPUT
 | |
|     except RuntimeError as exception:
 | |
|         print(f"Error: {exception}", file=sys.stderr)
 | |
|         return 1
 | |
| 
 | |
| 
 | |
| if __name__ == "__main__":
 | |
|     sys.exit(main())
 |