You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by va...@apache.org on 2020/01/21 15:27:50 UTC

[couchdb] branch remove-triq updated (ec6a1ff -> 2139356)

This is an automated email from the ASF dual-hosted git repository.

vatamane pushed a change to branch remove-triq
in repository https://gitbox.apache.org/repos/asf/couchdb.git.


 discard ec6a1ff  Replace Triq with PropEr
     new 2139356  Replace Triq with PropEr

This update added new revisions after undoing existing revisions.
That is to say, some revisions that were in the old version of the
branch are not in the new version.  This situation occurs
when a user --force pushes a change and generates a repository
containing something like this:

 * -- * -- B -- O -- O -- O   (ec6a1ff)
            \
             N -- N -- N   refs/heads/remove-triq (2139356)

You should already have received notification emails for all of the O
revisions, and so the following emails describe only the N revisions
from the common base, B.

Any revisions marked "omit" are not gone; other references still
refer to them.  Any revisions marked "discard" are gone forever.

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:


[couchdb] 01/01: Replace Triq with PropEr

Posted by va...@apache.org.
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 2139356c28e478ba238d931b77fd703af043b10b
Author: Nick Vatamaniuc <va...@apache.org>
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..6fdde69
--- /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.
\ No newline at end of file
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.