diff options
author | Nick Vatamaniuc <vatamane@apache.org> | 2020-03-21 19:31:28 -0400 |
---|---|---|
committer | Nick Vatamaniuc <nickva@users.noreply.github.com> | 2020-03-21 19:47:04 -0400 |
commit | a008c6d0b5da269d519bd2a6ef3aa6e9aa22abc2 (patch) | |
tree | 94f7dd64c9caf997afaca020c63439bad45b7c8c | |
parent | e520294c7ee3f55c3e8cc7d528ff37a5a93c800f (diff) | |
download | couchdb-a008c6d0b5da269d519bd2a6ef3aa6e9aa22abc2.tar.gz |
Add a fabric doc fold test when db is re-created
Check that on a transaction restarts `database_does_not_exist` error is
thrown properly if database was re-created.
Also we forgot to properly unload the mocked erlfdb module in
`tx_too_old_mock_erlfdb/0` so we make sure to do that, otherwise it
has a chance of messing up subsequent tests.
-rw-r--r-- | src/fabric/test/fabric2_doc_fold_tests.erl | 33 |
1 files changed, 32 insertions, 1 deletions
diff --git a/src/fabric/test/fabric2_doc_fold_tests.erl b/src/fabric/test/fabric2_doc_fold_tests.erl index 7c95dd372..0695b450b 100644 --- a/src/fabric/test/fabric2_doc_fold_tests.erl +++ b/src/fabric/test/fabric2_doc_fold_tests.erl @@ -43,7 +43,8 @@ doc_fold_test_() -> ?TDEF_FE(fold_docs_with_limit), ?TDEF_FE(fold_docs_with_skip), ?TDEF_FE(fold_docs_with_skip_and_limit), - ?TDEF_FE(fold_docs_tx_too_old) + ?TDEF_FE(fold_docs_tx_too_old), + ?TDEF_FE(fold_docs_db_recreated) ] } } @@ -69,12 +70,14 @@ setup() -> {ok, Rev} = fabric2_db:update_doc(Db, Doc, []), {DocId, {[{rev, couch_doc:rev_to_str(Rev)}]}} end, lists:seq(1, ?DOC_COUNT)), + meck:new(erlfdb, [passthrough]), fabric2_test_util:tx_too_old_mock_erlfdb(), {Db, lists:sort(DocIdRevs)}. cleanup({Db, _DocIdRevs}) -> fabric2_test_util:tx_too_old_reset_errors(), + meck:unload(), ok = fabric2_db:delete(fabric2_db:name(Db), []). @@ -216,6 +219,34 @@ fold_docs_tx_too_old({Db, _DocIdRevs}) -> ?assertEqual({ok, Expected}, FoldDocsFun()). +fold_docs_db_recreated({Db, _DocIdRevs}) -> + DbName = fabric2_db:name(Db), + + RecreateDb = fun() -> + ok = fabric2_db:delete(DbName, []), + {ok, _} = fabric2_db:create(DbName, []) + end, + + FoldFun = fun + ({meta, _}, Acc) -> + {ok, Acc}; + ({row, Row}, Acc) -> + fabric2_test_util:tx_too_old_raise_in_user_fun(), + % After meta and one row emitted, recreate the db + case length(Acc) =:= 1 of + true -> RecreateDb(); + false -> ok + end, + {ok, [Row | Acc]}; + (complete, Acc) -> + {ok, Acc} + end, + % Blow up in user fun after emitting two rows + fabric2_test_util:tx_too_old_setup_errors({2, 1}, 0), + ?assertError(database_does_not_exist, fabric2_db:fold_docs(Db, FoldFun, + [], [{restart_tx, true}])). + + check_all_combos(Db, StartKey, EndKey, Rows) -> Opts1 = make_opts(fwd, StartKey, EndKey, true), {ok, {?DOC_COUNT, Rows1}} = |