mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-10-31 04:50:34 -04:00 
			
		
		
		
	
		
			
	
	
		
			315 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			315 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|  | #!/usr/bin/python | ||
|  | 
 | ||
|  | # Copyright 2002-2005 Dave Abrahams. | ||
|  | # Copyright 2002-2006 Vladimir Prus. | ||
|  | # Distributed under the Boost Software License, Version 1.0. | ||
|  | #    (See accompanying file LICENSE_1_0.txt or copy at | ||
|  | #         http://www.boost.org/LICENSE_1_0.txt) | ||
|  | 
 | ||
|  | import BoostBuild | ||
|  | 
 | ||
|  | import os | ||
|  | import os.path | ||
|  | import sys | ||
|  | 
 | ||
|  | xml = "--xml" in sys.argv | ||
|  | toolset = BoostBuild.get_toolset() | ||
|  | 
 | ||
|  | 
 | ||
|  | # Clear environment for testing. | ||
|  | # | ||
|  | for s in ("BOOST_ROOT", "BOOST_BUILD_PATH", "JAM_TOOLSET", "BCCROOT", | ||
|  |     "MSVCDir", "MSVC", "MSVCNT", "MINGW", "watcom"): | ||
|  |     try: | ||
|  |         del os.environ[s] | ||
|  |     except: | ||
|  |         pass | ||
|  | 
 | ||
|  | BoostBuild.set_defer_annotations(1) | ||
|  | 
 | ||
|  | 
 | ||
|  | def run_tests(critical_tests, other_tests): | ||
|  |     """
 | ||
|  |       Runs first the critical_tests and then the other_tests. | ||
|  | 
 | ||
|  |       Writes the name of the first failed test to test_results.txt. Critical | ||
|  |     tests are run in the specified order, other tests are run starting with the | ||
|  |     one that failed first on the last test run. | ||
|  | 
 | ||
|  |     """
 | ||
|  |     last_failed = last_failed_test() | ||
|  |     other_tests = reorder_tests(other_tests, last_failed) | ||
|  |     all_tests = critical_tests + other_tests | ||
|  | 
 | ||
|  |     invocation_dir = os.getcwd() | ||
|  |     max_test_name_len = 10 | ||
|  |     for x in all_tests: | ||
|  |         if len(x) > max_test_name_len: | ||
|  |             max_test_name_len = len(x) | ||
|  | 
 | ||
|  |     pass_count = 0 | ||
|  |     failures_count = 0 | ||
|  | 
 | ||
|  |     for test in all_tests: | ||
|  |         if not xml: | ||
|  |             print("%%-%ds :" % max_test_name_len % test), | ||
|  | 
 | ||
|  |         passed = 0 | ||
|  |         try: | ||
|  |             __import__(test) | ||
|  |             passed = 1 | ||
|  |         except KeyboardInterrupt: | ||
|  |             """This allows us to abort the testing manually using Ctrl-C.""" | ||
|  |             raise | ||
|  |         except SystemExit: | ||
|  |             """This is the regular way our test scripts are supposed to report
 | ||
|  |             test failures."""
 | ||
|  |         except: | ||
|  |             exc_type, exc_value, exc_tb = sys.exc_info() | ||
|  |             try: | ||
|  |                 BoostBuild.annotation("failure - unhandled exception", "%s - " | ||
|  |                     "%s" % (exc_type.__name__, exc_value)) | ||
|  |                 BoostBuild.annotate_stack_trace(exc_tb) | ||
|  |             finally: | ||
|  |                 #   Explicitly clear a hard-to-garbage-collect traceback | ||
|  |                 # related reference cycle as per documented sys.exc_info() | ||
|  |                 # usage suggestion. | ||
|  |                 del exc_tb | ||
|  | 
 | ||
|  |         if passed: | ||
|  |             pass_count += 1 | ||
|  |         else: | ||
|  |             failures_count += 1 | ||
|  |             if failures_count == 1: | ||
|  |                 f = open(os.path.join(invocation_dir, "test_results.txt"), "w") | ||
|  |                 try: | ||
|  |                     f.write(test) | ||
|  |                 finally: | ||
|  |                     f.close() | ||
|  | 
 | ||
|  |         #   Restore the current directory, which might have been changed by the | ||
|  |         # test. | ||
|  |         os.chdir(invocation_dir) | ||
|  | 
 | ||
|  |         if not xml: | ||
|  |             if passed: | ||
|  |                 print("PASSED") | ||
|  |             else: | ||
|  |                 print("FAILED") | ||
|  |         else: | ||
|  |             rs = "succeed" | ||
|  |             if not passed: | ||
|  |                 rs = "fail" | ||
|  |             print """
 | ||
|  | <test-log library="build" test-name="%s" test-type="run" toolset="%s" test-program="%s" target-directory="%s"> | ||
|  | <run result="%s">""" % (test, toolset, "tools/build/v2/test/" + test + ".py",
 | ||
|  |                 "boost/bin.v2/boost.build.tests/" + toolset + "/" + test, rs) | ||
|  |             if not passed: | ||
|  |                 BoostBuild.flush_annotations(1) | ||
|  |             print """
 | ||
|  | </run> | ||
|  | </test-log> | ||
|  | """
 | ||
|  |         sys.stdout.flush()  # Makes testing under emacs more entertaining. | ||
|  |         BoostBuild.clear_annotations() | ||
|  | 
 | ||
|  |     # Erase the file on success. | ||
|  |     if failures_count == 0: | ||
|  |         open("test_results.txt", "w").close() | ||
|  | 
 | ||
|  |     if not xml: | ||
|  |         print """
 | ||
|  |         === Test summary === | ||
|  |         PASS: %d | ||
|  |         FAIL: %d | ||
|  |         """ % (pass_count, failures_count)
 | ||
|  | 
 | ||
|  |     # exit with failure with failures | ||
|  |     if failures_count > 0: | ||
|  |         sys.exit(1) | ||
|  | 
 | ||
|  | def last_failed_test(): | ||
|  |     "Returns the name of the last failed test or None." | ||
|  |     try: | ||
|  |         f = open("test_results.txt") | ||
|  |         try: | ||
|  |             return f.read().strip() | ||
|  |         finally: | ||
|  |             f.close() | ||
|  |     except Exception: | ||
|  |         return None | ||
|  | 
 | ||
|  | 
 | ||
|  | def reorder_tests(tests, first_test): | ||
|  |     try: | ||
|  |         n = tests.index(first_test) | ||
|  |         return [first_test] + tests[:n] + tests[n + 1:] | ||
|  |     except ValueError: | ||
|  |         return tests | ||
|  | 
 | ||
|  | 
 | ||
|  | critical_tests = ["unit_tests", "module_actions", "startup_v2", "core_d12", | ||
|  |     "core_typecheck", "core_delete_module", "core_language", "core_arguments", | ||
|  |     "core_varnames", "core_import_module"] | ||
|  | 
 | ||
|  | # We want to collect debug information about the test site before running any | ||
|  | # of the tests, but only when not running the tests interactively. Then the | ||
|  | # user can easily run this always-failing test directly to see what it would | ||
|  | # have returned and there is no need to have it spoil a possible 'all tests | ||
|  | # passed' result. | ||
|  | if xml: | ||
|  |     critical_tests.insert(0, "collect_debug_info") | ||
|  | 
 | ||
|  | tests = ["absolute_sources", | ||
|  |          "alias", | ||
|  |          "alternatives", | ||
|  |          "bad_dirname", | ||
|  |          "build_dir", | ||
|  |          "build_file", | ||
|  |          "build_no", | ||
|  |          "builtin_echo", | ||
|  |          "builtin_exit", | ||
|  |          "builtin_glob", | ||
|  |          "builtin_glob_archive", | ||
|  |          "builtin_split_by_characters", | ||
|  |          "bzip2", | ||
|  |          "c_file", | ||
|  |          "chain", | ||
|  |          "clean", | ||
|  |          "composite", | ||
|  |          "conditionals", | ||
|  |          "conditionals2", | ||
|  |          "conditionals3", | ||
|  |          "conditionals_multiple", | ||
|  |          "configuration", | ||
|  |          "copy_time", | ||
|  |          "core_action_output", | ||
|  |          "core_action_status", | ||
|  |          "core_actions_quietly", | ||
|  |          "core_at_file", | ||
|  |          "core_bindrule", | ||
|  |          "core_jamshell", | ||
|  |          "core_multifile_actions", | ||
|  |          "core_nt_cmd_line", | ||
|  |          "core_option_d2", | ||
|  |          "core_option_l", | ||
|  |          "core_option_n", | ||
|  |          "core_parallel_actions", | ||
|  |          "core_parallel_multifile_actions_1", | ||
|  |          "core_parallel_multifile_actions_2", | ||
|  |          "core_source_line_tracking", | ||
|  |          "core_update_now", | ||
|  |          "core_variables_in_actions", | ||
|  |          "custom_generator", | ||
|  |          "default_build", | ||
|  |          "default_features", | ||
|  | # This test is known to be broken itself. | ||
|  | #         "default_toolset", | ||
|  |          "dependency_property", | ||
|  |          "dependency_test", | ||
|  |          "direct_request_test", | ||
|  |          "disambiguation", | ||
|  |          "dll_path", | ||
|  |          "double_loading", | ||
|  |          "duplicate", | ||
|  |          "example_libraries", | ||
|  |          "example_make", | ||
|  |          "exit_status", | ||
|  |          "expansion", | ||
|  |          "explicit", | ||
|  |          "feature_cxxflags", | ||
|  |          "free_features_request", | ||
|  |          "generator_selection", | ||
|  |          "generators_test", | ||
|  |          "implicit_dependency", | ||
|  |          "indirect_conditional", | ||
|  |          "inherit_toolset", | ||
|  |          "inherited_dependency", | ||
|  |          "inline", | ||
|  |          "lib_source_property", | ||
|  |          "library_chain", | ||
|  |          "library_property", | ||
|  |          "link", | ||
|  |          "load_order", | ||
|  |          "loop", | ||
|  |          "make_rule", | ||
|  |          "message", | ||
|  |          "ndebug", | ||
|  |          "no_type", | ||
|  |          "notfile", | ||
|  |          "ordered_include", | ||
|  |          "out_of_tree", | ||
|  |          "path_features", | ||
|  |          "prebuilt", | ||
|  |          "print", | ||
|  |          "project_dependencies", | ||
|  |          "project_glob", | ||
|  |          "project_id", | ||
|  |          "project_root_constants", | ||
|  |          "project_root_rule", | ||
|  |          "project_test3", | ||
|  |          "project_test4", | ||
|  |          "property_expansion", | ||
|  |          "rebuilds", | ||
|  |          "regression", | ||
|  |          "relative_sources", | ||
|  |          "remove_requirement", | ||
|  |          "rescan_header", | ||
|  |          "resolution", | ||
|  |          "scanner_causing_rebuilds", | ||
|  |          "searched_lib", | ||
|  |          "skipping", | ||
|  |          "sort_rule", | ||
|  |          "source_locations", | ||
|  |          "source_order", | ||
|  |          "space_in_path", | ||
|  |          "stage", | ||
|  |          "standalone", | ||
|  |          "static_and_shared_library", | ||
|  |          "suffix", | ||
|  |          "tag", | ||
|  |          "test_result_dumping", | ||
|  |          "test_rc", | ||
|  |          "testing_support", | ||
|  |          "timedata", | ||
|  |          "toolset_requirements", | ||
|  |          "unit_test", | ||
|  |          "unused", | ||
|  |          "use_requirements", | ||
|  |          "using", | ||
|  |          "wrapper", | ||
|  |          "wrong_project", | ||
|  |          "zlib" | ||
|  |          ] | ||
|  | 
 | ||
|  | if os.name == "posix": | ||
|  |     tests.append("symlink") | ||
|  |     # On Windows, library order is not important, so skip this test. Besides, | ||
|  |     # it fails ;-). Further, the test relies on the fact that on Linux, one can | ||
|  |     # build a shared library with unresolved symbols. This is not true on | ||
|  |     # Windows, even with cygwin gcc. | ||
|  | 
 | ||
|  | #   Disable this test until we figure how to address failures due to --as-needed being default now. | ||
|  | #    if "CYGWIN" not in os.uname()[0]: | ||
|  | #        tests.append("library_order") | ||
|  | 
 | ||
|  | if toolset.startswith("gcc"): | ||
|  |     tests.append("gcc_runtime") | ||
|  | 
 | ||
|  | if toolset.startswith("gcc") or toolset.startswith("msvc"): | ||
|  |     tests.append("pch") | ||
|  | 
 | ||
|  | if "--extras" in sys.argv: | ||
|  |     tests.append("boostbook") | ||
|  |     tests.append("qt4") | ||
|  |     tests.append("qt5") | ||
|  |     tests.append("example_qt4") | ||
|  |     # Requires ./whatever.py to work, so is not guaranted to work everywhere. | ||
|  |     tests.append("example_customization") | ||
|  |     # Requires gettext tools. | ||
|  |     tests.append("example_gettext") | ||
|  | elif not xml: | ||
|  |     print("Note: skipping extra tests") | ||
|  | 
 | ||
|  | run_tests(critical_tests, tests) |