1
from BaseHTTPServer import (
3
BaseHTTPRequestHandler,
7
from signal import SIGKILL
9
from StringIO import StringIO
10
1
from unittest import TestCase
11
from urlparse import urlparse
12
from urlparse import parse_qs
14
from testtools import ExpectedException
16
from grackle.client import (
23
def __init__(self, port, messages=None):
26
self.messages = messages
27
self.read_end, self.write_end = os.pipe()
30
os.write(self.write_end, 'asdf')
37
os.read(self.read_end, 1)
40
def start_server(self):
41
service = HTTPServer(('', self.port), FakeGrackleRequestHandler)
42
service.messages = self.messages
44
service.serve_forever()
46
def __exit__(self, exc_type, exc_val, traceback):
47
os.kill(self.pid, SIGKILL)
50
class FakeGrackleRequestHandler(BaseHTTPRequestHandler):
53
message = self.rfile.read(int(self.headers['content-length']))
54
if message == 'This is a message':
55
self.send_response(httplib.CREATED)
59
self.send_error(httplib.BAD_REQUEST)
62
scheme, netloc, path, params, query_string, fragments = (
64
archive = os.path.split(path)[1]
65
query = parse_qs(query_string)
66
parameters = simplejson.loads(query['parameters'][0])
67
self.send_response(httplib.OK)
69
messages = [m for m in self.server.messages[archive] if 'message_ids'
70
not in parameters or m['message-id'] in
71
parameters['message_ids']]
77
self.wfile.write(simplejson.dumps(response))
80
def fake_grackle_service(client, messages=None):
83
return ForkedFake(client.port, messages)
86
3
class TestPutMessage(TestCase):
88
5
def test_put_message(self):
89
client = GrackleClient('localhost', 8436)
90
with fake_grackle_service(client):
91
client.put_message('arch1', 'asdf', StringIO('This is a message'))
92
with ExpectedException(Exception, 'wtf'):
93
client.put_message('arch1', 'asdf',
94
StringIO('This is not a message'))
97
class TestGetMessages(TestCase):
99
def test_get_messages(self):
100
client = GrackleClient('localhost', 8435)
101
with fake_grackle_service(client,
103
[{'message-id': 'foo'},
104
{'message-id': 'bar'}]}):
105
response = client.get_messages('baz')
106
self.assertEqual(['bar', 'foo'], sorted(m['message-id'] for m in
107
response['messages']))
108
self.assertIs(None, response['next_memo'])
109
self.assertIs(None, response['previous_memo'])
111
def test_get_messages_by_id(self):
112
client = GrackleClient('localhost', 8437)
113
with fake_grackle_service(client,
115
[{'message-id': 'foo'},
116
{'message-id': 'bar'}]}):
117
response = client.get_messages('baz', message_ids=['foo'])
118
message, = response['messages']
119
self.assertEqual('foo', message['message-id'])