summaryrefslogtreecommitdiff
path: root/src/mongo/gotools/test/qa-tests/jstests/libs/wc_framework.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/gotools/test/qa-tests/jstests/libs/wc_framework.js')
-rw-r--r--src/mongo/gotools/test/qa-tests/jstests/libs/wc_framework.js72
1 files changed, 72 insertions, 0 deletions
diff --git a/src/mongo/gotools/test/qa-tests/jstests/libs/wc_framework.js b/src/mongo/gotools/test/qa-tests/jstests/libs/wc_framework.js
new file mode 100644
index 00000000000..51670f520eb
--- /dev/null
+++ b/src/mongo/gotools/test/qa-tests/jstests/libs/wc_framework.js
@@ -0,0 +1,72 @@
+// runWCTest executes a tool against a number of configurations. A given replica set will have nodes prevented
+// from replicating and the tool should either pass or fail based on the supplied write concern. As a final test,
+// the tools is run with w:3, and waits for all three nodes to come back online, simulating a slowly-replicated write.
+var runWCTest = function runWCTest(progName, rs, toolTest, testWriteConcern, testProgramNoConnect) {
+ jsTest.log("testing that "+progName+" deals with write concern");
+
+ function windowsEscape(json) {
+ if (_isWindows()) {
+ json = '"' + json.replace(/"/g, '\\"') + '"';
+ }
+ return json;
+ }
+
+ // grab the two secondary nodes
+ var masterPort = rs.getPrimary().port;
+ var members = [];
+ var ports = [];
+ for (var i = 0; i < rs.nodes.length; i++) {
+ if (rs.nodes[i].port !== masterPort) {
+ members.push(rs.nodes[i].getDB("admin"));
+ ports.push(rs.nodes[i].port);
+ }
+ }
+ var member1 = members[0];
+ var member2 = members[1];
+
+ testWriteConcern(0, [], progName+" without write concern to a fully functioning repl-set should succeed");
+
+ testWriteConcern(0, ['--writeConcern=majority'], progName+" with majority to a fully functioning repl-set should succeed");
+
+ testWriteConcern(0, ['--writeConcern={w:1,wtimeout:10000}'], progName+" with w:1,timeout:10000 to a fully functioning repl-set should succeed");
+
+ testWriteConcern(0, ['--writeConcern={w:2,wtimeout:10000}'], progName+" with w:2,timeout:10000 to a fully functioning repl-set should succeed");
+
+ jsTest.log("stopping node on port " + ports[0] + " from doing any further syncing");
+ member1.runCommand({configureFailPoint: 'rsSyncApplyStop', mode: 'alwaysOn'});
+ sleep(2000);
+
+ testWriteConcern(0, ['--writeConcern={w:1,wtimeout:10000}'], progName+" with w:1,timeout:10000 repl-set with 2 working nodes should succeed");
+
+ testWriteConcern(0, ['--writeConcern={w:2,wtimeout:10000}'], progName+" with w:2,timeout:10000 repl-set with 2 working nodes should succeed");
+
+ testWriteConcern(0, ['--writeConcern=majority'], progName+" with majority with two working nodes should succeed");
+
+ testWriteConcern(1, ['--writeConcern={w:3,wtimeout:2000}'], progName+" with w:3,timeout:2000 repl-set with two working nodes should fail");
+
+ jsTest.log("stopping second node on port " + ports[1] + " from doing any further syncing");
+ member2.runCommand({configureFailPoint: 'rsSyncApplyStop', mode: 'alwaysOn'});
+ sleep(2000);
+
+ testWriteConcern(1, [windowsEscape('--writeConcern={w:"majority",wtimeout:2000}')], progName+" with majority with one working node should fail");
+
+ testWriteConcern(1, ['--writeConcern={w:2,wtimeout:10000}'], progName+" with w:2,timeout:10000 with one working node should fail");
+
+ testWriteConcern(0, ['--writeConcern={w:1,wtimeout:10000}'], progName+" with w:1,timeout:10000 repl-set with one working nodes should succeed");
+
+ jsTest.log(progName+" with w:3 concern and no working member and no timeout waits until member are available");
+ pid = testProgramNoConnect();
+
+ sleep(2000);
+
+ assert(checkProgram(pid), progName+" with w:3 and no working members should not have finished");
+
+ jsTest.log("starting stopped members");
+
+ member1.runCommand({configureFailPoint: 'rsSyncApplyStop', mode: 'off'});
+ member2.runCommand({configureFailPoint: 'rsSyncApplyStop', mode: 'off'});
+
+ jsTest.log("waiting for "+progName+" to finish");
+ ret = waitProgram(pid);
+ assert.eq(0, ret, progName+" with w:3 should succeed once enough members start working");
+};