summaryrefslogtreecommitdiff
path: root/test/nonexistent.py
diff options
context:
space:
mode:
authorSteven Knight <knight@baldmt.com>2002-11-27 02:02:36 +0000
committerSteven Knight <knight@baldmt.com>2002-11-27 02:02:36 +0000
commit814029abd36603a70bc402826c79a5fdefe3c2a1 (patch)
tree4edf62d6b0b5114ef5baf54a802a7f1c648172e0 /test/nonexistent.py
parentdd30a312b7c59abd25d41c3d332df57801abf66b (diff)
downloadscons-814029abd36603a70bc402826c79a5fdefe3c2a1.tar.gz
Provide graceful failures when a source file doesn't exist and can't be build, and when a nonexistent drive letter is used on Win32.
Diffstat (limited to 'test/nonexistent.py')
-rw-r--r--test/nonexistent.py75
1 files changed, 74 insertions, 1 deletions
diff --git a/test/nonexistent.py b/test/nonexistent.py
index 8f2c63eb..3604a295 100644
--- a/test/nonexistent.py
+++ b/test/nonexistent.py
@@ -22,14 +22,29 @@
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
+"""
+This test verifies that we fail gracefully and provide informative
+messages if someone tries to build a target that hasn't been defined
+or uses a nonexistent source file. On Windows systems, it checks
+to make sure that this applies to invalid drive letters as well.
+"""
+
__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+import os
+import os.path
+import string
import sys
+
import TestSCons
test = TestSCons.TestSCons()
-test.write('SConstruct', "")
+test.write('SConstruct', """
+env = Environment()
+env.Command("aaa.out", "aaa.in", "should never get executed")
+env.Command("bbb.out", "bbb.in", "should never get executed")
+""")
test.run(arguments = 'foo',
stderr = "scons: *** Do not know how to make target `foo'. Stop.\n",
@@ -41,4 +56,62 @@ scons: *** Do not know how to make target `foo'.
""",
status = 2)
+test.run(arguments = "aaa.out",
+ stderr = "scons: *** No Builder for target `aaa.in', needed by `aaa.out'. Stop.\n",
+ status = 2)
+
+test.run(arguments = "-k bbb.out aaa.out",
+ stderr = """scons: *** No Builder for target `bbb.in', needed by `bbb.out'.
+scons: *** No Builder for target `aaa.in', needed by `aaa.out'.
+""",
+ status = 2)
+
+if sys.platform == 'win32':
+ bad_drive = None
+ for i in range(len(string.uppercase)-1, -1, -1):
+ d = string.uppercase[i]
+ if not os.path.isdir(d + ':' + os.sep):
+ bad_drive = d + ':' + '\\' + os.sep
+ break
+
+ if bad_drive is None:
+ print "All drive letters appear to be in use."
+ print "Cannot test SCons handling of invalid Win32 drive letters."
+ test.no_result(1);
+
+ test.write('SConstruct', """
+def cat(env, source, target):
+ target = str(target[0])
+ source = map(str, source)
+ print 'cat(%%s) > %%s' %% (source, target)
+ f = open(target, "wb")
+ for src in source:
+ f.write(open(src, "rb").read())
+ f.close()
+
+bad_drive = '%s'
+env = Environment(BUILDERS={'Build':Builder(action=cat)})
+env.Build('aaa.out', 'aaa.in')
+env.Build(bad_drive + 'no_target', 'bbb.in')
+env.Build('ccc.out', bad_drive + 'no_source')
+""" % bad_drive)
+
+ test.write("aaa.in", "aaa.in\n")
+
+ test.write("no_target", "no_target\n")
+
+ test.write("no_source", "no_source\n")
+
+ test.run(arguments = 'aaa.out')
+
+ test.fail_test(test.read('aaa.out') != "aaa.in\n")
+
+ test.run(arguments = bad_drive + 'no_target',
+ stderr = "scons: *** Do not know how to make target `%sno_target'. Stop.\n" % bad_drive,
+ status = 2)
+
+ test.run(arguments = 'ccc.out',
+ stderr = "scons: *** No Builder for target `%sno_source', needed by `ccc.out'. Stop.\n" % bad_drive,
+ status = 2)
+
test.pass_test()