summaryrefslogtreecommitdiffstats
path: root/test/Parallel
diff options
context:
space:
mode:
authorSteven Knight <knight@baldmt.com>2007-12-13 04:25:43 (GMT)
committerSteven Knight <knight@baldmt.com>2007-12-13 04:25:43 (GMT)
commit8dfbc4aafc99cd41c9e89b245e0772c862e073a6 (patch)
tree86299c32c336859f1bf05c6e3800d8c54282ccd8 /test/Parallel
parent70591272485606edf2293e7d9fa33113ac9cb00c (diff)
downloadSCons-8dfbc4aafc99cd41c9e89b245e0772c862e073a6.zip
SCons-8dfbc4aafc99cd41c9e89b245e0772c862e073a6.tar.gz
SCons-8dfbc4aafc99cd41c9e89b245e0772c862e073a6.tar.bz2
Merged revisions 2454-2525 via svnmerge from
http://scons.tigris.org/svn/scons/branches/core ........ r2455 | stevenknight | 2007-09-20 01:27:23 -0500 (Thu, 20 Sep 2007) | 2 lines Use ${TARGET.base} to make sure $TARGET attributes stay fixed. ........ r2456 | stevenknight | 2007-09-25 11:52:30 -0500 (Tue, 25 Sep 2007) | 5 lines Issue 1734: Avoid having content signature calculation of Alias Nodes consume excessive amounts of memory by having an Alias' "contents" be a concatenation of the children's signatures, not the children's contents. (Ken Deeter) ........ r2457 | stevenknight | 2007-09-26 12:18:49 -0500 (Wed, 26 Sep 2007) | 2 lines Add an Options.UnknownOptions() method. ........ r2458 | stevenknight | 2007-09-26 16:26:05 -0500 (Wed, 26 Sep 2007) | 2 lines Add a compatibility fnmatch.filter() function. ........ r2459 | stevenknight | 2007-09-27 18:26:03 -0500 (Thu, 27 Sep 2007) | 3 lines Add a new Glob() function that matches in-memory Nodes as well as on-disk files (including matching repository and source directories). ........ r2460 | stevenknight | 2007-09-28 15:01:37 -0500 (Fri, 28 Sep 2007) | 5 lines Issue 1020: fix use of Clean() for files created by "side effect" in BuildDir() by removing the file by absolute path, not by what str() returns. (It will think that the file is a source file and return a path to the source directory.) ........ r2461 | stevenknight | 2007-09-29 05:39:09 -0500 (Sat, 29 Sep 2007) | 2 lines Update to TestCmd 0.28 modules. ........ r2462 | stevenknight | 2007-09-29 05:49:29 -0500 (Sat, 29 Sep 2007) | 3 lines The RPM packaging can no longer take a "target" argument and produces an appropriate error message. Update the test accordingly. ........ r2463 | pscholl | 2007-09-30 08:57:01 -0500 (Sun, 30 Sep 2007) | 3 lines fix documentation issues (issue 1736 on the bugtracker) ........ r2464 | pscholl | 2007-09-30 09:39:49 -0500 (Sun, 30 Sep 2007) | 3 lines fix target set up if multiple package builders are specified at once. ........ r2465 | stevenknight | 2007-10-01 13:00:44 -0500 (Mon, 01 Oct 2007) | 3 lines Update to TestCmd 0.29, with new methods for searching for a list of lines in output. ........ r2466 | stevenknight | 2007-10-01 13:58:41 -0500 (Mon, 01 Oct 2007) | 4 lines Issue 1737: Fix use of Configure() contexts with the -c (clean) and -h (help) options by supporting the ability to *configure* whether or no configure context tests are executed during those modes. ........ r2467 | stevenknight | 2007-10-01 16:58:21 -0500 (Mon, 01 Oct 2007) | 2 lines Update to TestCmd 0.30, with a new TestCmd.rmdir() method. ........ r2468 | stevenknight | 2007-10-01 17:05:44 -0500 (Mon, 01 Oct 2007) | 4 lines Issue 1586: Capture a test script for "ghost" entries in .sconsign files. Test cases by Morten Elo Peterson and Jason Orendorff, packaged by Gary Oberbrunner. ........ r2469 | stevenknight | 2007-10-04 11:21:12 -0500 (Thu, 04 Oct 2007) | 4 lines When cloning a construction environment, have the clone record the re-binding of the methods that were added to the original construction environment, so that further clones have their methods re-bound as well. ........ r2470 | stevenknight | 2007-10-05 13:02:34 -0500 (Fri, 05 Oct 2007) | 3 lines Refactor the Glob() code for efficiency and readability. (Greg Noel) Refactor Glob() unit tests for platform-independence. ........ r2471 | stevenknight | 2007-10-09 10:49:15 -0500 (Tue, 09 Oct 2007) | 2 lines Back out Glob() refactoring to avoid Repository breakage. ........ r2472 | stevenknight | 2007-10-09 12:16:33 -0500 (Tue, 09 Oct 2007) | 3 lines Fix ToolInitializer-related infinite recursion when the BUILDERS dict and the environment attributes can get out of sync. ........ r2473 | stevenknight | 2007-10-10 14:39:19 -0500 (Wed, 10 Oct 2007) | 4 lines Fix a race condition in the -j sub-test by using marker directories to make sure (?) that the two build scripts are actually executed in parallel (regardless of system load). ........ r2474 | stevenknight | 2007-10-11 12:32:07 -0500 (Thu, 11 Oct 2007) | 4 lines Re-fix globbing on case-insensitive systems like Windows. Slight efficiency improvements as well (avoiding unnecessary calls to fnmatch.filter()). ........ r2475 | stevenknight | 2007-10-11 15:04:42 -0500 (Thu, 11 Oct 2007) | 3 lines Refactor the Node lookup logic to fix handling Windows drive letters after an initial '#'. ........ r2476 | stevenknight | 2007-10-12 00:01:31 -0500 (Fri, 12 Oct 2007) | 2 lines Fix nested scope issues (for the benefit of older Python versions). ........ r2477 | stevenknight | 2007-10-12 11:36:21 -0500 (Fri, 12 Oct 2007) | 2 lines Issue 1743: Document '#' interpretation, with examples. ........ r2478 | stevenknight | 2007-10-12 12:17:50 -0500 (Fri, 12 Oct 2007) | 3 lines Fix the ability of our default ActionFactory function to handle Nodes as input. ........ r2479 | stevenknight | 2007-10-12 13:53:37 -0500 (Fri, 12 Oct 2007) | 4 lines Enhance Options() file execution to add the file's directory to sys.path (and remove it afterwards) and to add a __name__ variable that can be used for introspecting on the file's location. ........ r2480 | stevenknight | 2007-10-14 17:57:09 -0500 (Sun, 14 Oct 2007) | 4 lines Remove unnecessary os.path.normpath() calls when looking up directories or files by checking for whether we can just tack on a single entry name to the already-normalized lookup path of the directory Node. ........ r2481 | stevenknight | 2007-10-17 01:08:47 -0500 (Wed, 17 Oct 2007) | 2 lines Add a GetBuildFailures() function. ........ r2482 | stevenknight | 2007-10-17 09:56:18 -0500 (Wed, 17 Oct 2007) | 2 lines Fix the GetBuildFailures() example in the man page. ........ r2483 | stevenknight | 2007-10-17 10:54:21 -0500 (Wed, 17 Oct 2007) | 3 lines Use sys.exitfunc if there's no atexit module (Python 1.5.2). Sort the failure list for deterministic build output under system load. ........ r2484 | stevenknight | 2007-10-20 12:33:07 -0500 (Sat, 20 Oct 2007) | 2 lines Use more efficient Decider() defaults instead of {Target,Source}Signatures(). ........ r2485 | stevenknight | 2007-10-20 17:42:27 -0500 (Sat, 20 Oct 2007) | 2 lines Windows portability in GetBuildFailures() test scripts. ........ r2486 | stevenknight | 2007-10-20 20:46:26 -0500 (Sat, 20 Oct 2007) | 2 lines Windows portability: rename internal copy.py script, use a stub instead of tar. ........ r2487 | stevenknight | 2007-10-24 23:36:24 -0500 (Wed, 24 Oct 2007) | 4 lines Whenever a script configures SConsignFile(None), make sure it uses stub compiler and linker scripts, not the system ones, to avoid writing (or trying to write) .sconsign files in system directories. ........ r2488 | stevenknight | 2007-10-26 13:57:38 -0500 (Fri, 26 Oct 2007) | 2 lines Issue 1764: Fix test-script portability issues on Solaris. ........ r2489 | stevenknight | 2007-10-27 07:37:37 -0500 (Sat, 27 Oct 2007) | 3 lines Issue 1757: add a CheckTypeSize() call to Configure contexts (David Cournapeau). ........ r2490 | stevenknight | 2007-10-28 07:58:30 -0500 (Sun, 28 Oct 2007) | 2 lines Python 1.5.2 compatibility: no use of +=. ........ r2491 | stevenknight | 2007-10-29 12:13:35 -0500 (Mon, 29 Oct 2007) | 3 lines Issue 1758: Fix the SCons packaging build for use with shared-lib versions of Python and to avoid .egg-info naming issues. ........ r2492 | stevenknight | 2007-10-29 14:09:57 -0500 (Mon, 29 Oct 2007) | 2 lines Document the "expect" argument to CheckTypeSize(). (David Cournapeau) ........ r2493 | stevenknight | 2007-11-05 20:57:27 -0600 (Mon, 05 Nov 2007) | 2 lines Fix use of Glob() when a pattern is below an explicitly-named subdirectory. ........ r2495 | stevenknight | 2007-11-12 22:58:12 -0600 (Mon, 12 Nov 2007) | 5 lines Add a get_sources() access method to avoid an O(n^2) problem when adding sources to an Executor object. The old code weeded out duplicates whenever a new source was added; the new code only does that when the source is list going to be used. ........ r2496 | stevenknight | 2007-11-15 12:19:55 -0600 (Thu, 15 Nov 2007) | 4 lines Redefine the $WINDOWSPROGMANIFESTSUFFIX and $WINDOWSSHLIBMANIFESTSUFFIX variables so they pick up changes to the underlying $SHLIBSUFFIX and $PROGSUFFIX variables. ........ r2497 | stevenknight | 2007-11-18 17:11:52 -0600 (Sun, 18 Nov 2007) | 4 lines Support .status and .command attributes of BuildError exceptions. Change Action objects to return BuildError objects (not raise them) when an action fails. ........ r2498 | stevenknight | 2007-11-19 07:27:16 -0600 (Mon, 19 Nov 2007) | 3 lines When converting .sconsign paths to Nodes, use the more efficient _lookup_abs() method. ........ r2499 | stevenknight | 2007-11-25 00:18:20 -0600 (Sun, 25 Nov 2007) | 3 lines Move the reflection-checking is_under() logic from the .srcdir_list() method to the .srcdir_duplicate() method. ........ r2500 | stevenknight | 2007-11-25 00:31:33 -0600 (Sun, 25 Nov 2007) | 2 lines Have the .srcnode() method use the .srcdir_list() method. ........ r2501 | stevenknight | 2007-11-28 22:56:39 -0600 (Wed, 28 Nov 2007) | 3 lines Issue 1845: Have single-source Builders (like Object()) return NodeList objects even when called with multiple files. ........ r2502 | stevenknight | 2007-11-28 23:00:46 -0600 (Wed, 28 Nov 2007) | 2 lines Issue 1845: Document the NodeList behavior w.r.t Python's += operator. ........ r2503 | stevenknight | 2007-11-29 09:35:31 -0600 (Thu, 29 Nov 2007) | 3 lines Issue 1840: Fix a lot of typos in the man page and Users' Guide. (Malte Helmert) ........ r2504 | stevenknight | 2007-11-29 10:41:44 -0600 (Thu, 29 Nov 2007) | 3 lines Issue 1841: Fix --implicit-cache spurious rebuilds and inefficiency when using Builders that produce multiple targets. (Benoit Belley) ........ r2505 | stevenknight | 2007-11-30 17:36:03 -0600 (Fri, 30 Nov 2007) | 3 lines Unit test fix for Python 1.5.2, which can't .extend() lists with UserList objects. ........ r2506 | stevenknight | 2007-11-30 20:37:14 -0600 (Fri, 30 Nov 2007) | 2 lines Python 1.5.2 portability: use string.join(), not ' '.join(). ........ r2507 | stevenknight | 2007-11-30 21:42:19 -0600 (Fri, 30 Nov 2007) | 3 lines When searching directory lists like $CPPPATH, don't make Dir Nodes for directories that don't exist on disk. ........ r2508 | stevenknight | 2007-12-01 00:14:35 -0600 (Sat, 01 Dec 2007) | 2 lines Add a Requires() function for specifying order-only prerequisites. ........ r2509 | stevenknight | 2007-12-01 07:32:24 -0600 (Sat, 01 Dec 2007) | 3 lines Handle absolute paths without infinite recursion in the new code that searches for implicit dependencies without creating unnecessary Dir Nodes. ........ r2510 | stevenknight | 2007-12-03 15:11:56 -0600 (Mon, 03 Dec 2007) | 2 lines Restore the rel_path() method, for the benefit of SConscript files using it. ........ r2511 | stevenknight | 2007-12-04 00:34:02 -0600 (Tue, 04 Dec 2007) | 4 lines User's Guide updates for the Big Signature refactoring, capturing mention of things that still need documenting, and other changes from re-running the examples through the latest code. ........ r2512 | stevenknight | 2007-12-04 08:48:51 -0600 (Tue, 04 Dec 2007) | 3 lines Issue 1846: allow building only part of the dependency graph when BuildDir(duplicate=0) is used. (Benoit Belley) ........ r2513 | stevenknight | 2007-12-06 05:02:56 -0600 (Thu, 06 Dec 2007) | 3 lines Have the code that avoids creating unnecessary Dir Nodes when searching $*PATH variables handle absolute paths with Windows drive letters. ........ r2514 | stevenknight | 2007-12-08 07:44:15 -0600 (Sat, 08 Dec 2007) | 6 lines Issue 1852: Make the default behavior of {Source,Target}Signatures('timestamp') equivalent to 'timestamp-match', not 'timestamp-newer'. Fix use of CacheDir with Decider('timestamp-newer') by updating the modification time when copying files from the cache. ........ r2515 | stevenknight | 2007-12-08 08:23:02 -0600 (Sat, 08 Dec 2007) | 4 lines Update the mock compiler inin/sconsoutput to use $CPPPATH. Capture the ripple effect in the Troubleshooting appendix. Also add a -t option to the mock "touch" command. ........ r2516 | stevenknight | 2007-12-08 09:16:11 -0600 (Sat, 08 Dec 2007) | 3 lines Update the Dependencies chapter for use of the Decider() function, and to now discourage use of SourceSignatures() and TargetSignatures(). ........ r2517 | stevenknight | 2007-12-08 12:31:10 -0600 (Sat, 08 Dec 2007) | 4 lines Issue 1721: On Windows, wrap __builtin__.close() and __builtin__.file() to disable file handle inheritance on any files opened by SCons during the run. ........ r2518 | stevenknight | 2007-12-11 17:33:20 -0600 (Tue, 11 Dec 2007) | 4 lines Prevent the _get_str() method from causing underlying stat() values to be cached if we're not yet saving the string representations of FS.Base() Nodes. ........ r2519 | stevenknight | 2007-12-11 23:27:05 -0600 (Tue, 11 Dec 2007) | 4 lines Add a warning about the unreliability of -j if the pywin32 modules aren't available or are old and can't suppress file handle inheritance. Add a release note about the change to open() and file(). ........ r2520 | stevenknight | 2007-12-11 23:28:05 -0600 (Tue, 11 Dec 2007) | 2 lines Add an overlooked update, fix spelling. ........ r2521 | stevenknight | 2007-12-12 09:12:42 -0600 (Wed, 12 Dec 2007) | 3 lines Use &TargetSignatures; (replace missing ampersand) in the title of that section. Move the &Depends; section to before the &Ignore; section. ........ r2522 | stevenknight | 2007-12-12 09:20:46 -0600 (Wed, 12 Dec 2007) | 3 lines Final documentation update for checkpoint release: propagate .in changes to .xml files. ........ r2523 | stevenknight | 2007-12-12 09:29:11 -0600 (Wed, 12 Dec 2007) | 2 lines Update release lines for new checkpoint release. ........
Diffstat (limited to 'test/Parallel')
-rw-r--r--test/Parallel/duplicate-target.py48
-rw-r--r--test/Parallel/failed-build.py111
2 files changed, 147 insertions, 12 deletions
diff --git a/test/Parallel/duplicate-target.py b/test/Parallel/duplicate-target.py
index 5d4f5e1..43015fe 100644
--- a/test/Parallel/duplicate-target.py
+++ b/test/Parallel/duplicate-target.py
@@ -41,34 +41,58 @@ _python_ = TestSCons._python_
test = TestSCons.TestSCons()
-test.subdir('work')
+test.subdir('work', ['work', 'sub'])
tar_output = test.workpath('work.tar')
-test.write(['work', 'copy.py'], """\
+test.write(['work', 'mycopy.py'], """\
import sys
import time
time.sleep(int(sys.argv[1]))
open(sys.argv[2], 'wb').write(open(sys.argv[3], 'rb').read())
""")
+test.write(['work', 'mytar.py'], """\
+import sys
+import os.path
+
+def visit(arg, dirname, fnames):
+ fnames.sort()
+ for fn in fnames:
+ p = os.path.join(dirname, fn)
+ if os.path.isfile(p):
+ arg.write(open(p, 'rb').read())
+
+fp = open(sys.argv[1], 'wb')
+for s in sys.argv[2:]:
+ os.path.walk(s, visit, fp)
+""")
+
test.write(['work', 'SConstruct'], """\
env = Environment()
-out1 = File('f1.out')
-out2 = File('f2.out')
-env.Command([out1, out1], 'f1.in', r'%(_python_)s copy.py 3 $TARGET $SOURCE')
-env.Command([out2, out2], 'f2.in', r'%(_python_)s copy.py 3 $TARGET $SOURCE')
+out1 = File('sub/f1.out')
+out2 = File('sub/f2.out')
+env.Command([out1, out1], 'sub/f1.in',
+ r'%(_python_)s mycopy.py 3 $TARGET $SOURCE')
+env.Command([out2, out2], 'sub/f2.in',
+ r'%(_python_)s mycopy.py 3 $TARGET $SOURCE')
-env.Tar(r'%(tar_output)s', Dir('.'))
+env.Command(r'%(tar_output)s', Dir('sub'),
+ r'%(_python_)s mytar.py $TARGET $SOURCE')
""" % locals())
-test.write(['work', 'f1.in'], "work/f1.in\n")
-test.write(['work', 'f2.in'], "work/f2.in\n")
+test.write(['work', 'sub', 'f1.in'], "work/sub/f1.in\n")
+test.write(['work', 'sub', 'f2.in'], "work/sub/f2.in\n")
test.run(chdir = 'work', arguments = tar_output + ' -j2')
-test.must_match(['work', 'f1.out'], "work/f1.in\n")
-test.must_match(['work', 'f2.out'], "work/f2.in\n")
-test.must_exist(tar_output)
+test.must_match(['work', 'sub', 'f1.out'], "work/sub/f1.in\n")
+test.must_match(['work', 'sub', 'f2.out'], "work/sub/f2.in\n")
+test.must_match(tar_output, """\
+work/sub/f1.in
+work/sub/f1.in
+work/sub/f2.in
+work/sub/f2.in
+""")
test.pass_test()
diff --git a/test/Parallel/failed-build.py b/test/Parallel/failed-build.py
new file mode 100644
index 0000000..64e90c9
--- /dev/null
+++ b/test/Parallel/failed-build.py
@@ -0,0 +1,111 @@
+#!/usr/bin/env python
+#
+# __COPYRIGHT__
+#
+# 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.
+#
+
+"""
+Verify that a failed build action with -j works as expected.
+"""
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import TestSCons
+
+_python_ = TestSCons._python_
+
+try:
+ import threading
+except ImportError:
+ # if threads are not supported, then
+ # there is nothing to test
+ TestCmd.no_result()
+ sys.exit()
+
+
+test = TestSCons.TestSCons()
+
+# We want to verify that -j 2 starts precisely two jobs, the first of
+# which fails and the second of which succeeds, and then stops processing
+# due to the first build failure. To try to control the timing, the two
+# created build scripts use a pair of marker directories.
+#
+# The failure script waits until it sees the 'mycopy.started' directory
+# that indicates the successful script has, in fact, gotten started.
+# If we don't wait, then SCons could detect our script failure early
+# (typically if a high system load happens to delay SCons' ability to
+# start the next script) and then not start the successful script at all.
+#
+# The successful script waits until it sees the 'myfail.exiting' directory
+# that indicates the failure script has finished (with everything except
+# the final sys.exit(), that is). If we don't wait for that, then SCons
+# could detect our successful exit first (typically if a high system
+# load happens to delay the failure script) and start another job before
+# it sees the failure from the first script.
+
+test.write('myfail.py', r"""\
+import os.path
+import sys
+import time
+while not os.path.exists('mycopy.started'):
+ time.sleep(1)
+os.mkdir('myfail.exiting')
+sys.exit(1)
+""")
+
+test.write('mycopy.py', r"""\
+import os
+import sys
+import time
+os.mkdir('mycopy.started')
+open(sys.argv[1], 'wb').write(open(sys.argv[2], 'rb').read())
+while not os.path.exists('myfail.exiting'):
+ time.sleep(1)
+sys.exit(0)
+""")
+
+test.write('SConstruct', """
+MyCopy = Builder(action = r'%(_python_)s mycopy.py $TARGET $SOURCE')
+Fail = Builder(action = r'%(_python_)s myfail.py $TARGETS $SOURCE')
+env = Environment(BUILDERS = { 'MyCopy' : MyCopy, 'Fail' : Fail })
+env.Fail(target = 'f3', source = 'f3.in')
+env.MyCopy(target = 'f4', source = 'f4.in')
+env.MyCopy(target = 'f5', source = 'f5.in')
+env.MyCopy(target = 'f6', source = 'f6.in')
+""" % locals())
+
+test.write('f3.in', "f3.in\n")
+test.write('f4.in', "f4.in\n")
+test.write('f5.in', "f5.in\n")
+test.write('f6.in', "f6.in\n")
+
+test.run(arguments = '-j 2 .',
+ status = 2,
+ stderr = "scons: *** [f3] Error 1\n")
+
+test.must_not_exist(test.workpath('f3'))
+test.must_match(test.workpath('f4'), 'f4.in\n')
+test.must_not_exist(test.workpath('f5'))
+test.must_not_exist(test.workpath('f6'))
+
+
+
+test.pass_test()