diff options
author | Greg Studer <greg@10gen.com> | 2013-11-18 18:04:51 -0500 |
---|---|---|
committer | Greg Studer <greg@10gen.com> | 2013-11-18 18:05:19 -0500 |
commit | 406ca294a71842f279d59ebdd42c1a92f0b72791 (patch) | |
tree | d73029660c5c54ad08e71364c964978d2ed04b7b /jstests/core/batch_write_command_insert.js | |
parent | 31891452456fa4a73e39f9e78cbf99fb82c09aee (diff) | |
download | mongo-406ca294a71842f279d59ebdd42c1a92f0b72791.tar.gz |
SERVER-11772 new core suite for write command testing
Diffstat (limited to 'jstests/core/batch_write_command_insert.js')
-rw-r--r-- | jstests/core/batch_write_command_insert.js | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/jstests/core/batch_write_command_insert.js b/jstests/core/batch_write_command_insert.js new file mode 100644 index 00000000000..eb982457eb1 --- /dev/null +++ b/jstests/core/batch_write_command_insert.js @@ -0,0 +1,138 @@ +// +// Ensures that mongod respects the batch write protocol for inserts +// + +var coll = db.getCollection( "batch_write_insert" ); +coll.drop(); + +jsTest.log("Starting insert tests..."); + +var request; +var result; + +function resultOK( result ) { + return result.ok && + !( 'code' in result ) && + !( 'errmsg' in result ) && + !( 'errInfo' in result ) && + !( 'errDetails' in result ); +}; + +function resultNOK( result ) { + return !result.ok && + typeof( result.code ) == 'number' && + typeof( result.errmsg ) == 'string'; +}; + +// EACH TEST BELOW SHOULD BE SELF-CONTAINED, FOR EASIER DEBUGGING + +// +// NO DOCS, illegal command +coll.remove({}); +printjson( request = {insert : coll.getName()} ); +printjson( result = coll.runCommand(request) ); +assert(resultNOK(result)); + +// +// Single document insert, no write concern specified +coll.remove({}); +printjson( request = {insert : coll.getName(), documents: [{a:1}]} ); +printjson( result = coll.runCommand(request) ); +assert(resultOK(result)); +assert.eq(1, result.n); +assert.eq(coll.count(), 1); + +// +// Single document insert, w:0 write concern specified, missing ordered +coll.remove({}); +printjson( request = {insert : coll.getName(), documents: [{a:1}], writeConcern:{w:0}} ); +printjson( result = coll.runCommand(request) ); +assert(resultOK(result)); +assert.eq(1, result.n); +assert.eq(coll.count(), 1); + +// +// Single document insert, w:1 write concern specified, ordered:true +coll.remove({}); +printjson( request = {insert : coll.getName(), documents: [{a:1}], writeConcern:{w:1}, ordered:true} ); +printjson( result = coll.runCommand(request) ); +assert(resultOK(result)); +assert.eq(1, result.n); +assert.eq(coll.count(), 1); + +// +// Single document insert, w:1 write concern specified, ordered:false +coll.remove({}); +printjson( request = {insert : coll.getName(), documents: [{a:1}], writeConcern:{w:1}, ordered:false} ); +printjson( result = coll.runCommand(request) ); +assert(resultOK(result)); +assert.eq(1, result.n); +assert.eq(coll.count(), 1); + +// +// Document with illegal key should fail +coll.remove({}); +printjson( request = {insert : coll.getName(), documents: [{$set:{a:1}}], writeConcern:{w:1}, ordered:false} ); +printjson( result = coll.runCommand(request) ); +assert(resultNOK(result)); +assert.eq(coll.count(), 0); + +// +// Document with valid nested key should insert (op log format) +coll.remove({}); +printjson( request = {insert : coll.getName(), documents: [{o: {$set:{a:1}}}], writeConcern:{w:1}, ordered:false} ); +printjson( result = coll.runCommand(request) ); +assert(resultOK(result)); +assert.eq(1, result.n); +assert.eq(coll.count(), 1); + +// +// +// Unique index tests +coll.remove({}); +coll.ensureIndex({a : 1}, {unique : true}); + +// +// Should fail single insert due to duplicate key +coll.remove({}); +coll.insert({a:1}); +printjson( request = {insert : coll.getName(), documents: [{a:1}]} ); +printjson( result = coll.runCommand(request) ); +assert(resultNOK(result)); +assert.eq(coll.count(), 1); + +// +// Fail with duplicate key error on multiple document inserts, ordered false +coll.remove({}); +printjson( request = {insert : coll.getName(), documents: [{a:1}, {a:1}, {a:1}], writeConcern:{w:1}, ordered:false} ); +printjson( result = coll.runCommand(request) ); +assert(resultNOK(result)); +assert.eq(1, result.n); +assert.eq(2, result.errDetails.length); +assert.eq(coll.count(), 1); + +assert.eq(1, result.errDetails[0].index); +assert.eq('number', typeof result.errDetails[0].code); +assert.eq('string', typeof result.errDetails[0].errmsg); + +assert.eq(2, result.errDetails[1].index); +assert.eq('number', typeof result.errDetails[1].code); +assert.eq('string', typeof result.errDetails[1].errmsg); + +assert.eq(coll.count(), 1); + +// +// Fail with duplicate key error on multiple document inserts, ordered true +coll.remove({}); +printjson( request = {insert : coll.getName(), documents: [{a:1}, {a:1}, {a:1}], writeConcern:{w:1}, ordered:true} ); +printjson( result = coll.runCommand(request) ); +assert(resultNOK(result)); +assert.eq(1, result.n); +assert.eq(1, result.errDetails.length); + +assert.eq(1, result.errDetails[0].index); +assert.eq('number', typeof result.errDetails[0].code); +assert.eq('string', typeof result.errDetails[0].errmsg); + +assert.eq(coll.count(), 1); + |