~ubuntu-branches/ubuntu/trusty/drizzle/trusty

« back to all changes in this revision

Viewing changes to plugin/mysql_protocol/prototest/prototest/mysql/packet.py

  • Committer: Bazaar Package Importer
  • Author(s): Monty Taylor
  • Date: 2010-10-02 14:17:48 UTC
  • mfrom: (1.1.1 upstream)
  • mto: (2.1.17 sid)
  • mto: This revision was merged to the branch mainline in revision 3.
  • Revision ID: james.westby@ubuntu.com-20101002141748-m6vbfbfjhrw1153e
Tags: 2010.09.1802-1
* New upstream release.
* Removed pid-file argument hack.
* Updated GPL-2 address to be new address.
* Directly copy in drizzledump.1 since debian doesn't have sphinx 1.0 yet.
* Link to jquery from libjs-jquery. Add it as a depend.
* Add drizzled.8 symlink to the install files.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#!/usr/bin/env python
 
2
#
 
3
# Drizzle Client & Protocol Library
 
4
 
5
# Copyright (C) 2008 Eric Day (eday@oddments.org)
 
6
# All rights reserved.
 
7
 
8
# Use and distribution licensed under the BSD license.  See
 
9
# the COPYING.BSD file in the root source directory for full text.
 
10
#
 
11
'''
 
12
MySQL Protocol Packet Objects
 
13
'''
 
14
 
 
15
import struct
 
16
import unittest
 
17
 
 
18
class PacketException(Exception):
 
19
  pass
 
20
 
 
21
class Packet(object):
 
22
  '''This class represents a packet header.'''
 
23
 
 
24
  def __init__(self, packed=None, size=0, sequence=0):
 
25
    if packed is None:
 
26
      self.size = size
 
27
      self.sequence = sequence
 
28
    else:
 
29
      data = struct.unpack('4B', packed)
 
30
      self.size = data[0] | (data[1] << 8) | (data[2] << 16)
 
31
      self.sequence = data[3]
 
32
 
 
33
    self.verify()
 
34
 
 
35
  def pack(self):
 
36
    self.verify()
 
37
    return struct.pack('4B',
 
38
                       self.size & 0xFF,
 
39
                       (self.size >> 8) & 0xFF,
 
40
                       (self.size >> 16) & 0xFF,
 
41
                       self.sequence % 256)
 
42
 
 
43
  def verify(self):
 
44
    if self.size >= 16777216:
 
45
      raise PacketException('Packet size cannot exceed 16777215 bytes (%d)' %
 
46
                            self.size)
 
47
 
 
48
  def __str__(self):
 
49
    return '''Packet
 
50
  size = %s
 
51
  sequence = %s
 
52
''' % (self.size, self.sequence)
 
53
 
 
54
class TestPacket(unittest.TestCase):
 
55
 
 
56
  def testDefaultInit(self):
 
57
    packet = Packet()
 
58
    self.assertEqual(packet.size, 0)
 
59
    self.assertEqual(packet.sequence, 0)
 
60
    packet.__str__()
 
61
 
 
62
  def testKeywordInit(self):
 
63
    packet = Packet(size=1234, sequence=5)
 
64
    self.assertEqual(packet.size, 1234)
 
65
    self.assertEqual(packet.sequence, 5)
 
66
    packet.__str__()
 
67
 
 
68
  def testUnpackInit(self):
 
69
    packet = Packet(struct.pack('4B', 210, 4, 0, 5))
 
70
    self.assertEqual(packet.size, 1234)
 
71
    self.assertEqual(packet.sequence, 5)
 
72
 
 
73
  def testPack(self):
 
74
    packet = Packet(Packet(size=1234, sequence=5).pack())
 
75
    self.assertEqual(packet.size, 1234)
 
76
 
 
77
  def testPackRange(self):
 
78
    for x in range(0, 300):
 
79
      packet = Packet(Packet(size=x, sequence=x).pack())
 
80
      self.assertEqual(packet.size, x)
 
81
      self.assertEqual(packet.sequence, x % 256)
 
82
 
 
83
    # 997 is a random prime number so we hit various increments
 
84
    for x in range(300, 16777216, 997):
 
85
      packet = Packet(Packet(size=x, sequence=x).pack())
 
86
      self.assertEqual(packet.size, x)
 
87
      self.assertEqual(packet.sequence, x % 256)
 
88
 
 
89
    packet = Packet(Packet(size=16777215).pack())
 
90
    self.assertEqual(packet.size, 16777215)
 
91
    self.assertEqual(packet.sequence, 0)
 
92
 
 
93
    self.assertRaises(PacketException, Packet, size=16777216)
 
94
    self.assertRaises(PacketException, Packet, size=16777217)
 
95
    self.assertRaises(PacketException, Packet, size=4294967295)
 
96
    self.assertRaises(PacketException, Packet, size=4294967296)
 
97
    self.assertRaises(PacketException, Packet, size=4294967297)
 
98
 
 
99
def parse_row(count, data):
 
100
  row = []
 
101
  while count > 0:
 
102
    count -= 1
 
103
    if ord(data[0]) == 251:
 
104
      row.append(None)
 
105
      data = data[1:]
 
106
    else:
 
107
      (size, packed_size) = parse_encoded_size(data)
 
108
      row.append(data[packed_size:packed_size+size])
 
109
      data = data[packed_size+size:]
 
110
  return row
 
111
 
 
112
class BadSize(Exception):
 
113
  pass
 
114
 
 
115
def parse_encoded_size(data):
 
116
  size = ord(data[0])
 
117
  packed_size = 1
 
118
  if size == 252:
 
119
    size = struct.unpack('<H', data[1:3])[0]
 
120
    packed_size = 3
 
121
  elif size == 253:
 
122
    data = struct.unpack('<HB', data[1:4])
 
123
    size = data[0] | (data[1] << 16)
 
124
    packed_size = 4
 
125
  elif size == 254:
 
126
    data = struct.unpack('<II', data[1:9])
 
127
    size = data[0] | (data[1] << 32)
 
128
    packed_size = 8
 
129
  elif size == 255:
 
130
    raise BadSize(str(size))
 
131
 
 
132
  return (size, packed_size)
 
133
 
 
134
if __name__ == '__main__':
 
135
  unittest.main()