# Copyright 2015 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. # pylint: disable=F0401,E0611 import mojo_bindings.promise as promise import mojo_system as system import mojo_unittest import sample_interfaces_mojom def _BuildProxy(impl): pipe = system.MessagePipe() impl.__class__.manager.Bind(impl, pipe.handle0) return impl.__class__.manager.Proxy(pipe.handle1) def _ExtractValue(v_promise): container = [] @promise.async def GetInternalValue(value): container.append(value) GetInternalValue(v_promise) assert len(container) return container[0] class IntegerAccessorImpl(sample_interfaces_mojom.IntegerAccessor): """ Interface definition is in mojo/public/interfaces/bindings/tests/sample_interfaces.mojom """ def __init__(self): self.values = { 'data': 0, 'type': 0, } def GetInteger(self): return self.values; def SetInteger(self, **values): self.values = values def GetInternalValue(self): return self.values['data'] class ControlMessagesTest(mojo_unittest.MojoTestCase): def testQueryVersion(self): p = _BuildProxy(IntegerAccessorImpl()) self.assertEquals(p.manager.version, 0) v_promise = p.manager.QueryVersion() self.loop.RunUntilIdle() self.assertEquals(v_promise.state, promise.Promise.STATE_FULLFILLED) self.assertEquals(_ExtractValue(v_promise), 3) self.assertEquals(p.manager.version, 3) def testRequireVersion(self): impl = IntegerAccessorImpl() errors = [] p = _BuildProxy(impl) p.manager.AddOnErrorCallback(lambda: errors.append(0)) self.assertEquals(p.manager.version, 0) p.manager.RequireVersion(1) self.assertEquals(p.manager.version, 1) p.SetInteger(123, sample_interfaces_mojom.Enum.VALUE) self.loop.RunUntilIdle() self.assertEquals(len(errors), 0) self.assertEquals(impl.GetInternalValue(), 123) p.manager.RequireVersion(3) self.assertEquals(p.manager.version, 3) p.SetInteger(456, sample_interfaces_mojom.Enum.VALUE) self.loop.RunUntilIdle() self.assertEquals(len(errors), 0) self.assertEquals(impl.GetInternalValue(), 456) # Require a version that is not supported by the implementation side. p.manager.RequireVersion(4) # version is updated synchronously. self.assertEquals(p.manager.version, 4) p.SetInteger(789, sample_interfaces_mojom.Enum.VALUE) self.loop.RunUntilIdle() self.assertEquals(len(errors), 1) # The call to SetInteger() after RequireVersion() is ignored. self.assertEquals(impl.GetInternalValue(), 456)