test: split unit tests off into a full-fledged suite
This commit is contained in:
parent
b7566ab7e7
commit
d950efc9fa
|
@ -741,163 +741,3 @@ maybe_refresh_iterator(It = #it{refresh_counter = undefined}) ->
|
||||||
stop_iteration(It) ->
|
stop_iteration(It) ->
|
||||||
ok = rocksdb:iterator_close(It#it.handle),
|
ok = rocksdb:iterator_close(It#it.handle),
|
||||||
none.
|
none.
|
||||||
|
|
||||||
-ifdef(TEST).
|
|
||||||
|
|
||||||
-include_lib("eunit/include/eunit.hrl").
|
|
||||||
|
|
||||||
make_keymapper_test_() ->
|
|
||||||
[
|
|
||||||
?_assertEqual(
|
|
||||||
#keymapper{
|
|
||||||
source = [
|
|
||||||
{timestamp, 9, 23},
|
|
||||||
{hash, level, 2},
|
|
||||||
{hash, level, 4},
|
|
||||||
{hash, levels, 8},
|
|
||||||
{timestamp, 0, 9}
|
|
||||||
],
|
|
||||||
bitsize = 46,
|
|
||||||
epoch = 512
|
|
||||||
},
|
|
||||||
make_keymapper(#{
|
|
||||||
timestamp_bits => 32,
|
|
||||||
topic_bits_per_level => [2, 4, 8],
|
|
||||||
epoch => 1000
|
|
||||||
})
|
|
||||||
),
|
|
||||||
?_assertEqual(
|
|
||||||
#keymapper{
|
|
||||||
source = [
|
|
||||||
{timestamp, 0, 32},
|
|
||||||
{hash, levels, 16}
|
|
||||||
],
|
|
||||||
bitsize = 48,
|
|
||||||
epoch = 1
|
|
||||||
},
|
|
||||||
make_keymapper(#{
|
|
||||||
timestamp_bits => 32,
|
|
||||||
topic_bits_per_level => [16],
|
|
||||||
epoch => 1
|
|
||||||
})
|
|
||||||
)
|
|
||||||
].
|
|
||||||
|
|
||||||
compute_test_bitmask(TopicFilter) ->
|
|
||||||
compute_topic_bitmask(
|
|
||||||
TopicFilter,
|
|
||||||
[
|
|
||||||
{hash, level, 3},
|
|
||||||
{hash, level, 4},
|
|
||||||
{hash, level, 5},
|
|
||||||
{hash, levels, 2}
|
|
||||||
],
|
|
||||||
0
|
|
||||||
).
|
|
||||||
|
|
||||||
bitmask_test_() ->
|
|
||||||
[
|
|
||||||
?_assertEqual(
|
|
||||||
2#111_1111_11111_11,
|
|
||||||
compute_test_bitmask([<<"foo">>, <<"bar">>])
|
|
||||||
),
|
|
||||||
?_assertEqual(
|
|
||||||
2#111_0000_11111_11,
|
|
||||||
compute_test_bitmask([<<"foo">>, '+'])
|
|
||||||
),
|
|
||||||
?_assertEqual(
|
|
||||||
2#111_0000_00000_11,
|
|
||||||
compute_test_bitmask([<<"foo">>, '+', '+'])
|
|
||||||
),
|
|
||||||
?_assertEqual(
|
|
||||||
2#111_0000_11111_00,
|
|
||||||
compute_test_bitmask([<<"foo">>, '+', <<"bar">>, '+'])
|
|
||||||
)
|
|
||||||
].
|
|
||||||
|
|
||||||
wildcard_bitmask_test_() ->
|
|
||||||
[
|
|
||||||
?_assertEqual(
|
|
||||||
2#000_0000_00000_00,
|
|
||||||
compute_test_bitmask(['#'])
|
|
||||||
),
|
|
||||||
?_assertEqual(
|
|
||||||
2#111_0000_00000_00,
|
|
||||||
compute_test_bitmask([<<"foo">>, '#'])
|
|
||||||
),
|
|
||||||
?_assertEqual(
|
|
||||||
2#111_1111_11111_00,
|
|
||||||
compute_test_bitmask([<<"foo">>, <<"bar">>, <<"baz">>, '#'])
|
|
||||||
),
|
|
||||||
?_assertEqual(
|
|
||||||
2#111_1111_11111_11,
|
|
||||||
compute_test_bitmask([<<"foo">>, <<"bar">>, <<"baz">>, <<>>, '#'])
|
|
||||||
)
|
|
||||||
].
|
|
||||||
|
|
||||||
%% Filter = |123|***|678|***|
|
|
||||||
%% Mask = |123|***|678|***|
|
|
||||||
%% Key1 = |123|011|108|121| → Seek = 0 |123|011|678|000|
|
|
||||||
%% Key2 = |123|011|679|919| → Seek = 0 |123|012|678|000|
|
|
||||||
%% Key3 = |123|999|679|001| → Seek = 1 |123|000|678|000| → eos
|
|
||||||
%% Key4 = |125|011|179|017| → Seek = 1 |123|000|678|000| → eos
|
|
||||||
|
|
||||||
compute_test_topic_seek(Bitstring, Bitfilter, HBitmask) ->
|
|
||||||
compute_topic_seek(
|
|
||||||
Bitstring,
|
|
||||||
Bitfilter,
|
|
||||||
HBitmask,
|
|
||||||
[
|
|
||||||
{hash, level, 8},
|
|
||||||
{hash, level, 8},
|
|
||||||
{hash, level, 16},
|
|
||||||
{hash, levels, 12}
|
|
||||||
],
|
|
||||||
8 + 8 + 16 + 12
|
|
||||||
).
|
|
||||||
|
|
||||||
next_seek_test_() ->
|
|
||||||
[
|
|
||||||
?_assertMatch(
|
|
||||||
none,
|
|
||||||
compute_test_topic_seek(
|
|
||||||
16#FD_42_4242_043,
|
|
||||||
16#FD_42_4242_042,
|
|
||||||
16#FF_FF_FFFF_FFF
|
|
||||||
)
|
|
||||||
),
|
|
||||||
?_assertMatch(
|
|
||||||
16#FD_11_0678_000,
|
|
||||||
compute_test_topic_seek(
|
|
||||||
16#FD_11_0108_121,
|
|
||||||
16#FD_00_0678_000,
|
|
||||||
16#FF_00_FFFF_000
|
|
||||||
)
|
|
||||||
),
|
|
||||||
?_assertMatch(
|
|
||||||
16#FD_12_0678_000,
|
|
||||||
compute_test_topic_seek(
|
|
||||||
16#FD_11_0679_919,
|
|
||||||
16#FD_00_0678_000,
|
|
||||||
16#FF_00_FFFF_000
|
|
||||||
)
|
|
||||||
),
|
|
||||||
?_assertMatch(
|
|
||||||
none,
|
|
||||||
compute_test_topic_seek(
|
|
||||||
16#FD_FF_0679_001,
|
|
||||||
16#FD_00_0678_000,
|
|
||||||
16#FF_00_FFFF_000
|
|
||||||
)
|
|
||||||
),
|
|
||||||
?_assertMatch(
|
|
||||||
none,
|
|
||||||
compute_test_topic_seek(
|
|
||||||
16#FE_11_0179_017,
|
|
||||||
16#FD_00_0678_000,
|
|
||||||
16#FF_00_FFFF_000
|
|
||||||
)
|
|
||||||
)
|
|
||||||
].
|
|
||||||
|
|
||||||
-endif.
|
|
||||||
|
|
|
@ -0,0 +1,200 @@
|
||||||
|
%%--------------------------------------------------------------------
|
||||||
|
%% Copyright (c) 2022-2023 EMQ Technologies Co., Ltd. All Rights Reserved.
|
||||||
|
%%
|
||||||
|
%% Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
%% you may not use this file except in compliance with the License.
|
||||||
|
%% You may obtain a copy of the License at
|
||||||
|
%%
|
||||||
|
%% http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
%%
|
||||||
|
%% Unless required by applicable law or agreed to in writing, software
|
||||||
|
%% distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
%% See the License for the specific language governing permissions and
|
||||||
|
%% limitations under the License.
|
||||||
|
%%--------------------------------------------------------------------
|
||||||
|
-module(emqx_replay_message_storage_SUITE).
|
||||||
|
|
||||||
|
-compile(export_all).
|
||||||
|
-compile(nowarn_export_all).
|
||||||
|
|
||||||
|
-include_lib("stdlib/include/assert.hrl").
|
||||||
|
|
||||||
|
-import(emqx_replay_message_storage, [
|
||||||
|
make_keymapper/1,
|
||||||
|
keymapper_info/1,
|
||||||
|
compute_topic_bitmask/2,
|
||||||
|
compute_time_bitmask/1,
|
||||||
|
compute_topic_seek/4
|
||||||
|
]).
|
||||||
|
|
||||||
|
all() -> emqx_common_test_helpers:all(?MODULE).
|
||||||
|
|
||||||
|
t_make_keymapper(_) ->
|
||||||
|
?assertMatch(
|
||||||
|
#{
|
||||||
|
source := [
|
||||||
|
{timestamp, 9, 23},
|
||||||
|
{hash, level, 2},
|
||||||
|
{hash, level, 4},
|
||||||
|
{hash, levels, 8},
|
||||||
|
{timestamp, 0, 9}
|
||||||
|
],
|
||||||
|
bitsize := 46,
|
||||||
|
epoch := 512
|
||||||
|
},
|
||||||
|
keymapper_info(
|
||||||
|
make_keymapper(#{
|
||||||
|
timestamp_bits => 32,
|
||||||
|
topic_bits_per_level => [2, 4, 8],
|
||||||
|
epoch => 1000
|
||||||
|
})
|
||||||
|
)
|
||||||
|
).
|
||||||
|
|
||||||
|
t_make_keymapper_single_hash_level(_) ->
|
||||||
|
?assertMatch(
|
||||||
|
#{
|
||||||
|
source := [
|
||||||
|
{timestamp, 0, 32},
|
||||||
|
{hash, levels, 16}
|
||||||
|
],
|
||||||
|
bitsize := 48,
|
||||||
|
epoch := 1
|
||||||
|
},
|
||||||
|
keymapper_info(
|
||||||
|
make_keymapper(#{
|
||||||
|
timestamp_bits => 32,
|
||||||
|
topic_bits_per_level => [16],
|
||||||
|
epoch => 1
|
||||||
|
})
|
||||||
|
)
|
||||||
|
).
|
||||||
|
|
||||||
|
t_make_keymapper_no_timestamp(_) ->
|
||||||
|
?assertMatch(
|
||||||
|
#{
|
||||||
|
source := [
|
||||||
|
{hash, level, 4},
|
||||||
|
{hash, level, 8},
|
||||||
|
{hash, levels, 16}
|
||||||
|
],
|
||||||
|
bitsize := 28,
|
||||||
|
epoch := 1
|
||||||
|
},
|
||||||
|
keymapper_info(
|
||||||
|
make_keymapper(#{
|
||||||
|
timestamp_bits => 0,
|
||||||
|
topic_bits_per_level => [4, 8, 16],
|
||||||
|
epoch => 42
|
||||||
|
})
|
||||||
|
)
|
||||||
|
).
|
||||||
|
|
||||||
|
t_compute_topic_bitmask(_) ->
|
||||||
|
KM = make_keymapper(#{topic_bits_per_level => [3, 4, 5, 2], timestamp_bits => 0, epoch => 1}),
|
||||||
|
?assertEqual(
|
||||||
|
2#111_1111_11111_11,
|
||||||
|
compute_topic_bitmask([<<"foo">>, <<"bar">>], KM)
|
||||||
|
),
|
||||||
|
?assertEqual(
|
||||||
|
2#111_0000_11111_11,
|
||||||
|
compute_topic_bitmask([<<"foo">>, '+'], KM)
|
||||||
|
),
|
||||||
|
?assertEqual(
|
||||||
|
2#111_0000_00000_11,
|
||||||
|
compute_topic_bitmask([<<"foo">>, '+', '+'], KM)
|
||||||
|
),
|
||||||
|
?assertEqual(
|
||||||
|
2#111_0000_11111_00,
|
||||||
|
compute_topic_bitmask([<<"foo">>, '+', <<"bar">>, '+'], KM)
|
||||||
|
).
|
||||||
|
|
||||||
|
t_compute_topic_bitmask_wildcard(_) ->
|
||||||
|
KM = make_keymapper(#{topic_bits_per_level => [3, 4, 5, 2], timestamp_bits => 0, epoch => 1}),
|
||||||
|
?assertEqual(
|
||||||
|
2#000_0000_00000_00,
|
||||||
|
compute_topic_bitmask(['#'], KM)
|
||||||
|
),
|
||||||
|
?assertEqual(
|
||||||
|
2#111_0000_00000_00,
|
||||||
|
compute_topic_bitmask([<<"foo">>, '#'], KM)
|
||||||
|
),
|
||||||
|
?assertEqual(
|
||||||
|
2#111_1111_11111_00,
|
||||||
|
compute_topic_bitmask([<<"foo">>, <<"bar">>, <<"baz">>, '#'], KM)
|
||||||
|
).
|
||||||
|
|
||||||
|
t_compute_topic_bitmask_wildcard_long_tail(_) ->
|
||||||
|
KM = make_keymapper(#{topic_bits_per_level => [3, 4, 5, 2], timestamp_bits => 0, epoch => 1}),
|
||||||
|
?assertEqual(
|
||||||
|
2#111_1111_11111_11,
|
||||||
|
compute_topic_bitmask([<<"foo">>, <<"bar">>, <<"baz">>, <<>>, <<"xyzzy">>], KM)
|
||||||
|
),
|
||||||
|
?assertEqual(
|
||||||
|
2#111_1111_11111_00,
|
||||||
|
compute_topic_bitmask([<<"foo">>, <<"bar">>, <<"baz">>, <<>>, '#'], KM)
|
||||||
|
).
|
||||||
|
|
||||||
|
t_compute_time_bitmask(_) ->
|
||||||
|
KM = make_keymapper(#{topic_bits_per_level => [1, 2, 3], timestamp_bits => 10, epoch => 200}),
|
||||||
|
?assertEqual(2#111_000000_1111111, compute_time_bitmask(KM)).
|
||||||
|
|
||||||
|
t_compute_time_bitmask_epoch_only(_) ->
|
||||||
|
KM = make_keymapper(#{topic_bits_per_level => [1, 2, 3], timestamp_bits => 10, epoch => 1}),
|
||||||
|
?assertEqual(2#1111111111_000000, compute_time_bitmask(KM)).
|
||||||
|
|
||||||
|
%% Filter = |123|***|678|***|
|
||||||
|
%% Mask = |123|***|678|***|
|
||||||
|
%% Key1 = |123|011|108|121| → Seek = 0 |123|011|678|000|
|
||||||
|
%% Key2 = |123|011|679|919| → Seek = 0 |123|012|678|000|
|
||||||
|
%% Key3 = |123|999|679|001| → Seek = 1 |123|000|678|000| → eos
|
||||||
|
%% Key4 = |125|011|179|017| → Seek = 1 |123|000|678|000| → eos
|
||||||
|
|
||||||
|
t_compute_next_topic_seek(_) ->
|
||||||
|
KM = make_keymapper(#{topic_bits_per_level => [8, 8, 16, 12], timestamp_bits => 0, epoch => 1}),
|
||||||
|
?assertMatch(
|
||||||
|
none,
|
||||||
|
compute_topic_seek(
|
||||||
|
16#FD_42_4242_043,
|
||||||
|
16#FD_42_4242_042,
|
||||||
|
16#FF_FF_FFFF_FFF,
|
||||||
|
KM
|
||||||
|
)
|
||||||
|
),
|
||||||
|
?assertMatch(
|
||||||
|
16#FD_11_0678_000,
|
||||||
|
compute_topic_seek(
|
||||||
|
16#FD_11_0108_121,
|
||||||
|
16#FD_00_0678_000,
|
||||||
|
16#FF_00_FFFF_000,
|
||||||
|
KM
|
||||||
|
)
|
||||||
|
),
|
||||||
|
?assertMatch(
|
||||||
|
16#FD_12_0678_000,
|
||||||
|
compute_topic_seek(
|
||||||
|
16#FD_11_0679_919,
|
||||||
|
16#FD_00_0678_000,
|
||||||
|
16#FF_00_FFFF_000,
|
||||||
|
KM
|
||||||
|
)
|
||||||
|
),
|
||||||
|
?assertMatch(
|
||||||
|
none,
|
||||||
|
compute_topic_seek(
|
||||||
|
16#FD_FF_0679_001,
|
||||||
|
16#FD_00_0678_000,
|
||||||
|
16#FF_00_FFFF_000,
|
||||||
|
KM
|
||||||
|
)
|
||||||
|
),
|
||||||
|
?assertMatch(
|
||||||
|
none,
|
||||||
|
compute_topic_seek(
|
||||||
|
16#FE_11_0179_017,
|
||||||
|
16#FD_00_0678_000,
|
||||||
|
16#FF_00_FFFF_000,
|
||||||
|
KM
|
||||||
|
)
|
||||||
|
).
|
Loading…
Reference in New Issue