summaryrefslogtreecommitdiff
path: root/deps/rabbit_common/test/gen_server2_test_server.erl
diff options
context:
space:
mode:
Diffstat (limited to 'deps/rabbit_common/test/gen_server2_test_server.erl')
-rw-r--r--deps/rabbit_common/test/gen_server2_test_server.erl72
1 files changed, 72 insertions, 0 deletions
diff --git a/deps/rabbit_common/test/gen_server2_test_server.erl b/deps/rabbit_common/test/gen_server2_test_server.erl
new file mode 100644
index 0000000000..0d68df8f7e
--- /dev/null
+++ b/deps/rabbit_common/test/gen_server2_test_server.erl
@@ -0,0 +1,72 @@
+%% This Source Code Form is subject to the terms of the Mozilla Public
+%% License, v. 2.0. If a copy of the MPL was not distributed with this
+%% file, You can obtain one at https://mozilla.org/MPL/2.0/.
+%%
+%% Copyright (c) 2017-2020 VMware, Inc. or its affiliates. All rights reserved.
+%%
+
+-module(gen_server2_test_server).
+-behaviour(gen_server2).
+-record(gs2_state, {parent, name, state, mod, time,
+ timeout_state, queue, debug, prioritisers,
+ timer, emit_stats_fun, stop_stats_fun}).
+
+-export([start_link/0, start_link/1, start_link/2, stats_count/1]).
+
+-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
+ terminate/2, code_change/3, handle_post_hibernate/1]).
+
+start_link(count_stats) ->
+ start_link(count_stats, infinity).
+
+start_link(count_stats, Time) ->
+ {ok, Server} = gen_server2:start_link(gen_server2_test_server, [Time], []),
+ Counter = gen_server2:call(Server, get_counter),
+ sys:replace_state(Server,
+ fun(GSState) ->
+ GSState#gs2_state{
+ emit_stats_fun = fun(State) -> count_stats(Counter), State end
+ }
+ end),
+ {ok, Server}.
+
+start_link() ->
+ gen_server2:start_link(gen_server2_test_server, [], []).
+
+stats_count(Server) ->
+ Counter = gen_server2:call(Server, get_counter),
+ [{count, Count}] = ets:lookup(Counter, count),
+ Count.
+
+init([]) ->
+ init([infinity]);
+init([Time]) ->
+ Counter = ets:new(stats_count, [public]),
+ ets:insert(Counter, {count, 0}),
+ case Time of
+ {backoff, _, _, _} ->
+ {ok, {counter, Counter}, hibernate, Time};
+ _ ->
+ {ok, {counter, Counter}, Time}
+ end.
+
+count_stats(Counter) ->
+ ets:update_counter(Counter, count, {2, 1}).
+
+handle_call(get_counter,_, {counter, Counter} = State) ->
+ {reply, Counter, State};
+handle_call(hibernate, _, State) ->
+ {reply, ok, State, hibernate};
+handle_call(_,_,State) ->
+ {reply, ok, State}.
+
+handle_cast({sleep, Time}, State) -> timer:sleep(Time), {noreply, State};
+handle_cast(_,State) -> {noreply, State}.
+
+handle_post_hibernate(State) -> {noreply, State}.
+
+handle_info(_,State) -> {noreply, State}.
+
+terminate(_,_State) -> ok.
+
+code_change(_,State,_) -> {ok, State}.