summaryrefslogtreecommitdiff
path: root/jstests/core/txns
diff options
context:
space:
mode:
authorA. Jesse Jiryu Davis <jesse@mongodb.com>2021-05-04 15:21:10 -0400
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2021-05-04 21:50:07 +0000
commit4aa27885874b90e098c1225fccb10f4daa3b3d38 (patch)
tree6bc40bf2aaa6e275c1644114c2c80c7b09c7d257 /jstests/core/txns
parent882fa82e21f412e6c5743e99d2d97861b28bd935 (diff)
downloadmongo-4aa27885874b90e098c1225fccb10f4daa3b3d38.tar.gz
SERVER-55614 Make API params optional for cmds in txns
Diffstat (limited to 'jstests/core/txns')
-rw-r--r--jstests/core/txns/api_params_transaction.js88
-rw-r--r--jstests/core/txns/transaction_continuing_cmds_refuse_api_params.js68
2 files changed, 88 insertions, 68 deletions
diff --git a/jstests/core/txns/api_params_transaction.js b/jstests/core/txns/api_params_transaction.js
new file mode 100644
index 00000000000..a809f8a701c
--- /dev/null
+++ b/jstests/core/txns/api_params_transaction.js
@@ -0,0 +1,88 @@
+/**
+ * Tests passing API parameters into transaction-continuing commands.
+ * @tags: [uses_transactions, requires_fcv_47]
+ */
+
+(function() {
+"use strict";
+
+load("jstests/libs/fixture_helpers.js"); // For FixtureHelpers.isMongos().
+
+const dbName = jsTestName();
+const collName = "test";
+
+const testDB = db.getSiblingDB(dbName);
+const testColl = testDB.getCollection(collName);
+
+testColl.drop({writeConcern: {w: "majority"}});
+assert.commandWorked(
+ testDB.runCommand({create: testColl.getName(), writeConcern: {w: "majority"}}));
+
+const apiParamCombos = [
+ {},
+ {apiVersion: "1"},
+ {apiVersion: "1", apiDeprecationErrors: true},
+ {apiVersion: "1", apiDeprecationErrors: false},
+ {apiVersion: "1", apiStrict: true},
+ {apiVersion: "1", apiStrict: true, apiDeprecationErrors: true},
+ {apiVersion: "1", apiStrict: true, apiDeprecationErrors: false},
+ {apiVersion: "1", apiStrict: false},
+ {apiVersion: "1", apiStrict: false, apiDeprecationErrors: true},
+ {apiVersion: "1", apiStrict: false, apiDeprecationErrors: false}
+];
+
+function addApiParams(obj, params) {
+ return Object.assign(Object.assign({}, obj), params);
+}
+
+for (const txnInitiatingParams of apiParamCombos) {
+ for (const txnContinuingParams of apiParamCombos) {
+ for (const txnEndingCmdName of ["commitTransaction", "abortTransaction"]) {
+ // TODO (SERVER-56550): Remove "!txnContinuingParams.apiVersion".
+ const compatibleParams =
+ !txnContinuingParams.apiVersion || txnContinuingParams === txnInitiatingParams;
+ const session = db.getMongo().startSession();
+ const sessionDb = session.getDatabase(dbName);
+
+ session.startTransaction();
+ assert.commandWorked(sessionDb.runCommand(
+ addApiParams({insert: collName, documents: [{}, {}, {}]}, txnInitiatingParams)));
+
+ function checkCommand(db, command) {
+ const commandWithParams = addApiParams(command, txnContinuingParams);
+ jsTestLog(`Session ${session.getSessionId().id}, ` +
+ `initial params: ${tojson(txnInitiatingParams)}, ` +
+ `continuing params: ${tojson(txnContinuingParams)}, ` +
+ `compatible: ${tojson(compatibleParams)}`);
+ jsTestLog(`Command: ${tojson(commandWithParams)}`);
+ const reply = db.runCommand(commandWithParams);
+ jsTestLog(`Reply: ${tojson(reply)}`);
+
+ if (compatibleParams) {
+ assert.commandWorked(reply);
+ } else {
+ assert.commandFailedWithCode(reply, ErrorCodes.APIMismatchError);
+ }
+ }
+
+ /*
+ * Check "insert" with API params in a transaction.
+ */
+ checkCommand(sessionDb, {insert: collName, documents: [{}]});
+
+ /*
+ * Check "commitTransaction" or "abortTransaction".
+ */
+ let txnEndingCmd = {};
+ txnEndingCmd[txnEndingCmdName] = 1;
+ Object.assign(txnEndingCmd,
+ {txnNumber: session.getTxnNumber_forTesting(), autocommit: false});
+
+ checkCommand(session.getDatabase("admin"), txnEndingCmd);
+
+ // Clean up.
+ session.abortTransaction();
+ }
+ }
+}
+})();
diff --git a/jstests/core/txns/transaction_continuing_cmds_refuse_api_params.js b/jstests/core/txns/transaction_continuing_cmds_refuse_api_params.js
deleted file mode 100644
index 2eb11d1f4c3..00000000000
--- a/jstests/core/txns/transaction_continuing_cmds_refuse_api_params.js
+++ /dev/null
@@ -1,68 +0,0 @@
-/**
- * Tests that passing API parameters into transaction-continuing commands should fail.
- * @tags: [uses_transactions, requires_fcv_47]
- */
-
-(function() {
-"use strict";
-
-load("jstests/libs/fixture_helpers.js"); // For FixtureHelpers.isMongos().
-
-const errorCode = FixtureHelpers.isMongos(db) ? 4937701 : 4937700;
-const commitTxnWithApiVersionErrorCode = FixtureHelpers.isMongos(db) ? 4937702 : 4937700;
-
-const dbName = jsTestName();
-const collName = "test";
-
-const testDB = db.getSiblingDB(dbName);
-const testColl = testDB.getCollection(collName);
-
-testColl.drop({writeConcern: {w: "majority"}});
-assert.commandWorked(
- testDB.runCommand({create: testColl.getName(), writeConcern: {w: "majority"}}));
-
-const session = db.getMongo().startSession();
-const sessionAdminDB = session.getDatabase("admin");
-const sessionDB = session.getDatabase(dbName);
-const sessionColl = sessionDB.getCollection(collName);
-
-const doc = {
- x: 1
-};
-
-session.startTransaction();
-
-// Verify that the transaction-initiating command is allowed to specify an apiVersion.
-assert.commandWorked(sessionColl.runCommand({insert: collName, documents: [doc], apiVersion: "1"}));
-
-// Verify that any transaction-continuing commands cannot specify API parameters.
-assert.commandFailedWithCode(
- sessionColl.runCommand({insert: collName, documents: [doc], apiVersion: "1"}), errorCode);
-assert.commandFailedWithCode(
- sessionColl.runCommand({insert: collName, documents: [doc], apiVersion: "1", apiStrict: false}),
- errorCode);
-assert.commandFailedWithCode(
- sessionColl.runCommand(
- {insert: collName, documents: [doc], apiVersion: "1", apiDeprecationErrors: false}),
- errorCode);
-let reply = sessionAdminDB.runCommand({
- commitTransaction: 1,
- txnNumber: session.getTxnNumber_forTesting(),
- autocommit: false,
- apiVersion: "1"
-});
-assert.commandFailedWithCode(reply, commitTxnWithApiVersionErrorCode);
-reply = sessionAdminDB.runCommand({
- abortTransaction: 1,
- txnNumber: session.getTxnNumber_forTesting(),
- autocommit: false,
- apiVersion: "1"
-});
-assert.commandFailedWithCode(reply, errorCode);
-
-// Transaction-continuing commands without API parameters are allowed.
-assert.commandWorked(sessionColl.runCommand({insert: collName, documents: [doc]}));
-
-assert.commandWorked(session.abortTransaction_forTesting());
-session.endSession();
-})();