Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/usr.bin/make/unit-tests make(1): add more tests for the vari...



details:   https://anonhg.NetBSD.org/src/rev/ce2d2c93e34c
branches:  trunk
changeset: 956510:ce2d2c93e34c
user:      rillig <rillig%NetBSD.org@localhost>
date:      Sat Oct 31 20:30:06 2020 +0000

description:
make(1): add more tests for the variable modifier :localtime

diffstat:

 usr.bin/make/unit-tests/Makefile             |   3 +-
 usr.bin/make/unit-tests/varmod-gmtime.exp    |   2 +-
 usr.bin/make/unit-tests/varmod-gmtime.mk     |  24 ++++--
 usr.bin/make/unit-tests/varmod-localtime.exp |  15 ++++
 usr.bin/make/unit-tests/varmod-localtime.mk  |  89 +++++++++++++++++++++++++--
 5 files changed, 115 insertions(+), 18 deletions(-)

diffs (197 lines):

diff -r 0bfa87e9f986 -r ce2d2c93e34c usr.bin/make/unit-tests/Makefile
--- a/usr.bin/make/unit-tests/Makefile  Sat Oct 31 19:55:26 2020 +0000
+++ b/usr.bin/make/unit-tests/Makefile  Sat Oct 31 20:30:06 2020 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.179 2020/10/31 11:30:57 rillig Exp $
+# $NetBSD: Makefile,v 1.180 2020/10/31 20:30:06 rillig Exp $
 #
 # Unit tests for make(1)
 #
@@ -378,6 +378,7 @@
 ENV.varmisc=           FROM_ENV=env
 ENV.varmisc+=          FROM_ENV_BEFORE=env
 ENV.varmisc+=          FROM_ENV_AFTER=env
+ENV.varmod-localtime+= TZ=Europe/Berlin
 
 # Override make flags for some of the tests; default is -k.
 # If possible, write ".MAKEFLAGS: -dv" in the test .mk file instead of
diff -r 0bfa87e9f986 -r ce2d2c93e34c usr.bin/make/unit-tests/varmod-gmtime.exp
--- a/usr.bin/make/unit-tests/varmod-gmtime.exp Sat Oct 31 19:55:26 2020 +0000
+++ b/usr.bin/make/unit-tests/varmod-gmtime.exp Sat Oct 31 20:30:06 2020 +0000
@@ -2,7 +2,7 @@
 %Y
 2020
 %Y
-%Y
+localtime == localtime
 mod-gmtime-indirect:
 make: Unknown modifier '1'
 
diff -r 0bfa87e9f986 -r ce2d2c93e34c usr.bin/make/unit-tests/varmod-gmtime.mk
--- a/usr.bin/make/unit-tests/varmod-gmtime.mk  Sat Oct 31 19:55:26 2020 +0000
+++ b/usr.bin/make/unit-tests/varmod-gmtime.mk  Sat Oct 31 20:30:06 2020 +0000
@@ -1,7 +1,7 @@
-# $NetBSD: varmod-gmtime.mk,v 1.5 2020/10/31 19:55:26 rillig Exp $
+# $NetBSD: varmod-gmtime.mk,v 1.6 2020/10/31 20:30:06 rillig Exp $
 #
 # Tests for the :gmtime variable modifier, which formats a timestamp
-# using strftime(3).
+# using strftime(3) in UTC.
 
 all:   mod-gmtime
 all:   mod-gmtime-indirect
@@ -17,10 +17,19 @@
 
 mod-gmtime:
        @echo $@:
-       @echo ${%Y:L:gmtim=1593536400}          # modifier name too short
-       @echo ${%Y:L:gmtime=1593536400}         # 2020-07-01T00:00:00Z
-       @echo ${%Y:L:gmtimer=1593536400}        # modifier name too long
-       @echo ${%Y:L:gm=gm:M*}
+
+       # modifier name too short
+       @echo ${%Y:L:gmtim=1593536400}
+
+       # 2020-07-01T00:00:00Z
+       @echo ${%Y:L:gmtime=1593536400}
+
+       # modifier name too long
+       @echo ${%Y:L:gmtimer=1593536400}
+
+       # If the modifier name is not matched exactly, fall back to the
+       # :from=to modifier.
+       @echo ${gmtime:L:gm%=local%} == localtime
 
 mod-gmtime-indirect:
        @echo $@:
@@ -76,6 +85,3 @@
        # more variable modifiers.  Because of the unknown modifier 'e',
        # the whole variable value is discarded and thus not printed.
        : letter becomes ${:L:gmtime=error}.
-
-all:
-       @:;
diff -r 0bfa87e9f986 -r ce2d2c93e34c usr.bin/make/unit-tests/varmod-localtime.exp
--- a/usr.bin/make/unit-tests/varmod-localtime.exp      Sat Oct 31 19:55:26 2020 +0000
+++ b/usr.bin/make/unit-tests/varmod-localtime.exp      Sat Oct 31 20:30:06 2020 +0000
@@ -1,4 +1,19 @@
+mod-localtime
 %Y
 2020
 %Y
+gmtime == gmtime
+mod-localtime-indirect:
+make: Unknown modifier '1'
+
+parse-errors:
+: -1 becomes Thu Jan  1 00:59:59 1970.
+: space 1 becomes Thu Jan  1 01:00:01 1970.
+: 0 becomes ok.
+: 1 becomes Thu Jan  1 01:00:01 1970.
+: INT32_MAX becomes Tue Jan 19 04:14:07 2038.
+: INT32_MAX + 1 becomes Tue Jan 19 04:14:08 2038.
+: overflow becomes Thu Jan  1 00:59:59 1970.
+make: Unknown modifier 'e'
+: letter becomes .
 exit status 0
diff -r 0bfa87e9f986 -r ce2d2c93e34c usr.bin/make/unit-tests/varmod-localtime.mk
--- a/usr.bin/make/unit-tests/varmod-localtime.mk       Sat Oct 31 19:55:26 2020 +0000
+++ b/usr.bin/make/unit-tests/varmod-localtime.mk       Sat Oct 31 20:30:06 2020 +0000
@@ -1,7 +1,15 @@
-# $NetBSD: varmod-localtime.mk,v 1.4 2020/10/29 19:01:10 rillig Exp $
+# $NetBSD: varmod-localtime.mk,v 1.5 2020/10/31 20:30:06 rillig Exp $
 #
-# Tests for the :localtime variable modifier, which returns the given time,
-# formatted as a local timestamp.
+# Tests for the :localtime variable modifier, which formats a timestamp
+# using strftime(3) in local time.
+
+.if ${TZ} != "Europe/Berlin"   # see unit-tests/Makefile
+.  error
+.endif
+
+all:   mod-localtime
+all:   mod-localtime-indirect
+all:   parse-errors
 
 # Test for the default time format, %c.  Since the time always varies, it's
 # only possible to check for the general format here.  The names of the
@@ -11,7 +19,74 @@
 .  error
 .endif
 
-all:
-       @echo ${%Y:L:localtim=1593536400}       # modifier name too short
-       @echo ${%Y:L:localtime=1593536400}      # 2020-07-01T00:00:00Z
-       @echo ${%Y:L:localtimer=1593536400}     # modifier name too long
+mod-localtime:
+       @echo $@
+
+       # modifier name too short
+       @echo ${%Y:L:localtim=1593536400}
+
+       # 2020-07-01T00:00:00Z
+       @echo ${%Y:L:localtime=1593536400}
+
+       # modifier name too long
+       @echo ${%Y:L:localtimer=1593536400}
+
+       # If the modifier name is not matched exactly, fall back to the
+       # :from=to modifier.
+       @echo ${localtime:L:local%=gm%} == gmtime
+
+mod-localtime-indirect:
+       @echo $@:
+
+       # As of 2020-08-16, it is not possible to pass the seconds via a
+       # variable expression.  This is because parsing of the :localtime
+       # modifier stops at the '$' and returns to ApplyModifiers.
+       #
+       # There, a colon would be skipped but not a dollar.
+       # Parsing therefore continues at the '$' of the ${:U159...}, looking
+       # for an ordinary variable modifier.
+       #
+       # At this point, the ${:U} is expanded and interpreted as a variable
+       # modifier, which results in the error message "Unknown modifier '1'".
+       #
+       # If ApplyModifier_Localtime were to pass its argument through
+       # ParseModifierPart, this would work.
+       @echo ${%Y:L:localtime=${:U1593536400}}
+
+parse-errors:
+       @echo $@:
+
+       # As of 2020-10-31, it is possible to pass negative time stamps
+       # to the :localtime modifier, resulting in dates before 1970.
+       # Going back 50 years in the past is not a practical use case for
+       # make.
+       : -1 becomes ${:L:localtime=-1}.
+
+       # Spaces are allowed, not because it would make sense but just as
+       # a side-effect from using strtoul.
+       : space 1 becomes ${:L:localtime= 1}.
+
+       # 0 means now; to get consistent test results, the actual value has
+       # to be normalized.
+       : 0 becomes ${:L:localtime=0:C,^... ... .. ..:..:.. 20..$,ok,W}.
+
+       : 1 becomes ${:L:localtime=1}.
+
+       : INT32_MAX becomes ${:L:localtime=2147483647}.
+
+       # This may be different if time_t is still a 32-bit signed integer.
+       : INT32_MAX + 1 becomes ${:L:localtime=2147483648}.
+
+       # Integer overflow.
+       # Because this modifier is implemented using strtoul, the parsed
+       # time is ULONG_MAX, which gets converted to -1.  This results
+       # in a time stamp of the second before 1970 (in UTC) or 3599 seconds
+       # after New Year's Day in Europe/Berlin.
+       : overflow becomes ${:L:localtime=10000000000000000000000000000000}.
+
+       # As of 2020-10-31, there is no error handling while parsing the
+       # :localtime modifier, thus no error message is printed.  Parsing
+       # stops after the '=', and the remaining string is parsed for
+       # more variable modifiers.  Because of the unknown modifier 'e',
+       # the whole variable value is discarded and thus not printed.
+       : letter becomes ${:L:localtime=error}.



Home | Main Index | Thread Index | Old Index