##// END OF EJS Templates
tests: port test-hybridencode.py to unittest...
Augie Fackler -
r37888:6574c81b default
parent child Browse files
Show More
@@ -182,6 +182,7 b' test-http-branchmap.t'
182 182 test-http-bundle1.t
183 183 test-http-clone-r.t
184 184 test-http.t
185 test-hybridencode.py
185 186 test-identify.t
186 187 test-import-unknown.t
187 188 test-import.t
This diff has been collapsed as it changes many lines, (1256 lines changed) Show them Hide them
@@ -1,471 +1,877 b''
1 1 from __future__ import absolute_import, print_function
2
3 import unittest
4
2 5 from mercurial import (
3 6 store,
4 7 )
5 8
6 def show(s):
7 # show test input
8 print("A = '%s'" % s.encode("string_escape"))
9
10 # show the result of the C implementation, if available
11 h = store._pathencode(s)
12 print("B = '%s'" % h.encode("string_escape"))
9 class hybridencodetests(unittest.TestCase):
10 def hybridencode(self, input, want):
13 11
14 # compare it with reference implementation in Python
15 r = store._hybridencode(s, True)
16 if h != r:
17 print("R = '%s'" % r.encode("string_escape"))
18 print()
19
20 show("data/abcdefghijklmnopqrstuvwxyz0123456789 !#%&'()+,-.;=[]^`{}")
12 # Check the C implementation if it's in use
13 got = store._pathencode(input)
14 self.assertEqual(want, got)
15 # Check the reference implementation in Python
16 refgot = store._hybridencode(input, True)
17 self.assertEqual(want, refgot)
21 18
22 print("uppercase char X is encoded as _x")
23 show("data/ABCDEFGHIJKLMNOPQRSTUVWXYZ")
24
25 print("underbar is doubled")
26 show("data/_")
27
28 print("tilde is character-encoded")
29 show("data/~")
19 def testnoencodingrequired(self):
20 self.hybridencode(
21 b'data/abcdefghijklmnopqrstuvwxyz0123456789 !#%&\'()+,-.;=[]^`{}',
22 b'data/abcdefghijklmnopqrstuvwxyz0123456789 !#%&\'()+,-.;=[]^`{}')
30 23
31 print("characters in ASCII code range 1..31")
32 show('data/\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f'
33 '\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f')
24 def testuppercasechars(self): # uppercase char X is encoded as _x
25 self.hybridencode(
26 b'data/ABCDEFGHIJKLMNOPQRSTUVWXYZ',
27 b'data/_a_b_c_d_e_f_g_h_i_j_k_l_m_n_o_p_q_r_s_t_u_v_w_x_y_z')
28
29 def testunderbar(self): # underbar is doubled
30 self.hybridencode(b'data/_', b'data/__')
34 31
35 print("characters in ASCII code range 126..255")
36 show('data/\x7e\x7f'
37 '\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f'
38 '\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f')
39 show('data/\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf'
40 '\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf')
41 show('data/\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf'
42 '\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf')
43 show('data/\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef'
44 '\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff')
32 def testtilde(self): # tilde is character-encoded
33 self.hybridencode(b'data/~', b'data/~7e')
45 34
46 print("Windows reserved characters")
47 show('data/less <, greater >, colon :, double-quote ", backslash \\'
48 ', pipe |, question-mark ?, asterisk *')
49
50 print("encoding directories ending in .hg, .i or .d with '.hg' suffix")
51 show('data/x.h.i/x.hg/x.i/x.d/foo')
52 show('data/a.hg/a.i/a.d/foo')
53 show('data/au.hg/au.i/au.d/foo')
54 show('data/aux.hg/aux.i/aux.d/foo')
55 show('data/auxy.hg/auxy.i/auxy.d/foo')
35 def testcontrolchars(self): # characters in ASCII code range 1..31
36 self.hybridencode(
37 (b'data/\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f'
38 b'\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e'
39 b'\x1f'),
40 (b'data/~01~02~03~04~05~06~07~08~09~0a~0b~0c~0d~0e~0f~10~11~12~13'
41 b'~14~15~16~17~18~19~1a~1b~1c~1d~1e~1f'))
56 42
57 print("but these are not encoded on *filenames*")
58 show('data/foo/x.hg')
59 show('data/foo/x.i')
60 show('data/foo/x.d')
61 show('data/foo/a.hg')
62 show('data/foo/a.i')
63 show('data/foo/a.d')
64 show('data/foo/au.hg')
65 show('data/foo/au.i')
66 show('data/foo/au.d')
67 show('data/foo/aux.hg')
68 show('data/foo/aux.i')
69 show('data/foo/aux.d')
70 show('data/foo/auxy.hg')
71 show('data/foo/auxy.i')
72 show('data/foo/auxy.d')
43 def testhighascii(self):# characters in ASCII code range 126..255
44 self.hybridencode(
45 (b'data/~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c'
46 b'\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b'
47 b'\x9c\x9d\x9e\x9f'),
48 (b'data/~7e~7f~80~81~82~83~84~85~86~87~88~89~8a~8b~8c~8d~8e~8f~90'
49 b'~91~92~93~94~95~96~97~98~99~9a~9b~9c~9d~9e~9f'))
50 self.hybridencode(
51 (b'data/\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad'
52 b'\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc'
53 b'\xbd\xbe\xbf'),
54 (b'data/~a0~a1~a2~a3~a4~a5~a6~a7~a8~a9~aa~ab~ac~ad~ae~af~b0~b1~b2'
55 b'~b3~b4~b5~b6~b7~b8~b9~ba~bb~bc~bd~be~bf'))
56 self.hybridencode(
57 (b'data/\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca'
58 b'\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6'
59 b'\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf'),
60 (b'data/~c0~c1~c2~c3~c4~c5~c6~c7~c8~c9~ca~cb~cc~cd~ce~cf~d0~d1~d2'
61 b'~d3~d4~d5~d6~d7~d8~d9~da~db~dc~dd~de~df'))
62 self.hybridencode(
63 (b'data/\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed'
64 b'\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd'
65 b'\xfe\xff'),
66 (b'data/~e0~e1~e2~e3~e4~e5~e6~e7~e8~e9~ea~eb~ec~ed~ee~ef~f0~f1~f2'
67 b'~f3~f4~f5~f6~f7~f8~f9~fa~fb~fc~fd~fe~ff'))
73 68
74 print("plain .hg, .i and .d directories have the leading dot encoded")
75 show('data/.hg/.i/.d/foo')
76
77 show('data/aux.bla/bla.aux/prn/PRN/lpt/com3/nul/coma/foo.NUL/normal.c.i')
69 def testwinreserved(self): # Windows reserved characters
70 self.hybridencode(
71 (b'data/less <, greater >, colon :, double-quote ", backslash \\, '
72 b'pipe |, question-mark ?, asterisk *'),
73 (b'data/less ~3c, greater ~3e, colon ~3a, double-quote ~22, '
74 b'backslash ~5c, pipe ~7c, question-mark ~3f, asterisk ~2a'))
78 75
79 show('data/AUX/SECOND/X.PRN/FOURTH/FI:FTH/SIXTH/SEVENTH/EIGHTH/NINETH/'
80 'TENTH/ELEVENTH/LOREMIPSUM.TXT.i')
81 show('data/enterprise/openesbaddons/contrib-imola/corba-bc/netbeansplugin/'
82 'wsdlExtension/src/main/java/META-INF/services/org.netbeans.modules'
83 '.xml.wsdl.bindingsupport.spi.ExtensibilityElementTemplateProvider.i')
84 show('data/AUX.THE-QUICK-BROWN-FOX-JU:MPS-OVER-THE-LAZY-DOG-THE-QUICK-'
85 'BROWN-FOX-JUMPS-OVER-THE-LAZY-DOG.TXT.i')
86 show('data/Project Planning/Resources/AnotherLongDirectoryName/'
87 'Followedbyanother/AndAnother/AndThenAnExtremelyLongFileName.txt')
88 show('data/Project.Planning/Resources/AnotherLongDirectoryName/'
89 'Followedbyanother/AndAnother/AndThenAnExtremelyLongFileName.txt')
90 show('data/foo.../foo / /a./_. /__/.x../ bla/.FOO/something.i')
76 def testhgreserved(self):
77 # encoding directories ending in .hg, .i or .d with '.hg' suffix
78 self.hybridencode(b'data/x.h.i/x.hg/x.i/x.d/foo',
79 b'data/x.h.i.hg/x.hg.hg/x.i.hg/x.d.hg/foo')
80 self.hybridencode(b'data/a.hg/a.i/a.d/foo',
81 b'data/a.hg.hg/a.i.hg/a.d.hg/foo')
82 self.hybridencode(b'data/au.hg/au.i/au.d/foo',
83 b'data/au.hg.hg/au.i.hg/au.d.hg/foo')
84 self.hybridencode(b'data/aux.hg/aux.i/aux.d/foo',
85 b'data/au~78.hg.hg/au~78.i.hg/au~78.d.hg/foo')
86 self.hybridencode(b'data/auxy.hg/auxy.i/auxy.d/foo',
87 b'data/auxy.hg.hg/auxy.i.hg/auxy.d.hg/foo')
88 # but these are not encoded on *filenames*
89 self.hybridencode(b'data/foo/x.hg', b'data/foo/x.hg')
90 self.hybridencode(b'data/foo/x.i', b'data/foo/x.i')
91 self.hybridencode(b'data/foo/x.d', b'data/foo/x.d')
92 self.hybridencode(b'data/foo/a.hg', b'data/foo/a.hg')
93 self.hybridencode(b'data/foo/a.i', b'data/foo/a.i')
94 self.hybridencode(b'data/foo/a.d', b'data/foo/a.d')
95 self.hybridencode(b'data/foo/au.hg', b'data/foo/au.hg')
96 self.hybridencode(b'data/foo/au.i', b'data/foo/au.i')
97 self.hybridencode(b'data/foo/au.d', b'data/foo/au.d')
98 self.hybridencode(b'data/foo/aux.hg', b'data/foo/au~78.hg')
99 self.hybridencode(b'data/foo/aux.i', b'data/foo/au~78.i')
100 self.hybridencode(b'data/foo/aux.d', b'data/foo/au~78.d')
101 self.hybridencode(b'data/foo/auxy.hg', b'data/foo/auxy.hg')
102 self.hybridencode(b'data/foo/auxy.i', b'data/foo/auxy.i')
103 self.hybridencode(b'data/foo/auxy.d', b'data/foo/auxy.d')
91 104
92 show('data/c/co/com/com0/com1/com2/com3/com4/com5/com6/com7/com8/com9')
93 show('data/C/CO/COM/COM0/COM1/COM2/COM3/COM4/COM5/COM6/COM7/COM8/COM9')
94 show('data/c.x/co.x/com.x/com0.x/com1.x/com2.x/com3.x/com4.x/com5.x'
95 '/com6.x/com7.x/com8.x/com9.x')
96 show('data/x.c/x.co/x.com0/x.com1/x.com2/x.com3/x.com4/x.com5'
97 '/x.com6/x.com7/x.com8/x.com9')
98 show('data/cx/cox/comx/com0x/com1x/com2x/com3x/com4x/com5x'
99 '/com6x/com7x/com8x/com9x')
100 show('data/xc/xco/xcom0/xcom1/xcom2/xcom3/xcom4/xcom5'
101 '/xcom6/xcom7/xcom8/xcom9')
102
103 show('data/l/lp/lpt/lpt0/lpt1/lpt2/lpt3/lpt4/lpt5/lpt6/lpt7/lpt8/lpt9')
104 show('data/L/LP/LPT/LPT0/LPT1/LPT2/LPT3/LPT4/LPT5/LPT6/LPT7/LPT8/LPT9')
105 show('data/l.x/lp.x/lpt.x/lpt0.x/lpt1.x/lpt2.x/lpt3.x/lpt4.x/lpt5.x'
106 '/lpt6.x/lpt7.x/lpt8.x/lpt9.x')
107 show('data/x.l/x.lp/x.lpt/x.lpt0/x.lpt1/x.lpt2/x.lpt3/x.lpt4/x.lpt5'
108 '/x.lpt6/x.lpt7/x.lpt8/x.lpt9')
109 show('data/lx/lpx/lptx/lpt0x/lpt1x/lpt2x/lpt3x/lpt4x/lpt5x'
110 '/lpt6x/lpt7x/lpt8x/lpt9x')
111 show('data/xl/xlp/xlpt/xlpt0/xlpt1/xlpt2/xlpt3/xlpt4/xlpt5'
112 '/xlpt6/xlpt7/xlpt8/xlpt9')
113
114 show('data/con/p/pr/prn/a/au/aux/n/nu/nul')
115 show('data/CON/P/PR/PRN/A/AU/AUX/N/NU/NUL')
116 show('data/con.x/p.x/pr.x/prn.x/a.x/au.x/aux.x/n.x/nu.x/nul.x')
117 show('data/x.con/x.p/x.pr/x.prn/x.a/x.au/x.aux/x.n/x.nu/x.nul')
118 show('data/conx/px/prx/prnx/ax/aux/auxx/nx/nux/nulx')
119 show('data/xcon/xp/xpr/xprn/xa/xau/xaux/xn/xnu/xnul')
105 # plain .hg, .i and .d directories have the leading dot encoded
106 self.hybridencode(b'data/.hg/.i/.d/foo',
107 b'data/~2ehg.hg/~2ei.hg/~2ed.hg/foo')
120 108
121 show('data/a./au./aux./auxy./aux.')
122 show('data/c./co./con./cony./con.')
123 show('data/p./pr./prn./prny./prn.')
124 show('data/n./nu./nul./nuly./nul.')
125 show('data/l./lp./lpt./lpt1./lpt1y./lpt1.')
126 show('data/lpt9./lpt9y./lpt9.')
127 show('data/com./com1./com1y./com1.')
128 show('data/com9./com9y./com9.')
129
130 show('data/a /au /aux /auxy /aux ')
131
132 print("largest unhashed path")
133 show('data/123456789-123456789-123456789-123456789-123456789-'
134 'unhashed--xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
135 '123456789-12345')
136
137 print("shortest hashed path")
138 show('data/123456789-123456789-123456789-123456789-123456789-'
139 'hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
140 '123456789-123456')
141
142 print("changing one char in part that's hashed away produces a different hash")
143 show('data/123456789-123456789-123456789-123456789-123456789-'
144 'hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxy-'
145 '123456789-123456')
109 def testmisclongcases(self):
110 self.hybridencode(
111 (b'data/aux.bla/bla.aux/prn/PRN/lpt/com3/nul/'
112 b'coma/foo.NUL/normal.c.i'),
113 (b'data/au~78.bla/bla.aux/pr~6e/_p_r_n/lpt/co~6d3'
114 b'/nu~6c/coma/foo._n_u_l/normal.c.i'))
115 self.hybridencode(
116 (b'data/AUX/SECOND/X.PRN/FOURTH/FI:FTH/SIXTH/SEVENTH/EIGHTH/NINETH'
117 b'/TENTH/ELEVENTH/LOREMIPSUM.TXT.i'),
118 (b'dh/au~78/second/x.prn/fourth/fi~3afth/sixth/seventh/eighth/'
119 b'nineth/tenth/loremia20419e358ddff1bf8751e38288aff1d7c32ec05.i'))
120 self.hybridencode(
121 (b'data/enterprise/openesbaddons/contrib-imola/corba-bc/'
122 b'netbeansplugin/wsdlExtension/src/main/java/META-INF/services'
123 b'/org.netbeans.modules.xml.wsdl.bindingsupport.spi.'
124 b'ExtensibilityElementTemplateProvider.i'),
125 (b'dh/enterpri/openesba/contrib-/corba-bc/netbeans/wsdlexte/src/'
126 b'main/java/org.net7018f27961fdf338a598a40c4683429e7ffb9743.i'))
127 self.hybridencode(
128 (b'data/AUX.THE-QUICK-BROWN-FOX-JU:MPS-OVER-THE-LAZY-DOG-THE-'
129 b'QUICK-BROWN-FOX-JUMPS-OVER-THE-LAZY-DOG.TXT.i'),
130 (b'dh/au~78.the-quick-brown-fox-ju~3amps-over-the-lazy-dog-the-'
131 b'quick-brown-fox-jud4dcadd033000ab2b26eb66bae1906bcb15d4a70.i'))
132 self.hybridencode(
133 (b'data/Project Planning/Resources/AnotherLongDirectoryName/Follow'
134 b'edbyanother/AndAnother/AndThenAnExtremelyLongFileName.txt'),
135 (b'dh/project_/resource/anotherl/followed/andanoth/andthenanextrem'
136 b'elylongfilenaf93030515d9849cfdca52937c2204d19f83913e5.txt'))
137 self.hybridencode(
138 (b'data/Project.Planning/Resources/AnotherLongDirectoryName/Follo'
139 b'wedbyanother/AndAnother/AndThenAnExtremelyLongFileName.txt'),
140 (b'dh/project_/resource/anotherl/followed/andanoth/andthenanextre'
141 b'melylongfilena0fd7c506f5c9d58204444fc67e9499006bd2d445.txt'))
142 self.hybridencode(
143 b'data/foo.../foo / /a./_. /__/.x../ bla/.FOO/something.i',
144 (b'data/foo..~2e/foo ~20/~20/a~2e/__.~20/____/~2ex.~2e/~20 bla/'
145 b'~2e_f_o_o/something.i'))
146 self.hybridencode(
147 b'data/c/co/com/com0/com1/com2/com3/com4/com5/com6/com7/com8/com9',
148 (b'data/c/co/com/com0/co~6d1/co~6d2/co~6d3/co~6d4/co~6d5/co~6d6/'
149 b'co~6d7/co~6d8/co~6d9'))
150 self.hybridencode(
151 b'data/C/CO/COM/COM0/COM1/COM2/COM3/COM4/COM5/COM6/COM7/COM8/COM9',
152 (b'data/_c/_c_o/_c_o_m/_c_o_m0/_c_o_m1/_c_o_m2/_c_o_m3/_c_o_m4/'
153 b'_c_o_m5/_c_o_m6/_c_o_m7/_c_o_m8/_c_o_m9'))
154 self.hybridencode(
155 (b'data/c.x/co.x/com.x/com0.x/com1.x/com2.x/com3.x/com4.x/com5.x/'
156 b'com6.x/com7.x/com8.x/com9.x'),
157 (b'data/c.x/co.x/com.x/com0.x/co~6d1.x/co~6d2.x/co~6d3.x/co~6d4.x'
158 b'/co~6d5.x/co~6d6.x/co~6d7.x/co~6d8.x/co~6d9.x'))
159 self.hybridencode(
160 (b'data/x.c/x.co/x.com0/x.com1/x.com2/x.com3/x.com4/x.com5/x.com6'
161 b'/x.com7/x.com8/x.com9'),
162 (b'data/x.c/x.co/x.com0/x.com1/x.com2/x.com3/x.com4/x.com5/x.com6'
163 b'/x.com7/x.com8/x.com9'))
164 self.hybridencode(
165 (b'data/cx/cox/comx/com0x/com1x/com2x/com3x/com4x/com5x/com6x/'
166 b'com7x/com8x/com9x'),
167 (b'data/cx/cox/comx/com0x/com1x/com2x/com3x/com4x/com5x/com6x/'
168 b'com7x/com8x/com9x'))
169 self.hybridencode(
170 (b'data/xc/xco/xcom0/xcom1/xcom2/xcom3/xcom4/xcom5/xcom6/xcom7/'
171 b'xcom8/xcom9'),
172 (b'data/xc/xco/xcom0/xcom1/xcom2/xcom3/xcom4/xcom5/xcom6/xcom7/'
173 b'xcom8/xcom9'))
174 self.hybridencode(
175 b'data/l/lp/lpt/lpt0/lpt1/lpt2/lpt3/lpt4/lpt5/lpt6/lpt7/lpt8/lpt9',
176 (b'data/l/lp/lpt/lpt0/lp~741/lp~742/lp~743/lp~744/lp~745/lp~746/'
177 b'lp~747/lp~748/lp~749'))
178 self.hybridencode(
179 b'data/L/LP/LPT/LPT0/LPT1/LPT2/LPT3/LPT4/LPT5/LPT6/LPT7/LPT8/LPT9',
180 (b'data/_l/_l_p/_l_p_t/_l_p_t0/_l_p_t1/_l_p_t2/_l_p_t3/_l_p_t4/'
181 b'_l_p_t5/_l_p_t6/_l_p_t7/_l_p_t8/_l_p_t9'))
182 self.hybridencode(
183 (b'data/l.x/lp.x/lpt.x/lpt0.x/lpt1.x/lpt2.x/lpt3.x/lpt4.x/lpt5.x/'
184 b'lpt6.x/lpt7.x/lpt8.x/lpt9.x'),
185 (b'data/l.x/lp.x/lpt.x/lpt0.x/lp~741.x/lp~742.x/lp~743.x/lp~744.x/'
186 b'lp~745.x/lp~746.x/lp~747.x/lp~748.x/lp~749.x'))
187 self.hybridencode(
188 (b'data/x.l/x.lp/x.lpt/x.lpt0/x.lpt1/x.lpt2/x.lpt3/x.lpt4/x.lpt5/'
189 b'x.lpt6/x.lpt7/x.lpt8/x.lpt9'),
190 (b'data/x.l/x.lp/x.lpt/x.lpt0/x.lpt1/x.lpt2/x.lpt3/x.lpt4/x.lpt5'
191 b'/x.lpt6/x.lpt7/x.lpt8/x.lpt9'))
192 self.hybridencode(
193 (b'data/lx/lpx/lptx/lpt0x/lpt1x/lpt2x/lpt3x/lpt4x/lpt5x/lpt6x/'
194 b'lpt7x/lpt8x/lpt9x'),
195 (b'data/lx/lpx/lptx/lpt0x/lpt1x/lpt2x/lpt3x/lpt4x/lpt5x/lpt6x/'
196 b'lpt7x/lpt8x/lpt9x'))
197 self.hybridencode(
198 (b'data/xl/xlp/xlpt/xlpt0/xlpt1/xlpt2/xlpt3/xlpt4/xlpt5/xlpt6/'
199 b'xlpt7/xlpt8/xlpt9'),
200 (b'data/xl/xlp/xlpt/xlpt0/xlpt1/xlpt2/xlpt3/xlpt4/xlpt5/xlpt6/'
201 b'xlpt7/xlpt8/xlpt9'))
202 self.hybridencode(b'data/con/p/pr/prn/a/au/aux/n/nu/nul',
203 b'data/co~6e/p/pr/pr~6e/a/au/au~78/n/nu/nu~6c')
204 self.hybridencode(
205 b'data/CON/P/PR/PRN/A/AU/AUX/N/NU/NUL',
206 b'data/_c_o_n/_p/_p_r/_p_r_n/_a/_a_u/_a_u_x/_n/_n_u/_n_u_l')
207 self.hybridencode(
208 b'data/con.x/p.x/pr.x/prn.x/a.x/au.x/aux.x/n.x/nu.x/nul.x',
209 b'data/co~6e.x/p.x/pr.x/pr~6e.x/a.x/au.x/au~78.x/n.x/nu.x/nu~6c.x')
210 self.hybridencode(
211 b'data/x.con/x.p/x.pr/x.prn/x.a/x.au/x.aux/x.n/x.nu/x.nul',
212 b'data/x.con/x.p/x.pr/x.prn/x.a/x.au/x.aux/x.n/x.nu/x.nul')
213 self.hybridencode(b'data/conx/px/prx/prnx/ax/aux/auxx/nx/nux/nulx',
214 b'data/conx/px/prx/prnx/ax/au~78/auxx/nx/nux/nulx')
215 self.hybridencode(b'data/xcon/xp/xpr/xprn/xa/xau/xaux/xn/xnu/xnul',
216 b'data/xcon/xp/xpr/xprn/xa/xau/xaux/xn/xnu/xnul')
217 self.hybridencode(b'data/a./au./aux./auxy./aux.',
218 b'data/a~2e/au~2e/au~78~2e/auxy~2e/au~78~2e')
219 self.hybridencode(b'data/c./co./con./cony./con.',
220 b'data/c~2e/co~2e/co~6e~2e/cony~2e/co~6e~2e')
221 self.hybridencode(b'data/p./pr./prn./prny./prn.',
222 b'data/p~2e/pr~2e/pr~6e~2e/prny~2e/pr~6e~2e')
223 self.hybridencode(b'data/n./nu./nul./nuly./nul.',
224 b'data/n~2e/nu~2e/nu~6c~2e/nuly~2e/nu~6c~2e')
225 self.hybridencode(
226 b'data/l./lp./lpt./lpt1./lpt1y./lpt1.',
227 b'data/l~2e/lp~2e/lpt~2e/lp~741~2e/lpt1y~2e/lp~741~2e')
228 self.hybridencode(b'data/lpt9./lpt9y./lpt9.',
229 b'data/lp~749~2e/lpt9y~2e/lp~749~2e')
230 self.hybridencode(b'data/com./com1./com1y./com1.',
231 b'data/com~2e/co~6d1~2e/com1y~2e/co~6d1~2e')
232 self.hybridencode(b'data/com9./com9y./com9.',
233 b'data/co~6d9~2e/com9y~2e/co~6d9~2e')
234 self.hybridencode(b'data/a /au /aux /auxy /aux ',
235 b'data/a~20/au~20/aux~20/auxy~20/aux~20')
146 236
147 print("uppercase hitting length limit due to encoding")
148 show('data/A23456789-123456789-123456789-123456789-123456789-'
149 'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
150 '123456789-12345')
151 show('data/Z23456789-123456789-123456789-123456789-123456789-'
152 'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
153 '123456789-12345')
154
155 print("compare with lowercase not hitting limit")
156 show('data/a23456789-123456789-123456789-123456789-123456789-'
157 'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
158 '123456789-12345')
159 show('data/z23456789-123456789-123456789-123456789-123456789-'
160 'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
161 '123456789-12345')
162
163 print("not hitting limit with any of these")
164 show("data/abcdefghijklmnopqrstuvwxyz0123456789 !#%&'()+,-.;="
165 "[]^`{}xxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-"
166 "123456789-12345")
167
168 print("underbar hitting length limit due to encoding")
169 show('data/_23456789-123456789-123456789-123456789-123456789-'
170 'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
171 '123456789-12345')
172
173 print("tilde hitting length limit due to encoding")
174 show('data/~23456789-123456789-123456789-123456789-123456789-'
175 'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
176 '123456789-12345')
237 def testhashingboundarycases(self):
238 # largest unhashed path
239 self.hybridencode(
240 (b'data/123456789-123456789-123456789-123456789-123456789-unhashed'
241 b'--xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345'),
242 (b'data/123456789-123456789-123456789-123456789-123456789-unhashed'
243 b'--xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345'))
244 # shortest hashed path
245 self.hybridencode(
246 (b'data/123456789-123456789-123456789-123456789-123456789-hashed'
247 b'----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'),
248 (b'dh/123456789-123456789-123456789-123456789-123456789-hashed---'
249 b'-xxxxxxxxx-xxxxxxxe9c55002b50bf5181e7a6fc1f60b126e2a6fcf71'))
177 250
178 print("Windows reserved characters hitting length limit")
179 show('data/<23456789-123456789-123456789-123456789-123456789-'
180 'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
181 '123456789-12345')
182 show('data/>23456789-123456789-123456789-123456789-123456789-'
183 'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
184 '123456789-12345')
185 show('data/:23456789-123456789-123456789-123456789-123456789-'
186 'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
187 '123456789-12345')
188 show('data/"23456789-123456789-123456789-123456789-123456789-'
189 'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
190 '123456789-12345')
191 show('data/\\23456789-123456789-123456789-123456789-123456789-'
192 'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
193 '123456789-12345')
194 show('data/|23456789-123456789-123456789-123456789-123456789-'
195 'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
196 '123456789-12345')
197 show('data/?23456789-123456789-123456789-123456789-123456789-'
198 'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
199 '123456789-12345')
200 show('data/*23456789-123456789-123456789-123456789-123456789-'
201 'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
202 '123456789-12345')
251 def testhashing(self):
252 # changing one char in part that's hashed away produces a different hash
253 self.hybridencode(
254 (b'data/123456789-123456789-123456789-123456789-123456789-hashed'
255 b'----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxy-123456789-123456'),
256 (b'dh/123456789-123456789-123456789-123456789-123456789-hashed---'
257 b'-xxxxxxxxx-xxxxxxxd24fa4455faf8a94350c18e5eace7c2bb17af706'))
258 # uppercase hitting length limit due to encoding
259 self.hybridencode(
260 (b'data/A23456789-123456789-123456789-123456789-123456789-'
261 b'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
262 b'123456789-12345'),
263 (b'dh/a23456789-123456789-123456789-123456789-123456789-'
264 b'xxxxxxxxx-xxxxxxxxx-xxxxxxx'
265 b'cbbc657029b41b94ed510d05feb6716a5c03bc6b'))
266 self.hybridencode(
267 (b'data/Z23456789-123456789-123456789-123456789-123456789-'
268 b'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
269 b'123456789-12345'),
270 (b'dh/z23456789-123456789-123456789-123456789-123456789-xxxxxxxxx'
271 b'-xxxxxxxxx-xxxxxxx938f32a725c89512833fb96b6602dd9ebff51ddd'))
272 # compare with lowercase not hitting limit
273 self.hybridencode(
274 (b'data/a23456789-123456789-123456789-123456789-123456789-'
275 b'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-'
276 b'12345'),
277 (b'data/a23456789-123456789-123456789-123456789-123456789-'
278 b'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-'
279 b'12345'))
280 self.hybridencode(
281 (b'data/z23456789-123456789-123456789-123456789-123456789'
282 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789'
283 b'-12345'),
284 (b'data/z23456789-123456789-123456789-123456789-123456789'
285 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-'
286 b'12345'))
287 # not hitting limit with any of these
288 self.hybridencode(
289 (b'data/abcdefghijklmnopqrstuvwxyz0123456789 !#%&\'()+,-.;=[]^`{}'
290 b'xxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345'),
291 (b'data/abcdefghijklmnopqrstuvwxyz0123456789 !#%&\'()+,-.;=[]^`{}'
292 b'xxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345'))
293 # underbar hitting length limit due to encoding
294 self.hybridencode(
295 (b'data/_23456789-123456789-123456789-123456789-123456789-'
296 b'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-'
297 b'12345'),
298 (b'dh/_23456789-123456789-123456789-123456789-123456789-xxxxxxxxx-'
299 b'xxxxxxxxx-xxxxxxx9921a01af50feeabc060ce00eee4cba6efc31d2b'))
300
301 # tilde hitting length limit due to encoding
302 self.hybridencode(
303 (b'data/~23456789-123456789-123456789-123456789-123456789-'
304 b'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-'
305 b'12345'),
306 (b'dh/~7e23456789-123456789-123456789-123456789-123456789'
307 b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
308 b'9cec6f97d569c10995f785720044ea2e4227481b'))
203 309
204 print("initial space hitting length limit")
205 show('data/ 23456789-123456789-123456789-123456789-123456789-'
206 'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
207 '123456789-12345')
208
209 print("initial dot hitting length limit")
210 show('data/.23456789-123456789-123456789-123456789-123456789-'
211 'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
212 '123456789-12345')
213
214 print("trailing space in filename hitting length limit")
215 show('data/123456789-123456789-123456789-123456789-123456789-'
216 'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
217 '123456789-1234 ')
310 def testwinreservedoverlimit(self):
311 # Windows reserved characters hitting length limit
312 self.hybridencode(
313 (b'data/<23456789-123456789-123456789-123456789-123456789'
314 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx'
315 b'-123456789-12345'),
316 (b'dh/~3c23456789-123456789-123456789-123456789-123456789'
317 b'-xxxxxxxxx-xxxxxxxxx-xxxxxee'
318 b'67d8f275876ca1ef2500fc542e63c885c4e62d'))
319 self.hybridencode(
320 (b'data/>23456789-123456789-123456789-123456789-123456789-'
321 b'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
322 b'123456789-12345'),
323 (b'dh/~3e23456789-123456789-123456789-123456789-123456789'
324 b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
325 b'387a85a5b1547cc9136310c974df716818458ddb'))
326 self.hybridencode(
327 (b'data/:23456789-123456789-123456789-123456789-123456789'
328 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
329 b'123456789-12345'),
330 (b'dh/~3a23456789-123456789-123456789-123456789-123456789'
331 b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
332 b'2e4154fb571d13d22399c58cc4ef4858e4b75999'))
333 self.hybridencode(
334 (b'data/"23456789-123456789-123456789-123456789-123456789'
335 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx'
336 b'-123456789-12345'),
337 (b'dh/~2223456789-123456789-123456789-123456789-123456789'
338 b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
339 b'fc7e3ec7b0687ee06ed8c32fef0eb0c1980259f5'))
340 self.hybridencode(
341 (b'data/\\23456789-123456789-123456789-123456789-123456789'
342 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
343 b'123456789-12345'),
344 (b'dh/~5c23456789-123456789-123456789-123456789-123456789'
345 b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
346 b'944e1f2b7110687e116e0d151328ac648b06ab4a'))
347 self.hybridencode(
348 (b'data/|23456789-123456789-123456789-123456789-123456789'
349 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx'
350 b'-123456789-12345'),
351 (b'dh/~7c23456789-123456789-123456789-123456789-123456789'
352 b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
353 b'28b23dd3fd0242946334126ab62bcd772aac32f4'))
354 self.hybridencode(
355 (b'data/?23456789-123456789-123456789-123456789-123456789'
356 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx'
357 b'-123456789-12345'),
358 (b'dh/~3f23456789-123456789-123456789-123456789-123456789'
359 b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
360 b'a263022d3994d2143d98f94f431eef8b5e7e0f8a'))
361 self.hybridencode(
362 (b'data/*23456789-123456789-123456789-123456789-123456789'
363 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
364 b'123456789-12345'),
365 (b'dh/~2a23456789-123456789-123456789-123456789-123456789'
366 b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
367 b'0e7e6020e3c00ba7bb7893d84ca2966fbf53e140'))
218 368
219 print("trailing dot in filename hitting length limit")
220 show('data/123456789-123456789-123456789-123456789-123456789-'
221 'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
222 '123456789-1234.')
369 def testinitialspacelenlimit(self):
370 # initial space hitting length limit
371 self.hybridencode(
372 (b'data/ 23456789-123456789-123456789-123456789-123456789'
373 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
374 b'123456789-12345'),
375 (b'dh/~2023456789-123456789-123456789-123456789-123456789'
376 b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
377 b'92acbc78ef8c0b796111629a02601f07d8aec4ea'))
223 378
224 print("initial space in directory hitting length limit")
225 show('data/ x/456789-123456789-123456789-123456789-123456789-'
226 'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
227 '123456789-12345')
379 def testinitialdotlenlimit(self):
380 # initial dot hitting length limit
381 self.hybridencode(
382 (b'data/.23456789-123456789-123456789-123456789-123456789'
383 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx'
384 b'-123456789-12345'),
385 (b'dh/~2e23456789-123456789-123456789-123456789-123456789'
386 b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
387 b'dbe19cc6505b3515ab9228cebf877ad07075168f'))
388
389 def testtrailingspacelenlimit(self):
390 # trailing space in filename hitting length limit
391 self.hybridencode(
392 (b'data/123456789-123456789-123456789-123456789-123456789'
393 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
394 b'123456789-1234 '),
395 (b'dh/123456789-123456789-123456789-123456789-123456789'
396 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxx'
397 b'0025dc73e04f97426db4893e3bf67d581dc6d066'))
228 398
229 print("initial dot in directory hitting length limit")
230 show('data/.x/456789-123456789-123456789-123456789-123456789-'
231 'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
232 '123456789-12345')
399 def testtrailingdotlenlimit(self):
400 # trailing dot in filename hitting length limit
401 self.hybridencode(
402 (b'data/123456789-123456789-123456789-123456789-123456789'
403 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-'
404 b'1234.'),
405 (b'dh/123456789-123456789-123456789-123456789-123456789'
406 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxx'
407 b'85a16cf03ee7feba8a5abc626f1ba9886d01e89d'))
408
409 def testinitialspacedirlenlimit(self):
410 # initial space in directory hitting length limit
411 self.hybridencode(
412 (b'data/ x/456789-123456789-123456789-123456789-123456789'
413 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx'
414 b'-123456789-12345'),
415 (b'dh/~20x/456789-123456789-123456789-123456789-123456789'
416 b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
417 b'1b3a3b712b2ac00d6af14ae8b4c14fdbf904f516'))
233 418
234 print("trailing space in directory hitting length limit")
235 show('data/x /456789-123456789-123456789-123456789-123456789-'
236 'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
237 '123456789-12345')
419 def testinitialdotdirlenlimit(self):
420 # initial dot in directory hitting length limit
421 self.hybridencode(
422 (b'data/.x/456789-123456789-123456789-123456789-123456789'
423 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx'
424 b'-123456789-12345'),
425 (b'dh/~2ex/456789-123456789-123456789-123456789-123456789'
426 b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
427 b'39dbc4c193a5643a8936fc69c3363cd7ac91ab14'))
428
429 def testtrailspacedirlenlimit(self):
430 # trailing space in directory hitting length limit
431 self.hybridencode(
432 (b'data/x /456789-123456789-123456789-123456789-123456789'
433 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx'
434 b'-123456789-12345'),
435 (b'dh/x~20/456789-123456789-123456789-123456789-123456789'
436 b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
437 b'2253c341df0b5290790ad312cd8499850f2273e5'))
238 438
239 print("trailing dot in directory hitting length limit")
240 show('data/x./456789-123456789-123456789-123456789-123456789-'
241 'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
242 '123456789-12345')
439 def testtrailingdotdirlenlimit(self):
440 # trailing dot in directory hitting length limit
441 self.hybridencode(
442 (b'data/x./456789-123456789-123456789-123456789-123456789'
443 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
444 b'123456789-12345'),
445 (b'dh/x~2e/456789-123456789-123456789-123456789-123456789'
446 b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
447 b'cc0324d696d34562b44b5138db08ee1594ccc583'))
243 448
244 print("with directories that need direncoding, hitting length limit")
245 show('data/x.i/56789-123456789-123456789-123456789-123456789-'
246 'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
247 '123456789-12345')
248 show('data/x.d/56789-123456789-123456789-123456789-123456789-'
249 'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
250 '123456789-12345')
251 show('data/x.hg/5789-123456789-123456789-123456789-123456789-'
252 'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
253 '123456789-12345')
449 def testdirencodinglenlimit(self):
450 # with directories that need direncoding, hitting length limit
451 self.hybridencode(
452 (b'data/x.i/56789-123456789-123456789-123456789-123456789'
453 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-'
454 b'12345'),
455 (b'dh/x.i.hg/56789-123456789-123456789-123456789-123456789'
456 b'-xxxxxxxxx-xxxxxxxxx-xxxx'
457 b'a4c4399bdf81c67dbbbb7060aa0124d8dea94f74'))
458 self.hybridencode(
459 (b'data/x.d/56789-123456789-123456789-123456789-123456789'
460 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx'
461 b'-123456789-12345'),
462 (b'dh/x.d.hg/56789-123456789-123456789-123456789-123456789'
463 b'-xxxxxxxxx-xxxxxxxxx-xxxx'
464 b'1303fa90473b230615f5b3ea7b660e881ae5270a'))
465 self.hybridencode(
466 (b'data/x.hg/5789-123456789-123456789-123456789-123456789'
467 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx'
468 b'-123456789-12345'),
469 (b'dh/x.hg.hg/5789-123456789-123456789-123456789-123456789'
470 b'-xxxxxxxxx-xxxxxxxxx-xxxx'
471 b'26d724a8af68e7a4e4455e6602ea9adbd0eb801f'))
254 472
255 print("Windows reserved filenames, hitting length limit")
256 show('data/con/56789-123456789-123456789-123456789-123456789-'
257 'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
258 '123456789-12345')
259 show('data/prn/56789-123456789-123456789-123456789-123456789-'
260 'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
261 '123456789-12345')
262 show('data/aux/56789-123456789-123456789-123456789-123456789-'
263 'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
264 '123456789-12345')
265 show('data/nul/56789-123456789-123456789-123456789-123456789-'
266 'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
267 '123456789-12345')
268 show('data/com1/6789-123456789-123456789-123456789-123456789-'
269 'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
270 '123456789-12345')
271 show('data/com9/6789-123456789-123456789-123456789-123456789-'
272 'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
273 '123456789-12345')
274 show('data/lpt1/6789-123456789-123456789-123456789-123456789-'
275 'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
276 '123456789-12345')
277 show('data/lpt9/6789-123456789-123456789-123456789-123456789-'
278 'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
279 '123456789-12345')
473 def testwinreservedfilenameslimit(self):
474 # Windows reserved filenames, hitting length limit
475 self.hybridencode(
476 (b'data/con/56789-123456789-123456789-123456789-123456789'
477 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
478 b'123456789-12345'),
479 (b'dh/co~6e/56789-123456789-123456789-123456789-123456789'
480 b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
481 b'c0794d4f4c605a2617900eb2563d7113cf6ea7d3'))
482 self.hybridencode(
483 (b'data/prn/56789-123456789-123456789-123456789-123456789'
484 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx'
485 b'-123456789-12345'),
486 (b'dh/pr~6e/56789-123456789-123456789-123456789-123456789'
487 b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
488 b'64db876e1a9730e27236cb9b167aff942240e932'))
489 self.hybridencode(
490 (b'data/aux/56789-123456789-123456789-123456789-123456789'
491 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx'
492 b'-123456789-12345'),
493 (b'dh/au~78/56789-123456789-123456789-123456789-123456789'
494 b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
495 b'8a178558405ca6fb4bbd75446dfa186f06751a0d'))
496 self.hybridencode(
497 (b'data/nul/56789-123456789-123456789-123456789-123456789'
498 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx'
499 b'-123456789-12345'),
500 (b'dh/nu~6c/56789-123456789-123456789-123456789-123456789'
501 b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
502 b'c5e51b6fec1bd07bd243b053a0c3f7209855b886'))
503 self.hybridencode(
504 (b'data/com1/6789-123456789-123456789-123456789-123456789'
505 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx'
506 b'-123456789-12345'),
507 (b'dh/co~6d1/6789-123456789-123456789-123456789-123456789'
508 b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
509 b'32f5f44ece3bb62b9327369ca84cc19c86259fcd'))
510 self.hybridencode(
511 (b'data/com9/6789-123456789-123456789-123456789-123456789'
512 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx'
513 b'-123456789-12345'),
514 (b'dh/co~6d9/6789-123456789-123456789-123456789-123456789'
515 b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
516 b'734360b28c66a3230f55849fe8926206d229f990'))
517 self.hybridencode(
518 (b'data/lpt1/6789-123456789-123456789-123456789-123456789'
519 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx'
520 b'-123456789-12345'),
521 (b'dh/lp~741/6789-123456789-123456789-123456789-123456789'
522 b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
523 b'e6f16ab4b6b0637676b2842b3345c9836df46ef7'))
524 self.hybridencode(
525 (b'data/lpt9/6789-123456789-123456789-123456789-123456789'
526 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx'
527 b'-123456789-12345'),
528 (b'dh/lp~749/6789-123456789-123456789-123456789-123456789'
529 b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
530 b'a475814c51acead3e44f2ff801f0c4903f986157'))
280 531
281 print("non-reserved names, just not hitting limit")
282 show('data/123456789-123456789-123456789-123456789-123456789-'
283 '/com/com0/lpt/lpt0/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
284 '123456789-12345')
285
286 print("hashed path with largest untruncated 1st dir")
287 show('data/12345678/-123456789-123456789-123456789-123456789-'
288 'hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
289 '123456789-123456')
290
291 print("hashed path with smallest truncated 1st dir")
292 show('data/123456789/123456789-123456789-123456789-123456789-'
293 'hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
294 '123456789-123456')
532 def testnonreservednolimit(self):
533 # non-reserved names, just not hitting limit
534 self.hybridencode(
535 (b'data/123456789-123456789-123456789-123456789-123456789-'
536 b'/com/com0/lpt/lpt0/'
537 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345'),
538 (b'data/123456789-123456789-123456789-123456789-123456789-'
539 b'/com/com0/lpt/lpt0/'
540 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345'))
295 541
296 print("hashed path with largest untruncated two dirs")
297 show('data/12345678/12345678/9-123456789-123456789-123456789-'
298 'hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
299 '123456789-123456')
542 def testhashedpathuntrucfirst(self):
543 # hashed path with largest untruncated 1st dir
544 self.hybridencode(
545 (b'data/12345678/-123456789-123456789-123456789-123456789-hashed'
546 b'----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'),
547 (b'dh/12345678/-123456789-123456789-123456789-123456789-hashed'
548 b'----xxxxxxxxx-xxxxxxx4e9e9e384d00929a93b6835fbf976eb32321ff3c'))
300 549
301 print("hashed path with smallest truncated two dirs")
302 show('data/123456789/123456789/123456789-123456789-123456789-'
303 'hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
304 '123456789-123456')
550 def testhashedpathsmallesttrucdir(self):
551 # hashed path with smallest truncated 1st dir
552 self.hybridencode(
553 (b'data/123456789/123456789-123456789-123456789-123456789-hashed'
554 b'----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'),
555 (b'dh/12345678/123456789-123456789-123456789-123456789-hashed'
556 b'----xxxxxxxxx-xxxxxxxx1f4e4ec5f2be76e109bfaa8e31c062fe426d5490'))
305 557
306 print("hashed path with largest untruncated three dirs")
307 show('data/12345678/12345678/12345678/89-123456789-123456789-'
308 'hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
309 '123456789-123456')
558 def testhashedlargesttwountruc(self):
559 # hashed path with largest untruncated two dirs
560 self.hybridencode(
561 (b'data/12345678/12345678/9-123456789-123456789-123456789-hashed'
562 b'----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'),
563 (b'dh/12345678/12345678/9-123456789-123456789-123456789-hashed'
564 b'----xxxxxxxxx-xxxxxxx3332d8329d969cf835542a9f2cbcfb385b6cf39d'))
310 565
311 print("hashed path with smallest truncated three dirs")
312 show('data/123456789/123456789/123456789/123456789-123456789-'
313 'hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
314 '123456789-123456')
566 def testhashedpathsmallesttrunctwodirs(self):
567 # hashed path with smallest truncated two dirs
568 self.hybridencode(
569 (b'data/123456789/123456789/123456789-123456789-123456789-hashed'
570 b'----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'),
571 (b'dh/12345678/12345678/123456789-123456789-123456789-hashed'
572 b'----xxxxxxxxx-xxxxxxxxx'
573 b'9699559798247dffa18717138859be5f8874840e'))
315 574
316 print("hashed path with largest untruncated four dirs")
317 show('data/12345678/12345678/12345678/12345678/789-123456789-'
318 'hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
319 '123456789-123456')
575 def testhashuntruncthree(self):
576 # hashed path with largest untruncated three dirs
577 self.hybridencode(
578 (b'data/12345678/12345678/12345678/89-123456789-123456789-'
579 b'hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
580 b'123456789-123456'),
581 (b'dh/12345678/12345678/12345678/89-123456789-123456789-hashed'
582 b'----xxxxxxxxx-xxxxxxxf0a2b053bb1369cce02f78c217d6a7aaea18c439'))
320 583
321 print("hashed path with smallest truncated four dirs")
322 show('data/123456789/123456789/123456789/123456789/123456789-'
323 'hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
324 '123456789-123456')
584 def testhashtruncthree(self):
585 # hashed path with smallest truncated three dirs
586 self.hybridencode(
587 (b'data/123456789/123456789/123456789/123456789-123456789-hashed'
588 b'----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'),
589 (b'dh/12345678/12345678/12345678/123456789-123456789-hashed'
590 b'----xxxxxxxxx-xxxxxxxxx-'
591 b'1c6f8284967384ec13985a046d3553179d9d03cd'))
325 592
326 print("hashed path with largest untruncated five dirs")
327 show('data/12345678/12345678/12345678/12345678/12345678/6789-'
328 'hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
329 '123456789-123456')
593 def testhashuntrucfour(self):
594 # hashed path with largest untruncated four dirs
595 self.hybridencode(
596 (b'data/12345678/12345678/12345678/12345678/789-123456789-hashed'
597 b'----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'),
598 (b'dh/12345678/12345678/12345678/12345678/789-123456789-hashed'
599 b'----xxxxxxxxx-xxxxxxx0d30c99049d8f0ff97b94d4ef302027e8d54c6fd'))
330 600
331 print("hashed path with smallest truncated five dirs")
332 show('data/123456789/123456789/123456789/123456789/123456789/'
333 'hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
334 '123456789-123456')
601 def testhashtruncfour(self):
602 # hashed path with smallest truncated four dirs
603 self.hybridencode(
604 (b'data/123456789/123456789/123456789/123456789/123456789-hashed'
605 b'----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'),
606 (b'dh/12345678/12345678/12345678/12345678/123456789-hashed'
607 b'----xxxxxxxxx-xxxxxxxxx-x'
608 b'46162779e1a771810b37a737f82ae7ed33771402'))
335 609
336 print("hashed path with largest untruncated six dirs")
337 show('data/12345678/12345678/12345678/12345678/12345678/12345'
338 '678/ed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
339 '123456789-123456')
610 def testhashuntruncfive(self):
611 # hashed path with largest untruncated five dirs
612 self.hybridencode(
613 (b'data/12345678/12345678/12345678/12345678/12345678/6789-hashed'
614 b'----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'),
615 (b'dh/12345678/12345678/12345678/12345678/12345678/6789-hashed'
616 b'----xxxxxxxxx-xxxxxxxbfe752ddc8b003c2790c66a9f2eb1ea75c114390'))
340 617
341 print("hashed path with smallest truncated six dirs")
342 show('data/123456789/123456789/123456789/123456789/123456789/'
343 '123456789/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
344 '123456789-123456')
618 def testhashtruncfive(self):
619 # hashed path with smallest truncated five dirs
620 self.hybridencode(
621 (b'data/123456789/123456789/123456789/123456789/123456789/hashed'
622 b'----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'),
623 (b'dh/12345678/12345678/12345678/12345678/12345678/hashed'
624 b'----xxxxxxxxx-xxxxxxxxx-xx'
625 b'b94c27b3532fa880cdd572b1c514785cab7b6ff2'))
626
627 def testhashuntruncsix(self):
628 # hashed path with largest untruncated six dirs
629 self.hybridencode(
630 (b'data/12345678/12345678/12345678/12345678/12345678/12345678/'
631 b'ed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'),
632 (b'dh/12345678/12345678/12345678/12345678/12345678/12345678/'
633 b'ed----xxxxxxxxx-xxxxxxx'
634 b'cd8cc5483a0f3be409e0e5d4bf9e36e113c59235'))
345 635
346 print("hashed path with largest untruncated seven dirs")
347 show('data/12345678/12345678/12345678/12345678/12345678/12345'
348 '678/12345678/xxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
349 '123456789-123456')
636 def testhashtruncsix(self):
637 # hashed path with smallest truncated six dirs
638 self.hybridencode(
639 (b'data/123456789/123456789/123456789/123456789/123456789/'
640 b'123456789/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
641 b'123456789-123456'),
642 (b'dh/12345678/12345678/12345678/12345678/12345678/12345678/'
643 b'xxxxxxxxx-xxxxxxxxx-xxx'
644 b'47dd6f616f833a142da00701b334cebbf640da06'))
350 645
351 print("hashed path with smallest truncated seven dirs")
352 show('data/123456789/123456789/123456789/123456789/123456789/'
353 '123456789/123456789/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
354 '123456789-123456')
646 def testhashuntrunc7(self):
647 # hashed path with largest untruncated seven dirs
648 self.hybridencode(
649 (b'data/12345678/12345678/12345678/12345678/12345678/12345678'
650 b'/12345678/xxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
651 b'123456789-123456'),
652 (b'dh/12345678/12345678/12345678/12345678/12345678/12345678'
653 b'/12345678/xxxxxx-xxxxxxx'
654 b'1c8ed635229fc22efe51035feeadeb4c8a0ecb82'))
355 655
356 print("hashed path with largest untruncated eight dirs")
357 print("(directory 8 is dropped because it hits _maxshortdirslen)")
358 show('data/12345678/12345678/12345678/12345678/12345678/12345'
359 '678/12345678/12345678/xxxxxxx-xxxxxxxxx-xxxxxxxxx-'
360 '123456789-123456')
656 def testhashtrunc7(self):
657 # hashed path with smallest truncated seven dirs
658 self.hybridencode(
659 (b'data/123456789/123456789/123456789/123456789/123456789/'
660 b'123456789/123456789/'
661 b'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'),
662 (b'dh/12345678/12345678/12345678/12345678/12345678/12345678/123'
663 b'45678/xxxxxxxxx-xxxx298ff7d33f8ce6db57930837ffea2fb2f48bb926'))
361 664
362 print("hashed path with smallest truncated eight dirs")
363 print("(directory 8 is dropped because it hits _maxshortdirslen)")
364 show('data/123456789/123456789/123456789/123456789/123456789/'
365 '123456789/123456789/123456789/xxxxxxxxx-xxxxxxxxx-'
366 '123456789-123456')
665 def testhashuntrunc8(self):
666 # hashed path with largest untruncated eight dirs
667 # (directory 8 is dropped because it hits _maxshortdirslen)
668 self.hybridencode(
669 (b'data/12345678/12345678/12345678/12345678/12345678/12345678/'
670 b'12345678/12345678/xxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'),
671 (b'dh/12345678/12345678/12345678/12345678/12345678/12345678/1'
672 b'2345678/xxxxxxx-xxxxxxc8996ccd41b471f768057181a4d59d2febe7277d'))
367 673
368 print("hashed path with largest non-dropped directory 8")
369 print("(just not hitting the _maxshortdirslen boundary)")
370 show('data/12345678/12345678/12345678/12345678/12345678/12345'
371 '678/12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
372 '123456789-123456')
674 def testhashtrunc8(self):
675 # hashed path with smallest truncated eight dirs
676 # (directory 8 is dropped because it hits _maxshortdirslen)
677 self.hybridencode(
678 (b'data/123456789/123456789/123456789/123456789/123456789/'
679 b'123456789/123456789/123456789/xxxxxxxxx-xxxxxxxxx-'
680 b'123456789-123456'),
681 (b'dh/12345678/12345678/12345678/12345678/12345678/12345678'
682 b'/12345678/xxxxxxxxx-xxxx'
683 b'4fa04a839a6bda93e1c21c713f2edcbd16e8890d'))
373 684
374 print("...adding one truncated char to dir 1..7 won't drop dir 8")
375 show('data/12345678x/12345678/12345678/12345678/12345678/12345'
376 '678/12345678/12345/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
377 '123456789-123456')
378 show('data/12345678/12345678x/12345678/12345678/12345678/12345'
379 '678/12345678/12345/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
380 '123456789-123456')
381 show('data/12345678/12345678/12345678x/12345678/12345678/12345'
382 '678/12345678/12345/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
383 '123456789-123456')
384 show('data/12345678/12345678/12345678/12345678x/12345678/12345'
385 '678/12345678/12345/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
386 '123456789-123456')
387 show('data/12345678/12345678/12345678/12345678/12345678x/12345'
388 '678/12345678/12345/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
389 '123456789-123456')
390 show('data/12345678/12345678/12345678/12345678/12345678/12345'
391 '678x/12345678/12345/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
392 '123456789-123456')
393 show('data/12345678/12345678/12345678/12345678/12345678/12345'
394 '678/12345678x/12345/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
395 '123456789-123456')
685 def testhashnondropped8(self):
686 # hashed path with largest non-dropped directory 8
687 # (just not hitting the _maxshortdirslen boundary)
688 self.hybridencode(
689 (b'data/12345678/12345678/12345678/12345678/12345678/12345678'
690 b'/12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789'
691 b'-123456'),
692 (b'dh/12345678/12345678/12345678/12345678/12345678/12345678'
693 b'/12345678/12345/-xxxxxxx'
694 b'4d43d1ccaa20efbfe99ec779dc063611536ff2c5'))
695 # ...adding one truncated char to dir 1..7 won't drop dir 8
696 self.hybridencode(
697 (b'data/12345678x/12345678/12345678/12345678/12345678/12345678'
698 b'/12345678/12345/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'),
699 (b'dh/12345678/12345678/12345678/12345678/12345678/12345678/1234'
700 b'5678/12345/xxxxxxxx0f9efce65189cc60fd90fe4ffd49d7b58bbe0f2e'))
701 self.hybridencode(
702 (b'data/12345678/12345678x/12345678/12345678/12345678/12345678'
703 b'/12345678/12345/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'),
704 (b'dh/12345678/12345678/12345678/12345678/12345678/12345678/1234'
705 b'5678/12345/xxxxxxxx945ca395708cafdd54a94501859beabd3e243921'))
706 self.hybridencode(
707 (b'data/12345678/12345678/12345678x/12345678/12345678/12345678/12'
708 b'345678/12345/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'),
709 (b'dh/12345678/12345678/12345678/12345678/12345678/12345678/1234'
710 b'5678/12345/xxxxxxxxac62bf6898c4fd0502146074547c11caa751a327'))
711 self.hybridencode(
712 (b'data/12345678/12345678/12345678/12345678x/12345678/12345678/12'
713 b'345678/12345/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'),
714 (b'dh/12345678/12345678/12345678/12345678/12345678/12345678/1234'
715 b'5678/12345/xxxxxxxx2ae5a2baed7983fae8974d0ca06c6bf08b9aee92'))
716 self.hybridencode(
717 (b'data/12345678/12345678/12345678/12345678/12345678x/12345678/'
718 b'12345678/12345/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'),
719 (b'dh/12345678/12345678/12345678/12345678/12345678/12345678/1234'
720 b'5678/12345/xxxxxxxx214aba07b6687532a43d1e9eaf6e88cfca96b68c'))
721 self.hybridencode(
722 (b'data/12345678/12345678/12345678/12345678/12345678/12345678x'
723 b'/12345678/12345/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'),
724 (b'dh/12345678/12345678/12345678/12345678/12345678/12345678/1234'
725 b'5678/12345/xxxxxxxxe7a022ae82f0f55cf4e0498e55ba59ea4ebb55bf'))
726 self.hybridencode(
727 (b'data/12345678/12345678/12345678/12345678/12345678/12345678/'
728 b'12345678x/12345/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'),
729 (b'dh/12345678/12345678/12345678/12345678/12345678/12345678/12345'
730 b'678/12345/xxxxxxxxb51ce61164996a80f36ce3cfe64b62d519aedae3'))
396 731
397 print("hashed path with shortest dropped directory 8")
398 print("(just hitting the _maxshortdirslen boundary)")
399 show('data/12345678/12345678/12345678/12345678/12345678/12345'
400 '678/12345678/123456/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
401 '123456789-123456')
402
403 print("hashed path that drops dir 8 due to dot or space at end is")
404 print("encoded, and thus causing to hit _maxshortdirslen")
405 show('data/12345678/12345678/12345678/12345678/12345678/12345'
406 '678/12345678/1234./-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
407 '123456789-123456')
408 show('data/12345678/12345678/12345678/12345678/12345678/12345'
409 '678/12345678/1234 /-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
410 '123456789-123456')
732 def testhashedpathshortestdropped8(self):
733 # hashed path with shortest dropped directory 8
734 # (just hitting the _maxshortdirslen boundary)
735 self.hybridencode(
736 (b'data/12345678/12345678/12345678/12345678/12345678/12345678'
737 b'/12345678/123456/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
738 b'123456789-123456'),
739 (b'dh/12345678/12345678/12345678/12345678/12345678/12345678'
740 b'/12345678/xxxxxxxxx-xxxx'
741 b'11fa9873cc6c3215eae864528b5530a04efc6cfe'))
411 742
412 print("... with dir 8 short enough for encoding")
413 show('data/12345678/12345678/12345678/12345678/12345678/12345'
414 '678/12345678/12./xx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
415 '123456789-123456')
416 show('data/12345678/12345678/12345678/12345678/12345678/12345'
417 '678/12345678/12 /xx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
418 '123456789-123456')
743 def testhashedpathdropsdir8fortrailingdotspace(self):
744 # hashed path that drops dir 8 due to dot or space at end is
745 # encoded, and thus causing to hit _maxshortdirslen
746 self.hybridencode(
747 (b'data/12345678/12345678/12345678/12345678/12345678/12345678'
748 b'/12345678/1234./-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
749 b'123456789-123456'),
750 (b'dh/12345678/12345678/12345678/12345678/12345678/12345678'
751 b'/12345678/-xxxxxxxxx-xxx'
752 b'602df9b45bec564e2e1f0645d5140dddcc76ed58'))
753 self.hybridencode(
754 (b'data/12345678/12345678/12345678/12345678/12345678/12345678'
755 b'/12345678/1234 /-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
756 b'123456789-123456'),
757 (b'dh/12345678/12345678/12345678/12345678/12345678/12345678'
758 b'/12345678/-xxxxxxxxx-xxx'
759 b'd99ff212bc84b4d1f70cd6b0071e3ef69d4e12ce'))
760 # ... with dir 8 short enough for encoding
761 self.hybridencode(
762 (b'data/12345678/12345678/12345678/12345678/12345678/12345678'
763 b'/12345678/12./xx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx'
764 b'-123456789-123456'),
765 (b'dh/12345678/12345678/12345678/12345678/12345678/12345678'
766 b'/12345678/12~2e/'
767 b'xx-xxxxx7baeb5ed7f14a586ee1cacecdbcbff70032d1b3c'))
768 self.hybridencode(
769 (b'data/12345678/12345678/12345678/12345678/12345678/12345678'
770 b'/12345678/12 '
771 b'/xx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'),
772 (b'dh/12345678/12345678/12345678/12345678/12345678/12345678'
773 b'/12345678/12~20/'
774 b'xx-xxxxxcf79ca9795f77d7f75745da36807e5d772bd5182'))
419 775
420 print('''Extensions are replicated on hashed paths. Note that
421 we only get to encode files that end in .i or .d inside the
422 store. Encoded filenames are thus bound in length.''')
423 show('data/12345678/12345678/12345678/12345678/12345678/12345'
424 '678/12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
425 '123456789-12.345.i')
426 show('data/12345678/12345678/12345678/12345678/12345678/12345'
427 '678/12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
428 '123456789-12.345.d')
429 show('data/12345678/12345678/12345678/12345678/12345678/12345'
430 '678/12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
431 '123456789-12.3456.i')
432 show('data/12345678/12345678/12345678/12345678/12345678/12345'
433 '678/12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
434 '123456789-12.34567.i')
435 show('data/12345678/12345678/12345678/12345678/12345678/12345'
436 '678/12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
437 '123456789-12.345678.i')
438 show('data/12345678/12345678/12345678/12345678/12345678/12345'
439 '678/12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
440 '123456789-12.3456789.i')
441 show('data/12345678/12345678/12345678/12345678/12345678/12345'
442 '678/12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
443 '123456789-12.3456789-.i')
444 show('data/12345678/12345678/12345678/12345678/12345678/12345'
445 '678/12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
446 '123456789-12.3456789-1.i')
447 show('data/12345678/12345678/12345678/12345678/12345678/12345'
448 '678/12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
449 '123456789-12.3456789-12.i')
450 show('data/12345678/12345678/12345678/12345678/12345678/12345'
451 '678/12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
452 '123456789-12.3456789-123.i')
453 show('data/12345678/12345678/12345678/12345678/12345678/12345'
454 '678/12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
455 '123456789-12.3456789-1234.i')
456 show('data/12345678/12345678/12345678/12345678/12345678/12345'
457 '678/12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
458 '123456789-12.3456789-12345.i')
459 show('data/12345678/12345678/12345678/12345678/12345678/12345'
460 '678/12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
461 '123456789-12.3456789-12345-ABCDEFGHIJKLMNOPRSTUVWX'
462 'YZ-abcdefghjiklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPRSTU'
463 'VWXYZ-1234567890-xxxxxxxxx-xxxxxxxxx-xxxxxxxx-xxxx'
464 'xxxxx-wwwwwwwww-wwwwwwwww-wwwwwwwww-wwwwwwwww-wwww'
465 'wwwww-wwwwwwwww-wwwwwwwww-wwwwwwwww-wwwwwwwww.i')
776 def testextensionsreplicatedonhashedpaths(self):
777 # Extensions are replicated on hashed paths. Note that
778 # we only get to encode files that end in .i or .d inside the
779 # store. Encoded filenames are thus bound in length.
780 self.hybridencode(
781 (b'data/12345678/12345678/12345678/12345678/12345678/12345678/'
782 b'12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3'
783 b'45.i'),
784 (b'dh/12345678/12345678/12345678/12345678/12345678/12345678/12'
785 b'345678/12345/-xxxxxc10ad03b5755ed524f5286aab1815dfe07729438.i'))
786 self.hybridencode(
787 (b'data/12345678/12345678/12345678/12345678/12345678/12345678/'
788 b'12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3'
789 b'45.d'),
790 (b'dh/12345678/12345678/12345678/12345678/12345678/12345678/12'
791 b'345678/12345/-xxxxx9eec83381f2b39ef5ac8b4ecdf2c94f7983f57c8.d'))
792 self.hybridencode(
793 (b'data/12345678/12345678/12345678/12345678/12345678/12345678/'
794 b'12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3'
795 b'456.i'),
796 (b'dh/12345678/12345678/12345678/12345678/12345678/12345678/12'
797 b'345678/12345/-xxxxxb7796dc7d175cfb0bb8a7728f58f6ebec9042568.i'))
798 self.hybridencode(
799 (b'data/12345678/12345678/12345678/12345678/12345678/12345678/'
800 b'12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3'
801 b'4567.i'),
802 (b'dh/12345678/12345678/12345678/12345678/12345678/12345678/12'
803 b'345678/12345/-xxxxxb515857a6bfeef017c4894d8df42458ac65d55b8.i'))
804 self.hybridencode(
805 (b'data/12345678/12345678/12345678/12345678/12345678/12345678/'
806 b'12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3'
807 b'45678.i'),
808 (b'dh/12345678/12345678/12345678/12345678/12345678/12345678/12'
809 b'345678/12345/-xxxxxb05a0f247bc0a776211cd6a32ab714fd9cc09f2b.i'))
810 self.hybridencode(
811 (b'data/12345678/12345678/12345678/12345678/12345678/12345678/'
812 b'12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3'
813 b'456789.i'),
814 (b'dh/12345678/12345678/12345678/12345678/12345678/12345678/12'
815 b'345678/12345/-xxxxxf192b48bff08d9e0e12035fb52bc58c70de72c94.i'))
816 self.hybridencode(
817 (b'data/12345678/12345678/12345678/12345678/12345678/12345678/'
818 b'12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3'
819 b'456789-.i'),
820 (b'dh/12345678/12345678/12345678/12345678/12345678/12345678/12'
821 b'345678/12345/-xxxxx435551e0ed4c7b083b9ba83cee916670e02e80ad.i'))
822 self.hybridencode(
823 (b'data/12345678/12345678/12345678/12345678/12345678/12345678/'
824 b'12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3'
825 b'456789-1.i'),
826 (b'dh/12345678/12345678/12345678/12345678/12345678/12345678/12'
827 b'345678/12345/-xxxxxa7f74eb98d8d58b716356dfd26e2f9aaa65d6a9a.i'))
828 self.hybridencode(
829 (b'data/12345678/12345678/12345678/12345678/12345678/12345678/'
830 b'12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3'
831 b'456789-12.i'),
832 (b'dh/12345678/12345678/12345678/12345678/12345678/12345678/12'
833 b'345678/12345/-xxxxxed68d9bd43b931f0b100267fee488d65a0c66f62.i'))
834 self.hybridencode(
835 (b'data/12345678/12345678/12345678/12345678/12345678/12345678/'
836 b'12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3'
837 b'456789-123.i'),
838 (b'dh/12345678/12345678/12345678/12345678/12345678/12345678/12'
839 b'345678/12345/-xxxxx5cea44de2b642d2ba2b4a30693ffb1049644d698.i'))
840 self.hybridencode(
841 (b'data/12345678/12345678/12345678/12345678/12345678/12345678/'
842 b'12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3'
843 b'456789-1234.i'),
844 (b'dh/12345678/12345678/12345678/12345678/12345678/12345678/12'
845 b'345678/12345/-xxxxx68462f62a7f230b39c1b5400d73ec35920990b7e.i'))
846 self.hybridencode(
847 (b'data/12345678/12345678/12345678/12345678/12345678/12345678/'
848 b'12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3'
849 b'456789-12345.i'),
850 (b'dh/12345678/12345678/12345678/12345678/12345678/12345678/12'
851 b'345678/12345/-xxxxx4cb852a314c6da240a83eec94761cdd71c6ec22e.i'))
852 self.hybridencode(
853 (b'data/12345678/12345678/12345678/12345678/12345678/12345678/'
854 b'12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3'
855 b'456789-12345-ABCDEFGHIJKLMNOPRSTUVWXYZ-'
856 b'abcdefghjiklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPRSTUVWXYZ'
857 b'-1234567890-xxxxxxxxx-xxxxxxxxx-xxxxxxxx'
858 b'-xxxxxxxxx-wwwwwwwww-wwwwwwwww-wwwwwwwww-wwwwwwwww'
859 b'-wwwwwwwww-wwwwwwwww-wwwwwwwww-wwwwwwwww-wwwwwwwww.i'),
860 (b'dh/12345678/12345678/12345678/12345678/12345678/12345678/12'
861 b'345678/12345/-xxxxx93352aa50377751d9e5ebdf52da1e6e69a6887a6.i'))
466 862
467 print("paths outside data/ can be encoded")
468 show('metadata/dir/00manifest.i')
469 show('metadata/12345678/12345678/12345678/12345678/12345678/'
470 '12345678/12345678/12345678/12345678/12345678/12345678/'
471 '12345678/12345678/00manifest.i')
863 def testpathsoutsidedata(self):
864 # paths outside data/ can be encoded
865 self.hybridencode(b'metadata/dir/00manifest.i',
866 b'metadata/dir/00manifest.i')
867 self.hybridencode(
868 (b'metadata/12345678/12345678/12345678/12345678/12345678'
869 b'/12345678/12345678/12345678/12345678/12345678/12345678'
870 b'/12345678/12345678/00manifest.i'),
871 (b'dh/ata/12345678/12345678/12345678/12345678/12345678'
872 b'/12345678/12345678/00manife'
873 b'0a4da1f89aa2aa9eb0896eb451288419049781b4.i'))
874
875 if __name__ == '__main__':
876 import silenttestrunner
877 silenttestrunner.main(__name__)
1 NO CONTENT: file was removed
General Comments 0
You need to be logged in to leave comments. Login now