@@ -19,6 +19,20 @@ class TestDedup(unittest.TestCase):
19
19
def setUp (self ):
20
20
self .td = tu .get_ramdisk ()
21
21
22
+ # (data, chash, wark)
23
+ self .files = [
24
+ (
25
+ "one" ,
26
+ "BfcDQQeKz2oG1CPSFyD5ZD1flTYm2IoCY23DqeeVgq6w" ,
27
+ "XMbpLRqVdtGmgggqjUI6uSoNMTqZVX4K6zr74XA1BRKc" ,
28
+ ),
29
+ (
30
+ "two" ,
31
+ "ko1Q0eJNq3zKYs_oT83Pn8aVFgonj5G1wK8itwnYL4qj" ,
32
+ "fxvihWlnQIbVbUPr--TxyV41913kPLhXPD1ngXYxDfou" ,
33
+ ),
34
+ ]
35
+
22
36
def tearDown (self ):
23
37
os .chdir (tempfile .gettempdir ())
24
38
shutil .rmtree (self .td )
@@ -40,25 +54,54 @@ def cinit(self):
40
54
if self .fstab :
41
55
self .conn .hsrv .hub .up2k .fstab = self .fstab
42
56
57
+ def test_a (self ):
58
+ file404 = "\n J2EOT"
59
+ f1 , f2 = self .files
60
+ fns = ("f1" , "f2" , "f3" )
61
+ dn = "d"
62
+
63
+ self .conn = None
64
+ self .fstab = None
65
+ for e2d in [True , False ]:
66
+ self .args = Cfg (v = [".::A" ], a = [], e2d = e2d )
67
+ self .reset ()
68
+ self .cinit ()
69
+
70
+ # dupes in parallel
71
+ sfn , hs = self .do_post_hs (dn , fns [0 ], f1 , True )
72
+ for fn in fns [1 :]:
73
+ h , b = self .handshake (dn , fn , f1 )
74
+ self .assertIn (" 422 Unpro" , h )
75
+ self .assertIn ("a different location;" , b )
76
+ self .do_post_data (dn , fns [0 ], f1 , True , sfn , hs )
77
+ if not e2d :
78
+ # dupesched is e2d only; hs into existence
79
+ for fn , data in zip (fns , (f1 [0 ], file404 , file404 )):
80
+ h , b = self .curl ("%s/%s" % ("d" , fn ))
81
+ self .assertEqual (b , data )
82
+ for fn in fns [1 :]:
83
+ h , b = self .do_post_hs (dn , fn , f1 , False )
84
+ for fn in fns :
85
+ h , b = self .curl ("%s/%s" % ("d" , fn ))
86
+ self .assertEqual (b , f1 [0 ])
87
+
88
+ if not e2d :
89
+ continue
90
+
91
+ # overwrite file
92
+ sfn , hs = self .do_post_hs (dn , fns [0 ], f2 , True , replace = True )
93
+ self .do_post_data (dn , fns [0 ], f2 , True , sfn , hs )
94
+ for fn , f in zip (fns , (f2 , f1 , f1 )):
95
+ h , b = self .curl ("%s/%s" % ("d" , fn ))
96
+ self .assertEqual (b , f [0 ])
97
+
43
98
def test (self ):
44
99
quick = True # sufficient for regular smoketests
45
100
# quick = False
46
101
47
102
dirnames = ["d1" , "d2" ]
48
103
filenames = ["f1" , "f2" ]
49
- files = [
50
- (
51
- "one" ,
52
- "BfcDQQeKz2oG1CPSFyD5ZD1flTYm2IoCY23DqeeVgq6w" ,
53
- "XMbpLRqVdtGmgggqjUI6uSoNMTqZVX4K6zr74XA1BRKc" ,
54
- ),
55
- (
56
- "two" ,
57
- "ko1Q0eJNq3zKYs_oT83Pn8aVFgonj5G1wK8itwnYL4qj" ,
58
- "fxvihWlnQIbVbUPr--TxyV41913kPLhXPD1ngXYxDfou" ,
59
- ),
60
- ]
61
- # (data, chash, wark)
104
+ files = self .files
62
105
63
106
self .ctr = 336 if quick else 2016 # estimated total num uploads
64
107
self .conn = None
@@ -127,10 +170,13 @@ def do_tc(self, cm1, cm2, cm3, irm):
127
170
def do_post (self , dn , fn , fi , first ):
128
171
print ("\n \n # do_post" , self .ctr , repr ((dn , fn , fi , first )))
129
172
self .ctr -= 1
173
+ sfn , hs = self .do_post_hs (dn , fn , fi , first )
174
+ return self .do_post_data (dn , fn , fi , first , sfn , hs )
130
175
131
- data , chash , wark = fi
132
- hs = self .handshake (dn , fn , fi )
133
- self .assertEqual (hs ["wark" ], wark )
176
+ def do_post_hs (self , dn , fn , fi , first , replace = False ):
177
+ h , b = self .handshake (dn , fn , fi , replace = replace )
178
+ hs = json .loads (b )
179
+ self .assertEqual (hs ["wark" ], fi [2 ])
134
180
135
181
sfn = hs ["name" ]
136
182
if sfn == fn :
@@ -140,6 +186,10 @@ def do_post(self, dn, fn, fi, first):
140
186
if first :
141
187
raise Exception ("wait what" )
142
188
189
+ return sfn , hs
190
+
191
+ def do_post_data (self , dn , fn , fi , first , sfn , hs ):
192
+ data , chash , wark = fi
143
193
if hs ["hash" ]:
144
194
self .assertEqual (hs ["hash" ][0 ], chash )
145
195
self .put_chunk (dn , wark , chash , data )
@@ -150,16 +200,18 @@ def do_post(self, dn, fn, fi, first):
150
200
self .assertEqual (b , data )
151
201
return sfn
152
202
153
- def handshake (self , dn , fn , fi ):
203
+ def handshake (self , dn , fn , fi , replace = False ):
154
204
hdr = "POST /%s/ HTTP/1.1\r \n Connection: close\r \n Content-Type: text/plain\r \n Content-Length: %d\r \n \r \n "
155
205
msg = {"name" : fn , "size" : 3 , "lmod" : 1234567890 , "life" : 0 , "hash" : [fi [1 ]]}
206
+ if replace :
207
+ msg ["replace" ] = True
156
208
buf = json .dumps (msg ).encode ("utf-8" )
157
209
buf = (hdr % (dn , len (buf ))).encode ("utf-8" ) + buf
158
- print ("HS -->" , buf )
210
+ # print("HS -->", buf)
159
211
HttpCli (self .conn .setbuf (buf )).run ()
160
212
ret = self .conn .s ._reply .decode ("utf-8" ).split ("\r \n \r \n " , 1 )
161
- print ("HS <--" , ret )
162
- return json . loads ( ret [ 1 ])
213
+ # print("HS <--", ret)
214
+ return ret
163
215
164
216
def put_chunk (self , dn , wark , chash , data ):
165
217
msg = [
@@ -173,14 +225,15 @@ def put_chunk(self, dn, wark, chash, data):
173
225
data ,
174
226
]
175
227
buf = "\r \n " .join (msg ).encode ("utf-8" )
176
- print ("PUT -->" , buf )
228
+ # print("PUT -->", buf)
177
229
HttpCli (self .conn .setbuf (buf )).run ()
178
230
ret = self .conn .s ._reply .decode ("utf-8" ).split ("\r \n \r \n " , 1 )
179
231
self .assertEqual (ret [1 ], "thank" )
180
232
181
233
def curl (self , url , binary = False , meth = None ):
182
234
h = "%s /%s HTTP/1.1\r \n Connection: close\r \n \r \n "
183
235
h = h % (meth or "GET" , url )
236
+ # print("CURL -->", url)
184
237
HttpCli (self .conn .setbuf (h .encode ("utf-8" ))).run ()
185
238
if binary :
186
239
h , b = self .conn .s ._reply .split (b"\r \n \r \n " , 1 )
0 commit comments