|
3 | 3 | -compile(nowarn_export_all).
|
4 | 4 | -compile(export_all).
|
5 | 5 |
|
6 |
| --export([ |
7 |
| - ]). |
8 |
| - |
9 | 6 | -include_lib("proper/include/proper.hrl").
|
10 | 7 | -include_lib("common_test/include/ct.hrl").
|
11 | 8 | -include_lib("eunit/include/eunit.hrl").
|
@@ -87,7 +84,8 @@ all_tests() ->
|
87 | 84 | dlx_07,
|
88 | 85 | dlx_08,
|
89 | 86 | dlx_09,
|
90 |
| - single_active_ordering_02 |
| 87 | + single_active_ordering_02, |
| 88 | + different_nodes |
91 | 89 | ].
|
92 | 90 |
|
93 | 91 | groups() ->
|
@@ -1095,6 +1093,39 @@ single_active_ordering_03(_Config) ->
|
1095 | 1093 | false
|
1096 | 1094 | end.
|
1097 | 1095 |
|
| 1096 | +%% Test that running the state machine commands on different Erlang nodes |
| 1097 | +%% end up in exactly the same state. |
| 1098 | +different_nodes(Config) -> |
| 1099 | + Config1 = rabbit_ct_helpers:run_setup_steps( |
| 1100 | + Config, |
| 1101 | + rabbit_ct_broker_helpers:setup_steps()), |
| 1102 | + |
| 1103 | + Size = 400, |
| 1104 | + run_proper( |
| 1105 | + fun () -> |
| 1106 | + ?FORALL({Length, Bytes, DeliveryLimit, SingleActive}, |
| 1107 | + frequency([{5, {undefined, undefined, undefined, false}}, |
| 1108 | + {5, {oneof([range(1, 10), undefined]), |
| 1109 | + oneof([range(1, 1000), undefined]), |
| 1110 | + oneof([range(1, 3), undefined]), |
| 1111 | + oneof([true, false]) |
| 1112 | + }}]), |
| 1113 | + begin |
| 1114 | + Conf = config(?FUNCTION_NAME, |
| 1115 | + Length, |
| 1116 | + Bytes, |
| 1117 | + SingleActive, |
| 1118 | + DeliveryLimit), |
| 1119 | + ?FORALL(O, ?LET(Ops, log_gen_different_nodes(Size), expand(Ops, Conf)), |
| 1120 | + collect({log_size, length(O)}, |
| 1121 | + different_nodes_prop(Config1, Conf, O))) |
| 1122 | + end) |
| 1123 | + end, [], Size), |
| 1124 | + |
| 1125 | + rabbit_ct_helpers:run_teardown_steps( |
| 1126 | + Config1, |
| 1127 | + rabbit_ct_broker_helpers:teardown_steps()). |
| 1128 | + |
1098 | 1129 | max_length(_Config) ->
|
1099 | 1130 | %% tests that max length is never transgressed
|
1100 | 1131 | Size = 1000,
|
@@ -1454,6 +1485,19 @@ single_active_prop(Conf0, Commands, ValidateOrder) ->
|
1454 | 1485 | false
|
1455 | 1486 | end.
|
1456 | 1487 |
|
| 1488 | +different_nodes_prop(Config, Conf0, Commands) -> |
| 1489 | + Conf = Conf0#{release_cursor_interval => 100}, |
| 1490 | + Indexes = lists:seq(1, length(Commands)), |
| 1491 | + Entries = lists:zip(Indexes, Commands), |
| 1492 | + InitState = test_init(Conf), |
| 1493 | + Fun = fun(_) -> true end, |
| 1494 | + Vsn = 6, |
| 1495 | + |
| 1496 | + {State0, _Effs0} = run_log(InitState, Entries, Fun, Vsn), |
| 1497 | + {State1, _Effs1} = rabbit_ct_broker_helpers:rpc(Config, ?MODULE, run_log, |
| 1498 | + [InitState, Entries, Fun, Vsn]), |
| 1499 | + State0 =:= State1. |
| 1500 | + |
1457 | 1501 | messages_total_prop(Conf0, Commands) ->
|
1458 | 1502 | Conf = Conf0#{release_cursor_interval => 100},
|
1459 | 1503 | Indexes = lists:seq(1, length(Commands)),
|
@@ -1797,6 +1841,29 @@ log_gen_without_checkout_cancel(Size) ->
|
1797 | 1841 | {1, purge}
|
1798 | 1842 | ]))))).
|
1799 | 1843 |
|
| 1844 | +log_gen_different_nodes(Size) -> |
| 1845 | + Nodes = [node(), |
| 1846 | + fakenode@fake, |
| 1847 | + fakenode@fake2 |
| 1848 | + ], |
| 1849 | + ?LET(EPids, vector(4, pid_gen(Nodes)), |
| 1850 | + ?LET(CPids, vector(4, pid_gen(Nodes)), |
| 1851 | + resize(Size, |
| 1852 | + list( |
| 1853 | + frequency( |
| 1854 | + [{10, enqueue_gen(oneof(EPids))}, |
| 1855 | + {20, {input_event, |
| 1856 | + frequency([{10, settle}, |
| 1857 | + {2, return}, |
| 1858 | + {2, discard}, |
| 1859 | + {2, requeue}])}}, |
| 1860 | + {8, checkout_gen(oneof(CPids))}, |
| 1861 | + {2, checkout_cancel_gen(oneof(CPids))}, |
| 1862 | + {6, down_gen(oneof(EPids ++ CPids))}, |
| 1863 | + {6, nodeup_gen(Nodes)}, |
| 1864 | + {1, purge} |
| 1865 | + ]))))). |
| 1866 | + |
1800 | 1867 | monotonic_gen() ->
|
1801 | 1868 | ?LET(_, integer(), erlang:unique_integer([positive, monotonic])).
|
1802 | 1869 |
|
|
0 commit comments