def test_generate(self):
        data = messages.Timestamp()
        data.us = 42
        topic = "/imu"
        msg = rpc.generate_topic_injection_packet(topic, data)

        to_decode, msg = msg[:MESSAGESIZE_SIZE], msg[MESSAGESIZE_SIZE:]
        header_size = messages.MessageSize()
        header_size.ParseFromString(to_decode)

        to_decode, msg = msg[:header_size.bytes], msg[header_size.bytes:]
        header = messages.TopicHeader()
        header.ParseFromString(to_decode)

        self.assertEqual(header.name, "/imu")
        self.assertEqual(header.msgid, 1)

        to_decode, msg = msg[:MESSAGESIZE_SIZE], msg[MESSAGESIZE_SIZE:]
        body_size = messages.MessageSize()
        body_size.ParseFromString(to_decode)

        to_decode, msg = msg[:header_size.bytes], msg[header_size.bytes:]
        body = messages.Timestamp()
        body.ParseFromString(to_decode)
        self.assertEqual(42, body.us)
def read_messages(f):
    """
    Yields a series of (TopicHeader, Message) tuples, contained in the given
    log file.
    """
    len_size = len(messages.MessageSize(bytes=0).SerializeToString())

    data = True
    try:
        while data:
            hdr_len = messages.MessageSize()
            hdr_len.ParseFromString(f.read(len_size))
            hdr = messages.TopicHeader()
            hdr.ParseFromString(f.read(hdr_len.bytes))
            msg_len = messages.MessageSize()
            msg_len.ParseFromString(f.read(len_size))

            for m in messages.messages:
                if messages.msgid(m) == hdr.msgid:
                    Message = m
                    break

            data = f.read(msg_len.bytes)
            msg = Message()
            msg.ParseFromString(data)

            if data:
                yield hdr, msg

    except DecodeError:
        pass
def parse_packet(data):
    messagesize_size = len(messages.MessageSize(bytes=0).SerializeToString())

    header_size = messages.MessageSize()
    header_size.ParseFromString(data[0:messagesize_size])

    cut_point = messagesize_size + header_size.bytes
    header_data, msg_data = data[:cut_point], data[cut_point:]

    header = messages.TopicHeader()
    header.ParseFromString(header_data[messagesize_size:])

    for m in messages.messages:
        if messages.msgid(m) == header.msgid:
            msg = m()
            msg.ParseFromString(msg_data)
            break
    else:
        msg = None

    return header, msg
import unittest
import rpc
import messages

MESSAGESIZE_SIZE = len(messages.MessageSize(bytes=0).SerializeToString())

class UDPInjectionTestCase(unittest.TestCase):
    def test_generate(self):
        data = messages.Timestamp()
        data.us = 42
        topic = "/imu"
        msg = rpc.generate_topic_injection_packet(topic, data)

        to_decode, msg = msg[:MESSAGESIZE_SIZE], msg[MESSAGESIZE_SIZE:]
        header_size = messages.MessageSize()
        header_size.ParseFromString(to_decode)

        to_decode, msg = msg[:header_size.bytes], msg[header_size.bytes:]
        header = messages.TopicHeader()
        header.ParseFromString(to_decode)

        self.assertEqual(header.name, "/imu")
        self.assertEqual(header.msgid, 1)

        to_decode, msg = msg[:MESSAGESIZE_SIZE], msg[MESSAGESIZE_SIZE:]
        body_size = messages.MessageSize()
        body_size.ParseFromString(to_decode)

        to_decode, msg = msg[:header_size.bytes], msg[header_size.bytes:]
        body = messages.Timestamp()
        body.ParseFromString(to_decode)
 def encoded_length(m):
     encoded = m.SerializeToString()
     res = messages.MessageSize(bytes=len(encoded))
     return res.SerializeToString()