annotate tests/lib-stat.py @ 407:1b4056ee7b48

Unittests for importing timestamps. Check to handle erroneous input lines also. A real-world example used for testing.
author Franz Glasner <fzglas.hg@dom66.de>
date Sun, 26 Jan 2020 14:38:30 +0100
parents 7ec353866f70
children 379050873141
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
278
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
1 """Cross-platform file modification check.
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
2
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
3 This is because the stat(1) utility has incompatible cross-platform usage.
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
4
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
5 Usage: lib-stat.py [ OPTIONS ] FILE ...
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
6
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
7 Options:
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
8
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
9 -c TS, --check=TS Assert that the given timestamp TS matches the given
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
10 FILE's modtime
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
11 -d TS, --differs=TS Assert that the given timestamp TS differs from the
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
12 given FILE's modtime
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
13
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
14 If no option is given print the modification time for each FILE to stdout.
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
15
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
16 """
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
17
273
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
18 from __future__ import absolute_import, print_function
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
19
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
20
278
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
21 import datetime
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
22 import getopt
273
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
23 import os
278
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
24 import sys
273
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
25
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
26
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
27 class FloatTimesInStat(object):
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
28 """Context manager to ensure that stat returns float values.
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
29
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
30 For 3.7 <= Mercurial < 4.6: Mercurial calls :func:`os.stat_float_times`
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
31 for `stat` and friends to return :class:`int` values.
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
32
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
33 Temporarily fix this.
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
34
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
35 """
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
36
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
37 __slots__ = ("_do_reset",)
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
38
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
39 def __init__(self):
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
40 self._do_reset = False
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
41
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
42 def __enter__(self):
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
43 if not os.stat_float_times():
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
44 os.stat_float_times(True)
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
45 self._do_reset = True
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
46 return self
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
47
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
48 def __exit__(self, *args):
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
49 if self._do_reset:
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
50 os.stat_float_times(False)
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
51
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
52
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
53 def to_isoformat(t):
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
54 """Return the POSIX timestamp `t` formatted in full ISO format.
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
55
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
56 `t` is expected to be in the UTC timezone.
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
57
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
58 """
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
59 dt = datetime.datetime.utcfromtimestamp(t)
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
60 if dt.utcoffset() is None:
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
61 return dt.isoformat() + "Z"
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
62 else:
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
63 return dt.isoformat()
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
64
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
65
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
66 def main():
278
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
67 opt_check = None
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
68 opt_differs = None
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
69
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
70 opts, args = getopt.getopt(sys.argv[1:],
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
71 "c:d:",
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
72 ["check=",
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
73 "differs="])
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
74 for opt, val in opts:
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
75 if opt in ("-c", "--check"):
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
76 opt_check = val
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
77 elif opt in ("-d", "--differs"):
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
78 opt_differs = val
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
79 else:
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
80 assert False
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
81
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
82 if opt_check:
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
83 with FloatTimesInStat():
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
84 for f in args:
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
85 st = os.lstat(f)
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
86 tss = to_isoformat(st.st_mtime)
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
87 if tss != opt_check:
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
88 print(
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
89 "mtime does not match for file `{filename}': expected {expected}, current: {current}".format(
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
90 filename=f,
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
91 expected=opt_check,
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
92 current=tss),
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
93 file=sys.stderr)
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
94 return 1
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
95 elif opt_differs:
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
96 with FloatTimesInStat():
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
97 for f in args:
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
98 st = os.lstat(f)
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
99 tss = to_isoformat(st.st_mtime)
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
100 if tss == opt_differs:
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
101 print(
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
102 "mtime does not differ for file `{filename}': {timestamp}".format(
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
103 filename=f,
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
104 timestamp=tss),
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
105 file=sys.stderr)
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
106 return 1
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
107 else:
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
108 with FloatTimesInStat():
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
109 for f in args:
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
110 st = os.lstat(f)
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
111 print(to_isoformat(st.st_mtime))
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
112 return 0
273
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
113
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
114
6abd41f7d879 Unit-tests for almost all currently implemented features of the timestamps extension.
Franz Glasner <hg@dom66.de>
parents:
diff changeset
115 if __name__ == "__main__":
278
7ec353866f70 Extend the lib-stat.py script to be able to assert timestamp differences.
Franz Glasner <hg@dom66.de>
parents: 273
diff changeset
116 sys.exit(main())