Mercurial > hg
view tests/test-hybridencode.py @ 45584:4c8a93ec6908
merge: store commitinfo if these is a dc or cd conflict
delete-changed or changed-delete conflicts can either be resolved by mergetool,
if some tool is passed and using or by user choose something on prompt or user
doing some `hg revert` after choosing the file to remain conflicted.
If the user decides to keep the changed side, on commit we just reuse the parent
filenode. This is mostly fine unless we are in a distributed environment and
people are doing criss-cross merges.
Since, we don't have recursive merges or any other way of describing the end
result of the merge was an explicit choice and it should be differentiated from
it's ancestors, merge algo during criss-cross merges fails to take in account
the explicit choice made by user and end up with a what-can-be-said-wrong-merge.
The solution which we are trying to fix this is by creating a filenode on commit
instead of reusing the parent filenode. This helps differentiate between
pre-merged filenode and post-merge filenode and kind of tells about the choice
user made.
To implement creating new filenode functionality, we store info about these
files in mergestate so that we can read them on commit and force create a new
filenode.
Differential Revision: https://phab.mercurial-scm.org/D8988
author | Pulkit Goyal <7895pulkit@gmail.com> |
---|---|
date | Thu, 03 Sep 2020 13:44:06 +0530 |
parents | 2372284d9457 |
children | 6000f5b25c9b |
line wrap: on
line source
from __future__ import absolute_import, print_function import unittest from mercurial import store class hybridencodetests(unittest.TestCase): def hybridencode(self, input, want): # Check the C implementation if it's in use got = store._pathencode(input) self.assertEqual(want, got) # Check the reference implementation in Python refgot = store._hybridencode(input, True) self.assertEqual(want, refgot) def testnoencodingrequired(self): self.hybridencode( b'data/abcdefghijklmnopqrstuvwxyz0123456789 !#%&\'()+,-.;=[]^`{}', b'data/abcdefghijklmnopqrstuvwxyz0123456789 !#%&\'()+,-.;=[]^`{}', ) def testuppercasechars(self): # uppercase char X is encoded as _x self.hybridencode( b'data/ABCDEFGHIJKLMNOPQRSTUVWXYZ', 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', ) def testunderbar(self): # underbar is doubled self.hybridencode(b'data/_', b'data/__') def testtilde(self): # tilde is character-encoded self.hybridencode(b'data/~', b'data/~7e') def testcontrolchars(self): # characters in ASCII code range 1..31 self.hybridencode( ( b'data/\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f' b'\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e' b'\x1f' ), ( b'data/~01~02~03~04~05~06~07~08~09~0a~0b~0c~0d~0e~0f~10~11~12~13' b'~14~15~16~17~18~19~1a~1b~1c~1d~1e~1f' ), ) def testhighascii(self): # characters in ASCII code range 126..255 self.hybridencode( ( b'data/~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c' b'\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b' b'\x9c\x9d\x9e\x9f' ), ( b'data/~7e~7f~80~81~82~83~84~85~86~87~88~89~8a~8b~8c~8d~8e~8f~90' b'~91~92~93~94~95~96~97~98~99~9a~9b~9c~9d~9e~9f' ), ) self.hybridencode( ( b'data/\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad' b'\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc' b'\xbd\xbe\xbf' ), ( b'data/~a0~a1~a2~a3~a4~a5~a6~a7~a8~a9~aa~ab~ac~ad~ae~af~b0~b1~b2' b'~b3~b4~b5~b6~b7~b8~b9~ba~bb~bc~bd~be~bf' ), ) self.hybridencode( ( b'data/\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca' b'\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6' b'\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf' ), ( b'data/~c0~c1~c2~c3~c4~c5~c6~c7~c8~c9~ca~cb~cc~cd~ce~cf~d0~d1~d2' b'~d3~d4~d5~d6~d7~d8~d9~da~db~dc~dd~de~df' ), ) self.hybridencode( ( b'data/\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed' b'\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd' b'\xfe\xff' ), ( b'data/~e0~e1~e2~e3~e4~e5~e6~e7~e8~e9~ea~eb~ec~ed~ee~ef~f0~f1~f2' b'~f3~f4~f5~f6~f7~f8~f9~fa~fb~fc~fd~fe~ff' ), ) def testwinreserved(self): # Windows reserved characters self.hybridencode( ( b'data/less <, greater >, colon :, double-quote ", backslash \\, ' b'pipe |, question-mark ?, asterisk *' ), ( b'data/less ~3c, greater ~3e, colon ~3a, double-quote ~22, ' b'backslash ~5c, pipe ~7c, question-mark ~3f, asterisk ~2a' ), ) def testhgreserved(self): # encoding directories ending in .hg, .i or .d with '.hg' suffix self.hybridencode( b'data/x.h.i/x.hg/x.i/x.d/foo', b'data/x.h.i.hg/x.hg.hg/x.i.hg/x.d.hg/foo', ) self.hybridencode( b'data/a.hg/a.i/a.d/foo', b'data/a.hg.hg/a.i.hg/a.d.hg/foo' ) self.hybridencode( b'data/au.hg/au.i/au.d/foo', b'data/au.hg.hg/au.i.hg/au.d.hg/foo' ) self.hybridencode( b'data/aux.hg/aux.i/aux.d/foo', b'data/au~78.hg.hg/au~78.i.hg/au~78.d.hg/foo', ) self.hybridencode( b'data/auxy.hg/auxy.i/auxy.d/foo', b'data/auxy.hg.hg/auxy.i.hg/auxy.d.hg/foo', ) # but these are not encoded on *filenames* self.hybridencode(b'data/foo/x.hg', b'data/foo/x.hg') self.hybridencode(b'data/foo/x.i', b'data/foo/x.i') self.hybridencode(b'data/foo/x.d', b'data/foo/x.d') self.hybridencode(b'data/foo/a.hg', b'data/foo/a.hg') self.hybridencode(b'data/foo/a.i', b'data/foo/a.i') self.hybridencode(b'data/foo/a.d', b'data/foo/a.d') self.hybridencode(b'data/foo/au.hg', b'data/foo/au.hg') self.hybridencode(b'data/foo/au.i', b'data/foo/au.i') self.hybridencode(b'data/foo/au.d', b'data/foo/au.d') self.hybridencode(b'data/foo/aux.hg', b'data/foo/au~78.hg') self.hybridencode(b'data/foo/aux.i', b'data/foo/au~78.i') self.hybridencode(b'data/foo/aux.d', b'data/foo/au~78.d') self.hybridencode(b'data/foo/auxy.hg', b'data/foo/auxy.hg') self.hybridencode(b'data/foo/auxy.i', b'data/foo/auxy.i') self.hybridencode(b'data/foo/auxy.d', b'data/foo/auxy.d') # plain .hg, .i and .d directories have the leading dot encoded self.hybridencode( b'data/.hg/.i/.d/foo', b'data/~2ehg.hg/~2ei.hg/~2ed.hg/foo' ) def testmisclongcases(self): self.hybridencode( ( b'data/aux.bla/bla.aux/prn/PRN/lpt/com3/nul/' b'coma/foo.NUL/normal.c.i' ), ( b'data/au~78.bla/bla.aux/pr~6e/_p_r_n/lpt/co~6d3' b'/nu~6c/coma/foo._n_u_l/normal.c.i' ), ) self.hybridencode( ( b'data/AUX/SECOND/X.PRN/FOURTH/FI:FTH/SIXTH/SEVENTH/EIGHTH/NINETH' b'/TENTH/ELEVENTH/LOREMIPSUM.TXT.i' ), ( b'dh/au~78/second/x.prn/fourth/fi~3afth/sixth/seventh/eighth/' b'nineth/tenth/loremia20419e358ddff1bf8751e38288aff1d7c32ec05.i' ), ) self.hybridencode( ( b'data/enterprise/openesbaddons/contrib-imola/corba-bc/' b'netbeansplugin/wsdlExtension/src/main/java/META-INF/services' b'/org.netbeans.modules.xml.wsdl.bindingsupport.spi.' b'ExtensibilityElementTemplateProvider.i' ), ( b'dh/enterpri/openesba/contrib-/corba-bc/netbeans/wsdlexte/src/' b'main/java/org.net7018f27961fdf338a598a40c4683429e7ffb9743.i' ), ) self.hybridencode( ( b'data/AUX.THE-QUICK-BROWN-FOX-JU:MPS-OVER-THE-LAZY-DOG-THE-' b'QUICK-BROWN-FOX-JUMPS-OVER-THE-LAZY-DOG.TXT.i' ), ( b'dh/au~78.the-quick-brown-fox-ju~3amps-over-the-lazy-dog-the-' b'quick-brown-fox-jud4dcadd033000ab2b26eb66bae1906bcb15d4a70.i' ), ) self.hybridencode( ( b'data/Project Planning/Resources/AnotherLongDirectoryName/Follow' b'edbyanother/AndAnother/AndThenAnExtremelyLongFileName.txt' ), ( b'dh/project_/resource/anotherl/followed/andanoth/andthenanextrem' b'elylongfilenaf93030515d9849cfdca52937c2204d19f83913e5.txt' ), ) self.hybridencode( ( b'data/Project.Planning/Resources/AnotherLongDirectoryName/Follo' b'wedbyanother/AndAnother/AndThenAnExtremelyLongFileName.txt' ), ( b'dh/project_/resource/anotherl/followed/andanoth/andthenanextre' b'melylongfilena0fd7c506f5c9d58204444fc67e9499006bd2d445.txt' ), ) self.hybridencode( b'data/foo.../foo / /a./_. /__/.x../ bla/.FOO/something.i', ( b'data/foo..~2e/foo ~20/~20/a~2e/__.~20/____/~2ex.~2e/~20 bla/' b'~2e_f_o_o/something.i' ), ) self.hybridencode( b'data/c/co/com/com0/com1/com2/com3/com4/com5/com6/com7/com8/com9', ( b'data/c/co/com/com0/co~6d1/co~6d2/co~6d3/co~6d4/co~6d5/co~6d6/' b'co~6d7/co~6d8/co~6d9' ), ) self.hybridencode( b'data/C/CO/COM/COM0/COM1/COM2/COM3/COM4/COM5/COM6/COM7/COM8/COM9', ( b'data/_c/_c_o/_c_o_m/_c_o_m0/_c_o_m1/_c_o_m2/_c_o_m3/_c_o_m4/' b'_c_o_m5/_c_o_m6/_c_o_m7/_c_o_m8/_c_o_m9' ), ) self.hybridencode( ( b'data/c.x/co.x/com.x/com0.x/com1.x/com2.x/com3.x/com4.x/com5.x/' b'com6.x/com7.x/com8.x/com9.x' ), ( b'data/c.x/co.x/com.x/com0.x/co~6d1.x/co~6d2.x/co~6d3.x/co~6d4.x' b'/co~6d5.x/co~6d6.x/co~6d7.x/co~6d8.x/co~6d9.x' ), ) self.hybridencode( ( b'data/x.c/x.co/x.com0/x.com1/x.com2/x.com3/x.com4/x.com5/x.com6' b'/x.com7/x.com8/x.com9' ), ( b'data/x.c/x.co/x.com0/x.com1/x.com2/x.com3/x.com4/x.com5/x.com6' b'/x.com7/x.com8/x.com9' ), ) self.hybridencode( ( b'data/cx/cox/comx/com0x/com1x/com2x/com3x/com4x/com5x/com6x/' b'com7x/com8x/com9x' ), ( b'data/cx/cox/comx/com0x/com1x/com2x/com3x/com4x/com5x/com6x/' b'com7x/com8x/com9x' ), ) self.hybridencode( ( b'data/xc/xco/xcom0/xcom1/xcom2/xcom3/xcom4/xcom5/xcom6/xcom7/' b'xcom8/xcom9' ), ( b'data/xc/xco/xcom0/xcom1/xcom2/xcom3/xcom4/xcom5/xcom6/xcom7/' b'xcom8/xcom9' ), ) self.hybridencode( b'data/l/lp/lpt/lpt0/lpt1/lpt2/lpt3/lpt4/lpt5/lpt6/lpt7/lpt8/lpt9', ( b'data/l/lp/lpt/lpt0/lp~741/lp~742/lp~743/lp~744/lp~745/lp~746/' b'lp~747/lp~748/lp~749' ), ) self.hybridencode( b'data/L/LP/LPT/LPT0/LPT1/LPT2/LPT3/LPT4/LPT5/LPT6/LPT7/LPT8/LPT9', ( b'data/_l/_l_p/_l_p_t/_l_p_t0/_l_p_t1/_l_p_t2/_l_p_t3/_l_p_t4/' b'_l_p_t5/_l_p_t6/_l_p_t7/_l_p_t8/_l_p_t9' ), ) self.hybridencode( ( b'data/l.x/lp.x/lpt.x/lpt0.x/lpt1.x/lpt2.x/lpt3.x/lpt4.x/lpt5.x/' b'lpt6.x/lpt7.x/lpt8.x/lpt9.x' ), ( b'data/l.x/lp.x/lpt.x/lpt0.x/lp~741.x/lp~742.x/lp~743.x/lp~744.x/' b'lp~745.x/lp~746.x/lp~747.x/lp~748.x/lp~749.x' ), ) self.hybridencode( ( b'data/x.l/x.lp/x.lpt/x.lpt0/x.lpt1/x.lpt2/x.lpt3/x.lpt4/x.lpt5/' b'x.lpt6/x.lpt7/x.lpt8/x.lpt9' ), ( b'data/x.l/x.lp/x.lpt/x.lpt0/x.lpt1/x.lpt2/x.lpt3/x.lpt4/x.lpt5' b'/x.lpt6/x.lpt7/x.lpt8/x.lpt9' ), ) self.hybridencode( ( b'data/lx/lpx/lptx/lpt0x/lpt1x/lpt2x/lpt3x/lpt4x/lpt5x/lpt6x/' b'lpt7x/lpt8x/lpt9x' ), ( b'data/lx/lpx/lptx/lpt0x/lpt1x/lpt2x/lpt3x/lpt4x/lpt5x/lpt6x/' b'lpt7x/lpt8x/lpt9x' ), ) self.hybridencode( ( b'data/xl/xlp/xlpt/xlpt0/xlpt1/xlpt2/xlpt3/xlpt4/xlpt5/xlpt6/' b'xlpt7/xlpt8/xlpt9' ), ( b'data/xl/xlp/xlpt/xlpt0/xlpt1/xlpt2/xlpt3/xlpt4/xlpt5/xlpt6/' b'xlpt7/xlpt8/xlpt9' ), ) self.hybridencode( b'data/con/p/pr/prn/a/au/aux/n/nu/nul', b'data/co~6e/p/pr/pr~6e/a/au/au~78/n/nu/nu~6c', ) self.hybridencode( b'data/CON/P/PR/PRN/A/AU/AUX/N/NU/NUL', b'data/_c_o_n/_p/_p_r/_p_r_n/_a/_a_u/_a_u_x/_n/_n_u/_n_u_l', ) self.hybridencode( b'data/con.x/p.x/pr.x/prn.x/a.x/au.x/aux.x/n.x/nu.x/nul.x', 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', ) self.hybridencode( b'data/x.con/x.p/x.pr/x.prn/x.a/x.au/x.aux/x.n/x.nu/x.nul', b'data/x.con/x.p/x.pr/x.prn/x.a/x.au/x.aux/x.n/x.nu/x.nul', ) self.hybridencode( b'data/conx/px/prx/prnx/ax/aux/auxx/nx/nux/nulx', b'data/conx/px/prx/prnx/ax/au~78/auxx/nx/nux/nulx', ) self.hybridencode( b'data/xcon/xp/xpr/xprn/xa/xau/xaux/xn/xnu/xnul', b'data/xcon/xp/xpr/xprn/xa/xau/xaux/xn/xnu/xnul', ) self.hybridencode( b'data/a./au./aux./auxy./aux.', b'data/a~2e/au~2e/au~78~2e/auxy~2e/au~78~2e', ) self.hybridencode( b'data/c./co./con./cony./con.', b'data/c~2e/co~2e/co~6e~2e/cony~2e/co~6e~2e', ) self.hybridencode( b'data/p./pr./prn./prny./prn.', b'data/p~2e/pr~2e/pr~6e~2e/prny~2e/pr~6e~2e', ) self.hybridencode( b'data/n./nu./nul./nuly./nul.', b'data/n~2e/nu~2e/nu~6c~2e/nuly~2e/nu~6c~2e', ) self.hybridencode( b'data/l./lp./lpt./lpt1./lpt1y./lpt1.', b'data/l~2e/lp~2e/lpt~2e/lp~741~2e/lpt1y~2e/lp~741~2e', ) self.hybridencode( b'data/lpt9./lpt9y./lpt9.', b'data/lp~749~2e/lpt9y~2e/lp~749~2e' ) self.hybridencode( b'data/com./com1./com1y./com1.', b'data/com~2e/co~6d1~2e/com1y~2e/co~6d1~2e', ) self.hybridencode( b'data/com9./com9y./com9.', b'data/co~6d9~2e/com9y~2e/co~6d9~2e' ) self.hybridencode( b'data/a /au /aux /auxy /aux ', b'data/a~20/au~20/aux~20/auxy~20/aux~20', ) def testhashingboundarycases(self): # largest unhashed path self.hybridencode( ( b'data/123456789-123456789-123456789-123456789-123456789-unhashed' b'--xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345' ), ( b'data/123456789-123456789-123456789-123456789-123456789-unhashed' b'--xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345' ), ) # shortest hashed path self.hybridencode( ( b'data/123456789-123456789-123456789-123456789-123456789-hashed' b'----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456' ), ( b'dh/123456789-123456789-123456789-123456789-123456789-hashed---' b'-xxxxxxxxx-xxxxxxxe9c55002b50bf5181e7a6fc1f60b126e2a6fcf71' ), ) def testhashing(self): # changing one char in part that's hashed away produces a different hash self.hybridencode( ( b'data/123456789-123456789-123456789-123456789-123456789-hashed' b'----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxy-123456789-123456' ), ( b'dh/123456789-123456789-123456789-123456789-123456789-hashed---' b'-xxxxxxxxx-xxxxxxxd24fa4455faf8a94350c18e5eace7c2bb17af706' ), ) # uppercase hitting length limit due to encoding self.hybridencode( ( b'data/A23456789-123456789-123456789-123456789-123456789-' b'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-' b'123456789-12345' ), ( b'dh/a23456789-123456789-123456789-123456789-123456789-' b'xxxxxxxxx-xxxxxxxxx-xxxxxxx' b'cbbc657029b41b94ed510d05feb6716a5c03bc6b' ), ) self.hybridencode( ( b'data/Z23456789-123456789-123456789-123456789-123456789-' b'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-' b'123456789-12345' ), ( b'dh/z23456789-123456789-123456789-123456789-123456789-xxxxxxxxx' b'-xxxxxxxxx-xxxxxxx938f32a725c89512833fb96b6602dd9ebff51ddd' ), ) # compare with lowercase not hitting limit self.hybridencode( ( b'data/a23456789-123456789-123456789-123456789-123456789-' b'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-' b'12345' ), ( b'data/a23456789-123456789-123456789-123456789-123456789-' b'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-' b'12345' ), ) self.hybridencode( ( b'data/z23456789-123456789-123456789-123456789-123456789' b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789' b'-12345' ), ( b'data/z23456789-123456789-123456789-123456789-123456789' b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-' b'12345' ), ) # not hitting limit with any of these self.hybridencode( ( b'data/abcdefghijklmnopqrstuvwxyz0123456789 !#%&\'()+,-.;=[]^`{}' b'xxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345' ), ( b'data/abcdefghijklmnopqrstuvwxyz0123456789 !#%&\'()+,-.;=[]^`{}' b'xxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345' ), ) # underbar hitting length limit due to encoding self.hybridencode( ( b'data/_23456789-123456789-123456789-123456789-123456789-' b'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-' b'12345' ), ( b'dh/_23456789-123456789-123456789-123456789-123456789-xxxxxxxxx-' b'xxxxxxxxx-xxxxxxx9921a01af50feeabc060ce00eee4cba6efc31d2b' ), ) # tilde hitting length limit due to encoding self.hybridencode( ( b'data/~23456789-123456789-123456789-123456789-123456789-' b'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-' b'12345' ), ( b'dh/~7e23456789-123456789-123456789-123456789-123456789' b'-xxxxxxxxx-xxxxxxxxx-xxxxx' b'9cec6f97d569c10995f785720044ea2e4227481b' ), ) def testwinreservedoverlimit(self): # Windows reserved characters hitting length limit self.hybridencode( ( b'data/<23456789-123456789-123456789-123456789-123456789' b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx' b'-123456789-12345' ), ( b'dh/~3c23456789-123456789-123456789-123456789-123456789' b'-xxxxxxxxx-xxxxxxxxx-xxxxxee' b'67d8f275876ca1ef2500fc542e63c885c4e62d' ), ) self.hybridencode( ( b'data/>23456789-123456789-123456789-123456789-123456789-' b'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-' b'123456789-12345' ), ( b'dh/~3e23456789-123456789-123456789-123456789-123456789' b'-xxxxxxxxx-xxxxxxxxx-xxxxx' b'387a85a5b1547cc9136310c974df716818458ddb' ), ) self.hybridencode( ( b'data/:23456789-123456789-123456789-123456789-123456789' b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-' b'123456789-12345' ), ( b'dh/~3a23456789-123456789-123456789-123456789-123456789' b'-xxxxxxxxx-xxxxxxxxx-xxxxx' b'2e4154fb571d13d22399c58cc4ef4858e4b75999' ), ) self.hybridencode( ( b'data/"23456789-123456789-123456789-123456789-123456789' b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx' b'-123456789-12345' ), ( b'dh/~2223456789-123456789-123456789-123456789-123456789' b'-xxxxxxxxx-xxxxxxxxx-xxxxx' b'fc7e3ec7b0687ee06ed8c32fef0eb0c1980259f5' ), ) self.hybridencode( ( b'data/\\23456789-123456789-123456789-123456789-123456789' b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-' b'123456789-12345' ), ( b'dh/~5c23456789-123456789-123456789-123456789-123456789' b'-xxxxxxxxx-xxxxxxxxx-xxxxx' b'944e1f2b7110687e116e0d151328ac648b06ab4a' ), ) self.hybridencode( ( b'data/|23456789-123456789-123456789-123456789-123456789' b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx' b'-123456789-12345' ), ( b'dh/~7c23456789-123456789-123456789-123456789-123456789' b'-xxxxxxxxx-xxxxxxxxx-xxxxx' b'28b23dd3fd0242946334126ab62bcd772aac32f4' ), ) self.hybridencode( ( b'data/?23456789-123456789-123456789-123456789-123456789' b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx' b'-123456789-12345' ), ( b'dh/~3f23456789-123456789-123456789-123456789-123456789' b'-xxxxxxxxx-xxxxxxxxx-xxxxx' b'a263022d3994d2143d98f94f431eef8b5e7e0f8a' ), ) self.hybridencode( ( b'data/*23456789-123456789-123456789-123456789-123456789' b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-' b'123456789-12345' ), ( b'dh/~2a23456789-123456789-123456789-123456789-123456789' b'-xxxxxxxxx-xxxxxxxxx-xxxxx' b'0e7e6020e3c00ba7bb7893d84ca2966fbf53e140' ), ) def testinitialspacelenlimit(self): # initial space hitting length limit self.hybridencode( ( b'data/ 23456789-123456789-123456789-123456789-123456789' b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-' b'123456789-12345' ), ( b'dh/~2023456789-123456789-123456789-123456789-123456789' b'-xxxxxxxxx-xxxxxxxxx-xxxxx' b'92acbc78ef8c0b796111629a02601f07d8aec4ea' ), ) def testinitialdotlenlimit(self): # initial dot hitting length limit self.hybridencode( ( b'data/.23456789-123456789-123456789-123456789-123456789' b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx' b'-123456789-12345' ), ( b'dh/~2e23456789-123456789-123456789-123456789-123456789' b'-xxxxxxxxx-xxxxxxxxx-xxxxx' b'dbe19cc6505b3515ab9228cebf877ad07075168f' ), ) def testtrailingspacelenlimit(self): # trailing space in filename hitting length limit self.hybridencode( ( b'data/123456789-123456789-123456789-123456789-123456789' b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-' b'123456789-1234 ' ), ( b'dh/123456789-123456789-123456789-123456789-123456789' b'-xxxxxxxxx-xxxxxxxxx-xxxxxxx' b'0025dc73e04f97426db4893e3bf67d581dc6d066' ), ) def testtrailingdotlenlimit(self): # trailing dot in filename hitting length limit self.hybridencode( ( b'data/123456789-123456789-123456789-123456789-123456789' b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-' b'1234.' ), ( b'dh/123456789-123456789-123456789-123456789-123456789' b'-xxxxxxxxx-xxxxxxxxx-xxxxxxx' b'85a16cf03ee7feba8a5abc626f1ba9886d01e89d' ), ) def testinitialspacedirlenlimit(self): # initial space in directory hitting length limit self.hybridencode( ( b'data/ x/456789-123456789-123456789-123456789-123456789' b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx' b'-123456789-12345' ), ( b'dh/~20x/456789-123456789-123456789-123456789-123456789' b'-xxxxxxxxx-xxxxxxxxx-xxxxx' b'1b3a3b712b2ac00d6af14ae8b4c14fdbf904f516' ), ) def testinitialdotdirlenlimit(self): # initial dot in directory hitting length limit self.hybridencode( ( b'data/.x/456789-123456789-123456789-123456789-123456789' b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx' b'-123456789-12345' ), ( b'dh/~2ex/456789-123456789-123456789-123456789-123456789' b'-xxxxxxxxx-xxxxxxxxx-xxxxx' b'39dbc4c193a5643a8936fc69c3363cd7ac91ab14' ), ) def testtrailspacedirlenlimit(self): # trailing space in directory hitting length limit self.hybridencode( ( b'data/x /456789-123456789-123456789-123456789-123456789' b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx' b'-123456789-12345' ), ( b'dh/x~20/456789-123456789-123456789-123456789-123456789' b'-xxxxxxxxx-xxxxxxxxx-xxxxx' b'2253c341df0b5290790ad312cd8499850f2273e5' ), ) def testtrailingdotdirlenlimit(self): # trailing dot in directory hitting length limit self.hybridencode( ( b'data/x./456789-123456789-123456789-123456789-123456789' b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-' b'123456789-12345' ), ( b'dh/x~2e/456789-123456789-123456789-123456789-123456789' b'-xxxxxxxxx-xxxxxxxxx-xxxxx' b'cc0324d696d34562b44b5138db08ee1594ccc583' ), ) def testdirencodinglenlimit(self): # with directories that need direncoding, hitting length limit self.hybridencode( ( b'data/x.i/56789-123456789-123456789-123456789-123456789' b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-' b'12345' ), ( b'dh/x.i.hg/56789-123456789-123456789-123456789-123456789' b'-xxxxxxxxx-xxxxxxxxx-xxxx' b'a4c4399bdf81c67dbbbb7060aa0124d8dea94f74' ), ) self.hybridencode( ( b'data/x.d/56789-123456789-123456789-123456789-123456789' b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx' b'-123456789-12345' ), ( b'dh/x.d.hg/56789-123456789-123456789-123456789-123456789' b'-xxxxxxxxx-xxxxxxxxx-xxxx' b'1303fa90473b230615f5b3ea7b660e881ae5270a' ), ) self.hybridencode( ( b'data/x.hg/5789-123456789-123456789-123456789-123456789' b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx' b'-123456789-12345' ), ( b'dh/x.hg.hg/5789-123456789-123456789-123456789-123456789' b'-xxxxxxxxx-xxxxxxxxx-xxxx' b'26d724a8af68e7a4e4455e6602ea9adbd0eb801f' ), ) def testwinreservedfilenameslimit(self): # Windows reserved filenames, hitting length limit self.hybridencode( ( b'data/con/56789-123456789-123456789-123456789-123456789' b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-' b'123456789-12345' ), ( b'dh/co~6e/56789-123456789-123456789-123456789-123456789' b'-xxxxxxxxx-xxxxxxxxx-xxxxx' b'c0794d4f4c605a2617900eb2563d7113cf6ea7d3' ), ) self.hybridencode( ( b'data/prn/56789-123456789-123456789-123456789-123456789' b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx' b'-123456789-12345' ), ( b'dh/pr~6e/56789-123456789-123456789-123456789-123456789' b'-xxxxxxxxx-xxxxxxxxx-xxxxx' b'64db876e1a9730e27236cb9b167aff942240e932' ), ) self.hybridencode( ( b'data/aux/56789-123456789-123456789-123456789-123456789' b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx' b'-123456789-12345' ), ( b'dh/au~78/56789-123456789-123456789-123456789-123456789' b'-xxxxxxxxx-xxxxxxxxx-xxxxx' b'8a178558405ca6fb4bbd75446dfa186f06751a0d' ), ) self.hybridencode( ( b'data/nul/56789-123456789-123456789-123456789-123456789' b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx' b'-123456789-12345' ), ( b'dh/nu~6c/56789-123456789-123456789-123456789-123456789' b'-xxxxxxxxx-xxxxxxxxx-xxxxx' b'c5e51b6fec1bd07bd243b053a0c3f7209855b886' ), ) self.hybridencode( ( b'data/com1/6789-123456789-123456789-123456789-123456789' b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx' b'-123456789-12345' ), ( b'dh/co~6d1/6789-123456789-123456789-123456789-123456789' b'-xxxxxxxxx-xxxxxxxxx-xxxxx' b'32f5f44ece3bb62b9327369ca84cc19c86259fcd' ), ) self.hybridencode( ( b'data/com9/6789-123456789-123456789-123456789-123456789' b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx' b'-123456789-12345' ), ( b'dh/co~6d9/6789-123456789-123456789-123456789-123456789' b'-xxxxxxxxx-xxxxxxxxx-xxxxx' b'734360b28c66a3230f55849fe8926206d229f990' ), ) self.hybridencode( ( b'data/lpt1/6789-123456789-123456789-123456789-123456789' b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx' b'-123456789-12345' ), ( b'dh/lp~741/6789-123456789-123456789-123456789-123456789' b'-xxxxxxxxx-xxxxxxxxx-xxxxx' b'e6f16ab4b6b0637676b2842b3345c9836df46ef7' ), ) self.hybridencode( ( b'data/lpt9/6789-123456789-123456789-123456789-123456789' b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx' b'-123456789-12345' ), ( b'dh/lp~749/6789-123456789-123456789-123456789-123456789' b'-xxxxxxxxx-xxxxxxxxx-xxxxx' b'a475814c51acead3e44f2ff801f0c4903f986157' ), ) def testnonreservednolimit(self): # non-reserved names, just not hitting limit self.hybridencode( ( b'data/123456789-123456789-123456789-123456789-123456789-' b'/com/com0/lpt/lpt0/' b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345' ), ( b'data/123456789-123456789-123456789-123456789-123456789-' b'/com/com0/lpt/lpt0/' b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345' ), ) def testhashedpathuntrucfirst(self): # hashed path with largest untruncated 1st dir self.hybridencode( ( b'data/12345678/-123456789-123456789-123456789-123456789-hashed' b'----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456' ), ( b'dh/12345678/-123456789-123456789-123456789-123456789-hashed' b'----xxxxxxxxx-xxxxxxx4e9e9e384d00929a93b6835fbf976eb32321ff3c' ), ) def testhashedpathsmallesttrucdir(self): # hashed path with smallest truncated 1st dir self.hybridencode( ( b'data/123456789/123456789-123456789-123456789-123456789-hashed' b'----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456' ), ( b'dh/12345678/123456789-123456789-123456789-123456789-hashed' b'----xxxxxxxxx-xxxxxxxx1f4e4ec5f2be76e109bfaa8e31c062fe426d5490' ), ) def testhashedlargesttwountruc(self): # hashed path with largest untruncated two dirs self.hybridencode( ( b'data/12345678/12345678/9-123456789-123456789-123456789-hashed' b'----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456' ), ( b'dh/12345678/12345678/9-123456789-123456789-123456789-hashed' b'----xxxxxxxxx-xxxxxxx3332d8329d969cf835542a9f2cbcfb385b6cf39d' ), ) def testhashedpathsmallesttrunctwodirs(self): # hashed path with smallest truncated two dirs self.hybridencode( ( b'data/123456789/123456789/123456789-123456789-123456789-hashed' b'----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456' ), ( b'dh/12345678/12345678/123456789-123456789-123456789-hashed' b'----xxxxxxxxx-xxxxxxxxx' b'9699559798247dffa18717138859be5f8874840e' ), ) def testhashuntruncthree(self): # hashed path with largest untruncated three dirs self.hybridencode( ( b'data/12345678/12345678/12345678/89-123456789-123456789-' b'hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-' b'123456789-123456' ), ( b'dh/12345678/12345678/12345678/89-123456789-123456789-hashed' b'----xxxxxxxxx-xxxxxxxf0a2b053bb1369cce02f78c217d6a7aaea18c439' ), ) def testhashtruncthree(self): # hashed path with smallest truncated three dirs self.hybridencode( ( b'data/123456789/123456789/123456789/123456789-123456789-hashed' b'----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456' ), ( b'dh/12345678/12345678/12345678/123456789-123456789-hashed' b'----xxxxxxxxx-xxxxxxxxx-' b'1c6f8284967384ec13985a046d3553179d9d03cd' ), ) def testhashuntrucfour(self): # hashed path with largest untruncated four dirs self.hybridencode( ( b'data/12345678/12345678/12345678/12345678/789-123456789-hashed' b'----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456' ), ( b'dh/12345678/12345678/12345678/12345678/789-123456789-hashed' b'----xxxxxxxxx-xxxxxxx0d30c99049d8f0ff97b94d4ef302027e8d54c6fd' ), ) def testhashtruncfour(self): # hashed path with smallest truncated four dirs self.hybridencode( ( b'data/123456789/123456789/123456789/123456789/123456789-hashed' b'----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456' ), ( b'dh/12345678/12345678/12345678/12345678/123456789-hashed' b'----xxxxxxxxx-xxxxxxxxx-x' b'46162779e1a771810b37a737f82ae7ed33771402' ), ) def testhashuntruncfive(self): # hashed path with largest untruncated five dirs self.hybridencode( ( b'data/12345678/12345678/12345678/12345678/12345678/6789-hashed' b'----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456' ), ( b'dh/12345678/12345678/12345678/12345678/12345678/6789-hashed' b'----xxxxxxxxx-xxxxxxxbfe752ddc8b003c2790c66a9f2eb1ea75c114390' ), ) def testhashtruncfive(self): # hashed path with smallest truncated five dirs self.hybridencode( ( b'data/123456789/123456789/123456789/123456789/123456789/hashed' b'----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456' ), ( b'dh/12345678/12345678/12345678/12345678/12345678/hashed' b'----xxxxxxxxx-xxxxxxxxx-xx' b'b94c27b3532fa880cdd572b1c514785cab7b6ff2' ), ) def testhashuntruncsix(self): # hashed path with largest untruncated six dirs self.hybridencode( ( b'data/12345678/12345678/12345678/12345678/12345678/12345678/' b'ed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456' ), ( b'dh/12345678/12345678/12345678/12345678/12345678/12345678/' b'ed----xxxxxxxxx-xxxxxxx' b'cd8cc5483a0f3be409e0e5d4bf9e36e113c59235' ), ) def testhashtruncsix(self): # hashed path with smallest truncated six dirs self.hybridencode( ( b'data/123456789/123456789/123456789/123456789/123456789/' b'123456789/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-' b'123456789-123456' ), ( b'dh/12345678/12345678/12345678/12345678/12345678/12345678/' b'xxxxxxxxx-xxxxxxxxx-xxx' b'47dd6f616f833a142da00701b334cebbf640da06' ), ) def testhashuntrunc7(self): # hashed path with largest untruncated seven dirs self.hybridencode( ( b'data/12345678/12345678/12345678/12345678/12345678/12345678' b'/12345678/xxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-' b'123456789-123456' ), ( b'dh/12345678/12345678/12345678/12345678/12345678/12345678' b'/12345678/xxxxxx-xxxxxxx' b'1c8ed635229fc22efe51035feeadeb4c8a0ecb82' ), ) def testhashtrunc7(self): # hashed path with smallest truncated seven dirs self.hybridencode( ( b'data/123456789/123456789/123456789/123456789/123456789/' b'123456789/123456789/' b'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456' ), ( b'dh/12345678/12345678/12345678/12345678/12345678/12345678/123' b'45678/xxxxxxxxx-xxxx298ff7d33f8ce6db57930837ffea2fb2f48bb926' ), ) def testhashuntrunc8(self): # hashed path with largest untruncated eight dirs # (directory 8 is dropped because it hits _maxshortdirslen) self.hybridencode( ( b'data/12345678/12345678/12345678/12345678/12345678/12345678/' b'12345678/12345678/xxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456' ), ( b'dh/12345678/12345678/12345678/12345678/12345678/12345678/1' b'2345678/xxxxxxx-xxxxxxc8996ccd41b471f768057181a4d59d2febe7277d' ), ) def testhashtrunc8(self): # hashed path with smallest truncated eight dirs # (directory 8 is dropped because it hits _maxshortdirslen) self.hybridencode( ( b'data/123456789/123456789/123456789/123456789/123456789/' b'123456789/123456789/123456789/xxxxxxxxx-xxxxxxxxx-' b'123456789-123456' ), ( b'dh/12345678/12345678/12345678/12345678/12345678/12345678' b'/12345678/xxxxxxxxx-xxxx' b'4fa04a839a6bda93e1c21c713f2edcbd16e8890d' ), ) def testhashnondropped8(self): # hashed path with largest non-dropped directory 8 # (just not hitting the _maxshortdirslen boundary) self.hybridencode( ( b'data/12345678/12345678/12345678/12345678/12345678/12345678' b'/12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789' b'-123456' ), ( b'dh/12345678/12345678/12345678/12345678/12345678/12345678' b'/12345678/12345/-xxxxxxx' b'4d43d1ccaa20efbfe99ec779dc063611536ff2c5' ), ) # ...adding one truncated char to dir 1..7 won't drop dir 8 self.hybridencode( ( b'data/12345678x/12345678/12345678/12345678/12345678/12345678' b'/12345678/12345/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456' ), ( b'dh/12345678/12345678/12345678/12345678/12345678/12345678/1234' b'5678/12345/xxxxxxxx0f9efce65189cc60fd90fe4ffd49d7b58bbe0f2e' ), ) self.hybridencode( ( b'data/12345678/12345678x/12345678/12345678/12345678/12345678' b'/12345678/12345/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456' ), ( b'dh/12345678/12345678/12345678/12345678/12345678/12345678/1234' b'5678/12345/xxxxxxxx945ca395708cafdd54a94501859beabd3e243921' ), ) self.hybridencode( ( b'data/12345678/12345678/12345678x/12345678/12345678/12345678/12' b'345678/12345/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456' ), ( b'dh/12345678/12345678/12345678/12345678/12345678/12345678/1234' b'5678/12345/xxxxxxxxac62bf6898c4fd0502146074547c11caa751a327' ), ) self.hybridencode( ( b'data/12345678/12345678/12345678/12345678x/12345678/12345678/12' b'345678/12345/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456' ), ( b'dh/12345678/12345678/12345678/12345678/12345678/12345678/1234' b'5678/12345/xxxxxxxx2ae5a2baed7983fae8974d0ca06c6bf08b9aee92' ), ) self.hybridencode( ( b'data/12345678/12345678/12345678/12345678/12345678x/12345678/' b'12345678/12345/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456' ), ( b'dh/12345678/12345678/12345678/12345678/12345678/12345678/1234' b'5678/12345/xxxxxxxx214aba07b6687532a43d1e9eaf6e88cfca96b68c' ), ) self.hybridencode( ( b'data/12345678/12345678/12345678/12345678/12345678/12345678x' b'/12345678/12345/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456' ), ( b'dh/12345678/12345678/12345678/12345678/12345678/12345678/1234' b'5678/12345/xxxxxxxxe7a022ae82f0f55cf4e0498e55ba59ea4ebb55bf' ), ) self.hybridencode( ( b'data/12345678/12345678/12345678/12345678/12345678/12345678/' b'12345678x/12345/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456' ), ( b'dh/12345678/12345678/12345678/12345678/12345678/12345678/12345' b'678/12345/xxxxxxxxb51ce61164996a80f36ce3cfe64b62d519aedae3' ), ) def testhashedpathshortestdropped8(self): # hashed path with shortest dropped directory 8 # (just hitting the _maxshortdirslen boundary) self.hybridencode( ( b'data/12345678/12345678/12345678/12345678/12345678/12345678' b'/12345678/123456/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-' b'123456789-123456' ), ( b'dh/12345678/12345678/12345678/12345678/12345678/12345678' b'/12345678/xxxxxxxxx-xxxx' b'11fa9873cc6c3215eae864528b5530a04efc6cfe' ), ) def testhashedpathdropsdir8fortrailingdotspace(self): # hashed path that drops dir 8 due to dot or space at end is # encoded, and thus causing to hit _maxshortdirslen self.hybridencode( ( b'data/12345678/12345678/12345678/12345678/12345678/12345678' b'/12345678/1234./-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-' b'123456789-123456' ), ( b'dh/12345678/12345678/12345678/12345678/12345678/12345678' b'/12345678/-xxxxxxxxx-xxx' b'602df9b45bec564e2e1f0645d5140dddcc76ed58' ), ) self.hybridencode( ( b'data/12345678/12345678/12345678/12345678/12345678/12345678' b'/12345678/1234 /-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-' b'123456789-123456' ), ( b'dh/12345678/12345678/12345678/12345678/12345678/12345678' b'/12345678/-xxxxxxxxx-xxx' b'd99ff212bc84b4d1f70cd6b0071e3ef69d4e12ce' ), ) # ... with dir 8 short enough for encoding self.hybridencode( ( b'data/12345678/12345678/12345678/12345678/12345678/12345678' b'/12345678/12./xx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx' b'-123456789-123456' ), ( b'dh/12345678/12345678/12345678/12345678/12345678/12345678' b'/12345678/12~2e/' b'xx-xxxxx7baeb5ed7f14a586ee1cacecdbcbff70032d1b3c' ), ) self.hybridencode( ( b'data/12345678/12345678/12345678/12345678/12345678/12345678' b'/12345678/12 ' b'/xx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456' ), ( b'dh/12345678/12345678/12345678/12345678/12345678/12345678' b'/12345678/12~20/' b'xx-xxxxxcf79ca9795f77d7f75745da36807e5d772bd5182' ), ) def testextensionsreplicatedonhashedpaths(self): # Extensions are replicated on hashed paths. Note that # we only get to encode files that end in .i or .d inside the # store. Encoded filenames are thus bound in length. self.hybridencode( ( b'data/12345678/12345678/12345678/12345678/12345678/12345678/' b'12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3' b'45.i' ), ( b'dh/12345678/12345678/12345678/12345678/12345678/12345678/12' b'345678/12345/-xxxxxc10ad03b5755ed524f5286aab1815dfe07729438.i' ), ) self.hybridencode( ( b'data/12345678/12345678/12345678/12345678/12345678/12345678/' b'12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3' b'45.d' ), ( b'dh/12345678/12345678/12345678/12345678/12345678/12345678/12' b'345678/12345/-xxxxx9eec83381f2b39ef5ac8b4ecdf2c94f7983f57c8.d' ), ) self.hybridencode( ( b'data/12345678/12345678/12345678/12345678/12345678/12345678/' b'12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3' b'456.i' ), ( b'dh/12345678/12345678/12345678/12345678/12345678/12345678/12' b'345678/12345/-xxxxxb7796dc7d175cfb0bb8a7728f58f6ebec9042568.i' ), ) self.hybridencode( ( b'data/12345678/12345678/12345678/12345678/12345678/12345678/' b'12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3' b'4567.i' ), ( b'dh/12345678/12345678/12345678/12345678/12345678/12345678/12' b'345678/12345/-xxxxxb515857a6bfeef017c4894d8df42458ac65d55b8.i' ), ) self.hybridencode( ( b'data/12345678/12345678/12345678/12345678/12345678/12345678/' b'12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3' b'45678.i' ), ( b'dh/12345678/12345678/12345678/12345678/12345678/12345678/12' b'345678/12345/-xxxxxb05a0f247bc0a776211cd6a32ab714fd9cc09f2b.i' ), ) self.hybridencode( ( b'data/12345678/12345678/12345678/12345678/12345678/12345678/' b'12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3' b'456789.i' ), ( b'dh/12345678/12345678/12345678/12345678/12345678/12345678/12' b'345678/12345/-xxxxxf192b48bff08d9e0e12035fb52bc58c70de72c94.i' ), ) self.hybridencode( ( b'data/12345678/12345678/12345678/12345678/12345678/12345678/' b'12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3' b'456789-.i' ), ( b'dh/12345678/12345678/12345678/12345678/12345678/12345678/12' b'345678/12345/-xxxxx435551e0ed4c7b083b9ba83cee916670e02e80ad.i' ), ) self.hybridencode( ( b'data/12345678/12345678/12345678/12345678/12345678/12345678/' b'12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3' b'456789-1.i' ), ( b'dh/12345678/12345678/12345678/12345678/12345678/12345678/12' b'345678/12345/-xxxxxa7f74eb98d8d58b716356dfd26e2f9aaa65d6a9a.i' ), ) self.hybridencode( ( b'data/12345678/12345678/12345678/12345678/12345678/12345678/' b'12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3' b'456789-12.i' ), ( b'dh/12345678/12345678/12345678/12345678/12345678/12345678/12' b'345678/12345/-xxxxxed68d9bd43b931f0b100267fee488d65a0c66f62.i' ), ) self.hybridencode( ( b'data/12345678/12345678/12345678/12345678/12345678/12345678/' b'12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3' b'456789-123.i' ), ( b'dh/12345678/12345678/12345678/12345678/12345678/12345678/12' b'345678/12345/-xxxxx5cea44de2b642d2ba2b4a30693ffb1049644d698.i' ), ) self.hybridencode( ( b'data/12345678/12345678/12345678/12345678/12345678/12345678/' b'12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3' b'456789-1234.i' ), ( b'dh/12345678/12345678/12345678/12345678/12345678/12345678/12' b'345678/12345/-xxxxx68462f62a7f230b39c1b5400d73ec35920990b7e.i' ), ) self.hybridencode( ( b'data/12345678/12345678/12345678/12345678/12345678/12345678/' b'12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3' b'456789-12345.i' ), ( b'dh/12345678/12345678/12345678/12345678/12345678/12345678/12' b'345678/12345/-xxxxx4cb852a314c6da240a83eec94761cdd71c6ec22e.i' ), ) self.hybridencode( ( b'data/12345678/12345678/12345678/12345678/12345678/12345678/' b'12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3' b'456789-12345-ABCDEFGHIJKLMNOPRSTUVWXYZ-' b'abcdefghjiklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPRSTUVWXYZ' b'-1234567890-xxxxxxxxx-xxxxxxxxx-xxxxxxxx' b'-xxxxxxxxx-wwwwwwwww-wwwwwwwww-wwwwwwwww-wwwwwwwww' b'-wwwwwwwww-wwwwwwwww-wwwwwwwww-wwwwwwwww-wwwwwwwww.i' ), ( b'dh/12345678/12345678/12345678/12345678/12345678/12345678/12' b'345678/12345/-xxxxx93352aa50377751d9e5ebdf52da1e6e69a6887a6.i' ), ) def testpathsoutsidedata(self): # paths outside data/ can be encoded self.hybridencode( b'metadata/dir/00manifest.i', b'metadata/dir/00manifest.i' ) self.hybridencode( ( b'metadata/12345678/12345678/12345678/12345678/12345678' b'/12345678/12345678/12345678/12345678/12345678/12345678' b'/12345678/12345678/00manifest.i' ), ( b'dh/ata/12345678/12345678/12345678/12345678/12345678' b'/12345678/12345678/00manife' b'0a4da1f89aa2aa9eb0896eb451288419049781b4.i' ), ) if __name__ == '__main__': import silenttestrunner silenttestrunner.main(__name__)