3 # Copyright (C) 2019 EfficiOS Inc.
5 # This program is free software; you can redistribute it and/or
6 # modify it under the terms of the GNU General Public License
7 # as published by the Free Software Foundation; only version 2
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
15 # You should have received a copy of the GNU General Public License
16 # along with this program; if not, write to the Free Software
17 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
27 class UserMessageIteratorTestCase(unittest
.TestCase
):
29 def _create_graph(src_comp_cls
):
30 class MySink(bt2
._UserSinkComponent
):
31 def __init__(self
, params
):
32 self
._add
_input
_port
('in')
37 def _graph_is_configured(self
):
38 self
._msg
_iter
= self
._input
_ports
['in'].create_message_iterator()
41 src_comp
= graph
.add_component(src_comp_cls
, 'src')
42 sink_comp
= graph
.add_component(MySink
, 'sink')
43 graph
.connect_ports(src_comp
.output_ports
['out'],
44 sink_comp
.input_ports
['in'])
48 the_output_port_from_source
= None
49 the_output_port_from_iter
= None
51 class MyIter(bt2
._UserMessageIterator
):
52 def __init__(self
, self_port_output
):
54 nonlocal the_output_port_from_iter
56 the_output_port_from_iter
= self_port_output
58 class MySource(bt2
._UserSourceComponent
,
59 message_iterator_class
=MyIter
):
60 def __init__(self
, params
):
61 nonlocal the_output_port_from_source
62 the_output_port_from_source
= self
._add
_output
_port
('out', 'user data')
65 graph
= self
._create
_graph
(MySource
)
67 self
.assertTrue(initialized
)
68 self
.assertEqual(the_output_port_from_source
.addr
, the_output_port_from_iter
.addr
)
69 self
.assertEqual(the_output_port_from_iter
.user_data
, 'user data')
71 def test_finalize(self
):
72 class MyIter(bt2
._UserMessageIterator
):
77 class MySource(bt2
._UserSourceComponent
,
78 message_iterator_class
=MyIter
):
79 def __init__(self
, params
):
80 self
._add
_output
_port
('out')
83 graph
= self
._create
_graph
(MySource
)
86 self
.assertTrue(finalized
)
88 def test_component(self
):
89 class MyIter(bt2
._UserMessageIterator
):
90 def __init__(self
, self_port_output
):
92 salut
= self
._component
._salut
94 class MySource(bt2
._UserSourceComponent
,
95 message_iterator_class
=MyIter
):
96 def __init__(self
, params
):
97 self
._add
_output
_port
('out')
101 graph
= self
._create
_graph
(MySource
)
103 self
.assertEqual(salut
, 23)
106 class MyIter(bt2
._UserMessageIterator
):
107 def __init__(self
, self_port_output
):
111 class MySource(bt2
._UserSourceComponent
,
112 message_iterator_class
=MyIter
):
113 def __init__(self
, params
):
114 self
._add
_output
_port
('out')
117 graph
= self
._create
_graph
(MySource
)
119 self
.assertIsNotNone(addr
)
120 self
.assertNotEqual(addr
, 0)
122 # Test that messages returned by _UserMessageIterator.__next__ remain valid
123 # and can be re-used.
124 def test_reuse_message(self
):
125 class MyIter(bt2
._UserMessageIterator
):
126 def __init__(self
, port
):
127 tc
, sc
, ec
= port
.user_data
129 stream
= trace
.create_stream(sc
)
130 packet
= stream
.create_packet()
132 # This message will be returned twice by __next__.
133 event_message
= self
._create
_event
_message
(ec
, packet
)
136 self
._create
_stream
_beginning
_message
(stream
),
137 self
._create
_stream
_activity
_beginning
_message
(stream
),
138 self
._create
_packet
_beginning
_message
(packet
),
144 return self
._msgs
.pop(0)
146 class MySource(bt2
._UserSourceComponent
, message_iterator_class
=MyIter
):
147 def __init__(self
, params
):
148 tc
= self
._create
_trace
_class
()
149 sc
= tc
.create_stream_class()
150 ec
= sc
.create_event_class()
151 self
._add
_output
_port
('out', (tc
, sc
, ec
))
154 src
= graph
.add_component(MySource
, 'src')
155 it
= graph
.create_output_port_message_iterator(src
.output_ports
['out'])
157 # Skip beginning messages.
165 self
.assertIsInstance(msg_ev1
, bt2
.message
._EventMessage
)
166 self
.assertIsInstance(msg_ev2
, bt2
.message
._EventMessage
)
167 self
.assertEqual(msg_ev1
.addr
, msg_ev2
.addr
)
170 class OutputPortMessageIteratorTestCase(unittest
.TestCase
):
171 def test_component(self
):
172 class MyIter(bt2
._UserMessageIterator
):
173 def __init__(self
, self_port_output
):
181 msg
= self
._create
_stream
_beginning
_message
(test_obj
._stream
)
183 msg
= self
._create
_packet
_beginning
_message
(test_obj
._packet
)
185 msg
= self
._create
_packet
_end
_message
(test_obj
._packet
)
187 msg
= self
._create
_stream
_end
_message
(test_obj
._stream
)
189 msg
= self
._create
_event
_message
(test_obj
._event
_class
, test_obj
._packet
)
190 msg
.event
.payload_field
['my_int'] = self
._at
* 3
195 class MySource(bt2
._UserSourceComponent
,
196 message_iterator_class
=MyIter
):
197 def __init__(self
, params
):
198 self
._add
_output
_port
('out')
200 trace_class
= self
._create
_trace
_class
()
201 stream_class
= trace_class
.create_stream_class()
203 # Create payload field class
204 my_int_ft
= trace_class
.create_signed_integer_field_class(32)
205 payload_ft
= trace_class
.create_structure_field_class()
206 payload_ft
+= collections
.OrderedDict([
207 ('my_int', my_int_ft
),
210 event_class
= stream_class
.create_event_class(name
='salut', payload_field_class
=payload_ft
)
212 trace
= trace_class()
213 stream
= trace
.create_stream(stream_class
)
214 packet
= stream
.create_packet()
216 test_obj
._event
_class
= event_class
217 test_obj
._stream
= stream
218 test_obj
._packet
= packet
222 src
= graph
.add_component(MySource
, 'src')
223 msg_iter
= graph
.create_output_port_message_iterator(src
.output_ports
['out'])
225 for at
, msg
in enumerate(msg_iter
):
227 self
.assertIsInstance(msg
, bt2
.message
._StreamBeginningMessage
)
229 self
.assertIsInstance(msg
, bt2
.message
._PacketBeginningMessage
)
231 self
.assertIsInstance(msg
, bt2
.message
._PacketEndMessage
)
233 self
.assertIsInstance(msg
, bt2
.message
._StreamEndMessage
)
235 self
.assertIsInstance(msg
, bt2
.message
._EventMessage
)
236 self
.assertEqual(msg
.event
.cls
.name
, 'salut')
237 field
= msg
.event
.payload_field
['my_int']
238 self
.assertEqual(field
, at
* 3)