From b2395c98aa17a75a1f6202e6fbc24b0c9d502ab2 Mon Sep 17 00:00:00 2001
From: Philip ABBET <philip.abbet@idiap.ch>
Date: Mon, 16 Oct 2017 15:25:53 +0200
Subject: [PATCH] [unittests] Update to the latest beat.backend.python version

---
 beat/core/test/test_inputs.py          | 988 +++++++++++++++----------
 beat/core/test/test_message_handler.py |   6 +-
 2 files changed, 613 insertions(+), 381 deletions(-)

diff --git a/beat/core/test/test_inputs.py b/beat/core/test/test_inputs.py
index c0c8554e..021a0aa9 100644
--- a/beat/core/test/test_inputs.py
+++ b/beat/core/test/test_inputs.py
@@ -28,6 +28,7 @@
 
 import six
 import nose.tools
+import unittest
 
 from .mocks import MockDataSource
 
@@ -37,556 +38,783 @@ from ..dataformat import DataFormat
 
 from . import prefix
 
-def test_input_creation():
 
-    data_source = MockDataSource([], [])
+class InputTest(unittest.TestCase):
 
-    input = Input('test', 'mock', data_source)
+    def test_creation(self):
+        data_source = MockDataSource([], [])
 
-    assert input.data is None
-    assert input.group is None
-    nose.tools.eq_(input.data_format, 'mock')
-    nose.tools.eq_(input.data_index, -1)
-    nose.tools.eq_(input.data_index_end, -1)
-    nose.tools.eq_(input.data_source, data_source)
-    nose.tools.eq_(input.name, 'test')
-    nose.tools.eq_(input.nb_data_blocks_read, 0)
+        input = Input('test', 'mock', data_source)
 
+        self.assertTrue(input.data is None)
+        self.assertTrue(input.group is None)
+        self.assertEqual(input.data_format, 'mock')
+        self.assertEqual(input.data_index, -1)
+        self.assertEqual(input.data_index_end, -1)
+        self.assertTrue(input.data_same_as_previous)
+        self.assertEqual(input.data_source, data_source)
+        self.assertEqual(input.name, 'test')
+        self.assertEqual(input.nb_data_blocks_read, 0)
 
-def test_input_no_more_data():
 
-    data_source = MockDataSource([], [])
+    def test_no_more_data(self):
+        data_source = MockDataSource([], [])
 
-    input = Input('test', 'mock', data_source)
+        input = Input('test', 'mock', data_source)
 
-    assert not input.hasMoreData()
+        self.assertFalse(input.hasMoreData())
 
 
-def test_input_next():
+    def test_has_more_data(self):
+        dataformat = DataFormat(prefix, 'user/single_integer/1')
 
-    dataformat = DataFormat(prefix, 'user/single_integer/1')
-    assert dataformat.valid
+        data_source = MockDataSource([ dataformat.type(value=10) ], [ (0, 0) ])
 
-    data_source = MockDataSource([ dataformat.type(value=10) ], [ (0, 0) ])
-    input = Input('test', 'mock', data_source)
+        input = Input('test', 'mock', data_source)
 
-    assert input.hasMoreData()
+        self.assertTrue(input.hasMoreData())
 
-    input.next()
 
-    assert input.data is not None
-    nose.tools.eq_(input.data.value, 10)
-    nose.tools.eq_(input.data_index, 0)
-    nose.tools.eq_(input.data_index_end, 0)
-    nose.tools.eq_(input.nb_data_blocks_read, 1)
+    def test_retrieve_one_data_unit(self):
+        group = InputGroup('channel1', restricted_access=False)
 
-    assert not input.hasMoreData()
+        dataformat = DataFormat(prefix, 'user/single_integer/1')
 
+        data_source = MockDataSource([ dataformat.type(value=10), dataformat.type(value=20) ],
+                                     [ (0, 0), (1, 1) ])
 
-def test_restricted_creation():
+        input = Input('test', 'mock', data_source)
 
-    group = InputGroup('channel1')
+        group.add(input)
 
-    assert group.restricted_access
-    assert group.synchronization_listener is None
-    nose.tools.eq_(group.channel, 'channel1')
-    nose.tools.eq_(len(group), 0)
-    nose.tools.eq_(group.data_index, -1)
-    nose.tools.eq_(group.data_index_end, -1)
+        self.assertTrue(input.hasMoreData())
+        self.assertFalse(input.hasDataChanged())
+        self.assertTrue(input.isDataUnitDone())
 
+        input.next()
 
-def test_restricted_one_input():
+        self.assertTrue(input.data is not None)
+        self.assertEqual(input.data.value, 10)
+        self.assertEqual(input.data_index, 0)
+        self.assertEqual(input.data_index_end, 0)
+        self.assertFalse(input.data_same_as_previous)
+        self.assertEqual(input.nb_data_blocks_read, 1)
 
-    data_source = MockDataSource([], [])
+        self.assertTrue(input.hasMoreData())
+        self.assertTrue(input.hasDataChanged())
+        self.assertTrue(input.isDataUnitDone())
 
-    input = Input('input1', 'mock', data_source)
 
-    group = InputGroup('channel1')
+    def test_retrieve_all_data_units(self):
+        group = InputGroup('channel1', restricted_access=False)
 
-    group.add(input)
+        dataformat = DataFormat(prefix, 'user/single_integer/1')
 
-    nose.tools.eq_(input.group, group)
-    nose.tools.eq_(len(group), 1)
+        data_source = MockDataSource([ dataformat.type(value=10) ], [ (0, 0) ])
+        input = Input('test', 'mock', data_source)
 
-    nose.tools.eq_(group['input1'], input)
+        group.add(input)
 
+        self.assertTrue(input.hasMoreData())
+        self.assertFalse(input.hasDataChanged())
+        self.assertTrue(input.isDataUnitDone())
 
-def test_restricted_two_inputs():
+        input.next()
 
-    data_source1 = MockDataSource([], [])
-    input1 = Input('input1', 'mock', data_source1)
+        self.assertTrue(input.data is not None)
+        self.assertEqual(input.data.value, 10)
+        self.assertEqual(input.data_index, 0)
+        self.assertEqual(input.data_index_end, 0)
+        self.assertFalse(input.data_same_as_previous)
+        self.assertEqual(input.nb_data_blocks_read, 1)
 
-    data_source2 = MockDataSource([], [])
-    input2 = Input('input2', 'mock', data_source2)
+        self.assertFalse(input.hasMoreData())
+        self.assertTrue(input.hasDataChanged())
+        self.assertTrue(input.isDataUnitDone())
 
-    group = InputGroup('channel1')
 
-    group.add(input1)
-    group.add(input2)
+    def test_restricted_access(self):
+        group = InputGroup('channel1', restricted_access=True)
 
-    nose.tools.eq_(input1.group, group)
-    nose.tools.eq_(input2.group, group)
-    nose.tools.eq_(len(group), 2)
+        dataformat = DataFormat(prefix, 'user/single_integer/1')
 
-    nose.tools.eq_(group['input1'], input1)
-    nose.tools.eq_(group['input2'], input2)
+        data_source = MockDataSource([ dataformat.type(value=10) ], [ (0, 0) ])
+        input = Input('test', 'mock', data_source)
 
+        group.add(input)
 
-def test_restricted_no_more_data():
-    data_source1 = MockDataSource([], [])
-    input1 = Input('input1', 'mock', data_source1)
+        self.assertTrue(input.hasMoreData())
+        self.assertFalse(input.hasDataChanged())
+        self.assertTrue(input.isDataUnitDone())
 
-    data_source2 = MockDataSource([], [])
-    input2 = Input('input2', 'mock', data_source2)
+        with self.assertRaises(RuntimeError):
+            input.next()
 
-    group = InputGroup('channel1')
 
-    group.add(input1)
-    group.add(input2)
+#----------------------------------------------------------
 
-    assert not group.hasMoreData()
 
+class RestrictedInputGroupTest(unittest.TestCase):
 
-@nose.tools.raises(RuntimeError)
-def test_restricted_cannot_call_next():
-    group = InputGroup('channel1')
-    group.next()
+    def test_creation(self):
+        group = InputGroup('channel1')
 
+        self.assertTrue(group.restricted_access)
+        self.assertTrue(group.synchronization_listener is None)
+        self.assertEqual(group.channel, 'channel1')
+        self.assertEqual(len(group), 0)
+        self.assertEqual(group.data_index, -1)
+        self.assertEqual(group.data_index_end, -1)
 
-def test_fullaccess_creation():
-    group = InputGroup('channel1', restricted_access=False)
 
-    assert not group.restricted_access
-    assert group.synchronization_listener is None
-    nose.tools.eq_(group.channel, 'channel1')
-    nose.tools.eq_(len(group), 0)
-    nose.tools.eq_(group.data_index, -1)
-    nose.tools.eq_(group.data_index_end, -1)
+    def test_add_one_input(self):
+        data_source = MockDataSource([], [])
 
+        input = Input('input1', 'mock', data_source)
 
-def test_fullaccess_creation_with_listener():
-    listener = SynchronizationListener()
+        group = InputGroup('channel1')
 
-    group = InputGroup('channel1', synchronization_listener=listener,
-                       restricted_access=False)
+        group.add(input)
 
-    assert not group.restricted_access
-    nose.tools.eq_(group.synchronization_listener, listener)
-    nose.tools.eq_(group.channel, 'channel1')
-    nose.tools.eq_(len(group), 0)
-    nose.tools.eq_(group.data_index, -1)
-    nose.tools.eq_(group.data_index_end, -1)
+        self.assertEqual(input.group, group)
+        self.assertEqual(len(group), 1)
+        self.assertEqual(group['input1'], input)
 
-    nose.tools.eq_(listener.data_index_start, -1)
-    nose.tools.eq_(listener.data_index_end, -1)
 
+    def test_add_two_inputs(self):
+        data_source1 = MockDataSource([], [])
+        input1 = Input('input1', 'mock', data_source1)
 
-def test_fullaccess_one_input():
-    data_source = MockDataSource([], [])
+        data_source2 = MockDataSource([], [])
+        input2 = Input('input2', 'mock', data_source2)
 
-    input = Input('input1', 'mock', data_source)
+        group = InputGroup('channel1')
 
-    group = InputGroup('channel1', restricted_access=False)
+        group.add(input1)
+        group.add(input2)
 
-    group.add(input)
+        self.assertEqual(input1.group, group)
+        self.assertEqual(input2.group, group)
+        self.assertEqual(len(group), 2)
+        self.assertEqual(group['input1'], input1)
+        self.assertEqual(group['input2'], input2)
 
-    nose.tools.eq_(input.group, group)
-    nose.tools.eq_(len(group), 1)
 
-    nose.tools.eq_(group['input1'], input)
+    def test_no_more_data(self):
+        data_source1 = MockDataSource([], [])
+        input1 = Input('input1', 'mock', data_source1)
 
+        data_source2 = MockDataSource([], [])
+        input2 = Input('input2', 'mock', data_source2)
 
-def test_fullaccess_two_inputs():
-    data_source1 = MockDataSource([], [])
-    input1 = Input('input1', 'mock', data_source1)
+        group = InputGroup('channel1')
 
-    data_source2 = MockDataSource([], [])
-    input2 = Input('input2', 'mock', data_source2)
+        group.add(input1)
+        group.add(input2)
 
-    group = InputGroup('channel1', restricted_access=False)
+        self.assertFalse(group.hasMoreData())
 
-    group.add(input1)
-    group.add(input2)
 
-    nose.tools.eq_(input1.group, group)
-    nose.tools.eq_(input2.group, group)
-    nose.tools.eq_(len(group), 2)
+    def test_has_more_data(self):
+        dataformat = DataFormat(prefix, 'user/single_integer/1')
 
-    nose.tools.eq_(group['input1'], input1)
-    nose.tools.eq_(group['input2'], input2)
+        data_source1 = MockDataSource([ dataformat.type(value=10) ], [ (0, 0) ])
+        input1 = Input('input1', 'mock', data_source1)
 
+        data_source2 = MockDataSource([ dataformat.type(value=10) ], [ (0, 0) ])
+        input2 = Input('input2', 'mock', data_source2)
 
-def test_fullaccess_no_more_data():
-    data_source1 = MockDataSource([], [])
-    input1 = Input('input1', 'mock', data_source1)
+        group = InputGroup('channel1')
 
-    data_source2 = MockDataSource([], [])
-    input2 = Input('input2', 'mock', data_source2)
+        group.add(input1)
+        group.add(input2)
 
-    group = InputGroup('channel1', restricted_access=False)
+        self.assertTrue(group.hasMoreData())
 
-    group.add(input1)
-    group.add(input2)
 
-    assert not group.hasMoreData()
+    def test_restricted_access(self):
+        group = InputGroup('channel1')
+        with self.assertRaises(RuntimeError):
+            group.next()
 
 
-def test_fullaccess_one_input_iteration():
+#----------------------------------------------------------
 
-    dataformat = DataFormat(prefix, 'user/single_integer/1')
-    assert dataformat.valid
 
-    listener = SynchronizationListener()
+class InputGroupTest(unittest.TestCase):
 
-    group = InputGroup('channel1', synchronization_listener=listener,
-                       restricted_access=False)
+    def test_creation(self):
+        group = InputGroup('channel1', restricted_access=False)
 
-    data_source = MockDataSource(map(lambda x: dataformat.type(value=x),
-        six.moves.range(0, 5)), [(0, 0), (1, 1), (2, 3), (4, 4), (5, 5)])
-    input = Input('input1', 'mock', data_source)
+        self.assertFalse(group.restricted_access)
+        self.assertTrue(group.synchronization_listener is None)
+        self.assertEqual(group.channel, 'channel1')
+        self.assertEqual(len(group), 0)
+        self.assertEqual(group.data_index, -1)
+        self.assertEqual(group.data_index_end, -1)
 
-    group.add(input)
 
-    offset = 0
-    for i in six.moves.range(0, 5):
-        assert input.hasMoreData()
+    def test_creation_with_listener(self):
+        listener = SynchronizationListener()
 
-        assert group.hasMoreData()
-        group.next()
+        group = InputGroup('channel1', synchronization_listener=listener,
+                           restricted_access=False)
 
-        assert input.data is not None
-        nose.tools.eq_(input.data.value, i)
-        nose.tools.eq_(input.data_index, i + offset)
-        nose.tools.eq_(input.nb_data_blocks_read, i + 1)
+        self.assertFalse(group.restricted_access)
+        self.assertEqual(group.synchronization_listener, listener)
+        self.assertEqual(group.channel, 'channel1')
+        self.assertEqual(len(group), 0)
+        self.assertEqual(group.data_index, -1)
+        self.assertEqual(group.data_index_end, -1)
 
-        nose.tools.eq_(group.data_index, i + offset)
-        nose.tools.eq_(listener.data_index_start, i + offset)
+        self.assertEqual(listener.data_index_start, -1)
+        self.assertEqual(listener.data_index_end, -1)
 
-        if i == 2:
-            offset += 1
 
-        nose.tools.eq_(input.data_index_end, i + offset)
-        nose.tools.eq_(group.data_index_end, i + offset)
-        nose.tools.eq_(listener.data_index_end, i + offset)
+    def test_add_one_input(self):
+        data_source = MockDataSource([], [])
 
-    assert not input.hasMoreData()
-    assert not group.hasMoreData()
+        input = Input('input1', 'mock', data_source)
 
+        group = InputGroup('channel1', restricted_access=False)
 
-def test_fullaccess_three_inputs_iteration__same_frequency():
-    dataformat = DataFormat(prefix, 'user/single_integer/1')
-    assert dataformat.valid
+        group.add(input)
 
-    listener = SynchronizationListener()
+        self.assertEqual(input.group, group)
+        self.assertEqual(len(group), 1)
+        self.assertEqual(group['input1'], input)
 
-    group = InputGroup('channel1', synchronization_listener=listener,
-                       restricted_access=False)
 
-    data_source1 = MockDataSource(map(lambda x: dataformat.type(value=x),
-        six.moves.range(0, 5)), [(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)])
-    group.add(Input('input1', 'mock', data_source1))
+    def test_add_two_inputs(self):
+        data_source1 = MockDataSource([], [])
+        input1 = Input('input1', 'mock', data_source1)
 
-    data_source2 = MockDataSource(map(lambda x: dataformat.type(value=x),
-        six.moves.range(10, 15)), [(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)])
-    group.add(Input('input2', 'mock', data_source2))
+        data_source2 = MockDataSource([], [])
+        input2 = Input('input2', 'mock', data_source2)
 
-    data_source3 = MockDataSource(map(lambda x: dataformat.type(value=x),
-        six.moves.range(20, 25)), [(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)])
-    group.add(Input('input3', 'mock', data_source3))
+        group = InputGroup('channel1', restricted_access=False)
 
-    nose.tools.eq_(group.data_index, -1)
-    nose.tools.eq_(group.data_index_end, -1)
+        group.add(input1)
+        group.add(input2)
 
-    for i in six.moves.range(0, 5):
-        assert group.hasMoreData()
+        self.assertEqual(input1.group, group)
+        self.assertEqual(input2.group, group)
+        self.assertEqual(len(group), 2)
+        self.assertEqual(group['input1'], input1)
+        self.assertEqual(group['input2'], input2)
 
-        group.next()
 
-        nose.tools.eq_(group.data_index, i)
-        nose.tools.eq_(group.data_index_end, i)
+    def test_no_more_data(self):
+        data_source1 = MockDataSource([], [])
+        input1 = Input('input1', 'mock', data_source1)
 
-        nose.tools.eq_(listener.data_index_start, i)
-        nose.tools.eq_(listener.data_index_end, i)
+        data_source2 = MockDataSource([], [])
+        input2 = Input('input2', 'mock', data_source2)
 
-        input1 = group['input1']
-        assert input1.data is not None
-        nose.tools.eq_(input1.data.value, i)
-        nose.tools.eq_(input1.data_index, i)
-        nose.tools.eq_(input1.data_index_end, i)
-        nose.tools.eq_(input1.nb_data_blocks_read, i + 1)
+        group = InputGroup('channel1', restricted_access=False)
 
-        input2 = group['input2']
-        assert input2.data is not None
-        nose.tools.eq_(input2.data.value, 10 + i)
-        nose.tools.eq_(input2.data_index, i)
-        nose.tools.eq_(input2.data_index_end, i)
-        nose.tools.eq_(input2.nb_data_blocks_read, i + 1)
+        group.add(input1)
+        group.add(input2)
 
-        input3 = group['input3']
-        assert input3.data is not None
-        nose.tools.eq_(input3.data.value, 20 + i)
-        nose.tools.eq_(input3.data_index, i)
-        nose.tools.eq_(input3.data_index_end, i)
-        nose.tools.eq_(input3.nb_data_blocks_read, i + 1)
+        self.assertFalse(group.hasMoreData())
 
-    assert not group.hasMoreData()
 
+    def test_has_more_data(self):
+        dataformat = DataFormat(prefix, 'user/single_integer/1')
 
-def test_fullaccess_three_inputs_iteration__different_frequencies():
-    dataformat = DataFormat(prefix, 'user/single_integer/1')
-    assert dataformat.valid
+        data_source1 = MockDataSource([ dataformat.type(value=10) ], [ (0, 0) ])
+        input1 = Input('input1', 'mock', data_source1)
 
-    listener = SynchronizationListener()
+        data_source2 = MockDataSource([ dataformat.type(value=10) ], [ (0, 0) ])
+        input2 = Input('input2', 'mock', data_source2)
 
-    group = InputGroup('channel1', synchronization_listener=listener,
-                       restricted_access=False)
+        group = InputGroup('channel1', restricted_access=False)
 
-    data_source1 = MockDataSource(map(lambda x: dataformat.type(value=x),
-        six.moves.range(0, 6)), [(0, 0), (1, 1), (2, 2), (3, 3), (4, 4), (5, 5)])
-    group.add(Input('input1', 'mock', data_source1))
+        group.add(input1)
+        group.add(input2)
 
-    data_source2 = MockDataSource(map(lambda x: dataformat.type(value=x),
-        six.moves.range(10, 13)), [(0, 1), (2, 3), (4, 5)])
-    group.add(Input('input2', 'mock', data_source2))
+        self.assertTrue(group.hasMoreData())
 
-    data_source3 = MockDataSource([dataformat.type(value=20)], [(0, 5)])
-    group.add(Input('input3', 'mock', data_source3))
 
-    nose.tools.eq_(group.data_index, -1)
-    nose.tools.eq_(group.data_index_end, -1)
+    def test_retrieve_one_input_iteration(self):
+        indices = [ (0, 0), (1, 1), (2, 3), (4, 4), (5, 5) ]
 
-    for i in six.moves.range(0, 6):
-        assert group.hasMoreData()
+        expected_hasMoreData = [True, True, True, True, False]
+        expected_isDataUnitDone = [True, True, True, True, True]
+        expected_hasDataChanged = [True, True, True, True, True]
 
-        group.next()
-
-        nose.tools.eq_(group.data_index, i)
-        nose.tools.eq_(group.data_index_end, i)
-
-        nose.tools.eq_(listener.data_index_start, i)
-        nose.tools.eq_(listener.data_index_end, i)
-
-        input1 = group['input1']
-        assert input1.data is not None
-        nose.tools.eq_(input1.data.value, i)
-        nose.tools.eq_(input1.data_index, i)
-        nose.tools.eq_(input1.data_index_end, i)
-        nose.tools.eq_(input1.nb_data_blocks_read, i + 1)
-
-        input2 = group['input2']
-        assert input2.data is not None
-        nose.tools.eq_(input2.data.value, 10 + i // 2)
-        nose.tools.eq_(input2.data_index, (i // 2) * 2)
-        nose.tools.eq_(input2.data_index_end, (i // 2) * 2 + 1)
-        nose.tools.eq_(input2.nb_data_blocks_read, (i + 2) // 2)
-
-        input3 = group['input3']
-        assert input3.data is not None
-        nose.tools.eq_(input3.data.value, 20)
-        nose.tools.eq_(input3.data_index, 0)
-        nose.tools.eq_(input3.data_index_end, 5)
-        nose.tools.eq_(input3.nb_data_blocks_read, 1)
 
-    assert not group.hasMoreData()
+        dataformat = DataFormat(prefix, 'user/single_integer/1')
 
+        data_source = MockDataSource([ dataformat.type(value=x) for x in range(0, len(indices)) ],
+                                     indices)
+        input = Input('input', 'mock', data_source)
 
-def test_fullaccess_two_inputs_iteration__desynchronized_frequencies():
-    dataformat = DataFormat(prefix, 'user/single_integer/1')
-    assert dataformat.valid
+        group = InputGroup('channel1', restricted_access=False)
 
-    listener = SynchronizationListener()
+        group.add(input)
 
-    group = InputGroup('channel1', synchronization_listener=listener,
-                       restricted_access=False)
+        self.assertTrue(group.hasMoreData())
 
-    data_source1 = MockDataSource(map(lambda x: dataformat.type(value=x),
-        six.moves.range(0, 6)), [(0, 2), (3, 5), (6, 8),
-            (9, 11), (12, 14), (15, 17)])
-    group.add(Input('input1', 'mock', data_source1))
+        self.assertTrue(input.hasMoreData())
+        self.assertTrue(input.isDataUnitDone())
+        self.assertFalse(input.hasDataChanged())
 
-    data_source2 = MockDataSource(map(lambda x: dataformat.type(value=x),
-        six.moves.range(0, 3)), [(0, 4), (5, 10), (11, 17)])
-    group.add(Input('input2', 'mock', data_source2))
+        for i in range(0, len(indices)):
+            group.next()
 
-    nose.tools.eq_(group.data_index, -1)
-    nose.tools.eq_(group.data_index_end, -1)
-    nose.tools.eq_(listener.data_index_start, -1)
-    nose.tools.eq_(listener.data_index_end, -1)
+            self.assertEqual(group.data_index, indices[i][0])
+            self.assertEqual(group.data_index_end, indices[i][1])
 
-    assert group.hasMoreData()
-    group.next()
-    nose.tools.eq_(group.data_index, 0)
-    nose.tools.eq_(group.data_index_end, 2)
-    nose.tools.eq_(listener.data_index_start, 0)
-    nose.tools.eq_(listener.data_index_end, 2)
+            self.assertTrue(input.data is not None)
+            self.assertEqual(input.data.value, i)
+            self.assertEqual(input.data_index, indices[i][0])
+            self.assertEqual(input.data_index_end, indices[i][1])
+            self.assertFalse(input.data_same_as_previous)
+            self.assertEqual(input.nb_data_blocks_read, i + 1)
 
-    assert group.hasMoreData()
-    group.next()
-    nose.tools.eq_(group.data_index, 3)
-    nose.tools.eq_(group.data_index_end, 4)
-    nose.tools.eq_(listener.data_index_start, 3)
-    nose.tools.eq_(listener.data_index_end, 4)
+            self.assertEqual(group.hasMoreData(), expected_hasMoreData[i])
+            self.assertEqual(input.hasMoreData(), expected_hasMoreData[i])
+            self.assertEqual(input.isDataUnitDone(), expected_isDataUnitDone[i])
+            self.assertEqual(input.hasDataChanged(), expected_hasDataChanged[i])
 
-    assert group.hasMoreData()
-    group.next()
-    nose.tools.eq_(group.data_index, 5)
-    nose.tools.eq_(group.data_index_end, 5)
-    nose.tools.eq_(listener.data_index_start, 5)
-    nose.tools.eq_(listener.data_index_end, 5)
 
-    assert group.hasMoreData()
-    group.next()
-    nose.tools.eq_(group.data_index, 6)
-    nose.tools.eq_(group.data_index_end, 8)
-    nose.tools.eq_(listener.data_index_start, 6)
-    nose.tools.eq_(listener.data_index_end, 8)
+    def test_retrieve_three_inputs_iteration__same_frequency(self):
+        indices = [ (0, 0), (1, 1), (2, 2), (3, 3), (4, 4) ]
 
-    assert group.hasMoreData()
-    group.next()
-    nose.tools.eq_(group.data_index, 9)
-    nose.tools.eq_(group.data_index_end, 10)
-    nose.tools.eq_(listener.data_index_start, 9)
-    nose.tools.eq_(listener.data_index_end, 10)
+        expected_hasMoreData = [True, True, True, True, False]
+        expected_isDataUnitDone = [True, True, True, True, True]
+        expected_hasDataChanged = [True, True, True, True, True]
 
-    assert group.hasMoreData()
-    group.next()
-    nose.tools.eq_(group.data_index, 11)
-    nose.tools.eq_(group.data_index_end, 11)
-    nose.tools.eq_(listener.data_index_start, 11)
-    nose.tools.eq_(listener.data_index_end, 11)
 
-    assert group.hasMoreData()
-    group.next()
-    nose.tools.eq_(group.data_index, 12)
-    nose.tools.eq_(group.data_index_end, 14)
-    nose.tools.eq_(listener.data_index_start, 12)
-    nose.tools.eq_(listener.data_index_end, 14)
+        dataformat = DataFormat(prefix, 'user/single_integer/1')
 
-    assert group.hasMoreData()
-    group.next()
-    nose.tools.eq_(group.data_index, 15)
-    nose.tools.eq_(group.data_index_end, 17)
-    nose.tools.eq_(listener.data_index_start, 15)
-    nose.tools.eq_(listener.data_index_end, 17)
+        data_source1 = MockDataSource([ dataformat.type(value=x) for x in range(0, len(indices)) ],
+                                      indices)
+        input1 = Input('input1', 'mock', data_source1)
 
-    assert not group.hasMoreData()
+        data_source2 = MockDataSource([ dataformat.type(value=x + 10) for x in range(0, len(indices)) ],
+                                      indices)
+        input2 = Input('input2', 'mock', data_source2)
 
+        data_source3 = MockDataSource([ dataformat.type(value=x + 20) for x in range(0, len(indices)) ],
+                                      indices)
+        input3 = Input('input3', 'mock', data_source3)
 
-def test_list_creation():
-    inputs = InputList()
+        group = InputGroup('channel1', restricted_access=False)
 
-    assert inputs.main_group is None
-    nose.tools.eq_(inputs.nbGroups(), 0)
-    nose.tools.eq_(len(inputs), 0)
-    assert not inputs.hasMoreData()
+        group.add(input1)
+        group.add(input2)
+        group.add(input3)
 
+        self.assertTrue(group.hasMoreData())
 
-def test_list_unkown_input_retrieval():
-    inputs = InputList()
+        self.assertTrue(input1.hasMoreData())
+        self.assertTrue(input1.isDataUnitDone())
+        self.assertFalse(input1.hasDataChanged())
 
-    assert inputs['unknown'] is None
+        self.assertTrue(input2.hasMoreData())
+        self.assertTrue(input2.isDataUnitDone())
+        self.assertFalse(input2.hasDataChanged())
 
+        self.assertTrue(input3.hasMoreData())
+        self.assertTrue(input3.isDataUnitDone())
+        self.assertFalse(input3.hasDataChanged())
 
-def test_list_group_of_unkown_input_retrieval():
-    inputs = InputList()
+        for i in range(0, len(indices)):
+            group.next()
 
-    assert inputs.groupOf('unknown') is None
+            self.assertEqual(group.data_index, indices[i][0])
+            self.assertEqual(group.data_index_end, indices[i][1])
 
+            self.assertTrue(input1.data is not None)
+            self.assertEqual(input1.data.value, i)
+            self.assertEqual(input1.data_index, indices[i][0])
+            self.assertEqual(input1.data_index_end, indices[i][1])
+            self.assertFalse(input1.data_same_as_previous)
+            self.assertEqual(input1.nb_data_blocks_read, i + 1)
 
-def test_list_one_group_one_input():
-    inputs = InputList()
+            self.assertTrue(input2.data is not None)
+            self.assertEqual(input2.data.value, i + 10)
+            self.assertEqual(input2.data_index, indices[i][0])
+            self.assertEqual(input2.data_index_end, indices[i][1])
+            self.assertFalse(input2.data_same_as_previous)
+            self.assertEqual(input2.nb_data_blocks_read, i + 1)
 
-    data_source = MockDataSource([], [])
-    input = Input('input1', 'mock', data_source)
+            self.assertTrue(input3.data is not None)
+            self.assertEqual(input3.data.value, i + 20)
+            self.assertEqual(input3.data_index, indices[i][0])
+            self.assertEqual(input3.data_index_end, indices[i][1])
+            self.assertFalse(input3.data_same_as_previous)
+            self.assertEqual(input3.nb_data_blocks_read, i + 1)
 
-    group = InputGroup('channel1')
-    group.add(input)
+            self.assertEqual(group.hasMoreData(), expected_hasMoreData[i])
+            self.assertEqual(input1.hasMoreData(), expected_hasMoreData[i])
+            self.assertEqual(input2.hasMoreData(), expected_hasMoreData[i])
+            self.assertEqual(input3.hasMoreData(), expected_hasMoreData[i])
 
-    inputs.add(group)
+            self.assertEqual(input1.isDataUnitDone(), expected_isDataUnitDone[i])
+            self.assertEqual(input2.isDataUnitDone(), expected_isDataUnitDone[i])
+            self.assertEqual(input3.isDataUnitDone(), expected_isDataUnitDone[i])
 
-    nose.tools.eq_(inputs.main_group, group)
-    nose.tools.eq_(inputs.nbGroups(), 1)
-    nose.tools.eq_(len(inputs), 1)
+            self.assertEqual(input1.hasDataChanged(), expected_hasDataChanged[i])
+            self.assertEqual(input2.hasDataChanged(), expected_hasDataChanged[i])
+            self.assertEqual(input3.hasDataChanged(), expected_hasDataChanged[i])
 
-    nose.tools.eq_(inputs['input1'], input)
-    nose.tools.eq_(inputs[0], input)
 
-    nose.tools.eq_(inputs.groupOf('input1'), group)
+    def test_retrieve_three_inputs_iteration__different_frequencies(self):
+        indices1 = [ (0, 0), (1, 1), (2, 2), (3, 3), (4, 4), (5, 5) ]
+        indices2 = [ (0, 1), (2, 3), (4, 5) ]
+        indices3 = [ (0, 5) ]
 
+        expected_hasMoreData_1 = [True, True, True, True, True, False]
+        expected_hasMoreData_2 = [True, True, True, True, False, False]
+        expected_hasMoreData_3 = [False, False, False, False, False, False]
 
-def test_list_one_group_two_inputs():
-    inputs = InputList()
+        expected_isDataUnitDone_1 = [True, True, True, True, True, True]
+        expected_isDataUnitDone_2 = [False, True, False, True, False, True]
+        expected_isDataUnitDone_3 = [False, False, False, False, False, True]
 
-    data_source1 = MockDataSource([], [])
-    input1 = Input('input1', 'mock', data_source1)
+        expected_hasDataChanged_1 = [True, True, True, True, True, True]
+        expected_hasDataChanged_2 = [True, False, True, False, True, False]
+        expected_hasDataChanged_3 = [True, False, False, False, False, False]
 
-    data_source2 = MockDataSource([], [])
-    input2 = Input('input2', 'mock', data_source2)
 
-    group = InputGroup('channel1')
+        dataformat = DataFormat(prefix, 'user/single_integer/1')
 
-    group.add(input1)
-    group.add(input2)
+        data_source1 = MockDataSource([ dataformat.type(value=x) for x in range(0, len(indices1)) ],
+                                      indices1)
+        input1 = Input('input1', 'mock', data_source1)
 
-    inputs.add(group)
+        data_source2 = MockDataSource([ dataformat.type(value=x + 10) for x in range(0, len(indices2)) ],
+                                      indices2)
+        input2 = Input('input2', 'mock', data_source2)
 
-    nose.tools.eq_(inputs.main_group, group)
-    nose.tools.eq_(inputs.nbGroups(), 1)
-    nose.tools.eq_(len(inputs), 2)
+        data_source3 = MockDataSource([ dataformat.type(value=x + 20) for x in range(0, len(indices3)) ],
+                                      indices3)
+        input3 = Input('input3', 'mock', data_source3)
 
-    nose.tools.eq_(inputs['input1'], input1)
-    nose.tools.eq_(inputs[0], input1)
+        group = InputGroup('channel1', restricted_access=False)
 
-    nose.tools.eq_(inputs['input2'], input2)
-    nose.tools.eq_(inputs[1], input2)
+        group.add(input1)
+        group.add(input2)
+        group.add(input3)
 
-    nose.tools.eq_(inputs.groupOf('input1'), group)
-    nose.tools.eq_(inputs.groupOf('input2'), group)
+        self.assertTrue(group.hasMoreData())
 
+        self.assertTrue(input1.hasMoreData())
+        self.assertTrue(input1.isDataUnitDone())
+        self.assertFalse(input1.hasDataChanged())
 
-def test_list_two_groups_three_inputs():
-    inputs = InputList()
+        self.assertTrue(input2.hasMoreData())
+        self.assertTrue(input2.isDataUnitDone())
+        self.assertFalse(input2.hasDataChanged())
 
-    group1 = InputGroup('channel1')
+        self.assertTrue(input3.hasMoreData())
+        self.assertTrue(input3.isDataUnitDone())
+        self.assertFalse(input3.hasDataChanged())
 
-    data_source1 = MockDataSource([], [])
-    input1 = Input('input1', 'mock', data_source1)
-    group1.add(input1)
+        for i in range(0, len(indices1)):
+            group.next()
 
-    data_source2 = MockDataSource([], [])
-    input2 = Input('input2', 'mock', data_source2)
-    group1.add(input2)
+            self.assertEqual(group.data_index, indices1[i][0])
+            self.assertEqual(group.data_index_end, indices1[i][1])
 
-    inputs.add(group1)
+            self.assertTrue(input1.data is not None)
+            self.assertEqual(input1.data.value, i)
+            self.assertEqual(input1.data_index, indices1[i][0])
+            self.assertEqual(input1.data_index_end, indices1[i][1])
+            self.assertFalse(input1.data_same_as_previous)
+            self.assertEqual(input1.nb_data_blocks_read, i + 1)
 
-    group2 = InputGroup('channel2', restricted_access=False)
+            self.assertTrue(input2.data is not None)
+            self.assertEqual(input2.data.value, (i // 2) + 10)
+            self.assertEqual(input2.data_index, indices2[i // 2][0])
+            self.assertEqual(input2.data_index_end, indices2[i // 2][1])
+            self.assertEqual(input2.nb_data_blocks_read, (i // 2) + 1)
 
-    data_source3 = MockDataSource([], [])
-    input3 = Input('input3', 'mock', data_source3)
-    group2.add(input3)
+            self.assertTrue(input3.data is not None)
+            self.assertEqual(input3.data.value, 20)
+            self.assertEqual(input3.data_index, indices3[0][0])
+            self.assertEqual(input3.data_index_end, indices3[0][1])
+            self.assertEqual(input3.nb_data_blocks_read, 1)
 
-    inputs.add(group2)
+            self.assertEqual(group.hasMoreData(), expected_hasMoreData_1[i])
+            self.assertEqual(input1.hasMoreData(), expected_hasMoreData_1[i])
+            self.assertEqual(input2.hasMoreData(), expected_hasMoreData_2[i])
+            self.assertEqual(input3.hasMoreData(), expected_hasMoreData_3[i])
 
-    nose.tools.eq_(inputs.main_group, group1)
-    nose.tools.eq_(inputs.nbGroups(), 2)
-    nose.tools.eq_(len(inputs), 3)
+            self.assertEqual(input1.isDataUnitDone(), expected_isDataUnitDone_1[i])
+            self.assertEqual(input2.isDataUnitDone(), expected_isDataUnitDone_2[i])
+            self.assertEqual(input3.isDataUnitDone(), expected_isDataUnitDone_3[i])
 
-    nose.tools.eq_(inputs['input1'], input1)
-    nose.tools.eq_(inputs[0], input1)
+            self.assertEqual(input1.hasDataChanged(), expected_hasDataChanged_1[i])
+            self.assertEqual(input2.hasDataChanged(), expected_hasDataChanged_2[i])
+            self.assertEqual(input3.hasDataChanged(), expected_hasDataChanged_3[i])
 
-    nose.tools.eq_(inputs['input2'], input2)
-    nose.tools.eq_(inputs[1], input2)
 
-    nose.tools.eq_(inputs['input3'], input3)
-    nose.tools.eq_(inputs[2], input3)
+    def test_retrieve_two_inputs_iteration__desynchronized_frequencies(self):
+        indices1 = [ (0, 2), (3, 5), (6, 8), (9, 11), (12, 14), (15, 17) ]
+        indices2 = [ (0, 4), (5, 10), (11, 17) ]
 
-    nose.tools.eq_(inputs.groupOf('input1'), group1)
-    nose.tools.eq_(inputs.groupOf('input2'), group1)
-    nose.tools.eq_(inputs.groupOf('input3'), group2)
+        expected_values_1 = [0, 1, 1, 2, 3, 3, 4, 5]
+        expected_values_2 = [0, 0, 1, 1, 1, 2, 2, 2]
 
-    counter = 0
-    for input in inputs:
-        nose.tools.eq_(inputs[counter], input)
-        counter += 1
+        expected_group_indices = [(0, 2), (3, 4), (5, 5),  (6, 8),  (9, 10), (11, 11),  (12, 14), (15, 17)]
+        expected_indices_1 = [(0, 2), (3, 5), (3, 5),  (6, 8),  (9, 11), (9, 11),  (12, 14), (15, 17)]
+        expected_indices_2 = [(0, 4), (0, 4), (5, 10), (5, 10), (5, 10), (11, 17), (11, 17), (11, 17)]
 
-    nose.tools.eq_(counter, 3)
+        expected_hasMoreData_1 = [True, True, True, True, True,  True,  True,  False]
+        expected_hasMoreData_2 = [True, True, True, True, True, False, False, False]
+
+        expected_isDataUnitDone_1 = [True,  False, True,  True,  False, True,  True,  True]
+        expected_isDataUnitDone_2 = [False, True,  False, False, True,  False, False, True]
+
+        expected_hasDataChanged_1 = [True, True,  False, True,  True,  False, True,  True]
+        expected_hasDataChanged_2 = [True, False, True,  False, False, True,  False, False]
+
+
+        dataformat = DataFormat(prefix, 'user/single_integer/1')
+
+        data_source1 = MockDataSource([ dataformat.type(value=x) for x in range(0, len(indices1)) ],
+                                      indices1)
+        input1 = Input('input1', 'mock', data_source1)
+
+        data_source2 = MockDataSource([ dataformat.type(value=x) for x in range(0, len(indices2)) ],
+                                      indices2)
+        input2 = Input('input2', 'mock', data_source2)
+
+        group = InputGroup('channel1', restricted_access=False)
+
+        group.add(input1)
+        group.add(input2)
+
+        self.assertTrue(group.hasMoreData())
+
+        self.assertTrue(input1.hasMoreData())
+        self.assertTrue(input1.isDataUnitDone())
+        self.assertFalse(input1.hasDataChanged())
+
+        self.assertTrue(input2.hasMoreData())
+        self.assertTrue(input2.isDataUnitDone())
+        self.assertFalse(input2.hasDataChanged())
+
+        for i in range(0, len(expected_indices_1)):
+            group.next()
+
+            self.assertEqual(group.data_index, expected_group_indices[i][0])
+            self.assertEqual(group.data_index_end, expected_group_indices[i][1])
+
+            self.assertTrue(input1.data is not None)
+            self.assertEqual(input1.data.value, expected_values_1[i])
+            self.assertEqual(input1.data_index, expected_indices_1[i][0])
+            self.assertEqual(input1.data_index_end, expected_indices_1[i][1])
+
+            self.assertTrue(input2.data is not None)
+            self.assertEqual(input2.data.value, expected_values_2[i])
+            self.assertEqual(input2.data_index, expected_indices_2[i][0])
+            self.assertEqual(input2.data_index_end, expected_indices_2[i][1])
+
+            self.assertEqual(group.hasMoreData(), expected_hasMoreData_1[i])
+            self.assertEqual(input1.hasMoreData(), expected_hasMoreData_1[i])
+            self.assertEqual(input2.hasMoreData(), expected_hasMoreData_2[i])
+
+            self.assertEqual(input1.isDataUnitDone(), expected_isDataUnitDone_1[i])
+            self.assertEqual(input2.isDataUnitDone(), expected_isDataUnitDone_2[i])
+
+            self.assertEqual(input1.hasDataChanged(), expected_hasDataChanged_1[i])
+            self.assertEqual(input2.hasDataChanged(), expected_hasDataChanged_2[i])
+
+
+    def test_retrieve_two_inputs_iteration__different_frequencies(self):
+        indices1 = [ (0, 0), (1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7) ]
+        indices2 = [ (0, 3), (4, 7) ]
+
+        expected_values_1 = [0, 1, 2, 3, 4, 5, 6, 7]
+        expected_values_2 = [0, 0, 0, 0, 1, 1, 1, 1]
+
+        expected_hasMoreData_1 = [True, True, True, True, True,  True,  True,  False]
+        expected_hasMoreData_2 = [True, True, True, True, False, False, False, False]
+
+        expected_isDataUnitDone_1 = [True,  True,  True,  True, True,  True,  True,  True]
+        expected_isDataUnitDone_2 = [False, False, False, True, False, False, False, True]
+
+        expected_hasDataChanged_1 = [True, True,  True,   True,  True, True,   True,  True]
+        expected_hasDataChanged_2 = [True, False, False,  False, True, False,  False, False]
+
+
+        dataformat = DataFormat(prefix, 'user/single_integer/1')
+
+        data_source1 = MockDataSource([ dataformat.type(value=x) for x in range(0, len(indices1)) ],
+                                      indices1)
+        input1 = Input('input1', 'mock', data_source1)
+
+        data_source2 = MockDataSource([ dataformat.type(value=x) for x in range(0, len(indices2)) ],
+                                      indices2)
+        input2 = Input('input2', 'mock', data_source2)
+
+        group = InputGroup('channel1', restricted_access=False)
+
+        group.add(input1)
+        group.add(input2)
+
+        self.assertTrue(group.hasMoreData())
+
+        self.assertTrue(input1.hasMoreData())
+        self.assertTrue(input1.isDataUnitDone())
+        self.assertFalse(input1.hasDataChanged())
+
+        self.assertTrue(input2.hasMoreData())
+        self.assertTrue(input2.isDataUnitDone())
+        self.assertFalse(input2.hasDataChanged())
+
+        for i in range(0, len(indices1)):
+            group.next()
+
+            self.assertEqual(group.data_index, indices1[i][0])
+            self.assertEqual(group.data_index_end, indices1[i][1])
+
+            self.assertTrue(input1.data is not None)
+            self.assertEqual(input1.data.value, expected_values_1[i])
+            self.assertEqual(input1.data_index, indices1[i][0])
+            self.assertEqual(input1.data_index_end, indices1[i][1])
+
+            self.assertTrue(input2.data is not None)
+            self.assertEqual(input2.data.value, expected_values_2[i])
+            self.assertEqual(input2.data_index, indices2[i // 4][0])
+            self.assertEqual(input2.data_index_end, indices2[i // 4][1])
+
+            self.assertEqual(group.hasMoreData(), expected_hasMoreData_1[i])
+            self.assertEqual(input1.hasMoreData(), expected_hasMoreData_1[i])
+            self.assertEqual(input2.hasMoreData(), expected_hasMoreData_2[i])
+
+            self.assertEqual(input1.isDataUnitDone(), expected_isDataUnitDone_1[i])
+            self.assertEqual(input2.isDataUnitDone(), expected_isDataUnitDone_2[i])
+
+            self.assertEqual(input1.hasDataChanged(), expected_hasDataChanged_1[i])
+            self.assertEqual(input2.hasDataChanged(), expected_hasDataChanged_2[i])
+
+
+#----------------------------------------------------------
+
+
+class InputListTest(unittest.TestCase):
+
+    def test_creation(self):
+        inputs = InputList()
+
+        self.assertTrue(inputs.main_group is None)
+        self.assertEqual(inputs.nbGroups(), 0)
+        self.assertEqual(len(inputs), 0)
+        self.assertFalse(inputs.hasMoreData())
+
+
+    def test_list_unkown_input_retrieval(self):
+        inputs = InputList()
+
+        self.assertTrue(inputs['unknown'] is None)
+
+
+    def test_list_group_of_unkown_input_retrieval(self):
+        inputs = InputList()
+
+        self.assertTrue(inputs.groupOf('unknown') is None)
+
+
+    def test_list_one_group_one_input(self):
+        inputs = InputList()
+
+        data_source = MockDataSource([], [])
+        input = Input('input1', 'mock', data_source)
+
+        group = InputGroup('channel1')
+        group.add(input)
+
+        inputs.add(group)
+
+        self.assertEqual(inputs.main_group, group)
+        self.assertEqual(inputs.nbGroups(), 1)
+        self.assertEqual(len(inputs), 1)
+
+        self.assertEqual(inputs['input1'], input)
+        self.assertEqual(inputs[0], input)
+
+        self.assertEqual(inputs.groupOf('input1'), group)
+
+
+    def test_list_one_group_two_inputs(self):
+        inputs = InputList()
+
+        data_source1 = MockDataSource([], [])
+        input1 = Input('input1', 'mock', data_source1)
+
+        data_source2 = MockDataSource([], [])
+        input2 = Input('input2', 'mock', data_source2)
+
+        group = InputGroup('channel1')
+
+        group.add(input1)
+        group.add(input2)
+
+        inputs.add(group)
+
+        self.assertEqual(inputs.main_group, group)
+        self.assertEqual(inputs.nbGroups(), 1)
+        self.assertEqual(len(inputs), 2)
+
+        self.assertEqual(inputs['input1'], input1)
+        self.assertEqual(inputs[0], input1)
+
+        self.assertEqual(inputs['input2'], input2)
+        self.assertEqual(inputs[1], input2)
+
+        self.assertEqual(inputs.groupOf('input1'), group)
+        self.assertEqual(inputs.groupOf('input2'), group)
+
+
+    def test_list_two_groups_three_inputs(self):
+        inputs = InputList()
+
+        group1 = InputGroup('channel1')
+
+        data_source1 = MockDataSource([], [])
+        input1 = Input('input1', 'mock', data_source1)
+        group1.add(input1)
+
+        data_source2 = MockDataSource([], [])
+        input2 = Input('input2', 'mock', data_source2)
+        group1.add(input2)
+
+        inputs.add(group1)
+
+        group2 = InputGroup('channel2', restricted_access=False)
+
+        data_source3 = MockDataSource([], [])
+        input3 = Input('input3', 'mock', data_source3)
+        group2.add(input3)
+
+        inputs.add(group2)
+
+        self.assertEqual(inputs.main_group, group1)
+        self.assertEqual(inputs.nbGroups(), 2)
+        self.assertEqual(len(inputs), 3)
+
+        self.assertEqual(inputs['input1'], input1)
+        self.assertEqual(inputs[0], input1)
+
+        self.assertEqual(inputs['input2'], input2)
+        self.assertEqual(inputs[1], input2)
+
+        self.assertEqual(inputs['input3'], input3)
+        self.assertEqual(inputs[2], input3)
+
+        self.assertEqual(inputs.groupOf('input1'), group1)
+        self.assertEqual(inputs.groupOf('input2'), group1)
+        self.assertEqual(inputs.groupOf('input3'), group2)
+
+        counter = 0
+        for input in inputs:
+            self.assertEqual(inputs[counter], input)
+            counter += 1
+
+        self.assertEqual(counter, 3)
diff --git a/beat/core/test/test_message_handler.py b/beat/core/test/test_message_handler.py
index 3e215510..0b7eb024 100644
--- a/beat/core/test/test_message_handler.py
+++ b/beat/core/test/test_message_handler.py
@@ -89,7 +89,7 @@ class TestMessageHandler(unittest.TestCase):
 
         input_b = Input('b', 'user/single_integer/1', data_source_b)
 
-        group = InputGroup('channel')
+        group = InputGroup('channel', restricted_access=False)
         group.add(input_a)
         group.add(input_b)
 
@@ -143,11 +143,15 @@ class TestMessageHandler(unittest.TestCase):
         self.remote_input_a.next()
         nose.tools.eq_(self.remote_input_a.data.value, 10)
 
+        assert self.remote_input_a.hasDataChanged()
         assert self.remote_input_a.hasMoreData()
+        assert self.remote_input_a.isDataUnitDone()
         self.remote_input_a.next()
         nose.tools.eq_(self.remote_input_a.data.value, 20)
 
+        assert self.remote_input_a.hasDataChanged()
         assert not self.remote_input_a.hasMoreData()
+        assert self.remote_input_a.isDataUnitDone()
 
 
     def test_group_has_more_data(self):
-- 
GitLab