tests/test-hybridencode.py
changeset 43076 2372284d9457
parent 37871 6574c81b6831
child 48875 6000f5b25c9b
equal deleted inserted replaced
43075:57875cf423c9 43076:2372284d9457
     1 from __future__ import absolute_import, print_function
     1 from __future__ import absolute_import, print_function
     2 
     2 
     3 import unittest
     3 import unittest
     4 
     4 
     5 from mercurial import (
     5 from mercurial import store
     6     store,
     6 
     7 )
       
     8 
     7 
     9 class hybridencodetests(unittest.TestCase):
     8 class hybridencodetests(unittest.TestCase):
    10     def hybridencode(self, input, want):
     9     def hybridencode(self, input, want):
    11 
    10 
    12         # Check the C implementation if it's in use
    11         # Check the C implementation if it's in use
    17         self.assertEqual(want, refgot)
    16         self.assertEqual(want, refgot)
    18 
    17 
    19     def testnoencodingrequired(self):
    18     def testnoencodingrequired(self):
    20         self.hybridencode(
    19         self.hybridencode(
    21             b'data/abcdefghijklmnopqrstuvwxyz0123456789 !#%&\'()+,-.;=[]^`{}',
    20             b'data/abcdefghijklmnopqrstuvwxyz0123456789 !#%&\'()+,-.;=[]^`{}',
    22             b'data/abcdefghijklmnopqrstuvwxyz0123456789 !#%&\'()+,-.;=[]^`{}')
    21             b'data/abcdefghijklmnopqrstuvwxyz0123456789 !#%&\'()+,-.;=[]^`{}',
    23 
    22         )
    24     def testuppercasechars(self): # uppercase char X is encoded as _x
    23 
       
    24     def testuppercasechars(self):  # uppercase char X is encoded as _x
    25         self.hybridencode(
    25         self.hybridencode(
    26             b'data/ABCDEFGHIJKLMNOPQRSTUVWXYZ',
    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')
    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 
    28         )
    29     def testunderbar(self): # underbar is doubled
    29 
       
    30     def testunderbar(self):  # underbar is doubled
    30         self.hybridencode(b'data/_', b'data/__')
    31         self.hybridencode(b'data/_', b'data/__')
    31 
    32 
    32     def testtilde(self): # tilde is character-encoded
    33     def testtilde(self):  # tilde is character-encoded
    33         self.hybridencode(b'data/~', b'data/~7e')
    34         self.hybridencode(b'data/~', b'data/~7e')
    34 
    35 
    35     def testcontrolchars(self): # characters in ASCII code range 1..31
    36     def testcontrolchars(self):  # characters in ASCII code range 1..31
    36         self.hybridencode(
    37         self.hybridencode(
    37             (b'data/\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f'
    38             (
    38              b'\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e'
    39                 b'data/\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f'
    39              b'\x1f'),
    40                 b'\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e'
    40             (b'data/~01~02~03~04~05~06~07~08~09~0a~0b~0c~0d~0e~0f~10~11~12~13'
    41                 b'\x1f'
    41              b'~14~15~16~17~18~19~1a~1b~1c~1d~1e~1f'))
    42             ),
    42 
    43             (
    43     def testhighascii(self):# characters in ASCII code range 126..255
    44                 b'data/~01~02~03~04~05~06~07~08~09~0a~0b~0c~0d~0e~0f~10~11~12~13'
    44         self.hybridencode(
    45                 b'~14~15~16~17~18~19~1a~1b~1c~1d~1e~1f'
    45             (b'data/~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c'
    46             ),
    46              b'\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b'
    47         )
    47              b'\x9c\x9d\x9e\x9f'),
    48 
    48             (b'data/~7e~7f~80~81~82~83~84~85~86~87~88~89~8a~8b~8c~8d~8e~8f~90'
    49     def testhighascii(self):  # characters in ASCII code range 126..255
    49              b'~91~92~93~94~95~96~97~98~99~9a~9b~9c~9d~9e~9f'))
    50         self.hybridencode(
    50         self.hybridencode(
    51             (
    51             (b'data/\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad'
    52                 b'data/~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c'
    52              b'\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc'
    53                 b'\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b'
    53              b'\xbd\xbe\xbf'),
    54                 b'\x9c\x9d\x9e\x9f'
    54             (b'data/~a0~a1~a2~a3~a4~a5~a6~a7~a8~a9~aa~ab~ac~ad~ae~af~b0~b1~b2'
    55             ),
    55              b'~b3~b4~b5~b6~b7~b8~b9~ba~bb~bc~bd~be~bf'))
    56             (
    56         self.hybridencode(
    57                 b'data/~7e~7f~80~81~82~83~84~85~86~87~88~89~8a~8b~8c~8d~8e~8f~90'
    57             (b'data/\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca'
    58                 b'~91~92~93~94~95~96~97~98~99~9a~9b~9c~9d~9e~9f'
    58              b'\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6'
    59             ),
    59              b'\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf'),
    60         )
    60             (b'data/~c0~c1~c2~c3~c4~c5~c6~c7~c8~c9~ca~cb~cc~cd~ce~cf~d0~d1~d2'
    61         self.hybridencode(
    61              b'~d3~d4~d5~d6~d7~d8~d9~da~db~dc~dd~de~df'))
    62             (
    62         self.hybridencode(
    63                 b'data/\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad'
    63             (b'data/\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed'
    64                 b'\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc'
    64              b'\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd'
    65                 b'\xbd\xbe\xbf'
    65              b'\xfe\xff'),
    66             ),
    66             (b'data/~e0~e1~e2~e3~e4~e5~e6~e7~e8~e9~ea~eb~ec~ed~ee~ef~f0~f1~f2'
    67             (
    67              b'~f3~f4~f5~f6~f7~f8~f9~fa~fb~fc~fd~fe~ff'))
    68                 b'data/~a0~a1~a2~a3~a4~a5~a6~a7~a8~a9~aa~ab~ac~ad~ae~af~b0~b1~b2'
    68 
    69                 b'~b3~b4~b5~b6~b7~b8~b9~ba~bb~bc~bd~be~bf'
    69     def testwinreserved(self): # Windows reserved characters
    70             ),
    70         self.hybridencode(
    71         )
    71             (b'data/less <, greater >, colon :, double-quote ", backslash \\, '
    72         self.hybridencode(
    72              b'pipe |, question-mark ?, asterisk *'),
    73             (
    73             (b'data/less ~3c, greater ~3e, colon ~3a, double-quote ~22, '
    74                 b'data/\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca'
    74              b'backslash ~5c, pipe ~7c, question-mark ~3f, asterisk ~2a'))
    75                 b'\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6'
       
    76                 b'\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf'
       
    77             ),
       
    78             (
       
    79                 b'data/~c0~c1~c2~c3~c4~c5~c6~c7~c8~c9~ca~cb~cc~cd~ce~cf~d0~d1~d2'
       
    80                 b'~d3~d4~d5~d6~d7~d8~d9~da~db~dc~dd~de~df'
       
    81             ),
       
    82         )
       
    83         self.hybridencode(
       
    84             (
       
    85                 b'data/\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed'
       
    86                 b'\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd'
       
    87                 b'\xfe\xff'
       
    88             ),
       
    89             (
       
    90                 b'data/~e0~e1~e2~e3~e4~e5~e6~e7~e8~e9~ea~eb~ec~ed~ee~ef~f0~f1~f2'
       
    91                 b'~f3~f4~f5~f6~f7~f8~f9~fa~fb~fc~fd~fe~ff'
       
    92             ),
       
    93         )
       
    94 
       
    95     def testwinreserved(self):  # Windows reserved characters
       
    96         self.hybridencode(
       
    97             (
       
    98                 b'data/less <, greater >, colon :, double-quote ", backslash \\, '
       
    99                 b'pipe |, question-mark ?, asterisk *'
       
   100             ),
       
   101             (
       
   102                 b'data/less ~3c, greater ~3e, colon ~3a, double-quote ~22, '
       
   103                 b'backslash ~5c, pipe ~7c, question-mark ~3f, asterisk ~2a'
       
   104             ),
       
   105         )
    75 
   106 
    76     def testhgreserved(self):
   107     def testhgreserved(self):
    77         # encoding directories ending in .hg, .i or .d with '.hg' suffix
   108         # 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',
   109         self.hybridencode(
    79                           b'data/x.h.i.hg/x.hg.hg/x.i.hg/x.d.hg/foo')
   110             b'data/x.h.i/x.hg/x.i/x.d/foo',
    80         self.hybridencode(b'data/a.hg/a.i/a.d/foo',
   111             b'data/x.h.i.hg/x.hg.hg/x.i.hg/x.d.hg/foo',
    81                           b'data/a.hg.hg/a.i.hg/a.d.hg/foo')
   112         )
    82         self.hybridencode(b'data/au.hg/au.i/au.d/foo',
   113         self.hybridencode(
    83                           b'data/au.hg.hg/au.i.hg/au.d.hg/foo')
   114             b'data/a.hg/a.i/a.d/foo', b'data/a.hg.hg/a.i.hg/a.d.hg/foo'
    84         self.hybridencode(b'data/aux.hg/aux.i/aux.d/foo',
   115         )
    85                           b'data/au~78.hg.hg/au~78.i.hg/au~78.d.hg/foo')
   116         self.hybridencode(
    86         self.hybridencode(b'data/auxy.hg/auxy.i/auxy.d/foo',
   117             b'data/au.hg/au.i/au.d/foo', b'data/au.hg.hg/au.i.hg/au.d.hg/foo'
    87                           b'data/auxy.hg.hg/auxy.i.hg/auxy.d.hg/foo')
   118         )
       
   119         self.hybridencode(
       
   120             b'data/aux.hg/aux.i/aux.d/foo',
       
   121             b'data/au~78.hg.hg/au~78.i.hg/au~78.d.hg/foo',
       
   122         )
       
   123         self.hybridencode(
       
   124             b'data/auxy.hg/auxy.i/auxy.d/foo',
       
   125             b'data/auxy.hg.hg/auxy.i.hg/auxy.d.hg/foo',
       
   126         )
    88         # but these are not encoded on *filenames*
   127         # but these are not encoded on *filenames*
    89         self.hybridencode(b'data/foo/x.hg', b'data/foo/x.hg')
   128         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')
   129         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')
   130         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')
   131         self.hybridencode(b'data/foo/a.hg', b'data/foo/a.hg')
   101         self.hybridencode(b'data/foo/auxy.hg', b'data/foo/auxy.hg')
   140         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')
   141         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')
   142         self.hybridencode(b'data/foo/auxy.d', b'data/foo/auxy.d')
   104 
   143 
   105         # plain .hg, .i and .d directories have the leading dot encoded
   144         # plain .hg, .i and .d directories have the leading dot encoded
   106         self.hybridencode(b'data/.hg/.i/.d/foo',
   145         self.hybridencode(
   107                           b'data/~2ehg.hg/~2ei.hg/~2ed.hg/foo')
   146             b'data/.hg/.i/.d/foo', b'data/~2ehg.hg/~2ei.hg/~2ed.hg/foo'
       
   147         )
   108 
   148 
   109     def testmisclongcases(self):
   149     def testmisclongcases(self):
   110         self.hybridencode(
   150         self.hybridencode(
   111             (b'data/aux.bla/bla.aux/prn/PRN/lpt/com3/nul/'
   151             (
   112              b'coma/foo.NUL/normal.c.i'),
   152                 b'data/aux.bla/bla.aux/prn/PRN/lpt/com3/nul/'
   113             (b'data/au~78.bla/bla.aux/pr~6e/_p_r_n/lpt/co~6d3'
   153                 b'coma/foo.NUL/normal.c.i'
   114              b'/nu~6c/coma/foo._n_u_l/normal.c.i'))
   154             ),
   115         self.hybridencode(
   155             (
   116             (b'data/AUX/SECOND/X.PRN/FOURTH/FI:FTH/SIXTH/SEVENTH/EIGHTH/NINETH'
   156                 b'data/au~78.bla/bla.aux/pr~6e/_p_r_n/lpt/co~6d3'
   117              b'/TENTH/ELEVENTH/LOREMIPSUM.TXT.i'),
   157                 b'/nu~6c/coma/foo._n_u_l/normal.c.i'
   118             (b'dh/au~78/second/x.prn/fourth/fi~3afth/sixth/seventh/eighth/'
   158             ),
   119              b'nineth/tenth/loremia20419e358ddff1bf8751e38288aff1d7c32ec05.i'))
   159         )
   120         self.hybridencode(
   160         self.hybridencode(
   121             (b'data/enterprise/openesbaddons/contrib-imola/corba-bc/'
   161             (
   122              b'netbeansplugin/wsdlExtension/src/main/java/META-INF/services'
   162                 b'data/AUX/SECOND/X.PRN/FOURTH/FI:FTH/SIXTH/SEVENTH/EIGHTH/NINETH'
   123              b'/org.netbeans.modules.xml.wsdl.bindingsupport.spi.'
   163                 b'/TENTH/ELEVENTH/LOREMIPSUM.TXT.i'
   124              b'ExtensibilityElementTemplateProvider.i'),
   164             ),
   125             (b'dh/enterpri/openesba/contrib-/corba-bc/netbeans/wsdlexte/src/'
   165             (
   126              b'main/java/org.net7018f27961fdf338a598a40c4683429e7ffb9743.i'))
   166                 b'dh/au~78/second/x.prn/fourth/fi~3afth/sixth/seventh/eighth/'
   127         self.hybridencode(
   167                 b'nineth/tenth/loremia20419e358ddff1bf8751e38288aff1d7c32ec05.i'
   128             (b'data/AUX.THE-QUICK-BROWN-FOX-JU:MPS-OVER-THE-LAZY-DOG-THE-'
   168             ),
   129              b'QUICK-BROWN-FOX-JUMPS-OVER-THE-LAZY-DOG.TXT.i'),
   169         )
   130             (b'dh/au~78.the-quick-brown-fox-ju~3amps-over-the-lazy-dog-the-'
   170         self.hybridencode(
   131              b'quick-brown-fox-jud4dcadd033000ab2b26eb66bae1906bcb15d4a70.i'))
   171             (
   132         self.hybridencode(
   172                 b'data/enterprise/openesbaddons/contrib-imola/corba-bc/'
   133             (b'data/Project Planning/Resources/AnotherLongDirectoryName/Follow'
   173                 b'netbeansplugin/wsdlExtension/src/main/java/META-INF/services'
   134              b'edbyanother/AndAnother/AndThenAnExtremelyLongFileName.txt'),
   174                 b'/org.netbeans.modules.xml.wsdl.bindingsupport.spi.'
   135             (b'dh/project_/resource/anotherl/followed/andanoth/andthenanextrem'
   175                 b'ExtensibilityElementTemplateProvider.i'
   136              b'elylongfilenaf93030515d9849cfdca52937c2204d19f83913e5.txt'))
   176             ),
   137         self.hybridencode(
   177             (
   138             (b'data/Project.Planning/Resources/AnotherLongDirectoryName/Follo'
   178                 b'dh/enterpri/openesba/contrib-/corba-bc/netbeans/wsdlexte/src/'
   139              b'wedbyanother/AndAnother/AndThenAnExtremelyLongFileName.txt'),
   179                 b'main/java/org.net7018f27961fdf338a598a40c4683429e7ffb9743.i'
   140             (b'dh/project_/resource/anotherl/followed/andanoth/andthenanextre'
   180             ),
   141              b'melylongfilena0fd7c506f5c9d58204444fc67e9499006bd2d445.txt'))
   181         )
       
   182         self.hybridencode(
       
   183             (
       
   184                 b'data/AUX.THE-QUICK-BROWN-FOX-JU:MPS-OVER-THE-LAZY-DOG-THE-'
       
   185                 b'QUICK-BROWN-FOX-JUMPS-OVER-THE-LAZY-DOG.TXT.i'
       
   186             ),
       
   187             (
       
   188                 b'dh/au~78.the-quick-brown-fox-ju~3amps-over-the-lazy-dog-the-'
       
   189                 b'quick-brown-fox-jud4dcadd033000ab2b26eb66bae1906bcb15d4a70.i'
       
   190             ),
       
   191         )
       
   192         self.hybridencode(
       
   193             (
       
   194                 b'data/Project Planning/Resources/AnotherLongDirectoryName/Follow'
       
   195                 b'edbyanother/AndAnother/AndThenAnExtremelyLongFileName.txt'
       
   196             ),
       
   197             (
       
   198                 b'dh/project_/resource/anotherl/followed/andanoth/andthenanextrem'
       
   199                 b'elylongfilenaf93030515d9849cfdca52937c2204d19f83913e5.txt'
       
   200             ),
       
   201         )
       
   202         self.hybridencode(
       
   203             (
       
   204                 b'data/Project.Planning/Resources/AnotherLongDirectoryName/Follo'
       
   205                 b'wedbyanother/AndAnother/AndThenAnExtremelyLongFileName.txt'
       
   206             ),
       
   207             (
       
   208                 b'dh/project_/resource/anotherl/followed/andanoth/andthenanextre'
       
   209                 b'melylongfilena0fd7c506f5c9d58204444fc67e9499006bd2d445.txt'
       
   210             ),
       
   211         )
   142         self.hybridencode(
   212         self.hybridencode(
   143             b'data/foo.../foo   / /a./_. /__/.x../    bla/.FOO/something.i',
   213             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/'
   214             (
   145              b'~2e_f_o_o/something.i'))
   215                 b'data/foo..~2e/foo  ~20/~20/a~2e/__.~20/____/~2ex.~2e/~20   bla/'
       
   216                 b'~2e_f_o_o/something.i'
       
   217             ),
       
   218         )
   146         self.hybridencode(
   219         self.hybridencode(
   147             b'data/c/co/com/com0/com1/com2/com3/com4/com5/com6/com7/com8/com9',
   220             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/'
   221             (
   149              b'co~6d7/co~6d8/co~6d9'))
   222                 b'data/c/co/com/com0/co~6d1/co~6d2/co~6d3/co~6d4/co~6d5/co~6d6/'
       
   223                 b'co~6d7/co~6d8/co~6d9'
       
   224             ),
       
   225         )
   150         self.hybridencode(
   226         self.hybridencode(
   151             b'data/C/CO/COM/COM0/COM1/COM2/COM3/COM4/COM5/COM6/COM7/COM8/COM9',
   227             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/'
   228             (
   153              b'_c_o_m5/_c_o_m6/_c_o_m7/_c_o_m8/_c_o_m9'))
   229                 b'data/_c/_c_o/_c_o_m/_c_o_m0/_c_o_m1/_c_o_m2/_c_o_m3/_c_o_m4/'
   154         self.hybridencode(
   230                 b'_c_o_m5/_c_o_m6/_c_o_m7/_c_o_m8/_c_o_m9'
   155             (b'data/c.x/co.x/com.x/com0.x/com1.x/com2.x/com3.x/com4.x/com5.x/'
   231             ),
   156              b'com6.x/com7.x/com8.x/com9.x'),
   232         )
   157             (b'data/c.x/co.x/com.x/com0.x/co~6d1.x/co~6d2.x/co~6d3.x/co~6d4.x'
   233         self.hybridencode(
   158              b'/co~6d5.x/co~6d6.x/co~6d7.x/co~6d8.x/co~6d9.x'))
   234             (
   159         self.hybridencode(
   235                 b'data/c.x/co.x/com.x/com0.x/com1.x/com2.x/com3.x/com4.x/com5.x/'
   160             (b'data/x.c/x.co/x.com0/x.com1/x.com2/x.com3/x.com4/x.com5/x.com6'
   236                 b'com6.x/com7.x/com8.x/com9.x'
   161              b'/x.com7/x.com8/x.com9'),
   237             ),
   162             (b'data/x.c/x.co/x.com0/x.com1/x.com2/x.com3/x.com4/x.com5/x.com6'
   238             (
   163              b'/x.com7/x.com8/x.com9'))
   239                 b'data/c.x/co.x/com.x/com0.x/co~6d1.x/co~6d2.x/co~6d3.x/co~6d4.x'
   164         self.hybridencode(
   240                 b'/co~6d5.x/co~6d6.x/co~6d7.x/co~6d8.x/co~6d9.x'
   165             (b'data/cx/cox/comx/com0x/com1x/com2x/com3x/com4x/com5x/com6x/'
   241             ),
   166              b'com7x/com8x/com9x'),
   242         )
   167             (b'data/cx/cox/comx/com0x/com1x/com2x/com3x/com4x/com5x/com6x/'
   243         self.hybridencode(
   168              b'com7x/com8x/com9x'))
   244             (
   169         self.hybridencode(
   245                 b'data/x.c/x.co/x.com0/x.com1/x.com2/x.com3/x.com4/x.com5/x.com6'
   170             (b'data/xc/xco/xcom0/xcom1/xcom2/xcom3/xcom4/xcom5/xcom6/xcom7/'
   246                 b'/x.com7/x.com8/x.com9'
   171              b'xcom8/xcom9'),
   247             ),
   172             (b'data/xc/xco/xcom0/xcom1/xcom2/xcom3/xcom4/xcom5/xcom6/xcom7/'
   248             (
   173              b'xcom8/xcom9'))
   249                 b'data/x.c/x.co/x.com0/x.com1/x.com2/x.com3/x.com4/x.com5/x.com6'
       
   250                 b'/x.com7/x.com8/x.com9'
       
   251             ),
       
   252         )
       
   253         self.hybridencode(
       
   254             (
       
   255                 b'data/cx/cox/comx/com0x/com1x/com2x/com3x/com4x/com5x/com6x/'
       
   256                 b'com7x/com8x/com9x'
       
   257             ),
       
   258             (
       
   259                 b'data/cx/cox/comx/com0x/com1x/com2x/com3x/com4x/com5x/com6x/'
       
   260                 b'com7x/com8x/com9x'
       
   261             ),
       
   262         )
       
   263         self.hybridencode(
       
   264             (
       
   265                 b'data/xc/xco/xcom0/xcom1/xcom2/xcom3/xcom4/xcom5/xcom6/xcom7/'
       
   266                 b'xcom8/xcom9'
       
   267             ),
       
   268             (
       
   269                 b'data/xc/xco/xcom0/xcom1/xcom2/xcom3/xcom4/xcom5/xcom6/xcom7/'
       
   270                 b'xcom8/xcom9'
       
   271             ),
       
   272         )
   174         self.hybridencode(
   273         self.hybridencode(
   175             b'data/l/lp/lpt/lpt0/lpt1/lpt2/lpt3/lpt4/lpt5/lpt6/lpt7/lpt8/lpt9',
   274             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/'
   275             (
   177              b'lp~747/lp~748/lp~749'))
   276                 b'data/l/lp/lpt/lpt0/lp~741/lp~742/lp~743/lp~744/lp~745/lp~746/'
       
   277                 b'lp~747/lp~748/lp~749'
       
   278             ),
       
   279         )
   178         self.hybridencode(
   280         self.hybridencode(
   179             b'data/L/LP/LPT/LPT0/LPT1/LPT2/LPT3/LPT4/LPT5/LPT6/LPT7/LPT8/LPT9',
   281             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/'
   282             (
   181              b'_l_p_t5/_l_p_t6/_l_p_t7/_l_p_t8/_l_p_t9'))
   283                 b'data/_l/_l_p/_l_p_t/_l_p_t0/_l_p_t1/_l_p_t2/_l_p_t3/_l_p_t4/'
   182         self.hybridencode(
   284                 b'_l_p_t5/_l_p_t6/_l_p_t7/_l_p_t8/_l_p_t9'
   183             (b'data/l.x/lp.x/lpt.x/lpt0.x/lpt1.x/lpt2.x/lpt3.x/lpt4.x/lpt5.x/'
   285             ),
   184              b'lpt6.x/lpt7.x/lpt8.x/lpt9.x'),
   286         )
   185             (b'data/l.x/lp.x/lpt.x/lpt0.x/lp~741.x/lp~742.x/lp~743.x/lp~744.x/'
   287         self.hybridencode(
   186              b'lp~745.x/lp~746.x/lp~747.x/lp~748.x/lp~749.x'))
   288             (
   187         self.hybridencode(
   289                 b'data/l.x/lp.x/lpt.x/lpt0.x/lpt1.x/lpt2.x/lpt3.x/lpt4.x/lpt5.x/'
   188             (b'data/x.l/x.lp/x.lpt/x.lpt0/x.lpt1/x.lpt2/x.lpt3/x.lpt4/x.lpt5/'
   290                 b'lpt6.x/lpt7.x/lpt8.x/lpt9.x'
   189              b'x.lpt6/x.lpt7/x.lpt8/x.lpt9'),
   291             ),
   190             (b'data/x.l/x.lp/x.lpt/x.lpt0/x.lpt1/x.lpt2/x.lpt3/x.lpt4/x.lpt5'
   292             (
   191              b'/x.lpt6/x.lpt7/x.lpt8/x.lpt9'))
   293                 b'data/l.x/lp.x/lpt.x/lpt0.x/lp~741.x/lp~742.x/lp~743.x/lp~744.x/'
   192         self.hybridencode(
   294                 b'lp~745.x/lp~746.x/lp~747.x/lp~748.x/lp~749.x'
   193             (b'data/lx/lpx/lptx/lpt0x/lpt1x/lpt2x/lpt3x/lpt4x/lpt5x/lpt6x/'
   295             ),
   194              b'lpt7x/lpt8x/lpt9x'),
   296         )
   195             (b'data/lx/lpx/lptx/lpt0x/lpt1x/lpt2x/lpt3x/lpt4x/lpt5x/lpt6x/'
   297         self.hybridencode(
   196              b'lpt7x/lpt8x/lpt9x'))
   298             (
   197         self.hybridencode(
   299                 b'data/x.l/x.lp/x.lpt/x.lpt0/x.lpt1/x.lpt2/x.lpt3/x.lpt4/x.lpt5/'
   198             (b'data/xl/xlp/xlpt/xlpt0/xlpt1/xlpt2/xlpt3/xlpt4/xlpt5/xlpt6/'
   300                 b'x.lpt6/x.lpt7/x.lpt8/x.lpt9'
   199              b'xlpt7/xlpt8/xlpt9'),
   301             ),
   200             (b'data/xl/xlp/xlpt/xlpt0/xlpt1/xlpt2/xlpt3/xlpt4/xlpt5/xlpt6/'
   302             (
   201              b'xlpt7/xlpt8/xlpt9'))
   303                 b'data/x.l/x.lp/x.lpt/x.lpt0/x.lpt1/x.lpt2/x.lpt3/x.lpt4/x.lpt5'
   202         self.hybridencode(b'data/con/p/pr/prn/a/au/aux/n/nu/nul',
   304                 b'/x.lpt6/x.lpt7/x.lpt8/x.lpt9'
   203                           b'data/co~6e/p/pr/pr~6e/a/au/au~78/n/nu/nu~6c')
   305             ),
       
   306         )
       
   307         self.hybridencode(
       
   308             (
       
   309                 b'data/lx/lpx/lptx/lpt0x/lpt1x/lpt2x/lpt3x/lpt4x/lpt5x/lpt6x/'
       
   310                 b'lpt7x/lpt8x/lpt9x'
       
   311             ),
       
   312             (
       
   313                 b'data/lx/lpx/lptx/lpt0x/lpt1x/lpt2x/lpt3x/lpt4x/lpt5x/lpt6x/'
       
   314                 b'lpt7x/lpt8x/lpt9x'
       
   315             ),
       
   316         )
       
   317         self.hybridencode(
       
   318             (
       
   319                 b'data/xl/xlp/xlpt/xlpt0/xlpt1/xlpt2/xlpt3/xlpt4/xlpt5/xlpt6/'
       
   320                 b'xlpt7/xlpt8/xlpt9'
       
   321             ),
       
   322             (
       
   323                 b'data/xl/xlp/xlpt/xlpt0/xlpt1/xlpt2/xlpt3/xlpt4/xlpt5/xlpt6/'
       
   324                 b'xlpt7/xlpt8/xlpt9'
       
   325             ),
       
   326         )
       
   327         self.hybridencode(
       
   328             b'data/con/p/pr/prn/a/au/aux/n/nu/nul',
       
   329             b'data/co~6e/p/pr/pr~6e/a/au/au~78/n/nu/nu~6c',
       
   330         )
   204         self.hybridencode(
   331         self.hybridencode(
   205             b'data/CON/P/PR/PRN/A/AU/AUX/N/NU/NUL',
   332             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')
   333             b'data/_c_o_n/_p/_p_r/_p_r_n/_a/_a_u/_a_u_x/_n/_n_u/_n_u_l',
       
   334         )
   207         self.hybridencode(
   335         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',
   336             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')
   337             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',
       
   338         )
   210         self.hybridencode(
   339         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',
   340             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')
   341             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',
   342         )
   214                           b'data/conx/px/prx/prnx/ax/au~78/auxx/nx/nux/nulx')
   343         self.hybridencode(
   215         self.hybridencode(b'data/xcon/xp/xpr/xprn/xa/xau/xaux/xn/xnu/xnul',
   344             b'data/conx/px/prx/prnx/ax/aux/auxx/nx/nux/nulx',
   216                           b'data/xcon/xp/xpr/xprn/xa/xau/xaux/xn/xnu/xnul')
   345             b'data/conx/px/prx/prnx/ax/au~78/auxx/nx/nux/nulx',
   217         self.hybridencode(b'data/a./au./aux./auxy./aux.',
   346         )
   218                           b'data/a~2e/au~2e/au~78~2e/auxy~2e/au~78~2e')
   347         self.hybridencode(
   219         self.hybridencode(b'data/c./co./con./cony./con.',
   348             b'data/xcon/xp/xpr/xprn/xa/xau/xaux/xn/xnu/xnul',
   220                           b'data/c~2e/co~2e/co~6e~2e/cony~2e/co~6e~2e')
   349             b'data/xcon/xp/xpr/xprn/xa/xau/xaux/xn/xnu/xnul',
   221         self.hybridencode(b'data/p./pr./prn./prny./prn.',
   350         )
   222                           b'data/p~2e/pr~2e/pr~6e~2e/prny~2e/pr~6e~2e')
   351         self.hybridencode(
   223         self.hybridencode(b'data/n./nu./nul./nuly./nul.',
   352             b'data/a./au./aux./auxy./aux.',
   224                           b'data/n~2e/nu~2e/nu~6c~2e/nuly~2e/nu~6c~2e')
   353             b'data/a~2e/au~2e/au~78~2e/auxy~2e/au~78~2e',
       
   354         )
       
   355         self.hybridencode(
       
   356             b'data/c./co./con./cony./con.',
       
   357             b'data/c~2e/co~2e/co~6e~2e/cony~2e/co~6e~2e',
       
   358         )
       
   359         self.hybridencode(
       
   360             b'data/p./pr./prn./prny./prn.',
       
   361             b'data/p~2e/pr~2e/pr~6e~2e/prny~2e/pr~6e~2e',
       
   362         )
       
   363         self.hybridencode(
       
   364             b'data/n./nu./nul./nuly./nul.',
       
   365             b'data/n~2e/nu~2e/nu~6c~2e/nuly~2e/nu~6c~2e',
       
   366         )
   225         self.hybridencode(
   367         self.hybridencode(
   226             b'data/l./lp./lpt./lpt1./lpt1y./lpt1.',
   368             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')
   369             b'data/l~2e/lp~2e/lpt~2e/lp~741~2e/lpt1y~2e/lp~741~2e',
   228         self.hybridencode(b'data/lpt9./lpt9y./lpt9.',
   370         )
   229                           b'data/lp~749~2e/lpt9y~2e/lp~749~2e')
   371         self.hybridencode(
   230         self.hybridencode(b'data/com./com1./com1y./com1.',
   372             b'data/lpt9./lpt9y./lpt9.', b'data/lp~749~2e/lpt9y~2e/lp~749~2e'
   231                           b'data/com~2e/co~6d1~2e/com1y~2e/co~6d1~2e')
   373         )
   232         self.hybridencode(b'data/com9./com9y./com9.',
   374         self.hybridencode(
   233                           b'data/co~6d9~2e/com9y~2e/co~6d9~2e')
   375             b'data/com./com1./com1y./com1.',
   234         self.hybridencode(b'data/a /au /aux /auxy /aux ',
   376             b'data/com~2e/co~6d1~2e/com1y~2e/co~6d1~2e',
   235                           b'data/a~20/au~20/aux~20/auxy~20/aux~20')
   377         )
       
   378         self.hybridencode(
       
   379             b'data/com9./com9y./com9.', b'data/co~6d9~2e/com9y~2e/co~6d9~2e'
       
   380         )
       
   381         self.hybridencode(
       
   382             b'data/a /au /aux /auxy /aux ',
       
   383             b'data/a~20/au~20/aux~20/auxy~20/aux~20',
       
   384         )
   236 
   385 
   237     def testhashingboundarycases(self):
   386     def testhashingboundarycases(self):
   238         # largest unhashed path
   387         # largest unhashed path
   239         self.hybridencode(
   388         self.hybridencode(
   240             (b'data/123456789-123456789-123456789-123456789-123456789-unhashed'
   389             (
   241              b'--xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345'),
   390                 b'data/123456789-123456789-123456789-123456789-123456789-unhashed'
   242             (b'data/123456789-123456789-123456789-123456789-123456789-unhashed'
   391                 b'--xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345'
   243              b'--xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345'))
   392             ),
       
   393             (
       
   394                 b'data/123456789-123456789-123456789-123456789-123456789-unhashed'
       
   395                 b'--xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345'
       
   396             ),
       
   397         )
   244         # shortest hashed path
   398         # shortest hashed path
   245         self.hybridencode(
   399         self.hybridencode(
   246             (b'data/123456789-123456789-123456789-123456789-123456789-hashed'
   400             (
   247              b'----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'),
   401                 b'data/123456789-123456789-123456789-123456789-123456789-hashed'
   248             (b'dh/123456789-123456789-123456789-123456789-123456789-hashed---'
   402                 b'----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'
   249              b'-xxxxxxxxx-xxxxxxxe9c55002b50bf5181e7a6fc1f60b126e2a6fcf71'))
   403             ),
       
   404             (
       
   405                 b'dh/123456789-123456789-123456789-123456789-123456789-hashed---'
       
   406                 b'-xxxxxxxxx-xxxxxxxe9c55002b50bf5181e7a6fc1f60b126e2a6fcf71'
       
   407             ),
       
   408         )
   250 
   409 
   251     def testhashing(self):
   410     def testhashing(self):
   252         # changing one char in part that's hashed away produces a different hash
   411         # changing one char in part that's hashed away produces a different hash
   253         self.hybridencode(
   412         self.hybridencode(
   254             (b'data/123456789-123456789-123456789-123456789-123456789-hashed'
   413             (
   255              b'----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxy-123456789-123456'),
   414                 b'data/123456789-123456789-123456789-123456789-123456789-hashed'
   256             (b'dh/123456789-123456789-123456789-123456789-123456789-hashed---'
   415                 b'----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxy-123456789-123456'
   257              b'-xxxxxxxxx-xxxxxxxd24fa4455faf8a94350c18e5eace7c2bb17af706'))
   416             ),
       
   417             (
       
   418                 b'dh/123456789-123456789-123456789-123456789-123456789-hashed---'
       
   419                 b'-xxxxxxxxx-xxxxxxxd24fa4455faf8a94350c18e5eace7c2bb17af706'
       
   420             ),
       
   421         )
   258         # uppercase hitting length limit due to encoding
   422         # uppercase hitting length limit due to encoding
   259         self.hybridencode(
   423         self.hybridencode(
   260             (b'data/A23456789-123456789-123456789-123456789-123456789-'
   424             (
   261              b'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   425                 b'data/A23456789-123456789-123456789-123456789-123456789-'
   262              b'123456789-12345'),
   426                 b'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   263             (b'dh/a23456789-123456789-123456789-123456789-123456789-'
   427                 b'123456789-12345'
   264              b'xxxxxxxxx-xxxxxxxxx-xxxxxxx'
   428             ),
   265              b'cbbc657029b41b94ed510d05feb6716a5c03bc6b'))
   429             (
   266         self.hybridencode(
   430                 b'dh/a23456789-123456789-123456789-123456789-123456789-'
   267             (b'data/Z23456789-123456789-123456789-123456789-123456789-'
   431                 b'xxxxxxxxx-xxxxxxxxx-xxxxxxx'
   268              b'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   432                 b'cbbc657029b41b94ed510d05feb6716a5c03bc6b'
   269              b'123456789-12345'),
   433             ),
   270             (b'dh/z23456789-123456789-123456789-123456789-123456789-xxxxxxxxx'
   434         )
   271              b'-xxxxxxxxx-xxxxxxx938f32a725c89512833fb96b6602dd9ebff51ddd'))
   435         self.hybridencode(
       
   436             (
       
   437                 b'data/Z23456789-123456789-123456789-123456789-123456789-'
       
   438                 b'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
       
   439                 b'123456789-12345'
       
   440             ),
       
   441             (
       
   442                 b'dh/z23456789-123456789-123456789-123456789-123456789-xxxxxxxxx'
       
   443                 b'-xxxxxxxxx-xxxxxxx938f32a725c89512833fb96b6602dd9ebff51ddd'
       
   444             ),
       
   445         )
   272         # compare with lowercase not hitting limit
   446         # compare with lowercase not hitting limit
   273         self.hybridencode(
   447         self.hybridencode(
   274             (b'data/a23456789-123456789-123456789-123456789-123456789-'
   448             (
   275              b'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-'
   449                 b'data/a23456789-123456789-123456789-123456789-123456789-'
   276              b'12345'),
   450                 b'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-'
   277             (b'data/a23456789-123456789-123456789-123456789-123456789-'
   451                 b'12345'
   278              b'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-'
   452             ),
   279              b'12345'))
   453             (
   280         self.hybridencode(
   454                 b'data/a23456789-123456789-123456789-123456789-123456789-'
   281             (b'data/z23456789-123456789-123456789-123456789-123456789'
   455                 b'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-'
   282              b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789'
   456                 b'12345'
   283              b'-12345'),
   457             ),
   284             (b'data/z23456789-123456789-123456789-123456789-123456789'
   458         )
   285              b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-'
   459         self.hybridencode(
   286              b'12345'))
   460             (
       
   461                 b'data/z23456789-123456789-123456789-123456789-123456789'
       
   462                 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789'
       
   463                 b'-12345'
       
   464             ),
       
   465             (
       
   466                 b'data/z23456789-123456789-123456789-123456789-123456789'
       
   467                 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-'
       
   468                 b'12345'
       
   469             ),
       
   470         )
   287         # not hitting limit with any of these
   471         # not hitting limit with any of these
   288         self.hybridencode(
   472         self.hybridencode(
   289             (b'data/abcdefghijklmnopqrstuvwxyz0123456789 !#%&\'()+,-.;=[]^`{}'
   473             (
   290              b'xxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345'),
   474                 b'data/abcdefghijklmnopqrstuvwxyz0123456789 !#%&\'()+,-.;=[]^`{}'
   291             (b'data/abcdefghijklmnopqrstuvwxyz0123456789 !#%&\'()+,-.;=[]^`{}'
   475                 b'xxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345'
   292              b'xxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345'))
   476             ),
       
   477             (
       
   478                 b'data/abcdefghijklmnopqrstuvwxyz0123456789 !#%&\'()+,-.;=[]^`{}'
       
   479                 b'xxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345'
       
   480             ),
       
   481         )
   293         # underbar hitting length limit due to encoding
   482         # underbar hitting length limit due to encoding
   294         self.hybridencode(
   483         self.hybridencode(
   295             (b'data/_23456789-123456789-123456789-123456789-123456789-'
   484             (
   296              b'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-'
   485                 b'data/_23456789-123456789-123456789-123456789-123456789-'
   297              b'12345'),
   486                 b'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-'
   298             (b'dh/_23456789-123456789-123456789-123456789-123456789-xxxxxxxxx-'
   487                 b'12345'
   299              b'xxxxxxxxx-xxxxxxx9921a01af50feeabc060ce00eee4cba6efc31d2b'))
   488             ),
       
   489             (
       
   490                 b'dh/_23456789-123456789-123456789-123456789-123456789-xxxxxxxxx-'
       
   491                 b'xxxxxxxxx-xxxxxxx9921a01af50feeabc060ce00eee4cba6efc31d2b'
       
   492             ),
       
   493         )
   300 
   494 
   301         # tilde hitting length limit due to encoding
   495         # tilde hitting length limit due to encoding
   302         self.hybridencode(
   496         self.hybridencode(
   303             (b'data/~23456789-123456789-123456789-123456789-123456789-'
   497             (
   304              b'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-'
   498                 b'data/~23456789-123456789-123456789-123456789-123456789-'
   305              b'12345'),
   499                 b'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-'
   306             (b'dh/~7e23456789-123456789-123456789-123456789-123456789'
   500                 b'12345'
   307              b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
   501             ),
   308              b'9cec6f97d569c10995f785720044ea2e4227481b'))
   502             (
       
   503                 b'dh/~7e23456789-123456789-123456789-123456789-123456789'
       
   504                 b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
       
   505                 b'9cec6f97d569c10995f785720044ea2e4227481b'
       
   506             ),
       
   507         )
   309 
   508 
   310     def testwinreservedoverlimit(self):
   509     def testwinreservedoverlimit(self):
   311         # Windows reserved characters hitting length limit
   510         # Windows reserved characters hitting length limit
   312         self.hybridencode(
   511         self.hybridencode(
   313             (b'data/<23456789-123456789-123456789-123456789-123456789'
   512             (
   314              b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx'
   513                 b'data/<23456789-123456789-123456789-123456789-123456789'
   315              b'-123456789-12345'),
   514                 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx'
   316             (b'dh/~3c23456789-123456789-123456789-123456789-123456789'
   515                 b'-123456789-12345'
   317              b'-xxxxxxxxx-xxxxxxxxx-xxxxxee'
   516             ),
   318              b'67d8f275876ca1ef2500fc542e63c885c4e62d'))
   517             (
   319         self.hybridencode(
   518                 b'dh/~3c23456789-123456789-123456789-123456789-123456789'
   320             (b'data/>23456789-123456789-123456789-123456789-123456789-'
   519                 b'-xxxxxxxxx-xxxxxxxxx-xxxxxee'
   321              b'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   520                 b'67d8f275876ca1ef2500fc542e63c885c4e62d'
   322              b'123456789-12345'),
   521             ),
   323             (b'dh/~3e23456789-123456789-123456789-123456789-123456789'
   522         )
   324              b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
   523         self.hybridencode(
   325              b'387a85a5b1547cc9136310c974df716818458ddb'))
   524             (
   326         self.hybridencode(
   525                 b'data/>23456789-123456789-123456789-123456789-123456789-'
   327             (b'data/:23456789-123456789-123456789-123456789-123456789'
   526                 b'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   328              b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   527                 b'123456789-12345'
   329              b'123456789-12345'),
   528             ),
   330             (b'dh/~3a23456789-123456789-123456789-123456789-123456789'
   529             (
   331              b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
   530                 b'dh/~3e23456789-123456789-123456789-123456789-123456789'
   332              b'2e4154fb571d13d22399c58cc4ef4858e4b75999'))
   531                 b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
   333         self.hybridencode(
   532                 b'387a85a5b1547cc9136310c974df716818458ddb'
   334             (b'data/"23456789-123456789-123456789-123456789-123456789'
   533             ),
   335              b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx'
   534         )
   336              b'-123456789-12345'),
   535         self.hybridencode(
   337             (b'dh/~2223456789-123456789-123456789-123456789-123456789'
   536             (
   338              b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
   537                 b'data/:23456789-123456789-123456789-123456789-123456789'
   339              b'fc7e3ec7b0687ee06ed8c32fef0eb0c1980259f5'))
   538                 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   340         self.hybridencode(
   539                 b'123456789-12345'
   341             (b'data/\\23456789-123456789-123456789-123456789-123456789'
   540             ),
   342              b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   541             (
   343              b'123456789-12345'),
   542                 b'dh/~3a23456789-123456789-123456789-123456789-123456789'
   344             (b'dh/~5c23456789-123456789-123456789-123456789-123456789'
   543                 b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
   345              b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
   544                 b'2e4154fb571d13d22399c58cc4ef4858e4b75999'
   346              b'944e1f2b7110687e116e0d151328ac648b06ab4a'))
   545             ),
   347         self.hybridencode(
   546         )
   348             (b'data/|23456789-123456789-123456789-123456789-123456789'
   547         self.hybridencode(
   349              b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx'
   548             (
   350              b'-123456789-12345'),
   549                 b'data/"23456789-123456789-123456789-123456789-123456789'
   351             (b'dh/~7c23456789-123456789-123456789-123456789-123456789'
   550                 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx'
   352              b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
   551                 b'-123456789-12345'
   353              b'28b23dd3fd0242946334126ab62bcd772aac32f4'))
   552             ),
   354         self.hybridencode(
   553             (
   355             (b'data/?23456789-123456789-123456789-123456789-123456789'
   554                 b'dh/~2223456789-123456789-123456789-123456789-123456789'
   356              b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx'
   555                 b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
   357              b'-123456789-12345'),
   556                 b'fc7e3ec7b0687ee06ed8c32fef0eb0c1980259f5'
   358             (b'dh/~3f23456789-123456789-123456789-123456789-123456789'
   557             ),
   359              b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
   558         )
   360              b'a263022d3994d2143d98f94f431eef8b5e7e0f8a'))
   559         self.hybridencode(
   361         self.hybridencode(
   560             (
   362             (b'data/*23456789-123456789-123456789-123456789-123456789'
   561                 b'data/\\23456789-123456789-123456789-123456789-123456789'
   363              b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   562                 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   364              b'123456789-12345'),
   563                 b'123456789-12345'
   365             (b'dh/~2a23456789-123456789-123456789-123456789-123456789'
   564             ),
   366              b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
   565             (
   367              b'0e7e6020e3c00ba7bb7893d84ca2966fbf53e140'))
   566                 b'dh/~5c23456789-123456789-123456789-123456789-123456789'
       
   567                 b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
       
   568                 b'944e1f2b7110687e116e0d151328ac648b06ab4a'
       
   569             ),
       
   570         )
       
   571         self.hybridencode(
       
   572             (
       
   573                 b'data/|23456789-123456789-123456789-123456789-123456789'
       
   574                 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx'
       
   575                 b'-123456789-12345'
       
   576             ),
       
   577             (
       
   578                 b'dh/~7c23456789-123456789-123456789-123456789-123456789'
       
   579                 b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
       
   580                 b'28b23dd3fd0242946334126ab62bcd772aac32f4'
       
   581             ),
       
   582         )
       
   583         self.hybridencode(
       
   584             (
       
   585                 b'data/?23456789-123456789-123456789-123456789-123456789'
       
   586                 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx'
       
   587                 b'-123456789-12345'
       
   588             ),
       
   589             (
       
   590                 b'dh/~3f23456789-123456789-123456789-123456789-123456789'
       
   591                 b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
       
   592                 b'a263022d3994d2143d98f94f431eef8b5e7e0f8a'
       
   593             ),
       
   594         )
       
   595         self.hybridencode(
       
   596             (
       
   597                 b'data/*23456789-123456789-123456789-123456789-123456789'
       
   598                 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
       
   599                 b'123456789-12345'
       
   600             ),
       
   601             (
       
   602                 b'dh/~2a23456789-123456789-123456789-123456789-123456789'
       
   603                 b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
       
   604                 b'0e7e6020e3c00ba7bb7893d84ca2966fbf53e140'
       
   605             ),
       
   606         )
   368 
   607 
   369     def testinitialspacelenlimit(self):
   608     def testinitialspacelenlimit(self):
   370         # initial space hitting length limit
   609         # initial space hitting length limit
   371         self.hybridencode(
   610         self.hybridencode(
   372             (b'data/ 23456789-123456789-123456789-123456789-123456789'
   611             (
   373              b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   612                 b'data/ 23456789-123456789-123456789-123456789-123456789'
   374              b'123456789-12345'),
   613                 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   375             (b'dh/~2023456789-123456789-123456789-123456789-123456789'
   614                 b'123456789-12345'
   376              b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
   615             ),
   377              b'92acbc78ef8c0b796111629a02601f07d8aec4ea'))
   616             (
       
   617                 b'dh/~2023456789-123456789-123456789-123456789-123456789'
       
   618                 b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
       
   619                 b'92acbc78ef8c0b796111629a02601f07d8aec4ea'
       
   620             ),
       
   621         )
   378 
   622 
   379     def testinitialdotlenlimit(self):
   623     def testinitialdotlenlimit(self):
   380         # initial dot hitting length limit
   624         # initial dot hitting length limit
   381         self.hybridencode(
   625         self.hybridencode(
   382             (b'data/.23456789-123456789-123456789-123456789-123456789'
   626             (
   383              b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx'
   627                 b'data/.23456789-123456789-123456789-123456789-123456789'
   384              b'-123456789-12345'),
   628                 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx'
   385             (b'dh/~2e23456789-123456789-123456789-123456789-123456789'
   629                 b'-123456789-12345'
   386              b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
   630             ),
   387              b'dbe19cc6505b3515ab9228cebf877ad07075168f'))
   631             (
       
   632                 b'dh/~2e23456789-123456789-123456789-123456789-123456789'
       
   633                 b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
       
   634                 b'dbe19cc6505b3515ab9228cebf877ad07075168f'
       
   635             ),
       
   636         )
   388 
   637 
   389     def testtrailingspacelenlimit(self):
   638     def testtrailingspacelenlimit(self):
   390         # trailing space in filename hitting length limit
   639         # trailing space in filename hitting length limit
   391         self.hybridencode(
   640         self.hybridencode(
   392             (b'data/123456789-123456789-123456789-123456789-123456789'
   641             (
   393              b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   642                 b'data/123456789-123456789-123456789-123456789-123456789'
   394              b'123456789-1234 '),
   643                 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   395             (b'dh/123456789-123456789-123456789-123456789-123456789'
   644                 b'123456789-1234 '
   396              b'-xxxxxxxxx-xxxxxxxxx-xxxxxxx'
   645             ),
   397              b'0025dc73e04f97426db4893e3bf67d581dc6d066'))
   646             (
       
   647                 b'dh/123456789-123456789-123456789-123456789-123456789'
       
   648                 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxx'
       
   649                 b'0025dc73e04f97426db4893e3bf67d581dc6d066'
       
   650             ),
       
   651         )
   398 
   652 
   399     def testtrailingdotlenlimit(self):
   653     def testtrailingdotlenlimit(self):
   400         # trailing dot in filename hitting length limit
   654         # trailing dot in filename hitting length limit
   401         self.hybridencode(
   655         self.hybridencode(
   402             (b'data/123456789-123456789-123456789-123456789-123456789'
   656             (
   403              b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-'
   657                 b'data/123456789-123456789-123456789-123456789-123456789'
   404              b'1234.'),
   658                 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-'
   405             (b'dh/123456789-123456789-123456789-123456789-123456789'
   659                 b'1234.'
   406              b'-xxxxxxxxx-xxxxxxxxx-xxxxxxx'
   660             ),
   407              b'85a16cf03ee7feba8a5abc626f1ba9886d01e89d'))
   661             (
       
   662                 b'dh/123456789-123456789-123456789-123456789-123456789'
       
   663                 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxx'
       
   664                 b'85a16cf03ee7feba8a5abc626f1ba9886d01e89d'
       
   665             ),
       
   666         )
   408 
   667 
   409     def testinitialspacedirlenlimit(self):
   668     def testinitialspacedirlenlimit(self):
   410         # initial space in directory hitting length limit
   669         # initial space in directory hitting length limit
   411         self.hybridencode(
   670         self.hybridencode(
   412             (b'data/ x/456789-123456789-123456789-123456789-123456789'
   671             (
   413              b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx'
   672                 b'data/ x/456789-123456789-123456789-123456789-123456789'
   414              b'-123456789-12345'),
   673                 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx'
   415             (b'dh/~20x/456789-123456789-123456789-123456789-123456789'
   674                 b'-123456789-12345'
   416              b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
   675             ),
   417              b'1b3a3b712b2ac00d6af14ae8b4c14fdbf904f516'))
   676             (
       
   677                 b'dh/~20x/456789-123456789-123456789-123456789-123456789'
       
   678                 b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
       
   679                 b'1b3a3b712b2ac00d6af14ae8b4c14fdbf904f516'
       
   680             ),
       
   681         )
   418 
   682 
   419     def testinitialdotdirlenlimit(self):
   683     def testinitialdotdirlenlimit(self):
   420         # initial dot in directory hitting length limit
   684         # initial dot in directory hitting length limit
   421         self.hybridencode(
   685         self.hybridencode(
   422             (b'data/.x/456789-123456789-123456789-123456789-123456789'
   686             (
   423              b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx'
   687                 b'data/.x/456789-123456789-123456789-123456789-123456789'
   424              b'-123456789-12345'),
   688                 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx'
   425             (b'dh/~2ex/456789-123456789-123456789-123456789-123456789'
   689                 b'-123456789-12345'
   426              b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
   690             ),
   427              b'39dbc4c193a5643a8936fc69c3363cd7ac91ab14'))
   691             (
       
   692                 b'dh/~2ex/456789-123456789-123456789-123456789-123456789'
       
   693                 b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
       
   694                 b'39dbc4c193a5643a8936fc69c3363cd7ac91ab14'
       
   695             ),
       
   696         )
   428 
   697 
   429     def testtrailspacedirlenlimit(self):
   698     def testtrailspacedirlenlimit(self):
   430         # trailing space in directory hitting length limit
   699         # trailing space in directory hitting length limit
   431         self.hybridencode(
   700         self.hybridencode(
   432             (b'data/x /456789-123456789-123456789-123456789-123456789'
   701             (
   433              b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx'
   702                 b'data/x /456789-123456789-123456789-123456789-123456789'
   434              b'-123456789-12345'),
   703                 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx'
   435             (b'dh/x~20/456789-123456789-123456789-123456789-123456789'
   704                 b'-123456789-12345'
   436              b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
   705             ),
   437              b'2253c341df0b5290790ad312cd8499850f2273e5'))
   706             (
       
   707                 b'dh/x~20/456789-123456789-123456789-123456789-123456789'
       
   708                 b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
       
   709                 b'2253c341df0b5290790ad312cd8499850f2273e5'
       
   710             ),
       
   711         )
   438 
   712 
   439     def testtrailingdotdirlenlimit(self):
   713     def testtrailingdotdirlenlimit(self):
   440         # trailing dot in directory hitting length limit
   714         # trailing dot in directory hitting length limit
   441         self.hybridencode(
   715         self.hybridencode(
   442             (b'data/x./456789-123456789-123456789-123456789-123456789'
   716             (
   443              b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   717                 b'data/x./456789-123456789-123456789-123456789-123456789'
   444              b'123456789-12345'),
   718                 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   445             (b'dh/x~2e/456789-123456789-123456789-123456789-123456789'
   719                 b'123456789-12345'
   446              b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
   720             ),
   447              b'cc0324d696d34562b44b5138db08ee1594ccc583'))
   721             (
       
   722                 b'dh/x~2e/456789-123456789-123456789-123456789-123456789'
       
   723                 b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
       
   724                 b'cc0324d696d34562b44b5138db08ee1594ccc583'
       
   725             ),
       
   726         )
   448 
   727 
   449     def testdirencodinglenlimit(self):
   728     def testdirencodinglenlimit(self):
   450         # with directories that need direncoding, hitting length limit
   729         # with directories that need direncoding, hitting length limit
   451         self.hybridencode(
   730         self.hybridencode(
   452             (b'data/x.i/56789-123456789-123456789-123456789-123456789'
   731             (
   453              b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-'
   732                 b'data/x.i/56789-123456789-123456789-123456789-123456789'
   454              b'12345'),
   733                 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-'
   455             (b'dh/x.i.hg/56789-123456789-123456789-123456789-123456789'
   734                 b'12345'
   456              b'-xxxxxxxxx-xxxxxxxxx-xxxx'
   735             ),
   457              b'a4c4399bdf81c67dbbbb7060aa0124d8dea94f74'))
   736             (
   458         self.hybridencode(
   737                 b'dh/x.i.hg/56789-123456789-123456789-123456789-123456789'
   459             (b'data/x.d/56789-123456789-123456789-123456789-123456789'
   738                 b'-xxxxxxxxx-xxxxxxxxx-xxxx'
   460              b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx'
   739                 b'a4c4399bdf81c67dbbbb7060aa0124d8dea94f74'
   461              b'-123456789-12345'),
   740             ),
   462             (b'dh/x.d.hg/56789-123456789-123456789-123456789-123456789'
   741         )
   463              b'-xxxxxxxxx-xxxxxxxxx-xxxx'
   742         self.hybridencode(
   464              b'1303fa90473b230615f5b3ea7b660e881ae5270a'))
   743             (
   465         self.hybridencode(
   744                 b'data/x.d/56789-123456789-123456789-123456789-123456789'
   466             (b'data/x.hg/5789-123456789-123456789-123456789-123456789'
   745                 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx'
   467              b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx'
   746                 b'-123456789-12345'
   468              b'-123456789-12345'),
   747             ),
   469             (b'dh/x.hg.hg/5789-123456789-123456789-123456789-123456789'
   748             (
   470              b'-xxxxxxxxx-xxxxxxxxx-xxxx'
   749                 b'dh/x.d.hg/56789-123456789-123456789-123456789-123456789'
   471              b'26d724a8af68e7a4e4455e6602ea9adbd0eb801f'))
   750                 b'-xxxxxxxxx-xxxxxxxxx-xxxx'
       
   751                 b'1303fa90473b230615f5b3ea7b660e881ae5270a'
       
   752             ),
       
   753         )
       
   754         self.hybridencode(
       
   755             (
       
   756                 b'data/x.hg/5789-123456789-123456789-123456789-123456789'
       
   757                 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx'
       
   758                 b'-123456789-12345'
       
   759             ),
       
   760             (
       
   761                 b'dh/x.hg.hg/5789-123456789-123456789-123456789-123456789'
       
   762                 b'-xxxxxxxxx-xxxxxxxxx-xxxx'
       
   763                 b'26d724a8af68e7a4e4455e6602ea9adbd0eb801f'
       
   764             ),
       
   765         )
   472 
   766 
   473     def testwinreservedfilenameslimit(self):
   767     def testwinreservedfilenameslimit(self):
   474         # Windows reserved filenames, hitting length limit
   768         # Windows reserved filenames, hitting length limit
   475         self.hybridencode(
   769         self.hybridencode(
   476             (b'data/con/56789-123456789-123456789-123456789-123456789'
   770             (
   477              b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   771                 b'data/con/56789-123456789-123456789-123456789-123456789'
   478              b'123456789-12345'),
   772                 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   479             (b'dh/co~6e/56789-123456789-123456789-123456789-123456789'
   773                 b'123456789-12345'
   480              b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
   774             ),
   481              b'c0794d4f4c605a2617900eb2563d7113cf6ea7d3'))
   775             (
   482         self.hybridencode(
   776                 b'dh/co~6e/56789-123456789-123456789-123456789-123456789'
   483             (b'data/prn/56789-123456789-123456789-123456789-123456789'
   777                 b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
   484              b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx'
   778                 b'c0794d4f4c605a2617900eb2563d7113cf6ea7d3'
   485              b'-123456789-12345'),
   779             ),
   486             (b'dh/pr~6e/56789-123456789-123456789-123456789-123456789'
   780         )
   487              b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
   781         self.hybridencode(
   488              b'64db876e1a9730e27236cb9b167aff942240e932'))
   782             (
   489         self.hybridencode(
   783                 b'data/prn/56789-123456789-123456789-123456789-123456789'
   490             (b'data/aux/56789-123456789-123456789-123456789-123456789'
   784                 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx'
   491              b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx'
   785                 b'-123456789-12345'
   492              b'-123456789-12345'),
   786             ),
   493             (b'dh/au~78/56789-123456789-123456789-123456789-123456789'
   787             (
   494              b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
   788                 b'dh/pr~6e/56789-123456789-123456789-123456789-123456789'
   495              b'8a178558405ca6fb4bbd75446dfa186f06751a0d'))
   789                 b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
   496         self.hybridencode(
   790                 b'64db876e1a9730e27236cb9b167aff942240e932'
   497             (b'data/nul/56789-123456789-123456789-123456789-123456789'
   791             ),
   498              b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx'
   792         )
   499              b'-123456789-12345'),
   793         self.hybridencode(
   500             (b'dh/nu~6c/56789-123456789-123456789-123456789-123456789'
   794             (
   501              b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
   795                 b'data/aux/56789-123456789-123456789-123456789-123456789'
   502              b'c5e51b6fec1bd07bd243b053a0c3f7209855b886'))
   796                 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx'
   503         self.hybridencode(
   797                 b'-123456789-12345'
   504             (b'data/com1/6789-123456789-123456789-123456789-123456789'
   798             ),
   505              b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx'
   799             (
   506              b'-123456789-12345'),
   800                 b'dh/au~78/56789-123456789-123456789-123456789-123456789'
   507             (b'dh/co~6d1/6789-123456789-123456789-123456789-123456789'
   801                 b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
   508              b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
   802                 b'8a178558405ca6fb4bbd75446dfa186f06751a0d'
   509              b'32f5f44ece3bb62b9327369ca84cc19c86259fcd'))
   803             ),
   510         self.hybridencode(
   804         )
   511             (b'data/com9/6789-123456789-123456789-123456789-123456789'
   805         self.hybridencode(
   512              b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx'
   806             (
   513              b'-123456789-12345'),
   807                 b'data/nul/56789-123456789-123456789-123456789-123456789'
   514             (b'dh/co~6d9/6789-123456789-123456789-123456789-123456789'
   808                 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx'
   515              b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
   809                 b'-123456789-12345'
   516              b'734360b28c66a3230f55849fe8926206d229f990'))
   810             ),
   517         self.hybridencode(
   811             (
   518             (b'data/lpt1/6789-123456789-123456789-123456789-123456789'
   812                 b'dh/nu~6c/56789-123456789-123456789-123456789-123456789'
   519              b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx'
   813                 b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
   520              b'-123456789-12345'),
   814                 b'c5e51b6fec1bd07bd243b053a0c3f7209855b886'
   521             (b'dh/lp~741/6789-123456789-123456789-123456789-123456789'
   815             ),
   522              b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
   816         )
   523              b'e6f16ab4b6b0637676b2842b3345c9836df46ef7'))
   817         self.hybridencode(
   524         self.hybridencode(
   818             (
   525             (b'data/lpt9/6789-123456789-123456789-123456789-123456789'
   819                 b'data/com1/6789-123456789-123456789-123456789-123456789'
   526              b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx'
   820                 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx'
   527              b'-123456789-12345'),
   821                 b'-123456789-12345'
   528             (b'dh/lp~749/6789-123456789-123456789-123456789-123456789'
   822             ),
   529              b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
   823             (
   530              b'a475814c51acead3e44f2ff801f0c4903f986157'))
   824                 b'dh/co~6d1/6789-123456789-123456789-123456789-123456789'
       
   825                 b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
       
   826                 b'32f5f44ece3bb62b9327369ca84cc19c86259fcd'
       
   827             ),
       
   828         )
       
   829         self.hybridencode(
       
   830             (
       
   831                 b'data/com9/6789-123456789-123456789-123456789-123456789'
       
   832                 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx'
       
   833                 b'-123456789-12345'
       
   834             ),
       
   835             (
       
   836                 b'dh/co~6d9/6789-123456789-123456789-123456789-123456789'
       
   837                 b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
       
   838                 b'734360b28c66a3230f55849fe8926206d229f990'
       
   839             ),
       
   840         )
       
   841         self.hybridencode(
       
   842             (
       
   843                 b'data/lpt1/6789-123456789-123456789-123456789-123456789'
       
   844                 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx'
       
   845                 b'-123456789-12345'
       
   846             ),
       
   847             (
       
   848                 b'dh/lp~741/6789-123456789-123456789-123456789-123456789'
       
   849                 b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
       
   850                 b'e6f16ab4b6b0637676b2842b3345c9836df46ef7'
       
   851             ),
       
   852         )
       
   853         self.hybridencode(
       
   854             (
       
   855                 b'data/lpt9/6789-123456789-123456789-123456789-123456789'
       
   856                 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx'
       
   857                 b'-123456789-12345'
       
   858             ),
       
   859             (
       
   860                 b'dh/lp~749/6789-123456789-123456789-123456789-123456789'
       
   861                 b'-xxxxxxxxx-xxxxxxxxx-xxxxx'
       
   862                 b'a475814c51acead3e44f2ff801f0c4903f986157'
       
   863             ),
       
   864         )
   531 
   865 
   532     def testnonreservednolimit(self):
   866     def testnonreservednolimit(self):
   533         # non-reserved names, just not hitting limit
   867         # non-reserved names, just not hitting limit
   534         self.hybridencode(
   868         self.hybridencode(
   535             (b'data/123456789-123456789-123456789-123456789-123456789-'
   869             (
   536              b'/com/com0/lpt/lpt0/'
   870                 b'data/123456789-123456789-123456789-123456789-123456789-'
   537              b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345'),
   871                 b'/com/com0/lpt/lpt0/'
   538             (b'data/123456789-123456789-123456789-123456789-123456789-'
   872                 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345'
   539              b'/com/com0/lpt/lpt0/'
   873             ),
   540              b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345'))
   874             (
       
   875                 b'data/123456789-123456789-123456789-123456789-123456789-'
       
   876                 b'/com/com0/lpt/lpt0/'
       
   877                 b'-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12345'
       
   878             ),
       
   879         )
   541 
   880 
   542     def testhashedpathuntrucfirst(self):
   881     def testhashedpathuntrucfirst(self):
   543         # hashed path with largest untruncated 1st dir
   882         # hashed path with largest untruncated 1st dir
   544         self.hybridencode(
   883         self.hybridencode(
   545             (b'data/12345678/-123456789-123456789-123456789-123456789-hashed'
   884             (
   546              b'----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'),
   885                 b'data/12345678/-123456789-123456789-123456789-123456789-hashed'
   547             (b'dh/12345678/-123456789-123456789-123456789-123456789-hashed'
   886                 b'----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'
   548              b'----xxxxxxxxx-xxxxxxx4e9e9e384d00929a93b6835fbf976eb32321ff3c'))
   887             ),
       
   888             (
       
   889                 b'dh/12345678/-123456789-123456789-123456789-123456789-hashed'
       
   890                 b'----xxxxxxxxx-xxxxxxx4e9e9e384d00929a93b6835fbf976eb32321ff3c'
       
   891             ),
       
   892         )
   549 
   893 
   550     def testhashedpathsmallesttrucdir(self):
   894     def testhashedpathsmallesttrucdir(self):
   551         # hashed path with smallest truncated 1st dir
   895         # hashed path with smallest truncated 1st dir
   552         self.hybridencode(
   896         self.hybridencode(
   553             (b'data/123456789/123456789-123456789-123456789-123456789-hashed'
   897             (
   554              b'----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'),
   898                 b'data/123456789/123456789-123456789-123456789-123456789-hashed'
   555             (b'dh/12345678/123456789-123456789-123456789-123456789-hashed'
   899                 b'----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'
   556              b'----xxxxxxxxx-xxxxxxxx1f4e4ec5f2be76e109bfaa8e31c062fe426d5490'))
   900             ),
       
   901             (
       
   902                 b'dh/12345678/123456789-123456789-123456789-123456789-hashed'
       
   903                 b'----xxxxxxxxx-xxxxxxxx1f4e4ec5f2be76e109bfaa8e31c062fe426d5490'
       
   904             ),
       
   905         )
   557 
   906 
   558     def testhashedlargesttwountruc(self):
   907     def testhashedlargesttwountruc(self):
   559         # hashed path with largest untruncated two dirs
   908         # hashed path with largest untruncated two dirs
   560         self.hybridencode(
   909         self.hybridencode(
   561             (b'data/12345678/12345678/9-123456789-123456789-123456789-hashed'
   910             (
   562              b'----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'),
   911                 b'data/12345678/12345678/9-123456789-123456789-123456789-hashed'
   563             (b'dh/12345678/12345678/9-123456789-123456789-123456789-hashed'
   912                 b'----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'
   564              b'----xxxxxxxxx-xxxxxxx3332d8329d969cf835542a9f2cbcfb385b6cf39d'))
   913             ),
       
   914             (
       
   915                 b'dh/12345678/12345678/9-123456789-123456789-123456789-hashed'
       
   916                 b'----xxxxxxxxx-xxxxxxx3332d8329d969cf835542a9f2cbcfb385b6cf39d'
       
   917             ),
       
   918         )
   565 
   919 
   566     def testhashedpathsmallesttrunctwodirs(self):
   920     def testhashedpathsmallesttrunctwodirs(self):
   567         # hashed path with smallest truncated two dirs
   921         # hashed path with smallest truncated two dirs
   568         self.hybridencode(
   922         self.hybridencode(
   569             (b'data/123456789/123456789/123456789-123456789-123456789-hashed'
   923             (
   570              b'----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'),
   924                 b'data/123456789/123456789/123456789-123456789-123456789-hashed'
   571             (b'dh/12345678/12345678/123456789-123456789-123456789-hashed'
   925                 b'----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'
   572              b'----xxxxxxxxx-xxxxxxxxx'
   926             ),
   573              b'9699559798247dffa18717138859be5f8874840e'))
   927             (
       
   928                 b'dh/12345678/12345678/123456789-123456789-123456789-hashed'
       
   929                 b'----xxxxxxxxx-xxxxxxxxx'
       
   930                 b'9699559798247dffa18717138859be5f8874840e'
       
   931             ),
       
   932         )
   574 
   933 
   575     def testhashuntruncthree(self):
   934     def testhashuntruncthree(self):
   576         # hashed path with largest untruncated three dirs
   935         # hashed path with largest untruncated three dirs
   577         self.hybridencode(
   936         self.hybridencode(
   578             (b'data/12345678/12345678/12345678/89-123456789-123456789-'
   937             (
   579              b'hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   938                 b'data/12345678/12345678/12345678/89-123456789-123456789-'
   580              b'123456789-123456'),
   939                 b'hashed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   581             (b'dh/12345678/12345678/12345678/89-123456789-123456789-hashed'
   940                 b'123456789-123456'
   582              b'----xxxxxxxxx-xxxxxxxf0a2b053bb1369cce02f78c217d6a7aaea18c439'))
   941             ),
       
   942             (
       
   943                 b'dh/12345678/12345678/12345678/89-123456789-123456789-hashed'
       
   944                 b'----xxxxxxxxx-xxxxxxxf0a2b053bb1369cce02f78c217d6a7aaea18c439'
       
   945             ),
       
   946         )
   583 
   947 
   584     def testhashtruncthree(self):
   948     def testhashtruncthree(self):
   585         # hashed path with smallest truncated three dirs
   949         # hashed path with smallest truncated three dirs
   586         self.hybridencode(
   950         self.hybridencode(
   587             (b'data/123456789/123456789/123456789/123456789-123456789-hashed'
   951             (
   588              b'----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'),
   952                 b'data/123456789/123456789/123456789/123456789-123456789-hashed'
   589             (b'dh/12345678/12345678/12345678/123456789-123456789-hashed'
   953                 b'----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'
   590              b'----xxxxxxxxx-xxxxxxxxx-'
   954             ),
   591              b'1c6f8284967384ec13985a046d3553179d9d03cd'))
   955             (
       
   956                 b'dh/12345678/12345678/12345678/123456789-123456789-hashed'
       
   957                 b'----xxxxxxxxx-xxxxxxxxx-'
       
   958                 b'1c6f8284967384ec13985a046d3553179d9d03cd'
       
   959             ),
       
   960         )
   592 
   961 
   593     def testhashuntrucfour(self):
   962     def testhashuntrucfour(self):
   594         # hashed path with largest untruncated four dirs
   963         # hashed path with largest untruncated four dirs
   595         self.hybridencode(
   964         self.hybridencode(
   596             (b'data/12345678/12345678/12345678/12345678/789-123456789-hashed'
   965             (
   597              b'----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'),
   966                 b'data/12345678/12345678/12345678/12345678/789-123456789-hashed'
   598             (b'dh/12345678/12345678/12345678/12345678/789-123456789-hashed'
   967                 b'----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'
   599              b'----xxxxxxxxx-xxxxxxx0d30c99049d8f0ff97b94d4ef302027e8d54c6fd'))
   968             ),
       
   969             (
       
   970                 b'dh/12345678/12345678/12345678/12345678/789-123456789-hashed'
       
   971                 b'----xxxxxxxxx-xxxxxxx0d30c99049d8f0ff97b94d4ef302027e8d54c6fd'
       
   972             ),
       
   973         )
   600 
   974 
   601     def testhashtruncfour(self):
   975     def testhashtruncfour(self):
   602         # hashed path with smallest truncated four dirs
   976         # hashed path with smallest truncated four dirs
   603         self.hybridencode(
   977         self.hybridencode(
   604             (b'data/123456789/123456789/123456789/123456789/123456789-hashed'
   978             (
   605              b'----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'),
   979                 b'data/123456789/123456789/123456789/123456789/123456789-hashed'
   606             (b'dh/12345678/12345678/12345678/12345678/123456789-hashed'
   980                 b'----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'
   607              b'----xxxxxxxxx-xxxxxxxxx-x'
   981             ),
   608              b'46162779e1a771810b37a737f82ae7ed33771402'))
   982             (
       
   983                 b'dh/12345678/12345678/12345678/12345678/123456789-hashed'
       
   984                 b'----xxxxxxxxx-xxxxxxxxx-x'
       
   985                 b'46162779e1a771810b37a737f82ae7ed33771402'
       
   986             ),
       
   987         )
   609 
   988 
   610     def testhashuntruncfive(self):
   989     def testhashuntruncfive(self):
   611         # hashed path with largest untruncated five dirs
   990         # hashed path with largest untruncated five dirs
   612         self.hybridencode(
   991         self.hybridencode(
   613             (b'data/12345678/12345678/12345678/12345678/12345678/6789-hashed'
   992             (
   614              b'----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'),
   993                 b'data/12345678/12345678/12345678/12345678/12345678/6789-hashed'
   615             (b'dh/12345678/12345678/12345678/12345678/12345678/6789-hashed'
   994                 b'----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'
   616              b'----xxxxxxxxx-xxxxxxxbfe752ddc8b003c2790c66a9f2eb1ea75c114390'))
   995             ),
       
   996             (
       
   997                 b'dh/12345678/12345678/12345678/12345678/12345678/6789-hashed'
       
   998                 b'----xxxxxxxxx-xxxxxxxbfe752ddc8b003c2790c66a9f2eb1ea75c114390'
       
   999             ),
       
  1000         )
   617 
  1001 
   618     def testhashtruncfive(self):
  1002     def testhashtruncfive(self):
   619         # hashed path with smallest truncated five dirs
  1003         # hashed path with smallest truncated five dirs
   620         self.hybridencode(
  1004         self.hybridencode(
   621             (b'data/123456789/123456789/123456789/123456789/123456789/hashed'
  1005             (
   622              b'----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'),
  1006                 b'data/123456789/123456789/123456789/123456789/123456789/hashed'
   623             (b'dh/12345678/12345678/12345678/12345678/12345678/hashed'
  1007                 b'----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'
   624              b'----xxxxxxxxx-xxxxxxxxx-xx'
  1008             ),
   625              b'b94c27b3532fa880cdd572b1c514785cab7b6ff2'))
  1009             (
       
  1010                 b'dh/12345678/12345678/12345678/12345678/12345678/hashed'
       
  1011                 b'----xxxxxxxxx-xxxxxxxxx-xx'
       
  1012                 b'b94c27b3532fa880cdd572b1c514785cab7b6ff2'
       
  1013             ),
       
  1014         )
   626 
  1015 
   627     def testhashuntruncsix(self):
  1016     def testhashuntruncsix(self):
   628         # hashed path with largest untruncated six dirs
  1017         # hashed path with largest untruncated six dirs
   629         self.hybridencode(
  1018         self.hybridencode(
   630             (b'data/12345678/12345678/12345678/12345678/12345678/12345678/'
  1019             (
   631              b'ed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'),
  1020                 b'data/12345678/12345678/12345678/12345678/12345678/12345678/'
   632             (b'dh/12345678/12345678/12345678/12345678/12345678/12345678/'
  1021                 b'ed----xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'
   633              b'ed----xxxxxxxxx-xxxxxxx'
  1022             ),
   634              b'cd8cc5483a0f3be409e0e5d4bf9e36e113c59235'))
  1023             (
       
  1024                 b'dh/12345678/12345678/12345678/12345678/12345678/12345678/'
       
  1025                 b'ed----xxxxxxxxx-xxxxxxx'
       
  1026                 b'cd8cc5483a0f3be409e0e5d4bf9e36e113c59235'
       
  1027             ),
       
  1028         )
   635 
  1029 
   636     def testhashtruncsix(self):
  1030     def testhashtruncsix(self):
   637         # hashed path with smallest truncated six dirs
  1031         # hashed path with smallest truncated six dirs
   638         self.hybridencode(
  1032         self.hybridencode(
   639             (b'data/123456789/123456789/123456789/123456789/123456789/'
  1033             (
   640               b'123456789/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
  1034                 b'data/123456789/123456789/123456789/123456789/123456789/'
   641               b'123456789-123456'),
  1035                 b'123456789/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   642             (b'dh/12345678/12345678/12345678/12345678/12345678/12345678/'
  1036                 b'123456789-123456'
   643              b'xxxxxxxxx-xxxxxxxxx-xxx'
  1037             ),
   644              b'47dd6f616f833a142da00701b334cebbf640da06'))
  1038             (
       
  1039                 b'dh/12345678/12345678/12345678/12345678/12345678/12345678/'
       
  1040                 b'xxxxxxxxx-xxxxxxxxx-xxx'
       
  1041                 b'47dd6f616f833a142da00701b334cebbf640da06'
       
  1042             ),
       
  1043         )
   645 
  1044 
   646     def testhashuntrunc7(self):
  1045     def testhashuntrunc7(self):
   647         # hashed path with largest untruncated seven dirs
  1046         # hashed path with largest untruncated seven dirs
   648         self.hybridencode(
  1047         self.hybridencode(
   649             (b'data/12345678/12345678/12345678/12345678/12345678/12345678'
  1048             (
   650              b'/12345678/xxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
  1049                 b'data/12345678/12345678/12345678/12345678/12345678/12345678'
   651              b'123456789-123456'),
  1050                 b'/12345678/xxxxxx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   652             (b'dh/12345678/12345678/12345678/12345678/12345678/12345678'
  1051                 b'123456789-123456'
   653              b'/12345678/xxxxxx-xxxxxxx'
  1052             ),
   654              b'1c8ed635229fc22efe51035feeadeb4c8a0ecb82'))
  1053             (
       
  1054                 b'dh/12345678/12345678/12345678/12345678/12345678/12345678'
       
  1055                 b'/12345678/xxxxxx-xxxxxxx'
       
  1056                 b'1c8ed635229fc22efe51035feeadeb4c8a0ecb82'
       
  1057             ),
       
  1058         )
   655 
  1059 
   656     def testhashtrunc7(self):
  1060     def testhashtrunc7(self):
   657         # hashed path with smallest truncated seven dirs
  1061         # hashed path with smallest truncated seven dirs
   658         self.hybridencode(
  1062         self.hybridencode(
   659             (b'data/123456789/123456789/123456789/123456789/123456789/'
  1063             (
   660               b'123456789/123456789/'
  1064                 b'data/123456789/123456789/123456789/123456789/123456789/'
   661               b'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'),
  1065                 b'123456789/123456789/'
   662             (b'dh/12345678/12345678/12345678/12345678/12345678/12345678/123'
  1066                 b'xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'
   663              b'45678/xxxxxxxxx-xxxx298ff7d33f8ce6db57930837ffea2fb2f48bb926'))
  1067             ),
       
  1068             (
       
  1069                 b'dh/12345678/12345678/12345678/12345678/12345678/12345678/123'
       
  1070                 b'45678/xxxxxxxxx-xxxx298ff7d33f8ce6db57930837ffea2fb2f48bb926'
       
  1071             ),
       
  1072         )
   664 
  1073 
   665     def testhashuntrunc8(self):
  1074     def testhashuntrunc8(self):
   666         # hashed path with largest untruncated eight dirs
  1075         # hashed path with largest untruncated eight dirs
   667         # (directory 8 is dropped because it hits _maxshortdirslen)
  1076         # (directory 8 is dropped because it hits _maxshortdirslen)
   668         self.hybridencode(
  1077         self.hybridencode(
   669             (b'data/12345678/12345678/12345678/12345678/12345678/12345678/'
  1078             (
   670              b'12345678/12345678/xxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'),
  1079                 b'data/12345678/12345678/12345678/12345678/12345678/12345678/'
   671             (b'dh/12345678/12345678/12345678/12345678/12345678/12345678/1'
  1080                 b'12345678/12345678/xxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'
   672              b'2345678/xxxxxxx-xxxxxxc8996ccd41b471f768057181a4d59d2febe7277d'))
  1081             ),
       
  1082             (
       
  1083                 b'dh/12345678/12345678/12345678/12345678/12345678/12345678/1'
       
  1084                 b'2345678/xxxxxxx-xxxxxxc8996ccd41b471f768057181a4d59d2febe7277d'
       
  1085             ),
       
  1086         )
   673 
  1087 
   674     def testhashtrunc8(self):
  1088     def testhashtrunc8(self):
   675         # hashed path with smallest truncated eight dirs
  1089         # hashed path with smallest truncated eight dirs
   676         # (directory 8 is dropped because it hits _maxshortdirslen)
  1090         # (directory 8 is dropped because it hits _maxshortdirslen)
   677         self.hybridencode(
  1091         self.hybridencode(
   678             (b'data/123456789/123456789/123456789/123456789/123456789/'
  1092             (
   679              b'123456789/123456789/123456789/xxxxxxxxx-xxxxxxxxx-'
  1093                 b'data/123456789/123456789/123456789/123456789/123456789/'
   680              b'123456789-123456'),
  1094                 b'123456789/123456789/123456789/xxxxxxxxx-xxxxxxxxx-'
   681             (b'dh/12345678/12345678/12345678/12345678/12345678/12345678'
  1095                 b'123456789-123456'
   682              b'/12345678/xxxxxxxxx-xxxx'
  1096             ),
   683              b'4fa04a839a6bda93e1c21c713f2edcbd16e8890d'))
  1097             (
       
  1098                 b'dh/12345678/12345678/12345678/12345678/12345678/12345678'
       
  1099                 b'/12345678/xxxxxxxxx-xxxx'
       
  1100                 b'4fa04a839a6bda93e1c21c713f2edcbd16e8890d'
       
  1101             ),
       
  1102         )
   684 
  1103 
   685     def testhashnondropped8(self):
  1104     def testhashnondropped8(self):
   686         # hashed path with largest non-dropped directory 8
  1105         # hashed path with largest non-dropped directory 8
   687         # (just not hitting the _maxshortdirslen boundary)
  1106         # (just not hitting the _maxshortdirslen boundary)
   688         self.hybridencode(
  1107         self.hybridencode(
   689             (b'data/12345678/12345678/12345678/12345678/12345678/12345678'
  1108             (
   690              b'/12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789'
  1109                 b'data/12345678/12345678/12345678/12345678/12345678/12345678'
   691              b'-123456'),
  1110                 b'/12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789'
   692             (b'dh/12345678/12345678/12345678/12345678/12345678/12345678'
  1111                 b'-123456'
   693              b'/12345678/12345/-xxxxxxx'
  1112             ),
   694              b'4d43d1ccaa20efbfe99ec779dc063611536ff2c5'))
  1113             (
       
  1114                 b'dh/12345678/12345678/12345678/12345678/12345678/12345678'
       
  1115                 b'/12345678/12345/-xxxxxxx'
       
  1116                 b'4d43d1ccaa20efbfe99ec779dc063611536ff2c5'
       
  1117             ),
       
  1118         )
   695         # ...adding one truncated char to dir 1..7 won't drop dir 8
  1119         # ...adding one truncated char to dir 1..7 won't drop dir 8
   696         self.hybridencode(
  1120         self.hybridencode(
   697             (b'data/12345678x/12345678/12345678/12345678/12345678/12345678'
  1121             (
   698              b'/12345678/12345/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'),
  1122                 b'data/12345678x/12345678/12345678/12345678/12345678/12345678'
   699             (b'dh/12345678/12345678/12345678/12345678/12345678/12345678/1234'
  1123                 b'/12345678/12345/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'
   700              b'5678/12345/xxxxxxxx0f9efce65189cc60fd90fe4ffd49d7b58bbe0f2e'))
  1124             ),
   701         self.hybridencode(
  1125             (
   702             (b'data/12345678/12345678x/12345678/12345678/12345678/12345678'
  1126                 b'dh/12345678/12345678/12345678/12345678/12345678/12345678/1234'
   703              b'/12345678/12345/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'),
  1127                 b'5678/12345/xxxxxxxx0f9efce65189cc60fd90fe4ffd49d7b58bbe0f2e'
   704             (b'dh/12345678/12345678/12345678/12345678/12345678/12345678/1234'
  1128             ),
   705              b'5678/12345/xxxxxxxx945ca395708cafdd54a94501859beabd3e243921'))
  1129         )
   706         self.hybridencode(
  1130         self.hybridencode(
   707             (b'data/12345678/12345678/12345678x/12345678/12345678/12345678/12'
  1131             (
   708              b'345678/12345/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'),
  1132                 b'data/12345678/12345678x/12345678/12345678/12345678/12345678'
   709             (b'dh/12345678/12345678/12345678/12345678/12345678/12345678/1234'
  1133                 b'/12345678/12345/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'
   710              b'5678/12345/xxxxxxxxac62bf6898c4fd0502146074547c11caa751a327'))
  1134             ),
   711         self.hybridencode(
  1135             (
   712             (b'data/12345678/12345678/12345678/12345678x/12345678/12345678/12'
  1136                 b'dh/12345678/12345678/12345678/12345678/12345678/12345678/1234'
   713              b'345678/12345/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'),
  1137                 b'5678/12345/xxxxxxxx945ca395708cafdd54a94501859beabd3e243921'
   714             (b'dh/12345678/12345678/12345678/12345678/12345678/12345678/1234'
  1138             ),
   715              b'5678/12345/xxxxxxxx2ae5a2baed7983fae8974d0ca06c6bf08b9aee92'))
  1139         )
   716         self.hybridencode(
  1140         self.hybridencode(
   717             (b'data/12345678/12345678/12345678/12345678/12345678x/12345678/'
  1141             (
   718              b'12345678/12345/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'),
  1142                 b'data/12345678/12345678/12345678x/12345678/12345678/12345678/12'
   719             (b'dh/12345678/12345678/12345678/12345678/12345678/12345678/1234'
  1143                 b'345678/12345/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'
   720              b'5678/12345/xxxxxxxx214aba07b6687532a43d1e9eaf6e88cfca96b68c'))
  1144             ),
   721         self.hybridencode(
  1145             (
   722             (b'data/12345678/12345678/12345678/12345678/12345678/12345678x'
  1146                 b'dh/12345678/12345678/12345678/12345678/12345678/12345678/1234'
   723              b'/12345678/12345/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'),
  1147                 b'5678/12345/xxxxxxxxac62bf6898c4fd0502146074547c11caa751a327'
   724             (b'dh/12345678/12345678/12345678/12345678/12345678/12345678/1234'
  1148             ),
   725              b'5678/12345/xxxxxxxxe7a022ae82f0f55cf4e0498e55ba59ea4ebb55bf'))
  1149         )
   726         self.hybridencode(
  1150         self.hybridencode(
   727             (b'data/12345678/12345678/12345678/12345678/12345678/12345678/'
  1151             (
   728              b'12345678x/12345/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'),
  1152                 b'data/12345678/12345678/12345678/12345678x/12345678/12345678/12'
   729             (b'dh/12345678/12345678/12345678/12345678/12345678/12345678/12345'
  1153                 b'345678/12345/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'
   730              b'678/12345/xxxxxxxxb51ce61164996a80f36ce3cfe64b62d519aedae3'))
  1154             ),
       
  1155             (
       
  1156                 b'dh/12345678/12345678/12345678/12345678/12345678/12345678/1234'
       
  1157                 b'5678/12345/xxxxxxxx2ae5a2baed7983fae8974d0ca06c6bf08b9aee92'
       
  1158             ),
       
  1159         )
       
  1160         self.hybridencode(
       
  1161             (
       
  1162                 b'data/12345678/12345678/12345678/12345678/12345678x/12345678/'
       
  1163                 b'12345678/12345/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'
       
  1164             ),
       
  1165             (
       
  1166                 b'dh/12345678/12345678/12345678/12345678/12345678/12345678/1234'
       
  1167                 b'5678/12345/xxxxxxxx214aba07b6687532a43d1e9eaf6e88cfca96b68c'
       
  1168             ),
       
  1169         )
       
  1170         self.hybridencode(
       
  1171             (
       
  1172                 b'data/12345678/12345678/12345678/12345678/12345678/12345678x'
       
  1173                 b'/12345678/12345/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'
       
  1174             ),
       
  1175             (
       
  1176                 b'dh/12345678/12345678/12345678/12345678/12345678/12345678/1234'
       
  1177                 b'5678/12345/xxxxxxxxe7a022ae82f0f55cf4e0498e55ba59ea4ebb55bf'
       
  1178             ),
       
  1179         )
       
  1180         self.hybridencode(
       
  1181             (
       
  1182                 b'data/12345678/12345678/12345678/12345678/12345678/12345678/'
       
  1183                 b'12345678x/12345/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'
       
  1184             ),
       
  1185             (
       
  1186                 b'dh/12345678/12345678/12345678/12345678/12345678/12345678/12345'
       
  1187                 b'678/12345/xxxxxxxxb51ce61164996a80f36ce3cfe64b62d519aedae3'
       
  1188             ),
       
  1189         )
   731 
  1190 
   732     def testhashedpathshortestdropped8(self):
  1191     def testhashedpathshortestdropped8(self):
   733         # hashed path with shortest dropped directory 8
  1192         # hashed path with shortest dropped directory 8
   734         # (just hitting the _maxshortdirslen boundary)
  1193         # (just hitting the _maxshortdirslen boundary)
   735         self.hybridencode(
  1194         self.hybridencode(
   736             (b'data/12345678/12345678/12345678/12345678/12345678/12345678'
  1195             (
   737              b'/12345678/123456/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
  1196                 b'data/12345678/12345678/12345678/12345678/12345678/12345678'
   738              b'123456789-123456'),
  1197                 b'/12345678/123456/xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   739             (b'dh/12345678/12345678/12345678/12345678/12345678/12345678'
  1198                 b'123456789-123456'
   740              b'/12345678/xxxxxxxxx-xxxx'
  1199             ),
   741              b'11fa9873cc6c3215eae864528b5530a04efc6cfe'))
  1200             (
       
  1201                 b'dh/12345678/12345678/12345678/12345678/12345678/12345678'
       
  1202                 b'/12345678/xxxxxxxxx-xxxx'
       
  1203                 b'11fa9873cc6c3215eae864528b5530a04efc6cfe'
       
  1204             ),
       
  1205         )
   742 
  1206 
   743     def testhashedpathdropsdir8fortrailingdotspace(self):
  1207     def testhashedpathdropsdir8fortrailingdotspace(self):
   744         # hashed path that drops dir 8 due to dot or space at end is
  1208         # hashed path that drops dir 8 due to dot or space at end is
   745         # encoded, and thus causing to hit _maxshortdirslen
  1209         # encoded, and thus causing to hit _maxshortdirslen
   746         self.hybridencode(
  1210         self.hybridencode(
   747             (b'data/12345678/12345678/12345678/12345678/12345678/12345678'
  1211             (
   748              b'/12345678/1234./-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
  1212                 b'data/12345678/12345678/12345678/12345678/12345678/12345678'
   749              b'123456789-123456'),
  1213                 b'/12345678/1234./-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
   750             (b'dh/12345678/12345678/12345678/12345678/12345678/12345678'
  1214                 b'123456789-123456'
   751              b'/12345678/-xxxxxxxxx-xxx'
  1215             ),
   752              b'602df9b45bec564e2e1f0645d5140dddcc76ed58'))
  1216             (
   753         self.hybridencode(
  1217                 b'dh/12345678/12345678/12345678/12345678/12345678/12345678'
   754             (b'data/12345678/12345678/12345678/12345678/12345678/12345678'
  1218                 b'/12345678/-xxxxxxxxx-xxx'
   755              b'/12345678/1234 /-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
  1219                 b'602df9b45bec564e2e1f0645d5140dddcc76ed58'
   756              b'123456789-123456'),
  1220             ),
   757             (b'dh/12345678/12345678/12345678/12345678/12345678/12345678'
  1221         )
   758              b'/12345678/-xxxxxxxxx-xxx'
  1222         self.hybridencode(
   759              b'd99ff212bc84b4d1f70cd6b0071e3ef69d4e12ce'))
  1223             (
       
  1224                 b'data/12345678/12345678/12345678/12345678/12345678/12345678'
       
  1225                 b'/12345678/1234 /-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-'
       
  1226                 b'123456789-123456'
       
  1227             ),
       
  1228             (
       
  1229                 b'dh/12345678/12345678/12345678/12345678/12345678/12345678'
       
  1230                 b'/12345678/-xxxxxxxxx-xxx'
       
  1231                 b'd99ff212bc84b4d1f70cd6b0071e3ef69d4e12ce'
       
  1232             ),
       
  1233         )
   760         # ... with dir 8 short enough for encoding
  1234         # ... with dir 8 short enough for encoding
   761         self.hybridencode(
  1235         self.hybridencode(
   762             (b'data/12345678/12345678/12345678/12345678/12345678/12345678'
  1236             (
   763              b'/12345678/12./xx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx'
  1237                 b'data/12345678/12345678/12345678/12345678/12345678/12345678'
   764              b'-123456789-123456'),
  1238                 b'/12345678/12./xx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx'
   765             (b'dh/12345678/12345678/12345678/12345678/12345678/12345678'
  1239                 b'-123456789-123456'
   766              b'/12345678/12~2e/'
  1240             ),
   767              b'xx-xxxxx7baeb5ed7f14a586ee1cacecdbcbff70032d1b3c'))
  1241             (
   768         self.hybridencode(
  1242                 b'dh/12345678/12345678/12345678/12345678/12345678/12345678'
   769             (b'data/12345678/12345678/12345678/12345678/12345678/12345678'
  1243                 b'/12345678/12~2e/'
   770              b'/12345678/12 '
  1244                 b'xx-xxxxx7baeb5ed7f14a586ee1cacecdbcbff70032d1b3c'
   771              b'/xx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'),
  1245             ),
   772             (b'dh/12345678/12345678/12345678/12345678/12345678/12345678'
  1246         )
   773              b'/12345678/12~20/'
  1247         self.hybridencode(
   774              b'xx-xxxxxcf79ca9795f77d7f75745da36807e5d772bd5182'))
  1248             (
       
  1249                 b'data/12345678/12345678/12345678/12345678/12345678/12345678'
       
  1250                 b'/12345678/12 '
       
  1251                 b'/xx-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-123456'
       
  1252             ),
       
  1253             (
       
  1254                 b'dh/12345678/12345678/12345678/12345678/12345678/12345678'
       
  1255                 b'/12345678/12~20/'
       
  1256                 b'xx-xxxxxcf79ca9795f77d7f75745da36807e5d772bd5182'
       
  1257             ),
       
  1258         )
   775 
  1259 
   776     def testextensionsreplicatedonhashedpaths(self):
  1260     def testextensionsreplicatedonhashedpaths(self):
   777         # Extensions are replicated on hashed paths. Note that
  1261         # Extensions are replicated on hashed paths. Note that
   778         # we only get to encode files that end in .i or .d inside the
  1262         # we only get to encode files that end in .i or .d inside the
   779         # store. Encoded filenames are thus bound in length.
  1263         # store. Encoded filenames are thus bound in length.
   780         self.hybridencode(
  1264         self.hybridencode(
   781             (b'data/12345678/12345678/12345678/12345678/12345678/12345678/'
  1265             (
   782              b'12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3'
  1266                 b'data/12345678/12345678/12345678/12345678/12345678/12345678/'
   783              b'45.i'),
  1267                 b'12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3'
   784             (b'dh/12345678/12345678/12345678/12345678/12345678/12345678/12'
  1268                 b'45.i'
   785              b'345678/12345/-xxxxxc10ad03b5755ed524f5286aab1815dfe07729438.i'))
  1269             ),
   786         self.hybridencode(
  1270             (
   787             (b'data/12345678/12345678/12345678/12345678/12345678/12345678/'
  1271                 b'dh/12345678/12345678/12345678/12345678/12345678/12345678/12'
   788              b'12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3'
  1272                 b'345678/12345/-xxxxxc10ad03b5755ed524f5286aab1815dfe07729438.i'
   789              b'45.d'),
  1273             ),
   790             (b'dh/12345678/12345678/12345678/12345678/12345678/12345678/12'
  1274         )
   791              b'345678/12345/-xxxxx9eec83381f2b39ef5ac8b4ecdf2c94f7983f57c8.d'))
  1275         self.hybridencode(
   792         self.hybridencode(
  1276             (
   793             (b'data/12345678/12345678/12345678/12345678/12345678/12345678/'
  1277                 b'data/12345678/12345678/12345678/12345678/12345678/12345678/'
   794              b'12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3'
  1278                 b'12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3'
   795              b'456.i'),
  1279                 b'45.d'
   796             (b'dh/12345678/12345678/12345678/12345678/12345678/12345678/12'
  1280             ),
   797              b'345678/12345/-xxxxxb7796dc7d175cfb0bb8a7728f58f6ebec9042568.i'))
  1281             (
   798         self.hybridencode(
  1282                 b'dh/12345678/12345678/12345678/12345678/12345678/12345678/12'
   799             (b'data/12345678/12345678/12345678/12345678/12345678/12345678/'
  1283                 b'345678/12345/-xxxxx9eec83381f2b39ef5ac8b4ecdf2c94f7983f57c8.d'
   800              b'12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3'
  1284             ),
   801              b'4567.i'),
  1285         )
   802             (b'dh/12345678/12345678/12345678/12345678/12345678/12345678/12'
  1286         self.hybridencode(
   803              b'345678/12345/-xxxxxb515857a6bfeef017c4894d8df42458ac65d55b8.i'))
  1287             (
   804         self.hybridencode(
  1288                 b'data/12345678/12345678/12345678/12345678/12345678/12345678/'
   805             (b'data/12345678/12345678/12345678/12345678/12345678/12345678/'
  1289                 b'12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3'
   806              b'12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3'
  1290                 b'456.i'
   807              b'45678.i'),
  1291             ),
   808             (b'dh/12345678/12345678/12345678/12345678/12345678/12345678/12'
  1292             (
   809              b'345678/12345/-xxxxxb05a0f247bc0a776211cd6a32ab714fd9cc09f2b.i'))
  1293                 b'dh/12345678/12345678/12345678/12345678/12345678/12345678/12'
   810         self.hybridencode(
  1294                 b'345678/12345/-xxxxxb7796dc7d175cfb0bb8a7728f58f6ebec9042568.i'
   811             (b'data/12345678/12345678/12345678/12345678/12345678/12345678/'
  1295             ),
   812              b'12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3'
  1296         )
   813              b'456789.i'),
  1297         self.hybridencode(
   814             (b'dh/12345678/12345678/12345678/12345678/12345678/12345678/12'
  1298             (
   815              b'345678/12345/-xxxxxf192b48bff08d9e0e12035fb52bc58c70de72c94.i'))
  1299                 b'data/12345678/12345678/12345678/12345678/12345678/12345678/'
   816         self.hybridencode(
  1300                 b'12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3'
   817             (b'data/12345678/12345678/12345678/12345678/12345678/12345678/'
  1301                 b'4567.i'
   818              b'12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3'
  1302             ),
   819              b'456789-.i'),
  1303             (
   820             (b'dh/12345678/12345678/12345678/12345678/12345678/12345678/12'
  1304                 b'dh/12345678/12345678/12345678/12345678/12345678/12345678/12'
   821              b'345678/12345/-xxxxx435551e0ed4c7b083b9ba83cee916670e02e80ad.i'))
  1305                 b'345678/12345/-xxxxxb515857a6bfeef017c4894d8df42458ac65d55b8.i'
   822         self.hybridencode(
  1306             ),
   823             (b'data/12345678/12345678/12345678/12345678/12345678/12345678/'
  1307         )
   824              b'12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3'
  1308         self.hybridencode(
   825              b'456789-1.i'),
  1309             (
   826             (b'dh/12345678/12345678/12345678/12345678/12345678/12345678/12'
  1310                 b'data/12345678/12345678/12345678/12345678/12345678/12345678/'
   827              b'345678/12345/-xxxxxa7f74eb98d8d58b716356dfd26e2f9aaa65d6a9a.i'))
  1311                 b'12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3'
   828         self.hybridencode(
  1312                 b'45678.i'
   829             (b'data/12345678/12345678/12345678/12345678/12345678/12345678/'
  1313             ),
   830              b'12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3'
  1314             (
   831              b'456789-12.i'),
  1315                 b'dh/12345678/12345678/12345678/12345678/12345678/12345678/12'
   832             (b'dh/12345678/12345678/12345678/12345678/12345678/12345678/12'
  1316                 b'345678/12345/-xxxxxb05a0f247bc0a776211cd6a32ab714fd9cc09f2b.i'
   833              b'345678/12345/-xxxxxed68d9bd43b931f0b100267fee488d65a0c66f62.i'))
  1317             ),
   834         self.hybridencode(
  1318         )
   835             (b'data/12345678/12345678/12345678/12345678/12345678/12345678/'
  1319         self.hybridencode(
   836              b'12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3'
  1320             (
   837              b'456789-123.i'),
  1321                 b'data/12345678/12345678/12345678/12345678/12345678/12345678/'
   838             (b'dh/12345678/12345678/12345678/12345678/12345678/12345678/12'
  1322                 b'12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3'
   839              b'345678/12345/-xxxxx5cea44de2b642d2ba2b4a30693ffb1049644d698.i'))
  1323                 b'456789.i'
   840         self.hybridencode(
  1324             ),
   841             (b'data/12345678/12345678/12345678/12345678/12345678/12345678/'
  1325             (
   842              b'12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3'
  1326                 b'dh/12345678/12345678/12345678/12345678/12345678/12345678/12'
   843              b'456789-1234.i'),
  1327                 b'345678/12345/-xxxxxf192b48bff08d9e0e12035fb52bc58c70de72c94.i'
   844             (b'dh/12345678/12345678/12345678/12345678/12345678/12345678/12'
  1328             ),
   845              b'345678/12345/-xxxxx68462f62a7f230b39c1b5400d73ec35920990b7e.i'))
  1329         )
   846         self.hybridencode(
  1330         self.hybridencode(
   847             (b'data/12345678/12345678/12345678/12345678/12345678/12345678/'
  1331             (
   848              b'12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3'
  1332                 b'data/12345678/12345678/12345678/12345678/12345678/12345678/'
   849              b'456789-12345.i'),
  1333                 b'12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3'
   850             (b'dh/12345678/12345678/12345678/12345678/12345678/12345678/12'
  1334                 b'456789-.i'
   851              b'345678/12345/-xxxxx4cb852a314c6da240a83eec94761cdd71c6ec22e.i'))
  1335             ),
   852         self.hybridencode(
  1336             (
   853             (b'data/12345678/12345678/12345678/12345678/12345678/12345678/'
  1337                 b'dh/12345678/12345678/12345678/12345678/12345678/12345678/12'
   854              b'12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3'
  1338                 b'345678/12345/-xxxxx435551e0ed4c7b083b9ba83cee916670e02e80ad.i'
   855              b'456789-12345-ABCDEFGHIJKLMNOPRSTUVWXYZ-'
  1339             ),
   856              b'abcdefghjiklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPRSTUVWXYZ'
  1340         )
   857              b'-1234567890-xxxxxxxxx-xxxxxxxxx-xxxxxxxx'
  1341         self.hybridencode(
   858              b'-xxxxxxxxx-wwwwwwwww-wwwwwwwww-wwwwwwwww-wwwwwwwww'
  1342             (
   859              b'-wwwwwwwww-wwwwwwwww-wwwwwwwww-wwwwwwwww-wwwwwwwww.i'),
  1343                 b'data/12345678/12345678/12345678/12345678/12345678/12345678/'
   860             (b'dh/12345678/12345678/12345678/12345678/12345678/12345678/12'
  1344                 b'12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3'
   861              b'345678/12345/-xxxxx93352aa50377751d9e5ebdf52da1e6e69a6887a6.i'))
  1345                 b'456789-1.i'
       
  1346             ),
       
  1347             (
       
  1348                 b'dh/12345678/12345678/12345678/12345678/12345678/12345678/12'
       
  1349                 b'345678/12345/-xxxxxa7f74eb98d8d58b716356dfd26e2f9aaa65d6a9a.i'
       
  1350             ),
       
  1351         )
       
  1352         self.hybridencode(
       
  1353             (
       
  1354                 b'data/12345678/12345678/12345678/12345678/12345678/12345678/'
       
  1355                 b'12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3'
       
  1356                 b'456789-12.i'
       
  1357             ),
       
  1358             (
       
  1359                 b'dh/12345678/12345678/12345678/12345678/12345678/12345678/12'
       
  1360                 b'345678/12345/-xxxxxed68d9bd43b931f0b100267fee488d65a0c66f62.i'
       
  1361             ),
       
  1362         )
       
  1363         self.hybridencode(
       
  1364             (
       
  1365                 b'data/12345678/12345678/12345678/12345678/12345678/12345678/'
       
  1366                 b'12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3'
       
  1367                 b'456789-123.i'
       
  1368             ),
       
  1369             (
       
  1370                 b'dh/12345678/12345678/12345678/12345678/12345678/12345678/12'
       
  1371                 b'345678/12345/-xxxxx5cea44de2b642d2ba2b4a30693ffb1049644d698.i'
       
  1372             ),
       
  1373         )
       
  1374         self.hybridencode(
       
  1375             (
       
  1376                 b'data/12345678/12345678/12345678/12345678/12345678/12345678/'
       
  1377                 b'12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3'
       
  1378                 b'456789-1234.i'
       
  1379             ),
       
  1380             (
       
  1381                 b'dh/12345678/12345678/12345678/12345678/12345678/12345678/12'
       
  1382                 b'345678/12345/-xxxxx68462f62a7f230b39c1b5400d73ec35920990b7e.i'
       
  1383             ),
       
  1384         )
       
  1385         self.hybridencode(
       
  1386             (
       
  1387                 b'data/12345678/12345678/12345678/12345678/12345678/12345678/'
       
  1388                 b'12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3'
       
  1389                 b'456789-12345.i'
       
  1390             ),
       
  1391             (
       
  1392                 b'dh/12345678/12345678/12345678/12345678/12345678/12345678/12'
       
  1393                 b'345678/12345/-xxxxx4cb852a314c6da240a83eec94761cdd71c6ec22e.i'
       
  1394             ),
       
  1395         )
       
  1396         self.hybridencode(
       
  1397             (
       
  1398                 b'data/12345678/12345678/12345678/12345678/12345678/12345678/'
       
  1399                 b'12345678/12345/-xxxxxxxxx-xxxxxxxxx-xxxxxxxxx-123456789-12.3'
       
  1400                 b'456789-12345-ABCDEFGHIJKLMNOPRSTUVWXYZ-'
       
  1401                 b'abcdefghjiklmnopqrstuvwxyz-ABCDEFGHIJKLMNOPRSTUVWXYZ'
       
  1402                 b'-1234567890-xxxxxxxxx-xxxxxxxxx-xxxxxxxx'
       
  1403                 b'-xxxxxxxxx-wwwwwwwww-wwwwwwwww-wwwwwwwww-wwwwwwwww'
       
  1404                 b'-wwwwwwwww-wwwwwwwww-wwwwwwwww-wwwwwwwww-wwwwwwwww.i'
       
  1405             ),
       
  1406             (
       
  1407                 b'dh/12345678/12345678/12345678/12345678/12345678/12345678/12'
       
  1408                 b'345678/12345/-xxxxx93352aa50377751d9e5ebdf52da1e6e69a6887a6.i'
       
  1409             ),
       
  1410         )
   862 
  1411 
   863     def testpathsoutsidedata(self):
  1412     def testpathsoutsidedata(self):
   864         # paths outside data/ can be encoded
  1413         # paths outside data/ can be encoded
   865         self.hybridencode(b'metadata/dir/00manifest.i',
  1414         self.hybridencode(
   866                           b'metadata/dir/00manifest.i')
  1415             b'metadata/dir/00manifest.i', b'metadata/dir/00manifest.i'
   867         self.hybridencode(
  1416         )
   868             (b'metadata/12345678/12345678/12345678/12345678/12345678'
  1417         self.hybridencode(
   869              b'/12345678/12345678/12345678/12345678/12345678/12345678'
  1418             (
   870              b'/12345678/12345678/00manifest.i'),
  1419                 b'metadata/12345678/12345678/12345678/12345678/12345678'
   871             (b'dh/ata/12345678/12345678/12345678/12345678/12345678'
  1420                 b'/12345678/12345678/12345678/12345678/12345678/12345678'
   872              b'/12345678/12345678/00manife'
  1421                 b'/12345678/12345678/00manifest.i'
   873              b'0a4da1f89aa2aa9eb0896eb451288419049781b4.i'))
  1422             ),
       
  1423             (
       
  1424                 b'dh/ata/12345678/12345678/12345678/12345678/12345678'
       
  1425                 b'/12345678/12345678/00manife'
       
  1426                 b'0a4da1f89aa2aa9eb0896eb451288419049781b4.i'
       
  1427             ),
       
  1428         )
       
  1429 
   874 
  1430 
   875 if __name__ == '__main__':
  1431 if __name__ == '__main__':
   876     import silenttestrunner
  1432     import silenttestrunner
       
  1433 
   877     silenttestrunner.main(__name__)
  1434     silenttestrunner.main(__name__)