diff options
Diffstat (limited to 'src/couch_replicator/test/eunit/couch_replicator_missing_stubs_tests.erl')
-rw-r--r-- | src/couch_replicator/test/eunit/couch_replicator_missing_stubs_tests.erl | 179 |
1 files changed, 70 insertions, 109 deletions
diff --git a/src/couch_replicator/test/eunit/couch_replicator_missing_stubs_tests.erl b/src/couch_replicator/test/eunit/couch_replicator_missing_stubs_tests.erl index ff08b5ee5..e672c76b7 100644 --- a/src/couch_replicator/test/eunit/couch_replicator_missing_stubs_tests.erl +++ b/src/couch_replicator/test/eunit/couch_replicator_missing_stubs_tests.erl @@ -14,103 +14,59 @@ -include_lib("couch/include/couch_eunit.hrl"). -include_lib("couch/include/couch_db.hrl"). +-include_lib("fabric/test/fabric2_test.hrl"). --import(couch_replicator_test_helper, [ - db_url/1, - replicate/2, - compare_dbs/2 -]). -define(REVS_LIMIT, 3). --define(TIMEOUT_EUNIT, 30). -setup() -> - DbName = ?tempdb(), - {ok, Db} = couch_db:create(DbName, [?ADMIN_CTX]), - ok = couch_db:close(Db), - DbName. - -setup(remote) -> - {remote, setup()}; -setup({A, B}) -> - Ctx = test_util:start_couch([couch_replicator]), - Source = setup(A), - Target = setup(B), - {Ctx, {Source, Target}}. - -teardown({remote, DbName}) -> - teardown(DbName); -teardown(DbName) -> - ok = couch_server:delete(DbName, [?ADMIN_CTX]), - ok. - -teardown(_, {Ctx, {Source, Target}}) -> - teardown(Source), - teardown(Target), - ok = application:stop(couch_replicator), - ok = test_util:stop_couch(Ctx). missing_stubs_test_() -> - Pairs = [{remote, remote}], { "Replicate docs with missing stubs (COUCHDB-1365)", { - foreachx, - fun setup/1, fun teardown/2, - [{Pair, fun should_replicate_docs_with_missed_att_stubs/2} - || Pair <- Pairs] + setup, + fun couch_replicator_test_helper:start_couch/0, + fun couch_replicator_test_helper:stop_couch/1, + { + foreach, + fun setup/0, + fun teardown/1, + [ + ?TDEF_FE(should_replicate_docs_with_missed_att_stubs, 60) + ] + } } }. -should_replicate_docs_with_missed_att_stubs({From, To}, {_Ctx, {Source, Target}}) -> - {lists:flatten(io_lib:format("~p -> ~p", [From, To])), - {inorder, [ - should_populate_source(Source), - should_set_target_revs_limit(Target, ?REVS_LIMIT), - should_replicate(Source, Target), - should_compare_databases(Source, Target), - should_update_source_docs(Source, ?REVS_LIMIT * 2), - should_replicate(Source, Target), - should_compare_databases(Source, Target) - ]}}. - -should_populate_source({remote, Source}) -> - should_populate_source(Source); -should_populate_source(Source) -> - {timeout, ?TIMEOUT_EUNIT, ?_test(populate_db(Source))}. - -should_replicate({remote, Source}, Target) -> - should_replicate(db_url(Source), Target); -should_replicate(Source, {remote, Target}) -> - should_replicate(Source, db_url(Target)); -should_replicate(Source, Target) -> - {timeout, ?TIMEOUT_EUNIT, ?_test(replicate(Source, Target))}. - -should_set_target_revs_limit({remote, Target}, RevsLimit) -> - should_set_target_revs_limit(Target, RevsLimit); -should_set_target_revs_limit(Target, RevsLimit) -> - ?_test(begin - {ok, Db} = couch_db:open_int(Target, [?ADMIN_CTX]), - ?assertEqual(ok, couch_db:set_revs_limit(Db, RevsLimit)), - ok = couch_db:close(Db) - end). - -should_compare_databases({remote, Source}, Target) -> - should_compare_databases(Source, Target); -should_compare_databases(Source, {remote, Target}) -> - should_compare_databases(Source, Target); -should_compare_databases(Source, Target) -> - {timeout, ?TIMEOUT_EUNIT, ?_test(compare_dbs(Source, Target))}. - -should_update_source_docs({remote, Source}, Times) -> - should_update_source_docs(Source, Times); -should_update_source_docs(Source, Times) -> - {timeout, ?TIMEOUT_EUNIT, ?_test(update_db_docs(Source, Times))}. +setup() -> + Source = couch_replicator_test_helper:create_db(), + populate_db(Source), + Target = couch_replicator_test_helper:create_db(), + {Source, Target}. + + +teardown({Source, Target}) -> + couch_replicator_test_helper:delete_db(Source), + couch_replicator_test_helper:delete_db(Target). + + +should_replicate_docs_with_missed_att_stubs({Source, Target}) -> + {ok, TargetDb} = fabric2_db:open(Target, [?ADMIN_CTX]), + ?assertEqual(ok, fabric2_db:set_revs_limit(TargetDb, ?REVS_LIMIT)), + + ?assertMatch({ok, _}, + couch_replicator_test_helper:replicate(Source, Target)), + ?assertEqual(ok, couch_replicator_test_helper:compare_dbs(Source, Target)), + + ok = update_db_docs(Source, ?REVS_LIMIT * 2), + + ?assertMatch({ok, _}, + couch_replicator_test_helper:replicate(Source, Target)), + ?assertEqual(ok, couch_replicator_test_helper:compare_dbs(Source, Target)). populate_db(DbName) -> - {ok, Db} = couch_db:open_int(DbName, []), AttData = crypto:strong_rand_bytes(6000), Doc = #doc{ id = <<"doc1">>, @@ -120,35 +76,40 @@ populate_db(DbName) -> {type, <<"application/foobar">>}, {att_len, byte_size(AttData)}, {data, AttData} - ]) + ]) ] }, - {ok, _} = couch_db:update_doc(Db, Doc, []), - couch_db:close(Db). + couch_replicator_test_helper:create_docs(DbName, [Doc]). + update_db_docs(DbName, Times) -> - {ok, Db} = couch_db:open_int(DbName, []), - {ok, _} = couch_db:fold_docs( - Db, - fun(FDI, Acc) -> db_fold_fun(FDI, Acc) end, - {DbName, Times}, - []), - ok = couch_db:close(Db). - -db_fold_fun(FullDocInfo, {DbName, Times}) -> - {ok, Db} = couch_db:open_int(DbName, []), - {ok, Doc} = couch_db:open_doc(Db, FullDocInfo), - lists:foldl( - fun(_, {Pos, RevId}) -> - {ok, Db2} = couch_db:reopen(Db), - NewDocVersion = Doc#doc{ - revs = {Pos, [RevId]}, - body = {[{<<"value">>, base64:encode(crypto:strong_rand_bytes(100))}]} - }, - {ok, NewRev} = couch_db:update_doc(Db2, NewDocVersion, []), - NewRev - end, - {element(1, Doc#doc.revs), hd(element(2, Doc#doc.revs))}, - lists:seq(1, Times)), - ok = couch_db:close(Db), - {ok, {DbName, Times}}. + {ok, Db} = fabric2_db:open(DbName, [?ADMIN_CTX]), + FoldFun = fun + ({meta, _Meta}, Acc) -> + {ok, Acc}; + (complete, Acc) -> + {ok, Acc}; + ({row, Row}, Acc) -> + {_, DocId} = lists:keyfind(id, 1, Row), + ok = update_doc(DbName, DocId, Times), + {ok, Acc} + end, + Opts = [{restart_tx, true}], + {ok, _} = fabric2_db:fold_docs(Db, FoldFun, ok, Opts), + ok. + + +update_doc(_DbName, _DocId, 0) -> + ok; + +update_doc(DbName, DocId, Times) -> + {ok, Db} = fabric2_db:open(DbName, [?ADMIN_CTX]), + {ok, Doc} = fabric2_db:open_doc(Db, DocId, []), + #doc{revs = {Pos, [Rev | _]}} = Doc, + Val = base64:encode(crypto:strong_rand_bytes(100)), + Doc1 = Doc#doc{ + revs = {Pos, [Rev]}, + body = {[{<<"value">>, Val}]} + }, + {ok, _} = fabric2_db:update_doc(Db, Doc1), + update_doc(DbName, DocId, Times - 1). |