blob: ac42ed306bbe69ffd3566d8742daf5e2598d3c79 [file] [log] [blame]
# Copyright 2014 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import gc
import weakref
# pylint: disable=F0401,E0611
import mojo_bindings.promise as promise
import mojo_system as system
import mojo_unittest
import regression_tests_mojom
import sample_factory_mojom
import sample_service_mojom
def _BuildProxy(impl):
pipe = system.MessagePipe()
impl.__class__.manager.Bind(impl, pipe.handle0)
return impl.__class__.manager.Proxy(pipe.handle1)
def _ExtractValue(p):
container = []
@promise.async
def GetValue(value):
container.append(value)
GetValue(p)
assert len(container)
return container[0]
class EmptyServiceImpl(sample_service_mojom.Service):
def __init__(self):
pass
class ServiceImpl(sample_service_mojom.Service):
def __init__(self):
pass
# pylint: disable=C0102,W0613
def Frobinate(self, foo, baz, port):
return baz
class NamedObjectImpl(sample_factory_mojom.NamedObject):
def __init__(self):
self.name = 'name'
def SetName(self, name):
self.name = name
def GetName(self):
return self.name
class DelegatingNamedObject(sample_factory_mojom.NamedObject):
def __init__(self):
self.proxy = _BuildProxy(NamedObjectImpl())
def SetName(self, name):
self.proxy.SetName(name)
def GetName(self):
return self.proxy.GetName()
class InterfaceTest(mojo_unittest.MojoTestCase):
def testBaseInterface(self):
service = sample_service_mojom.Service()
with self.assertRaises(AttributeError):
service.NotExisting()
with self.assertRaises(NotImplementedError):
service.Frobinate()
def testEmpty(self):
service = EmptyServiceImpl()
with self.assertRaises(NotImplementedError):
service.Frobinate()
def testServiceWithReturnValue(self):
proxy = _BuildProxy(DelegatingNamedObject())
p1 = proxy.GetName()
self.assertEquals(p1.state, promise.Promise.STATE_PENDING)
self.loop.RunUntilIdle()
self.assertEquals(p1.state, promise.Promise.STATE_FULLFILLED)
name = _ExtractValue(p1)
self.assertEquals(name, 'name')
proxy.SetName('hello')
p2 = proxy.GetName()
self.assertEquals(p2.state, promise.Promise.STATE_PENDING)
self.loop.RunUntilIdle()
self.assertEquals(p2.state, promise.Promise.STATE_FULLFILLED)
name = _ExtractValue(p2)
self.assertEquals(name, 'hello')
def testCloseProxy(self):
named_object_impl = NamedObjectImpl()
proxy = _BuildProxy(named_object_impl)
response = proxy.GetName()
proxy.manager.Close()
self.assertEquals(response.state, promise.Promise.STATE_REJECTED)
def testCloseImplementationWithResponse(self):
impl = DelegatingNamedObject()
proxy = _BuildProxy(impl)
p1 = proxy.GetName()
self.assertEquals(p1.state, promise.Promise.STATE_PENDING)
impl.manager.Close()
self.loop.RunUntilIdle()
self.assertEquals(p1.state, promise.Promise.STATE_REJECTED)