| 15 | | |
| 16 | | |
| 17 | | class MockPacket: |
| 18 | | reply = object() |
| 19 | | |
| 20 | | def __init__(self, code, verify=False, error=False): |
| 21 | | self.code=code |
| 22 | | self.data={} |
| 23 | | self.verify=verify |
| 24 | | self.error=error |
| 25 | | |
| 26 | | def CreateReply(self, packet=None): |
| 27 | | if self.error: |
| 28 | | raise PacketError |
| 29 | | return self.reply |
| 30 | | |
| 31 | | def VerifyReply(self, reply, rawreply): |
| 32 | | return self.verify |
| 33 | | |
| 34 | | def RequestPacket(self): |
| 35 | | return "request packet" |
| 36 | | |
| 37 | | def has_key(self, key): |
| 38 | | return self.data.has_key(key) |
| 39 | | |
| 40 | | def __setitem__(self, key, value): |
| 41 | | self.data[key]=[value] |
| 42 | | |
| 43 | | def __getitem__(self, key): |
| 44 | | return self.data[key] |
| 45 | | |
| 46 | | |
| 47 | | class MockSocket: |
| 48 | | def __init__(self, domain, type, data=None): |
| 49 | | self.domain=domain |
| 50 | | self.type=type |
| 51 | | self.closed=False |
| 52 | | self.options=[] |
| 53 | | self.address=None |
| 54 | | self.output=[] |
| 55 | | |
| 56 | | if data is not None: |
| 57 | | (self.read_end, self.write_end)=os.pipe() |
| 58 | | fcntl.fcntl(self.write_end, fcntl.F_SETFL, os.O_NONBLOCK) |
| 59 | | os.write(self.write_end, data) |
| 60 | | self.data=data |
| 61 | | else: |
| 62 | | self.read_end=1 |
| 63 | | self.write_end=None |
| 64 | | |
| 65 | | def fileno(self): |
| 66 | | return self.read_end |
| 67 | | |
| 68 | | def bind(self, address): |
| 69 | | self.address=address |
| 70 | | |
| 71 | | def recv(self, buffer): |
| 72 | | return self.data[:buffer] |
| 73 | | |
| 74 | | def sendto(self, data, target): |
| 75 | | self.output.append((data, target)) |
| 76 | | |
| 77 | | def setsockopt(self, level, opt, value): |
| 78 | | self.options.append((level, opt, value)) |
| 79 | | |
| 80 | | def close(self): |
| 81 | | self.closed=True |