summaryrefslogtreecommitdiffstats
path: root/test/option
diff options
context:
space:
mode:
authorLudwig Hähne <pankrat@tigris.org>2008-09-28 13:04:03 (GMT)
committerLudwig Hähne <pankrat@tigris.org>2008-09-28 13:04:03 (GMT)
commit6d6e305945b5eec98de19aa5d2c22102951bf6c0 (patch)
tree306318b9af6080b3362ed9dc4b07c0f65704214a /test/option
parent951c698a7252b2382f126cd2e9eb9c95195f6633 (diff)
downloadSCons-6d6e305945b5eec98de19aa5d2c22102951bf6c0.zip
SCons-6d6e305945b5eec98de19aa5d2c22102951bf6c0.tar.gz
SCons-6d6e305945b5eec98de19aa5d2c22102951bf6c0.tar.bz2
Issue 1646: Block-wise signature computation for large files
Diffstat (limited to 'test/option')
-rw-r--r--test/option/md5-chunksize.py121
1 files changed, 121 insertions, 0 deletions
diff --git a/test/option/md5-chunksize.py b/test/option/md5-chunksize.py
new file mode 100644
index 0000000..8c29480
--- /dev/null
+++ b/test/option/md5-chunksize.py
@@ -0,0 +1,121 @@
+#!/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__"
+
+import string
+import sys
+
+import TestSCons
+
+_python_ = TestSCons._python_
+
+test = TestSCons.TestSCons()
+
+test.write('build.py', r"""
+import sys
+contents = open(sys.argv[2], 'rb').read()
+file = open(sys.argv[1], 'wb')
+file.write(contents)
+file.close()
+""")
+
+test.write('SConstruct', """
+SetOption('md5_chunksize', 128)
+B = Builder(action = r'%(_python_)s build.py $TARGETS $SOURCES')
+env = Environment(BUILDERS = { 'B' : B })
+f1 = env.B(target = 'f1.out', source = 'f1.in')
+f2 = env.B(target = 'f2.out', source = 'f2.in')
+Requires(f2, f1)
+""" % locals())
+
+test.write('f1.in', str(range(10)))
+test.write('f2.in', str(range(100000)))
+
+expected_stdout = test.wrap_stdout("""\
+%(_python_)s build.py f1.out f1.in
+%(_python_)s build.py f2.out f2.in
+""" % locals())
+
+#
+# Test with SetOption('md5_chunksize')
+#
+test.run(arguments = '.',
+ stdout=expected_stdout,
+ stderr='')
+test.must_exist('f1.out')
+test.must_exist('f2.out')
+
+test.run(arguments = '-c .')
+test.must_not_exist('f1.out')
+test.must_not_exist('f2.out')
+
+#
+# Test with --md5-chunksize
+#
+test.run(arguments = '--md5-chunksize=128 .',
+ stdout=expected_stdout,
+ stderr='')
+test.must_exist('f1.out')
+test.must_exist('f2.out')
+
+test.run(arguments = '--md5-chunksize=128 -c .')
+test.must_not_exist('f1.out')
+test.must_not_exist('f2.out')
+
+test.pass_test()
+
+#
+# Big-file test
+#
+test2 = TestSCons.TestSCons()
+
+if string.find(sys.platform, 'linux') == -1:
+ test2.skip_test("skipping test on non-Linux platform '%s'\n" % sys.platform)
+
+dd = test2.where_is('dd')
+
+if not dd:
+ test2.skip_test('dd not found; skipping test\n')
+
+expected_stdout = test2.wrap_stdout("""\
+dd if=/dev/zero of=test.big seek=100 bs=1M count=0 2>/dev/null
+get_stat(["test.stat"], ["test.big"])
+""")
+
+test2.write('SConstruct', """
+import os
+def get_stat(target, source, env):
+ stat = os.stat(source[0].abspath)
+ dest = open(target[0].abspath,'w')
+ dest.write(str(stat))
+ dest.close()
+env = Environment()
+env.Command('test.big', 'SConstruct', 'dd if=/dev/zero of=test.big seek=100 bs=1M count=0 2>/dev/null')
+env.AlwaysBuild('test.big')
+env.Command('test.stat', 'test.big', Action(get_stat))
+""")
+
+test2.run(arguments='--md5-chunksize=128', stdout=expected_stdout, stderr='')
+test2.pass_test()