This is an automated email from the ASF dual-hosted git repository. vatamane pushed a commit to branch remove-triq in repository https://gitbox.apache.org/repos/asf/couchdb.git
commit b5e53590e2bbb8cac72447af35d926257201df76 Author: Nick Vatamaniuc <[email protected]> AuthorDate: Tue Jan 21 10:20:08 2020 -0500 Replace Triq with PropEr It was already used in the IOQ2 work so all the plumbing to pull it in during dev testing was there and it seems awkward to have two different property testing framework for just a few tests. It is still an optional component and is not included in the release. --- mix.exs | 1 - rebar.config.script | 2 +- src/couch/include/couch_eunit_proper.hrl | 29 ++++++++++++++++ src/couch/rebar.config.script | 7 +++- src/couch/test/eunit/couch_key_tree_prop_tests.erl | 40 +++++++++++----------- src/mem3/rebar.config.script | 22 ++++++++++++ src/mem3/test/eunit/mem3_ring_prop_tests.erl | 17 ++++++--- 7 files changed, 90 insertions(+), 28 deletions(-) diff --git a/mix.exs b/mix.exs index 4432b1c..d717e4b 100644 --- a/mix.exs +++ b/mix.exs @@ -109,7 +109,6 @@ defmodule CouchDBTest.Mixfile do "bear", "mochiweb", "snappy", - "triq", "rebar", "proper", "mochiweb", diff --git a/rebar.config.script b/rebar.config.script index e39a082..a2e1922 100644 --- a/rebar.config.script +++ b/rebar.config.script @@ -155,7 +155,7 @@ DepDescs = [ {tag, "v1.2.2"}, [raw]}, %% Third party deps {folsom, "folsom", {tag, "CouchDB-0.8.3"}}, -{hyper, "hyper", {tag, "CouchDB-2.2.0-4"}}, +{hyper, "hyper", {tag, "CouchDB-2.2.0-6"}}, {ibrowse, "ibrowse", {tag, "CouchDB-4.0.1-1"}}, {jiffy, "jiffy", {tag, "CouchDB-0.14.11-2"}}, {mochiweb, "mochiweb", {tag, "v2.20.0"}}, diff --git a/src/couch/include/couch_eunit_proper.hrl b/src/couch/include/couch_eunit_proper.hrl new file mode 100644 index 0000000..31ae40e --- /dev/null +++ b/src/couch/include/couch_eunit_proper.hrl @@ -0,0 +1,29 @@ +% 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. + +-include_lib("proper/include/proper.hrl"). +-include_lib("eunit/include/eunit.hrl"). + + +-define(EUNIT_QUICKCHECK(QuickcheckTimeout), + [ + { + atom_to_list(F), + {timeout, QuickcheckTimeout, + ?_assert(proper:quickcheck(?MODULE:F(), [ + {to_file, user}, + {start_size, 2}, + long_result + ]))} + } + || {F, 0} <- ?MODULE:module_info(exports), F > 'prop_', F < 'prop`' + ]). diff --git a/src/couch/rebar.config.script b/src/couch/rebar.config.script index a646861..c0889ce 100644 --- a/src/couch/rebar.config.script +++ b/src/couch/rebar.config.script @@ -92,6 +92,11 @@ MD5Config = case lists:keyfind(erlang_md5, 1, CouchConfig) of [] end, +ProperConfig = case code:lib_dir(proper) of + {error, bad_name} -> []; + _ -> [{d, 'WITH_PROPER'}] +end, + {JS_CFLAGS, JS_LDFLAGS} = case os:type() of {win32, _} when SMVsn == "1.8.5" -> { @@ -212,7 +217,7 @@ AddConfig = [ {d, 'COUCHDB_VERSION', Version}, {d, 'COUCHDB_GIT_SHA', GitSha}, {i, "../"} - ] ++ MD5Config}, + ] ++ MD5Config ++ ProperConfig}, {eunit_compile_opts, PlatformDefines} ]. diff --git a/src/couch/test/eunit/couch_key_tree_prop_tests.erl b/src/couch/test/eunit/couch_key_tree_prop_tests.erl index f814692..9c09aac 100644 --- a/src/couch/test/eunit/couch_key_tree_prop_tests.erl +++ b/src/couch/test/eunit/couch_key_tree_prop_tests.erl @@ -12,14 +12,21 @@ -module(couch_key_tree_prop_tests). --include_lib("triq/include/triq.hrl"). --triq(eunit). + +-ifdef(WITH_PROPER). + +-include_lib("couch/include/couch_eunit_proper.hrl"). + -define(SIZE_REDUCTION, 3). % How much to reduce size with tree depth. -define(MAX_BRANCHES, 4). % Maximum number of branches. -define(RAND_SIZE, 1 bsl 64). +property_test_() -> + ?EUNIT_QUICKCHECK(60). + + % % Properties % @@ -116,10 +123,10 @@ prop_stemming_results_in_same_or_less_total_revs() -> prop_stem_path_expect_size_to_get_smaller() -> ?FORALL({RevTree, StemDepth}, { - ?SIZED(Size, resize(Size * 10, g_revtree([], 1))), - choose(1,5) + ?SIZED(Size, g_revtree(Size * 10, [], 1)), + choose(1,3) }, - ?IMPLIES(real_depth(RevTree) > 5, + ?IMPLIES(real_depth(RevTree) > 3, begin Stemmed = couch_key_tree:stem(RevTree, StemDepth), StemmedKeys = lists:usort(keylist(Stemmed)), @@ -224,7 +231,7 @@ g_revtree(Size, ERevs, MaxBranches) -> g_treenode(0, Revs, _) -> {elements(Revs), x, []}; g_treenode(Size, Revs, MaxBranches) -> - ?DELAY(?LET(N, int(0, MaxBranches), + ?LAZY(?LET(N, choose(0, MaxBranches), begin [Rev | ChildRevs] = Revs, {Rev, x, g_nodes(Size div ?SIZE_REDUCTION, N, ChildRevs, MaxBranches)} @@ -261,17 +268,15 @@ g_stem_depth(Size) -> % Uses the shuffle/1 function to shuffle the input list. Unshuffled list is % used as the shrink value. % +g_shuffle([]) -> []; g_shuffle(L) when is_list(L) -> - triq_dom:domain(g_shuffle, - fun(Self, _Size) -> {Self, shuffle(L)} end, - fun(Self, _Val) -> {Self, L} end - ). + ?LET(X, elements(L), [X | g_shuffle(lists:delete(X,L))]). % Wrapper to make a list shuffling generator that doesn't shrink % g_shuffle_noshrink(L) when is_list(L) -> - triq_dom:noshrink(g_shuffle(L)). + proper_types:noshrink(g_shuffle(L)). % Generate shuffled sublists up to N items long from a list. @@ -297,7 +302,7 @@ g_revs(Size, Existing) when is_integer(Size), is_list(Existing) -> true -> % have extra, try various sublists g_shuffled_sublists(Revs, Expected); false -> - triq_dom:return(Revs) + proper_types:return(Revs) end. @@ -319,19 +324,12 @@ same_keys(RevTree1, RevTree2) -> all(L) -> lists:all(fun(E) -> E end, L). -% Shufle a list of items. Tag each item with a random number then sort -% the list and remove the tags. -% -shuffle(L) -> - Tagged = [{triq_rnd:uniform(), X} || X <- L], - [X || {_, X} <- lists:sort(Tagged)]. - % Generate list of relateively unique large random numbers rand_list(N) when N =< 0 -> []; rand_list(N) -> - [triq_rnd:uniform(?RAND_SIZE) || _ <- lists:seq(1, N)]. + [rand:uniform(?RAND_SIZE) || _ <- lists:seq(1, N)]. % Generate a list of revisions to be used as key in revision trees. Expected @@ -528,3 +526,5 @@ child_revs(ChildCount, Revs, Size, MaxBranches) -> false -> throw({not_enough_revisions, length(Revs), NeedKeys}) end. + +-endif. diff --git a/src/mem3/rebar.config.script b/src/mem3/rebar.config.script new file mode 100644 index 0000000..8f2deb4 --- /dev/null +++ b/src/mem3/rebar.config.script @@ -0,0 +1,22 @@ +%% 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. + +WithProper = code:lib_dir(proper) /= {error, bad_name}. + +if not WithProper -> CONFIG; true -> + CurrOpts = case lists:keyfind(erl_opts, 1, CONFIG) of + {erl_opts, Opts} -> Opts; + false -> [] + end, + NewOpts = [{d, 'WITH_PROPER'} | CurrOpts], + lists:keystore(erl_opts, 1, CONFIG, {erl_opts, NewOpts}) +end. diff --git a/src/mem3/test/eunit/mem3_ring_prop_tests.erl b/src/mem3/test/eunit/mem3_ring_prop_tests.erl index 9f4f86f..51d8f10 100644 --- a/src/mem3/test/eunit/mem3_ring_prop_tests.erl +++ b/src/mem3/test/eunit/mem3_ring_prop_tests.erl @@ -13,8 +13,13 @@ -module(mem3_ring_prop_tests). --include_lib("triq/include/triq.hrl"). --triq(eunit). +-ifdef(WITH_PROPER). + +-include_lib("couch/include/couch_eunit_proper.hrl"). + + +property_test_() -> + ?EUNIT_QUICKCHECK(60). % Properties @@ -97,7 +102,7 @@ g_disconnected_intervals(Begin, End) -> g_disconnected_intervals(Begin, End, Split) when Begin =< End -> ?LET(Connected, g_non_trivial_connected_intervals(Begin, End, Split), begin - I = triq_rnd:uniform(length(Connected)) - 1, + I = rand:uniform(length(Connected)) - 1, {Before, [_ | After]} = lists:split(I, Connected), Before ++ After end). @@ -131,14 +136,16 @@ rand_range(B, B) -> B; rand_range(B, E) -> - B + triq_rnd:uniform(E - B). + B + rand:uniform(E - B). shuffle(L) -> - Tagged = [{triq_rnd:uniform(), X} || X <- L], + Tagged = [{rand:uniform(), X} || X <- L], [X || {_, X} <- lists:sort(Tagged)]. endpoints(Ranges) -> {Begins, Ends} = lists:unzip(Ranges), sets:from_list(Begins ++ Ends). + +-endif.
