summaryrefslogtreecommitdiff
path: root/jstests/core/administrative/profile/profile1.js
diff options
context:
space:
mode:
Diffstat (limited to 'jstests/core/administrative/profile/profile1.js')
-rw-r--r--jstests/core/administrative/profile/profile1.js116
1 files changed, 116 insertions, 0 deletions
diff --git a/jstests/core/administrative/profile/profile1.js b/jstests/core/administrative/profile/profile1.js
new file mode 100644
index 00000000000..d42b49b050c
--- /dev/null
+++ b/jstests/core/administrative/profile/profile1.js
@@ -0,0 +1,116 @@
+// The test runs commands that are not allowed with security token: createUser, dropUser,
+// logout, profile, setProfilingLevel.
+// @tags: [
+// not_allowed_with_security_token,
+// assumes_superuser_permissions,
+// creates_and_authenticates_user,
+// does_not_support_stepdowns,
+// requires_capped,
+// requires_collstats,
+// requires_non_retryable_commands,
+// requires_profiling,
+// # This test depends on hardcoded database name equality.
+// tenant_migration_incompatible,
+// # This test depends on the strict argument since 6.1.
+// requires_fcv_61,
+// ]
+
+// function argument overwritten won't affect original value and it can be run in parallel tests
+(function(db) {
+"use strict";
+function profileCursor(query) {
+ query = query || {};
+ Object.extend(query, {user: username + "@" + db.getName()});
+ return db.system.profile.find(query);
+}
+
+function resetProfile(level, slowms) {
+ db.setProfilingLevel(0);
+ db.system.profile.drop();
+ db.setProfilingLevel(level, slowms);
+}
+
+db = db.getSiblingDB("profile1");
+var username = "jstests_profile1_user";
+
+db.dropUser(username);
+db.dropDatabase();
+
+try {
+ db.createUser({user: username, pwd: "password", roles: jsTest.basicUserRoles});
+
+ db.logout();
+ db.auth(username, "password");
+
+ // expect error given unrecognized options
+ assert.commandFailedWithCode(db.runCommand({profile: 0, unknown: {}}),
+ 40415 /* IDL unknown field error */,
+ "Expected IDL to reject unknown field for profile command.");
+
+ // With pre-created system.profile (capped)
+ db.runCommand({profile: 0});
+ db.getCollection("system.profile").drop();
+ assert.eq(0, db.runCommand({profile: -1}).was, "A");
+
+ // Create 32MB profile (capped) collection
+ db.system.profile.drop();
+ db.createCollection("system.profile", {capped: true, size: 32 * 1024 * 1024});
+ db.runCommand({profile: 2});
+ assert.eq(2, db.runCommand({profile: -1}).was, "B");
+ assert.eq(1, db.system.profile.stats().capped, "C");
+
+ db.foo.findOne();
+
+ var profileItems = profileCursor().toArray();
+
+ // create a msg for later if there is a failure.
+ var msg = "";
+ profileItems.forEach(function(d) {
+ msg += "profile doc: " + d.ns + " " + d.op + " " + tojson(d.query ? d.query : d.command) +
+ '\n';
+ });
+ msg += tojson(db.system.profile.stats());
+
+ // If these nunmbers don't match, it is possible the collection has rolled over
+ // (set to 32MB above in the hope this doesn't happen)
+ assert.eq(2, profileItems.length, "E2 -- " + msg);
+
+ // Make sure we can't drop if profiling is still on
+ assert.throws(function(z) {
+ db.getCollection("system.profile").drop();
+ });
+
+ // With pre-created system.profile (un-capped)
+ db.runCommand({profile: 0});
+ db.getCollection("system.profile").drop();
+ assert.eq(0, db.runCommand({profile: -1}).was, "F");
+
+ db.createCollection("system.profile");
+ assert.eq(0, db.runCommand({profile: 2}).ok);
+ assert.eq(0, db.runCommand({profile: -1}).was, "G");
+ assert(!db.system.profile.stats().capped, "G1");
+
+ // With no system.profile collection
+ db.runCommand({profile: 0});
+ db.getCollection("system.profile").drop();
+ assert.eq(0, db.runCommand({profile: -1}).was, "H");
+
+ db.runCommand({profile: 2});
+ assert.eq(2, db.runCommand({profile: -1}).was, "I");
+ assert.eq(1, db.system.profile.stats().capped, "J");
+
+ resetProfile(2);
+ db.profile1.drop();
+ var q = {_id: 5};
+ var u = {$inc: {x: 1}};
+ db.profile1.update(q, u);
+ var r = profileCursor({ns: db.profile1.getFullName()}).sort({$natural: -1})[0];
+ assert.eq({q: q, u: u, multi: false, upsert: false}, r.command, tojson(r));
+ assert.eq("update", r.op, tojson(r));
+ assert.eq("profile1.profile1", r.ns, tojson(r));
+} finally {
+ // disable profiling for subsequent tests
+ assert.commandWorked(db.runCommand({profile: 0}));
+ db.logout();
+}
+}(db));