| % 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. |
| |
| -module(couch_replicator_missing_stubs_tests). |
| |
| -include_lib("couch/include/couch_eunit.hrl"). |
| -include_lib("couch/include/couch_db.hrl"). |
| -include_lib("fabric/test/fabric2_test.hrl"). |
| |
| -define(REVS_LIMIT, 3). |
| |
| missing_stubs_test_() -> |
| { |
| "Replicate docs with missing stubs (COUCHDB-1365)", |
| { |
| 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) |
| ] |
| } |
| } |
| }. |
| |
| 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) -> |
| AttData = crypto:strong_rand_bytes(6000), |
| Doc = #doc{ |
| id = <<"doc1">>, |
| atts = [ |
| couch_att:new([ |
| {name, <<"doc1_att1">>}, |
| {type, <<"application/foobar">>}, |
| {att_len, byte_size(AttData)}, |
| {data, AttData} |
| ]) |
| ] |
| }, |
| couch_replicator_test_helper:create_docs(DbName, [Doc]). |
| |
| update_db_docs(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). |