Commit 2b462740 authored by oroulet's avatar oroulet

fix event async stuff

parent 53e59237
......@@ -4,7 +4,7 @@ import uuid
from opcua import ua
from opcua import Node
from opcua.common import events, event_object
from opcua.common import events, event_objects
__all__ = ["EventGenerator"]
......@@ -26,8 +26,10 @@ class EventGenerator:
self.logger = logging.getLogger(__name__)
self.isession = isession
self.event = None
self.emitting_node = None
async def init(self, etype=None, emitting_node=ua.ObjectIds.Server):
node = None
if isinstance(etype, event_objects.BaseEvent):
self.event = etype
......@@ -37,19 +39,22 @@ class EventGenerator:
node = Node(self.isession, etype)
else:
node = Node(self.isession, ua.NodeId(etype))
if node:
self.event = await events.get_event_obj_from_type_node(node)
if isinstance(emitting_node, Node):
pass
elif isinstance(emitting_node, ua.NodeId):
emitting_node = Node(isession, emitting_node)
emitting_node = Node(self.isession, emitting_node)
else:
emitting_node = Node(isession, ua.NodeId(emitting_node))
emitting_node = Node(self.isession, ua.NodeId(emitting_node))
self.event.emitting_node = emitting_node.nodeid
if not self.event.SourceNode:
self.event.SourceNode = emitting_node.nodeid
self.event.SourceName = (await emitting_node.get_browse_name()).Name
if not self.event.SourceName:
self.event.SourceName = (await Node(self.isession, self.event.SourceNode).get_browse_name()).Name
await emitting_node.set_event_notifier([ua.EventNotifier.SubscribeToEvents])
refs = []
......
......@@ -410,6 +410,7 @@ class Server:
"""
if not etype:
etype = BaseEvent()
ev_gen = EventGenerator(self.iserver.isession)
await ev_gen.init(etype, emitting_node=emitting_node)
return ev_gen
......
......@@ -229,19 +229,19 @@ async def test_eventgenerator_BaseEvent_Identifier(server):
async def test_eventgenerator_sourceServer_Node(server):
evgen = await server.get_event_generator(source=opcua.Node(server.iserver.isession, ua.NodeId(ua.ObjectIds.Server)))
evgen = await server.get_event_generator(emitting_node=opcua.Node(server.iserver.isession, ua.NodeId(ua.ObjectIds.Server)))
await check_eventgenerator_base_event(evgen, server)
await check_eventgenerator_source_server(evgen, server)
async def test_eventgenerator_sourceServer_NodeId(server):
evgen = await server.get_event_generator(source=ua.NodeId(ua.ObjectIds.Server))
evgen = await server.get_event_generator(emitting_node=ua.NodeId(ua.ObjectIds.Server))
await check_eventgenerator_base_event(evgen, server)
await check_eventgenerator_source_server(evgen, server)
async def test_eventgenerator_sourceServer_ObjectIds(server):
evgen = await server.get_event_generator(source=ua.ObjectIds.Server)
evgen = await server.get_event_generator(emitting_node=ua.ObjectIds.Server)
await check_eventgenerator_base_event(evgen, server)
await check_eventgenerator_source_server(evgen, server)
......@@ -249,7 +249,7 @@ async def test_eventgenerator_sourceServer_ObjectIds(server):
async def test_eventgenerator_sourceMyObject(server):
objects = server.get_objects_node()
o = await objects.add_object(3, 'MyObject')
evgen = await server.get_event_generator(source=o)
evgen = await server.get_event_generator(emitting_node=o)
await check_eventgenerator_base_event(evgen, server)
await check_event_generator_object(evgen, o)
......@@ -260,7 +260,7 @@ async def test_eventgenerator_source_collision(server):
event = BaseEvent(sourcenode=o.nodeid)
evgen = await server.get_event_generator(event, ua.ObjectIds.Server)
await check_eventgenerator_base_event(evgen, server)
await check_event_generator_object(evgen, o)
await check_event_generator_object(evgen, o, emitting_node=opcua.Node(server.iserver.isession, ua.ObjectIds.Server))
async def test_eventgenerator_inherited_event(server):
......@@ -526,14 +526,18 @@ async def check_eventgenerator_source_server(evgen, server: Server):
assert len(refs) >= 1
async def check_event_generator_object(evgen, obj):
async def check_event_generator_object(evgen, obj, emitting_node=None):
assert evgen.event.SourceName == (await obj.get_browse_name()).Name
assert evgen.event.SourceNode == obj.nodeid
assert await obj.get_event_notifier() == {ua.EventNotifier.SubscribeToEvents}
refs = await obj.get_referenced_nodes(ua.ObjectIds.GeneratesEvent, ua.BrowseDirection.Forward,
ua.NodeClass.ObjectType, False)
assert len(refs) == 1
assert refs[0].nodeid == evgen.event.EventType
if not emitting_node:
assert await obj.get_event_notifier() == {ua.EventNotifier.SubscribeToEvents}
refs = await obj.get_referenced_nodes(ua.ObjectIds.GeneratesEvent, ua.BrowseDirection.Forward, ua.NodeClass.ObjectType, False)
else:
assert await emitting_node.get_event_notifier() == {ua.EventNotifier.SubscribeToEvents}
refs = await emitting_node.get_referenced_nodes(ua.ObjectIds.GeneratesEvent, ua.BrowseDirection.Forward, ua.NodeClass.ObjectType, False)
assert evgen.event.EventType in [x.nodeid for x in refs]
async def check_eventgenerator_base_event(evgen, server: Server):
......
......@@ -367,7 +367,7 @@ async def test_events_default(opc):
async def test_events_MyObject(opc):
objects = opc.server.get_objects_node()
o = await objects.add_object(3, 'MyObject')
evgen = await opc.server.get_event_generator(source=o)
evgen = await opc.server.get_event_generator(emitting_node=o)
myhandler = MySubHandler()
sub = await opc.opc.create_subscription(100, myhandler)
handle = await sub.subscribe_events(o)
......@@ -389,7 +389,7 @@ async def test_events_MyObject(opc):
async def test_events_wrong_source(opc):
objects = opc.server.get_objects_node()
o = await objects.add_object(3, 'MyObject')
evgen = await opc.server.get_event_generator(source=o)
evgen = await opc.server.get_event_generator(emitting_node=o)
myhandler = MySubHandler()
sub = await opc.opc.create_subscription(100, myhandler)
handle = await sub.subscribe_events()
......@@ -439,7 +439,7 @@ async def test_events_CustomEvent_MyObject(opc):
etype = await opc.server.create_custom_event_type(2, 'MyEvent', ua.ObjectIds.BaseEventType,
[('PropertyNum', ua.VariantType.Float),
('PropertyString', ua.VariantType.String)])
evgen = await opc.server.get_event_generator(etype, o)
evgen = await opc.server.get_event_generator(etype, emitting_node=o)
myhandler = MySubHandler()
sub = await opc.opc.create_subscription(100, myhandler)
handle = await sub.subscribe_events(o, etype)
......
......@@ -526,47 +526,47 @@ def check_eventgenerator_SourceServer(test, evgen):
def check_event_generator_object(test, evgen, obj, emitting_node=None):
test.assertEqual(evgen.event.SourceName, obj.get_browse_name().Name)
test.assertEqual(evgen.event.SourceNode, obj.nodeid)
assert evgen.event.SourceName == (await obj.get_browse_name()).Name
assert evgen.event.SourceNode == obj.nodeid)
if not emitting_node:
test.assertEqual(obj.get_event_notifier(), {ua.EventNotifier.SubscribeToEvents})
refs = obj.get_referenced_nodes(ua.ObjectIds.GeneratesEvent, ua.BrowseDirection.Forward, ua.NodeClass.ObjectType, False)
assert await obj.get_event_notifier() == {ua.EventNotifier.SubscribeToEvents}
refs = await obj.get_referenced_nodes(ua.ObjectIds.GeneratesEvent, ua.BrowseDirection.Forward, ua.NodeClass.ObjectType, False)
else:
test.assertEqual(emitting_node.get_event_notifier(), {ua.EventNotifier.SubscribeToEvents})
refs = emitting_node.get_referenced_nodes(ua.ObjectIds.GeneratesEvent, ua.BrowseDirection.Forward, ua.NodeClass.ObjectType, False)
assert await emitting_node.get_event_notifier() == {ua.EventNotifier.SubscribeToEvents}
refs = await emitting_node.get_referenced_nodes(ua.ObjectIds.GeneratesEvent, ua.BrowseDirection.Forward, ua.NodeClass.ObjectType, False)
test.assertIn(evgen.event.EventType, [x.nodeid for x in refs])
assert evgen.event.EventType in [x.nodeid for x in refs]
def check_eventgenerator_BaseEvent(test, evgen):
test.assertIsNot(evgen, None) # we did not receive event generator
test.assertIs(evgen.isession, test.opc.iserver.isession)
assert evgen is not None) # we did not receive event generator
assert evgen.isession is test.opc.iserver.isession
check_base_event(test, evgen.event)
def check_base_event(test, ev):
test.assertIsNot(ev, None) # we did not receive event
test.assertIsInstance(ev, BaseEvent)
test.assertEqual(ev.EventType, ua.NodeId(ua.ObjectIds.BaseEventType))
test.assertEqual(ev.Severity, 1)
assert ev is not None
assert isinstance(ev, BaseEvent)
assert ev.EventType == ua.NodeId(ua.ObjectIds.BaseEventType)
assert ev.Severity == 1
def check_eventgenerator_CustomEvent(test, evgen, etype):
test.assertIsNot(evgen, None) # we did not receive event generator
test.assertIs(evgen.isession, test.opc.iserver.isession)
assert evgen is not None # we did not receive event generator
assert evgen.isession is test.opc.iserver.isession
check_custom_event(test, evgen.event, etype)
def check_custom_event(test, ev, etype):
test.assertIsNot(ev, None) # we did not receive event
test.assertIsInstance(ev, BaseEvent)
test.assertEqual(ev.EventType, etype.nodeid)
test.assertEqual(ev.Severity, 1)
assert ev is not None
assert isinstance(ev, BaseEvent)
assert ev.EventType == etype.nodeid
assert ev.Severity == 1
def check_custom_type(test, type, base_type):
base = opcua.Node(test.opc.iserver.isession, ua.NodeId(base_type))
test.assertTrue(type in base.get_children())
test.assertTrue(type in await base.get_children())
nodes = type.get_referenced_nodes(refs=ua.ObjectIds.HasSubtype, direction=ua.BrowseDirection.Inverse, includesubtypes=True)
test.assertEqual(base, nodes[0])
properties = type.get_properties()
......
......@@ -374,12 +374,12 @@ class SubscriptionTests(object):
objects = self.srv.get_objects_node()
o = objects.add_object(3, 'MyObject')
evgen = self.srv.get_event_generator()
evgen.event.SourceNode=o.nodeid
evgen.event.SourceName=o.get_browse_name().Name
evgen.event.SourceNode = o.nodeid
evgen.event.SourceName = (await o.get_browse_name()).Name
myhandler = MySubHandler()
sub = self.opc.create_subscription(100, myhandler)
handle = sub.subscribe_events()
handle = await sub.subscribe_events()
tid = datetime.utcnow()
msg = "this is my msg "
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment