Ejemplo n.º 1
0
def payload_test_function(this: unittest.TestCase,
                          payload: Payload,
                          data,
                          dtype: str,
                          length: int,
                          encoded: bytes = None):
    this.assertTrue(payload.is_valid())
    this.assertEqual(payload.data, data)
    this.assertEqual(payload.dtype, dtype)
    this.assertEqual(payload.length, length)
    if encoded:
        this.assertEqual(payload.encoded, encoded)
Ejemplo n.º 2
0
class Package():
    """
    Recebe uma sequência de bytes e decodifica em Head, Payload e End of Package 
    ou recebe dados suficientes para construir um Package.

    Atributos
    --------

    `head (Head):` Head com as características do Payload;

    `payload (Payload):` Payload que guarda os dados do pacote;

    `end_of_package (str):` End of Package que serve para validação de integridade;

    `encoded (bytes):` Pacote convertido em bytes;

    Métodos
    -----

    `is_valid:`  deve sempre retornar True;

    `is_handshake:` retorna True se o pacote for um handshake;

    `is_error:` retorna True se o pacote for uma notificação de erro;
    """
    def __init__(self,
                 content: Union[bytes, str, int] = b'',
                 code: str = "default",
                 remaining: int = 0,
                 encoded: bytes = None):
        if encoded:
            self.parser = Parser(encoded)
            self.head = Head(code=self.parser.code,
                             dtype=self.parser.dtype,
                             length=self.parser.length,
                             remaining=self.parser.remaining)
            self.payload = Payload(data=self.parser.payload,
                                   dtype=self.parser.dtype,
                                   length=self.parser.length)
            self.end_of_package = self.parser.eop
        else:
            self.payload = Payload(content)
            self.head = Head(code=code,
                             dtype=self.payload.dtype,
                             length=self.payload.length,
                             remaining=remaining)
            self.end_of_package = self.get_end_of_package()
        self.encoded = self.get_encoded()

        # --> atributos <-- #
        # self.head
        # self.payload
        # self.end_of_package
        # self.encoded

    def __call__(self) -> bytes:
        """Devolve a versão em bytes do pacote;
        Returns:

            bytes: b'DB\\x04\\x00\\x00\\x00\\x00\\x00\\x00\\x00ABCD1997'
        """
        return self.encoded

    def describe(self):
        return {
            "head": self.head.describe(),
            "payload": self.payload.describe(),
            "end_of_package": self.end_of_package,
            "size": self.payload.length + 14,
            "encoded": self.encoded
        }

    def is_valid(self) -> bool:
        """Nunca deve retornar False;

        Returns:

            bool: Verifica se o pacote está legível. 
            Se o pacote contiver erros, ainda assim deve 
            ser convertido em um pacote de error (código "E")
            e se manter legível
        """
        a = self.head.is_valid()  # head
        b = self.payload.is_valid()  # payload
        c = self.end_of_package == DEFAULT_EOP  # end of package
        d = self.head.length == self.payload.length
        return all([a, b, c, d])

    def is_handshake(self) -> bool:
        """Verifica se o tipo do pacote é handshake (código "H")

        Returns:

            bool: True | False
        """
        return self.head.code == "H"

    def is_error(self) -> bool:
        """Verifica se o tipo do pacote é error (código "E")

        Returns:

            bool: True | False
        """
        return self.head.code == "E"

    def get_end_of_package(self) -> str:
        return DEFAULT_EOP

    def get_encoded(self) -> bytes:
        """Devolve a versão em bytes do pacote;
        Returns:

            bytes: b'DB\\x04\\x00\\x00\\x00\\x00\\x00\\x00\\x00ABCD1997'
        """
        return self.head() + self.payload() + self.end_of_package.encode()