From 7d139047706621e21cb73ffc2dc238be8f03db48 Mon Sep 17 00:00:00 2001 From: Filipe David Borba Manana Date: Mon, 31 Jan 2011 00:44:50 +0000 Subject: Merge revision 1065448 from trunk Added test swap_rep_db to test case replicator_db.js The purpose of this test is to verify that replications are stopped and restarted when the replicator database is dynamically changed. git-svn-id: https://svn.apache.org/repos/asf/couchdb/branches/1.1.x@1065449 13f79535-47bb-0310-9956-ffa450edef68 --- share/www/script/test/replicator_db.js | 111 +++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) (limited to 'share') diff --git a/share/www/script/test/replicator_db.js b/share/www/script/test/replicator_db.js index 277787b9..642de3cc 100644 --- a/share/www/script/test/replicator_db.js +++ b/share/www/script/test/replicator_db.js @@ -727,6 +727,113 @@ couchTests.replicator_db = function(debug) { } + function swap_rep_db() { + var repDb2 = new CouchDB("test_suite_rep_db_2"); + var dbA = new CouchDB("test_suite_rep_db_a"); + var dbA_copy = new CouchDB("test_suite_rep_db_a_copy"); + var dbB = new CouchDB("test_suite_rep_db_b"); + var dbB_copy = new CouchDB("test_suite_rep_db_b_copy"); + var dbC = new CouchDB("test_suite_rep_db_c"); + var dbC_copy = new CouchDB("test_suite_rep_db_c_copy"); + var repDoc1, repDoc2, repDoc3; + var xhr, i, doc, copy, new_doc; + + populate_db(dbA, docs1); + populate_db(dbB, docs1); + populate_db(dbC, docs1); + populate_db(dbA_copy, []); + populate_db(dbB_copy, []); + populate_db(dbC_copy, []); + populate_db(repDb2, []); + + repDoc1 = { + _id: "rep1", + source: CouchDB.protocol + host + "/" + dbA.name, + target: dbA_copy.name, + continuous: true + }; + repDoc2 = { + _id: "rep2", + source: CouchDB.protocol + host + "/" + dbB.name, + target: dbB_copy.name, + continuous: true + }; + repDoc3 = { + _id: "rep3", + source: CouchDB.protocol + host + "/" + dbC.name, + target: dbC_copy.name, + continuous: true + }; + + TEquals(true, repDb.save(repDoc1).ok); + TEquals(true, repDb.save(repDoc2).ok); + + waitForSeq(dbA, dbA_copy); + waitForSeq(dbB, dbB_copy); + + xhr = CouchDB.request("PUT", "/_config/replicator/db",{ + body : JSON.stringify(repDb2.name), + headers: {"X-Couch-Persist": "false"} + }); + TEquals(200, xhr.status); + + new_doc = { + _id: "foo666", + value: 666 + }; + + TEquals(true, dbA.save(new_doc).ok); + TEquals(true, dbB.save(new_doc).ok); + wait(1000); + + TEquals(true, repDb2.save(repDoc3).ok); + waitForSeq(dbC, dbC_copy); + + for (i = 0; i < docs1.length; i++) { + doc = docs1[i]; + copy = dbA_copy.open(doc._id); + T(copy !== null); + TEquals(doc.value, copy.value); + copy = dbB_copy.open(doc._id); + T(copy !== null); + TEquals(doc.value, copy.value); + copy = dbC_copy.open(doc._id); + T(copy !== null); + TEquals(doc.value, copy.value); + } + + // replications rep1 and rep2 should have been stopped when the replicator + // database was swapped + copy = dbA_copy.open(new_doc._id); + TEquals(null, copy); + copy = dbB_copy.open(new_doc._id); + TEquals(null, copy); + + xhr = CouchDB.request("PUT", "/_config/replicator/db",{ + body : JSON.stringify(repDb.name), + headers: {"X-Couch-Persist": "false"} + }); + TEquals(200, xhr.status); + + // after setting the replicator database to the former, replications rep1 + // and rep2 should have been resumed, while rep3 was stopped + TEquals(true, dbC.save(new_doc).ok); + wait(1000); + + waitForSeq(dbA, dbA_copy); + waitForSeq(dbB, dbB_copy); + + copy = dbA_copy.open(new_doc._id); + T(copy !== null); + TEquals(new_doc.value, copy.value); + copy = dbB_copy.open(new_doc._id); + T(copy !== null); + TEquals(new_doc.value, copy.value); + copy = dbC_copy.open(new_doc._id); + TEquals(null, copy); + } + + function error_state_replication() { populate_db(dbA, docs1); @@ -805,6 +912,10 @@ couchTests.replicator_db = function(debug) { restartServer(); continuous_replication_survives_restart(); + repDb.deleteDb(); + restartServer(); + run_on_modified_server(server_config, swap_rep_db); + /* * Disabled, since error state would be set on the document only after * the exponential backoff retry done by the replicator database listener -- cgit v1.2.3