summaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
authorSteven Knight <knight@baldmt.com>2005-06-10 11:59:43 (GMT)
committerSteven Knight <knight@baldmt.com>2005-06-10 11:59:43 (GMT)
commit46d8ad1b5d2848f4da3a7d83614a92fe81314338 (patch)
treecc587623d5579d9c08eddfeaa1edd9efd697ec3e /test
parent1b063dbb4859a3869d0e6637efc67086fc9497b2 (diff)
downloadSCons-46d8ad1b5d2848f4da3a7d83614a92fe81314338.zip
SCons-46d8ad1b5d2848f4da3a7d83614a92fe81314338.tar.gz
SCons-46d8ad1b5d2848f4da3a7d83614a92fe81314338.tar.bz2
Add a --diskcheck option to control looking on-disk for things.
Diffstat (limited to 'test')
-rw-r--r--test/RCS/diskcheck.py187
-rw-r--r--test/SCCS/diskcheck.py148
-rw-r--r--test/diskcheck.py81
3 files changed, 416 insertions, 0 deletions
diff --git a/test/RCS/diskcheck.py b/test/RCS/diskcheck.py
new file mode 100644
index 0000000..c1d5cca
--- /dev/null
+++ b/test/RCS/diskcheck.py
@@ -0,0 +1,187 @@
+#!/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.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+"""
+Test transparent RCS checkouts from an RCS subdirectory.
+"""
+
+import os.path
+
+import TestSCons
+
+test = TestSCons.TestSCons()
+
+rcs = test.where_is('rcs')
+if not rcs:
+ print "Could not find RCS, skipping test(s)."
+ test.pass_test(1)
+
+ci = test.where_is('ci')
+if not ci:
+ print "Could not find `ci' command, skipping test(s)."
+ test.pass_test(1)
+
+
+
+sub_RCS = os.path.join('sub', 'RCS')
+sub_SConscript = os.path.join('sub', 'SConscript')
+sub_all = os.path.join('sub', 'all')
+sub_ddd_in = os.path.join('sub', 'ddd.in')
+sub_ddd_out = os.path.join('sub', 'ddd.out')
+sub_eee_in = os.path.join('sub', 'eee.in')
+sub_eee_out = os.path.join('sub', 'eee.out')
+sub_fff_in = os.path.join('sub', 'fff.in')
+sub_fff_out = os.path.join('sub', 'fff.out')
+
+test.subdir('RCS', 'sub', ['sub', 'RCS'])
+
+for f in ['aaa.in', 'bbb.in', 'ccc.in']:
+ test.write(f, "%s\n" % f)
+ args = "-f -t%s %s" % (f, f)
+ test.run(program = ci, arguments = args, stderr = None)
+
+for f in ['ddd.in', 'eee.in', 'fff.in']:
+ test.write(['sub', f], "sub/%s\n" % f)
+ args = "-f -tsub/%s sub/%s" % (f, f)
+ test.run(program = ci, arguments = args, stderr = None)
+
+test.write(['sub', 'SConscript'], """\
+Import("env")
+env.Cat('ddd.out', 'ddd.in')
+env.Cat('eee.out', 'eee.in')
+env.Cat('fff.out', 'fff.in')
+env.Cat('all', ['ddd.out', 'eee.out', 'fff.out'])
+""")
+args = "-f -tsub/SConscript sub/SConscript"
+test.run(program = ci, arguments = args, stderr = None)
+
+test.no_result(os.path.exists(test.workpath('aaa.in')))
+test.no_result(os.path.exists(test.workpath('bbb.in')))
+test.no_result(os.path.exists(test.workpath('ccc.in')))
+
+test.no_result(os.path.exists(test.workpath('sub', 'SConscript')))
+
+test.no_result(os.path.exists(test.workpath('sub', 'aaa.in')))
+test.no_result(os.path.exists(test.workpath('sub', 'bbb.in')))
+test.no_result(os.path.exists(test.workpath('sub', 'ccc.in')))
+
+test.write('SConstruct', """
+import os
+for key in ['LOGNAME', 'USERNAME', 'USER']:
+ logname = os.environ.get(key)
+ if logname: break
+ENV = {'PATH' : os.environ['PATH'],
+ 'LOGNAME' : logname}
+def cat(env, source, target):
+ target = str(target[0])
+ source = map(str, source)
+ f = open(target, "wb")
+ for src in source:
+ f.write(open(src, "rb").read())
+ f.close()
+SetOption('diskcheck', None)
+DefaultEnvironment()['ENV'] = ENV
+DefaultEnvironment()['RCS_COFLAGS'] = '-l'
+env = Environment(ENV=ENV, BUILDERS={'Cat':Builder(action=cat)})
+env.Cat('aaa.out', 'aaa.in')
+env.Cat('bbb.out', 'bbb.in')
+env.Cat('ccc.out', 'ccc.in')
+env.Cat('all', ['aaa.out', 'bbb.out', 'ccc.out'])
+SConscript('sub/SConscript', "env")
+""")
+
+test.write('bbb.in', "checked-out bbb.in\n")
+
+test.write(['sub', 'eee.in'], "checked-out sub/eee.in\n")
+
+expect = """\
+
+scons: warning: Ignoring missing SConscript 'sub/SConscript'
+File "SConstruct", line 23, in ?
+scons: *** Source `aaa.in' not found, needed by target `aaa.out'. Stop.
+"""
+
+test.run(status=2, stderr=expect)
+
+test.run(arguments = '--diskcheck=match,sccs', status=2, stderr=expect)
+
+test.run(arguments = '--diskcheck=rcs',
+ stdout = test.wrap_stdout(read_str = """\
+co -l %(sub_SConscript)s
+""" % locals(),
+ build_str = """\
+co -l aaa.in
+cat(["aaa.out"], ["aaa.in"])
+cat(["bbb.out"], ["bbb.in"])
+co -l ccc.in
+cat(["ccc.out"], ["ccc.in"])
+cat(["all"], ["aaa.out", "bbb.out", "ccc.out"])
+co -l %(sub_ddd_in)s
+cat(["%(sub_ddd_out)s"], ["%(sub_ddd_in)s"])
+cat(["%(sub_eee_out)s"], ["%(sub_eee_in)s"])
+co -l %(sub_fff_in)s
+cat(["%(sub_fff_out)s"], ["%(sub_fff_in)s"])
+cat(["%(sub_all)s"], ["%(sub_ddd_out)s", "%(sub_eee_out)s", "%(sub_fff_out)s"])
+""" % locals()),
+ stderr = """\
+%(sub_RCS)s/SConscript,v --> %(sub_SConscript)s
+revision 1.1 (locked)
+done
+RCS/aaa.in,v --> aaa.in
+revision 1.1 (locked)
+done
+RCS/ccc.in,v --> ccc.in
+revision 1.1 (locked)
+done
+%(sub_RCS)s/ddd.in,v --> %(sub_ddd_in)s
+revision 1.1 (locked)
+done
+%(sub_RCS)s/fff.in,v --> %(sub_fff_in)s
+revision 1.1 (locked)
+done
+""" % locals())
+
+# Checking things back out of RCS apparently messes with the line
+# endings, so read the result files in non-binary mode.
+
+test.must_match('all',
+ "aaa.in\nchecked-out bbb.in\nccc.in\n",
+ mode='r')
+
+test.must_match(['sub', 'all'],
+ "sub/ddd.in\nchecked-out sub/eee.in\nsub/fff.in\n",
+ mode='r')
+
+test.must_be_writable(test.workpath('sub', 'SConscript'))
+test.must_be_writable(test.workpath('aaa.in'))
+test.must_be_writable(test.workpath('ccc.in'))
+test.must_be_writable(test.workpath('sub', 'ddd.in'))
+test.must_be_writable(test.workpath('sub', 'fff.in'))
+
+
+
+#
+test.pass_test()
diff --git a/test/SCCS/diskcheck.py b/test/SCCS/diskcheck.py
new file mode 100644
index 0000000..691f09c
--- /dev/null
+++ b/test/SCCS/diskcheck.py
@@ -0,0 +1,148 @@
+#!/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.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+"""
+Test transparent checkouts from SCCS files in an SCCS subdirectory.
+"""
+
+import string
+
+import TestSCons
+
+test = TestSCons.TestSCons()
+
+sccs = test.where_is('sccs')
+if not sccs:
+ print "Could not find SCCS, skipping test(s)."
+ test.pass_test(1)
+
+
+
+test.subdir('SCCS', 'sub', ['sub', 'SCCS'])
+
+for f in ['aaa.in', 'bbb.in', 'ccc.in']:
+ test.write(f, "%%F%% %s\n" % f)
+ args = "create %s" % f
+ test.run(program = sccs, arguments = args, stderr = None)
+ test.unlink(f)
+ test.unlink(','+f)
+
+test.write(['sub', 'SConscript'], """\
+# %%F%%
+Import("env")
+env.Cat('ddd.out', 'ddd.in')
+env.Cat('eee.out', 'eee.in')
+env.Cat('fff.out', 'fff.in')
+env.Cat('all', ['ddd.out', 'eee.out', 'fff.out'])
+""")
+args = "create SConscript"
+test.run(chdir = 'sub', program = sccs, arguments = args, stderr = None)
+test.unlink(['sub', 'SConscript'])
+test.unlink(['sub', ',SConscript'])
+
+for f in ['ddd.in', 'eee.in', 'fff.in']:
+ test.write(['sub', f], "%%F%% sub/%s\n" % f)
+ args = "create %s" % f
+ test.run(chdir = 'sub', program = sccs, arguments = args, stderr = None)
+ test.unlink(['sub', f])
+ test.unlink(['sub', ','+f])
+
+test.write(['SConstruct'], """
+DefaultEnvironment()['SCCSCOM'] = 'cd ${TARGET.dir} && $SCCS get ${TARGET.file}'
+def cat(env, source, target):
+ target = str(target[0])
+ source = map(str, source)
+ f = open(target, "wb")
+ for src in source:
+ f.write(open(src, "rb").read())
+ f.close()
+SetOption('diskcheck', ['match', 'rcs'])
+env = Environment(BUILDERS={'Cat':Builder(action=cat)},
+ SCCSFLAGS='-k')
+env.Cat('aaa.out', 'aaa.in')
+env.Cat('bbb.out', 'bbb.in')
+env.Cat('ccc.out', 'ccc.in')
+env.Cat('all', ['aaa.out', 'bbb.out', 'ccc.out'])
+SConscript('sub/SConscript', "env")
+""")
+
+test.write(['bbb.in'], "checked-out bbb.in\n")
+
+test.write(['sub', 'eee.in'], "checked-out sub/eee.in\n")
+
+expect = """\
+
+scons: warning: Ignoring missing SConscript 'sub/SConscript'
+File "SConstruct", line 17, in ?
+scons: *** Source `aaa.in' not found, needed by target `aaa.out'. Stop.
+"""
+
+test.run(status=2, stderr=expect)
+
+test.run(arguments = '--diskcheck=none', status=2, stderr=expect)
+
+test.run(arguments = '--diskcheck=sccs', stderr = None)
+
+lines = string.split("""
+sccs get SConscript
+sccs get aaa.in
+cat(["aaa.out"], ["aaa.in"])
+cat(["bbb.out"], ["bbb.in"])
+sccs get ccc.in
+cat(["ccc.out"], ["ccc.in"])
+cat(["all"], ["aaa.out", "bbb.out", "ccc.out"])
+sccs get ddd.in
+cat(["sub/ddd.out"], ["sub/ddd.in"])
+cat(["sub/eee.out"], ["sub/eee.in"])
+sccs get fff.in
+cat(["sub/fff.out"], ["sub/fff.in"])
+cat(["sub/all"], ["sub/ddd.out", "sub/eee.out", "sub/fff.out"])
+""", '\n')
+
+stdout = test.stdout()
+missing = filter(lambda l, s=stdout: string.find(s, l) == -1, lines)
+if missing:
+ print "Missing the following output lines:"
+ print string.join(missing, '\n')
+ print "Actual STDOUT =========="
+ print stdout
+ test.fail_test(1)
+
+test.must_match('all', """\
+s.aaa.in aaa.in
+checked-out bbb.in
+s.ccc.in ccc.in
+""")
+
+test.must_not_be_writable(test.workpath('sub', 'SConscript'))
+test.must_not_be_writable(test.workpath('aaa.in'))
+test.must_not_be_writable(test.workpath('ccc.in'))
+test.must_not_be_writable(test.workpath('sub', 'ddd.in'))
+test.must_not_be_writable(test.workpath('sub', 'fff.in'))
+
+
+
+test.pass_test()
diff --git a/test/diskcheck.py b/test/diskcheck.py
new file mode 100644
index 0000000..b8ef2fe
--- /dev/null
+++ b/test/diskcheck.py
@@ -0,0 +1,81 @@
+#!/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.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+"""
+Test that the --diskcheck option and SetOption('diskcheck') correctly
+control where or not we look for on-disk matches files and directories
+that we look up.
+"""
+
+import string
+
+import TestSCons
+
+test = TestSCons.TestSCons()
+
+test.subdir('subdir')
+
+test.write('file', "file\n")
+
+
+
+test.write('SConstruct', """
+SetOption('diskcheck', 'none')
+File('subdir')
+""")
+
+test.run()
+
+test.run(arguments='--diskcheck=match', status=2, stderr=None)
+test.fail_test(string.find(test.stderr(), "found where file expected") == -1)
+
+
+
+test.write('SConstruct', """
+SetOption('diskcheck', ['rcs', 'sccs'])
+Dir('file')
+""")
+
+test.run()
+
+test.run(arguments='--diskcheck=match', status=2, stderr=None)
+test.fail_test(string.find(test.stderr(), "found where directory expected") == -1)
+
+
+
+test.write('SConstruct', """
+SetOption('diskcheck', 'rcs,sccs')
+Dir('file/subdir')
+""")
+
+test.run()
+
+test.run(arguments='--diskcheck=match', status=2, stderr=None)
+test.fail_test(string.find(test.stderr(), "found where directory expected") == -1)
+
+
+
+test.pass_test()