| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556 |
- #!/usr/bin/python
- # Copyright 2008 Jurko Gospodnetic
- # Copyright 2017 Steven Watanabe
- # Distributed under the Boost Software License, Version 1.0.
- # (See accompanying file LICENSE.txt or https://www.bfgroup.xyz/b2/LICENSE.txt)
- # Tests different aspects of Boost Builds automated testing support.
- import BoostBuild
- import TestCmd
- def test_run():
- t = BoostBuild.Tester(use_test_config=False)
- t.write("pass.cpp", "int main() {}\n")
- t.write("fail-compile.cpp", "#error expected to fail\n")
- t.write("fail-link.cpp", "int f();\nint main() { return f(); }\n")
- t.write("fail-run.cpp", "int main() { return 1; }\n")
- t.write("Jamroot.jam", """import testing ;
- run pass.cpp ;
- run fail-compile.cpp ;
- run fail-link.cpp ;
- run fail-run.cpp ;
- """)
- t.run_build_system(status=1)
- t.expect_addition("bin/pass.test/$toolset/debug*/pass.obj")
- t.expect_addition("bin/pass.test/$toolset/debug*/pass.exe")
- t.expect_addition("bin/pass.test/$toolset/debug*/pass.output")
- t.expect_addition("bin/pass.test/$toolset/debug*/pass.run")
- t.expect_addition("bin/pass.test/$toolset/debug*/pass.test")
- t.expect_addition("bin/fail-link.test/$toolset/debug*/fail-link.obj")
- t.expect_addition("bin/fail-run.test/$toolset/debug*/fail-run.obj")
- t.expect_addition("bin/fail-run.test/$toolset/debug*/fail-run.exe")
- t.expect_addition("bin/fail-run.test/$toolset/debug*/fail-run.output")
- t.ignore_addition("bin/pass.test/*/pass.rsp")
- t.ignore_addition("bin/fail-link.test/*/fail-link.rsp")
- t.ignore_addition("bin/fail-run.test/*/fail-run.rsp")
- t.expect_nothing_more()
- t.cleanup()
- def test_run_fail():
- t = BoostBuild.Tester(use_test_config=False)
- t.write("pass.cpp", "int main() {}\n")
- t.write("fail-compile.cpp", "#error expected to fail\n")
- t.write("fail-link.cpp", "int f();\nint main() { return f(); }\n")
- t.write("fail-run.cpp", "int main() { return 1; }\n")
- t.write("Jamroot.jam", """import testing ;
- run-fail pass.cpp ;
- run-fail fail-compile.cpp ;
- run-fail fail-link.cpp ;
- run-fail fail-run.cpp ;
- """)
- t.run_build_system(status=1)
- t.expect_addition("bin/pass.test/$toolset/debug*/pass.obj")
- t.expect_addition("bin/pass.test/$toolset/debug*/pass.exe")
- t.expect_addition("bin/pass.test/$toolset/debug*/pass.output")
- t.expect_addition("bin/fail-link.test/$toolset/debug*/fail-link.obj")
- t.expect_addition("bin/fail-run.test/$toolset/debug*/fail-run.obj")
- t.expect_addition("bin/fail-run.test/$toolset/debug*/fail-run.exe")
- t.expect_addition("bin/fail-run.test/$toolset/debug*/fail-run.output")
- t.expect_addition("bin/fail-run.test/$toolset/debug*/fail-run.run")
- t.expect_addition("bin/fail-run.test/$toolset/debug*/fail-run.test")
- t.ignore_addition("bin/pass.test/*/pass.rsp")
- t.ignore_addition("bin/fail-link.test/*/fail-link.rsp")
- t.ignore_addition("bin/fail-run.test/*/fail-run.rsp")
- t.expect_nothing_more()
- t.cleanup()
- def test_run_change():
- """Tests that the test file is removed when a test fails after it
- previously passed."""
- t = BoostBuild.Tester(use_test_config=False)
- t.write("pass.cpp", "int main() { return 1; }\n")
- t.write("fail-compile.cpp", "int main() {}\n")
- t.write("fail-link.cpp", "int main() {}\n")
- t.write("fail-run.cpp", "int main() {}\n")
- t.write("Jamroot.jam", """import testing ;
- run-fail pass.cpp ;
- run fail-compile.cpp ;
- run fail-link.cpp ;
- run fail-run.cpp ;
- """)
- t.run_build_system()
- # Sanity check
- t.expect_addition("bin/pass.test/$toolset/debug*/pass.test")
- t.expect_addition("bin/fail-compile.test/$toolset/debug*/fail-compile.test")
- t.expect_addition("bin/fail-link.test/$toolset/debug*/fail-link.test")
- t.expect_addition("bin/fail-run.test/$toolset/debug*/fail-run.test")
- t.expect_output_lines("...failed*", False)
- # Now make them fail
- t.write("pass.cpp", "int main() {}\n")
- t.write("fail-compile.cpp", "#error expected to fail\n")
- t.write("fail-link.cpp", "int f();\nint main() { return f(); }\n")
- t.write("fail-run.cpp", "int main() { return 1; }\n")
- t.run_build_system(status=1)
- t.expect_removal("bin/pass.test/$toolset/debug*/pass.test")
- t.expect_removal("bin/fail-compile.test/$toolset/debug*/fail-compile.test")
- t.expect_removal("bin/fail-link.test/$toolset/debug*/fail-link.test")
- t.expect_removal("bin/fail-run.test/$toolset/debug*/fail-run.test")
- t.cleanup()
- def test_run_path():
- """Tests that run can find shared libraries even without
- hardcode-dll-paths. Important: The library is in neither the
- current working directory, nor any system path, nor the same
- directory as the executable, so it should never be found without
- help from B2."""
- t = BoostBuild.Tester(["hardcode-dll-paths=false"], use_test_config=False)
- t.write("l.cpp", """
- void
- #if defined(_WIN32)
- __declspec(dllexport)
- #endif
- f() {}
- """)
- t.write("pass.cpp", "void f(); int main() { f(); }\n")
- t.write("Jamroot.jam", """import testing ;
- lib l : l.cpp : <link>shared ;
- run pass.cpp l ;
- """)
- t.run_build_system()
- t.expect_addition("bin/$toolset/debug*/l.obj")
- t.expect_addition("bin/$toolset/debug*/l.dll")
- t.expect_addition("bin/pass.test/$toolset/debug*/pass.obj")
- t.expect_addition("bin/pass.test/$toolset/debug*/pass.exe")
- t.expect_addition("bin/pass.test/$toolset/debug*/pass.output")
- t.expect_addition("bin/pass.test/$toolset/debug*/pass.run")
- t.expect_addition("bin/pass.test/$toolset/debug*/pass.test")
- t.cleanup()
- def test_run_args():
- """Tests the handling of args and input-files"""
- t = BoostBuild.Tester(use_test_config=False)
- t.write("test.cpp", """
- #include <iostream>
- #include <fstream>
- int main(int argc, const char ** argv)
- {
- for(int i = 1; i < argc; ++i)
- {
- if(argv[i][0] == '-')
- {
- std::cout << argv[i] << std::endl;
- }
- else
- {
- std::ifstream ifs(argv[i]);
- std::cout << ifs.rdbuf();
- }
- }
- }
- """)
- t.write("input1.in", "first input\n")
- t.write("input2.in", "second input\n")
- t.write("Jamroot.jam", """import testing ;
- import common ;
- # FIXME: The order actually depends on the lexigraphical
- # ordering of the virtual target objects, which is just
- # crazy. Switch the order of input1.txt and input2.txt
- # to make this fail. Joining the arguments with && might
- # work, but might get a bit complicated to implement as
- # dependency properties do not currently support &&.
- make input1.txt : input1.in : @common.copy ;
- make input2.txt : input2.in : @common.copy ;
- run test.cpp : -y -a : input1.txt input2.txt ;
- """)
- t.run_build_system()
- t.expect_content("bin/test.test/$toolset/debug*/test.output", """\
- -y
- -a
- first input
- second input
- EXIT STATUS: 0
- """)
- t.cleanup()
- def test_link():
- t = BoostBuild.Tester(use_test_config=False)
- t.write("pass.cpp", "int main() {}\n")
- t.write("fail-compile.cpp", "#error expected to fail\n")
- t.write("fail-link.cpp", "int f();\nint main() { return f(); }\n")
- t.write("fail-run.cpp", "int main() { return 1; }\n")
- t.write("Jamroot.jam", """import testing ;
- link pass.cpp ;
- link fail-compile.cpp ;
- link fail-link.cpp ;
- link fail-run.cpp ;
- """)
- t.run_build_system(status=1)
- t.expect_addition("bin/pass.test/$toolset/debug*/pass.obj")
- t.expect_addition("bin/pass.test/$toolset/debug*/pass.exe")
- t.expect_addition("bin/pass.test/$toolset/debug*/pass.test")
- t.expect_addition("bin/fail-link.test/$toolset/debug*/fail-link.obj")
- t.expect_addition("bin/fail-run.test/$toolset/debug*/fail-run.obj")
- t.expect_addition("bin/fail-run.test/$toolset/debug*/fail-run.exe")
- t.expect_addition("bin/fail-run.test/$toolset/debug*/fail-run.test")
- t.ignore_addition("bin/pass.test/*/pass.rsp")
- t.ignore_addition("bin/fail-link.test/*/fail-link.rsp")
- t.ignore_addition("bin/fail-run.test/*/fail-run.rsp")
- t.expect_nothing_more()
- t.cleanup()
- def test_link_fail():
- t = BoostBuild.Tester(use_test_config=False)
- t.write("pass.cpp", "int main() {}\n")
- t.write("fail-compile.cpp", "#error expected to fail\n")
- t.write("fail-link.cpp", "int f();\nint main() { return f(); }\n")
- t.write("fail-run.cpp", "int main() { return 1; }\n")
- t.write("Jamroot.jam", """import testing ;
- link-fail pass.cpp ;
- link-fail fail-compile.cpp ;
- link-fail fail-link.cpp ;
- link-fail fail-run.cpp ;
- """)
- t.run_build_system(status=1)
- t.expect_addition("bin/pass.test/$toolset/debug*/pass.obj")
- t.expect_addition("bin/fail-link.test/$toolset/debug*/fail-link.obj")
- t.expect_addition("bin/fail-link.test/$toolset/debug*/fail-link.exe")
- t.expect_addition("bin/fail-link.test/$toolset/debug*/fail-link.test")
- t.expect_addition("bin/fail-run.test/$toolset/debug*/fail-run.obj")
- t.ignore_addition("bin/pass.test/*/pass.rsp")
- t.ignore_addition("bin/fail-link.test/*/fail-link.rsp")
- t.ignore_addition("bin/fail-run.test/*/fail-run.rsp")
- t.expect_nothing_more()
- t.cleanup()
- def test_link_change():
- """Tests that the test file is removed when a test fails after it
- previously passed."""
- t = BoostBuild.Tester(use_test_config=False)
- t.write("pass.cpp", "int f();\nint main() { return f(); }\n")
- t.write("fail-compile.cpp", "int main() {}\n")
- t.write("fail-link.cpp", "int main() {}\n")
- t.write("Jamroot.jam", """import testing ;
- link-fail pass.cpp ;
- link fail-compile.cpp ;
- link fail-link.cpp ;
- """)
- t.run_build_system()
- # Sanity check
- t.expect_addition("bin/pass.test/$toolset/debug*/pass.test")
- t.expect_addition("bin/fail-compile.test/$toolset/debug*/fail-compile.test")
- t.expect_addition("bin/fail-link.test/$toolset/debug*/fail-link.test")
- t.expect_output_lines("...failed*", False)
- # Now make them fail
- t.write("pass.cpp", "int main() {}\n")
- t.write("fail-compile.cpp", "#error expected to fail\n")
- t.write("fail-link.cpp", "int f();\nint main() { return f(); }\n")
- t.run_build_system(status=1)
- t.expect_removal("bin/pass.test/$toolset/debug*/pass.test")
- t.expect_removal("bin/fail-compile.test/$toolset/debug*/fail-compile.test")
- t.expect_removal("bin/fail-link.test/$toolset/debug*/fail-link.test")
- t.cleanup()
- def test_compile():
- t = BoostBuild.Tester(use_test_config=False)
- t.write("pass.cpp", "int main() {}\n")
- t.write("fail-compile.cpp", "#error expected to fail\n")
- t.write("fail-link.cpp", "int f();\nint main() { return f(); }\n")
- t.write("fail-run.cpp", "int main() { return 1; }\n")
- t.write("Jamroot.jam", """import testing ;
- compile pass.cpp ;
- compile fail-compile.cpp ;
- compile fail-link.cpp ;
- compile fail-run.cpp ;
- """)
- t.run_build_system(status=1)
- t.expect_addition("bin/pass.test/$toolset/debug*/pass.obj")
- t.expect_addition("bin/pass.test/$toolset/debug*/pass.test")
- t.expect_addition("bin/fail-link.test/$toolset/debug*/fail-link.obj")
- t.expect_addition("bin/fail-link.test/$toolset/debug*/fail-link.test")
- t.expect_addition("bin/fail-run.test/$toolset/debug*/fail-run.obj")
- t.expect_addition("bin/fail-run.test/$toolset/debug*/fail-run.test")
- t.expect_nothing_more()
- t.cleanup()
- def test_compile_fail():
- t = BoostBuild.Tester(use_test_config=False)
- t.write("pass.cpp", "int main() {}\n")
- t.write("fail-compile.cpp", "#error expected to fail\n")
- t.write("fail-link.cpp", "int f();\nint main() { return f(); }\n")
- t.write("fail-run.cpp", "int main() { return 1; }\n")
- t.write("Jamroot.jam", """import testing ;
- compile-fail pass.cpp ;
- compile-fail fail-compile.cpp ;
- compile-fail fail-link.cpp ;
- compile-fail fail-run.cpp ;
- """)
- t.run_build_system(status=1)
- t.expect_addition("bin/fail-compile.test/$toolset/debug*/fail-compile.obj")
- t.expect_addition("bin/fail-compile.test/$toolset/debug*/fail-compile.test")
- t.expect_nothing_more()
- t.cleanup()
- def test_compile_change():
- """Tests that the test file is removed when a test fails after it
- previously passed."""
- t = BoostBuild.Tester(use_test_config=False)
- t.write("pass.cpp", "#error expected to fail\n")
- t.write("fail-compile.cpp", "int main() {}\n")
- t.write("Jamroot.jam", """import testing ;
- compile-fail pass.cpp ;
- compile fail-compile.cpp ;
- """)
- t.run_build_system()
- # Sanity check
- t.expect_addition("bin/pass.test/$toolset/debug*/pass.test")
- t.expect_addition("bin/fail-compile.test/$toolset/debug*/fail-compile.test")
- t.expect_output_lines("...failed*", False)
- # Now make them fail
- t.write("pass.cpp", "int main() {}\n")
- t.write("fail-compile.cpp", "#error expected to fail\n")
- t.run_build_system(status=1)
- t.expect_removal("bin/pass.test/$toolset/debug*/pass.test")
- t.expect_removal("bin/fail-compile.test/$toolset/debug*/fail-compile.test")
- t.cleanup()
- def test_remove_test_targets(option):
- t = BoostBuild.Tester(use_test_config=False)
- t.write("pass-compile.cpp", "int main() {}\n")
- t.write("pass-link.cpp", "int main() {}\n")
- t.write("pass-run.cpp", "int main() {}\n")
- t.write("fail-compile.cpp", "#error expected to fail\n")
- t.write("fail-link.cpp", "int f();\nint main() { return f(); }\n")
- t.write("fail-run.cpp", "int main() { return 1; }\n")
- t.write("source.cpp", "int f();\n")
- t.write("Jamroot.jam", """import testing ;
- obj source.o : source.cpp ;
- compile pass-compile.cpp ;
- link pass-link.cpp source.o ;
- run pass-run.cpp source.o ;
- compile-fail fail-compile.cpp ;
- link-fail fail-link.cpp ;
- run-fail fail-run.cpp ;
- """)
- t.run_build_system([option])
- t.expect_addition("bin/$toolset/debug*/source.obj")
- t.expect_addition("bin/pass-compile.test/$toolset/debug*/pass-compile.test")
- t.expect_addition("bin/pass-link.test/$toolset/debug*/pass-link.test")
- t.expect_addition("bin/pass-run.test/$toolset/debug*/pass-run.output")
- t.expect_addition("bin/pass-run.test/$toolset/debug*/pass-run.run")
- t.expect_addition("bin/pass-run.test/$toolset/debug*/pass-run.test")
- t.expect_addition("bin/fail-compile.test/$toolset/debug*/fail-compile.test")
- t.expect_addition("bin/fail-link.test/$toolset/debug*/fail-link.test")
- t.expect_addition("bin/fail-run.test/$toolset/debug*/fail-run.output")
- t.expect_addition("bin/fail-run.test/$toolset/debug*/fail-run.run")
- t.expect_addition("bin/fail-run.test/$toolset/debug*/fail-run.test")
- t.ignore_addition("bin/pass-link.test/*/pass-link.rsp")
- t.ignore_addition("bin/pass-run.test/*/pass-run.rsp")
- t.ignore_addition("bin/fail-link.test/*/fail-link.rsp")
- t.ignore_addition("bin/fail-run.test/*/fail-run.rsp")
- t.expect_nothing_more()
- t.cleanup()
- def test_dump_tests():
- """Tests the output of the --dump-tests option"""
- t = BoostBuild.Tester(use_test_config=False)
- t.write("pass-compile.cpp", "int main() {}\n")
- t.write("pass-link.cpp", "int main() {}\n")
- t.write("pass-run.cpp", "int main() {}\n")
- t.write("fail-compile.cpp", "#error expected to fail\n")
- t.write("fail-link.cpp", "int f();\nint main() { return f(); }\n")
- t.write("fail-run.cpp", "int main() { return 1; }\n")
- t.write("Jamroot.jam", """import testing ;
- run pass-run.cpp ;
- run-fail fail-run.cpp ;
- link pass-link.cpp ;
- link-fail fail-link.cpp ;
- compile pass-compile.cpp ;
- compile-fail fail-compile.cpp ;
- build-project libs/any/test ;
- build-project libs/any/example ;
- build-project libs/any ;
- build-project tools/bcp/test ;
- build-project tools/bcp/example ;
- build-project subdir/test ;
- build-project status ;
- build-project outside/project ;
- """)
- def write_subdir(dir):
- t.write(dir + "/test.cpp", "int main() {}\n")
- t.write(dir + "/Jamfile", "run test.cpp ;")
- write_subdir("libs/any/test")
- write_subdir("libs/any/example")
- write_subdir("libs/any")
- write_subdir("tools/bcp/test")
- write_subdir("tools/bcp/example")
- write_subdir("status")
- write_subdir("subdir/test")
- t.write("outside/other/test.cpp", "int main() {}\n")
- t.write("outside/project/Jamroot", "run ../other/test.cpp ;")
- t.run_build_system(["--dump-tests", "-n", "-d0"],
- match=TestCmd.match_re, stdout=
- """boost-test\(RUN\) ".*/pass-run" : "pass-run\.cpp"
- boost-test\(RUN_FAIL\) ".*/fail-run" : "fail-run\.cpp"
- boost-test\(LINK\) ".*/pass-link" : "pass-link\.cpp"
- boost-test\(LINK_FAIL\) ".*/fail-link" : "fail-link\.cpp"
- boost-test\(COMPILE\) ".*/pass-compile" : "pass-compile\.cpp"
- boost-test\(COMPILE_FAIL\) ".*/fail-compile" : "fail-compile\.cpp"
- boost-test\(RUN\) "any/test" : "libs/any/test\.cpp"
- boost-test\(RUN\) "any/test" : "libs/any/test/test\.cpp"
- boost-test\(RUN\) "any/test" : "libs/any/example/test\.cpp"
- boost-test\(RUN\) "bcp/test" : "tools/bcp/test/test\.cpp"
- boost-test\(RUN\) "bcp/test" : "tools/bcp/example/test\.cpp"
- boost-test\(RUN\) ".*/subdir/test/test" : "subdir/test/test\.cpp"
- boost-test\(RUN\) "test" : "status/test\.cpp"
- boost-test\(RUN\) ".*/outside/project/test" : "../other/test.cpp"
- """)
- t.cleanup()
- ################################################################################
- #
- # test_files_with_spaces_in_their_name()
- # --------------------------------------
- #
- ################################################################################
- def test_files_with_spaces_in_their_name():
- """Regression test making sure test result files get created correctly when
- testing files with spaces in their name.
- """
- t = BoostBuild.Tester(use_test_config=False)
- t.write("valid source.cpp", "int main() {}\n");
- t.write("invalid source.cpp", "this is not valid source code");
- t.write("jamroot.jam", """
- import testing ;
- testing.compile "valid source.cpp" ;
- testing.compile-fail "invalid source.cpp" ;
- """)
- t.run_build_system(status=0)
- t.expect_addition("bin/invalid source.test/$toolset/debug*/invalid source.obj")
- t.expect_addition("bin/invalid source.test/$toolset/debug*/invalid source.test")
- t.expect_addition("bin/valid source.test/$toolset/debug*/valid source.obj")
- t.expect_addition("bin/valid source.test/$toolset/debug*/valid source.test")
- t.expect_content("bin/valid source.test/$toolset/debug*/valid source.test", \
- "passed" )
- t.expect_content( \
- "bin/invalid source.test/$toolset/debug*/invalid source.test", \
- "passed" )
- t.expect_content( \
- "bin/invalid source.test/$toolset/debug*/invalid source.obj", \
- "failed as expected" )
- t.cleanup()
- ################################################################################
- #
- # main()
- # ------
- #
- ################################################################################
- test_run()
- test_run_fail()
- test_run_change()
- test_run_path()
- test_run_args()
- test_link()
- test_link_fail()
- test_link_change()
- test_compile()
- test_compile_fail()
- test_compile_change()
- test_remove_test_targets("--remove-test-targets")
- test_remove_test_targets("preserve-test-targets=off")
- test_dump_tests()
- test_files_with_spaces_in_their_name()
|