You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by da...@apache.org on 2020/02/15 18:44:10 UTC

[couchdb] 05/05: Test coverage: apply_open_doc_opts

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

davisp pushed a commit to branch prototype/fdb-layer-test-coverage
in repository https://gitbox.apache.org/repos/asf/couchdb.git

commit 8c70669f631b57cd396db6aff5a3d382eec23b50
Author: Paul J. Davis <pa...@gmail.com>
AuthorDate: Fri Feb 14 14:48:48 2020 -0600

    Test coverage: apply_open_doc_opts
---
 src/fabric/test/fabric2_doc_crud_tests.erl | 99 +++++++++++++++++++++++++++++-
 1 file changed, 98 insertions(+), 1 deletion(-)

diff --git a/src/fabric/test/fabric2_doc_crud_tests.erl b/src/fabric/test/fabric2_doc_crud_tests.erl
index 46cd4fc..ce3757d 100644
--- a/src/fabric/test/fabric2_doc_crud_tests.erl
+++ b/src/fabric/test/fabric2_doc_crud_tests.erl
@@ -67,7 +67,8 @@ doc_crud_test_() ->
                 ?TDEF(create_a_large_local_doc),
                 ?TDEF(create_2_large_local_docs),
                 ?TDEF(local_doc_with_previous_encoding),
-                ?TDEF(before_doc_update_skips_local_docs)
+                ?TDEF(before_doc_update_skips_local_docs),
+                ?TDEF(open_doc_opts)
             ])
         }
     }.
@@ -911,3 +912,99 @@ before_doc_update_skips_local_docs({Db0, _}) ->
 
     ?assertEqual({[]}, LDoc2#doc.body),
     ?assertEqual({[<<"bdu_was_here">>, true]}, Doc2#doc.body).
+
+
+open_doc_opts({Db, _}) ->
+    % Build out state so that we can exercise each doc
+    % open option. This requires a live revision with
+    % an attachment, a conflict, and a deleted conflict.
+    DocId = couch_uuids:random(),
+    Att1 = couch_att:new([
+        {name, <<"foo.txt">>},
+        {type, <<"application/octet-stream">>},
+        {att_len, 6},
+        {data, <<"foobar">>},
+        {encoding, identity},
+        {md5, <<>>}
+    ]),
+    Doc1A = #doc{
+        id = DocId,
+        atts = [Att1]
+    },
+    {ok, {Pos1, Rev1A}} = fabric2_db:update_doc(Db, Doc1A),
+    Att2 = couch_att:store([
+            {data, stub},
+            {revpos, 1}
+        ], Att1),
+    Doc1B = Doc1A#doc{
+        revs = {Pos1, [Rev1A]},
+        atts = [Att2]
+    },
+    {ok, {Pos2, Rev1B}} = fabric2_db:update_doc(Db, Doc1B),
+
+    Rev2 = crypto:strong_rand_bytes(16),
+    Rev3 = crypto:strong_rand_bytes(16),
+    Rev4 = crypto:strong_rand_bytes(16),
+
+    % Create a live conflict
+    Doc2 = #doc{
+        id = DocId,
+        revs = {1, [Rev2]}
+    },
+    {ok, _} = fabric2_db:update_doc(Db, Doc2, [replicated_changes]),
+
+    % Create a deleted conflict
+    Doc3 = #doc{
+        id = DocId,
+        revs = {1, [Rev3]}
+    },
+    {ok, _} = fabric2_db:update_doc(Db, Doc3, [replicated_changes]),
+    Doc4 = #doc{
+        id = DocId,
+        revs = {2, [Rev4, Rev3]},
+        deleted = true
+    },
+    {ok, _} = fabric2_db:update_doc(Db, Doc4, [replicated_changes]),
+
+    OpenOpts1 = [
+        revs_info,
+        conflicts,
+        deleted_conflicts,
+        local_seq,
+        {atts_since, [{Pos1, Rev1A}]}
+    ],
+    {ok, OpenedDoc1} = fabric2_db:open_doc(Db, DocId, OpenOpts1),
+
+    #doc{
+        id = DocId,
+        revs = {2, [Rev1B, Rev1A]},
+        atts = [Att3],
+        meta = Meta
+    } = OpenedDoc1,
+    ?assertEqual(stub, couch_att:fetch(data, Att3)),
+    ?assertEqual(
+            {revs_info, Pos2, [{Rev1B, available}, {Rev1A, missing}]},
+            lists:keyfind(revs_info, 1, Meta)
+        ),
+    ?assertEqual(
+            {conflicts, [{1, Rev2}]},
+            lists:keyfind(conflicts, 1, Meta)
+        ),
+    ?assertEqual(
+            {deleted_conflicts, [{2, Rev4}]},
+            lists:keyfind(deleted_conflicts, 1, Meta)
+        ),
+    ?assertMatch({_, <<_/binary>>}, lists:keyfind(local_seq, 1, Meta)),
+
+    % Empty atts_since list
+    {ok, OpenedDoc2} = fabric2_db:open_doc(Db, DocId, [{atts_since, []}]),
+    #doc{atts = [Att4]} = OpenedDoc2,
+    ?assertNotEqual(stub, couch_att:fetch(data, Att4)),
+
+    % Missing ancestor
+    Rev5 = crypto:strong_rand_bytes(16),
+    OpenOpts2 = [{atts_since, [{5, Rev5}]}],
+    {ok, OpenedDoc3} = fabric2_db:open_doc(Db, DocId, OpenOpts2),
+    #doc{atts = [Att5]} = OpenedDoc3,
+    ?assertNotEqual(stub, couch_att:fetch(data, Att5)).
+