http://git-wip-us.apache.org/repos/asf/couchdb/blob/6a4893aa/share/www/script/test/replicator_db_identical_continuous.js ---------------------------------------------------------------------- diff --git a/share/www/script/test/replicator_db_identical_continuous.js b/share/www/script/test/replicator_db_identical_continuous.js deleted file mode 100644 index 240c531..0000000 --- a/share/www/script/test/replicator_db_identical_continuous.js +++ /dev/null @@ -1,139 +0,0 @@ -// 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. - -couchTests.replicator_db_identical_continuous = function(debug) { - - if (debug) debugger; - - var populate_db = replicator_db.populate_db; - var docs1 = replicator_db.docs1; - var dbA = replicator_db.dbA; - var dbB = replicator_db.dbB; - var repDb = replicator_db.repDb; - var wait = replicator_db.wait; - var waitForRep = replicator_db.waitForRep; - var waitForSeq = replicator_db.waitForSeq; - var wait_rep_doc = replicator_db.wait_rep_doc; - - // test the case where multiple replication docs (different IDs) - // describe in fact the same continuous replication (source, target, etc) - function identical_continuous_rep_docs() { - populate_db(dbA, docs1); - populate_db(dbB, []); - - var repDoc1 = { - _id: "foo_dup_cont_rep_doc_1", - source: "http://" + CouchDB.host + "/" + dbA.name, - target: dbB.name, - continuous: true - }; - var repDoc2 = { - _id: "foo_dup_cont_rep_doc_2", - source: "http://" + CouchDB.host + "/" + dbA.name, - target: dbB.name, - continuous: true - }; - - T(repDb.save(repDoc1).ok); - T(repDb.save(repDoc2).ok); - - waitForSeq(dbA, dbB); - for (var i = 0; i < docs1.length; i++) { - var doc = docs1[i]; - var copy = dbB.open(doc._id); - T(copy !== null); - T(copy.value === doc.value); - } - - // Rather than a timeout we're just waiting to hear the - // fourth change to the database. Changes 1 and 2 were - // us storing repDoc1 and repDoc2. Changes 3 and 4 are - // the replicator manager updating each document. This - // just waits until the fourth change before continuing. - repDb.changes({"feed":"longpoll", "since":3}); - - repDoc1 = repDb.open("foo_dup_cont_rep_doc_1"); - T(repDoc1 !== null); - T(repDoc1._replication_state === "triggered"); - T(typeof repDoc1._replication_state_time === "string"); - T(typeof repDoc1._replication_id === "string"); - - repDoc2 = repDb.open("foo_dup_cont_rep_doc_2"); - T(repDoc2 !== null); - T(typeof repDoc2._replication_state === "undefined"); - T(typeof repDoc2._replication_state_time === "undefined"); - T(repDoc2._replication_id === repDoc1._replication_id); - - var newDoc = { - _id: "foo666", - value: 999 - }; - T(dbA.save(newDoc).ok); - - waitForSeq(dbA, dbB); - var copy = dbB.open("foo666"); - T(copy !== null); - T(copy.value === 999); - - // deleting second replication doc, doesn't affect the 1st one and - // neither it stops the replication - T(repDb.deleteDoc(repDoc2).ok); - repDoc1 = repDb.open("foo_dup_cont_rep_doc_1"); - T(repDoc1 !== null); - T(repDoc1._replication_state === "triggered"); - T(typeof repDoc1._replication_state_time === "string"); - - var newDoc2 = { - _id: "foo5000", - value: 5000 - }; - T(dbA.save(newDoc2).ok); - - waitForSeq(dbA, dbB); - var copy = dbB.open("foo5000"); - T(copy !== null); - T(copy.value === 5000); - - // deleting the 1st replication document stops the replication - T(repDb.deleteDoc(repDoc1).ok); - var newDoc3 = { - _id: "foo1983", - value: 1983 - }; - T(dbA.save(newDoc3).ok); - - wait(wait_rep_doc); //how to remove wait? - var copy = dbB.open("foo1983"); - T(copy === null); - } - - var server_config = [ - { - section: "couch_httpd_auth", - key: "iterations", - value: "1" - }, - { - section: "replicator", - key: "db", - value: repDb.name - } - ]; - - repDb.deleteDb(); - run_on_modified_server(server_config, identical_continuous_rep_docs); - - // cleanup - repDb.deleteDb(); - dbA.deleteDb(); - dbB.deleteDb(); -} \ No newline at end of file
http://git-wip-us.apache.org/repos/asf/couchdb/blob/6a4893aa/share/www/script/test/replicator_db_invalid_filter.js ---------------------------------------------------------------------- diff --git a/share/www/script/test/replicator_db_invalid_filter.js b/share/www/script/test/replicator_db_invalid_filter.js deleted file mode 100644 index 7b6df82..0000000 --- a/share/www/script/test/replicator_db_invalid_filter.js +++ /dev/null @@ -1,119 +0,0 @@ -// 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. - -couchTests.replicator_db_invalid_filter = function(debug) { - - if (debug) debugger; - - var populate_db = replicator_db.populate_db; - var docs1 = replicator_db.docs1; - var dbA = replicator_db.dbA; - var dbB = replicator_db.dbB; - var repDb = replicator_db.repDb; - var usersDb = replicator_db.usersDb; - var wait = replicator_db.wait; - var waitForRep = replicator_db.waitForRep; - var waitForSeq = replicator_db.waitForSeq; - var wait_rep_doc = replicator_db.wait_rep_doc; - - function test_invalid_filter() { - // COUCHDB-1199 - replication document with a filter field that was invalid - // crashed the CouchDB server. - var repDoc1 = { - _id: "rep1", - source: "couch_foo_test_db", - target: "couch_bar_test_db", - filter: "test/foofilter" - }; - - TEquals(true, repDb.save(repDoc1).ok); - - waitForRep(repDb, repDoc1, "error"); - repDoc1 = repDb.open(repDoc1._id); - TEquals("undefined", typeof repDoc1._replication_id); - TEquals("error", repDoc1._replication_state); - TEquals("Could not open source database `couch_foo_test_db`: {db_not_found,<<\"couch_foo_test_db\">>}", - repDoc1._replication_state_reason); - - populate_db(dbA, docs1); - populate_db(dbB, []); - - var repDoc2 = { - _id: "rep2", - source: dbA.name, - target: dbB.name, - filter: "test/foofilter" - }; - - TEquals(true, repDb.save(repDoc2).ok); - - waitForRep(repDb, repDoc2, "error"); - repDoc2 = repDb.open(repDoc2._id); - TEquals("undefined", typeof repDoc2._replication_id); - TEquals("error", repDoc2._replication_state); - TEquals("Couldn't open document `_design/test` from source database `test_suite_rep_db_a`: {error,<<\"not_found\">>}", - repDoc2._replication_state_reason); - - var ddoc = { - _id: "_design/mydesign", - language : "javascript", - filters : { - myfilter : (function(doc, req) { - return true; - }).toString() - } - }; - - TEquals(true, dbA.save(ddoc).ok); - - var repDoc3 = { - _id: "rep3", - source: dbA.name, - target: dbB.name, - filter: "mydesign/myfilter" - }; - - TEquals(true, repDb.save(repDoc3).ok); - - waitForRep(repDb, repDoc3, "completed"); - repDoc3 = repDb.open(repDoc3._id); - TEquals("string", typeof repDoc3._replication_id); - TEquals("completed", repDoc3._replication_state); - } - - var server_config = [ - { - section: "couch_httpd_auth", - key: "iterations", - value: "1" - }, - { - section: "replicator", - key: "db", - value: repDb.name - }, - { - section: "couch_httpd_auth", - key: "authentication_db", - value: usersDb.name - } - ]; - - repDb.deleteDb(); - run_on_modified_server(server_config, test_invalid_filter); - - // cleanup - repDb.deleteDb(); - dbA.deleteDb(); - dbB.deleteDb(); - usersDb.deleteDb(); -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/couchdb/blob/6a4893aa/share/www/script/test/replicator_db_security.js ---------------------------------------------------------------------- diff --git a/share/www/script/test/replicator_db_security.js b/share/www/script/test/replicator_db_security.js deleted file mode 100644 index 7a2bfd1..0000000 --- a/share/www/script/test/replicator_db_security.js +++ /dev/null @@ -1,399 +0,0 @@ -// 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. - -couchTests.replicator_db_security = function(debug) { - - var reset_dbs = function(dbs) { - dbs.forEach(function(db) { - db.deleteDb(); - try { db.createDb() } catch (e) {}; - }); - }; - - var dbs = ["couch_test_rep_db", "couch_test_users_db", - "test_suite_db_a", "test_suite_db_b", "test_suite_db_c"] - .map(function(db_name) { - return new CouchDB(db_name, {"X-Couch-Full-Commit":"false"}); - }); - - var repDb = dbs[0]; - var usersDb = dbs[1]; - var dbA = dbs[2]; - var dbB = dbs[3]; - var dbC = dbs[4]; - - if (debug) debugger; - - var loginUser = function(username) { - var pws = { - jan: "apple", - jchris: "mp3", - fdmanana: "foobar", - benoitc: "test" - }; - T(CouchDB.login(username, pws[username]).ok); - }; - - var repChanges = function(username) { - var pws = { - jan: "apple", - jchris: "mp3", - fdmanana: "foobar", - benoitc: "test" - }; - T(CouchDB.login(username, pws[username]).ok); - var changes = CouchDB.request( - "GET", - "/" + repDb.name + "/_changes?include_docs=true" + - "&anti-cache=" + String(Math.round(Math.random() * 100000))); - return changes = JSON.parse(changes.responseText); - }; - - var save_as = function(db, doc, username) - { - loginUser(username); - try { - return db.save(doc); - } catch (ex) { - return ex; - } finally { - CouchDB.logout(); - } - }; - - var open_as = function(db, docId, username) { - loginUser(username); - try { - return db.open(docId); - } finally { - CouchDB.logout(); - } - }; - - // from test replicator_db.js - function waitForDocPos(db, docId, pos) { - var doc, curPos, t0, t1, - maxWait = 3000; - - doc = db.open(docId); - curPos = Number(doc._rev.split("-", 1)); - t0 = t1 = new Date(); - - while ((curPos < pos) && ((t1 - t0) <= maxWait)) { - doc = db.open(docId); - curPos = Number(doc._rev.split("-", 1)); - t1 = new Date(); - } - - return doc; - } - - var testFun = function() - { - reset_dbs(dbs); - - // _replicator db - // in admin party mode, anonymous should be able to create a replication - var repDoc = { - _id: "null-owner-rep", - source: dbA.name, - target: dbB.name - }; - var result = repDb.save(repDoc); - TEquals(true, result.ok, "should allow anonymous replication docs in admin party"); - // new docs should get an owner field enforced. In admin party mode owner is null - repDoc = repDb.open(repDoc._id); - TIsnull(repDoc.owner, "owner should be null in admin party"); - -// Uncomment when _users database security changes are implemented. -// -// var jchrisDoc = { -// _id: "org.couchdb.user:jchris", -// type: "user", -// name: "jchris", -// password: "mp3", -// roles: [] -// }; - var jchrisDoc = CouchDB.prepareUserDoc({ - name: "jchris", - roles: [] - }, "mp3"); - usersDb.save(jchrisDoc); // set up a non-admin user - -// Uncomment when _users database security changes are implemented. -// -// var jchrisDoc = { -// _id: "org.couchdb.user:fdmanana", -// type: "user", -// name: "fdmanana", -// password: "foobar", -// roles: [] -// }; - var fdmananaDoc = CouchDB.prepareUserDoc({ - name: "fdmanana", - roles: [] - }, "foobar"); - usersDb.save(fdmananaDoc); // set up a non-admin user - -// Uncomment when _users database security changes are implemented. -// -// var benoitcDoc = { -// _id: "org.couchdb.user:fdmanana", -// type: "user", -// name: "fdmanana", -// password: "foobar", -// roles: [] -// }; - var benoitcDoc = CouchDB.prepareUserDoc({ - name: "benoitc", - roles: [] - }, "test"); - usersDb.save(benoitcDoc); // set up a non-admin user - - T(repDb.setSecObj({ - "admins" : { - roles : [], - names : ["benoitc"] - } - }).ok); - - run_on_modified_server([ - { - section: "admins", - key: "jan", - value: "apple" - } - ], function() { - // replication docs from admin-party mode in non-admin party mode can not - // be edited by non-admins (non-server admins) - repDoc = repDb.open(repDoc._id); - repDoc.target = dbC.name; - var result = save_as(repDb, repDoc, "jchris"); - TEquals("forbidden", result.error, "should forbid editing null-owner docs"); - - // replication docs from admin-party mode in non-admin party mode can only - // be edited by admins (server admins) - repDoc = waitForDocPos(repDb, repDoc._id, 3); - repDoc.target = dbC.name; - var result = save_as(repDb, repDoc, "jan"); - repDoc = open_as(repDb, repDoc._id, "jchris"); - TEquals(true, result.ok, "should allow editing null-owner docs to admins"); - TEquals("jan", repDoc.owner, "owner should be the admin now"); - - // user can update their own replication docs (repDoc.owner) - var jchrisRepDoc = { - _id: "jchris-rep-doc", - source: dbC.name, - target: dbA.name, - user_ctx: { name: "jchris", roles: [] } - }; - - var result = save_as(repDb, jchrisRepDoc, "jchris"); - TEquals(true, result.ok, "should create rep doc"); - jchrisRepDoc = repDb.open(jchrisRepDoc._id); - TEquals("jchris", jchrisRepDoc.owner, "should assign correct owner"); - jchrisRepDoc = waitForDocPos(repDb, jchrisRepDoc._id, 3); - jchrisRepDoc = open_as(repDb, jchrisRepDoc._id, "jchris"); - jchrisRepDoc.target = dbB.name; - var result = save_as(repDb, jchrisRepDoc, "jchris"); - TEquals(true, result.ok, "should allow update of rep doc"); - - // user should not be able to read from any view - var ddoc = { - _id: "_design/reps", - views: { - test: { - map: "function(doc) {" + - "if (doc._replication_state) { " + - "emit(doc._id, doc._replication_state);" + - "}" + - "}" - } - } - }; - - save_as(repDb, ddoc, "jan"); - - try { - repDb.view("reps/test"); - T(false, "non-admin had view read access"); - } catch (ex) { - TEquals("forbidden", ex.error, - "non-admins should not be able to read a view"); - } - - // admin should be able to read from any view - TEquals(true, CouchDB.login("jan", "apple").ok); - var result = repDb.view("reps/test"); - CouchDB.logout(); - TEquals(2, result.total_rows, "should allow access and list two users"); - - // test _all_docs, only available for _admins - try { - repDb.allDocs({include_docs: true}); - T(false, "non-admin had _all_docs access"); - } catch (ex) { - TEquals("forbidden", ex.error, - "non-admins should not be able to access _all_docs"); - } - - TEquals(true, CouchDB.login("jan", "apple").ok); - try { - repDb.allDocs({include_docs: true}); - } catch (ex) { - T(false, "admin couldn't access _all_docs"); - } - CouchDB.logout(); - - try { - repDb.view("reps/test"); - T(false, "non-admin had view read access"); - } catch (ex) { - TEquals("forbidden", ex.error, - "non-admins should not be able to read a view"); - } - - // admin should be able to read from any view - TEquals(true, CouchDB.login("benoitc", "test").ok); - var result = repDb.view("reps/test"); - CouchDB.logout(); - TEquals(2, result.total_rows, "should allow access and list two users"); - - // test _all_docs, only available for _admins - try { - repDb.allDocs({include_docs: true}); - T(false, "non-admin had _all_docs access"); - } catch (ex) { - TEquals("forbidden", ex.error, - "non-admins should not be able to access _all_docs"); - } - - TEquals(true, CouchDB.login("benoitc", "test").ok); - try { - repDb.allDocs({include_docs: true}); - } catch (ex) { - T(false, "admin couldn't access _all_docs"); - } - CouchDB.logout(); - - // Verify that users can't access credentials in the "source" and - // "target" fields of replication documents owned by other users. - var fdmananaRepDoc = { - _id: "fdmanana-rep-doc", - source: "http://fdmanana:foobar@" + CouchDB.host + "/" + dbC.name, - target: dbA.name, - user_ctx: { name: "fdmanana", roles: [] } - }; - - var result = save_as(repDb, fdmananaRepDoc, "fdmanana"); - TEquals(true, result.ok, "should create rep doc"); - waitForDocPos(repDb, fdmananaRepDoc._id, 3); - fdmananaRepDoc = open_as(repDb, fdmananaRepDoc._id, "fdmanana"); - TEquals("fdmanana", fdmananaRepDoc.owner, "should assign correct owner"); - TEquals("http://fdmanana:foobar@" + CouchDB.host + "/" + dbC.name, - fdmananaRepDoc.source, "source field has credentials"); - - fdmananaRepDoc = open_as(repDb, fdmananaRepDoc._id, "jchris"); - TEquals("fdmanana", fdmananaRepDoc.owner, "should assign correct owner"); - TEquals("http://" + CouchDB.host + "/" + dbC.name, - fdmananaRepDoc.source, "source field doesn't contain credentials"); - - // _changes?include_docs=true, users shouldn't be able to see credentials - // in documents owned by other users. - var changes = repChanges("jchris"); - var doc = changes.results[changes.results.length - 1].doc; - TEquals(fdmananaRepDoc._id, doc._id, "Got the right doc from _changes"); - TEquals("http://" + CouchDB.host + "/" + dbC.name, - doc.source, "source field doesn't contain credentials (doc from _changes)"); - CouchDB.logout(); - - // _changes?include_docs=true, user should be able to see credentials - // in documents they own. - var changes = repChanges("fdmanana"); - var doc = changes.results[changes.results.length - 1].doc; - TEquals(fdmananaRepDoc._id, doc._id, "Got the right doc from _changes"); - TEquals("http://fdmanana:foobar@" + CouchDB.host + "/" + dbC.name, - doc.source, "source field contains credentials (doc from _changes)"); - CouchDB.logout(); - - // _changes?include_docs=true, admins should be able to see credentials - // from all documents. - var changes = repChanges("jan"); - var doc = changes.results[changes.results.length - 1].doc; - TEquals(fdmananaRepDoc._id, doc._id, "Got the right doc from _changes"); - TEquals("http://fdmanana:foobar@" + CouchDB.host + "/" + dbC.name, - doc.source, "source field contains credentials (doc from _changes)"); - CouchDB.logout(); - - // _changes?include_docs=true, db admins should be able to see credentials - // from all documents. - var changes = repChanges("benoitc"); - var doc = changes.results[changes.results.length - 1].doc; - TEquals(fdmananaRepDoc._id, doc._id, "Got the right doc from _changes"); - TEquals("http://fdmanana:foobar@" + CouchDB.host + "/" + dbC.name, - doc.source, "source field contains credentials (doc from _changes)"); - CouchDB.logout(); - - var fdmananaRepDocOAuth = { - _id: "fdmanana-rep-doc-oauth", - source: dbC.name, - target: { - url: "http://" + CouchDB.host + "/" + dbA.name, - oauth: { - token: "abc", - token_secret: "foo", - consumer_key: "123", - consumer_secret: "321" - } - }, - user_ctx: { name: "fdmanana", roles: [] } - }; - - var result = save_as(repDb, fdmananaRepDocOAuth, "fdmanana"); - TEquals(true, result.ok, "should create rep doc"); - waitForDocPos(repDb, fdmananaRepDocOAuth._id, 3); - fdmananaRepDocOAuth = open_as(repDb, fdmananaRepDocOAuth._id, "fdmanana"); - TEquals("fdmanana", fdmananaRepDocOAuth.owner, "should assign correct owner"); - TEquals("object", typeof fdmananaRepDocOAuth.target.oauth, - "target field has oauth credentials"); - - fdmananaRepDocOAuth = open_as(repDb, fdmananaRepDocOAuth._id, "jchris"); - TEquals("fdmanana", fdmananaRepDocOAuth.owner, "should assign correct owner"); - TEquals("undefined", typeof fdmananaRepDocOAuth.target.oauth, - "target field doesn't have oauth credentials"); - - // ensure "old" replicator docs still work - // done in replicator_db.js? - - // Login as admin so run_on_modified_server can do its cleanup. - TEquals(true, CouchDB.login("jan", "apple").ok); - }); - }; - - run_on_modified_server([ - { - section: "couch_httpd_auth", - key: "authentication_db", - value: usersDb.name - }, - { - section: "replicator", - key: "db", - value: repDb.name - }], - testFun - ); - - // cleanup - usersDb.deleteDb(); - repDb.deleteDb(); -}; http://git-wip-us.apache.org/repos/asf/couchdb/blob/6a4893aa/share/www/script/test/replicator_db_simple.js ---------------------------------------------------------------------- diff --git a/share/www/script/test/replicator_db_simple.js b/share/www/script/test/replicator_db_simple.js deleted file mode 100644 index f7acedb..0000000 --- a/share/www/script/test/replicator_db_simple.js +++ /dev/null @@ -1,114 +0,0 @@ -// 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. - -couchTests.replicator_db_simple = function(debug) { - - if (debug) debugger; - - var populate_db = replicator_db.populate_db; - var docs1 = replicator_db.docs1; - var dbA = replicator_db.dbA; - var dbB = replicator_db.dbB; - var repDb = replicator_db.repDb; - var waitForRep = replicator_db.waitForRep; - - function simple_replication() { - populate_db(dbA, docs1); - populate_db(dbB, []); - - var repDoc = { - _id: "foo_simple_rep", - source: dbA.name, - target: dbB.name - }; - T(repDb.save(repDoc).ok); - - waitForRep(repDb, repDoc, "completed"); - for (var i = 0; i < docs1.length; i++) { - var doc = docs1[i]; - var copy = dbB.open(doc._id); - T(copy !== null); - T(copy.value === doc.value); - } - - var repDoc1 = repDb.open(repDoc._id); - T(repDoc1 !== null); - T(repDoc1.source === repDoc.source); - T(repDoc1.target === repDoc.target); - T(repDoc1._replication_state === "completed", "simple"); - T(typeof repDoc1._replication_state_time === "string"); - T(typeof repDoc1._replication_id === "string"); - T(typeof repDoc1._replication_stats === "object", "doc has stats"); - var stats = repDoc1._replication_stats; - TEquals(docs1.length, stats.revisions_checked, - "right # of revisions_checked"); - TEquals(docs1.length, stats.missing_revisions_found, - "right # of missing_revisions_found"); - TEquals(docs1.length, stats.docs_read, "right # of docs_read"); - TEquals(docs1.length, stats.docs_written, "right # of docs_written"); - TEquals(0, stats.doc_write_failures, "right # of doc_write_failures"); - TEquals(dbA.info().update_seq, stats.checkpointed_source_seq, - "right checkpointed_source_seq"); - } - - var server_config = [ - { - section: "couch_httpd_auth", - key: "iterations", - value: "1" - }, - { - section: "replicator", - key: "db", - value: repDb.name - } - ]; - - repDb.deleteDb(); - run_on_modified_server(server_config, simple_replication); - -/* - * Disabled, since error state would be set on the document only after - * the exponential backoff retry done by the replicator database listener - * terminates, which takes too much time for a unit test. - */ - /* - function error_state_replication() { - populate_db(dbA, docs1); - - var repDoc = { - _id: "foo_error_rep", - source: dbA.name, - target: "nonexistent_test_db" - }; - T(repDb.save(repDoc).ok); - - waitForRep(repDb, repDoc, "error"); - var repDoc1 = repDb.open(repDoc._id); - T(repDoc1 !== null); - T(repDoc1._replication_state === "error"); - T(typeof repDoc1._replication_state_time === "string"); - T(typeof repDoc1._replication_id === "string"); - } - */ -/* - * repDb.deleteDb(); - * restartServer(); - * run_on_modified_server(server_config, error_state_replication); - */ - - - // cleanup - repDb.deleteDb(); - dbA.deleteDb(); - dbB.deleteDb(); -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/couchdb/blob/6a4893aa/share/www/script/test/replicator_db_successive.js ---------------------------------------------------------------------- diff --git a/share/www/script/test/replicator_db_successive.js b/share/www/script/test/replicator_db_successive.js deleted file mode 100644 index 4898c33..0000000 --- a/share/www/script/test/replicator_db_successive.js +++ /dev/null @@ -1,127 +0,0 @@ -// 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. - -couchTests.replicator_db_successive = function(debug) { - - if (debug) debugger; - - var populate_db = replicator_db.populate_db; - var docs1 = replicator_db.docs1; - var dbA = replicator_db.dbA; - var dbB = replicator_db.dbB; - var repDb = replicator_db.repDb; - var wait = replicator_db.wait; - var waitForRep = replicator_db.waitForRep; - var waitForSeq = replicator_db.waitForSeq; - - function successive_identical_replications() { - populate_db(dbA, docs1); - populate_db(dbB, []); - - var repDoc1 = { - _id: "foo_ident_rep_1", - source: dbA.name, - target: dbB.name - }; - T(repDb.save(repDoc1).ok); - - waitForRep(repDb, repDoc1, "completed"); - for (var i = 0; i < docs1.length; i++) { - var doc = docs1[i]; - var copy = dbB.open(doc._id); - T(copy !== null); - T(copy.value === doc.value); - } - - var repDoc1_copy = repDb.open(repDoc1._id); - T(repDoc1_copy !== null); - T(repDoc1_copy.source === repDoc1.source); - T(repDoc1_copy.target === repDoc1.target); - T(repDoc1_copy._replication_state === "completed"); - T(typeof repDoc1_copy._replication_state_time === "string"); - T(typeof repDoc1_copy._replication_id === "string"); - T(typeof repDoc1_copy._replication_stats === "object", "doc has stats"); - var stats = repDoc1_copy._replication_stats; - TEquals(docs1.length, stats.revisions_checked, - "right # of revisions_checked"); - TEquals(docs1.length, stats.missing_revisions_found, - "right # of missing_revisions_found"); - TEquals(docs1.length, stats.docs_read, "right # of docs_read"); - TEquals(docs1.length, stats.docs_written, "right # of docs_written"); - TEquals(0, stats.doc_write_failures, "right # of doc_write_failures"); - TEquals(dbA.info().update_seq, stats.checkpointed_source_seq, - "right checkpointed_source_seq"); - - var newDoc = { - _id: "doc666", - value: 666 - }; - T(dbA.save(newDoc).ok); - - wait(200); - var newDoc_copy = dbB.open(newDoc._id); - // not replicated because first replication is complete (not continuous) - T(newDoc_copy === null); - - var repDoc2 = { - _id: "foo_ident_rep_2", - source: dbA.name, - target: dbB.name - }; - T(repDb.save(repDoc2).ok); - - waitForRep(repDb, repDoc2, "completed"); - var newDoc_copy = dbB.open(newDoc._id); - T(newDoc_copy !== null); - T(newDoc_copy.value === newDoc.value); - - var repDoc2_copy = repDb.open(repDoc2._id); - T(repDoc2_copy !== null); - T(repDoc2_copy.source === repDoc1.source); - T(repDoc2_copy.target === repDoc1.target); - T(repDoc2_copy._replication_state === "completed"); - T(typeof repDoc2_copy._replication_state_time === "string"); - T(typeof repDoc2_copy._replication_id === "string"); - T(repDoc2_copy._replication_id === repDoc1_copy._replication_id); - T(typeof repDoc2_copy._replication_stats === "object", "doc has stats"); - stats = repDoc2_copy._replication_stats; - TEquals(1, stats.revisions_checked, "right # of revisions_checked"); - TEquals(1, stats.missing_revisions_found, - "right # of missing_revisions_found"); - TEquals(1, stats.docs_read, "right # of docs_read"); - TEquals(1, stats.docs_written, "right # of docs_written"); - TEquals(0, stats.doc_write_failures, "right # of doc_write_failures"); - TEquals(dbA.info().update_seq, stats.checkpointed_source_seq, - "right checkpointed_source_seq"); - } - - var server_config = [ - { - section: "couch_httpd_auth", - key: "iterations", - value: "1" - }, - { - section: "replicator", - key: "db", - value: repDb.name - } - ]; - - repDb.deleteDb(); - run_on_modified_server(server_config, successive_identical_replications); - - // cleanup - repDb.deleteDb(); - dbA.deleteDb(); - dbB.deleteDb(); -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/couchdb/blob/6a4893aa/share/www/script/test/replicator_db_survives.js ---------------------------------------------------------------------- diff --git a/share/www/script/test/replicator_db_survives.js b/share/www/script/test/replicator_db_survives.js deleted file mode 100644 index 38273ca..0000000 --- a/share/www/script/test/replicator_db_survives.js +++ /dev/null @@ -1,126 +0,0 @@ -// 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. - -couchTests.replicator_db_survives = function(debug) { - - if (debug) debugger; - - var populate_db = replicator_db.populate_db; - var docs1 = replicator_db.docs1; - var dbA = replicator_db.dbA; - var dbB = replicator_db.dbB; - var repDb = replicator_db.repDb; - var usersDb = replicator_db.usersDb; - var wait = replicator_db.wait; - var waitForRep = replicator_db.waitForRep; - var waitForSeq = replicator_db.waitForSeq; - var waitForDocPos = replicator_db.waitForDocPos; - var wait_rep_doc = replicator_db.wait_rep_doc; - - function continuous_replication_survives_restart() { - var origRepDbName = CouchDB.request( - "GET", "/_config/replicator/db").responseText; - - repDb.deleteDb(); - - var xhr = CouchDB.request("PUT", "/_config/replicator/db", { - body : JSON.stringify(repDb.name), - headers: {"X-Couch-Persist": "false"} - }); - T(xhr.status === 200); - - populate_db(dbA, docs1); - populate_db(dbB, []); - - var repDoc = { - _id: "foo_cont_rep_survives_doc", - source: dbA.name, - target: dbB.name, - continuous: true - }; - - T(repDb.save(repDoc).ok); - - waitForSeq(dbA, dbB); - for (var i = 0; i < docs1.length; i++) { - var doc = docs1[i]; - var copy = dbB.open(doc._id); - T(copy !== null); - T(copy.value === doc.value); - } - - repDb.ensureFullCommit(); - dbA.ensureFullCommit(); - - restartServer(); - - xhr = CouchDB.request("PUT", "/_config/replicator/db", { - body : JSON.stringify(repDb.name), - headers: {"X-Couch-Persist": "false"} - }); - - T(xhr.status === 200); - - // add another doc to source, it will be replicated to target - var docX = { - _id: "foo1000", - value: 1001 - }; - - T(dbA.save(docX).ok); - - waitForSeq(dbA, dbB); - var copy = dbB.open("foo1000"); - T(copy !== null); - T(copy.value === 1001); - - repDoc = waitForDocPos(repDb, "foo_cont_rep_survives_doc", 3); - T(repDoc !== null); - T(repDoc.continuous === true); - - // stop replication - T(repDb.deleteDoc(repDoc).ok); - - xhr = CouchDB.request("PUT", "/_config/replicator/db", { - body : origRepDbName, - headers: {"X-Couch-Persist": "false"} - }); - T(xhr.status === 200); - } - - var server_config = [ - { - section: "couch_httpd_auth", - key: "iterations", - value: "1" - }, - { - section: "replicator", - key: "db", - value: repDb.name - }, - { - section: "couch_httpd_auth", - key: "authentication_db", - value: usersDb.name - } - ]; - - repDb.deleteDb(); - run_on_modified_server(server_config, continuous_replication_survives_restart); - - // cleanup - repDb.deleteDb(); - dbA.deleteDb(); - dbB.deleteDb(); - usersDb.deleteDb(); -} http://git-wip-us.apache.org/repos/asf/couchdb/blob/6a4893aa/share/www/script/test/replicator_db_swap_rep_db.js ---------------------------------------------------------------------- diff --git a/share/www/script/test/replicator_db_swap_rep_db.js b/share/www/script/test/replicator_db_swap_rep_db.js deleted file mode 100644 index 04f4e9f..0000000 --- a/share/www/script/test/replicator_db_swap_rep_db.js +++ /dev/null @@ -1,170 +0,0 @@ -// 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. - -couchTests.replicator_db_swap_rep_db = function(debug) { - - if (debug) debugger; - - var populate_db = replicator_db.populate_db; - var docs1 = replicator_db.docs1; - var dbA = replicator_db.dbA; - var dbB = replicator_db.dbB; - var repDb = replicator_db.repDb; - var usersDb = replicator_db.usersDb; - var wait = replicator_db.wait; - var waitForRep = replicator_db.waitForRep; - var waitForSeq = replicator_db.waitForSeq; - var wait_rep_doc = replicator_db.wait_rep_doc; - - 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 + CouchDB.host + "/" + dbA.name, - target: dbA_copy.name, - continuous: true - }; - repDoc2 = { - _id: "rep2", - source: CouchDB.protocol + CouchDB.host + "/" + dbB.name, - target: dbB_copy.name, - continuous: true - }; - repDoc3 = { - _id: "rep3", - source: CouchDB.protocol + CouchDB.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); - - // Temporary band-aid, give the replicator db some - // time to make the switch - wait(500); - - new_doc = { - _id: "foo666", - value: 666 - }; - - TEquals(true, dbA.save(new_doc).ok); - TEquals(true, dbB.save(new_doc).ok); - waitForSeq(dbA, dbA_copy); - waitForSeq(dbB, dbB_copy); - - 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); - } - var server_config = [ - { - section: "couch_httpd_auth", - key: "iterations", - value: "1" - }, - { - section: "replicator", - key: "db", - value: repDb.name - }, - { - section: "couch_httpd_auth", - key: "authentication_db", - value: usersDb.name - } - ]; - - repDb.deleteDb(); - run_on_modified_server(server_config, swap_rep_db); - - // cleanup - repDb.deleteDb(); - dbA.deleteDb(); - dbB.deleteDb(); - usersDb.deleteDb(); - (new CouchDB("test_suite_rep_db_2")).deleteDb(); - (new CouchDB("test_suite_rep_db_c")).deleteDb(); - (new CouchDB("test_suite_rep_db_a_copy")).deleteDb(); - (new CouchDB("test_suite_rep_db_b_copy")).deleteDb(); - (new CouchDB("test_suite_rep_db_c_copy")).deleteDb(); - -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/couchdb/blob/6a4893aa/share/www/script/test/replicator_db_update_security.js ---------------------------------------------------------------------- diff --git a/share/www/script/test/replicator_db_update_security.js b/share/www/script/test/replicator_db_update_security.js deleted file mode 100644 index 4651514..0000000 --- a/share/www/script/test/replicator_db_update_security.js +++ /dev/null @@ -1,92 +0,0 @@ -// 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. - -couchTests.replicator_db_update_security = function(debug) { - - if (debug) debugger; - - var populate_db = replicator_db.populate_db; - var docs1 = replicator_db.docs1; - var dbA = replicator_db.dbA; - var dbB = replicator_db.dbB; - var repDb = replicator_db.repDb; - var usersDb = replicator_db.usersDb; - var wait = replicator_db.wait; - var waitForRep = replicator_db.waitForRep; - var waitForSeq = replicator_db.waitForSeq; - var wait_rep_doc = replicator_db.wait_rep_doc; - - function test_rep_db_update_security() { - var dbA_copy = new CouchDB("test_suite_rep_db_a_copy"); - var dbB_copy = new CouchDB("test_suite_rep_db_b_copy"); - var repDoc1, repDoc2; - var xhr, i, doc, copy, new_doc; - var docs = makeDocs(1, 3); - - populate_db(dbA, docs); - populate_db(dbB, docs); - populate_db(dbA_copy, []); - populate_db(dbB_copy, []); - - repDoc1 = { - _id: "rep1", - source: CouchDB.protocol + CouchDB.host + "/" + dbA.name, - target: dbA_copy.name - }; - repDoc2 = { - _id: "rep2", - source: CouchDB.protocol + CouchDB.host + "/" + dbB.name, - target: dbB_copy.name - }; - - TEquals(true, repDb.save(repDoc1).ok); - waitForRep(repDb, repDoc1, "completed"); - - T(repDb.setSecObj({ - readers: { - names: ["joe"] - } - }).ok); - - TEquals(true, repDb.save(repDoc2).ok); - waitForRep(repDb, repDoc2, "completed"); - } - - var server_config = [ - { - section: "couch_httpd_auth", - key: "iterations", - value: "1" - }, - { - section: "replicator", - key: "db", - value: repDb.name - }, - { - section: "couch_httpd_auth", - key: "authentication_db", - value: usersDb.name - } - ]; - - repDb.deleteDb(); - run_on_modified_server(server_config, test_rep_db_update_security); - - // cleanup - repDb.deleteDb(); - dbA.deleteDb(); - dbB.deleteDb(); - usersDb.deleteDb(); - (new CouchDB("test_suite_rep_db_a_copy")).deleteDb(); - (new CouchDB("test_suite_rep_db_b_copy")).deleteDb(); -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/couchdb/blob/6a4893aa/share/www/script/test/replicator_db_user_ctx.js ---------------------------------------------------------------------- diff --git a/share/www/script/test/replicator_db_user_ctx.js b/share/www/script/test/replicator_db_user_ctx.js deleted file mode 100644 index 570fc7d..0000000 --- a/share/www/script/test/replicator_db_user_ctx.js +++ /dev/null @@ -1,272 +0,0 @@ -// 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. - -couchTests.replicator_db_user_ctx = function(debug) { - - if (debug) debugger; - - var populate_db = replicator_db.populate_db; - var docs1 = replicator_db.docs1; - var dbA = replicator_db.dbA; - var dbB = replicator_db.dbB; - var repDb = replicator_db.repDb; - var usersDb = replicator_db.usersDb; - var wait = replicator_db.wait; - var waitForRep = replicator_db.waitForRep; - var waitForSeq = replicator_db.waitForSeq; - var wait_rep_doc = replicator_db.wait_rep_doc; - - function test_user_ctx_validation() { - populate_db(dbA, docs1); - populate_db(dbB, []); - populate_db(usersDb, []); - - var joeUserDoc = CouchDB.prepareUserDoc({ - name: "joe", - roles: ["erlanger", "bar"] - }, "erly"); - var fdmananaUserDoc = CouchDB.prepareUserDoc({ - name: "fdmanana", - roles: ["a", "b", "c"] - }, "qwerty"); - - TEquals(true, usersDb.save(joeUserDoc).ok); - TEquals(true, usersDb.save(fdmananaUserDoc).ok); - - T(dbB.setSecObj({ - admins: { - names: [], - roles: ["god"] - }, - readers: { - names: [], - roles: ["foo"] - } - }).ok); - - TEquals(true, CouchDB.login("joe", "erly").ok); - TEquals("joe", CouchDB.session().userCtx.name); - TEquals(-1, CouchDB.session().userCtx.roles.indexOf("_admin")); - - var repDoc = { - _id: "foo_rep", - source: CouchDB.protocol + CouchDB.host + "/" + dbA.name, - target: dbB.name - }; - - try { - repDb.save(repDoc); - T(false, "Should have failed, user_ctx missing."); - } catch (x) { - TEquals("forbidden", x.error); - } - - repDoc.user_ctx = { - name: "john", - roles: ["erlanger"] - }; - - try { - repDb.save(repDoc); - T(false, "Should have failed, wrong user_ctx.name."); - } catch (x) { - TEquals("forbidden", x.error); - } - - repDoc.user_ctx = { - name: "joe", - roles: ["bar", "god", "erlanger"] - }; - - try { - repDb.save(repDoc); - T(false, "Should have failed, a bad role in user_ctx.roles."); - } catch (x) { - TEquals("forbidden", x.error); - } - - // user_ctx.roles might contain only a subset of the user's roles - repDoc.user_ctx = { - name: "joe", - roles: ["erlanger"] - }; - - TEquals(true, repDb.save(repDoc).ok); - CouchDB.logout(); - - waitForRep(repDb, repDoc, "error"); - var repDoc1 = repDb.open(repDoc._id); - T(repDoc1 !== null); - TEquals(repDoc.source, repDoc1.source); - TEquals(repDoc.target, repDoc1.target); - TEquals("error", repDoc1._replication_state); - TEquals("string", typeof repDoc1._replication_id); - TEquals("string", typeof repDoc1._replication_state_time); - - TEquals(true, CouchDB.login("fdmanana", "qwerty").ok); - TEquals("fdmanana", CouchDB.session().userCtx.name); - TEquals(-1, CouchDB.session().userCtx.roles.indexOf("_admin")); - - try { - T(repDb.deleteDoc(repDoc1).ok); - T(false, "Shouldn't be able to delete replication document."); - } catch (x) { - TEquals("forbidden", x.error); - } - - CouchDB.logout(); - TEquals(true, CouchDB.login("joe", "erly").ok); - TEquals("joe", CouchDB.session().userCtx.name); - TEquals(-1, CouchDB.session().userCtx.roles.indexOf("_admin")); - - T(repDb.deleteDoc(repDoc1).ok); - CouchDB.logout(); - - for (var i = 0; i < docs1.length; i++) { - var doc = docs1[i]; - var copy = dbB.open(doc._id); - - TEquals(null, copy); - } - - T(dbB.setSecObj({ - admins: { - names: [], - roles: ["god", "erlanger"] - }, - readers: { - names: [], - roles: ["foo"] - } - }).ok); - - TEquals(true, CouchDB.login("joe", "erly").ok); - TEquals("joe", CouchDB.session().userCtx.name); - TEquals(-1, CouchDB.session().userCtx.roles.indexOf("_admin")); - - repDoc = { - _id: "foo_rep_2", - source: CouchDB.protocol + CouchDB.host + "/" + dbA.name, - target: dbB.name, - user_ctx: { - name: "joe", - roles: ["erlanger"] - } - }; - - TEquals(true, repDb.save(repDoc).ok); - CouchDB.logout(); - - waitForRep(repDb, repDoc, "complete"); - repDoc1 = repDb.open(repDoc._id); - T(repDoc1 !== null); - TEquals(repDoc.source, repDoc1.source); - TEquals(repDoc.target, repDoc1.target); - TEquals("completed", repDoc1._replication_state); - TEquals("string", typeof repDoc1._replication_id); - TEquals("string", typeof repDoc1._replication_state_time); - - for (var i = 0; i < docs1.length; i++) { - var doc = docs1[i]; - var copy = dbB.open(doc._id); - - T(copy !== null); - TEquals(doc.value, copy.value); - } - - // Admins don't need to supply a user_ctx property in replication docs. - // If they do not, the implicit user_ctx "user_ctx": {name: null, roles: []} - // is used, meaning that design documents will not be replicated into - // local targets - T(dbB.setSecObj({ - admins: { - names: [], - roles: [] - }, - readers: { - names: [], - roles: [] - } - }).ok); - - var ddoc = { _id: "_design/foo" }; - TEquals(true, dbA.save(ddoc).ok); - - repDoc = { - _id: "foo_rep_3", - source: CouchDB.protocol + CouchDB.host + "/" + dbA.name, - target: dbB.name - }; - - TEquals(true, repDb.save(repDoc).ok); - waitForRep(repDb, repDoc, "complete"); - repDoc1 = repDb.open(repDoc._id); - T(repDoc1 !== null); - TEquals(repDoc.source, repDoc1.source); - TEquals(repDoc.target, repDoc1.target); - TEquals("completed", repDoc1._replication_state); - TEquals("string", typeof repDoc1._replication_id); - TEquals("string", typeof repDoc1._replication_state_time); - - var ddoc_copy = dbB.open(ddoc._id); - T(ddoc_copy === null); - - repDoc = { - _id: "foo_rep_4", - source: CouchDB.protocol + CouchDB.host + "/" + dbA.name, - target: dbB.name, - user_ctx: { - roles: ["_admin"] - } - }; - - TEquals(true, repDb.save(repDoc).ok); - waitForRep(repDb, repDoc, "complete"); - repDoc1 = repDb.open(repDoc._id); - T(repDoc1 !== null); - TEquals(repDoc.source, repDoc1.source); - TEquals(repDoc.target, repDoc1.target); - TEquals("completed", repDoc1._replication_state); - TEquals("string", typeof repDoc1._replication_id); - TEquals("string", typeof repDoc1._replication_state_time); - - ddoc_copy = dbB.open(ddoc._id); - T(ddoc_copy !== null); - } - - var server_config = [ - { - section: "couch_httpd_auth", - key: "iterations", - value: "1" - }, - { - section: "replicator", - key: "db", - value: repDb.name - }, - { - section: "couch_httpd_auth", - key: "authentication_db", - value: usersDb.name - } - ]; - - repDb.deleteDb(); - run_on_modified_server(server_config, test_user_ctx_validation); - - // cleanup - repDb.deleteDb(); - dbA.deleteDb(); - dbB.deleteDb(); - usersDb.deleteDb(); -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/couchdb/blob/6a4893aa/share/www/script/test/replicator_db_write_auth.js ---------------------------------------------------------------------- diff --git a/share/www/script/test/replicator_db_write_auth.js b/share/www/script/test/replicator_db_write_auth.js deleted file mode 100644 index 697abf3..0000000 --- a/share/www/script/test/replicator_db_write_auth.js +++ /dev/null @@ -1,102 +0,0 @@ -// 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. - -couchTests.replicator_db_survives = function(debug) { - - if (debug) debugger; - - var populate_db = replicator_db.populate_db; - var docs1 = replicator_db.docs1; - var dbA = replicator_db.dbA; - var dbB = replicator_db.dbB; - var repDb = replicator_db.repDb; - var usersDb = replicator_db.usersDb; - var wait = replicator_db.wait; - var waitForRep = replicator_db.waitForRep; - var waitForSeq = replicator_db.waitForSeq; - var waitForDocPos = replicator_db.waitForDocPos; - var wait_rep_doc = replicator_db.wait_rep_doc; - - function rep_db_write_authorization() { - populate_db(dbA, docs1); - populate_db(dbB, []); - - var server_admins_config = [ - { - section: "admins", - key: "fdmanana", - value: "qwerty" - } - ]; - - run_on_modified_server(server_admins_config, function() { - var repDoc = { - _id: "foo_rep_doc", - source: dbA.name, - target: dbB.name, - continuous: true - }; - - T(CouchDB.login("fdmanana", "qwerty").ok); - T(CouchDB.session().userCtx.name === "fdmanana"); - T(CouchDB.session().userCtx.roles.indexOf("_admin") !== -1); - - T(repDb.save(repDoc).ok); - - waitForRep(repDb, repDoc, "completed"); - - for (var i = 0; i < docs1.length; i++) { - var doc = docs1[i]; - var copy = dbB.open(doc._id); - - T(copy !== null); - T(copy.value === doc.value); - } - - repDoc = repDb.open("foo_rep_doc"); - T(repDoc !== null); - repDoc.target = "test_suite_foo_db"; - repDoc.create_target = true; - - // Only the replicator can update replication documents. - // Admins can only add and delete replication documents. - try { - repDb.save(repDoc); - T(false && "Should have thrown an exception"); - } catch (x) { - T(x["error"] === "forbidden"); - } - }); - } - - var server_config = [ - { - section: "couch_httpd_auth", - key: "iterations", - value: "1" - }, - { - section: "replicator", - key: "db", - value: repDb.name - } - ]; - - repDb.deleteDb(); - run_on_modified_server(server_config, rep_db_write_authorization); - - // cleanup - repDb.deleteDb(); - dbA.deleteDb(); - dbB.deleteDb(); - usersDb.deleteDb(); -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/couchdb/blob/6a4893aa/share/www/script/test/rev_stemming.js ---------------------------------------------------------------------- diff --git a/share/www/script/test/rev_stemming.js b/share/www/script/test/rev_stemming.js deleted file mode 100644 index 954da79..0000000 --- a/share/www/script/test/rev_stemming.js +++ /dev/null @@ -1,110 +0,0 @@ -// 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. - -couchTests.rev_stemming = function(debug) { - var db = new CouchDB("test_suite_db", {"X-Couch-Full-Commit":"false"}); - db.deleteDb(); - db.createDb(); - var db = new CouchDB("test_suite_db_a", {"X-Couch-Full-Commit":"false"}); - db.deleteDb(); - db.createDb(); - var dbB = new CouchDB("test_suite_db_b", {"X-Couch-Full-Commit":"false"}); - dbB.deleteDb(); - dbB.createDb(); - if (debug) debugger; - - var newLimit = 5; - - T(db.getDbProperty("_revs_limit") == 1000); - - // Make an invalid request to _revs_limit - // Should return 400 - var xhr = CouchDB.request("PUT", "/test_suite_db/_revs_limit", {body:"\"foo\""}); - T(xhr.status == 400); - var result = JSON.parse(xhr.responseText); - T(result.error == "bad_request"); - T(result.reason == "Rev limit has to be an integer"); - - var doc = {_id:"foo",foo:0} - for( var i=0; i < newLimit + 1; i++) { - doc.foo++; - T(db.save(doc).ok); - } - var doc0 = db.open("foo", {revs:true}); - T(doc0._revisions.ids.length == newLimit + 1); - - var docBar = {_id:"bar",foo:0} - for( var i=0; i < newLimit + 1; i++) { - docBar.foo++; - T(db.save(docBar).ok); - } - T(db.open("bar", {revs:true})._revisions.ids.length == newLimit + 1); - - T(db.setDbProperty("_revs_limit", newLimit).ok); - - for( var i=0; i < newLimit + 1; i++) { - doc.foo++; - T(db.save(doc).ok); - } - doc0 = db.open("foo", {revs:true}); - T(doc0._revisions.ids.length == newLimit); - - - // If you replicate after you make more edits than the limit, you'll - // cause a spurious edit conflict. - CouchDB.replicate("test_suite_db_a", "test_suite_db_b"); - var docB1 = dbB.open("foo",{conflicts:true}) - T(docB1._conflicts == null); - - for( var i=0; i < newLimit - 1; i++) { - doc.foo++; - T(db.save(doc).ok); - } - - // one less edit than limit, no conflict - CouchDB.replicate("test_suite_db_a", "test_suite_db_b"); - var docB1 = dbB.open("foo",{conflicts:true}) - T(docB1._conflicts == null); - - //now we hit the limit - for( var i=0; i < newLimit; i++) { - doc.foo++; - T(db.save(doc).ok); - } - - CouchDB.replicate("test_suite_db_a", "test_suite_db_b"); - - var docB2 = dbB.open("foo",{conflicts:true}); - - // we have a conflict, but the previous replicated rev is always the losing - // conflict - T(docB2._conflicts[0] == docB1._rev) - - // We having already updated bar before setting the limit, so it's still got - // a long rev history. compact to stem the revs. - - T(db.open("bar", {revs:true})._revisions.ids.length == newLimit + 1); - - T(db.compact().ok); - - // compaction isn't instantaneous, loop until done - while (db.info().compact_running) {}; - - // force reload because ETags don't honour compaction - var req = db.request("GET", "/test_suite_db_a/bar?revs=true", { - headers:{"if-none-match":"pommes"} - }); - - var finalDoc = JSON.parse(req.responseText); - TEquals(newLimit, finalDoc._revisions.ids.length, - "should return a truncated revision list"); -}; http://git-wip-us.apache.org/repos/asf/couchdb/blob/6a4893aa/share/www/script/test/rewrite.js ---------------------------------------------------------------------- diff --git a/share/www/script/test/rewrite.js b/share/www/script/test/rewrite.js deleted file mode 100644 index 5c56fa5..0000000 --- a/share/www/script/test/rewrite.js +++ /dev/null @@ -1,505 +0,0 @@ -// 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. - - - -couchTests.rewrite = function(debug) { - if (debug) debugger; - var dbNames = ["test_suite_db", "test_suite_db/with_slashes"]; - for (var i=0; i < dbNames.length; i++) { - var db = new CouchDB(dbNames[i]); - var dbName = encodeURIComponent(dbNames[i]); - db.deleteDb(); - db.createDb(); - - - run_on_modified_server( - [{section: "httpd", - key: "authentication_handlers", - value: "{couch_httpd_auth, special_test_authentication_handler}"}, - {section:"httpd", - key: "WWW-Authenticate", - value: "X-Couch-Test-Auth"}], - - function(){ - var designDoc = { - _id:"_design/test", - language: "javascript", - _attachments:{ - "foo.txt": { - content_type:"text/plain", - data: "VGhpcyBpcyBhIGJhc2U2NCBlbmNvZGVkIHRleHQ=" - } - }, - rewrites: [ - { - "from": "foo", - "to": "foo.txt" - }, - { - "from": "foo2", - "to": "foo.txt", - "method": "GET" - }, - { - "from": "hello/:id", - "to": "_update/hello/:id", - "method": "PUT" - }, - { - "from": "/welcome", - "to": "_show/welcome" - }, - { - "from": "/welcome/:name", - "to": "_show/welcome", - "query": { - "name": ":name" - } - }, - { - "from": "/welcome2", - "to": "_show/welcome", - "query": { - "name": "user" - } - }, - { - "from": "/welcome3/:name", - "to": "_update/welcome2/:name", - "method": "PUT" - }, - { - "from": "/welcome3/:name", - "to": "_show/welcome2/:name", - "method": "GET" - }, - { - "from": "/welcome4/*", - "to" : "_show/welcome3", - "query": { - "name": "*" - } - }, - { - "from": "/welcome5/*", - "to" : "_show/*", - "query": { - "name": "*" - } - }, - { - "from": "basicView", - "to": "_view/basicView", - }, - { - "from": "simpleForm/basicView", - "to": "_list/simpleForm/basicView", - }, - { - "from": "simpleForm/basicViewFixed", - "to": "_list/simpleForm/basicView", - "query": { - "startkey": 3, - "endkey": 8 - } - }, - { - "from": "simpleForm/basicViewPath/:start/:end", - "to": "_list/simpleForm/basicView", - "query": { - "startkey": ":start", - "endkey": ":end" - }, - "formats": { - "start": "int", - "end": "int" - } - }, - { - "from": "simpleForm/complexView", - "to": "_list/simpleForm/complexView", - "query": { - "key": [1, 2] - } - }, - { - "from": "simpleForm/complexView2", - "to": "_list/simpleForm/complexView", - "query": { - "key": ["test", {}] - } - }, - { - "from": "simpleForm/complexView3", - "to": "_list/simpleForm/complexView", - "query": { - "key": ["test", ["test", "essai"]] - } - }, - { - "from": "simpleForm/complexView4", - "to": "_list/simpleForm/complexView2", - "query": { - "key": {"c": 1} - } - }, - { - "from": "simpleForm/complexView5/:a/:b", - "to": "_list/simpleForm/complexView3", - "query": { - "key": [":a", ":b"] - } - }, - { - "from": "simpleForm/complexView6", - "to": "_list/simpleForm/complexView3", - "query": { - "key": [":a", ":b"] - } - }, - { - "from": "simpleForm/complexView7/:a/:b", - "to": "_view/complexView3", - "query": { - "key": [":a", ":b"], - "include_docs": ":doc" - }, - "format": { - "doc": "bool" - } - - }, - { - "from": "/", - "to": "_view/basicView", - }, - { - "from": "/db/*", - "to": "../../*" - } - ], - lists: { - simpleForm: stringFun(function(head, req) { - log("simpleForm"); - send('<ul>'); - var row, row_number = 0, prevKey, firstKey = null; - while (row = getRow()) { - row_number += 1; - if (!firstKey) firstKey = row.key; - prevKey = row.key; - send('\n<li>Key: '+row.key - +' Value: '+row.value - +' LineNo: '+row_number+'</li>'); - } - return '</ul><p>FirstKey: '+ firstKey + ' LastKey: '+ prevKey+'</p>'; - }), - }, - shows: { - "welcome": stringFun(function(doc,req) { - return "Welcome " + req.query["name"]; - }), - "welcome2": stringFun(function(doc, req) { - return "Welcome " + doc.name; - }), - "welcome3": stringFun(function(doc,req) { - return "Welcome " + req.query["name"]; - }) - }, - updates: { - "hello" : stringFun(function(doc, req) { - if (!doc) { - if (req.id) { - return [{ - _id : req.id - }, "New World"] - } - return [null, "Empty World"]; - } - doc.world = "hello"; - doc.edited_by = req.userCtx; - return [doc, "hello doc"]; - }), - "welcome2": stringFun(function(doc, req) { - if (!doc) { - if (req.id) { - return [{ - _id: req.id, - name: req.id - }, "New World"] - } - return [null, "Empty World"]; - } - return [doc, "hello doc"]; - }) - }, - views : { - basicView : { - map : stringFun(function(doc) { - if (doc.integer) { - emit(doc.integer, doc.string); - } - - }) - }, - complexView: { - map: stringFun(function(doc) { - if (doc.type == "complex") { - emit([doc.a, doc.b], doc.string); - } - }) - }, - complexView2: { - map: stringFun(function(doc) { - if (doc.type == "complex") { - emit(doc.a, doc.string); - } - }) - }, - complexView3: { - map: stringFun(function(doc) { - if (doc.type == "complex") { - emit(doc.b, doc.string); - } - }) - } - } - } - - db.save(designDoc); - - var docs = makeDocs(0, 10); - db.bulkSave(docs); - - var docs2 = [ - {"a": 1, "b": 1, "string": "doc 1", "type": "complex"}, - {"a": 1, "b": 2, "string": "doc 2", "type": "complex"}, - {"a": "test", "b": {}, "string": "doc 3", "type": "complex"}, - {"a": "test", "b": ["test", "essai"], "string": "doc 4", "type": "complex"}, - {"a": {"c": 1}, "b": "", "string": "doc 5", "type": "complex"} - ]; - - db.bulkSave(docs2); - - // test simple rewriting - - req = CouchDB.request("GET", "/"+dbName+"/_design/test/_rewrite/foo"); - T(req.responseText == "This is a base64 encoded text"); - T(req.getResponseHeader("Content-Type") == "text/plain"); - - req = CouchDB.request("GET", "/"+dbName+"/_design/test/_rewrite/foo2"); - T(req.responseText == "This is a base64 encoded text"); - T(req.getResponseHeader("Content-Type") == "text/plain"); - - - // test POST - // hello update world - - var doc = {"word":"plankton", "name":"Rusty"} - var resp = db.save(doc); - T(resp.ok); - var docid = resp.id; - - xhr = CouchDB.request("PUT", "/"+dbName+"/_design/test/_rewrite/hello/"+docid); - T(xhr.status == 201); - T(xhr.responseText == "hello doc"); - T(/charset=utf-8/.test(xhr.getResponseHeader("Content-Type"))) - - doc = db.open(docid); - T(doc.world == "hello"); - - req = CouchDB.request("GET", "/"+dbName+"/_design/test/_rewrite/welcome?name=user"); - T(req.responseText == "Welcome user"); - - req = CouchDB.request("GET", "/"+dbName+"/_design/test/_rewrite/welcome/user"); - T(req.responseText == "Welcome user"); - - req = CouchDB.request("GET", "/"+dbName+"/_design/test/_rewrite/welcome2"); - T(req.responseText == "Welcome user"); - - xhr = CouchDB.request("PUT", "/"+dbName+"/_design/test/_rewrite/welcome3/test"); - T(xhr.status == 201); - T(xhr.responseText == "New World"); - T(/charset=utf-8/.test(xhr.getResponseHeader("Content-Type"))); - - xhr = CouchDB.request("GET", "/"+dbName+"/_design/test/_rewrite/welcome3/test"); - T(xhr.responseText == "Welcome test"); - - req = CouchDB.request("GET", "/"+dbName+"/_design/test/_rewrite/welcome4/user"); - T(req.responseText == "Welcome user"); - - req = CouchDB.request("GET", "/"+dbName+"/_design/test/_rewrite/welcome5/welcome3"); - T(req.responseText == "Welcome welcome3"); - - xhr = CouchDB.request("GET", "/"+dbName+"/_design/test/_rewrite/basicView"); - T(xhr.status == 200, "view call"); - T(/{"total_rows":9/.test(xhr.responseText)); - - xhr = CouchDB.request("GET", "/"+dbName+"/_design/test/_rewrite/"); - T(xhr.status == 200, "view call"); - T(/{"total_rows":9/.test(xhr.responseText)); - - - // get with query params - xhr = CouchDB.request("GET", "/"+dbName+"/_design/test/_rewrite/simpleForm/basicView?startkey=3&endkey=8"); - T(xhr.status == 200, "with query params"); - T(!(/Key: 1/.test(xhr.responseText))); - T(/FirstKey: 3/.test(xhr.responseText)); - T(/LastKey: 8/.test(xhr.responseText)); - - xhr = CouchDB.request("GET", "/"+dbName+"/_design/test/_rewrite/simpleForm/basicViewFixed"); - T(xhr.status == 200, "with query params"); - T(!(/Key: 1/.test(xhr.responseText))); - T(/FirstKey: 3/.test(xhr.responseText)); - T(/LastKey: 8/.test(xhr.responseText)); - - // get with query params - xhr = CouchDB.request("GET", "/"+dbName+"/_design/test/_rewrite/simpleForm/basicViewFixed?startkey=4"); - T(xhr.status == 200, "with query params"); - T(!(/Key: 1/.test(xhr.responseText))); - T(/FirstKey: 3/.test(xhr.responseText)); - T(/LastKey: 8/.test(xhr.responseText)); - - // get with query params - xhr = CouchDB.request("GET", "/"+dbName+"/_design/test/_rewrite/simpleForm/basicViewPath/3/8"); - T(xhr.status == 200, "with query params"); - T(!(/Key: 1/.test(xhr.responseText))); - T(/FirstKey: 3/.test(xhr.responseText)); - T(/LastKey: 8/.test(xhr.responseText)); - - // get with query params - xhr = CouchDB.request("GET", "/"+dbName+"/_design/test/_rewrite/simpleForm/complexView"); - T(xhr.status == 200, "with query params"); - T(/FirstKey: [1, 2]/.test(xhr.responseText)); - - xhr = CouchDB.request("GET", "/"+dbName+"/_design/test/_rewrite/simpleForm/complexView2"); - T(xhr.status == 200, "with query params"); - T(/Value: doc 3/.test(xhr.responseText)); - - xhr = CouchDB.request("GET", "/"+dbName+"/_design/test/_rewrite/simpleForm/complexView3"); - T(xhr.status == 200, "with query params"); - T(/Value: doc 4/.test(xhr.responseText)); - - xhr = CouchDB.request("GET", "/"+dbName+"/_design/test/_rewrite/simpleForm/complexView4"); - T(xhr.status == 200, "with query params"); - T(/Value: doc 5/.test(xhr.responseText)); - - xhr = CouchDB.request("GET", "/"+dbName+"/_design/test/_rewrite/simpleForm/complexView5/test/essai"); - T(xhr.status == 200, "with query params"); - T(/Value: doc 4/.test(xhr.responseText)); - - xhr = CouchDB.request("GET", "/"+dbName+"/_design/test/_rewrite/simpleForm/complexView6?a=test&b=essai"); - T(xhr.status == 200, "with query params"); - T(/Value: doc 4/.test(xhr.responseText)); - - xhr = CouchDB.request("GET", "/"+dbName+"/_design/test/_rewrite/simpleForm/complexView7/test/essai?doc=true"); - T(xhr.status == 200, "with query params"); - var result = JSON.parse(xhr.responseText); - T(typeof(result.rows[0].doc) === "object"); - - // COUCHDB-2031 - path normalization versus qs params - xhr = CouchDB.request("GET", "/"+dbName+"/_design/test/_rewrite/db/_design/test?meta=true"); - T(xhr.status == 200, "path normalization works with qs params"); - var result = JSON.parse(xhr.responseText); - T(result['_id'] == "_design/test"); - T(typeof(result['_revs_info']) === "object"); - - // test path relative to server - designDoc.rewrites.push({ - "from": "uuids", - "to": "../../../_uuids" - }); - T(db.save(designDoc).ok); - - var xhr = CouchDB.request("GET", "/"+dbName+"/_design/test/_rewrite/uuids"); - T(xhr.status == 500); - var result = JSON.parse(xhr.responseText); - T(result.error == "insecure_rewrite_rule"); - - run_on_modified_server( - [{section: "httpd", - key: "secure_rewrites", - value: "false"}], - function() { - var xhr = CouchDB.request("GET", "/"+dbName+"/_design/test/_rewrite/uuids?cache=bust"); - T(xhr.status == 200); - var result = JSON.parse(xhr.responseText); - T(result.uuids.length == 1); - var first = result.uuids[0]; - }); - }); - - // test invalid rewrites - // string - var ddoc = { - _id: "_design/invalid", - rewrites: "[{\"from\":\"foo\",\"to\":\"bar\"}]" - } - db.save(ddoc); - var res = CouchDB.request("GET", "/"+dbName+"/_design/invalid/_rewrite/foo"); - TEquals(400, res.status, "should return 400"); - - var ddoc_requested_path = { - _id: "_design/requested_path", - rewrites:[ - {"from": "show", "to": "_show/origin/0"}, - {"from": "show_rewritten", "to": "_rewrite/show"} - ], - shows: { - origin: stringFun(function(doc, req) { - return req.headers["x-couchdb-requested-path"]; - })} - }; - - db.save(ddoc_requested_path); - var url = "/"+dbName+"/_design/requested_path/_rewrite/show"; - var res = CouchDB.request("GET", url); - TEquals(url, res.responseText, "should return the original url"); - - var url = "/"+dbName+"/_design/requested_path/_rewrite/show_rewritten"; - var res = CouchDB.request("GET", url); - TEquals(url, res.responseText, "returned the original url"); - - var ddoc_loop = { - _id: "_design/loop", - rewrites: [{ "from": "loop", "to": "_rewrite/loop"}] - }; - db.save(ddoc_loop); - - // Assert loop detection - run_on_modified_server( - [{section: "httpd", - key: "rewrite_limit", - value: "2"}], - function(){ - var url = "/"+dbName+"/_design/loop/_rewrite/loop"; - var xhr = CouchDB.request("GET", url); - TEquals(400, xhr.status); - }); - - // Assert serial execution is not spuriously counted as loop - run_on_modified_server( - [{section: "httpd", - key: "rewrite_limit", - value: "2"}, - {section: "httpd", - key: "secure_rewrites", - value: "false"}], - function(){ - var url = "/"+dbName+"/_design/test/_rewrite/foo"; - for (var i=0; i < 5; i++) { - var xhr = CouchDB.request("GET", url); - TEquals(200, xhr.status); - } - }); - } -}
