summaryrefslogtreecommitdiff
path: root/jstests/core/administrative/validate_db_metadata_command.js
diff options
context:
space:
mode:
Diffstat (limited to 'jstests/core/administrative/validate_db_metadata_command.js')
-rw-r--r--jstests/core/administrative/validate_db_metadata_command.js138
1 files changed, 138 insertions, 0 deletions
diff --git a/jstests/core/administrative/validate_db_metadata_command.js b/jstests/core/administrative/validate_db_metadata_command.js
new file mode 100644
index 00000000000..5590dd10147
--- /dev/null
+++ b/jstests/core/administrative/validate_db_metadata_command.js
@@ -0,0 +1,138 @@
+/**
+ * Tests the validateDBMetaData commands with various input parameters.
+ * The test runs commands that are not allowed with security token: validateDBMetadata.
+ * @tags: [
+ * not_allowed_with_security_token,
+ * no_selinux,
+ * ]
+ */
+(function() {
+"use strict";
+
+load("jstests/libs/fixture_helpers.js"); // For FixtureHelpers.
+
+const dbName = jsTestName();
+
+const testDB = db.getSiblingDB(dbName);
+assert.commandWorked(testDB.dropDatabase());
+const coll1 = testDB.getCollection(jsTestName());
+const coll2 = testDB.getCollection(jsTestName() + "2");
+
+// Verify that the 'apiParameters' field is required.
+const res = assert.commandFailedWithCode(testDB.runCommand({validateDBMetadata: 1}), 40414);
+
+function validate({dbName, coll, apiStrict, error}) {
+ dbName = dbName ? dbName : null;
+ coll = coll ? coll : null;
+ const res = assert.commandWorked(testDB.runCommand({
+ validateDBMetadata: 1,
+ db: dbName,
+ collection: coll,
+ apiParameters: {version: "1", strict: apiStrict}
+ }));
+
+ assert(res.apiVersionErrors);
+ const foundError = res.apiVersionErrors.length > 0;
+
+ // Verify that 'apiVersionErrors' is not empty when 'error' is true, and vice versa.
+ assert((!error && !foundError) || (error && foundError), res);
+
+ if (error) {
+ for (let apiError of res.apiVersionErrors) {
+ assert(apiError.ns);
+ if (error.code) {
+ assert.eq(apiError.code, error.code);
+ }
+
+ if (FixtureHelpers.isMongos(testDB)) {
+ // Check that every error has an additional 'shard' field on sharded clusters.
+ assert(apiError.shard);
+ }
+ }
+ }
+}
+
+//
+// Tests for indexes.
+//
+assert.commandWorked(coll1.createIndex({p: "text"}));
+
+// All dbs but different collection name.
+validate({coll: coll2.getName(), apiStrict: true});
+
+// Different db, and collection which has unstable index should not error.
+validate({dbName: "new", coll: coll1.getName(), apiStrict: true});
+validate({
+ dbName: "new",
+ apiStrict: true,
+});
+
+// Cases where the command returns an error.
+validate({apiStrict: true, error: true});
+validate({coll: coll1.getName(), apiStrict: true, error: true});
+validate({
+ dbName: testDB.getName(),
+ coll: coll1.getName(),
+ apiStrict: true,
+ error: {code: ErrorCodes.APIStrictError}
+});
+validate({dbName: testDB.getName(), apiStrict: true, error: true});
+
+//
+// Tests for views.
+//
+assert.commandWorked(coll1.dropIndexes());
+validate({coll: coll1.getName(), apiStrict: true});
+
+// Create a view which uses unstable expression and verify that validateDBMetadata commands throws
+// an assertion.
+const viewName = jsTestName() + "view1";
+const view = testDB.createView(
+ viewName, coll2.getName(), [{$project: {v: {$_testApiVersion: {unstable: true}}}}]);
+
+validate({coll: viewName, apiStrict: true, error: true});
+validate({dbName: dbName, apiStrict: true, error: true});
+
+validate({dbName: "otherDB", apiStrict: true});
+validate({dbName: dbName, coll: coll1.getName(), apiStrict: true});
+
+// With view name in the input.
+validate({coll: viewName, apiStrict: true, error: {code: ErrorCodes.APIStrictError}});
+validate(
+ {dbName: dbName, coll: viewName, apiStrict: true, error: {code: ErrorCodes.APIStrictError}});
+
+validate({dbName: "new", coll: viewName, apiStrict: true});
+
+// Collection named same as the view name in another db.
+validate({coll: viewName, apiStrict: true, error: {code: ErrorCodes.APIStrictError}});
+
+//
+// Tests for validator.
+//
+assert.commandWorked(testDB.dropDatabase());
+
+const validatorCollName = jsTestName() + "validator";
+assert.commandWorked(testDB.createCollection(
+ validatorCollName, {validator: {$expr: {$_testApiVersion: {unstable: true}}}}));
+
+validate({dbName: testDB.getName(), apiStrict: true, error: true});
+
+// Drop the collection with validation rules. By not using the 'coll.drop()' shell helper, we can
+// avoid implicit collection creation in certain passthrough suites. This should increase the
+// coverage of this test on sharded clusters.
+assert.commandWorked(testDB.runCommand({drop: validatorCollName}));
+
+//
+// Validates the metadata across all the databases and collections after creating a time-series
+// collection if time-series collection feature flag is enabled.
+//
+(function maybeValidateWithTimeseriesCollection() {
+ const coll = "timeseriesCollectionMetaDataValidation";
+ assert.commandWorked(
+ testDB.createCollection(coll, {timeseries: {timeField: "time", metaField: "meta"}}));
+ validate({dbName: testDB.getName(), apiStrict: true});
+}());
+
+// Clean up all the data for next run.
+assert.commandWorked(testDB.dropDatabase());
+}());