summaryrefslogtreecommitdiff
path: root/jstests/replsets/find_and_modify_wc.js
blob: 236ddad1afbb1f7b5f25dca034e93e407bce4fa6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
//
// Tests writeConcerns with findAndModify command
//
(function() {
'use strict';

// Skip this test if running with the "wiredTiger" storage engine, since it requires
// using 'nojournal' in a replica set, which is not supported when using WT.
if (!jsTest.options().storageEngine || jsTest.options().storageEngine === "wiredTiger") {
    // WT is currently the default engine so it is used when 'storageEngine' is not set.
    jsTest.log("Skipping test because it is not applicable for the wiredTiger storage engine");
    return;
}

var nodeCount = 3;
var rst = new ReplSetTest({nodes: nodeCount});
rst.startSet({nojournal: ""});
rst.initiate();

var primary = rst.getPrimary();
var coll = primary.getCollection("test.find_and_modify_wc");
coll.remove({});

// insert some documents
var docs = [];
for (var i = 1; i <= 5; ++i) {
    docs.push({i: i, j: 2 * i});
}
var res = coll.runCommand({insert: coll.getName(), documents: docs, writeConcern: {w: nodeCount}});
assert(res.ok);
assert.eq(5, coll.find().itcount());

// use for updates in subsequent runCommand calls
var reqUpdate = {
    findAndModify: coll.getName(),
    query: {i: 3},
    update: {$inc: {j: 1}},
    writeConcern: {w: 'majority'}
};

// Verify findAndModify returns old document new: false
var res = coll.runCommand(reqUpdate);
assert(res.ok);
assert(res.value);
// (2 * res.value.i) == 6 == res.value.j (old document)
assert.eq(2 * res.value.i, res.value.j);
assert(!res.writeConcernError);

// Verify findAndModify returns new document with new: true
reqUpdate.new = true;
res = coll.runCommand(reqUpdate);
assert(res.ok);
assert(res.value);
// (2 * res.value.i + 2) == 8 == res.value.j (new document after two updates)
assert.eq(2 * res.value.i + 2, res.value.j);
assert(!res.writeConcernError);

// Verify findAndModify remove works
res = coll.runCommand(
    {findAndModify: coll.getName(), sort: {i: 1}, remove: true, writeConcern: {w: nodeCount}});
assert.eq(res.value.i, 1);
assert.eq(coll.find().itcount(), 4);
assert(!res.writeConcernError);

// Verify findAndModify returns writeConcernError
// when given invalid writeConcerns
[{w: 'invalid'}, {w: nodeCount + 1}].forEach(function(wc) {
    reqUpdate.writeConcern = wc;
    res = coll.runCommand(reqUpdate);

    assert(res.writeConcernError);
    assert(res.writeConcernError.code);
    assert(res.writeConcernError.errmsg);
});

rst.stopSet();
})();