def test_endianness(self):
        """
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |    h.version   |    h.type     |    h.flags    |  <reserved>   |
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
        """

        one = 1
        one_little_endian = one.to_bytes(4, 'little')
        one_big_endian = one.to_bytes(4, 'big')

        # flag unset
        pdu_little_endian = PDUHeader.from_bytes(b'\x00\x00\x00\x00' + one_little_endian * 4)
        self.assertEqual(pdu_little_endian.session_id, 1)
        self.assertEqual(pdu_little_endian.transaction_id, 1)
        self.assertEqual(pdu_little_endian.packet_id, 1)
        self.assertEqual(pdu_little_endian.payload_length, 1)
        print(pdu_little_endian)

        nbo_set = struct.pack('!BBBB', 0, 0, 0 | PDUHeaderTags.MASK_NEWORK_BYTE_ORDER, 0)

        # network byte flag set
        pdu_big_endian = PDUHeader.from_bytes(nbo_set + one_big_endian * 4)
        self.assertEqual(pdu_big_endian.session_id, 1)
        self.assertEqual(pdu_big_endian.transaction_id, 1)
        self.assertEqual(pdu_big_endian.packet_id, 1)
        self.assertEqual(pdu_big_endian.payload_length, 1)
        print(pdu_big_endian)
    def test_bad_unpack(self):
        with self.assertRaises(exceptions.PDUUnpackError):
            # missing IDs
            PDUHeader.from_bytes(b'\x00\x00\x00\x00')

        with self.assertRaises(exceptions.PDUUnpackError):
            # missing payload length
            PDUHeader.from_bytes(b'\x00\x00\x00\x00' * 3)