|
| 1 | +import contextlib |
| 2 | +from contextlib import contextmanager |
1 | 3 | import struct
|
2 | 4 | import unittest2
|
3 | 5 |
|
| 6 | +import mock |
| 7 | +from mock import sentinel |
| 8 | + |
4 | 9 | from kafka import KafkaClient
|
5 | 10 | from kafka.common import (
|
6 | 11 | OffsetRequest, OffsetCommitRequest, OffsetFetchRequest,
|
7 | 12 | OffsetResponse, OffsetCommitResponse, OffsetFetchResponse,
|
8 | 13 | ProduceRequest, FetchRequest, Message, ChecksumError,
|
9 |
| - ConsumerFetchSizeTooSmall, ProduceResponse, FetchResponse, |
10 |
| - OffsetAndMessage, BrokerMetadata, PartitionMetadata, |
11 |
| - TopicAndPartition, KafkaUnavailableError, ProtocolError, |
12 |
| - LeaderUnavailableError, PartitionUnavailableError |
| 14 | + ConsumerFetchSizeTooSmall, ProduceResponse, FetchResponse, OffsetAndMessage, |
| 15 | + BrokerMetadata, PartitionMetadata, TopicAndPartition, KafkaUnavailableError, |
| 16 | + ProtocolError, LeaderUnavailableError, PartitionUnavailableError, |
| 17 | + UnsupportedCodecError |
13 | 18 | )
|
14 | 19 | from kafka.codec import (
|
15 | 20 | has_snappy, gzip_encode, gzip_decode,
|
16 | 21 | snappy_encode, snappy_decode
|
17 | 22 | )
|
| 23 | +import kafka.protocol |
18 | 24 | from kafka.protocol import (
|
19 |
| - create_gzip_message, create_message, create_snappy_message, KafkaProtocol, |
20 |
| - ATTRIBUTE_CODEC_MASK, CODEC_GZIP, CODEC_SNAPPY |
| 25 | + ATTRIBUTE_CODEC_MASK, CODEC_NONE, CODEC_GZIP, CODEC_SNAPPY, KafkaProtocol, |
| 26 | + create_message, create_gzip_message, create_snappy_message, |
| 27 | + create_message_set |
21 | 28 | )
|
22 | 29 |
|
23 | 30 | class TestProtocol(unittest2.TestCase):
|
@@ -691,3 +698,48 @@ def test_decode_offset_fetch_response(self):
|
691 | 698 | OffsetFetchResponse(topic = 'topic1', partition = 2, offset = 4, error = 0, metadata = "meta"),
|
692 | 699 | OffsetFetchResponse(topic = 'topic1', partition = 4, offset = 8, error = 0, metadata = "meta"),
|
693 | 700 | ]))
|
| 701 | + |
| 702 | + @contextmanager |
| 703 | + def mock_create_message_fns(self): |
| 704 | + patches = contextlib.nested( |
| 705 | + mock.patch.object(kafka.protocol, "create_message", |
| 706 | + return_value=sentinel.message), |
| 707 | + mock.patch.object(kafka.protocol, "create_gzip_message", |
| 708 | + return_value=sentinel.gzip_message), |
| 709 | + mock.patch.object(kafka.protocol, "create_snappy_message", |
| 710 | + return_value=sentinel.snappy_message), |
| 711 | + ) |
| 712 | + |
| 713 | + with patches: |
| 714 | + yield |
| 715 | + |
| 716 | + def test_create_message_set(self): |
| 717 | + messages = [1, 2, 3] |
| 718 | + |
| 719 | + # Default codec is CODEC_NONE. Expect list of regular messages. |
| 720 | + expect = [sentinel.message] * len(messages) |
| 721 | + with self.mock_create_message_fns(): |
| 722 | + message_set = create_message_set(messages) |
| 723 | + self.assertEqual(message_set, expect) |
| 724 | + |
| 725 | + # CODEC_NONE: Expect list of regular messages. |
| 726 | + expect = [sentinel.message] * len(messages) |
| 727 | + with self.mock_create_message_fns(): |
| 728 | + message_set = create_message_set(messages, CODEC_NONE) |
| 729 | + self.assertEqual(message_set, expect) |
| 730 | + |
| 731 | + # CODEC_GZIP: Expect list of one gzip-encoded message. |
| 732 | + expect = [sentinel.gzip_message] |
| 733 | + with self.mock_create_message_fns(): |
| 734 | + message_set = create_message_set(messages, CODEC_GZIP) |
| 735 | + self.assertEqual(message_set, expect) |
| 736 | + |
| 737 | + # CODEC_SNAPPY: Expect list of one snappy-encoded message. |
| 738 | + expect = [sentinel.snappy_message] |
| 739 | + with self.mock_create_message_fns(): |
| 740 | + message_set = create_message_set(messages, CODEC_SNAPPY) |
| 741 | + self.assertEqual(message_set, expect) |
| 742 | + |
| 743 | + # Unknown codec should raise UnsupportedCodecError. |
| 744 | + with self.assertRaises(UnsupportedCodecError): |
| 745 | + create_message_set(messages, -1) |
0 commit comments