You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by ii...@apache.org on 2025/07/10 08:37:08 UTC
(couchdb) 07/09: Create csrt_test_helper.erl
This is an automated email from the ASF dual-hosted git repository.
iilyak pushed a commit to branch couch-stats-resource-tracker-v3-rebase-http-4
in repository https://gitbox.apache.org/repos/asf/couchdb.git
commit 4df681a3035aef1960abcaed1e0af69575f2ea99
Author: ILYA Khlopotov <ii...@apache.org>
AuthorDate: Wed Jun 25 12:09:53 2025 -0700
Create csrt_test_helper.erl
---
src/couch_stats/test/eunit/csrt_logger_tests.erl | 98 +++-----------------
src/couch_stats/test/eunit/csrt_test_helper.erl | 110 +++++++++++++++++++++++
2 files changed, 120 insertions(+), 88 deletions(-)
diff --git a/src/couch_stats/test/eunit/csrt_logger_tests.erl b/src/couch_stats/test/eunit/csrt_logger_tests.erl
index bb38a5d54..2a8e28035 100644
--- a/src/couch_stats/test/eunit/csrt_logger_tests.erl
+++ b/src/couch_stats/test/eunit/csrt_logger_tests.erl
@@ -12,20 +12,22 @@
-module(csrt_logger_tests).
+-import(
+ csrt_test_helper,
+ [
+ rctx_gen/0,
+ rctx_gen/1,
+ rctxs/0,
+ jrctx/1
+ ]
+).
+
-include_lib("couch/include/couch_db.hrl").
-include_lib("couch/include/couch_eunit.hrl").
-include_lib("couch_mrview/include/couch_mrview.hrl").
-include("../../src/couch_stats_resource_tracker.hrl").
--define(RCTX_RANGE, 1000).
--define(RCTX_COUNT, 10000).
-
-%% Dirty hack for hidden records as .hrl is only in src/
--define(RCTX_RPC, #rpc_worker{from = {self(), make_ref()}}).
--define(RCTX_COORDINATOR, #coordinator{method = 'GET', path = "/foo/_all_docs"}).
-
%% Use different values than default configs to ensure they're picked up
--define(THRESHOLD_DBNAME, <<"foo">>).
-define(THRESHOLD_DBNAME_IO, 91).
-define(THRESHOLD_DOCS_READ, 123).
-define(THRESHOLD_DOCS_WRITTEN, 12).
@@ -144,73 +146,6 @@ teardown_reporting(Ctx) ->
ok = meck:unload(couch_log),
teardown(Ctx).
-rctx_gen() ->
- rctx_gen(#{}).
-
-rctx_gen(Opts0) ->
- DbnameGen = one_of([<<"foo">>, <<"bar">>, ?tempdb]),
- TypeGen = one_of([?RCTX_RPC, ?RCTX_COORDINATOR]),
- R = fun() -> rand:uniform(?RCTX_RANGE) end,
- R10 = fun() -> 3 + rand:uniform(round(?RCTX_RANGE / 10)) end,
- Occasional = one_of([0, 0, 0, 0, 0, R]),
- Nonce = one_of(["9c54fa9283", "foobar7799" | lists:duplicate(10, fun nonce/0)]),
- Base = #{
- dbname => DbnameGen,
- db_open => R10,
- docs_read => R,
- docs_written => Occasional,
- get_kp_node => R10,
- get_kv_node => R,
- nonce => Nonce,
- pid_ref => {self(), make_ref()},
- ioq_calls => R,
- rows_read => R,
- type => TypeGen,
- %% Hack because we need to modify both fields
- '_do_changes' => true
- },
- Opts = maps:merge(Base, Opts0),
- csrt_entry:from_map(
- maps:fold(
- fun
- %% Hack for changes because we need to modify both
- %% changes_processed (rows_read) and changes_returned but the
- %% latter must be <= the former
- ('_do_changes', V, Acc) ->
- case V of
- true ->
- Processed = R(),
- Returned = (one_of([0, 0, 1, Processed, rand:uniform(Processed)]))(),
- maps:put(
- rows_read,
- Processed,
- maps:put(changes_returned, Returned, Acc)
- );
- _ ->
- Acc
- end;
- (K, F, Acc) when is_function(F) ->
- maps:put(K, F(), Acc);
- (K, V, Acc) ->
- maps:put(K, V, Acc)
- end,
- #{},
- Opts
- )
- ).
-
-rctxs() ->
- [rctx_gen() || _ <- lists:seq(1, ?RCTX_COUNT)].
-
-jrctx(Rctx) ->
- JRctx = csrt_entry:to_json(Rctx),
- case csrt_logger:should_truncate_reports() of
- true ->
- maps:filter(fun(_K, V) -> V > 0 end, JRctx);
- false ->
- JRctx
- end.
-
t_enablement(#{}) ->
%% Set an invalid match spec to ensure csrt_logger is resilient
config:set(?CONF_MATCHERS_DBNAMES, "foobar", "lkajsdfkjkkadfjkajkf", false),
@@ -492,16 +427,3 @@ matcher_for_dbname_io(Dbname0, Threshold) ->
Vals = [{F, csrt_entry:value(F, Rctx)} || F <- Fields],
Dbname =:= mem3:dbname(DbnameA) andalso lists:any(fun({_K, V}) -> V >= Threshold end, Vals)
end.
-
-nonce() ->
- couch_util:to_hex(crypto:strong_rand_bytes(5)).
-
-one_of(L) ->
- fun() ->
- case lists:nth(rand:uniform(length(L)), L) of
- F when is_function(F) ->
- F();
- N ->
- N
- end
- end.
diff --git a/src/couch_stats/test/eunit/csrt_test_helper.erl b/src/couch_stats/test/eunit/csrt_test_helper.erl
new file mode 100644
index 000000000..bcea84fcb
--- /dev/null
+++ b/src/couch_stats/test/eunit/csrt_test_helper.erl
@@ -0,0 +1,110 @@
+% 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(csrt_test_helper).
+
+-export([
+ rctx_gen/0,
+ rctx_gen/1,
+ rctxs/0,
+ jrctx/1
+]).
+
+-include_lib("couch/include/couch_eunit.hrl").
+
+-include("../../src/couch_stats_resource_tracker.hrl").
+-define(RCTX_RANGE, 1000).
+-define(RCTX_COUNT, 10000).
+
+%% Dirty hack for hidden records as .hrl is only in src/
+-define(RCTX_RPC, #rpc_worker{from = {self(), make_ref()}}).
+-define(RCTX_COORDINATOR, #coordinator{method = 'GET', path = "/foo/_all_docs"}).
+
+rctx_gen() ->
+ rctx_gen(#{}).
+
+rctx_gen(Opts0) ->
+ DbnameGen = one_of([<<"foo">>, <<"bar">>, ?tempdb]),
+ TypeGen = one_of([?RCTX_RPC, ?RCTX_COORDINATOR]),
+ R = fun() -> rand:uniform(?RCTX_RANGE) end,
+ R10 = fun() -> 3 + rand:uniform(round(?RCTX_RANGE / 10)) end,
+ Occasional = one_of([0, 0, 0, 0, 0, R]),
+ Nonce = one_of(["9c54fa9283", "foobar7799" | lists:duplicate(10, fun nonce/0)]),
+ Base = #{
+ dbname => DbnameGen,
+ db_open => R10,
+ docs_read => R,
+ docs_written => Occasional,
+ get_kp_node => R10,
+ get_kv_node => R,
+ nonce => Nonce,
+ pid_ref => {self(), make_ref()},
+ ioq_calls => R,
+ rows_read => R,
+ type => TypeGen,
+ %% Hack because we need to modify both fields
+ '_do_changes' => true
+ },
+ Opts = maps:merge(Base, Opts0),
+ csrt_entry:from_map(
+ maps:fold(
+ fun
+ %% Hack for changes because we need to modify both
+ %% changes_processed (rows_read) and changes_returned but the
+ %% latter must be <= the former
+ ('_do_changes', V, Acc) ->
+ case V of
+ true ->
+ Processed = R(),
+ Returned = (one_of([0, 0, 1, Processed, rand:uniform(Processed)]))(),
+ maps:put(
+ rows_read,
+ Processed,
+ maps:put(changes_returned, Returned, Acc)
+ );
+ _ ->
+ Acc
+ end;
+ (K, F, Acc) when is_function(F) ->
+ maps:put(K, F(), Acc);
+ (K, V, Acc) ->
+ maps:put(K, V, Acc)
+ end,
+ #{},
+ Opts
+ )
+ ).
+
+rctxs() ->
+ [rctx_gen() || _ <- lists:seq(1, ?RCTX_COUNT)].
+
+jrctx(Rctx) ->
+ JRctx = csrt_entry:to_json(Rctx),
+ case csrt_logger:should_truncate_reports() of
+ true ->
+ maps:filter(fun(_K, V) -> V > 0 end, JRctx);
+ false ->
+ JRctx
+ end.
+
+nonce() ->
+ couch_util:to_hex(crypto:strong_rand_bytes(5)).
+
+one_of(L) ->
+ fun() ->
+ case lists:nth(rand:uniform(length(L)), L) of
+ F when is_function(F) ->
+ F();
+ N ->
+ N
+ end
+ end.