summaryrefslogtreecommitdiff
path: root/jstests/noPassthrough/traffic_reading.js
diff options
context:
space:
mode:
authorJason Carey <jcarey@argv.me>2019-01-25 12:54:45 -0500
committerJason Carey <jcarey@argv.me>2019-02-04 14:49:52 -0500
commit8c157f05ea25f13595734b03b3c5b55cd16d7cd6 (patch)
tree27cbb691e3cf0dbc014be24eccbbae6f4f269280 /jstests/noPassthrough/traffic_reading.js
parent1b1cf52e94c49ca4c6d8ba693e949c2b655e74b5 (diff)
downloadmongo-8c157f05ea25f13595734b03b3c5b55cd16d7cd6.tar.gz
SERVER-37823 Server Side Traffic Capture
Adds support for special commands which dump wire protocol traffic to disk.
Diffstat (limited to 'jstests/noPassthrough/traffic_reading.js')
-rw-r--r--jstests/noPassthrough/traffic_reading.js81
1 files changed, 81 insertions, 0 deletions
diff --git a/jstests/noPassthrough/traffic_reading.js b/jstests/noPassthrough/traffic_reading.js
new file mode 100644
index 00000000000..18642f03be4
--- /dev/null
+++ b/jstests/noPassthrough/traffic_reading.js
@@ -0,0 +1,81 @@
+// tests for the traffic_recording commands.
+(function() {
+ // Variables for this test
+ const recordingDir = MongoRunner.toRealDir("$dataDir/traffic_recording/");
+ const recordingFile = "recording.txt";
+ const recordingFilePath = MongoRunner.toRealDir(recordingDir + "/" + recordingFile);
+ const replayFilePath = MongoRunner.toRealDir(recordingDir + "/replay.txt");
+
+ // Create the recording directory if it does not already exist
+ mkdir(recordingDir);
+
+ // Create the options and run mongod
+ var opts = {auth: "", setParameter: "trafficRecordingDirectory=" + recordingDir};
+ m = MongoRunner.runMongod(opts);
+
+ // Get the port of the host
+ var serverPort = m.port;
+
+ // Create necessary users
+ adminDB = m.getDB("admin");
+ const testDB = m.getDB("test");
+ const coll = testDB.getCollection("foo");
+ adminDB.createUser({user: "admin", pwd: "pass", roles: jsTest.adminUserRoles});
+ adminDB.auth("admin", "pass");
+
+ // Start recording traffic
+ assert.commandWorked(
+ adminDB.runCommand({'startRecordingTraffic': 1, 'filename': 'recording.txt'}));
+
+ // Run a few commands
+ assert.commandWorked(testDB.runCommand({"serverStatus": 1}));
+ assert.commandWorked(coll.insert({"name": "foo biz bar"}));
+ assert.eq("foo biz bar", coll.findOne().name);
+ assert.commandWorked(coll.insert({"name": "foo bar"}));
+ assert.eq("foo bar", coll.findOne({"name": "foo bar"}).name);
+ assert.commandWorked(coll.deleteOne({}));
+ assert.eq(1, coll.aggregate().toArray().length);
+ assert.commandWorked(coll.update({}, {}));
+
+ // Stop recording traffic
+ assert.commandWorked(testDB.runCommand({'stopRecordingTraffic': 1}));
+
+ // Shutdown Mongod
+ MongoRunner.stopMongod(m, null, {user: 'admin', pwd: 'password'});
+
+ // Counters
+ var numRequest = 0;
+ var numResponse = 0;
+ var opTypes = {};
+
+ // Pass filepath to traffic_reader helper method to get recorded info in BSON
+ var res = convertTrafficRecordingToBSON(recordingFilePath);
+
+ // Iterate through the results and assert the above commands are properly recorded
+ res.forEach((obj) => {
+ assert.eq(obj["rawop"]["header"]["opcode"], 2013);
+ assert.eq(obj["seenconnectionnum"], 1);
+ var responseTo = obj["rawop"]["header"]["responseto"];
+ if (responseTo == 0) {
+ assert.eq(obj["destendpoint"], serverPort.toString());
+ numRequest++;
+ } else {
+ assert.eq(obj["srcendpoint"], serverPort.toString());
+ numResponse++;
+ }
+ opTypes[obj["opType"]] = (opTypes[obj["opType"]] || 0) + 1;
+ });
+
+ // Assert there is a response for every request
+ assert.eq(numResponse, numRequest);
+
+ // Assert the opTypes were correct
+ assert.eq(opTypes['isMaster'], opTypes["ismaster"]);
+ assert.eq(opTypes['find'], 2);
+ assert.eq(opTypes['insert'], 2);
+ assert.eq(opTypes['delete'], 1);
+ assert.eq(opTypes['update'], 1);
+ assert.eq(opTypes['aggregate'], 1);
+ assert.eq(opTypes['stopRecordingTraffic'], 1);
+
+})();