mongo/jstests/multiVersion/genericBinVersion/server-security/fle2_text_search_preview.js
2026-04-21 22:04:54 +00:00

84 lines
3.0 KiB
JavaScript

/**
* Test downgrade to incompatible versions is blocked if substringPreview,
* suffixPreview, or prefixPreview query types are being used in a FLE2 collection.
*/
import "jstests/multiVersion/libs/multi_rs.js";
import {EncryptedClient} from "jstests/fle2/libs/encrypted_client_util.js";
import {PrefixField, SubstringField, SuffixAndPrefixField, SuffixField} from "jstests/fle2/libs/qe_text_search_util.js";
import {ReplSetTest} from "jstests/libs/replsettest.js";
const dbName = "qe_text_downgrade_test";
// TODO: SERVER-123416 test downgrade also prevented by the existence of non-preview types.
const forcePreview = true;
const substrField = new SubstringField(20, 2, 10, false, false, 1, forcePreview);
const suffixField = new SuffixField(2, 5, true, false, 1, forcePreview);
const prefixField = new PrefixField(2, 5, false, true, 1, forcePreview);
const comboField = new SuffixAndPrefixField(2, 5, 2, 5, false, false, 1, forcePreview);
function testBinaryDowngrade(queryTypeConfig) {
jsTestLog("Testing downgrade from latest to last-lts");
const rst = new ReplSetTest({nodes: 2});
rst.startSet();
rst.initiate();
const conn = rst.getPrimary();
const client = new EncryptedClient(conn, dbName);
const edb = client.getDB();
const adminDB = conn.getDB("admin");
assert.commandWorked(
client.createEncryptionCollection("basic_equality_and_range", {
encryptedFields: {
"fields": [
{path: "first", bsonType: "string", queries: {queryType: "equality"}},
{
path: "second",
bsonType: "int",
queries: {queryType: "range", sparsity: 1, trimFactor: 0},
},
],
},
}),
);
assert.commandWorked(
client.createEncryptionCollection("basic_text", {
encryptedFields: {
"fields": [
{
path: "first",
bsonType: "string",
queries: queryTypeConfig.createQueryTypeDescriptor(),
},
],
},
}),
);
// Downgrade should fail because of basic_text
assert.commandFailedWithCode(
adminDB.runCommand({setFeatureCompatibilityVersion: lastLTSFCV, confirm: true, writeConcern: {w: 1}}),
ErrorCodes.CannotDowngrade,
);
// Drop basic_text
edb.basic_text.drop();
assert.commandWorked(
adminDB.runCommand({setFeatureCompatibilityVersion: lastLTSFCV, confirm: true, writeConcern: {w: 1}}),
);
// Downgrade should now succeed
jsTestLog("Starting binary downgrade to last LTS");
rst.upgradeSet({binVersion: "last-lts", setParameter: {}});
jsTestLog("Finished binary downgrade to last LTS");
rst.stopSet();
}
testBinaryDowngrade(substrField);
testBinaryDowngrade(suffixField);
testBinaryDowngrade(prefixField);
testBinaryDowngrade(comboField);