28
28
NODE_HEAD = HOSTNAME
29
29
NODE_GATEWAY = 'localhost'
30
30
NODE_DISTANT = '127.0.0.2'
31
- NODE_DIRECT = '127.0.0.3'
32
- NODE_FOREIGN = '127.0.0.4'
31
+ NODE_DISTANT2 = '127.0.0.[2-3]'
32
+ NODE_DIRECT = '127.0.0.4'
33
+ NODE_FOREIGN = '127.0.0.5'
33
34
34
35
35
36
class TEventHandlerBase (object ):
@@ -105,7 +106,7 @@ class TreeWorkerTest(unittest.TestCase):
105
106
"""
106
107
TreeWorkerTest: test TreeWorker
107
108
108
- NODE_HEAD -> NODE_GATEWAY -> NODE_DISTANT
109
+ NODE_HEAD -> NODE_GATEWAY -> NODE_DISTANT2
109
110
-> NODE_DIRECT [defined in topology]
110
111
-> NODE_FOREIGN [not defined in topology]
111
112
@@ -120,7 +121,7 @@ def setUp(self):
120
121
# set task topology
121
122
graph = TopologyGraph ()
122
123
graph .add_route (NodeSet (HOSTNAME ), NodeSet (NODE_GATEWAY ))
123
- graph .add_route (NodeSet (NODE_GATEWAY ), NodeSet (NODE_DISTANT ))
124
+ graph .add_route (NodeSet (NODE_GATEWAY ), NodeSet (NODE_DISTANT2 ))
124
125
graph .add_route (NodeSet (HOSTNAME ), NodeSet (NODE_DIRECT ))
125
126
# NODE_FOREIGN is not included
126
127
self .task .topology = graph .to_tree (HOSTNAME )
@@ -254,12 +255,13 @@ def _tree_run_write(self, target, separate_thread=False):
254
255
if separate_thread :
255
256
task_wait ()
256
257
task_cleanup ()
258
+ target_cnt = len (NodeSet (target ))
257
259
self .assertEqual (teh .ev_start_cnt , 1 )
258
- self .assertEqual (teh .ev_pickup_cnt , 1 )
259
- self .assertEqual (teh .ev_read_cnt , 1 )
260
- self .assertEqual (teh .ev_written_cnt , 1 )
261
- self .assertEqual (teh .ev_written_sz , len ('Lorem Ipsum' ))
262
- self .assertEqual (teh .ev_hup_cnt , 1 )
260
+ self .assertEqual (teh .ev_pickup_cnt , target_cnt )
261
+ self .assertEqual (teh .ev_read_cnt , target_cnt )
262
+ self .assertEqual (teh .ev_written_cnt , target_cnt )
263
+ self .assertEqual (teh .ev_written_sz , target_cnt * len ('Lorem Ipsum' ))
264
+ self .assertEqual (teh .ev_hup_cnt , target_cnt )
263
265
self .assertEqual (teh .ev_timedout_cnt , 0 )
264
266
self .assertEqual (teh .ev_close_cnt , 1 )
265
267
self .assertEqual (teh .last_read , b'Lorem Ipsum' )
@@ -268,6 +270,10 @@ def test_tree_run_write_distant(self):
268
270
"""test tree run with write(), distant target"""
269
271
self ._tree_run_write (NODE_DISTANT )
270
272
273
+ def test_tree_run_write_distant2 (self ):
274
+ """test tree run with write(), distant 2 targets"""
275
+ self ._tree_run_write (NODE_DISTANT2 )
276
+
271
277
def test_tree_run_write_direct (self ):
272
278
"""test tree run with write(), direct target, in topology"""
273
279
self ._tree_run_write (NODE_DIRECT )
@@ -284,6 +290,10 @@ def test_tree_run_write_distant_mt(self):
284
290
"""test tree run with write(), distant target, separate thread"""
285
291
self ._tree_run_write (NODE_DISTANT , separate_thread = True )
286
292
293
+ def test_tree_run_write_distant2_mt (self ):
294
+ """test tree run with write(), distant 2 targets, separate thread"""
295
+ self ._tree_run_write (NODE_DISTANT2 , separate_thread = True )
296
+
287
297
def test_tree_run_write_direct_mt (self ):
288
298
"""test tree run with write(), direct target, in topology, separate thread"""
289
299
self ._tree_run_write (NODE_DIRECT , separate_thread = True )
@@ -303,11 +313,12 @@ def _tree_copy_file(self, target):
303
313
try :
304
314
worker = self .task .copy (srcf .name , dest , nodes = target , handler = teh )
305
315
self .task .run ()
316
+ target_cnt = len (NodeSet (target ))
306
317
self .assertEqual (teh .ev_start_cnt , 1 )
307
- self .assertEqual (teh .ev_pickup_cnt , 1 )
318
+ self .assertEqual (teh .ev_pickup_cnt , target_cnt )
308
319
self .assertEqual (teh .ev_read_cnt , 0 )
309
320
#self.assertEqual(teh.ev_written_cnt, 0) # FIXME
310
- self .assertEqual (teh .ev_hup_cnt , 1 )
321
+ self .assertEqual (teh .ev_hup_cnt , target_cnt )
311
322
self .assertEqual (teh .ev_timedout_cnt , 0 )
312
323
self .assertEqual (teh .ev_close_cnt , 1 )
313
324
with open (dest , 'r' ) as destf :
@@ -319,6 +330,10 @@ def test_tree_copy_file_distant(self):
319
330
"""test tree copy: file, distant target"""
320
331
self ._tree_copy_file (NODE_DISTANT )
321
332
333
+ def test_tree_copy_file_distant2 (self ):
334
+ """test tree copy: file, distant 2 targets"""
335
+ self ._tree_copy_file (NODE_DISTANT2 )
336
+
322
337
def test_tree_copy_file_direct (self ):
323
338
"""test tree copy: file, direct target, in topology"""
324
339
self ._tree_copy_file (NODE_DIRECT )
@@ -346,11 +361,12 @@ def _tree_copy_dir(self, target):
346
361
worker = self .task .copy (srcdir .name , destdir .name + '/' ,
347
362
nodes = target , handler = teh )
348
363
self .task .run ()
364
+ target_cnt = len (NodeSet (target ))
349
365
self .assertEqual (teh .ev_start_cnt , 1 )
350
- self .assertEqual (teh .ev_pickup_cnt , 1 )
366
+ self .assertEqual (teh .ev_pickup_cnt , target_cnt )
351
367
self .assertEqual (teh .ev_read_cnt , 0 )
352
368
#self.assertEqual(teh.ev_written_cnt, 0) # FIXME
353
- self .assertEqual (teh .ev_hup_cnt , 1 )
369
+ self .assertEqual (teh .ev_hup_cnt , target_cnt )
354
370
self .assertEqual (teh .ev_timedout_cnt , 0 )
355
371
self .assertEqual (teh .ev_close_cnt , 1 )
356
372
@@ -370,6 +386,11 @@ def test_tree_copy_dir_distant(self):
370
386
"""test tree copy: directory, distant target"""
371
387
self ._tree_copy_dir (NODE_DISTANT )
372
388
389
+ def test_tree_copy_dir_distant2 (self ):
390
+ """test tree copy: directory, distant 2 targets"""
391
+ self ._tree_copy_dir (NODE_DISTANT2 )
392
+
393
+
373
394
def test_tree_copy_dir_direct (self ):
374
395
"""test tree copy: directory, direct target, in topology"""
375
396
self ._tree_copy_dir (NODE_DIRECT )
@@ -382,37 +403,37 @@ def test_tree_copy_dir_gateway(self):
382
403
"""test tree copy: directory, gateway is target"""
383
404
self ._tree_copy_dir (NODE_GATEWAY )
384
405
385
- def _tree_rcopy_dir (self , target , dirsuffix = None ):
406
+ def _tree_rcopy_dir (self , target ):
386
407
teh = TEventHandler ()
387
408
409
+ b1 = b'Lorem Ipsum Unum' * 100
410
+ b2 = b'Lorem Ipsum Duo' * 100
411
+
388
412
srcdir = make_temp_dir ()
389
413
destdir = make_temp_dir ()
390
- file1 = make_temp_file (b'Lorem Ipsum Unum' , suffix = ".txt" ,
391
- dir = srcdir .name )
392
- file2 = make_temp_file (b'Lorem Ipsum Duo' , suffix = ".txt" ,
393
- dir = srcdir .name )
414
+ file1 = make_temp_file (b1 , suffix = ".txt" , dir = srcdir .name )
415
+ file2 = make_temp_file (b2 , suffix = ".txt" , dir = srcdir .name )
394
416
395
417
try :
396
418
worker = self .task .rcopy (srcdir .name , destdir .name , nodes = target ,
397
419
handler = teh )
398
420
self .task .run ()
421
+ target_cnt = len (NodeSet (target ))
399
422
self .assertEqual (teh .ev_start_cnt , 1 )
400
- self .assertEqual (teh .ev_pickup_cnt , 1 )
423
+ self .assertEqual (teh .ev_pickup_cnt , target_cnt )
401
424
self .assertEqual (teh .ev_read_cnt , 0 )
402
425
#self.assertEqual(teh.ev_written_cnt, 0) # FIXME
403
- self .assertEqual (teh .ev_hup_cnt , 1 )
426
+ self .assertEqual (teh .ev_hup_cnt , target_cnt )
404
427
self .assertEqual (teh .ev_timedout_cnt , 0 )
405
428
self .assertEqual (teh .ev_close_cnt , 1 )
406
429
407
430
# rcopy successful?
408
- if not dirsuffix :
409
- dirsuffix = target
410
- rcopy_dest = join (destdir .name ,
411
- basename (srcdir .name ) + '.' + dirsuffix )
412
- with open (join (rcopy_dest , basename (file1 .name )), 'rb' ) as rfile1 :
413
- self .assertEqual (rfile1 .read (), b'Lorem Ipsum Unum' )
414
- with open (join (rcopy_dest , basename (file2 .name )), 'rb' ) as rfile2 :
415
- self .assertEqual (rfile2 .read (), b'Lorem Ipsum Duo' )
431
+ for tgt in NodeSet (target ):
432
+ rcopy_dest = join (destdir .name , basename (srcdir .name ) + '.' + tgt )
433
+ with open (join (rcopy_dest , basename (file1 .name )), 'rb' ) as rfile1 :
434
+ self .assertEqual (rfile1 .read (), b1 )
435
+ with open (join (rcopy_dest , basename (file2 .name )), 'rb' ) as rfile2 :
436
+ self .assertEqual (rfile2 .read (), b2 )
416
437
finally :
417
438
file1 .close ()
418
439
file2 .close ()
@@ -423,7 +444,11 @@ def test_tree_rcopy_dir_distant(self):
423
444
"""test tree rcopy: directory, distant target"""
424
445
# In distant tree mode, the returned result will include the
425
446
# hostname of the distant host, not target name
426
- self ._tree_rcopy_dir (NODE_DISTANT , dirsuffix = HOSTNAME )
447
+ self ._tree_rcopy_dir (NODE_DISTANT )
448
+
449
+ def test_tree_rcopy_dir_distant2 (self ):
450
+ """test tree rcopy: directory, distant 2 targets"""
451
+ self ._tree_rcopy_dir (NODE_DISTANT2 )
427
452
428
453
def test_tree_rcopy_dir_direct (self ):
429
454
"""test tree rcopy: directory, direct target, in topology"""
@@ -437,6 +462,54 @@ def test_tree_rcopy_dir_gateway(self):
437
462
"""test tree rcopy: directory, gateway is target"""
438
463
self ._tree_rcopy_dir (NODE_GATEWAY )
439
464
465
+ def _tree_rcopy_file (self , target ):
466
+ teh = TEventHandler ()
467
+
468
+ # The file needs to be large enough to test GH#545
469
+ b1 = b'Lorem Ipsum' * 1100000
470
+
471
+ srcdir = make_temp_dir ()
472
+ destdir = make_temp_dir ()
473
+ srcfile = make_temp_file (b1 , suffix = ".txt" , dir = srcdir .name )
474
+
475
+ try :
476
+ worker = self .task .rcopy (srcfile .name , destdir .name , nodes = target , handler = teh )
477
+ self .task .run ()
478
+ target_cnt = len (NodeSet (target ))
479
+ self .assertEqual (teh .ev_start_cnt , 1 )
480
+ self .assertEqual (teh .ev_pickup_cnt , target_cnt )
481
+ self .assertEqual (teh .ev_read_cnt , 0 )
482
+ #self.assertEqual(teh.ev_written_cnt, 0) # FIXME
483
+ self .assertEqual (teh .ev_hup_cnt , target_cnt )
484
+ self .assertEqual (teh .ev_timedout_cnt , 0 )
485
+ self .assertEqual (teh .ev_close_cnt , 1 )
486
+
487
+ # rcopy successful?
488
+ for tgt in NodeSet (target ):
489
+ rcopy_dest = join (destdir .name , basename (srcfile .name ) + '.' + tgt )
490
+ with open (rcopy_dest , 'rb' ) as tfile :
491
+ self .assertEqual (tfile .read (), b1 )
492
+ finally :
493
+ srcfile .close ()
494
+ srcdir .cleanup ()
495
+ destdir .cleanup ()
496
+
497
+ def test_tree_rcopy_file_distant (self ):
498
+ """test tree rcopy: file, distant target"""
499
+ self ._tree_rcopy_file (NODE_DISTANT )
500
+
501
+ def test_tree_rcopy_file_distant2 (self ):
502
+ """test tree rcopy: file, distant 2 targets"""
503
+ self ._tree_rcopy_file (NODE_DISTANT2 )
504
+
505
+ def test_tree_rcopy_file_direct (self ):
506
+ """test tree rcopy: file, direct target, in topology"""
507
+ self ._tree_rcopy_file (NODE_DIRECT )
508
+
509
+ def test_tree_rcopy_file_foreign (self ):
510
+ """test tree rcopy: file, direct target, not in topology"""
511
+ self ._tree_rcopy_file (NODE_FOREIGN )
512
+
440
513
def test_tree_worker_missing_arguments (self ):
441
514
"""test TreeWorker with missing arguments"""
442
515
teh = TEventHandler ()
0 commit comments