Spaces:
Sleeping
Sleeping
import chromadb.utils.messageid as mid | |
import pulsar | |
import hypothesis.strategies as st | |
from hypothesis import given, settings, note | |
from typing import Any, Tuple | |
def message_id(draw: st.DrawFn) -> pulsar.MessageId: | |
ledger_id = draw(st.integers(min_value=0, max_value=2**63 - 1)) | |
entry_id = draw(st.integers(min_value=0, max_value=2**63 - 1)) | |
batch_index = draw(st.integers(min_value=(2**31 - 1) * -1, max_value=2**31 - 1)) | |
partition = draw(st.integers(min_value=(2**31 - 1) * -1, max_value=2**31 - 1)) | |
return pulsar.MessageId(partition, ledger_id, entry_id, batch_index) | |
# these are very fast and we want good coverage | |
def test_roundtrip_formats(message_id: pulsar.MessageId) -> None: | |
int1 = mid.pulsar_to_int(message_id) | |
# Roundtrip int->string and back | |
str1 = mid.int_to_str(int1) | |
assert int1 == mid.str_to_int(str1) | |
# Roundtrip int->bytes and back | |
b1 = mid.int_to_bytes(int1) | |
assert int1 == mid.bytes_to_int(b1) | |
# Roundtrip int -> MessageId and back | |
message_id_result = mid.int_to_pulsar(int1) | |
assert message_id_result.partition() == message_id.partition() | |
assert message_id_result.ledger_id() == message_id.ledger_id() | |
assert message_id_result.entry_id() == message_id.entry_id() | |
assert message_id_result.batch_index() == message_id.batch_index() | |
def assert_compare(pair1: Tuple[Any, Any], pair2: Tuple[Any, Any]) -> None: | |
"""Helper function: assert that the two pairs of values always compare in the same | |
way across all comparisons and orderings.""" | |
a, b = pair1 | |
c, d = pair2 | |
try: | |
assert (a > b) == (c > d) | |
assert (a >= b) == (c >= d) | |
assert (a < b) == (c < d) | |
assert (a <= b) == (c <= d) | |
assert (a == b) == (c == d) | |
except AssertionError: | |
note(f"Failed to compare {a} and {b} with {c} and {d}") | |
note(f"type: {type(a)}") | |
raise | |
# these are very fast and we want good coverage | |
def test_messageid_comparison(m1: pulsar.MessageId, m2: pulsar.MessageId) -> None: | |
# MessageID comparison is broken in the Pulsar Python & CPP libraries: | |
# The partition field is not taken into account, and two MessageIDs with different | |
# partitions will compare inconsistently (m1 > m2 AND m2 > m1) | |
# To avoid this, we zero-out the partition field before testing. | |
m1 = pulsar.MessageId(0, m1.ledger_id(), m1.entry_id(), m1.batch_index()) | |
m2 = pulsar.MessageId(0, m2.ledger_id(), m2.entry_id(), m2.batch_index()) | |
i1 = mid.pulsar_to_int(m1) | |
i2 = mid.pulsar_to_int(m2) | |
# In python, MessageId objects are not comparable directory, but the | |
# internal generated native object is. | |
internal1 = m1._msg_id | |
internal2 = m2._msg_id | |
s1 = mid.int_to_str(i1) | |
s2 = mid.int_to_str(i2) | |
# assert that all strings, all ints, and all native objects compare the same | |
assert_compare((internal1, internal2), (i1, i2)) | |
assert_compare((internal1, internal2), (s1, s2)) | |
def test_max_values() -> None: | |
pulsar.MessageId(2**31 - 1, 2**63 - 1, 2**63 - 1, 2**31 - 1) | |
# these are very fast and we want good coverage | |
def test_string_comparison(i1: int, i2: int) -> None: | |
assert_compare((i1, i2), (mid.int_to_str(i1), mid.int_to_str(i2))) | |