summaryrefslogtreecommitdiff
path: root/src/mongo/gotools/src/github.com/mongodb/mongo-tools/test/qa-tests/jstests/libs/mongostat.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/gotools/src/github.com/mongodb/mongo-tools/test/qa-tests/jstests/libs/mongostat.js')
-rw-r--r--src/mongo/gotools/src/github.com/mongodb/mongo-tools/test/qa-tests/jstests/libs/mongostat.js114
1 files changed, 114 insertions, 0 deletions
diff --git a/src/mongo/gotools/src/github.com/mongodb/mongo-tools/test/qa-tests/jstests/libs/mongostat.js b/src/mongo/gotools/src/github.com/mongodb/mongo-tools/test/qa-tests/jstests/libs/mongostat.js
new file mode 100644
index 00000000000..91b5c6f36fb
--- /dev/null
+++ b/src/mongo/gotools/src/github.com/mongodb/mongo-tools/test/qa-tests/jstests/libs/mongostat.js
@@ -0,0 +1,114 @@
+var exitCodeSuccess = 0;
+var exitCodeErr = 1;
+// Go reserves exit code 2 for its own use.
+var exitCodeBadOptions = 3;
+var exitCodeStopped = 4;
+
+// NOTE: On Windows, stopMongoProgramByPid doesn't terminiate a process in a
+// way that it can control its exit code.
+if (_isWindows()) {
+ exitCodeStopped = exitCodeErr;
+}
+
+var rowRegex = /^sh\d+\|\s/;
+// portRegex finds the port on a line which has enough whitespace-delimited
+// values to be considered a stat line and not an error message
+var portRegex = /^sh\d+\|\s+\S+:(\d+)(\s+\S+){16}/;
+
+function statRows() {
+ return rawMongoProgramOutput()
+ .split("\n")
+ .filter(function(r) {
+ return r.match(rowRegex);
+ })
+ .map(function(r) {
+ return r.replace(/^sh\d+\| /, "");
+ });
+}
+
+function statFields(row) {
+ return row.split(/\s/).filter(function(s) {
+ return s !== "";
+ });
+}
+
+function getLatestChunk() {
+ var output = rawMongoProgramOutput();
+ // mongostat outputs a blank line between each set of stats when there are
+ // multiple hosts; we want just one chunk of stat lines
+ var lineChunks = output.split("| \n");
+ if (lineChunks.length === 1) {
+ return lineChunks[0];
+ }
+ return lineChunks[lineChunks.length - 2];
+}
+
+function latestPortCounts() {
+ var portCounts = {};
+ getLatestChunk().split("\n").forEach(function(r) {
+ var matches = r.match(portRegex);
+ if (matches === null) {
+ return;
+ }
+ var port = matches[1];
+ if (!portCounts[port]) {
+ portCounts[port] = 0;
+ }
+ portCounts[port]++;
+ });
+ return portCounts;
+}
+
+function hasPort(port) {
+ port = String(port);
+ return function() {
+ return latestPortCounts()[port] >= 1;
+ };
+}
+
+function lacksPort(port) {
+ port = String(port);
+ return function() {
+ return latestPortCounts()[port] === undefined;
+ };
+}
+
+function hasOnlyPorts(expectedPorts) {
+ expectedPorts = expectedPorts.map(String);
+ return function() {
+ var portCounts = latestPortCounts();
+ for (var port in portCounts) {
+ if (expectedPorts.indexOf(port) === -1) {
+ return false;
+ }
+ }
+ for (var i in expectedPorts) {
+ if (portCounts[expectedPorts[i]] !== 1) {
+ return false;
+ }
+ }
+ return true;
+ };
+}
+
+function statCheck(args, checker) {
+ clearRawMongoProgramOutput();
+ pid = startMongoProgramNoConnect.apply(null, args);
+ try {
+ assert.soon(checker, "discoverTest wait timed out");
+ return true;
+ } catch (e) {
+ return false;
+ } finally {
+ stopMongoProgramByPid(pid);
+ }
+}
+
+function discoverTest(ports, connectHost) {
+ return statCheck(["mongostat",
+ "--host", connectHost,
+ "--noheaders",
+ "--discover"],
+ hasOnlyPorts(ports));
+}
+