summaryrefslogtreecommitdiff
path: root/jstests/core/bulk_api_ordered.js
diff options
context:
space:
mode:
Diffstat (limited to 'jstests/core/bulk_api_ordered.js')
-rw-r--r--jstests/core/bulk_api_ordered.js304
1 files changed, 135 insertions, 169 deletions
diff --git a/jstests/core/bulk_api_ordered.js b/jstests/core/bulk_api_ordered.js
index b0b6fb9fc08..0b91ab0c989 100644
--- a/jstests/core/bulk_api_ordered.js
+++ b/jstests/core/bulk_api_ordered.js
@@ -3,6 +3,7 @@
// key.
// @tags: [assumes_unsharded_collection, requires_multi_updates, requires_non_retryable_writes]
+(function() {
var collectionName = "bulk_api_ordered";
var coll = db.getCollection(collectionName);
coll.drop();
@@ -12,173 +13,138 @@ var result;
jsTest.log("Starting bulk api ordered tests...");
-/********************************************************
- *
- * Unordered tests should return same results for write command as
- * well as for the legacy operations
- *
- *******************************************************/
-var executeTests = function() {
- /**
- * find() requires selector.
- */
- var bulkOp = coll.initializeOrderedBulkOp();
-
- assert.throws(function() {
- bulkOp.find();
- });
-
- /**
- * Single successful ordered bulk operation
- */
- var bulkOp = coll.initializeOrderedBulkOp();
- bulkOp.insert({a: 1});
- bulkOp.find({a: 1}).updateOne({$set: {b: 1}});
- // no-op, should increment nMatched but not nModified
- bulkOp.find({a: 1}).updateOne({$set: {b: 1}});
- bulkOp.find({a: 2}).upsert().updateOne({$set: {b: 2}});
- bulkOp.insert({a: 3});
- bulkOp.find({a: 3}).update({$set: {b: 1}});
- bulkOp.find({a: 3}).upsert().update({$set: {b: 2}});
- bulkOp.find({a: 10}).upsert().update({$set: {b: 2}});
- bulkOp.find({a: 2}).replaceOne({a: 11});
- bulkOp.find({a: 11}).removeOne();
- bulkOp.find({a: 3}).remove({a: 3});
- var result = bulkOp.execute();
- assert.eq(2, result.nInserted);
- assert.eq(2, result.nUpserted);
- assert.eq(5, result.nMatched);
- // only check nModified if write commands are enabled
- if (coll.getMongo().writeMode() == "commands") {
- assert.eq(4, result.nModified);
- }
- assert.eq(2, result.nRemoved);
- var upserts = result.getUpsertedIds();
- assert.eq(2, upserts.length);
- assert.eq(3, upserts[0].index);
- assert(upserts[0]._id != null);
- var upsert = result.getUpsertedIdAt(0);
- assert.eq(3, upsert.index);
- assert(upsert._id != null);
- assert.eq(2, coll.find({}).itcount(), "find should return two documents");
-
- // illegal to try to convert a multi-op batch into a SingleWriteResult
- assert.throws(function() {
- result.toSingleResult();
- });
-
- // attempt to re-run bulk operation
- assert.throws(function() {
- bulkOp.execute();
- });
-
- // Test SingleWriteResult
- var singleBatch = coll.initializeOrderedBulkOp();
- singleBatch.find({a: 4}).upsert().updateOne({$set: {b: 1}});
- var singleResult = singleBatch.execute().toSingleResult();
- assert(singleResult.getUpsertedId() != null);
-
- // Create unique index
- coll.remove({});
- coll.createIndex({a: 1}, {unique: true});
-
- /**
- * Single error ordered bulk operation
- */
- var bulkOp = coll.initializeOrderedBulkOp();
- bulkOp.insert({b: 1, a: 1});
- bulkOp.find({b: 2}).upsert().updateOne({$set: {a: 1}});
- bulkOp.insert({b: 3, a: 2});
- var result = assert.throws(function() {
- bulkOp.execute();
- });
- assert(result instanceof BulkWriteError);
- assert(result instanceof Error);
- // Basic properties check
- assert.eq(1, result.nInserted);
- assert.eq(true, result.hasWriteErrors());
- assert.eq(1, result.getWriteErrorCount());
-
- // Get the first error
- var error = result.getWriteErrorAt(0);
- assert.eq(11000, error.code);
- assert(error.errmsg != null);
-
- // Get the operation that caused the error
- var op = error.getOperation();
- assert.eq(2, op.q.b);
- assert.eq(1, op.u['$set'].a);
- assert.eq(false, op.multi);
- assert.eq(true, op.upsert);
-
- // Get the first error
- var error = result.getWriteErrorAt(1);
- assert.eq(null, error);
-
- // Create unique index
- coll.dropIndexes();
- coll.remove({});
- coll.createIndex({a: 1}, {unique: true});
-
- /**
- * Multiple error ordered bulk operation
- */
- var bulkOp = coll.initializeOrderedBulkOp();
- bulkOp.insert({b: 1, a: 1});
- bulkOp.find({b: 2}).upsert().updateOne({$set: {a: 1}});
- bulkOp.find({b: 3}).upsert().updateOne({$set: {a: 2}});
- bulkOp.find({b: 2}).upsert().updateOne({$set: {a: 1}});
- bulkOp.insert({b: 4, a: 3});
- bulkOp.insert({b: 5, a: 1});
- var result = assert.throws(function() {
- bulkOp.execute();
- });
-
- // Basic properties check
- assert.eq(1, result.nInserted);
- assert.eq(true, result.hasWriteErrors());
- assert.eq(1, result.getWriteErrorCount());
-
- // Individual error checking
- var error = result.getWriteErrorAt(0);
- assert.eq(1, error.index);
- assert.eq(11000, error.code);
- assert(error.errmsg != null);
- assert.eq(2, error.getOperation().q.b);
- assert.eq(1, error.getOperation().u['$set'].a);
- assert.eq(false, error.getOperation().multi);
- assert.eq(true, error.getOperation().upsert);
-
- // Create unique index
- coll.dropIndexes();
- coll.remove({});
- coll.createIndex({a: 1}, {unique: true});
-};
-
-var buildVersion = parseInt(db.runCommand({buildInfo: 1}).versionArray.slice(0, 3).join(""), 10);
-// Save the existing useWriteCommands function
-var _useWriteCommands = coll.getMongo().useWriteCommands;
-
-//
-// Only execute write command tests if we have > 2.5.5 otherwise
-// execute the down converted version
-if (buildVersion >= 255) {
- // Force the use of useWriteCommands
- coll._mongo.useWriteCommands = function() {
- return true;
- };
-
- // Execute tests using legacy operations
- executeTests();
+/**
+ * find() requires selector.
+ */
+var bulkOp = coll.initializeOrderedBulkOp();
+
+assert.throws(function() {
+ bulkOp.find();
+});
+
+/**
+ * Single successful ordered bulk operation
+ */
+var bulkOp = coll.initializeOrderedBulkOp();
+bulkOp.insert({a: 1});
+bulkOp.find({a: 1}).updateOne({$set: {b: 1}});
+// no-op, should increment nMatched but not nModified
+bulkOp.find({a: 1}).updateOne({$set: {b: 1}});
+bulkOp.find({a: 2}).upsert().updateOne({$set: {b: 2}});
+bulkOp.insert({a: 3});
+bulkOp.find({a: 3}).update({$set: {b: 1}});
+bulkOp.find({a: 3}).upsert().update({$set: {b: 2}});
+bulkOp.find({a: 10}).upsert().update({$set: {b: 2}});
+bulkOp.find({a: 2}).replaceOne({a: 11});
+bulkOp.find({a: 11}).removeOne();
+bulkOp.find({a: 3}).remove({a: 3});
+var result = bulkOp.execute();
+assert.eq(2, result.nInserted);
+assert.eq(2, result.nUpserted);
+assert.eq(5, result.nMatched);
+// only check nModified if write commands are enabled
+if (coll.getMongo().writeMode() == "commands") {
+ assert.eq(4, result.nModified);
}
-
-// Force the use of legacy commands
-coll._mongo.useWriteCommands = function() {
- return false;
-};
-
-// Execute tests using legacy operations
-executeTests();
-
-// Reset the function
-coll.getMongo().useWriteCommands = _useWriteCommands;
+assert.eq(2, result.nRemoved);
+var upserts = result.getUpsertedIds();
+assert.eq(2, upserts.length);
+assert.eq(3, upserts[0].index);
+assert(upserts[0]._id != null);
+var upsert = result.getUpsertedIdAt(0);
+assert.eq(3, upsert.index);
+assert(upsert._id != null);
+assert.eq(2, coll.find({}).itcount(), "find should return two documents");
+
+// illegal to try to convert a multi-op batch into a SingleWriteResult
+assert.throws(function() {
+ result.toSingleResult();
+});
+
+// attempt to re-run bulk operation
+assert.throws(function() {
+ bulkOp.execute();
+});
+
+// Test SingleWriteResult
+var singleBatch = coll.initializeOrderedBulkOp();
+singleBatch.find({a: 4}).upsert().updateOne({$set: {b: 1}});
+var singleResult = singleBatch.execute().toSingleResult();
+assert(singleResult.getUpsertedId() != null);
+
+// Create unique index
+coll.remove({});
+coll.createIndex({a: 1}, {unique: true});
+
+/**
+ * Single error ordered bulk operation
+ */
+var bulkOp = coll.initializeOrderedBulkOp();
+bulkOp.insert({b: 1, a: 1});
+bulkOp.find({b: 2}).upsert().updateOne({$set: {a: 1}});
+bulkOp.insert({b: 3, a: 2});
+var result = assert.throws(function() {
+ bulkOp.execute();
+});
+assert(result instanceof BulkWriteError);
+assert(result instanceof Error);
+// Basic properties check
+assert.eq(1, result.nInserted);
+assert.eq(true, result.hasWriteErrors());
+assert.eq(1, result.getWriteErrorCount());
+
+// Get the first error
+var error = result.getWriteErrorAt(0);
+assert.eq(11000, error.code);
+assert(error.errmsg != null);
+
+// Get the operation that caused the error
+var op = error.getOperation();
+assert.eq(2, op.q.b);
+assert.eq(1, op.u['$set'].a);
+assert.eq(false, op.multi);
+assert.eq(true, op.upsert);
+
+// Get the first error
+var error = result.getWriteErrorAt(1);
+assert.eq(null, error);
+
+// Create unique index
+coll.dropIndexes();
+coll.remove({});
+coll.createIndex({a: 1}, {unique: true});
+
+/**
+ * Multiple error ordered bulk operation
+ */
+var bulkOp = coll.initializeOrderedBulkOp();
+bulkOp.insert({b: 1, a: 1});
+bulkOp.find({b: 2}).upsert().updateOne({$set: {a: 1}});
+bulkOp.find({b: 3}).upsert().updateOne({$set: {a: 2}});
+bulkOp.find({b: 2}).upsert().updateOne({$set: {a: 1}});
+bulkOp.insert({b: 4, a: 3});
+bulkOp.insert({b: 5, a: 1});
+var result = assert.throws(function() {
+ bulkOp.execute();
+});
+
+// Basic properties check
+assert.eq(1, result.nInserted);
+assert.eq(true, result.hasWriteErrors());
+assert.eq(1, result.getWriteErrorCount());
+
+// Individual error checking
+var error = result.getWriteErrorAt(0);
+assert.eq(1, error.index);
+assert.eq(11000, error.code);
+assert(error.errmsg != null);
+assert.eq(2, error.getOperation().q.b);
+assert.eq(1, error.getOperation().u['$set'].a);
+assert.eq(false, error.getOperation().multi);
+assert.eq(true, error.getOperation().upsert);
+
+// Create unique index
+coll.dropIndexes();
+coll.remove({});
+coll.createIndex({a: 1}, {unique: true});
+}());