mongo/jstests/replsets/test_command.js

134 lines
3.5 KiB
JavaScript

// Tests 'replSetTest' command:
// waitForMemberState - waits for node's state to become 'expectedState'.
import {ReplSetTest} from "jstests/libs/replsettest.js";
let name = "test_command";
let replSet = new ReplSetTest({name: name, nodes: 3});
let nodes = replSet.nodeList();
replSet.startSet();
replSet.initiate({
_id: name,
members: [
{_id: 0, host: nodes[0], priority: 3},
{_id: 1, host: nodes[1]},
{_id: 2, host: nodes[2], arbiterOnly: true},
],
});
// Stabilize replica set with node 0 as primary.
assert.commandWorked(
replSet.nodes[0].adminCommand({
replSetTest: 1,
waitForMemberState: ReplSetTest.State.PRIMARY,
timeoutMillis: 60 * 1000,
}),
"node 0" + replSet.nodes[0].host + " failed to become primary",
);
// We need the try/catch to handle that the node may have hung up the connection due
// to a state change.
try {
assert.commandWorked(
replSet.nodes[1].adminCommand({
replSetTest: 1,
waitForMemberState: ReplSetTest.State.SECONDARY,
timeoutMillis: 60 * 1000,
}),
);
} catch (e) {
jsTestLog(e);
assert.commandWorked(
replSet.nodes[1].adminCommand({
replSetTest: 1,
waitForMemberState: ReplSetTest.State.SECONDARY,
timeoutMillis: 60 * 1000,
}),
"node 1" + replSet.nodes[1].host + " failed to become secondary",
);
}
let primary = replSet.getPrimary();
let secondary = replSet.getSecondary();
// Check replication mode.
assert.commandFailedWithCode(
primary.getDB(name).runCommand({
replSetTest: 1,
}),
ErrorCodes.Unauthorized,
"replSetTest should fail against non-admin database",
);
assert.commandWorked(
primary.adminCommand({
replSetTest: 1,
}),
"failed to check replication mode",
);
// waitForMemberState tests.
assert.commandFailedWithCode(
primary.adminCommand({
replSetTest: 1,
waitForMemberState: "what state",
timeoutMillis: 1000,
}),
ErrorCodes.TypeMismatch,
"replSetTest waitForMemberState should fail on non-numerical state",
);
assert.commandFailedWithCode(
primary.adminCommand({
replSetTest: 1,
waitForMemberState: ReplSetTest.State.PRIMARY,
timeoutMillis: "what timeout",
}),
ErrorCodes.TypeMismatch,
"replSetTest waitForMemberState should fail on non-numerical timeout",
);
assert.commandFailedWithCode(
primary.adminCommand({
replSetTest: 1,
waitForMemberState: 9999,
timeoutMillis: 1000,
}),
ErrorCodes.BadValue,
"replSetTest waitForMemberState should fail on invalid state",
);
assert.commandFailedWithCode(
primary.adminCommand({
replSetTest: 1,
waitForMemberState: ReplSetTest.State.PRIMARY,
timeoutMillis: -1000,
}),
ErrorCodes.BadValue,
"replSetTest waitForMemberState should fail on negative timeout",
);
assert.commandFailedWithCode(
primary.adminCommand({
replSetTest: 1,
waitForMemberState: ReplSetTest.State.SECONDARY,
timeoutMillis: 1000,
}),
ErrorCodes.ExceededTimeLimit,
"replSetTest waitForMemberState(SECONDARY) should time out on node 0 " + primary.host,
);
assert.commandWorked(
secondary.adminCommand({
replSetTest: 1,
waitForMemberState: ReplSetTest.State.SECONDARY,
timeoutMillis: 1000,
}),
"replSetTest waitForMemberState(SECONDARY) failed on node 1 " + secondary.host,
);
replSet.stopSet();