// Basic js tests for the collMod command. // Test setting the usePowerOf2Sizes flag, and modifying TTL indexes. function debug(x) { // printjson( x ); } var coll = "collModTest"; var t = db.getCollection(coll); t.drop(); db.createCollection(coll); // Verify the new collection has userFlags set to 1 printjson(t.stats()); assert.eq(t.stats().userFlags, 1, "fresh collection doesn't have userFlags = 1 "); // Modify the collection with the usePowerOf2Sizes flag. Verify userFlags now = 0. var res = db.runCommand({"collMod": coll, "usePowerOf2Sizes": false}); debug(res); assert.eq(res.ok, 1, "collMod failed"); assert.eq(t.stats().userFlags, 0, "modified collection should have userFlags = 0 "); var nso = db.system.namespaces.findOne({name: t.getFullName()}); debug(nso); assert.eq(0, nso.options.flags, "options didn't sync to system.namespaces: " + tojson(nso)); // Try to modify it with some unrecognized value var res = db.runCommand({"collMod": coll, "unrecognized": true}); debug(res); assert.eq(res.ok, 0, "collMod shouldn't return ok with unrecognized value"); // add a TTL index t.ensureIndex({a: 1}, {"expireAfterSeconds": 50}); assert.eq(1, db.system.indexes.count({key: {a: 1}, expireAfterSeconds: 50}), "TTL index not added"); // try to modify it with a bad key pattern var res = db.runCommand({"collMod": coll, "index": {"keyPattern": "bad", "expireAfterSeconds": 100}}); debug(res); assert.eq(0, res.ok, "mod shouldn't work with bad keypattern"); // try to modify it without expireAfterSeconds field var res = db.runCommand({"collMod": coll, "index": {"keyPattern": {a: 1}}}); debug(res); assert.eq(0, res.ok, "TTL mod shouldn't work without expireAfterSeconds"); // try to modify it with a non-numeric expireAfterSeconds field var res = db.runCommand({"collMod": coll, "index": {"keyPattern": {a: 1}, "expireAfterSeconds": "100"}}); debug(res); assert.eq(0, res.ok, "TTL mod shouldn't work with non-numeric expireAfterSeconds"); // this time modifying should finally work var res = db.runCommand({"collMod": coll, "index": {"keyPattern": {a: 1}, "expireAfterSeconds": 100}}); debug(res); assert.eq( 1, db.system.indexes.count({key: {a: 1}, expireAfterSeconds: 100}), "TTL index not modified"); // try to modify a faulty TTL index with a non-numeric expireAfterSeconds field t.dropIndex({a: 1}); t.ensureIndex({a: 1}, {"expireAfterSeconds": "50"}); var res = db.runCommand({"collMod": coll, "index": {"keyPattern": {a: 1}, "expireAfterSeconds": 100}}); debug(res); assert.eq(0, res.ok, "shouldn't be able to modify faulty index spec"); // try with new index, this time set both expireAfterSeconds and the usePowerOf2Sizes flag t.dropIndex({a: 1}); t.ensureIndex({a: 1}, {"expireAfterSeconds": 50}); var res = db.runCommand({ "collMod": coll, "usePowerOf2Sizes": true, "index": {"keyPattern": {a: 1}, "expireAfterSeconds": 100} }); debug(res); assert.eq(1, res.ok, "should be able to modify both userFlags and expireAfterSeconds"); assert.eq(t.stats().userFlags, 1, "userflags should be 1 now"); assert.eq(1, db.system.indexes.count({key: {a: 1}, expireAfterSeconds: 100}), "TTL index should be 100 now");