Mercurial > hg
annotate tests/test-pathencode.py @ 51711:832a1aeb576f
pytype: only try the hacky way of finding PYTHON if not provided
This allows us to work in more environments, like when using pyenv. This
syntax is compatible with all POSIX shells.
author | Raphaël Gomès <rgomes@octobus.net> |
---|---|
date | Tue, 23 Jul 2024 12:10:31 +0200 |
parents | 56f98406831b |
children |
rev | line source |
---|---|
17934
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
1 # This is a randomized test that generates different pathnames every |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
2 # time it is invoked, and tests the encoding of those pathnames. |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
3 # |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
4 # It uses a simple probabilistic model to generate valid pathnames |
26098 | 5 # that have proven likely to expose bugs and divergent behavior in |
17934
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
6 # different encoding implementations. |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
7 |
28918
72f683260f31
tests: make test-pathencode use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents:
26849
diff
changeset
|
8 |
28928
59481bfdb7f3
tests: make test-pathencode use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
28918
diff
changeset
|
9 import binascii |
17935
9c888b945b65
test-pathencode: make a 2.4-safe import of collections
Bryan O'Sullivan <bryano@fb.com>
parents:
17934
diff
changeset
|
10 import collections |
28928
59481bfdb7f3
tests: make test-pathencode use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
28918
diff
changeset
|
11 import itertools |
59481bfdb7f3
tests: make test-pathencode use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
28918
diff
changeset
|
12 import math |
59481bfdb7f3
tests: make test-pathencode use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
28918
diff
changeset
|
13 import os |
59481bfdb7f3
tests: make test-pathencode use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
28918
diff
changeset
|
14 import random |
59481bfdb7f3
tests: make test-pathencode use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
28918
diff
changeset
|
15 import sys |
59481bfdb7f3
tests: make test-pathencode use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
28918
diff
changeset
|
16 import time |
59481bfdb7f3
tests: make test-pathencode use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
28918
diff
changeset
|
17 from mercurial import ( |
37880
1b230e19d044
tests: port test-pathencode.py to Python 3
Augie Fackler <augie@google.com>
parents:
36327
diff
changeset
|
18 pycompat, |
28928
59481bfdb7f3
tests: make test-pathencode use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
28918
diff
changeset
|
19 store, |
59481bfdb7f3
tests: make test-pathencode use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
28918
diff
changeset
|
20 ) |
17934
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
21 |
37880
1b230e19d044
tests: port test-pathencode.py to Python 3
Augie Fackler <augie@google.com>
parents:
36327
diff
changeset
|
22 validchars = set(map(pycompat.bytechr, range(0, 256))) |
17934
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
23 alphanum = range(ord('A'), ord('Z')) |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
24 |
37880
1b230e19d044
tests: port test-pathencode.py to Python 3
Augie Fackler <augie@google.com>
parents:
36327
diff
changeset
|
25 for c in (b'\0', b'/'): |
17934
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
26 validchars.remove(c) |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
27 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
28 winreserved = ( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
29 b'aux con prn nul'.split() |
49285
56f98406831b
py3: remove xrange() compatibility code
Manuel Jacob <me@manueljacob.de>
parents:
48935
diff
changeset
|
30 + [b'com%d' % i for i in range(1, 10)] |
56f98406831b
py3: remove xrange() compatibility code
Manuel Jacob <me@manueljacob.de>
parents:
48935
diff
changeset
|
31 + [b'lpt%d' % i for i in range(1, 10)] |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
32 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
33 |
17934
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
34 |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
35 def casecombinations(names): |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
36 '''Build all case-diddled combinations of names.''' |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
37 |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
38 combos = set() |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
39 |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
40 for r in names: |
49285
56f98406831b
py3: remove xrange() compatibility code
Manuel Jacob <me@manueljacob.de>
parents:
48935
diff
changeset
|
41 for i in range(len(r) + 1): |
56f98406831b
py3: remove xrange() compatibility code
Manuel Jacob <me@manueljacob.de>
parents:
48935
diff
changeset
|
42 for c in itertools.combinations(range(len(r)), i): |
17934
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
43 d = r |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
44 for j in c: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
45 d = b''.join((d[:j], d[j : j + 1].upper(), d[j + 1 :])) |
17934
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
46 combos.add(d) |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
47 return sorted(combos) |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
48 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
49 |
17934
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
50 def buildprobtable(fp, cmd='hg manifest tip'): |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
43104
diff
changeset
|
51 """Construct and print a table of probabilities for path name |
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
43104
diff
changeset
|
52 components. The numbers are percentages.""" |
17934
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
53 |
17935
9c888b945b65
test-pathencode: make a 2.4-safe import of collections
Bryan O'Sullivan <bryano@fb.com>
parents:
17934
diff
changeset
|
54 counts = collections.defaultdict(lambda: 0) |
17934
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
55 for line in os.popen(cmd).read().splitlines(): |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
56 if line[-2:] in ('.i', '.d'): |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
57 line = line[:-2] |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
58 if line.startswith('data/'): |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
59 line = line[5:] |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
60 for c in line: |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
61 counts[c] += 1 |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
62 for c in '\r/\n': |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
63 counts.pop(c, None) |
48935
2cce2fa5bcf7
py3: replace pycompat.itervalues(x) with x.values()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48875
diff
changeset
|
64 t = sum(counts.values()) / 100.0 |
17934
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
65 fp.write('probtable = (') |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
66 for i, (k, v) in enumerate( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
67 sorted(counts.items(), key=lambda x: x[1], reverse=True) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
68 ): |
17934
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
69 if (i % 5) == 0: |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
70 fp.write('\n ') |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
71 vt = v / t |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
72 if vt < 0.0005: |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
73 break |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
74 fp.write('(%r, %.03f), ' % (k, vt)) |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
75 fp.write('\n )\n') |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
76 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
77 |
17934
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
78 # A table of character frequencies (as percentages), gleaned by |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
79 # looking at filelog names from a real-world, very large repo. |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
80 |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
81 probtable = ( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
82 (b't', 9.828), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
83 (b'e', 9.042), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
84 (b's', 8.011), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
85 (b'a', 6.801), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
86 (b'i', 6.618), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
87 (b'g', 5.053), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
88 (b'r', 5.030), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
89 (b'o', 4.887), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
90 (b'p', 4.363), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
91 (b'n', 4.258), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
92 (b'l', 3.830), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
93 (b'h', 3.693), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
94 (b'_', 3.659), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
95 (b'.', 3.377), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
96 (b'm', 3.194), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
97 (b'u', 2.364), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
98 (b'd', 2.296), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
99 (b'c', 2.163), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
100 (b'b', 1.739), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
101 (b'f', 1.625), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
102 (b'6', 0.666), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
103 (b'j', 0.610), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
104 (b'y', 0.554), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
105 (b'x', 0.487), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
106 (b'w', 0.477), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
107 (b'k', 0.476), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
108 (b'v', 0.473), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
109 (b'3', 0.336), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
110 (b'1', 0.335), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
111 (b'2', 0.326), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
112 (b'4', 0.310), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
113 (b'5', 0.305), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
114 (b'9', 0.302), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
115 (b'8', 0.300), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
116 (b'7', 0.299), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
117 (b'q', 0.298), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
118 (b'0', 0.250), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
119 (b'z', 0.223), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
120 (b'-', 0.118), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
121 (b'C', 0.095), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
122 (b'T', 0.087), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
123 (b'F', 0.085), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
124 (b'B', 0.077), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
125 (b'S', 0.076), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
126 (b'P', 0.076), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
127 (b'L', 0.059), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
128 (b'A', 0.058), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
129 (b'N', 0.051), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
130 (b'D', 0.049), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
131 (b'M', 0.046), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
132 (b'E', 0.039), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
133 (b'I', 0.035), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
134 (b'R', 0.035), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
135 (b'G', 0.028), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
136 (b'U', 0.026), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
137 (b'W', 0.025), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
138 (b'O', 0.017), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
139 (b'V', 0.015), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
140 (b'H', 0.013), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
141 (b'Q', 0.011), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
142 (b'J', 0.007), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
143 (b'K', 0.005), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
144 (b'+', 0.004), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
145 (b'X', 0.003), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
146 (b'Y', 0.001), |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
147 ) |
17934
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
148 |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
149 for c, _ in probtable: |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
150 validchars.remove(c) |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
151 validchars = list(validchars) |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
152 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
153 |
17934
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
154 def pickfrom(rng, table): |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
155 c = 0 |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
156 r = rng.random() * sum(i[1] for i in table) |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
157 for i, p in table: |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
158 c += p |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
159 if c >= r: |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
160 return i |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
161 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
162 |
17934
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
163 reservedcombos = casecombinations(winreserved) |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
164 |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
165 # The first component of a name following a slash. |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
166 |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
167 firsttable = ( |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
168 (lambda rng: pickfrom(rng, probtable), 90), |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
169 (lambda rng: rng.choice(validchars), 5), |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
170 (lambda rng: rng.choice(reservedcombos), 5), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
171 ) |
17934
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
172 |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
173 # Components of a name following the first. |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
174 |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
175 resttable = firsttable[:-1] |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
176 |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
177 # Special suffixes. |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
178 |
37880
1b230e19d044
tests: port test-pathencode.py to Python 3
Augie Fackler <augie@google.com>
parents:
36327
diff
changeset
|
179 internalsuffixcombos = casecombinations(b'.hg .i .d'.split()) |
17934
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
180 |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
181 # The last component of a path, before a slash or at the end of a name. |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
182 |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
183 lasttable = resttable + ( |
37880
1b230e19d044
tests: port test-pathencode.py to Python 3
Augie Fackler <augie@google.com>
parents:
36327
diff
changeset
|
184 (lambda rng: b'', 95), |
17934
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
185 (lambda rng: rng.choice(internalsuffixcombos), 5), |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
186 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
187 |
17934
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
188 |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
189 def makepart(rng, k): |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
190 '''Construct a part of a pathname, without slashes.''' |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
191 |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
192 p = pickfrom(rng, firsttable)(rng) |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
193 l = len(p) |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
194 ps = [p] |
19319
ec17ddecdf64
test-pathencode: randomize length of each path component
Siddharth Agarwal <sid0@fb.com>
parents:
19318
diff
changeset
|
195 maxl = rng.randint(1, k) |
ec17ddecdf64
test-pathencode: randomize length of each path component
Siddharth Agarwal <sid0@fb.com>
parents:
19318
diff
changeset
|
196 while l < maxl: |
17934
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
197 p = pickfrom(rng, resttable)(rng) |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
198 l += len(p) |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
199 ps.append(p) |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
200 ps.append(pickfrom(rng, lasttable)(rng)) |
37880
1b230e19d044
tests: port test-pathencode.py to Python 3
Augie Fackler <augie@google.com>
parents:
36327
diff
changeset
|
201 return b''.join(ps) |
17934
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
202 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
203 |
17934
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
204 def makepath(rng, j, k): |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
205 '''Construct a complete pathname.''' |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
206 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
207 return ( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
208 b'data/' |
49285
56f98406831b
py3: remove xrange() compatibility code
Manuel Jacob <me@manueljacob.de>
parents:
48935
diff
changeset
|
209 + b'/'.join(makepart(rng, k) for _ in range(j)) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
210 + rng.choice([b'.d', b'.i']) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
211 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
212 |
17934
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
213 |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
214 def genpath(rng, count): |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
215 '''Generate random pathnames with gradually increasing lengths.''' |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
216 |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
217 mink, maxk = 1, 4096 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
218 |
17934
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
219 def steps(): |
49285
56f98406831b
py3: remove xrange() compatibility code
Manuel Jacob <me@manueljacob.de>
parents:
48935
diff
changeset
|
220 for i in range(count): |
17934
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
221 yield mink + int(round(math.sqrt((maxk - mink) * float(i) / count))) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
222 |
17934
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
223 for k in steps(): |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
224 x = rng.randint(1, k) |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
225 y = rng.randint(1, k) |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
226 yield makepath(rng, x, y) |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
227 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
228 |
17934
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
229 def runtests(rng, seed, count): |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
230 nerrs = 0 |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
231 for p in genpath(rng, count): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
232 h = store._pathencode(p) # uses C implementation, if available |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
233 r = store._hybridencode(p, True) # reference implementation in Python |
18094
8ceabb34f1cb
test-pathencode: compare current pathencoding implementations
Adrian Buehlmann <adrian@cadifra.com>
parents:
17947
diff
changeset
|
234 if h != r: |
8ceabb34f1cb
test-pathencode: compare current pathencoding implementations
Adrian Buehlmann <adrian@cadifra.com>
parents:
17947
diff
changeset
|
235 if nerrs == 0: |
28918
72f683260f31
tests: make test-pathencode use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents:
26849
diff
changeset
|
236 print('seed:', hex(seed)[:-1], file=sys.stderr) |
72f683260f31
tests: make test-pathencode use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents:
26849
diff
changeset
|
237 print("\np: '%s'" % p.encode("string_escape"), file=sys.stderr) |
72f683260f31
tests: make test-pathencode use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents:
26849
diff
changeset
|
238 print("h: '%s'" % h.encode("string_escape"), file=sys.stderr) |
72f683260f31
tests: make test-pathencode use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents:
26849
diff
changeset
|
239 print("r: '%s'" % r.encode("string_escape"), file=sys.stderr) |
18094
8ceabb34f1cb
test-pathencode: compare current pathencoding implementations
Adrian Buehlmann <adrian@cadifra.com>
parents:
17947
diff
changeset
|
240 nerrs += 1 |
17934
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
241 return nerrs |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
242 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
243 |
17934
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
244 def main(): |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
245 import getopt |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
246 |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
247 # Empirically observed to take about a second to run |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
248 count = 100 |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
249 seed = None |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
250 opts, args = getopt.getopt( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
251 sys.argv[1:], 'c:s:', ['build', 'count=', 'seed='] |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
252 ) |
17934
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
253 for o, a in opts: |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
254 if o in ('-c', '--count'): |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
255 count = int(a) |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
256 elif o in ('-s', '--seed'): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
257 seed = int(a, base=0) # accepts base 10 or 16 strings |
17934
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
258 elif o == '--build': |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
259 buildprobtable( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
260 sys.stdout, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
261 'find .hg/store/data -type f && ' |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
262 'cat .hg/store/fncache 2>/dev/null', |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
263 ) |
17934
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
264 sys.exit(0) |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
265 |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
266 if seed is None: |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
267 try: |
34225
d43340bec0f5
tests: use int() instead of long() in test-pathencode.py
Augie Fackler <raf@durin42.com>
parents:
34224
diff
changeset
|
268 seed = int(binascii.hexlify(os.urandom(16)), 16) |
17934
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
269 except AttributeError: |
34225
d43340bec0f5
tests: use int() instead of long() in test-pathencode.py
Augie Fackler <raf@durin42.com>
parents:
34224
diff
changeset
|
270 seed = int(time.time() * 1000) |
17934
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
271 |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
272 rng = random.Random(seed) |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
273 if runtests(rng, seed, count): |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
274 sys.exit(1) |
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
275 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
37880
diff
changeset
|
276 |
17947
f945caa5e963
test-pathencode: more aggressively check for python < 2.6
Bryan O'Sullivan <bryano@fb.com>
parents:
17935
diff
changeset
|
277 if __name__ == '__main__': |
17934
736f1c09f321
tests: add a randomized test for pathencode
Bryan O'Sullivan <bryano@fb.com>
parents:
diff
changeset
|
278 main() |