summaryrefslogtreecommitdiff
path: root/tools/build/v2/test/test_all.py
diff options
context:
space:
mode:
Diffstat (limited to 'tools/build/v2/test/test_all.py')
-rw-r--r--tools/build/v2/test/test_all.py240
1 files changed, 240 insertions, 0 deletions
diff --git a/tools/build/v2/test/test_all.py b/tools/build/v2/test/test_all.py
new file mode 100644
index 0000000000..59476bd740
--- /dev/null
+++ b/tools/build/v2/test/test_all.py
@@ -0,0 +1,240 @@
+#!/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 os
+import sys
+import string
+import BoostBuild
+
+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 critical tests and then other_tests.
+
+ Stops on first error, and write the name of failed test to
+ test_results.txt. Critical tests are run in the specified order, other
+ tests are run starting with the one that failed the last time.
+ """
+ last_failed = last_failed_test()
+ other_tests = reorder_tests(other_tests, last_failed)
+ all_tests = critical_tests + other_tests
+
+ invocation_dir = os.getcwd()
+
+ pass_count = 0
+ failures_count = 0
+
+ for i in all_tests:
+ passed = 1
+ if not xml:
+ print ("%-25s : " %(i)),
+ try:
+ __import__(i)
+ except SystemExit:
+ passed = 0;
+ if failures_count == 0:
+ f = open(os.path.join(invocation_dir, 'test_results.txt'), 'w')
+ f.write(i)
+ f.close()
+ failures_count = failures_count + 1
+ # Restore the current directory, which might be changed by the test.
+ os.chdir(invocation_dir)
+
+ if not xml:
+ if passed:
+ print "PASSED"
+ else:
+ print "FAILED"
+
+ if i == "regression":
+ BoostBuild.flush_annotations()
+ BoostBuild.clear_annotations()
+ 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">""" % (i, toolset, "tools/build/v2/test/" + i + ".py",
+ "boost/bin.v2/boost.build.tests/" + toolset + "/" + i, rs)
+
+ if not passed:
+ BoostBuild.flush_annotations(1)
+
+ print """
+</run>
+</test-log>
+"""
+ if passed:
+ pass_count = pass_count + 1
+ sys.stdout.flush() # Makes testing under emacs more entertaining.
+
+ # Erase the file on success.
+ if failures_count == 0:
+ open('test_results.txt', 'w')
+
+ if not xml:
+ print """
+ === Test summary ===
+ PASS: %d
+ FAIL: %d
+ """ % (pass_count, failures_count)
+
+
+def last_failed_test():
+ "Returns the name of last failed test or None"
+ try:
+ f = open("test_results.txt")
+ s = string.strip(f.read())
+ return s
+ except:
+ 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_v1", "startup_v2"]
+
+critical_tests += ["core_d12", "core_typecheck", "core_delete_module",
+ "core_varnames", "core_import_module"]
+
+tests = [ "absolute_sources",
+ "alias",
+ "alternatives",
+ "bad_dirname",
+ "build_dir",
+ "build_file",
+ "build_no",
+ "c_file",
+ "chain",
+ "clean",
+ "composite",
+ "conditionals",
+ "conditionals2",
+ "conditionals3",
+ "conditionals_multiple",
+ "configuration",
+ "copy_time",
+ "custom_generator",
+ "default_build",
+ "default_features",
+# This test is known to be broken itself.
+# "default_toolset",
+ "dependency_property",
+ "dependency_test",
+ "disambiguation",
+ "dll_path",
+ "double_loading",
+ "duplicate",
+ "example_libraries",
+ "example_make",
+ "expansion",
+ "explicit",
+ "file_name_handling",
+ "free_features_request",
+ "generator_selection",
+ "generators_test",
+ "implicit_dependency",
+ "indirect_conditional",
+ "inherit_toolset",
+ "inherited_dependency",
+ "inline",
+ "lib_source_property",
+ "library_chain",
+ "library_property",
+ "load_order",
+ "loop",
+ "make_rule",
+ "ndebug",
+ "no_type",
+ "notfile",
+ "ordered_include",
+ "out_of_tree",
+ "path_features",
+ "prebuilt",
+ "print",
+ "project_dependencies",
+ "project_glob",
+ "project_root_constants",
+ "project_root_rule",
+ "project_test3",
+ "project_test4",
+ "property_expansion",
+ "rebuilds",
+ "regression",
+ "relative_sources",
+ "remove_requirement",
+ "resolution",
+ "searched_lib",
+ "skipping",
+ "sort_rule",
+ "source_locations",
+ "stage",
+ "standalone",
+ "suffix",
+ "tag",
+ "test_result_dumping",
+ "testing_support",
+ "timedata",
+ "unit_test",
+ "use_requirements",
+ "using",
+ "wrapper",
+ "wrong_project",
+ "exit_status",
+ ]
+
+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).
+ if string.find(os.uname()[0], "CYGWIN") == -1:
+ tests.append("library_order")
+
+if string.find(BoostBuild.get_toolset(), 'gcc') == 0:
+ tests.append("gcc_runtime")
+
+if ( string.find(BoostBuild.get_toolset(), 'gcc') == 0 )or \
+ ( string.find(BoostBuild.get_toolset(), 'msvc') == 0 ):
+ tests.append("pch")
+
+if "--extras" in sys.argv:
+ tests.append("boostbook")
+ tests.append("qt4")
+ 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)