Skip to content

Commit

Permalink
Fix and test for COUCHDB-885, replication of attachments causing conf…
Browse files Browse the repository at this point in the history
…licts

git-svn-id: https://svn.apache.org/repos/asf/couchdb/branches/1.0.x@1104476 13f79535-47bb-0310-9956-ffa450edef68
  • Loading branch information
fdmanana committed May 17, 2011
1 parent 0654872 commit 6b0be3c
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 2 deletions.
64 changes: 64 additions & 0 deletions share/www/script/test/replication.js
Original file line number Diff line number Diff line change
Expand Up @@ -740,6 +740,70 @@ couchTests.replication = function(debug) {
TEquals('string', typeof repResult._local_id);


// COUCHDB-885 - push replication of a doc with attachment causes a
// conflict in the target.
dbA = new CouchDB("test_suite_db_a");
dbB = new CouchDB("test_suite_db_b");

dbA.deleteDb();
dbA.createDb();
dbB.deleteDb();
dbB.createDb();

var doc = {
_id: "doc1"
};
TEquals(true, dbA.save(doc).ok);

repResult = CouchDB.replicate(
dbA.name,
"http://" + host + "/" + dbB.name
);
TEquals(true, repResult.ok);
TEquals(true, repResult.history instanceof Array);
TEquals(1, repResult.history.length);
TEquals(1, repResult.history[0].docs_written);
TEquals(1, repResult.history[0].docs_read);
TEquals(0, repResult.history[0].doc_write_failures);

doc["_attachments"] = {
"hello.txt": {
"content_type": "text/plain",
"data": "aGVsbG8gd29ybGQ=" // base64:encode("hello world")
},
"foo.dat": {
"content_type": "not/compressible",
"data": "aSBhbSBub3QgZ3ppcGVk" // base64:encode("i am not gziped")
}
};

TEquals(true, dbA.save(doc).ok);
repResult = CouchDB.replicate(
dbA.name,
"http://" + host + "/" + dbB.name
);
TEquals(true, repResult.ok);
TEquals(true, repResult.history instanceof Array);
TEquals(2, repResult.history.length);
TEquals(1, repResult.history[0].docs_written);
TEquals(1, repResult.history[0].docs_read);
TEquals(0, repResult.history[0].doc_write_failures);

var copy = dbB.open(doc._id, {
conflicts: true, deleted_conflicts: true, attachments: true,
att_encoding_info: true});
T(copy !== null);
TEquals("undefined", typeof copy._conflicts);
TEquals("undefined", typeof copy._deleted_conflicts);
TEquals("text/plain", copy._attachments["hello.txt"]["content_type"]);
TEquals("aGVsbG8gd29ybGQ=", copy._attachments["hello.txt"]["data"]);
TEquals("gzip", copy._attachments["hello.txt"]["encoding"]);
TEquals("not/compressible", copy._attachments["foo.dat"]["content_type"]);
TEquals("aSBhbSBub3QgZ3ppcGVk", copy._attachments["foo.dat"]["data"]);
TEquals("undefined", typeof copy._attachments["foo.dat"]["encoding"]);
// end of test for COUCHDB-885


// cleanup
dbA.deleteDb();
dbB.deleteDb();
Expand Down
4 changes: 2 additions & 2 deletions src/couchdb/couch_rep_writer.erl
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ write_bulk_docs(_Db, []) ->
[];
write_bulk_docs(#http_db{headers = Headers} = Db, Docs) ->
JsonDocs = [
couch_doc:to_json_obj(Doc, [revs, att_gzip_length]) || Doc <- Docs
couch_doc:to_json_obj(Doc, [revs]) || Doc <- Docs
],
Request = Db#http_db{
resource = "_bulk_docs",
Expand All @@ -91,7 +91,7 @@ write_multi_part_doc(#http_db{headers=Headers} = Db, #doc{atts=Atts} = Doc) ->
JsonBytes = ?JSON_ENCODE(
couch_doc:to_json_obj(
Doc,
[follows, att_encoding_info, attachments]
[follows, att_encoding_info, attachments, revs]
)
),
Boundary = couch_uuids:random(),
Expand Down

0 comments on commit 6b0be3c

Please sign in to comment.