diff options
author | Benety Goh <benety@mongodb.com> | 2018-09-24 15:16:22 -0400 |
---|---|---|
committer | Benety Goh <benety@mongodb.com> | 2018-09-25 11:28:59 -0400 |
commit | 0e65a5855d5af2f08d8fcc330adfd7a3bb31a7b4 (patch) | |
tree | 9962856a916e10f2b9a176e8a7b4c961243ca27d | |
parent | 947ced71bb48d01914c17ed91b8245ec6ddf651f (diff) | |
download | mongo-0e65a5855d5af2f08d8fcc330adfd7a3bb31a7b4.tar.gz |
SERVER-36944 add characterization test for applyOps index creation
(cherry picked from commit 72ff3cb4ee0082e4310505fb10e32eaa133cb0a6)
-rw-r--r-- | jstests/core/apply_ops_invalid_index_spec.js | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/jstests/core/apply_ops_invalid_index_spec.js b/jstests/core/apply_ops_invalid_index_spec.js new file mode 100644 index 00000000000..d7568b0fa75 --- /dev/null +++ b/jstests/core/apply_ops_invalid_index_spec.js @@ -0,0 +1,89 @@ +/** + * Tests how applyOps handles index specs with unknown fields. + * + * We subject index specs with version 2 or later to stricter validation than version 1 index specs. + * When given an index spec with an unrecognized field, applyOps will reject v:2 indexes with an + * InvalidIndexSpecificationOption error while v:1 indexes are accepted as-is. + * + * @tags: [ + * requires_non_retryable_commands, + * requires_fastcount, + * + * # applyOps uses the oplog which requires replication support. + * requires_replication, + * ] + */ + +(function() { + 'use strict'; + + const t = db.apply_ops_invalid_index_spec; + t.drop(); + + const collNs = t.getFullName(); + const cmdNs = db.getName() + '.$cmd'; + const systemIndexesNs = db.getCollection('system.indexes').getFullName(); + + assert.commandWorked(db.createCollection(t.getName())); + assert.writeOK(t.save({_id: 100, a: 100})); + + // Tests that db.collection.createIndex() fails when given an index spec containing an unknown + // field. + assert.commandFailedWithCode(t.createIndex({a: 1}, {v: 2, name: 'a_1_base_v2', unknown: 1}), + ErrorCodes.InvalidIndexSpecificationOption); + assert.commandFailedWithCode(t.createIndex({a: 1}, {v: 1, name: 'a_1_base_v1', unknown: 1}), + ErrorCodes.InvalidIndexSpecificationOption); + + // A createIndexes command for a v:2 index with an unknown field in the index spec should fail. + assert.commandFailedWithCode(db.adminCommand({ + applyOps: [{ + op: 'c', + ns: cmdNs, + o: { + createIndexes: t.getName(), + v: 2, + key: {a: 1}, + name: 'a_1_create_v2', + unknown: 1, + }, + }], + }), + ErrorCodes.InvalidIndexSpecificationOption); + + // A createIndexes command for a v:1 index with an unknown field in the index spec should work. + const res1 = assert.commandWorked(db.adminCommand({ + applyOps: [{ + op: 'c', + ns: cmdNs, + o: { + createIndexes: t.getName(), + v: 1, + key: {a: 1}, + name: 'a_1_create_v1', + unknown: 1, + }, + }], + })); + + // Inserting a v:2 index directly into system.indexes with an unknown field in the index + // spec should return an error. + assert.commandFailedWithCode(db.adminCommand({ + applyOps: [{ + op: 'i', + ns: systemIndexesNs, + o: {v: 2, key: {a: 1}, name: 'a_1_system_v2', ns: collNs, unknown: 1}, + }], + }), + ErrorCodes.InvalidIndexSpecificationOption); + + // Inserting a v:1 index directly into system.indexes with an unknown field in the index spec + // should ignore the unrecognized field and create the index. + assert.commandFailedWithCode(db.adminCommand({ + applyOps: [{ + op: 'i', + ns: systemIndexesNs, + o: {v: 1, key: {a: 1}, name: 'a_1_system_v1', ns: collNs, unknown: 1}, + }], + }), + ErrorCodes.InvalidIndexSpecificationOption); +})(); |