summaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
authorWilliam Deegan <bill@baddogconsulting.com>2021-11-04 04:12:23 (GMT)
committerWilliam Deegan <bill@baddogconsulting.com>2021-11-04 04:12:23 (GMT)
commit3dfbbea945e615b972c3909af963248e1d676a70 (patch)
treece1bb67a3571a7fedfb02f4e17a34e52f5bf6dd0 /test
parent704b6c4ea072716e94f640b6d5a2bdaaf9f79d73 (diff)
downloadSCons-3dfbbea945e615b972c3909af963248e1d676a70.zip
SCons-3dfbbea945e615b972c3909af963248e1d676a70.tar.gz
SCons-3dfbbea945e615b972c3909af963248e1d676a70.tar.bz2
add test to verify that control-c'ing ninja while it's calling SCons to rebuild build.ninja preserves the file
Diffstat (limited to 'test')
-rw-r--r--test/ninja/ninja_handle_control_c_rebuild.py82
-rw-r--r--test/ninja/ninja_test_sconscripts/sconstruct_control_c_ninja12
2 files changed, 94 insertions, 0 deletions
diff --git a/test/ninja/ninja_handle_control_c_rebuild.py b/test/ninja/ninja_handle_control_c_rebuild.py
new file mode 100644
index 0000000..4496e61
--- /dev/null
+++ b/test/ninja/ninja_handle_control_c_rebuild.py
@@ -0,0 +1,82 @@
+#!/usr/bin/env python
+#
+# Copyright The SCons Foundation
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+"""
+This test ensures if ninja get's a control-c (or other interrupting signal) while
+regenerating the build.ninja, it doesn't remove the build.ninja leaving it
+in an unworkable state.
+"""
+import os
+
+import TestSCons
+from TestCmd import IS_WINDOWS
+
+test = TestSCons.TestSCons()
+
+try:
+ import ninja
+except ImportError:
+ test.skip_test("Could not find module in python")
+
+_python_ = TestSCons._python_
+_exe = TestSCons._exe
+
+ninja_bin = os.path.abspath(os.path.join(
+ ninja.__file__,
+ os.pardir,
+ 'data',
+ 'bin',
+ 'ninja' + _exe))
+
+test.dir_fixture('ninja-fixture')
+
+test.file_fixture(
+ 'ninja_test_sconscripts/sconstruct_generate_and_build', 'SConstruct')
+
+# generate simple build
+test.run(stdout=None)
+test.must_contain_all_lines(test.stdout(), ['Generating: build.ninja'])
+test.must_contain_all(test.stdout(), 'Executing:')
+test.must_contain_all(test.stdout(), 'ninja%(_exe)s -f' % locals())
+test.run(program=test.workpath('foo' + _exe), stdout="foo.c")
+
+# Change the SConstruct
+test.file_fixture(
+ 'ninja_test_sconscripts/sconstruct_control_c_ninja', 'SConstruct')
+
+# run ninja independently
+program = test.workpath('run_ninja_env.bat') if IS_WINDOWS else ninja_bin
+test.run(program=program, stdout=None, stderr=None, status=1)
+test.must_contain_all(
+ test.stderr(), "ninja: error: rebuilding 'build.ninja': interrupted by user")
+
+test.must_exist(
+ 'build.ninja', "Rebuilding build.ninja and sending control-c to ninja doesn't preserve build.ninja")
+
+test.pass_test()
+
+# Local Variables:
+# tab-width:4
+# indent-tabs-mode:nil
+# End:
+# vim: set expandtab tabstop=4 shiftwidth=4:
diff --git a/test/ninja/ninja_test_sconscripts/sconstruct_control_c_ninja b/test/ninja/ninja_test_sconscripts/sconstruct_control_c_ninja
new file mode 100644
index 0000000..0124576
--- /dev/null
+++ b/test/ninja/ninja_test_sconscripts/sconstruct_control_c_ninja
@@ -0,0 +1,12 @@
+import os
+import signal
+
+SetOption('experimental','ninja')
+DefaultEnvironment(tools=[])
+
+env = Environment()
+env.Tool('ninja')
+env.Program(target='foo', source='foo.c')
+
+if ARGUMENTS.get('NINJA_DISABLE_AUTO_RUN', 0):
+ os.kill(os.getppid(),signal.SIGINT )