summaryrefslogtreecommitdiff
path: root/tools/build/v2/test/file_name_handling.py
diff options
context:
space:
mode:
Diffstat (limited to 'tools/build/v2/test/file_name_handling.py')
-rwxr-xr-xtools/build/v2/test/file_name_handling.py255
1 files changed, 255 insertions, 0 deletions
diff --git a/tools/build/v2/test/file_name_handling.py b/tools/build/v2/test/file_name_handling.py
new file mode 100755
index 0000000000..8e59e6821a
--- /dev/null
+++ b/tools/build/v2/test/file_name_handling.py
@@ -0,0 +1,255 @@
+#!/usr/bin/python
+
+# Copyright 2008 Jurko Gospodnetic
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
+
+# Tests Boost Jam & Boost Build's source & target file name handling. Originally
+# added as a regression test for a bug causing versions included in the Boost
+# library 1.35 release (and earlier) not handling Windows short file names
+# correctly. Also tests handling target file names containing spaces.
+
+# Implementation notes:
+#
+# We expect Boost Jam to automatically update the 'all' target when no target
+# has been explicitly specified on the command line.
+#
+# Windows short & long file names can not be matched until the file in
+# question actually exists so we need to create the file before running Boost
+# Jam.
+#
+# Currently Windows short file names are hardcoded but in case this proves
+# insufficient we should use the GetShortPathName() Windows API to get the
+# correct short file for a given long file name.
+# (30.04.2008.) (Jurko)
+
+import BoostBuild
+import os
+import time
+
+
+################################################################################
+#
+# prepare_file()
+# --------------
+#
+################################################################################
+
+def prepare_file(tester, target_name, age_in_seconds=0):
+ """Prepares a new file with the given name, optionally setting its last
+ access and modification timestamps to the given number of seconds in the
+ history.
+ """
+ tester.write( target_name, "Original file content." )
+ if ( ( not age_in_seconds is None ) and ( age_in_seconds != 0 ) ):
+ t = time.time() - age_in_seconds
+ os.utime( tester.native_file_name( target_name ), ( t, t ) )
+
+
+################################################################################
+#
+# test_simple_file_names()
+# ------------------------
+#
+################################################################################
+
+def test_simple_file_names():
+ """Runs simple file name handling that is not expected to fail anywhere. Not
+ really needed for regular testing but the test is really fast and its
+ content may be used for comparing to other more complex test functions in
+ this module which test the same system but with some potentially more
+ problematic file names.
+ """
+ t = BoostBuild.Tester(pass_toolset=0)
+
+ prepare_file(t, "source.txt" )
+ prepare_file(t, "target.txt" , 120)
+ prepare_file(t, "target_noupdate.txt", 240)
+
+ t.write("testScript.jam", """
+actions create-file
+{
+ echo "Modified file content ($(1:E=""))."> "$(1:E="")"
+}
+
+DEPENDS all : standaloneTarget.txt ;
+create-file standaloneTarget.txt : all ;
+
+DEPENDS all : target.txt ;
+DEPENDS target.txt : source.txt ;
+create-file target.txt ;
+
+NOUPDATE target_noupdate.txt ;
+DEPENDS all : target_noupdate.txt ;
+DEPENDS target_noupdate.txt : source.txt ;
+create-file target_noupdate.txt ;
+
+create-file shouldNotBeCreated1 ;
+create-file shouldNotBeCreated2 ;
+create-file shouldNotBeCreated3 ;
+""")
+
+ t.run_build_system("-ftestScript.jam")
+ t.expect_addition("standaloneTarget.txt")
+ t.expect_modification("target.txt")
+ t.expect_nothing_more()
+
+ t.cleanup()
+
+
+################################################################################
+#
+# test_short_file_name_with_action()
+# ----------------------------------
+#
+################################################################################
+
+def test_short_file_name_with_action():
+ """Tests how Boost Jam handles the case when a Windows short file name is
+ passed to a Boost Jam action.
+ """
+ if ( not BoostBuild.windows ):
+ return
+
+ t = BoostBuild.Tester(pass_toolset=0)
+
+ long_file_name1 = "1__target that should be rebuilt.txt"
+ long_file_name2 = "2__target that should be rebuilt.txt"
+ short_file_name2 = "2__tar~1.txt"
+
+ prepare_file(t, long_file_name1)
+ prepare_file(t, long_file_name2)
+
+ t.write("testScript.jam", """
+actions create-file
+{
+ echo Modified file content ($(1:E="")).> "$(1:E="")"
+}
+
+ALWAYS "%(long_file_name1)s" ;
+DEPENDS all : "%(long_file_name1)s" ;
+create-file "%(long_file_name1)s" ;
+
+ALWAYS "%(long_file_name2)s" ;
+DEPENDS all : "%(long_file_name2)s" ;
+create-file "%(short_file_name2)s" ;
+""" % {'long_file_name1': long_file_name1,
+ 'long_file_name2' : long_file_name2,
+ 'short_file_name2' : short_file_name2})
+
+ t.run_build_system("-ftestScript.jam")
+ t.expect_modification(long_file_name1)
+ t.expect_modification(long_file_name2)
+ t.expect_nothing_more()
+
+ t.cleanup()
+
+
+################################################################################
+#
+# test_short_file_name_with_ALWAYS()
+# ----------------------------------
+#
+################################################################################
+
+def test_short_file_name_with_ALWAYS():
+ """Tests how Boost Jam handles the case when a Windows short file name is
+ passed to the builtin ALWAYS rule.
+ """
+ if ( not BoostBuild.windows ):
+ return
+
+ t = BoostBuild.Tester(pass_toolset=0)
+
+ long_file_name1 = "1__target that should be rebuilt.txt"
+ long_file_name2 = "2__target that should be rebuilt.txt"
+ short_file_name2 = "2__tar~1.txt"
+
+ prepare_file(t, long_file_name1)
+ prepare_file(t, long_file_name2)
+
+ t.write("testScript.jam", """
+actions create-file
+{
+ echo Modified file content ($(1:E="")).> "$(1:E="")"
+}
+
+ALWAYS "%(long_file_name1)s" ;
+DEPENDS all : "%(long_file_name1)s" ;
+create-file "%(long_file_name1)s" ;
+
+ALWAYS "%(short_file_name2)s" ;
+DEPENDS all : "%(long_file_name2)s" ;
+create-file "%(long_file_name2)s" ;
+""" % {'long_file_name1': long_file_name1,
+ 'long_file_name2' : long_file_name2,
+ 'short_file_name2' : short_file_name2})
+
+ t.run_build_system("-ftestScript.jam")
+ t.expect_modification(long_file_name1)
+ t.expect_modification(long_file_name2)
+ t.expect_nothing_more()
+
+ t.cleanup()
+
+
+################################################################################
+#
+# test_short_file_name_with_NOUPDATE()
+# ------------------------------------
+#
+################################################################################
+
+def test_short_file_name_with_NOUPDATE():
+ """Tests how Boost Jam handles the case when a Windows short file name is
+ passed to the builtin NOUPDATE rule.
+ """
+ if ( not BoostBuild.windows ):
+ return
+
+ t = BoostBuild.Tester(pass_toolset=0)
+
+ long_file_name1 = "1__target that should be rebuilt.txt"
+ long_file_name2 = "2__target that should not be rebuilt.txt"
+ short_file_name2 = "2__tar~1.txt"
+
+ prepare_file(t, "source.txt" )
+ prepare_file(t, long_file_name1, 120)
+ prepare_file(t, long_file_name2, 120)
+
+ t.write("testScript.jam", """
+actions create-file
+{
+ echo Modified file content ($(1:E="")).> "$(1:E="")"
+}
+
+DEPENDS all : "%(long_file_name1)s" ;
+DEPENDS "%(long_file_name1)s" : source.txt ;
+create-file "%(long_file_name1)s" ;
+
+NOUPDATE "%(short_file_name2)s" ;
+DEPENDS all : "%(long_file_name2)s" ;
+DEPENDS "%(long_file_name2)s" : source.txt ;
+create-file "%(long_file_name2)s" ;
+""" % {'long_file_name1': long_file_name1,
+ 'long_file_name2' : long_file_name2,
+ 'short_file_name2' : short_file_name2})
+
+ t.run_build_system("-ftestScript.jam")
+ t.expect_modification(long_file_name1)
+ t.expect_nothing_more()
+
+ t.cleanup()
+
+
+################################################################################
+#
+# main()
+# ------
+#
+################################################################################
+
+test_simple_file_names()
+test_short_file_name_with_action()
+test_short_file_name_with_ALWAYS()
+test_short_file_name_with_NOUPDATE()