def test_bulk_data(self): self.setUpForObject(BulkDataSpecimen()) cell = self.object.state()['s'] self.object.queue.insert_tail(make_bytes_msg(b'ab')) # TODO: do this once initial values are processed correctly rather than having extra get()s # poll cell to force queue contents to show up in initial state to test json representation # st = SubscriptionTester() # _, subscription = cell.subscribe2(lambda v: None, st.context) # st.advance() # subscription.unsubscribe() description = cell.description() self.assertEqual( self.getUpdates(), transform_for_json([ [u'register_block', 1, u'urlroot', []], [u'register_cell', 2, u'urlroot/s', description, []], [u'value', 1, { u's': 2 }], [u'value', 0, 1], ['actually_binary', b'\x02\x00\x00\x00\x01a'], ['actually_binary', b'\x02\x00\x00\x00\x01b'], ])) self.object.queue.insert_tail(make_bytes_msg(b'cd')) self.assertEqual( self.getUpdates(), transform_for_json([ ['actually_binary', b'\x02\x00\x00\x00\x02c'], ['actually_binary', b'\x02\x00\x00\x00\x02d'], ]))
def test_bulk_data(self): self.setUpForObject(BulkDataSpecimen()) cell = self.object.state()['s'] yield _append_to_sink_cell(cell, b'ab') description = cell.description() self.assertEqual( self.getUpdates(), transform_for_json([ ['register_block', 1, 'urlroot', []], ['register_cell', 2, 'urlroot/s', description, []], ['value', 1, { 's': 2 }], ['value', 0, 1], ['actually_binary', b'\x02\x00\x00\x00\x01a'], ['actually_binary', b'\x02\x00\x00\x00\x01b'], ])) yield _append_to_sink_cell(cell, b'cd') self.assertEqual( self.getUpdates(), transform_for_json([ ['actually_binary', b'\x02\x00\x00\x00\x02c'], ['actually_binary', b'\x02\x00\x00\x00\x02d'], ]))
def test_two_references(self): """Two references are handled correctly, including not deleting until both are gone.""" self.setUpForObject(DuplicateReferenceSpecimen()) self.assertEqual(self.getUpdates(), transform_for_json([ [u'register_block', 1, u'urlroot', []], [u'register_cell', 2, u'urlroot/foo', self.object.state()['foo'].description(), None], [u'register_block', 3, u'urlroot/foo', [u'shinysdr.values.INull']], [u'value', 3, {}], [u'value', 2, 3], [u'register_cell', 4, u'urlroot/bar', self.object.state()['bar'].description(), None], [u'value', 4, 3], [u'value', 1, {u'bar': 4, u'foo': 2}], [u'value', 0, 1], ])) replacement = NullExportedState() # becomes distinct self.object.bar = replacement self.object.state_changed() self.assertEqual(self.getUpdates(), [ [u'register_block', 5, u'urlroot/bar', [u'shinysdr.values.INull']], [u'value', 5, {}], [u'value', 4, 5] ]) # old value should be deleted self.object.foo = replacement self.object.state_changed() self.assertEqual(self.getUpdates(), [ [u'value', 2, 5], [u'delete', 3] ])
def test_collection_delete(self): d = CellDict({'a': ExportedState()}, dynamic=True) self.setUpForObject(CollectionState(d)) self.assertEqual( self.getUpdates(), transform_for_json([ ['register_block', 1, 'urlroot', []], [ 'register_cell', 2, 'urlroot/a', self.object.state()['a'].description() ], ['register_block', 3, 'urlroot/a', []], ['value', 3, {}], ['value', 2, 3], ['value', 1, { 'a': 2 }], ['value', 0, 1], ])) self.assertEqual(self.getUpdates(), []) del d['a'] self.assertEqual(self.getUpdates(), [ ['value', 1, {}], ['delete', 2], ['delete', 3], ])
def test_value_patch(self): cell = StringSinkCell(encoding='us-ascii') yield _append_to_sink_cell(cell, b'ab') self.setUpForObject(Cells({ 's': cell })) self.st.advance() self.assertEqual(self.getUpdates(), transform_for_json([ ['register_block', 1, 'urlroot', []], ['register_cell', 2, 'urlroot/s', cell.description(), 'ab'], ['value', 1, {'s': 2}], ['value', 0, 1], ])) yield _append_to_sink_cell(cell, b'cd') self.st.advance() self.assertEqual(self.getUpdates(), transform_for_json([ ['value_append', 2, 'cd'], ]))
def test_bulk_data(self): self.setUpForObject(BulkDataSpecimen()) cell = self.object.state()['s'] yield _append_to_sink_cell(cell, b'ab') description = cell.description() self.assertEqual(self.getUpdates(), transform_for_json([ ['register_block', 1, 'urlroot', []], ['register_cell', 2, 'urlroot/s', description, []], ['value', 1, {'s': 2}], ['value', 0, 1], ['actually_binary', b'\x02\x00\x00\x00\x01a'], ['actually_binary', b'\x02\x00\x00\x00\x01b'], ])) yield _append_to_sink_cell(cell, b'cd') self.assertEqual(self.getUpdates(), transform_for_json([ ['actually_binary', b'\x02\x00\x00\x00\x02c'], ['actually_binary', b'\x02\x00\x00\x00\x02d'], ]))
def test_send_set_wrong_target(self): # Raised exception will be logged safely by the wrappper. # TODO: Instead of raising, report the error associated with the connection somehow self.setUpForObject(StateSpecimen()) self.assertIn( transform_for_json(['register_block', 1, 'urlroot', ['shinysdr.i.network.test_export_ws.IFoo']]), self.getUpdates()) self.assertRaises(Exception, lambda: # TODO more specific error self.stream.dataReceived(json.dumps(['set', 1, 100.0, 1234]))) self.assertEqual(self.getUpdates(), [])
def test_value_patch(self): cell = StringSinkCell(encoding='us-ascii') yield _append_to_sink_cell(cell, b'ab') self.setUpForObject(Cells({'s': cell})) self.st.advance() self.assertEqual( self.getUpdates(), transform_for_json([ ['register_block', 1, 'urlroot', []], ['register_cell', 2, 'urlroot/s', cell.description(), 'ab'], ['value', 1, { 's': 2 }], ['value', 0, 1], ])) yield _append_to_sink_cell(cell, b'cd') self.st.advance() self.assertEqual(self.getUpdates(), transform_for_json([ ['value_append', 2, 'cd'], ]))
def test_init_and_mutate(self): self.setUpForObject(StateSpecimen()) self.assertEqual(self.getUpdates(), transform_for_json([ ['register_block', 1, 'urlroot', ['shinysdr.i.network.test_export_ws.IFoo']], ['register_cell', 2, 'urlroot/rw', self.object.state()['rw'].description(), 1.0], ['value', 1, {'rw': 2}], ['value', 0, 1], ])) self.assertEqual(self.getUpdates(), []) self.object.set_rw(2.0) self.assertEqual(self.getUpdates(), [ ['value', 2, self.object.get_rw()], ])
def test_send_set_wrong_target(self): # Raised exception will be logged safely by the wrappper. # TODO: Instead of raising, report the error associated with the connection somehow self.setUpForObject(StateSpecimen()) self.assertIn( transform_for_json([ 'register_block', 1, 'urlroot', ['shinysdr.test.i.network.test_export_ws.IFoo'] ]), self.getUpdates()) self.assertRaises( Exception, lambda: # TODO more specific error self.stream.dataReceived(json.dumps(['set', 1, 100.0, 1234]))) self.assertEqual(self.getUpdates(), [])
def test_stream_cell(self): self.setUpForObject(StreamCellSpecimen()) self.assertEqual( self.getUpdates(), transform_for_json([ [u'register_block', 1, u'urlroot', []], [ u'register_cell', 2, u'urlroot/s', self.object.state()['s'].description() ], [u'value', 1, { u's': 2 }], [u'value', 0, 1], ])) self.object.queue.insert_tail(gr.message().make_from_string( b'qu', 0, 1, len('qu'))) self.assertEqual( self.getUpdates(), transform_for_json([ ['actually_binary', b'\x02\x00\x00\x00q'], ['actually_binary', b'\x02\x00\x00\x00u'], ]))
def test_send_set_normal(self): self.setUpForObject(StateSpecimen()) self.assertIn( transform_for_json(['register_cell', 2, 'urlroot/rw', self.object.state()['rw'].description(), 1.0]), self.getUpdates()) self.stream.dataReceived(json.dumps(['set', 2, 100.0, 1234])) self.assertEqual(self.getUpdates(), [ ['value', 2, 100.0], ['done', 1234], ]) self.stream.dataReceived(json.dumps(['set', 2, 100.0, 1234])) self.assertEqual(self.getUpdates(), [ # don't see any value message ['done', 1234], ])
def test_value_patch(self): queue = gr.msg_queue() queue.insert_tail(make_bytes_msg(b'ab')) cell = StringQueueCell(queue=queue, encoding='us-ascii') self.setUpForObject(Cells({'s': cell})) self.st.advance() self.assertEqual( self.getUpdates(), transform_for_json([ ['register_block', 1, 'urlroot', []], ['register_cell', 2, 'urlroot/s', cell.description(), ''], # TODO should have initial value ['value', 1, { 's': 2 }], ['value', 0, 1], ['value_append', 2, 'ab'], ])) queue.insert_tail(make_bytes_msg(b'cd')) self.st.advance() self.assertEqual(self.getUpdates(), transform_for_json([ ['value_append', 2, 'cd'], ]))
def test_send_set_normal(self): self.setUpForObject(StateSpecimen()) self.assertIn( transform_for_json([ 'register_cell', 2, 'urlroot/rw', self.object.state()['rw'].description() ]), self.getUpdates()) self.stream.dataReceived(json.dumps(['set', 2, 100.0, 1234])) self.assertEqual(self.getUpdates(), [ ['value', 2, 100.0], ['done', 1234], ]) self.stream.dataReceived(json.dumps(['set', 2, 100.0, 1234])) self.assertEqual( self.getUpdates(), [ # don't see any value message ['done', 1234], ])
def test_collection_delete(self): d = CellDict({'a': ExportedState()}, dynamic=True) self.setUpForObject(CollectionState(d)) self.assertEqual(self.getUpdates(), transform_for_json([ ['register_block', 1, 'urlroot', []], ['register_cell', 2, 'urlroot/a', self.object.state()['a'].description(), None], ['register_block', 3, 'urlroot/a', []], ['value', 3, {}], ['value', 2, 3], ['value', 1, {'a': 2}], ['value', 0, 1], ])) self.assertEqual(self.getUpdates(), []) del d['a'] self.assertEqual(self.getUpdates(), [ ['value', 1, {}], ['delete', 2], ['delete', 3], ])
def test_two_references(self): """Two references are handled correctly, including not deleting until both are gone.""" self.setUpForObject(DuplicateReferenceSpecimen()) self.assertEqual( self.getUpdates(), transform_for_json([ [u'register_block', 1, u'urlroot', []], [ u'register_cell', 2, u'urlroot/foo', self.object.state()['foo'].description() ], [ u'register_block', 3, u'urlroot/foo', [u'shinysdr.values.INull'] ], [u'value', 3, {}], [u'value', 2, 3], [ u'register_cell', 4, u'urlroot/bar', self.object.state()['bar'].description() ], [u'value', 4, 3], [u'value', 1, { u'bar': 4, u'foo': 2 }], [u'value', 0, 1], ])) replacement = NullExportedState() # becomes distinct self.object.bar = replacement self.object.state_changed() self.assertEqual(self.getUpdates(), [[ u'register_block', 5, u'urlroot/bar', [u'shinysdr.values.INull'] ], [u'value', 5, {}], [u'value', 4, 5]]) # old value should be deleted self.object.foo = replacement self.object.state_changed() self.assertEqual(self.getUpdates(), [[u'value', 2, 5], [u'delete', 3]])
def test_init_and_mutate(self): self.setUpForObject(StateSpecimen()) self.assertEqual( self.getUpdates(), transform_for_json([ [ 'register_block', 1, 'urlroot', ['shinysdr.test.i.network.test_export_ws.IFoo'] ], [ 'register_cell', 2, 'urlroot/rw', self.object.state()['rw'].description() ], ['value', 1, { 'rw': 2 }], ['value', 0, 1], ])) self.assertEqual(self.getUpdates(), []) self.object.set_rw(2.0) self.assertEqual(self.getUpdates(), [ ['value', 2, self.object.get_rw()], ])
def test_default(self): value = {'things': [1, '2', None, True, False]} self.assertEqual(transform_for_json(value), value)
def test_tuple(self): """Test that the namedtuple special case does not affect regular tuples, other than by turning them into lists.""" self.assertEqual(transform_for_json((1, (2, 3))), [1, [2, 3]])
def test_namedtuple(self): self.assertEqual( transform_for_json([SomeNamedTuple([1], SomeNamedTuple(2, 3))]), [{'x': [1], 'y': {'x': 2, 'y': 3}}])