+ comp = self._create_comp(MySource)
+ self.assertEqual(len(user_datas), 3)
+ self.assertIs(user_datas[0], None)
+ self.assertEqual(user_datas[1], 2)
+ self.assertIs(type(user_datas[2]), MyUserData)
+
+ # Verify that the user data gets freed.
+ self.assertEqual(objects_deleted, 0)
+ del user_datas
+ del comp
+ self.assertEqual(objects_deleted, 1)
+
+ def test_filter_self_port_user_data(self):
+ class MyUserData:
+ def __del__(self):
+ nonlocal objects_deleted
+ objects_deleted += 1
+
+ class MyFilter(
+ bt2._UserFilterComponent, message_iterator_class=bt2._UserMessageIterator
+ ):
+ def __init__(comp_self, config, params, obj):
+ nonlocal user_datas
+
+ p = comp_self._add_output_port('port1')
+ user_datas.append(p.user_data)
+ p = comp_self._add_output_port('port2', 'user data string')
+ user_datas.append(p.user_data)
+ p = comp_self._add_output_port('port3', MyUserData())
+ user_datas.append(p.user_data)
+
+ p = comp_self._add_input_port('port4')
+ user_datas.append(p.user_data)
+ p = comp_self._add_input_port('port5', user_data={'user data': 'dict'})
+ user_datas.append(p.user_data)
+ p = comp_self._add_input_port('port6', MyUserData())
+ user_datas.append(p.user_data)
+
+ user_datas = []
+ objects_deleted = 0