|
Alejandro Alvarez Ayllon |
3ad7fa1 |
Index: test/functional/test_copy.py
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
===================================================================
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
--- test/functional/test_copy.py (revision 7052)
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+++ test/functional/test_copy.py (revision 7054)
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
@@ -1,6 +1,5 @@
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
import unittest
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
import utils
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
-import shutil
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
import os
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
from base import TestBase
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
@@ -113,5 +112,24 @@
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
os.unlink(dst_path)
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
os.rmdir('/tmp/make/')
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+ def test_copy_pseudotty(self):
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+ """
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+ Regression test for DMC-522
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+ Trick gfal-copy into thinking it is inside a tty so we trigger some logic that would not
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+ be executed otherwise
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+ """
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+ ffname3 = self.ffname1 + "_copy"
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+ self.assertFalse(os.path.isfile(ffname3))
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+ (ret, out, err) = utils.run_command_pty('gfal-copy', \
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+ 'file://' + self.ffname1 + ' file://' + ffname3)
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+ self.assertTrue(os.path.isfile(ffname3))
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+ self.assertNotEqual(len(out), 0) # this makes sure the interactive mode works!
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+ self.assertEqual(ret, 0)
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+ if os.path.isfile(ffname3):
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+ os.remove(ffname3)
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
if __name__ == '__main__':
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
unittest.main()
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
Index: test/functional/utils.py
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
===================================================================
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
--- test/functional/utils.py (revision 7052)
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+++ test/functional/utils.py (revision 7054)
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
@@ -1,6 +1,8 @@
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
import subprocess
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
import datetime
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
import os
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+import pty
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+import select
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
import stat
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
import inspect
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
@@ -8,22 +10,48 @@
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
fout = open(path, 'w')
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
fout.write(os.urandom(size))
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
fout.close()
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
-
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
-
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
def create_random_suffix():
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
return datetime.datetime.now().strftime("%y%m%d_%H%M%S")
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
def remove_file(path):
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
os.remove(path)
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
-
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
def run_command(cmd, args):
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
script_path = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
cmd = script_path + '/../../src/' + cmd
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
p = subprocess.Popen([cmd] + args.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
- out,err = p.communicate()
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
-
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+ out, err = p.communicate()
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
return (p.returncode, out, err)
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+def run_command_pty(cmd, args):
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+ script_path = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+ cmd = script_path + '/../../src/' + cmd
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+ master, slave = pty.openpty()
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+ p = subprocess.Popen([cmd] + args.split(), stdout=slave, stderr=slave, close_fds=True)
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+ os.close(slave)
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+ output = ''
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+ while True:
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+ ready, _, _ = select.select([master], [], [], 1)
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+ if ready:
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+ try:
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+ data = os.read(ready[0], 512)
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+ except:
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+ data = None
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+ if data:
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+ output += data
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+ else:
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+ break
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+ os.close(master)
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+ rstatus = p.wait()
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+ return (rstatus, output, None)
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
def num_entries(directory):
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
return len([name for name in os.listdir(directory)])
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
Index: src/gfal2_util/progress.py
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
===================================================================
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
--- src/gfal2_util/progress.py (revision 7052)
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+++ src/gfal2_util/progress.py (revision 7054)
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
@@ -3,7 +3,7 @@
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
@author: Duarte Meneses <duarte.meneses@cern.ch>
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
"""
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
-import os
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+import subprocess
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
import sys
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
import datetime
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
import math
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
@@ -47,8 +47,10 @@
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
if self.stopped or not self.started:
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
break
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
- self._update()
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
- self.lock.release()
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+ try:
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+ self._update()
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+ finally:
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+ self.lock.release()
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
time.sleep(0.5)
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
self.lock.release()
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
@@ -163,7 +165,7 @@
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
if not self.started:
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
return
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
- if self.t_main.is_alive():
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+ if self.t_main.isAlive():
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
self.lock.acquire()
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
if self.stopped:
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
self.lock.release()
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
@@ -194,7 +196,11 @@
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
@staticmethod
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
def _get_width():
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
- return int(os.popen('stty size', 'r').read().split()[1])
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+ p = subprocess.Popen(['stty', 'size'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+ out, err = p.communicate()
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+ if p.returncode != 0:
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+ return 80 # Asume default
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
+ return int(out.split()[1])
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
@staticmethod
|
|
Alejandro Alvarez Ayllon |
3ad7fa1 |
def _clean():
|