7
7
from signal import SIGKILL
8
9
from StringIO import StringIO
9
10
from unittest import TestCase
11
from urlparse import urlparse
12
from urlparse import parse_qs
11
14
from testtools import ExpectedException
13
from grackle import client
18
def __init__(self, func_or_method):
19
self.func_or_method = func_or_method
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')
22
32
def __enter__(self):
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()
30
46
def __exit__(self, exc_type, exc_val, traceback):
31
47
os.kill(self.pid, SIGKILL)
43
59
self.send_error(httplib.BAD_REQUEST)
47
service = HTTPServer(('', 8435), FakeGrackleRequestHandler)
48
service.serve_forever()
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']]
72
self.wfile.write(simplejson.dumps(messages))
75
def fake_grackle_service(client, messages=None):
78
return ForkedFake(client.port, messages)
52
81
class TestPutMessage(TestCase):
54
83
def test_put_message(self):
55
with Forked(run_service):
56
client.put_message('arch1', StringIO('This is a message'))
84
client = GrackleClient('localhost', 8436)
85
with fake_grackle_service(client):
86
client.put_message('arch1', 'asdf', StringIO('This is a message'))
57
87
with ExpectedException(Exception, 'wtf'):
58
client.put_message('arch1', StringIO('This is not a message'))
88
client.put_message('arch1', 'asdf',
89
StringIO('This is not a message'))
92
class TestGetMessages(TestCase):
94
def test_get_messages(self):
95
client = GrackleClient('localhost', 8435)
96
with fake_grackle_service(client,
98
[{'message-id': 'foo'},
99
{'message-id': 'bar'}]}):
100
response = client.get_messages('baz')
101
self.assertEqual(['bar', 'foo'], sorted(m['message-id'] for m in
104
def test_get_messages_by_id(self):
105
client = GrackleClient('localhost', 8437)
106
with fake_grackle_service(client,
108
[{'message-id': 'foo'},
109
{'message-id': 'bar'}]}):
110
message, = client.get_messages('baz', message_ids=['foo'])
111
self.assertEqual('foo', message['message-id'])