diff options
author | Jason Carey <jcarey@argv.me> | 2019-01-25 12:54:45 -0500 |
---|---|---|
committer | Jason Carey <jcarey@argv.me> | 2019-02-04 14:49:52 -0500 |
commit | 8c157f05ea25f13595734b03b3c5b55cd16d7cd6 (patch) | |
tree | 27cbb691e3cf0dbc014be24eccbbae6f4f269280 /jstests/noPassthrough/traffic_reading.js | |
parent | 1b1cf52e94c49ca4c6d8ba693e949c2b655e74b5 (diff) | |
download | mongo-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.js | 81 |
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); + +})(); |