summaryrefslogtreecommitdiff
path: root/jstests/core/batch_write_command_insert.js
diff options
context:
space:
mode:
authorGreg Studer <greg@10gen.com>2013-11-18 18:04:51 -0500
committerGreg Studer <greg@10gen.com>2013-11-18 18:05:19 -0500
commit406ca294a71842f279d59ebdd42c1a92f0b72791 (patch)
treed73029660c5c54ad08e71364c964978d2ed04b7b /jstests/core/batch_write_command_insert.js
parent31891452456fa4a73e39f9e78cbf99fb82c09aee (diff)
downloadmongo-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.js138
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);
+