153 lines
4.8 KiB
Python
153 lines
4.8 KiB
Python
import py
|
|
from py.execnet import RSync
|
|
|
|
|
|
def setup_module(mod):
|
|
mod.gw = py.execnet.PopenGateway()
|
|
mod.gw2 = py.execnet.PopenGateway()
|
|
|
|
def teardown_module(mod):
|
|
mod.gw.exit()
|
|
mod.gw2.exit()
|
|
|
|
|
|
class DirSetup:
|
|
def setup_method(self, method):
|
|
name = "%s.%s" %(self.__class__.__name__, method.func_name)
|
|
self.tmpdir = t = py.test.ensuretemp(name)
|
|
self.source = t.join("source")
|
|
self.dest1 = t.join("dest1")
|
|
self.dest2 = t.join("dest2")
|
|
|
|
class TestRSync(DirSetup):
|
|
def test_notargets(self):
|
|
rsync = RSync(self.source)
|
|
py.test.raises(IOError, "rsync.send()")
|
|
assert rsync.send(raises=False) is None
|
|
|
|
def test_dirsync(self):
|
|
dest = self.dest1
|
|
dest2 = self.dest2
|
|
source = self.source
|
|
|
|
for s in ('content1', 'content2-a-bit-longer'):
|
|
source.ensure('subdir', 'file1').write(s)
|
|
rsync = RSync(self.source)
|
|
rsync.add_target(gw, dest)
|
|
rsync.add_target(gw2, dest2)
|
|
rsync.send()
|
|
assert dest.join('subdir').check(dir=1)
|
|
assert dest.join('subdir', 'file1').check(file=1)
|
|
assert dest.join('subdir', 'file1').read() == s
|
|
assert dest2.join('subdir').check(dir=1)
|
|
assert dest2.join('subdir', 'file1').check(file=1)
|
|
assert dest2.join('subdir', 'file1').read() == s
|
|
|
|
source.join('subdir').remove('file1')
|
|
rsync = RSync(source)
|
|
rsync.add_target(gw2, dest2)
|
|
rsync.add_target(gw, dest)
|
|
rsync.send()
|
|
assert dest.join('subdir', 'file1').check(file=1)
|
|
assert dest2.join('subdir', 'file1').check(file=1)
|
|
rsync = RSync(source)
|
|
rsync.add_target(gw, dest, delete=True)
|
|
rsync.add_target(gw2, dest2)
|
|
rsync.send()
|
|
assert not dest.join('subdir', 'file1').check()
|
|
assert dest2.join('subdir', 'file1').check()
|
|
|
|
def test_dirsync_twice(self):
|
|
source = self.source
|
|
source.ensure("hello")
|
|
rsync = RSync(source)
|
|
rsync.add_target(gw, self.dest1)
|
|
rsync.send()
|
|
assert self.dest1.join('hello').check()
|
|
py.test.raises(IOError, "rsync.send()")
|
|
assert rsync.send(raises=False) is None
|
|
rsync.add_target(gw, self.dest2)
|
|
rsync.send()
|
|
assert self.dest2.join('hello').check()
|
|
py.test.raises(IOError, "rsync.send()")
|
|
assert rsync.send(raises=False) is None
|
|
|
|
def test_rsync_default_reporting(self):
|
|
source = self.source
|
|
source.ensure("hello")
|
|
cap = py.io.StdCapture()
|
|
try:
|
|
rsync = RSync(source)
|
|
rsync.add_target(gw, self.dest1)
|
|
rsync.send()
|
|
finally:
|
|
out, err = cap.reset()
|
|
assert out.find("hello") != -1
|
|
|
|
def test_rsync_non_verbose(self):
|
|
source = self.source
|
|
source.ensure("hello")
|
|
cap = py.io.StdCapture()
|
|
try:
|
|
rsync = RSync(source, verbose=False)
|
|
rsync.add_target(gw, self.dest1)
|
|
rsync.send()
|
|
finally:
|
|
out, err = cap.reset()
|
|
assert not out
|
|
assert not err
|
|
|
|
def test_symlink_rsync(self):
|
|
if py.std.sys.platform == 'win32':
|
|
py.test.skip("symlinks are unsupported on Windows.")
|
|
source = self.source
|
|
dest = self.dest1
|
|
self.source.ensure("existant")
|
|
source.join("rellink").mksymlinkto(source.join("existant"), absolute=0)
|
|
source.join('abslink').mksymlinkto(source.join("existant"))
|
|
|
|
rsync = RSync(source)
|
|
rsync.add_target(gw, dest)
|
|
rsync.send()
|
|
|
|
assert dest.join('rellink').readlink() == dest.join("existant")
|
|
assert dest.join('abslink').readlink() == dest.join("existant")
|
|
|
|
def test_callback(self):
|
|
dest = self.dest1
|
|
source = self.source
|
|
source.ensure("existant").write("a" * 100)
|
|
source.ensure("existant2").write("a" * 10)
|
|
total = {}
|
|
def callback(cmd, lgt, channel):
|
|
total[(cmd, lgt)] = True
|
|
|
|
rsync = RSync(source, callback=callback)
|
|
#rsync = RSync()
|
|
rsync.add_target(gw, dest)
|
|
rsync.send()
|
|
|
|
assert total == {("list", 110):True, ("ack", 100):True, ("ack", 10):True}
|
|
|
|
def test_file_disappearing(self):
|
|
dest = self.dest1
|
|
source = self.source
|
|
source.ensure("ex").write("a" * 100)
|
|
source.ensure("ex2").write("a" * 100)
|
|
|
|
class DRsync(RSync):
|
|
def filter(self, x):
|
|
assert x != source
|
|
if x.endswith("ex2"):
|
|
self.x = 1
|
|
source.join("ex2").remove()
|
|
return True
|
|
|
|
rsync = DRsync(source)
|
|
rsync.add_target(gw, dest)
|
|
rsync.send()
|
|
assert rsync.x == 1
|
|
assert len(dest.listdir()) == 1
|
|
assert len(source.listdir()) == 1
|
|
|