Change server instantion to be inherited

This commit is contained in:
Jason Paryani
2013-12-09 17:13:43 -08:00
parent 362a50e34a
commit 3f7c3ae023
6 changed files with 318 additions and 44 deletions

View File

@@ -2,13 +2,9 @@ import pytest
import capnp
import os
this_dir = os.path.dirname(__file__)
import test_capability_capnp as capability
@pytest.fixture
def capability():
return capnp.load(os.path.join(this_dir, 'test_capability.capnp'))
class Server:
class Server(capability.TestInterface.Server):
def __init__(self, val=1):
self.val = val
@@ -21,16 +17,16 @@ class Server:
def buz(self, i, **kwargs):
return i.host + '_test'
class PipelineServer:
class PipelineServer(capability.TestPipeline.Server):
def getCap(self, n, inCap, _context, **kwargs):
def _then(response):
_results = _context.results
_results.s = response.x + '_foo'
_results.outBox.cap = capability().TestInterface.new_server(Server(100))
_results.outBox.cap = Server(100)
return inCap.foo(i=n).then(_then)
def test_client(capability):
def test_client():
client = capability.TestInterface._new_client(Server())
req = client._request('foo')
@@ -62,7 +58,7 @@ def test_client(capability):
with pytest.raises(ValueError):
req.baz = 1
def test_simple_client(capability):
def test_simple_client():
client = capability.TestInterface._new_client(Server())
remote = client._send('foo', i=5)
@@ -116,7 +112,7 @@ def test_simple_client(capability):
with pytest.raises(ValueError):
remote = client.foo(baz=5)
def test_pipeline(capability):
def test_pipeline():
client = capability.TestPipeline._new_client(PipelineServer())
foo_client = capability.TestInterface._new_client(Server())
@@ -131,7 +127,7 @@ def test_pipeline(capability):
response = remote.wait()
assert response.s == '26_foo'
class BadServer:
class BadServer(capability.TestInterface.Server):
def __init__(self, val=1):
self.val = val
@@ -141,25 +137,25 @@ class BadServer:
extra = 1
return str(i * 5 + extra + self.val), 10 # returning too many args
def test_exception_client(capability):
def test_exception_client():
client = capability.TestInterface._new_client(BadServer())
remote = client._send('foo', i=5)
with pytest.raises(capnp.KjException):
remote.wait()
class BadPipelineServer:
class BadPipelineServer(capability.TestPipeline.Server):
def getCap(self, n, inCap, _context, **kwargs):
def _then(response):
_results = _context.results
_results.s = response.x + '_foo'
_results.outBox.cap = capability().TestInterface.new_server(Server(100))
_results.outBox.cap = Server(100)
def _error(error):
raise Exception('test was a success')
return inCap.foo(i=n).then(_then, _error)
def test_exception_chain(capability):
def test_exception_chain():
client = capability.TestPipeline._new_client(BadPipelineServer())
foo_client = capability.TestInterface._new_client(BadServer())
@@ -170,7 +166,7 @@ def test_exception_chain(capability):
except Exception as e:
assert 'test was a success' in str(e)
def test_pipeline_exception(capability):
def test_pipeline_exception():
client = capability.TestPipeline._new_client(BadPipelineServer())
foo_client = capability.TestInterface._new_client(BadServer())
@@ -185,7 +181,7 @@ def test_pipeline_exception(capability):
with pytest.raises(Exception):
remote.wait()
def test_casting(capability):
def test_casting():
client = capability.TestExtends._new_client(Server())
client2 = client.upcast(capability.TestInterface)
client3 = client2.cast_as(capability.TestInterface)
@@ -193,7 +189,7 @@ def test_casting(capability):
with pytest.raises(Exception):
client.upcast(capability.TestPipeline)
class TailCallOrder:
class TailCallOrder(capability.TestCallOrder.Server):
def __init__(self):
self.count = -1
@@ -201,7 +197,7 @@ class TailCallOrder:
self.count += 1
return self.count
class TailCaller:
class TailCaller(capability.TestTailCaller.Server):
def __init__(self):
self.count = 0
@@ -211,7 +207,7 @@ class TailCaller:
tail = callee.foo_request(i=i, t='from TailCaller')
return _context.tail_call(tail)
class TailCallee:
class TailCallee(capability.TestTailCallee.Server):
def __init__(self):
self.count = 0
@@ -221,9 +217,9 @@ class TailCallee:
results = _context.results
results.i = i
results.t = t
results.c = capability().TestCallOrder.new_server(TailCallOrder())
results.c = TailCallOrder()
def test_tail_call(capability):
def test_tail_call():
callee_server = TailCallee()
caller_server = TailCaller()

View File

@@ -25,7 +25,7 @@ class PipelineServer:
def getCap_context(self, context):
def _then(response):
context.results.s = response.x + '_foo'
context.results.outBox.cap = capability().TestInterface.new_server(Server(100))
context.results.outBox.cap = capability().TestInterface._new_server(Server(100))
return context.params.inCap.foo(i=context.params.n).then(_then)
@@ -149,7 +149,7 @@ class BadPipelineServer:
def getCap_context(self, context):
def _then(response):
context.results.s = response.x + '_foo'
context.results.outBox.cap = capability().TestInterface.new_server(Server(100))
context.results.outBox.cap = capability().TestInterface._new_server(Server(100))
def _error(error):
raise Exception('test was a success')
@@ -217,7 +217,7 @@ class TailCallee:
results = context.results
results.i = context.params.i
results.t = context.params.t
results.c = capability().TestCallOrder.new_server(TailCallOrder())
results.c = capability().TestCallOrder._new_server(TailCallOrder())
def test_tail_call(capability):
callee_server = TailCallee()

252
test/test_capability_old.py Normal file
View File

@@ -0,0 +1,252 @@
import pytest
import capnp
import os
this_dir = os.path.dirname(__file__)
@pytest.fixture
def capability():
return capnp.load(os.path.join(this_dir, 'test_capability.capnp'))
class Server:
def __init__(self, val=1):
self.val = val
def foo(self, i, j, **kwargs):
extra = 0
if j:
extra = 1
return str(i * 5 + extra + self.val)
def buz(self, i, **kwargs):
return i.host + '_test'
class PipelineServer:
def getCap(self, n, inCap, _context, **kwargs):
def _then(response):
_results = _context.results
_results.s = response.x + '_foo'
_results.outBox.cap = capability().TestInterface._new_server(Server(100))
return inCap.foo(i=n).then(_then)
def test_client(capability):
client = capability.TestInterface._new_client(Server())
req = client._request('foo')
req.i = 5
remote = req.send()
response = remote.wait()
assert response.x == '26'
req = client.foo_request()
req.i = 5
remote = req.send()
response = remote.wait()
assert response.x == '26'
with pytest.raises(ValueError):
client.foo2_request()
req = client.foo_request()
with pytest.raises(ValueError):
req.i = 'foo'
req = client.foo_request()
with pytest.raises(ValueError):
req.baz = 1
def test_simple_client(capability):
client = capability.TestInterface._new_client(Server())
remote = client._send('foo', i=5)
response = remote.wait()
assert response.x == '26'
remote = client.foo(i=5)
response = remote.wait()
assert response.x == '26'
remote = client.foo(i=5, j=True)
response = remote.wait()
assert response.x == '27'
remote = client.foo(5)
response = remote.wait()
assert response.x == '26'
remote = client.foo(5, True)
response = remote.wait()
assert response.x == '27'
remote = client.foo(5, j=True)
response = remote.wait()
assert response.x == '27'
remote = client.buz(capability.TestSturdyRefHostId.new_message(host='localhost'))
response = remote.wait()
assert response.x == 'localhost_test'
with pytest.raises(ValueError):
remote = client.foo(5, 10)
with pytest.raises(ValueError):
remote = client.foo(5, True, 100)
with pytest.raises(ValueError):
remote = client.foo(i='foo')
with pytest.raises(ValueError):
remote = client.foo2(i=5)
with pytest.raises(ValueError):
remote = client.foo(baz=5)
def test_pipeline(capability):
client = capability.TestPipeline._new_client(PipelineServer())
foo_client = capability.TestInterface._new_client(Server())
remote = client.getCap(n=5, inCap=foo_client)
outCap = remote.outBox.cap
pipelinePromise = outCap.foo(i=10)
response = pipelinePromise.wait()
assert response.x == '150'
response = remote.wait()
assert response.s == '26_foo'
class BadServer:
def __init__(self, val=1):
self.val = val
def foo(self, i, j, **kwargs):
extra = 0
if j:
extra = 1
return str(i * 5 + extra + self.val), 10 # returning too many args
def test_exception_client(capability):
client = capability.TestInterface._new_client(BadServer())
remote = client._send('foo', i=5)
with pytest.raises(capnp.KjException):
remote.wait()
class BadPipelineServer:
def getCap(self, n, inCap, _context, **kwargs):
def _then(response):
_results = _context.results
_results.s = response.x + '_foo'
_results.outBox.cap = capability().TestInterface._new_server(Server(100))
def _error(error):
raise Exception('test was a success')
return inCap.foo(i=n).then(_then, _error)
def test_exception_chain(capability):
client = capability.TestPipeline._new_client(BadPipelineServer())
foo_client = capability.TestInterface._new_client(BadServer())
remote = client.getCap(n=5, inCap=foo_client)
try:
remote.wait()
except Exception as e:
assert 'test was a success' in str(e)
def test_pipeline_exception(capability):
client = capability.TestPipeline._new_client(BadPipelineServer())
foo_client = capability.TestInterface._new_client(BadServer())
remote = client.getCap(n=5, inCap=foo_client)
outCap = remote.outBox.cap
pipelinePromise = outCap.foo(i=10)
with pytest.raises(Exception):
loop.wait(pipelinePromise)
with pytest.raises(Exception):
remote.wait()
def test_casting(capability):
client = capability.TestExtends._new_client(Server())
client2 = client.upcast(capability.TestInterface)
client3 = client2.cast_as(capability.TestInterface)
with pytest.raises(Exception):
client.upcast(capability.TestPipeline)
class TailCallOrder:
def __init__(self):
self.count = -1
def getCallSequence(self, expected, **kwargs):
self.count += 1
return self.count
class TailCaller:
def __init__(self):
self.count = 0
def foo(self, i, callee, _context, **kwargs):
self.count += 1
tail = callee.foo_request(i=i, t='from TailCaller')
return _context.tail_call(tail)
class TailCallee:
def __init__(self):
self.count = 0
def foo(self, i, t, _context, **kwargs):
self.count += 1
results = _context.results
results.i = i
results.t = t
results.c = capability().TestCallOrder._new_server(TailCallOrder())
def test_tail_call(capability):
callee_server = TailCallee()
caller_server = TailCaller()
callee = capability.TestTailCallee._new_client(callee_server)
caller = capability.TestTailCaller._new_client(caller_server)
promise = caller.foo(i=456, callee=callee)
dependent_call1 = promise.c.getCallSequence()
response = promise.wait()
assert response.i == 456
assert response.i == 456
dependent_call2 = response.c.getCallSequence()
dependent_call3 = response.c.getCallSequence()
result = dependent_call1.wait()
assert result.n == 0
result = dependent_call2.wait()
assert result.n == 1
result = dependent_call3.wait()
assert result.n == 2
assert callee_server.count == 1
assert caller_server.count == 1

View File

@@ -3,32 +3,28 @@ import capnp
import os
import socket
this_dir = os.path.dirname(__file__)
import test_capability_capnp
@pytest.fixture
def capability():
return capnp.load(os.path.join(this_dir, 'test_capability.capnp'))
class Server:
class Server(test_capability_capnp.TestInterface.Server):
def __init__(self, val=1):
self.val = val
def foo(self, i, j, **kwargs):
return str(i * 5 + self.val)
def test_simple_rpc(capability):
def test_simple_rpc():
def _restore(ref_id):
return capability.TestInterface.new_server(Server(100))
return Server(100)
read, write = socket.socketpair(socket.AF_UNIX)
restorer = capnp.Restorer(capability.TestSturdyRefObjectId, _restore)
restorer = capnp.Restorer(test_capability_capnp.TestSturdyRefObjectId, _restore)
server = capnp.RpcServer(write, restorer)
client = capnp.RpcClient(read)
ref = capability.TestSturdyRefObjectId.new_message()
ref = test_capability_capnp.TestSturdyRefObjectId.new_message()
cap = client.restore(ref)
cap = cap.cast_as(capability.TestInterface)
cap = cap.cast_as(test_capability_capnp.TestInterface)
remote = cap.foo(i=5)
response = remote.wait()

View File

@@ -77,3 +77,25 @@ def test_roundtrip_dict(all_types):
msg = all_types.TestAllTypes.from_dict(d)
test_regression.check_all_types(msg)
def test_file_and_bytes(all_types):
f = open('example', 'w')
msg = all_types.TestAllTypes.new_message()
test_regression.init_all_types(msg)
msg.write(f)
f.close()
f = open('example', 'r')
assert f.read() == msg.to_bytes()
def test_file_and_bytes_packed(all_types):
f = open('example', 'w')
msg = all_types.TestAllTypes.new_message()
test_regression.init_all_types(msg)
msg.write_packed(f)
f.close()
f = open('example', 'r')
assert f.read() == msg.to_bytes_packed()