summaryrefslogtreecommitdiff
path: root/jstests/noPassthrough/traffic_reading.js
blob: aa29d360387e8630d523d07c5748f8d6f5f15cc2 (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
78
79
80
81
82
83
// 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");

assert.throws(function() {
    convertTrafficRecordingToBSON("notarealfileatall");
});

// 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);
})();