test: provide more general `keymapper_info/1`

This commit is contained in:
Andrew Mayorov 2023-01-12 17:59:15 +03:00
parent 0d495c97c8
commit b7566ab7e7
No known key found for this signature in database
GPG Key ID: 2837C62ACFBFED5D
2 changed files with 13 additions and 9 deletions

View File

@ -105,7 +105,7 @@
%% Debug/troubleshooting:
%% Keymappers
-export([
bitsize/1,
keymapper_info/1,
compute_bitstring/3,
compute_topic_bitmask/2,
compute_time_bitmask/1,
@ -390,9 +390,9 @@ refresh_iterator(It = #it{handle = Handle, cursor = Cursor, next_action = Action
%% Internal exports
%%================================================================================
-spec bitsize(keymapper()) -> bits().
bitsize(#keymapper{bitsize = Bitsize}) ->
Bitsize.
-spec keymapper_info(keymapper()) -> [bitsource()].
keymapper_info(#keymapper{source = Source, bitsize = Bitsize, epoch = Epoch}) ->
#{source => Source, bitsize => Bitsize, epoch => Epoch}.
make_message_key(Topic, PublishedAt, MessageID, Keymapper) ->
combine(compute_bitstring(Topic, PublishedAt, Keymapper), MessageID, Keymapper).

View File

@ -28,13 +28,14 @@
%%--------------------------------------------------------------------
prop_bitstring_computes() ->
?FORALL(Keymapper, keymapper(), begin
Bitsize = emqx_replay_message_storage:bitsize(Keymapper),
?FORALL(
Keymapper,
keymapper(),
?FORALL({Topic, Timestamp}, {topic(), integer()}, begin
BS = emqx_replay_message_storage:compute_bitstring(Topic, Timestamp, Keymapper),
is_integer(BS) andalso (BS < (1 bsl Bitsize))
is_integer(BS) andalso (BS < (1 bsl get_keymapper_bitsize(Keymapper)))
end)
end).
).
prop_topic_bitmask_computes() ->
Keymapper = make_keymapper(16, [8, 12, 16], 100),
@ -56,7 +57,7 @@ prop_next_seek_monotonic() ->
),
?FORALL(
Bitstring,
bitstr(emqx_replay_message_storage:bitsize(Keymapper)),
bitstr(get_keymapper_bitsize(Keymapper)),
emqx_replay_message_storage:compute_next_seek(Bitstring, Filter) >= Bitstring
)
end
@ -436,6 +437,9 @@ make_keymapper(TimestampBits, TopicBits, MaxEpoch) ->
epoch => MaxEpoch
}).
get_keymapper_bitsize(Keymapper) ->
maps:get(bitsize, emqx_replay_message_storage:keymapper_info(Keymapper)).
-spec interleave(list({Tag, list(E)}), rand:state()) -> list({Tag, E}).
interleave(Seqs, Rng) ->
interleave(Seqs, length(Seqs), Rng).