2007-02-04 22:05:01 +08:00
|
|
|
|
|
|
|
""" RSync filter test
|
|
|
|
"""
|
|
|
|
|
|
|
|
import py
|
2007-02-07 03:06:57 +08:00
|
|
|
from py.__.test.rsession.hostmanage import HostRSync, HostInfo, HostManager
|
2007-02-10 16:52:22 +08:00
|
|
|
from py.__.test.rsession.hostmanage import sethomedir, gethomedir, getpath_relto_home
|
2007-02-06 07:53:29 +08:00
|
|
|
from py.__.test.rsession import repevent
|
2007-02-04 22:05:01 +08:00
|
|
|
|
|
|
|
class DirSetup:
|
|
|
|
def setup_method(self, method):
|
|
|
|
name = "%s.%s" %(self.__class__.__name__, method.func_name)
|
|
|
|
self.tmpdir = py.test.ensuretemp(name)
|
|
|
|
self.source = self.tmpdir.ensure("source", dir=1)
|
|
|
|
self.dest = self.tmpdir.join("dest")
|
|
|
|
|
2007-02-07 03:06:57 +08:00
|
|
|
class TestHostInfo(DirSetup):
|
|
|
|
def _gethostinfo(self, relpath=""):
|
|
|
|
exampledir = self.tmpdir.join("gethostinfo")
|
|
|
|
if relpath:
|
|
|
|
exampledir = exampledir.join(relpath)
|
|
|
|
assert not exampledir.check()
|
|
|
|
hostinfo = HostInfo("localhost:%s" % exampledir)
|
|
|
|
return hostinfo
|
|
|
|
|
2007-02-04 22:05:01 +08:00
|
|
|
def test_defaultpath(self):
|
2007-02-08 23:56:33 +08:00
|
|
|
x = HostInfo("localhost:")
|
2007-02-04 22:05:01 +08:00
|
|
|
assert x.hostname == "localhost"
|
2007-02-09 02:35:18 +08:00
|
|
|
assert not x.relpath
|
2007-02-10 22:45:41 +08:00
|
|
|
|
|
|
|
def test_addrel(self):
|
2007-02-10 22:51:25 +08:00
|
|
|
host = HostInfo("localhost:", addrel="whatever")
|
|
|
|
assert host.inplacelocal
|
|
|
|
assert not host.relpath
|
2007-02-10 22:45:41 +08:00
|
|
|
host = HostInfo("localhost:/tmp", addrel="base")
|
|
|
|
assert host.relpath == "/tmp/base"
|
|
|
|
host = HostInfo("localhost:tmp", addrel="base2")
|
|
|
|
assert host.relpath == "tmp/base2"
|
2007-02-04 22:05:01 +08:00
|
|
|
|
|
|
|
def test_path(self):
|
|
|
|
x = HostInfo("localhost:/tmp")
|
|
|
|
assert x.relpath == "/tmp"
|
|
|
|
assert x.hostname == "localhost"
|
2007-02-10 16:52:22 +08:00
|
|
|
assert not x.inplacelocal
|
2007-02-04 22:05:01 +08:00
|
|
|
|
|
|
|
def test_hostid(self):
|
2007-02-08 23:56:33 +08:00
|
|
|
x = HostInfo("localhost:")
|
|
|
|
y = HostInfo("localhost:")
|
2007-02-04 22:05:01 +08:00
|
|
|
assert x.hostid != y.hostid
|
|
|
|
x = HostInfo("localhost:/tmp")
|
2007-02-08 23:56:33 +08:00
|
|
|
y = HostInfo("localhost:")
|
2007-02-04 22:05:01 +08:00
|
|
|
assert x.hostid != y.hostid
|
|
|
|
|
|
|
|
def test_non_existing_hosts(self):
|
|
|
|
host = HostInfo("alskdjalsdkjasldkajlsd")
|
|
|
|
py.test.raises((py.process.cmdexec.Error, IOError, EOFError),
|
|
|
|
host.initgateway)
|
|
|
|
|
2007-02-06 06:46:31 +08:00
|
|
|
def test_remote_has_homedir_as_currentdir(self):
|
2007-02-07 03:06:57 +08:00
|
|
|
host = self._gethostinfo()
|
2007-02-06 06:46:31 +08:00
|
|
|
old = py.path.local.get_temproot().chdir()
|
|
|
|
try:
|
|
|
|
host.initgateway()
|
2007-02-07 03:06:57 +08:00
|
|
|
channel = host.gw.remote_exec(py.code.Source(
|
|
|
|
gethomedir, """
|
2007-02-06 06:46:31 +08:00
|
|
|
import os
|
2007-02-07 03:06:57 +08:00
|
|
|
homedir = gethomedir()
|
|
|
|
curdir = os.getcwd()
|
|
|
|
channel.send((curdir, homedir))
|
|
|
|
"""))
|
|
|
|
remote_curdir, remote_homedir = channel.receive()
|
|
|
|
assert remote_curdir == remote_homedir
|
2007-02-06 06:46:31 +08:00
|
|
|
finally:
|
|
|
|
old.chdir()
|
|
|
|
|
2007-02-04 22:05:01 +08:00
|
|
|
def test_initgateway_localhost_relpath(self):
|
2007-02-07 03:06:57 +08:00
|
|
|
host = HostInfo("localhost:somedir")
|
|
|
|
host.initgateway()
|
|
|
|
assert host.gw
|
2007-02-04 22:05:01 +08:00
|
|
|
try:
|
2007-02-05 08:36:00 +08:00
|
|
|
homedir = py.path.local._gethomedir()
|
2007-02-07 03:06:57 +08:00
|
|
|
expected = homedir.join("somedir")
|
|
|
|
assert host.gw_remotepath == str(expected)
|
2007-02-04 22:05:01 +08:00
|
|
|
finally:
|
2007-02-07 03:06:57 +08:00
|
|
|
host.gw.exit()
|
2007-02-04 22:05:01 +08:00
|
|
|
|
|
|
|
def test_initgateway_ssh_and_remotepath(self):
|
|
|
|
option = py.test.config.option
|
|
|
|
if option.sshtarget is None:
|
|
|
|
py.test.skip("no known ssh target, use -S to set one")
|
2007-02-07 03:06:57 +08:00
|
|
|
host = HostInfo("%s" % (option.sshtarget, ))
|
|
|
|
# this test should be careful to not write/rsync anything
|
|
|
|
# as the remotepath is the default location
|
|
|
|
# and may be used in the real world
|
|
|
|
host.initgateway()
|
|
|
|
assert host.gw
|
|
|
|
assert host.gw_remotepath.endswith(host.relpath)
|
|
|
|
channel = host.gw.remote_exec("""
|
2007-02-04 22:05:01 +08:00
|
|
|
import os
|
|
|
|
homedir = os.environ['HOME']
|
|
|
|
relpath = channel.receive()
|
|
|
|
path = os.path.join(homedir, relpath)
|
|
|
|
channel.send(path)
|
|
|
|
""")
|
2007-02-07 03:06:57 +08:00
|
|
|
channel.send(host.relpath)
|
2007-02-04 22:05:01 +08:00
|
|
|
res = channel.receive()
|
2007-02-07 03:06:57 +08:00
|
|
|
assert res == host.gw_remotepath
|
2007-02-04 22:05:01 +08:00
|
|
|
|
|
|
|
class TestSyncing(DirSetup):
|
2007-02-07 03:06:57 +08:00
|
|
|
def _gethostinfo(self):
|
|
|
|
hostinfo = HostInfo("localhost:%s" % self.dest)
|
|
|
|
return hostinfo
|
|
|
|
|
2007-02-04 22:05:01 +08:00
|
|
|
def test_hrsync_filter(self):
|
|
|
|
self.source.ensure("dir", "file.txt")
|
|
|
|
self.source.ensure(".svn", "entries")
|
|
|
|
self.source.ensure(".somedotfile", "moreentries")
|
|
|
|
self.source.ensure("somedir", "editfile~")
|
2007-02-08 23:31:38 +08:00
|
|
|
syncer = HostRSync(self.source)
|
2007-02-04 22:05:01 +08:00
|
|
|
l = list(self.source.visit(rec=syncer.filter,
|
|
|
|
fil=syncer.filter))
|
|
|
|
assert len(l) == 3
|
|
|
|
basenames = [x.basename for x in l]
|
|
|
|
assert 'dir' in basenames
|
|
|
|
assert 'file.txt' in basenames
|
|
|
|
assert 'somedir' in basenames
|
|
|
|
|
2007-02-10 16:52:22 +08:00
|
|
|
def test_hrsync_localhost_inplace(self):
|
|
|
|
h1 = HostInfo("localhost")
|
|
|
|
events = []
|
|
|
|
rsync = HostRSync(self.source)
|
|
|
|
h1.initgateway()
|
|
|
|
rsync.add_target_host(h1, reporter=events.append)
|
|
|
|
assert events
|
|
|
|
l = [x for x in events
|
|
|
|
if isinstance(x, repevent.HostRSyncing)]
|
|
|
|
assert len(l) == 1
|
|
|
|
ev = l[0]
|
|
|
|
assert ev.host == h1
|
|
|
|
assert ev.root == ev.remotepath
|
|
|
|
l = [x for x in events
|
|
|
|
if isinstance(x, repevent.HostRSyncRootReady)]
|
|
|
|
assert len(l) == 1
|
|
|
|
ev = l[0]
|
|
|
|
assert ev.root == self.source
|
|
|
|
assert ev.host == h1
|
|
|
|
|
2007-02-04 22:05:01 +08:00
|
|
|
def test_hrsync_one_host(self):
|
2007-02-07 03:06:57 +08:00
|
|
|
h1 = self._gethostinfo()
|
2007-02-04 22:05:01 +08:00
|
|
|
finished = []
|
2007-02-08 23:31:38 +08:00
|
|
|
rsync = HostRSync(self.source)
|
2007-02-04 22:05:01 +08:00
|
|
|
h1.initgateway()
|
|
|
|
rsync.add_target_host(h1)
|
|
|
|
self.source.join("hello.py").write("world")
|
2007-02-08 23:31:38 +08:00
|
|
|
rsync.send()
|
2007-02-04 22:05:01 +08:00
|
|
|
assert self.dest.join("hello.py").check()
|
|
|
|
|
|
|
|
def test_hrsync_same_host_twice(self):
|
2007-02-07 03:06:57 +08:00
|
|
|
h1 = self._gethostinfo()
|
|
|
|
h2 = self._gethostinfo()
|
2007-02-04 22:05:01 +08:00
|
|
|
finished = []
|
2007-02-08 23:31:38 +08:00
|
|
|
rsync = HostRSync(self.source)
|
2007-02-04 22:05:01 +08:00
|
|
|
l = []
|
|
|
|
h1.initgateway()
|
2007-02-09 03:02:28 +08:00
|
|
|
h2.initgateway()
|
2007-02-04 22:05:01 +08:00
|
|
|
res1 = rsync.add_target_host(h1)
|
|
|
|
assert res1
|
|
|
|
res2 = rsync.add_target_host(h2)
|
|
|
|
assert not res2
|
|
|
|
|
|
|
|
class TestHostManager(DirSetup):
|
2007-02-10 23:05:32 +08:00
|
|
|
def gethostmanager(self, dist_hosts, dist_rsync_roots=None):
|
|
|
|
l = ["dist_hosts = %r" % dist_hosts]
|
|
|
|
if dist_rsync_roots:
|
|
|
|
l.append("dist_rsync_roots = %r" % dist_rsync_roots)
|
|
|
|
self.source.join("conftest.py").write("\n".join(l))
|
2007-02-10 22:45:41 +08:00
|
|
|
config = py.test.config._reparse([self.source])
|
|
|
|
assert config.topdir == self.source
|
|
|
|
hm = HostManager(config)
|
|
|
|
assert hm.hosts
|
|
|
|
return hm
|
|
|
|
|
2007-02-05 08:14:11 +08:00
|
|
|
def test_hostmanager_custom_hosts(self):
|
|
|
|
config = py.test.config._reparse([self.source])
|
|
|
|
hm = HostManager(config, hosts=[1,2,3])
|
|
|
|
assert hm.hosts == [1,2,3]
|
|
|
|
|
2007-02-04 22:05:01 +08:00
|
|
|
def test_hostmanager_init_rsync_topdir(self):
|
|
|
|
dir2 = self.source.ensure("dir1", "dir2", dir=1)
|
|
|
|
dir2.ensure("hello")
|
2007-02-10 22:45:41 +08:00
|
|
|
hm = self.gethostmanager(
|
|
|
|
dist_hosts = ["localhost:%s" % self.dest]
|
|
|
|
)
|
|
|
|
assert hm.config.topdir == self.source
|
|
|
|
hm.init_rsync([].append)
|
|
|
|
dest = self.dest.join(self.source.basename)
|
|
|
|
assert dest.join("dir1").check()
|
|
|
|
assert dest.join("dir1", "dir2").check()
|
|
|
|
assert dest.join("dir1", "dir2", 'hello').check()
|
2007-02-04 22:05:01 +08:00
|
|
|
|
2007-02-10 23:05:32 +08:00
|
|
|
def test_hostmanager_init_rsync_topdir_explicit(self):
|
|
|
|
dir2 = self.source.ensure("dir1", "dir2", dir=1)
|
|
|
|
dir2.ensure("hello")
|
|
|
|
hm = self.gethostmanager(
|
2007-02-10 23:07:30 +08:00
|
|
|
dist_hosts = ["localhost:%s" % self.dest],
|
|
|
|
dist_rsync_roots = [str(self.source)]
|
2007-02-10 23:05:32 +08:00
|
|
|
)
|
|
|
|
assert hm.config.topdir == self.source
|
|
|
|
hm.init_rsync([].append)
|
|
|
|
dest = self.dest.join(self.source.basename)
|
|
|
|
assert dest.join("dir1").check()
|
|
|
|
assert dest.join("dir1", "dir2").check()
|
|
|
|
assert dest.join("dir1", "dir2", 'hello').check()
|
|
|
|
|
|
|
|
def test_hostmanager_init_rsync_roots(self):
|
2007-02-04 22:05:01 +08:00
|
|
|
dir2 = self.source.ensure("dir1", "dir2", dir=1)
|
2007-02-06 07:21:33 +08:00
|
|
|
self.source.ensure("dir1", "somefile", dir=1)
|
2007-02-04 22:05:01 +08:00
|
|
|
dir2.ensure("hello")
|
|
|
|
self.source.ensure("bogusdir", "file")
|
|
|
|
self.source.join("conftest.py").write(py.code.Source("""
|
|
|
|
dist_rsync_roots = ['dir1/dir2']
|
|
|
|
"""))
|
|
|
|
config = py.test.config._reparse([self.source])
|
2007-02-05 08:14:11 +08:00
|
|
|
hm = HostManager(config,
|
|
|
|
hosts=[HostInfo("localhost:" + str(self.dest))])
|
2007-02-04 22:05:01 +08:00
|
|
|
events = []
|
|
|
|
hm.init_rsync(reporter=events.append)
|
2007-02-10 21:21:26 +08:00
|
|
|
assert self.dest.join("dir2").check()
|
|
|
|
assert not self.dest.join("dir1").check()
|
2007-02-04 22:05:01 +08:00
|
|
|
assert not self.dest.join("bogus").check()
|
2007-02-05 09:14:17 +08:00
|
|
|
|
|
|
|
def test_hostmanager_rsync_ignore(self):
|
|
|
|
dir2 = self.source.ensure("dir1", "dir2", dir=1)
|
|
|
|
dir5 = self.source.ensure("dir5", "dir6", "bogus")
|
|
|
|
dirf = self.source.ensure("dir5", "file")
|
|
|
|
dir2.ensure("hello")
|
|
|
|
self.source.join("conftest.py").write(py.code.Source("""
|
|
|
|
dist_rsync_ignore = ['dir1/dir2', 'dir5/dir6']
|
|
|
|
"""))
|
|
|
|
config = py.test.config._reparse([self.source])
|
|
|
|
hm = HostManager(config,
|
|
|
|
hosts=[HostInfo("localhost:" + str(self.dest))])
|
|
|
|
events = []
|
2007-02-10 21:21:26 +08:00
|
|
|
print events
|
2007-02-05 09:14:17 +08:00
|
|
|
hm.init_rsync(reporter=events.append)
|
|
|
|
assert self.dest.join("dir1").check()
|
|
|
|
assert not self.dest.join("dir1", "dir2").check()
|
|
|
|
assert self.dest.join("dir5","file").check()
|
|
|
|
assert not self.dest.join("dir6").check()
|
2007-02-06 06:46:31 +08:00
|
|
|
|
2007-02-08 23:56:33 +08:00
|
|
|
def test_hostmanage_optimise_localhost(self):
|
2007-02-09 02:35:18 +08:00
|
|
|
hosts = [HostInfo("localhost") for i in range(3)]
|
|
|
|
config = py.test.config._reparse([self.source])
|
|
|
|
hm = HostManager(config, hosts=hosts)
|
|
|
|
events = []
|
|
|
|
hm.init_rsync(events.append)
|
|
|
|
for host in hosts:
|
2007-02-10 16:52:22 +08:00
|
|
|
assert host.inplacelocal
|
|
|
|
assert host.gw_remotepath is None
|
2007-02-09 02:35:18 +08:00
|
|
|
assert not host.relpath
|
|
|
|
assert events
|
2007-02-08 23:56:33 +08:00
|
|
|
|
2007-02-14 04:09:25 +08:00
|
|
|
def XXXtest_ssh_rsync_samehost_twice(self):
|
2007-02-14 04:40:29 +08:00
|
|
|
#XXX we have no easy way to have a temp directory remotely!
|
2007-02-14 04:09:25 +08:00
|
|
|
option = py.test.config.option
|
|
|
|
if option.sshtarget is None:
|
|
|
|
py.test.skip("no known ssh target, use -S to set one")
|
|
|
|
host1 = HostInfo("%s" % (option.sshtarget, ))
|
|
|
|
host2 = HostInfo("%s" % (option.sshtarget, ))
|
|
|
|
hm = HostManager(config, hosts=[host1, host2])
|
|
|
|
events = []
|
|
|
|
hm.init_rsync(events.append)
|
|
|
|
print events
|
|
|
|
assert 0
|
|
|
|
|
2007-02-07 03:06:57 +08:00
|
|
|
def test_getpath_relto_home():
|
|
|
|
x = getpath_relto_home("hello")
|
|
|
|
assert x == py.path.local._gethomedir().join("hello")
|
2007-02-10 16:52:22 +08:00
|
|
|
x = getpath_relto_home(".")
|
|
|
|
assert x == py.path.local._gethomedir()
|
|
|
|
|
|
|
|
def test_sethomedir():
|
|
|
|
old = py.path.local.get_temproot().chdir()
|
|
|
|
try:
|
|
|
|
sethomedir()
|
|
|
|
curdir = py.path.local()
|
|
|
|
finally:
|
|
|
|
old.chdir()
|
|
|
|
|
|
|
|
assert py.path.local._gethomedir() == curdir
|
2007-02-07 03:06:57 +08:00
|
|
|
|