mirror of
https://github.com/mongodb/mongo.git
synced 2024-11-30 17:10:48 +01:00
174 lines
4.8 KiB
JavaScript
174 lines
4.8 KiB
JavaScript
/**
|
|
* This file tests that commands that should accept a writeConcern on a standalone can accept one.
|
|
* This does not test that writes with j: true are actually made durable or that if j: true fails
|
|
* that there is a writeConcern error.
|
|
* @tags: [requires_journaling]
|
|
*/
|
|
|
|
(function() {
|
|
"use strict";
|
|
var collName = 'leaves';
|
|
var coll = db[collName];
|
|
|
|
var commands = [];
|
|
|
|
commands.push({
|
|
req: {insert: collName, documents: [{type: 'maple'}]},
|
|
setupFunc: function() {},
|
|
confirmFunc: function() {
|
|
assert.eq(coll.count({type: 'maple'}), 1);
|
|
}
|
|
});
|
|
|
|
commands.push({
|
|
req: {createIndexes: collName, indexes: [{key: {'type': 1}, name: 'type_index'}]},
|
|
setupFunc: function() {
|
|
coll.insert({type: 'oak'});
|
|
assert.eq(coll.getIndexes().length, 1);
|
|
},
|
|
confirmFunc: function() {
|
|
assert.eq(coll.getIndexes().length, 2);
|
|
}
|
|
});
|
|
|
|
commands.push({
|
|
req: {
|
|
update: collName,
|
|
updates: [{
|
|
q: {type: 'oak'},
|
|
u: [{$set: {type: 'ginkgo'}}],
|
|
}],
|
|
writeConcern: {w: 'majority'}
|
|
},
|
|
setupFunc: function() {
|
|
coll.insert({type: 'oak'});
|
|
assert.eq(coll.count({type: 'ginkgo'}), 0);
|
|
assert.eq(coll.count({type: 'oak'}), 1);
|
|
},
|
|
confirmFunc: function() {
|
|
assert.eq(coll.count({type: 'ginkgo'}), 1);
|
|
assert.eq(coll.count({type: 'oak'}), 0);
|
|
}
|
|
});
|
|
|
|
commands.push({
|
|
req: {
|
|
findAndModify: collName,
|
|
query: {type: 'oak'},
|
|
update: {$set: {type: 'ginkgo'}},
|
|
writeConcern: {w: 'majority'}
|
|
},
|
|
setupFunc: function() {
|
|
coll.insert({type: 'oak'});
|
|
assert.eq(coll.count({type: 'ginkgo'}), 0);
|
|
assert.eq(coll.count({type: 'oak'}), 1);
|
|
},
|
|
confirmFunc: function() {
|
|
assert.eq(coll.count({type: 'ginkgo'}), 1);
|
|
assert.eq(coll.count({type: 'oak'}), 0);
|
|
}
|
|
});
|
|
|
|
commands.push({
|
|
req: {
|
|
findAndModify: collName,
|
|
query: {type: 'oak'},
|
|
update: [{$set: {type: 'ginkgo'}}],
|
|
writeConcern: {w: 'majority'}
|
|
},
|
|
setupFunc: function() {
|
|
coll.insert({type: 'oak'});
|
|
assert.eq(coll.count({type: 'ginkgo'}), 0);
|
|
assert.eq(coll.count({type: 'oak'}), 1);
|
|
},
|
|
confirmFunc: function() {
|
|
assert.eq(coll.count({type: 'ginkgo'}), 1);
|
|
assert.eq(coll.count({type: 'oak'}), 0);
|
|
}
|
|
});
|
|
|
|
commands.push({
|
|
req: {applyOps: [{op: "i", ns: coll.getFullName(), o: {_id: 1, type: "willow"}}]},
|
|
setupFunc: function() {
|
|
coll.insert({_id: 1, type: 'oak'});
|
|
assert.eq(coll.count({type: 'willow'}), 0);
|
|
},
|
|
confirmFunc: function() {
|
|
assert.eq(coll.count({type: 'willow'}), 1);
|
|
}
|
|
});
|
|
|
|
commands.push({
|
|
req: {aggregate: collName, pipeline: [{$sort: {type: 1}}, {$out: "foo"}], cursor: {}},
|
|
setupFunc: function() {
|
|
coll.insert({_id: 1, type: 'oak'});
|
|
coll.insert({_id: 2, type: 'maple'});
|
|
},
|
|
confirmFunc: function() {
|
|
assert.eq(db.foo.count({type: 'oak'}), 1);
|
|
assert.eq(db.foo.count({type: 'maple'}), 1);
|
|
db.foo.drop();
|
|
}
|
|
});
|
|
|
|
commands.push({
|
|
req: {
|
|
mapReduce: collName,
|
|
map: function() {
|
|
this.tags.forEach(function(z) {
|
|
emit(z, 1);
|
|
});
|
|
},
|
|
reduce: function(key, values) {
|
|
return {count: values.length};
|
|
},
|
|
out: "foo"
|
|
},
|
|
setupFunc: function() {
|
|
coll.insert({x: 1, tags: ["a", "b"]});
|
|
coll.insert({x: 2, tags: ["b", "c"]});
|
|
coll.insert({x: 3, tags: ["c", "a"]});
|
|
coll.insert({x: 4, tags: ["b", "c"]});
|
|
},
|
|
confirmFunc: function() {
|
|
assert.eq(db.foo.findOne({_id: 'a'}).value.count, 2);
|
|
assert.eq(db.foo.findOne({_id: 'b'}).value.count, 3);
|
|
assert.eq(db.foo.findOne({_id: 'c'}).value.count, 3);
|
|
db.foo.drop();
|
|
}
|
|
});
|
|
|
|
function testValidWriteConcern(cmd) {
|
|
cmd.req.writeConcern = {w: 1, j: true};
|
|
jsTest.log("Testing " + tojson(cmd.req));
|
|
|
|
coll.drop();
|
|
cmd.setupFunc();
|
|
var res = db.runCommand(cmd.req);
|
|
assert.commandWorked(res);
|
|
assert(!res.writeConcernError, 'command had writeConcernError: ' + tojson(res));
|
|
cmd.confirmFunc();
|
|
}
|
|
|
|
function testInvalidWriteConcern(wc, cmd) {
|
|
cmd.req.writeConcern = wc;
|
|
jsTest.log("Testing " + tojson(cmd.req));
|
|
|
|
coll.drop();
|
|
cmd.setupFunc();
|
|
var res = coll.runCommand(cmd.req);
|
|
// These commands should fail because standalone writeConcerns are found to be invalid at
|
|
// the validation stage when the writeConcern is parsed, before the command is run.
|
|
assert.commandFailed(res);
|
|
}
|
|
|
|
var invalidWriteConcerns = [{w: 'invalid'}, {w: 2}, {j: 'invalid'}];
|
|
|
|
commands.forEach(function(cmd) {
|
|
testValidWriteConcern(cmd);
|
|
invalidWriteConcerns.forEach(function(wc) {
|
|
testInvalidWriteConcern(wc, cmd);
|
|
});
|
|
});
|
|
})();
|