##// END OF EJS Templates
tests: make simple single quotes work with dummyssh on windows...
tests: make simple single quotes work with dummyssh on windows Mercurial assumes that the shell on remote servers over ssh servers uses unix quoting rules. Tests using dummyssh are however also run on windows where cmd doesn't parse single quotes like on unix. This hack replaces the single quotes with double quotes on windows - that is enough to make test-ssh.t pass after d8fa35c28335.

File last commit:

r15542:e1930259 default
r15768:cdf9c434 default
Show More
test-commandserver.py
205 lines | 5.3 KiB | text/x-python | PythonLexer
/ tests / test-commandserver.py
Idan Kamara
cmdserver: take repo.baseui as our ui...
r14882 import sys, os, struct, subprocess, cStringIO, re, shutil
Idan Kamara
tests: add basic commandserver test
r14770
def connect(path=None):
cmdline = ['hg', 'serve', '--cmdserver', 'pipe']
if path:
cmdline += ['-R', path]
server = subprocess.Popen(cmdline, stdin=subprocess.PIPE,
stdout=subprocess.PIPE)
return server
def writeblock(server, data):
server.stdin.write(struct.pack('>I', len(data)))
server.stdin.write(data)
server.stdin.flush()
def readchannel(server):
data = server.stdout.read(5)
if not data:
raise EOFError()
channel, length = struct.unpack('>cI', data)
if channel in 'IL':
return channel, length
else:
return channel, server.stdout.read(length)
def runcommand(server, args, output=sys.stdout, error=sys.stderr, input=None):
Mads Kiilerich
tests: make test-commandserver.py output readable
r15541 print ' runcommand', ' '.join(args)
Idan Kamara
tests: add basic commandserver test
r14770 server.stdin.write('runcommand\n')
writeblock(server, '\0'.join(args))
if not input:
input = cStringIO.StringIO()
while True:
ch, data = readchannel(server)
if ch == 'o':
output.write(data)
output.flush()
elif ch == 'e':
error.write(data)
error.flush()
elif ch == 'I':
writeblock(server, input.read(data))
elif ch == 'L':
writeblock(server, input.readline(data))
elif ch == 'r':
return struct.unpack('>i', data)[0]
else:
print "unexpected channel %c: %r" % (ch, data)
if ch.isupper():
return
def check(func, repopath=None):
Mads Kiilerich
tests: make test-commandserver.py output readable
r15541 print
print 'testing %s:' % func.__name__
print
Idan Kamara
tests: add basic commandserver test
r14770 server = connect(repopath)
try:
return func(server)
finally:
server.stdin.close()
server.wait()
def unknowncommand(server):
server.stdin.write('unknowncommand\n')
def hellomessage(server):
ch, data = readchannel(server)
# escaping python tests output not supported
print '%c, %r' % (ch, re.sub('encoding: [a-zA-Z0-9-]+', 'encoding: ***', data))
# run an arbitrary command to make sure the next thing the server sends
# isn't part of the hello message
runcommand(server, ['id'])
def checkruncommand(server):
# hello block
readchannel(server)
# no args
runcommand(server, [])
# global options
runcommand(server, ['id', '--quiet'])
# make sure global options don't stick through requests
runcommand(server, ['id'])
# --config
runcommand(server, ['id', '--config', 'ui.quiet=True'])
# make sure --config doesn't stick
runcommand(server, ['id'])
def inputeof(server):
readchannel(server)
server.stdin.write('runcommand\n')
# close stdin while server is waiting for input
server.stdin.close()
# server exits with 1 if the pipe closed while reading the command
print 'server exit code =', server.wait()
def serverinput(server):
readchannel(server)
patch = """
# HG changeset patch
# User test
# Date 0 0
# Node ID c103a3dec114d882c98382d684d8af798d09d857
# Parent 0000000000000000000000000000000000000000
1
diff -r 000000000000 -r c103a3dec114 a
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/a Thu Jan 01 00:00:00 1970 +0000
@@ -0,0 +1,1 @@
+1
"""
runcommand(server, ['import', '-'], input=cStringIO.StringIO(patch))
runcommand(server, ['log'])
Idan Kamara
cmdserver: restore old working dir after dispatch when we have --cwd
r14864 def cwd(server):
""" check that --cwd doesn't persist between requests """
readchannel(server)
os.mkdir('foo')
Mads Kiilerich
tests: make test-commandserver.py independent of line ending and slash direction
r15542 f = open('foo/bar', 'wb')
Idan Kamara
test-commandserver: explicitly close opened file
r14880 f.write('a')
f.close()
Idan Kamara
cmdserver: restore old working dir after dispatch when we have --cwd
r14864 runcommand(server, ['--cwd', 'foo', 'st', 'bar'])
runcommand(server, ['st', 'foo/bar'])
os.remove('foo/bar')
Idan Kamara
cmdserver: take repo.baseui as our ui...
r14882 def localhgrc(server):
""" check that local configs for the cached repo aren't inherited when -R
is used """
readchannel(server)
# the cached repo local hgrc contains ui.foo=bar, so showconfig should show it
runcommand(server, ['showconfig'])
# but not for this repo
runcommand(server, ['init', 'foo'])
Mads Kiilerich
tests: make test-commandserver.py independent of line ending and slash direction
r15542 runcommand(server, ['-R', 'foo', 'showconfig', 'ui', 'defaults'])
Idan Kamara
cmdserver: take repo.baseui as our ui...
r14882 shutil.rmtree('foo')
Idan Kamara
hooks: redirect stdout/err/in to the ui descriptors when calling python hooks...
r14889 def hook(**args):
print 'hook talking'
print 'now try to read something: %r' % sys.stdin.read()
def hookoutput(server):
readchannel(server)
runcommand(server, ['--config',
'hooks.pre-identify=python:test-commandserver.hook', 'id'],
input=cStringIO.StringIO('some input'))
Idan Kamara
cmdserver: repo.invalidate() on every runcommand...
r14939 def outsidechanges(server):
readchannel(server)
Mads Kiilerich
tests: make test-commandserver.py independent of line ending and slash direction
r15542 f = open('a', 'ab')
f.write('a\n')
f.close()
os.system('hg ci -Am2')
Idan Kamara
cmdserver: repo.invalidate() on every runcommand...
r14939 runcommand(server, ['tip'])
def bookmarks(server):
readchannel(server)
runcommand(server, ['bookmarks'])
# changes .hg/bookmarks
os.system('hg bookmark -i bm1')
os.system('hg bookmark -i bm2')
runcommand(server, ['bookmarks'])
# changes .hg/bookmarks.current
os.system('hg upd bm1 -q')
runcommand(server, ['bookmarks'])
def tagscache(server):
readchannel(server)
runcommand(server, ['id', '-t', '-r', '0'])
os.system('hg tag -r 0 foo')
runcommand(server, ['id', '-t', '-r', '0'])
Idan Kamara
tests: add basic commandserver test
r14770 if __name__ == '__main__':
os.system('hg init')
check(hellomessage)
check(unknowncommand)
check(checkruncommand)
check(inputeof)
check(serverinput)
Idan Kamara
cmdserver: restore old working dir after dispatch when we have --cwd
r14864 check(cwd)
Idan Kamara
cmdserver: take repo.baseui as our ui...
r14882
hgrc = open('.hg/hgrc', 'a')
hgrc.write('[ui]\nfoo=bar\n')
hgrc.close()
check(localhgrc)
Idan Kamara
hooks: redirect stdout/err/in to the ui descriptors when calling python hooks...
r14889 check(hookoutput)
Idan Kamara
cmdserver: repo.invalidate() on every runcommand...
r14939 check(outsidechanges)
check(bookmarks)
check(tagscache)