pyln.proto.message: fix handling of ... with subtypes.

This time, with a test!

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
Rusty Russell 2020-06-15 20:55:37 +09:30 committed by Christian Decker
parent 2309a7a561
commit ee76504e53
2 changed files with 36 additions and 2 deletions

View File

@ -289,9 +289,14 @@ inherit from this too.
for field in self.fields:
val = field.fieldtype.read(io_in, otherfields)
if val is None:
# If first field fails to read, we return None.
if field == self.fields[0]:
return None
# Might only exist with certain options available
if field.fieldtype.option is None:
raise ValueError("{}.{}: short read".format(self, field))
if field.option is not None:
break
# Otherwise, we only read part of it!
raise ValueError("{}.{}: short read".format(self, field))
vals[field.name] = val
return vals

View File

@ -129,6 +129,35 @@ def test_tlv():
+ [253, 0, 255, 4, 1, 2, 3, 4])
def test_tlv_complex():
# A real example from the spec.
ns = MessageNamespace(["msgtype,reply_channel_range,264,gossip_queries",
"msgdata,reply_channel_range,chain_hash,chain_hash,",
"msgdata,reply_channel_range,first_blocknum,u32,",
"msgdata,reply_channel_range,number_of_blocks,u32,",
"msgdata,reply_channel_range,full_information,byte,",
"msgdata,reply_channel_range,len,u16,",
"msgdata,reply_channel_range,encoded_short_ids,byte,len",
"msgdata,reply_channel_range,tlvs,reply_channel_range_tlvs,",
"tlvtype,reply_channel_range_tlvs,timestamps_tlv,1",
"tlvdata,reply_channel_range_tlvs,timestamps_tlv,encoding_type,u8,",
"tlvdata,reply_channel_range_tlvs,timestamps_tlv,encoded_timestamps,byte,...",
"tlvtype,reply_channel_range_tlvs,checksums_tlv,3",
"tlvdata,reply_channel_range_tlvs,checksums_tlv,checksums,channel_update_checksums,...",
"subtype,channel_update_timestamps",
"subtypedata,channel_update_timestamps,timestamp_node_id_1,u32,",
"subtypedata,channel_update_timestamps,timestamp_node_id_2,u32,",
"subtype,channel_update_checksums",
"subtypedata,channel_update_checksums,checksum_node_id_1,u32,",
"subtypedata,channel_update_checksums,checksum_node_id_2,u32,"])
binmsg = bytes.fromhex('010806226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910f000000670000000701001100000067000001000000006d000001000003101112fa300000000022d7a4a79bece840')
msg = Message.read(ns, io.BytesIO(binmsg))
buf = io.BytesIO()
msg.write(buf)
assert buf.getvalue() == binmsg
def test_message_constructor():
ns = MessageNamespace(['msgtype,test1,1',
'msgdata,test1,tlvs,test_tlvstream,',