From 027b5477c7d59f132d667661031240c405182572 Mon Sep 17 00:00:00 2001 From: Durran Jordan Date: Fri, 27 Sep 2024 00:08:44 +0200 Subject: [PATCH 01/29] feat(NODE-6338): implement client bulk write error handling --- src/cmap/wire_protocol/responses.ts | 4 + src/cursor/client_bulk_write_cursor.ts | 10 +- src/error.ts | 27 + src/index.ts | 1 + src/mongo_client.ts | 5 + .../client_bulk_write/client_bulk_write.ts | 14 +- .../client_bulk_write/command_builder.ts | 94 +++- src/operations/client_bulk_write/common.ts | 50 ++ src/operations/client_bulk_write/executor.ts | 49 +- .../client_bulk_write/results_merger.ts | 109 +++- test/integration/crud/crud.prose.test.ts | 469 ++++++++++++++++++ test/integration/crud/crud.spec.test.ts | 28 +- .../retryable_writes.spec.test.ts | 18 +- .../client-bulkWrite-clientErrors.json | 3 +- .../unified/client-bulkWrite-clientErrors.yml | 1 + .../client-bulkWrite-serverErrors.json | 3 +- .../unified/client-bulkWrite-serverErrors.yml | 1 + test/tools/unified-spec-runner/match.ts | 24 +- test/unit/index.test.ts | 1 + .../client_bulk_write/results_merger.test.ts | 139 ++---- 20 files changed, 853 insertions(+), 197 deletions(-) diff --git a/src/cmap/wire_protocol/responses.ts b/src/cmap/wire_protocol/responses.ts index 6c166afd61..18afde92e7 100644 --- a/src/cmap/wire_protocol/responses.ts +++ b/src/cmap/wire_protocol/responses.ts @@ -354,4 +354,8 @@ export class ClientBulkWriteCursorResponse extends CursorResponse { get deletedCount() { return this.get('nDeleted', BSONType.int, true); } + + get writeConcernError() { + return this.get('writeConcernError', BSONType.object, false); + } } diff --git a/src/cursor/client_bulk_write_cursor.ts b/src/cursor/client_bulk_write_cursor.ts index 06f34dfc52..3a4e7eb99a 100644 --- a/src/cursor/client_bulk_write_cursor.ts +++ b/src/cursor/client_bulk_write_cursor.ts @@ -1,7 +1,6 @@ import { type Document } from 'bson'; import { type ClientBulkWriteCursorResponse } from '../cmap/wire_protocol/responses'; -import { MongoClientBulkWriteCursorError } from '../error'; import type { MongoClient } from '../mongo_client'; import { ClientBulkWriteOperation } from '../operations/client_bulk_write/client_bulk_write'; import { type ClientBulkWriteCommandBuilder } from '../operations/client_bulk_write/command_builder'; @@ -48,16 +47,11 @@ export class ClientBulkWriteCursor extends AbstractCursor { * We need a way to get the top level cursor response fields for * generating the bulk write result, so we expose this here. */ - get response(): ClientBulkWriteCursorResponse { + get response(): ClientBulkWriteCursorResponse | null { if (this.cursorResponse) return this.cursorResponse; - throw new MongoClientBulkWriteCursorError( - 'No client bulk write cursor response returned from the server.' - ); + return null; } - /** - * Get the last set of operations the cursor executed. - */ get operations(): Document[] { return this.commandBuilder.lastOperations; } diff --git a/src/error.ts b/src/error.ts index 4aed6b9314..4e3679bd9a 100644 --- a/src/error.ts +++ b/src/error.ts @@ -643,6 +643,33 @@ export class MongoClientBulkWriteCursorError extends MongoRuntimeError { } } +/** + * An error indicating that an error occurred when generating a bulk write update. + * + * @public + * @category Error + */ +export class MongoClientBulkWriteUpdateError extends MongoRuntimeError { + /** + * **Do not use this constructor!** + * + * Meant for internal use only. + * + * @remarks + * This class is only meant to be constructed within the driver. This constructor is + * not subject to semantic versioning compatibility guarantees and may change at any time. + * + * @public + **/ + constructor(message: string) { + super(message); + } + + override get name(): string { + return 'MongoClientBulkWriteUpdateError'; + } +} + /** * An error indicating that an error occurred on the client when executing a client bulk write. * diff --git a/src/index.ts b/src/index.ts index 97f964ce54..851556207b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -47,6 +47,7 @@ export { MongoChangeStreamError, MongoClientBulkWriteCursorError, MongoClientBulkWriteExecutionError, + MongoClientBulkWriteUpdateError, MongoCompatibilityError, MongoCursorExhaustedError, MongoCursorInUseError, diff --git a/src/mongo_client.ts b/src/mongo_client.ts index 092e9418b3..4920191036 100644 --- a/src/mongo_client.ts +++ b/src/mongo_client.ts @@ -493,6 +493,11 @@ export class MongoClient extends TypedEventEmitter implements models: AnyClientBulkWriteModel[], options?: ClientBulkWriteOptions ): Promise { + if (this.autoEncrypter) { + throw new MongoInvalidArgumentError( + 'MongoClient bulkWrite does not currently support automatic encryption.' + ); + } return await new ClientBulkWriteExecutor(this, models, options).execute(); } diff --git a/src/operations/client_bulk_write/client_bulk_write.ts b/src/operations/client_bulk_write/client_bulk_write.ts index b04c978114..ec98efcf4a 100644 --- a/src/operations/client_bulk_write/client_bulk_write.ts +++ b/src/operations/client_bulk_write/client_bulk_write.ts @@ -48,7 +48,8 @@ export class ClientBulkWriteOperation extends CommandOperation maxBsonObjectSize) { + throw new MongoInvalidArgumentError( + `Client bulk write operation ${name} of length ${buffer.length} exceeds the max bson object size of ${maxBsonObjectSize}` + ); + } + + if (buffer.length > maxMessageSizeBytes) { + throw new MongoInvalidArgumentError( + `Client bulk write operation ${name} of length ${buffer.length} exceeds the max message size size of ${maxMessageSizeBytes}` + ); + } +} + /** @internal */ interface ClientInsertOperation { insert: number; @@ -293,6 +337,22 @@ export const buildUpdateManyOperation = ( return createUpdateOperation(model, index, true); }; +/** + * Validate the update document. + * @param update - The update document. + */ +function validateUpdate(update: Document) { + const keys = Object.keys(update); + if (keys.length === 0) { + throw new MongoClientBulkWriteUpdateError('Client bulk write update models may not be empty.'); + } + if (!keys[0].startsWith('$')) { + throw new MongoClientBulkWriteUpdateError( + 'Client bulk write update models must only contain atomic modifiers (start with $).' + ); + } +} + /** * Creates a delete operation based on the parameters. */ @@ -301,6 +361,22 @@ function createUpdateOperation( index: number, multi: boolean ): ClientUpdateOperation { + // Update documents provided in UpdateOne and UpdateMany write models are + // required only to contain atomic modifiers (i.e. keys that start with "$"). + // Drivers MUST throw an error if an update document is empty or if the + // document's first key does not start with "$". + if (Array.isArray(model.update)) { + if (model.update.length === 0) { + throw new MongoClientBulkWriteUpdateError( + 'Client bulk write update model pipelines may not be empty.' + ); + } + for (const update of model.update) { + validateUpdate(update); + } + } else { + validateUpdate(model.update); + } const document: ClientUpdateOperation = { update: index, multi: multi, @@ -343,6 +419,16 @@ export const buildReplaceOneOperation = ( model: ClientReplaceOneModel, index: number ): ClientReplaceOneOperation => { + const keys = Object.keys(model.replacement); + if (keys.length === 0) { + throw new MongoClientBulkWriteUpdateError('Client bulk write replace models may not be empty.'); + } + if (keys[0].startsWith('$')) { + throw new MongoClientBulkWriteUpdateError( + 'Client bulk write replace models must not contain atomic modifiers (start with $).' + ); + } + const document: ClientReplaceOneOperation = { update: index, multi: false, diff --git a/src/operations/client_bulk_write/common.ts b/src/operations/client_bulk_write/common.ts index c41d971f02..29d3e5e04f 100644 --- a/src/operations/client_bulk_write/common.ts +++ b/src/operations/client_bulk_write/common.ts @@ -1,4 +1,5 @@ import { type Document } from '../../bson'; +import { type ErrorDescription, type MongoRuntimeError, MongoServerError } from '../../error'; import type { Filter, OptionalId, UpdateFilter, WithoutId } from '../../mongo_types'; import type { CollationOptions, CommandOperationOptions } from '../../operations/command'; import type { Hint } from '../../operations/operation'; @@ -181,6 +182,55 @@ export interface ClientBulkWriteResult { deleteResults?: Map; } +export interface ClientBulkWriteError { + code: number; + message: string; +} + +/** + * An error indicating that an error occurred when executing the bulk write. + * + * @public + * @category Error + */ +export class MongoClientBulkWriteError extends MongoServerError { + /** + * A top-level error that occurred when attempting to communicate with the server or execute + * the bulk write. This value may not be populated if the exception was thrown due to errors + * occurring on individual writes. + */ + error?: MongoRuntimeError; + /** + * Write concern errors that occurred while executing the bulk write. This list may have + * multiple items if more than one server command was required to execute the bulk write. + */ + writeConcernErrors: Document[]; + /** + * Errors that occurred during the execution of individual write operations. This map will + * contain at most one entry if the bulk write was ordered. + */ + writeErrors: Map; + /** + * The results of any successful operations that were performed before the error was + * encountered. + */ + partialResult?: ClientBulkWriteResult; + + /** + * Initialize the client bulk write error. + * @param message - The error message. + */ + constructor(message: ErrorDescription) { + super(message); + this.writeConcernErrors = []; + this.writeErrors = new Map(); + } + + override get name(): string { + return 'MongoClientBulkWriteError'; + } +} + /** @public */ export interface ClientInsertOneResult { /** diff --git a/src/operations/client_bulk_write/executor.ts b/src/operations/client_bulk_write/executor.ts index 5baf1ed6b6..69b2cfbe6b 100644 --- a/src/operations/client_bulk_write/executor.ts +++ b/src/operations/client_bulk_write/executor.ts @@ -1,4 +1,5 @@ import { ClientBulkWriteCursor } from '../../cursor/client_bulk_write_cursor'; +import { MongoClientBulkWriteExecutionError, MongoServerError } from '../../error'; import { type MongoClient } from '../../mongo_client'; import { WriteConcern } from '../../write_concern'; import { executeOperation } from '../execute_operation'; @@ -7,7 +8,8 @@ import { ClientBulkWriteCommandBuilder } from './command_builder'; import { type AnyClientBulkWriteModel, type ClientBulkWriteOptions, - type ClientBulkWriteResult + type ClientBulkWriteResult, + MongoClientBulkWriteError } from './common'; import { ClientBulkWriteResultsMerger } from './results_merger'; @@ -31,9 +33,13 @@ export class ClientBulkWriteExecutor { operations: AnyClientBulkWriteModel[], options?: ClientBulkWriteOptions ) { + if (operations.length === 0) { + throw new MongoClientBulkWriteExecutionError('No client bulk write models were provided.'); + } + this.client = client; this.operations = operations; - this.options = { ...options }; + this.options = { ordered: true, ...options }; // If no write concern was provided, we inherit one from the client. if (!this.options.writeConcern) { @@ -65,15 +71,42 @@ export class ClientBulkWriteExecutor { } else { const resultsMerger = new ClientBulkWriteResultsMerger(this.options); // For each command will will create and exhaust a cursor for the results. - let currentBatchOffset = 0; while (commandBuilder.hasNextBatch()) { const cursor = new ClientBulkWriteCursor(this.client, commandBuilder, this.options); - const docs = await cursor.toArray(); - const operations = cursor.operations; - resultsMerger.merge(currentBatchOffset, operations, cursor.response, docs); - // Set the new batch index so we can back back to the index in the original models. - currentBatchOffset += operations.length; + try { + await resultsMerger.merge(cursor); + } catch (error) { + // Write concern errors are recorded in the writeConcernErrors field on MongoClientBulkWriteError. + // When a write concern error is encountered, it should not terminate execution of the bulk write + // for either ordered or unordered bulk writes. However, drivers MUST throw an exception at the end + // of execution if any write concern errors were observed. + if (error instanceof MongoServerError && !(error instanceof MongoClientBulkWriteError)) { + // Server side errors need to be wrapped inside a MongoClientBulkWriteError, where the root + // cause is the error property and a partial result is to be included. + const bulkWriteError = new MongoClientBulkWriteError({ + message: 'Mongo client bulk write encountered an error during execution' + }); + bulkWriteError.error = error; + bulkWriteError.partialResult = resultsMerger.result; + throw bulkWriteError; + } else { + // Client side errors are just thrown. + throw error; + } + } } + + // If we have write concern errors or unordered write errors at the end we throw. + if (resultsMerger.writeConcernErrors.length > 0 || resultsMerger.writeErrors.size > 0) { + const error = new MongoClientBulkWriteError({ + message: 'Mongo client bulk write encountered errors during execution.' + }); + error.writeConcernErrors = resultsMerger.writeConcernErrors; + error.writeErrors = resultsMerger.writeErrors; + error.partialResult = resultsMerger.result; + throw error; + } + return resultsMerger.result; } } diff --git a/src/operations/client_bulk_write/results_merger.ts b/src/operations/client_bulk_write/results_merger.ts index ca5f3f1604..593215194c 100644 --- a/src/operations/client_bulk_write/results_merger.ts +++ b/src/operations/client_bulk_write/results_merger.ts @@ -1,11 +1,14 @@ +import { MongoWriteConcernError } from '../..'; import { type Document } from '../../bson'; -import { type ClientBulkWriteCursorResponse } from '../../cmap/wire_protocol/responses'; +import { type ClientBulkWriteCursor } from '../../cursor/client_bulk_write_cursor'; import { + type ClientBulkWriteError, type ClientBulkWriteOptions, type ClientBulkWriteResult, type ClientDeleteResult, type ClientInsertOneResult, - type ClientUpdateResult + type ClientUpdateResult, + MongoClientBulkWriteError } from './common'; /** @@ -15,6 +18,9 @@ import { export class ClientBulkWriteResultsMerger { result: ClientBulkWriteResult; options: ClientBulkWriteOptions; + currentBatchOffset: number; + writeConcernErrors: Document[]; + writeErrors: Map; /** * Instantiate the merger. @@ -22,6 +28,9 @@ export class ClientBulkWriteResultsMerger { */ constructor(options: ClientBulkWriteOptions) { this.options = options; + this.currentBatchOffset = 0; + this.writeConcernErrors = []; + this.writeErrors = new Map(); this.result = { insertedCount: 0, upsertedCount: 0, @@ -47,29 +56,17 @@ export class ClientBulkWriteResultsMerger { * @param documents - The documents in the cursor. * @returns The current result. */ - merge( - currentBatchOffset: number, - operations: Document[], - response: ClientBulkWriteCursorResponse, - documents: Document[] - ): ClientBulkWriteResult { - // Update the counts from the cursor response. - this.result.insertedCount += response.insertedCount; - this.result.upsertedCount += response.upsertedCount; - this.result.matchedCount += response.matchedCount; - this.result.modifiedCount += response.modifiedCount; - this.result.deletedCount += response.deletedCount; - - if (this.options.verboseResults) { - // Iterate all the documents in the cursor and update the result. - for (const document of documents) { + async merge(cursor: ClientBulkWriteCursor): Promise { + let writeConcernErrorResult; + try { + for await (const document of cursor) { // Only add to maps if ok: 1 - if (document.ok === 1) { + if (document.ok === 1 && this.options.verboseResults) { // Get the corresponding operation from the command. - const operation = operations[document.idx]; + const operation = cursor.operations[document.idx]; // Handle insert results. if ('insert' in operation) { - this.result.insertResults?.set(document.idx + currentBatchOffset, { + this.result.insertResults?.set(document.idx + this.currentBatchOffset, { insertedId: operation.document._id }); } @@ -84,18 +81,84 @@ export class ClientBulkWriteResultsMerger { if (document.upserted) { result.upsertedId = document.upserted._id; } - this.result.updateResults?.set(document.idx + currentBatchOffset, result); + this.result.updateResults?.set(document.idx + this.currentBatchOffset, result); } // Handle delete results. if ('delete' in operation) { - this.result.deleteResults?.set(document.idx + currentBatchOffset, { + this.result.deleteResults?.set(document.idx + this.currentBatchOffset, { deletedCount: document.n }); } + } else { + // If an individual write error is encountered during an ordered bulk write, drivers MUST + // record the error in writeErrors and immediately throw the exception. Otherwise, drivers + // MUST continue to iterate the results cursor and execute any further bulkWrite batches. + if (this.options.ordered) { + const error = new MongoClientBulkWriteError({ + message: 'Mongo client ordered bulk write encountered a write error.' + }); + error.writeErrors.set(document.idx + this.currentBatchOffset, { + code: document.code, + message: document.errmsg + }); + error.partialResult = this.result; + throw error; + } else { + this.writeErrors.set(document.idx + this.currentBatchOffset, { + code: document.code, + message: document.errmsg + }); + } } } + } catch (error) { + if (error instanceof MongoWriteConcernError) { + const result = error.result; + writeConcernErrorResult = { + insertedCount: result.nInserted, + upsertedCount: result.nUpserted, + matchedCount: result.nMatched, + modifiedCount: result.nModified, + deletedCount: result.nDeleted, + writeConcernError: result.writeConcernError + }; + // docs = result.cursor.firstBatch; + } else { + throw error; + } + } finally { + // Update the counts from the cursor response. + if (cursor.response) { + const response = cursor.response; + this.incrementCounts(response); + } + + // Increment the batch offset. + this.currentBatchOffset += cursor.operations.length; + } + + // If we have write concern errors ensure they are added. + if (writeConcernErrorResult) { + const writeConcernError = writeConcernErrorResult.writeConcernError as Document; + this.incrementCounts(writeConcernErrorResult); + this.writeConcernErrors.push({ + code: writeConcernError.code, + message: writeConcernError.errmsg + }); } return this.result; } + + /** + * Increment the result counts. + * @param document - The document with the results. + */ + private incrementCounts(document: Document) { + this.result.insertedCount += document.insertedCount; + this.result.upsertedCount += document.upsertedCount; + this.result.matchedCount += document.matchedCount; + this.result.modifiedCount += document.modifiedCount; + this.result.deletedCount += document.deletedCount; + } } diff --git a/test/integration/crud/crud.prose.test.ts b/test/integration/crud/crud.prose.test.ts index 1ecd960028..5b8cd40bb7 100644 --- a/test/integration/crud/crud.prose.test.ts +++ b/test/integration/crud/crud.prose.test.ts @@ -8,6 +8,8 @@ import { type Collection, MongoBulkWriteError, type MongoClient, + MongoClientBulkWriteError, + MongoInvalidArgumentError, MongoServerError } from '../../mongodb'; import { filterForCommands } from '../shared'; @@ -283,6 +285,167 @@ describe('CRUD Prose Spec Tests', () => { }); }); + describe('5. MongoClient.bulkWrite collects WriteConcernErrors across batches', function () { + // Test that MongoClient.bulkWrite properly collects and reports writeConcernErrors returned in separate batches. + // This test must only be run on 8.0+ servers. This test must be skipped on Atlas Serverless. + // Construct a MongoClient (referred to as client) with retryWrites: false configured and command monitoring + // enabled to observe CommandStartedEvents. Perform a hello command using client and record the maxWriteBatchSize + // value contained in the response. Then, configure the following fail point with client: + // { + // "configureFailPoint": "failCommand", + // "mode": { "times": 2 }, + // "data": { + // "failCommands": ["bulkWrite"], + // "writeConcernError": { + // "code": 91, + // "errmsg": "Replication is being shut down" + // } + // } + // } + // Construct the following write model (referred to as model): + // InsertOne: { + // "namespace": "db.coll", + // "document": { "a": "b" } + // } + // Construct a list of write models (referred to as models) with model repeated maxWriteBatchSize + 1 times. + // Execute bulkWrite on client with models. Assert that the bulk write fails and returns a BulkWriteError (referred to as error). + // Assert that error.writeConcernErrors has a length of 2. + // Assert that error.partialResult is populated. Assert that error.partialResult.insertedCount is equal to maxWriteBatchSize + 1. + // Assert that two CommandStartedEvents were observed for the bulkWrite command. + let client: MongoClient; + let maxWriteBatchSize; + const models: AnyClientBulkWriteModel[] = []; + const commands: CommandStartedEvent[] = []; + + beforeEach(async function () { + client = this.configuration.newClient({}, { monitorCommands: true, retryWrites: false }); + await client.connect(); + await client.db('db').collection('coll').drop(); + const hello = await client.db('admin').command({ hello: 1 }); + await client.db('admin').command({ + configureFailPoint: 'failCommand', + mode: { times: 2 }, + data: { + failCommands: ['bulkWrite'], + writeConcernError: { + code: 91, + errmsg: 'Replication is being shut down' + } + } + }); + maxWriteBatchSize = hello.maxWriteBatchSize; + + client.on('commandStarted', filterForCommands('bulkWrite', commands)); + commands.length = 0; + + Array.from({ length: maxWriteBatchSize + 1 }, () => { + models.push({ + namespace: 'db.coll', + name: 'insertOne', + document: { a: 'b' } + }); + }); + }); + + afterEach(async function () { + await client.close(); + }); + + it('splits the commands into 2 operations and handles the errors', { + metadata: { requires: { mongodb: '>=8.0.0', serverless: 'forbid' } }, + async test() { + const error = await client.bulkWrite(models).catch(error => error); + expect(error).to.be.instanceOf(MongoClientBulkWriteError); + expect(error.writeConcernErrors.length).to.equal(2); + expect(error.partialResult.insertedCount).to.equal(maxWriteBatchSize + 1); + expect(commands.length).to.equal(2); + } + }); + }); + + describe('6. MongoClient.bulkWrite handles individual WriteErrors across batches', function () { + // Test that MongoClient.bulkWrite handles individual write errors across batches for ordered and unordered bulk writes. + // This test must only be run on 8.0+ servers. This test must be skipped on Atlas Serverless. + // Construct a MongoClient (referred to as client) with command monitoring enabled to observe CommandStartedEvents. + // Perform a hello command using client and record the maxWriteBatchSize value contained in the response. + // Construct a MongoCollection (referred to as collection) with the namespace "db.coll" (referred to as namespace). + // Drop collection. Then, construct the following document (referred to as document): + // { + // "_id": 1 + // } + // Insert document into collection. + // Create the following write model (referred to as model): + // InsertOne { + // "namespace": namespace, + // "document": document + // } + // Construct a list of write models (referred to as models) with model repeated maxWriteBatchSize + 1 times. + let client: MongoClient; + let maxWriteBatchSize; + const models: AnyClientBulkWriteModel[] = []; + const commands: CommandStartedEvent[] = []; + + beforeEach(async function () { + client = this.configuration.newClient({}, { monitorCommands: true, retryWrites: false }); + await client.connect(); + await client.db('db').collection('coll').drop(); + const hello = await client.db('admin').command({ hello: 1 }); + await client.db('db').collection('coll').insertOne({ _id: 1 }); + maxWriteBatchSize = hello.maxWriteBatchSize; + + client.on('commandStarted', filterForCommands('bulkWrite', commands)); + commands.length = 0; + + Array.from({ length: maxWriteBatchSize + 1 }, () => { + models.push({ + namespace: 'db.coll', + name: 'insertOne', + document: { _id: 1 } + }); + }); + }); + + afterEach(async function () { + await client.close(); + }); + + context('when the bulk write is unordered', function () { + // Unordered + // Test that an unordered bulk write collects WriteErrors across batches. + // Execute bulkWrite on client with models and ordered set to false. Assert that the bulk write fails + // and returns a BulkWriteError (referred to as unorderedError). + // Assert that unorderedError.writeErrors has a length of maxWriteBatchSize + 1. + // Assert that two CommandStartedEvents were observed for the bulkWrite command. + it('splits the commands into 2 operations and handles the errors', { + metadata: { requires: { mongodb: '>=8.0.0', serverless: 'forbid' } }, + async test() { + const error = await client.bulkWrite(models, { ordered: false }).catch(error => error); + expect(error).to.be.instanceOf(MongoClientBulkWriteError); + expect(error.writeErrors.size).to.equal(maxWriteBatchSize + 1); + expect(commands.length).to.equal(2); + } + }); + }); + + context('when the bulk write is ordered', function () { + // Ordered + // Test that an ordered bulk write does not execute further batches when a WriteError occurs. + // Execute bulkWrite on client with models and ordered set to true. Assert that the bulk write fails + // and returns a BulkWriteError (referred to as orderedError). + // Assert that orderedError.writeErrors has a length of 1. + // Assert that one CommandStartedEvent was observed for the bulkWrite command. + it('splits the commands into 2 operations and halts on first error', { + metadata: { requires: { mongodb: '>=8.0.0', serverless: 'forbid' } }, + async test() { + const error = await client.bulkWrite(models, { ordered: true }).catch(error => error); + expect(error).to.be.instanceOf(MongoClientBulkWriteError); + expect(error.writeErrors.size).to.equal(1); + expect(commands.length).to.equal(1); + } + }); + }); + }); + describe('7. MongoClient.bulkWrite handles a cursor requiring a getMore', function () { // Test that MongoClient.bulkWrite properly iterates the results cursor when getMore is required. // This test must only be run on 8.0+ servers. This test must be skipped on Atlas Serverless. @@ -430,6 +593,185 @@ describe('CRUD Prose Spec Tests', () => { }); }); + describe('9. MongoClient.bulkWrite handles a getMore error', function () { + // Test that MongoClient.bulkWrite properly handles a failure that occurs when attempting a getMore. + // This test must only be run on 8.0+ servers. This test must be skipped on Atlas Serverless. + // Construct a MongoClient (referred to as client) with command monitoring enabled to observe CommandStartedEvents. + // Perform a hello command using client and record the maxBsonObjectSize value from the response. Then, + // configure the following fail point with client: + // { + // "configureFailPoint": "failCommand", + // "mode": { "times": 1 }, + // "data": { + // "failCommands": ["getMore"], + // "errorCode": 8 + // } + // } + // Construct a MongoCollection (referred to as collection) with the namespace "db.coll" (referred to as namespace). + // Drop collection. Then create the following list of write models (referred to as models): + // UpdateOne { + // "namespace": namespace, + // "filter": { "_id": "a".repeat(maxBsonObjectSize / 2) }, + // "update": { "$set": { "x": 1 } }, + // "upsert": true + // }, + // UpdateOne { + // "namespace": namespace, + // "filter": { "_id": "b".repeat(maxBsonObjectSize / 2) }, + // "update": { "$set": { "x": 1 } }, + // "upsert": true + // }, + // Execute bulkWrite on client with models and verboseResults set to true. Assert that the bulk write + // fails and returns a BulkWriteError (referred to as bulkWriteError). + // Assert that bulkWriteError.error is populated with an error (referred to as topLevelError). Assert + // that topLevelError.errorCode is equal to 8. + // Assert that bulkWriteError.partialResult is populated with a result (referred to as partialResult). + // Assert that partialResult.upsertedCount is equal to 2. Assert that the length of + // partialResult.updateResults is equal to 1. + // Assert that a CommandStartedEvent was observed for the getMore command. + // Assert that a CommandStartedEvent was observed for the killCursors command. + let client: MongoClient; + let maxBsonObjectSize; + const models: AnyClientBulkWriteModel[] = []; + const getMoreCommands: CommandStartedEvent[] = []; + const killCursorsCommands: CommandStartedEvent[] = []; + + beforeEach(async function () { + client = this.configuration.newClient({}, { monitorCommands: true }); + await client.connect(); + await client.db('db').collection('coll').drop(); + const hello = await client.db('admin').command({ hello: 1 }); + maxBsonObjectSize = hello.maxBsonObjectSize; + + await client.db('admin').command({ + configureFailPoint: 'failCommand', + mode: { times: 1 }, + data: { + failCommands: ['getMore'], + errorCode: 8 + } + }); + + client.on('commandStarted', filterForCommands('getMore', getMoreCommands)); + client.on('commandStarted', filterForCommands('killCursors', killCursorsCommands)); + getMoreCommands.length = 0; + killCursorsCommands.length = 0; + + models.push({ + name: 'updateOne', + namespace: 'db.coll', + filter: { _id: 'a'.repeat(maxBsonObjectSize / 2) }, + update: { $set: { x: 1 } }, + upsert: true + }); + models.push({ + name: 'updateOne', + namespace: 'db.coll', + filter: { _id: 'b'.repeat(maxBsonObjectSize / 2) }, + update: { $set: { x: 1 } }, + upsert: true + }); + }); + + afterEach(async function () { + await client.close(); + }); + + it('handles a getMore that errors', { + metadata: { requires: { mongodb: '>=8.0.0', serverless: 'forbid' } }, + async test() { + const error = await client + .bulkWrite(models, { verboseResults: true }) + .catch(error => error); + expect(error).to.be.instanceOf(MongoClientBulkWriteError); + expect(error.error.code).to.equal(8); + expect(error.partialResult).to.exist; + // TODO: Need to handle batches in cursor one at a time and not call toArray() + expect(error.partialResult.upsertedCount).to.equal(2); + expect(error.partialResult.updateResults.size).to.equal(1); + expect(getMoreCommands.length).to.equal(1); + expect(killCursorsCommands.length).to.equal(1); + } + }); + }); + + describe('10. MongoClient.bulkWrite returns error for unacknowledged too-large insert', function () { + // This test must only be run on 8.0+ servers. This test must be skipped on Atlas Serverless. + // Construct a MongoClient (referred to as client). + // Perform a hello command using client and record the following values from the response: maxBsonObjectSize. + // Then, construct the following document (referred to as document): + // { + // "a": "b".repeat(maxBsonObjectSize) + // } + let client: MongoClient; + let maxBsonObjectSize; + let document: Document; + + beforeEach(async function () { + client = this.configuration.newClient({}, { monitorCommands: true }); + await client.connect(); + await client.db('db').collection('coll').drop(); + const hello = await client.db('admin').command({ hello: 1 }); + maxBsonObjectSize = hello.maxBsonObjectSize; + + document = { + a: 'b'.repeat(maxBsonObjectSize) + }; + }); + + afterEach(async function () { + await client.close(); + }); + + context('when performing inserts', function () { + // With insert + // Construct the following write model (referred to as model): + // InsertOne: { + // "namespace": "db.coll", + // "document": document + // } + // Construct as list of write models (referred to as models) with the one model. + // Call MongoClient.bulkWrite with models and BulkWriteOptions.writeConcern set to an unacknowledged write concern. + // Expect a client-side error due the size. + it('throws an error', { + metadata: { requires: { mongodb: '>=8.0.0', serverless: 'forbid' } }, + async test() { + const error = await client + .bulkWrite([{ name: 'insertOne', namespace: 'db.coll', document: document }], { + writeConcern: { w: 0 } + }) + .catch(error => error); + expect(error.message).to.include('Client bulk write operation ops of length'); + } + }); + }); + + context('when performing replacements', function () { + // With replace + // Construct the following write model (referred to as model): + // ReplaceOne: { + // "namespace": "db.coll", + // "filter": {}, + // "replacement": document + // } + // Construct as list of write models (referred to as models) with the one model. + // Call MongoClient.bulkWrite with models and BulkWriteOptions.writeConcern set to an unacknowledged write concern. + // Expect a client-side error due the size. + it('throws an error', { + metadata: { requires: { mongodb: '>=8.0.0', serverless: 'forbid' } }, + async test() { + const error = await client + .bulkWrite( + [{ name: 'replaceOne', namespace: 'db.coll', filter: {}, replacement: document }], + { writeConcern: { w: 0 } } + ) + .catch(error => error); + expect(error.message).to.include('Client bulk write operation ops of length'); + } + }); + }); + }); + describe('11. MongoClient.bulkWrite batch splits when the addition of a new namespace exceeds the maximum message size', function () { // Test that MongoClient.bulkWrite batch splits a bulk write when the addition of a new namespace to nsInfo causes the size // of the message to exceed maxMessageSizeBytes - 1000. @@ -573,6 +915,133 @@ describe('CRUD Prose Spec Tests', () => { }); }); + describe('12. MongoClient.bulkWrite returns an error if no operations can be added to ops', function () { + // Test that MongoClient.bulkWrite returns an error if an operation provided exceeds maxMessageSizeBytes + // such that an empty ops payload would be sent. + // This test must only be run on 8.0+ servers. This test must be skipped on Atlas Serverless. + // This test may be skipped by drivers that are not able to construct arbitrarily large documents. + // Construct a MongoClient (referred to as client). Perform a hello command using client and record + // the maxMessageSizeBytes value contained in the response. + let client: MongoClient; + let maxMessageSizeBytes; + + beforeEach(async function () { + client = this.configuration.newClient({}); + await client.connect(); + await client.db('db').collection('coll').drop(); + const hello = await client.db('admin').command({ hello: 1 }); + maxMessageSizeBytes = hello.maxMessageSizeBytes; + }); + + afterEach(async function () { + await client.close(); + }); + + context('when the document is too large', function () { + // Case 1: document too large + // Construct the following write model (referred to as largeDocumentModel): + // InsertOne { + // "namespace": "db.coll", + // "document": { "a": "b".repeat(maxMessageSizeBytes) } + // } + // Execute bulkWrite on client with largeDocumentModel. Assert that an error (referred to as error) is returned. + // Assert that error is a client error. + it('raises a client error', { + metadata: { requires: { mongodb: '>=8.0.0', serverless: 'forbid' } }, + async test() { + const model: AnyClientBulkWriteModel = { + name: 'insertOne', + namespace: 'db.coll', + document: { a: 'b'.repeat(maxMessageSizeBytes) } + }; + const error = await client.bulkWrite([model]).catch(error => error); + expect(error).to.be.instanceOf(MongoInvalidArgumentError); + } + }); + }); + + context('when the namespace is too large', function () { + // Case 2: namespace too large + // Construct the following namespace (referred to as namespace): + // "db." + "c".repeat(maxMessageSizeBytes) + // Construct the following write model (referred to as largeNamespaceModel): + // InsertOne { + // "namespace": namespace, + // "document": { "a": "b" } + // } + // Execute bulkWrite on client with largeNamespaceModel. Assert that an error (referred to as error) is returned. + // Assert that error is a client error. + it('raises a client error', { + metadata: { requires: { mongodb: '>=8.0.0', serverless: 'forbid' } }, + async test() { + const namespace = `db.${'c'.repeat(maxMessageSizeBytes)}`; + const model: AnyClientBulkWriteModel = { + name: 'insertOne', + namespace: namespace, + document: { a: 'b' } + }; + const error = await client.bulkWrite([model]).catch(error => error); + expect(error).to.be.instanceOf(MongoInvalidArgumentError); + } + }); + }); + }); + + describe('13. MongoClient.bulkWrite returns an error if auto-encryption is configured', function () { + // This test is expected to be removed when DRIVERS-2888 is resolved. + // Test that MongoClient.bulkWrite returns an error if the client has auto-encryption configured. + // This test must only be run on 8.0+ servers. This test must be skipped on Atlas Serverless. + // Construct a MongoClient (referred to as client) configured with the following AutoEncryptionOpts: + // AutoEncryptionOpts { + // "keyVaultNamespace": "db.coll", + // "kmsProviders": { + // "aws": { + // "accessKeyId": "foo", + // "secretAccessKey": "bar" + // } + // } + // } + // Construct the following write model (referred to as model): + // InsertOne { + // "namespace": "db.coll", + // "document": { "a": "b" } + // } + // Execute bulkWrite on client with model. Assert that an error (referred to as error) is returned. + // Assert that error is a client error containing the message: "bulkWrite does not currently support automatic encryption". + let client: MongoClient; + + beforeEach(async function () { + client = this.configuration.newClient( + {}, + { + autoEncryption: { + keyVaultNamespace: 'db.coll', + kmsProviders: { + aws: { + accessKeyId: 'foo', + secretAccessKey: 'bar' + } + } + } + } + ); + }); + + afterEach(async function () { + await client.close(); + }); + + it('raises a client side error', async function () { + const model: AnyClientBulkWriteModel = { + name: 'insertOne', + namespace: 'db.coll', + document: { a: 'b' } + }; + const error = await client.bulkWrite([model]).catch(error => error); + expect(error.message).to.include('bulkWrite does not currently support automatic encryption'); + }); + }); + describe('14. `explain` helpers allow users to specify `maxTimeMS`', function () { let client: MongoClient; const commands: CommandStartedEvent[] = []; diff --git a/test/integration/crud/crud.spec.test.ts b/test/integration/crud/crud.spec.test.ts index a8a0d2987f..5439c77523 100644 --- a/test/integration/crud/crud.spec.test.ts +++ b/test/integration/crud/crud.spec.test.ts @@ -3,22 +3,6 @@ import * as path from 'path'; import { loadSpecTests } from '../../spec/index'; import { runUnifiedSuite } from '../../tools/unified-spec-runner/runner'; -const clientBulkWriteTests = new RegExp( - [ - 'client bulkWrite operations support errorResponse assertions', - 'an individual operation fails during an ordered bulkWrite', - 'an individual operation fails during an unordered bulkWrite', - 'detailed results are omitted from error when verboseResults is false', - 'a top-level failure occurs during a bulkWrite', - 'a bulk write with only errors does not report a partial result', - 'an empty list of write models is a client-side error', - 'a write concern error occurs during a bulkWrite', - 'client bulkWrite replaceOne prohibits atomic modifiers', - 'client bulkWrite updateOne requires atomic modifiers', - 'client bulkWrite updateMany requires atomic modifiers' - ].join('|') -); - const unacknowledgedHintTests = [ 'Unacknowledged updateOne with hint document on 4.2+ server', 'Unacknowledged updateOne with hint string on 4.2+ server', @@ -59,13 +43,11 @@ describe('CRUD unified', function () { runUnifiedSuite( loadSpecTests(path.join('crud', 'unified')), ({ description }, { isLoadBalanced }) => { - return description.match(clientBulkWriteTests) - ? 'TODO(NODE-6257): implement client level bulk write' - : unacknowledgedHintTests.includes(description) - ? `TODO(NODE-3541)` - : isLoadBalanced && loadBalancedCollationTests.includes(description) - ? `TODO(NODE-6280): fix collation for find and modify commands on load balanced mode` - : false; + return unacknowledgedHintTests.includes(description) + ? `TODO(NODE-3541)` + : isLoadBalanced && loadBalancedCollationTests.includes(description) + ? `TODO(NODE-6280): fix collation for find and modify commands on load balanced mode` + : false; } ); }); diff --git a/test/integration/retryable-writes/retryable_writes.spec.test.ts b/test/integration/retryable-writes/retryable_writes.spec.test.ts index 1c9e510e4f..87e8c1edc9 100644 --- a/test/integration/retryable-writes/retryable_writes.spec.test.ts +++ b/test/integration/retryable-writes/retryable_writes.spec.test.ts @@ -3,22 +3,6 @@ import * as path from 'path'; import { loadSpecTests } from '../../spec'; import { runUnifiedSuite } from '../../tools/unified-spec-runner/runner'; -const clientBulkWriteTests = [ - 'client bulkWrite with one network error succeeds after retry', - 'client bulkWrite with two network errors fails after retry', - 'client bulkWrite with no multi: true operations succeeds after retryable top-level error', - 'client bulkWrite with multi: true operations fails after retryable top-level error', - 'client bulkWrite with no multi: true operations succeeds after retryable writeConcernError', - 'client bulkWrite with multi: true operations fails after retryable writeConcernError', - 'client bulkWrite with retryWrites: false does not retry', - 'client.clientBulkWrite succeeds after retryable handshake network error', - 'client.clientBulkWrite succeeds after retryable handshake server error (ShutdownInProgress)' -]; - describe('Retryable Writes (unified)', function () { - runUnifiedSuite(loadSpecTests(path.join('retryable-writes', 'unified')), ({ description }) => { - return clientBulkWriteTests.includes(description) - ? `TODO(NODE-6257): implement client-level bulk write.` - : false; - }); + runUnifiedSuite(loadSpecTests(path.join('retryable-writes', 'unified'))); }); diff --git a/test/spec/retryable-writes/unified/client-bulkWrite-clientErrors.json b/test/spec/retryable-writes/unified/client-bulkWrite-clientErrors.json index e2c0fb9c0a..d16e0c9c8d 100644 --- a/test/spec/retryable-writes/unified/client-bulkWrite-clientErrors.json +++ b/test/spec/retryable-writes/unified/client-bulkWrite-clientErrors.json @@ -8,7 +8,8 @@ "replicaset", "sharded", "load-balanced" - ] + ], + "serverless": "forbid" } ], "createEntities": [ diff --git a/test/spec/retryable-writes/unified/client-bulkWrite-clientErrors.yml b/test/spec/retryable-writes/unified/client-bulkWrite-clientErrors.yml index 85696e89db..e5214b90f8 100644 --- a/test/spec/retryable-writes/unified/client-bulkWrite-clientErrors.yml +++ b/test/spec/retryable-writes/unified/client-bulkWrite-clientErrors.yml @@ -6,6 +6,7 @@ runOnRequirements: - replicaset - sharded - load-balanced + serverless: forbid createEntities: - client: diff --git a/test/spec/retryable-writes/unified/client-bulkWrite-serverErrors.json b/test/spec/retryable-writes/unified/client-bulkWrite-serverErrors.json index 4a0b210eb5..f58c82bcc7 100644 --- a/test/spec/retryable-writes/unified/client-bulkWrite-serverErrors.json +++ b/test/spec/retryable-writes/unified/client-bulkWrite-serverErrors.json @@ -8,7 +8,8 @@ "replicaset", "sharded", "load-balanced" - ] + ], + "serverless": "forbid" } ], "createEntities": [ diff --git a/test/spec/retryable-writes/unified/client-bulkWrite-serverErrors.yml b/test/spec/retryable-writes/unified/client-bulkWrite-serverErrors.yml index 23d2c622ee..722e5cc8e0 100644 --- a/test/spec/retryable-writes/unified/client-bulkWrite-serverErrors.yml +++ b/test/spec/retryable-writes/unified/client-bulkWrite-serverErrors.yml @@ -6,6 +6,7 @@ runOnRequirements: - replicaset - sharded - load-balanced + serverless: forbid createEntities: - client: diff --git a/test/tools/unified-spec-runner/match.ts b/test/tools/unified-spec-runner/match.ts index f92004c776..6214e815c2 100644 --- a/test/tools/unified-spec-runner/match.ts +++ b/test/tools/unified-spec-runner/match.ts @@ -23,6 +23,7 @@ import { type Document, Long, MongoBulkWriteError, + MongoClientBulkWriteError, MongoError, MongoServerError, ObjectId, @@ -765,7 +766,11 @@ export function expectErrorCheck( } if (expected.errorCode != null) { - expect(error, expectMessage).to.have.property('code', expected.errorCode); + if (error instanceof MongoClientBulkWriteError) { + expect(error.error).to.have.property('code', expected.errorCode); + } else { + expect(error, expectMessage).to.have.property('code', expected.errorCode); + } } if (expected.errorCodeName != null) { @@ -773,7 +778,10 @@ export function expectErrorCheck( } if (expected.errorLabelsContain != null) { - const mongoError = error as MongoError; + let mongoError = error as MongoError; + if (error instanceof MongoClientBulkWriteError) { + mongoError = error.error; + } for (const errorLabel of expected.errorLabelsContain) { expect( mongoError.hasErrorLabel(errorLabel), @@ -793,10 +801,18 @@ export function expectErrorCheck( } if (expected.expectResult != null) { - resultCheck(error, expected.expectResult as any, entities); + if ('partialResult' in error) { + resultCheck(error.partialResult, expected.expectResult as any, entities); + } else { + resultCheck(error, expected.expectResult as any, entities); + } } if (expected.errorResponse != null) { - resultCheck(error, expected.errorResponse, entities); + if (error instanceof MongoClientBulkWriteError) { + resultCheck(error.error, expected.errorResponse, entities); + } else { + resultCheck(error, expected.errorResponse, entities); + } } } diff --git a/test/unit/index.test.ts b/test/unit/index.test.ts index 883cc4b4ba..a208489f7b 100644 --- a/test/unit/index.test.ts +++ b/test/unit/index.test.ts @@ -75,6 +75,7 @@ const EXPECTED_EXPORTS = [ 'MongoClientAuthProviders', 'MongoClientBulkWriteCursorError', 'MongoClientBulkWriteExecutionError', + 'MongoClientBulkWriteUpdateError', 'MongoCompatibilityError', 'MongoCryptAzureKMSRequestError', 'MongoCryptCreateDataKeyError', diff --git a/test/unit/operations/client_bulk_write/results_merger.test.ts b/test/unit/operations/client_bulk_write/results_merger.test.ts index 342502eebb..c9a954e694 100644 --- a/test/unit/operations/client_bulk_write/results_merger.test.ts +++ b/test/unit/operations/client_bulk_write/results_merger.test.ts @@ -5,9 +5,40 @@ import { ClientBulkWriteCursorResponse, type ClientBulkWriteResult, ClientBulkWriteResultsMerger, + type Document, Long } from '../../../mongodb'; +class MockCursor { + operations: Document[]; + documents: Document[]; + response: ClientBulkWriteCursorResponse; + + constructor( + operations: Document[], + documents: Document[], + response: ClientBulkWriteCursorResponse + ) { + this.operations = operations; + this.documents = documents; + this.response = response; + } + + async next() { + return this.documents.shift(); + } + + async *[Symbol.asyncIterator](): AsyncGenerator { + while (true) { + const document = await this.next(); + if (document == null) { + return; + } + yield document; + } + } +} + describe('ClientBulkWriteResultsMerger', function () { describe('#constructor', function () { const resultsMerger = new ClientBulkWriteResultsMerger({}); @@ -76,8 +107,8 @@ describe('ClientBulkWriteResultsMerger', function () { const merger = new ClientBulkWriteResultsMerger({ verboseResults: true }); let result: ClientBulkWriteResult; - before(function () { - result = merger.merge(0, operations, response, documents); + before(async function () { + result = await merger.merge(new MockCursor(operations, documents, response)); }); it('merges the inserted count', function () { @@ -169,8 +200,8 @@ describe('ClientBulkWriteResultsMerger', function () { const merger = new ClientBulkWriteResultsMerger({ verboseResults: false }); let result: ClientBulkWriteResult; - before(function () { - result = merger.merge(0, operations, response, documents); + before(async function () { + result = await merger.merge(new MockCursor(operations, documents, response)); }); it('merges the inserted count', function () { @@ -207,106 +238,6 @@ describe('ClientBulkWriteResultsMerger', function () { }); }); }); - - context('when merging on a later batch', function () { - context('when requesting verbose results', function () { - // An example verbose response from the server without errors: - // { - // cursor: { - // id: Long('0'), - // firstBatch: [ { ok: 1, idx: 0, n: 1 }, { ok: 1, idx: 1, n: 1 } ], - // ns: 'admin.$cmd.bulkWrite' - // }, - // nErrors: 0, - // nInserted: 2, - // nMatched: 0, - // nModified: 0, - // nUpserted: 0, - // nDeleted: 0, - // ok: 1 - // } - context('when there are no errors', function () { - const operations = [ - { insert: 0, document: { _id: 1 } }, - { update: 0 }, - { update: 0 }, - { delete: 0 } - ]; - const documents = [ - { ok: 1, idx: 0, n: 1 }, // Insert - { ok: 1, idx: 1, n: 1, nModified: 1 }, // Update match - { ok: 1, idx: 2, n: 0, upserted: { _id: 1 } }, // Update no match with upsert - { ok: 1, idx: 3, n: 1 } // Delete - ]; - const serverResponse = { - cursor: { - id: new Long('0'), - firstBatch: documents, - ns: 'admin.$cmd.bulkWrite' - }, - nErrors: 0, - nInserted: 1, - nMatched: 1, - nModified: 1, - nUpserted: 1, - nDeleted: 1, - ok: 1 - }; - const response = new ClientBulkWriteCursorResponse(BSON.serialize(serverResponse), 0); - const merger = new ClientBulkWriteResultsMerger({ verboseResults: true }); - let result: ClientBulkWriteResult; - - before(function () { - result = merger.merge(20, operations, response, documents); - }); - - it('merges the inserted count', function () { - expect(result.insertedCount).to.equal(1); - }); - - it('sets insert results', function () { - expect(result.insertResults.get(20).insertedId).to.equal(1); - }); - - it('merges the upserted count', function () { - expect(result.upsertedCount).to.equal(1); - }); - - it('merges the matched count', function () { - expect(result.matchedCount).to.equal(1); - }); - - it('merges the modified count', function () { - expect(result.modifiedCount).to.equal(1); - }); - - it('sets the update results', function () { - expect(result.updateResults.get(21)).to.deep.equal({ - matchedCount: 1, - modifiedCount: 1, - didUpsert: false - }); - }); - - it('sets the upsert results', function () { - expect(result.updateResults.get(22)).to.deep.equal({ - matchedCount: 0, - modifiedCount: 0, - upsertedId: 1, - didUpsert: true - }); - }); - - it('merges the deleted count', function () { - expect(result.deletedCount).to.equal(1); - }); - - it('sets the delete results', function () { - expect(result.deleteResults.get(23).deletedCount).to.equal(1); - }); - }); - }); - }); }); }); }); From d713a3d00d770ce7c6e192c6ba848c9e1e3d0595 Mon Sep 17 00:00:00 2001 From: Durran Jordan Date: Fri, 4 Oct 2024 15:23:17 +0200 Subject: [PATCH 02/29] chore: comments --- src/error.ts | 49 ++++++++++------ src/index.ts | 1 - .../client_bulk_write/command_builder.ts | 28 +++------ src/operations/client_bulk_write/common.ts | 45 -------------- src/operations/client_bulk_write/executor.ts | 18 ++++-- .../client_bulk_write/results_merger.ts | 58 ++++++++++--------- test/integration/crud/crud.prose.test.ts | 2 +- test/tools/unified-spec-runner/match.ts | 4 +- test/unit/index.test.ts | 1 - .../client_bulk_write/command_builder.test.ts | 18 +++--- 10 files changed, 96 insertions(+), 128 deletions(-) diff --git a/src/error.ts b/src/error.ts index 4e3679bd9a..0e192755d6 100644 --- a/src/error.ts +++ b/src/error.ts @@ -1,4 +1,8 @@ import type { Document } from './bson'; +import { + type ClientBulkWriteError, + type ClientBulkWriteResult +} from './operations/client_bulk_write/common'; import type { ServerType } from './sdam/common'; import type { TopologyVersion } from './sdam/server_description'; import type { TopologyDescription } from './sdam/topology_description'; @@ -617,39 +621,50 @@ export class MongoGCPError extends MongoOIDCError { } /** - * An error indicating that an error occurred when processing bulk write results. + * An error indicating that an error occurred when executing the bulk write. * * @public * @category Error */ -export class MongoClientBulkWriteCursorError extends MongoRuntimeError { +export class MongoClientBulkWriteError extends MongoServerError { /** - * **Do not use this constructor!** - * - * Meant for internal use only. - * - * @remarks - * This class is only meant to be constructed within the driver. This constructor is - * not subject to semantic versioning compatibility guarantees and may change at any time. - * - * @public - **/ - constructor(message: string) { + * Write concern errors that occurred while executing the bulk write. This list may have + * multiple items if more than one server command was required to execute the bulk write. + */ + writeConcernErrors: Document[]; + /** + * Errors that occurred during the execution of individual write operations. This map will + * contain at most one entry if the bulk write was ordered. + */ + writeErrors: Map; + /** + * The results of any successful operations that were performed before the error was + * encountered. + */ + partialResult?: ClientBulkWriteResult; + + /** + * Initialize the client bulk write error. + * @param message - The error message. + */ + constructor(message: ErrorDescription) { super(message); + this.writeConcernErrors = []; + this.writeErrors = new Map(); } override get name(): string { - return 'MongoClientBulkWriteCursorError'; + return 'MongoClientBulkWriteError'; } } /** - * An error indicating that an error occurred when generating a bulk write update. + * An error indicating that an error occurred when processing bulk write results. * * @public * @category Error */ -export class MongoClientBulkWriteUpdateError extends MongoRuntimeError { +export class MongoClientBulkWriteCursorError extends MongoRuntimeError { /** * **Do not use this constructor!** * @@ -666,7 +681,7 @@ export class MongoClientBulkWriteUpdateError extends MongoRuntimeError { } override get name(): string { - return 'MongoClientBulkWriteUpdateError'; + return 'MongoClientBulkWriteCursorError'; } } diff --git a/src/index.ts b/src/index.ts index 851556207b..97f964ce54 100644 --- a/src/index.ts +++ b/src/index.ts @@ -47,7 +47,6 @@ export { MongoChangeStreamError, MongoClientBulkWriteCursorError, MongoClientBulkWriteExecutionError, - MongoClientBulkWriteUpdateError, MongoCompatibilityError, MongoCursorExhaustedError, MongoCursorInUseError, diff --git a/src/operations/client_bulk_write/command_builder.ts b/src/operations/client_bulk_write/command_builder.ts index afd962ccfb..df4e411162 100644 --- a/src/operations/client_bulk_write/command_builder.ts +++ b/src/operations/client_bulk_write/command_builder.ts @@ -1,9 +1,9 @@ import { BSON, type Document } from '../../bson'; import { DocumentSequence } from '../../cmap/commands'; -import { MongoClientBulkWriteUpdateError, MongoInvalidArgumentError } from '../../error'; +import { MongoAPIError, MongoInvalidArgumentError } from '../../error'; import { type PkFactory } from '../../mongo_client'; import type { Filter, OptionalId, UpdateFilter, WithoutId } from '../../mongo_types'; -import { DEFAULT_PK_FACTORY } from '../../utils'; +import { DEFAULT_PK_FACTORY, hasAtomicOperators } from '../../utils'; import { type CollationOptions } from '../command'; import { type Hint } from '../operation'; import type { @@ -342,13 +342,9 @@ export const buildUpdateManyOperation = ( * @param update - The update document. */ function validateUpdate(update: Document) { - const keys = Object.keys(update); - if (keys.length === 0) { - throw new MongoClientBulkWriteUpdateError('Client bulk write update models may not be empty.'); - } - if (!keys[0].startsWith('$')) { - throw new MongoClientBulkWriteUpdateError( - 'Client bulk write update models must only contain atomic modifiers (start with $).' + if (!hasAtomicOperators(update)) { + throw new MongoAPIError( + 'Client bulk write update models must only contain atomic modifiers (start with $) and must not be empty.' ); } } @@ -367,9 +363,7 @@ function createUpdateOperation( // document's first key does not start with "$". if (Array.isArray(model.update)) { if (model.update.length === 0) { - throw new MongoClientBulkWriteUpdateError( - 'Client bulk write update model pipelines may not be empty.' - ); + throw new MongoAPIError('Client bulk write update model pipelines may not be empty.'); } for (const update of model.update) { validateUpdate(update); @@ -419,13 +413,9 @@ export const buildReplaceOneOperation = ( model: ClientReplaceOneModel, index: number ): ClientReplaceOneOperation => { - const keys = Object.keys(model.replacement); - if (keys.length === 0) { - throw new MongoClientBulkWriteUpdateError('Client bulk write replace models may not be empty.'); - } - if (keys[0].startsWith('$')) { - throw new MongoClientBulkWriteUpdateError( - 'Client bulk write replace models must not contain atomic modifiers (start with $).' + if (hasAtomicOperators(model.replacement)) { + throw new MongoAPIError( + 'Client bulk write replace models must not contain atomic modifiers (start with $) and must not be empty.' ); } diff --git a/src/operations/client_bulk_write/common.ts b/src/operations/client_bulk_write/common.ts index 29d3e5e04f..e3de61ad6e 100644 --- a/src/operations/client_bulk_write/common.ts +++ b/src/operations/client_bulk_write/common.ts @@ -1,5 +1,4 @@ import { type Document } from '../../bson'; -import { type ErrorDescription, type MongoRuntimeError, MongoServerError } from '../../error'; import type { Filter, OptionalId, UpdateFilter, WithoutId } from '../../mongo_types'; import type { CollationOptions, CommandOperationOptions } from '../../operations/command'; import type { Hint } from '../../operations/operation'; @@ -187,50 +186,6 @@ export interface ClientBulkWriteError { message: string; } -/** - * An error indicating that an error occurred when executing the bulk write. - * - * @public - * @category Error - */ -export class MongoClientBulkWriteError extends MongoServerError { - /** - * A top-level error that occurred when attempting to communicate with the server or execute - * the bulk write. This value may not be populated if the exception was thrown due to errors - * occurring on individual writes. - */ - error?: MongoRuntimeError; - /** - * Write concern errors that occurred while executing the bulk write. This list may have - * multiple items if more than one server command was required to execute the bulk write. - */ - writeConcernErrors: Document[]; - /** - * Errors that occurred during the execution of individual write operations. This map will - * contain at most one entry if the bulk write was ordered. - */ - writeErrors: Map; - /** - * The results of any successful operations that were performed before the error was - * encountered. - */ - partialResult?: ClientBulkWriteResult; - - /** - * Initialize the client bulk write error. - * @param message - The error message. - */ - constructor(message: ErrorDescription) { - super(message); - this.writeConcernErrors = []; - this.writeErrors = new Map(); - } - - override get name(): string { - return 'MongoClientBulkWriteError'; - } -} - /** @public */ export interface ClientInsertOneResult { /** diff --git a/src/operations/client_bulk_write/executor.ts b/src/operations/client_bulk_write/executor.ts index 69b2cfbe6b..93acaac216 100644 --- a/src/operations/client_bulk_write/executor.ts +++ b/src/operations/client_bulk_write/executor.ts @@ -1,5 +1,9 @@ import { ClientBulkWriteCursor } from '../../cursor/client_bulk_write_cursor'; -import { MongoClientBulkWriteExecutionError, MongoServerError } from '../../error'; +import { + MongoClientBulkWriteError, + MongoClientBulkWriteExecutionError, + MongoServerError +} from '../../error'; import { type MongoClient } from '../../mongo_client'; import { WriteConcern } from '../../write_concern'; import { executeOperation } from '../execute_operation'; @@ -8,8 +12,7 @@ import { ClientBulkWriteCommandBuilder } from './command_builder'; import { type AnyClientBulkWriteModel, type ClientBulkWriteOptions, - type ClientBulkWriteResult, - MongoClientBulkWriteError + type ClientBulkWriteResult } from './common'; import { ClientBulkWriteResultsMerger } from './results_merger'; @@ -39,7 +42,12 @@ export class ClientBulkWriteExecutor { this.client = client; this.operations = operations; - this.options = { ordered: true, ...options }; + this.options = { + ordered: true, + bypassDocumentValidation: false, + verboseResults: false, + ...options + }; // If no write concern was provided, we inherit one from the client. if (!this.options.writeConcern) { @@ -86,7 +94,7 @@ export class ClientBulkWriteExecutor { const bulkWriteError = new MongoClientBulkWriteError({ message: 'Mongo client bulk write encountered an error during execution' }); - bulkWriteError.error = error; + bulkWriteError.cause = error; bulkWriteError.partialResult = resultsMerger.result; throw bulkWriteError; } else { diff --git a/src/operations/client_bulk_write/results_merger.ts b/src/operations/client_bulk_write/results_merger.ts index 593215194c..95dfaf4f1b 100644 --- a/src/operations/client_bulk_write/results_merger.ts +++ b/src/operations/client_bulk_write/results_merger.ts @@ -1,14 +1,14 @@ import { MongoWriteConcernError } from '../..'; import { type Document } from '../../bson'; import { type ClientBulkWriteCursor } from '../../cursor/client_bulk_write_cursor'; +import { MongoClientBulkWriteError } from '../../error'; import { type ClientBulkWriteError, type ClientBulkWriteOptions, type ClientBulkWriteResult, type ClientDeleteResult, type ClientInsertOneResult, - type ClientUpdateResult, - MongoClientBulkWriteError + type ClientUpdateResult } from './common'; /** @@ -61,33 +61,35 @@ export class ClientBulkWriteResultsMerger { try { for await (const document of cursor) { // Only add to maps if ok: 1 - if (document.ok === 1 && this.options.verboseResults) { - // Get the corresponding operation from the command. - const operation = cursor.operations[document.idx]; - // Handle insert results. - if ('insert' in operation) { - this.result.insertResults?.set(document.idx + this.currentBatchOffset, { - insertedId: operation.document._id - }); - } - // Handle update results. - if ('update' in operation) { - const result: ClientUpdateResult = { - matchedCount: document.n, - modifiedCount: document.nModified ?? 0, - // Check if the bulk did actually upsert. - didUpsert: document.upserted != null - }; - if (document.upserted) { - result.upsertedId = document.upserted._id; + if (document.ok === 1) { + if (this.options.verboseResults) { + // Get the corresponding operation from the command. + const operation = cursor.operations[document.idx]; + // Handle insert results. + if ('insert' in operation) { + this.result.insertResults?.set(document.idx + this.currentBatchOffset, { + insertedId: operation.document._id + }); + } + // Handle update results. + if ('update' in operation) { + const result: ClientUpdateResult = { + matchedCount: document.n, + modifiedCount: document.nModified ?? 0, + // Check if the bulk did actually upsert. + didUpsert: document.upserted != null + }; + if (document.upserted) { + result.upsertedId = document.upserted._id; + } + this.result.updateResults?.set(document.idx + this.currentBatchOffset, result); + } + // Handle delete results. + if ('delete' in operation) { + this.result.deleteResults?.set(document.idx + this.currentBatchOffset, { + deletedCount: document.n + }); } - this.result.updateResults?.set(document.idx + this.currentBatchOffset, result); - } - // Handle delete results. - if ('delete' in operation) { - this.result.deleteResults?.set(document.idx + this.currentBatchOffset, { - deletedCount: document.n - }); } } else { // If an individual write error is encountered during an ordered bulk write, drivers MUST diff --git a/test/integration/crud/crud.prose.test.ts b/test/integration/crud/crud.prose.test.ts index 5b8cd40bb7..de48cbbaca 100644 --- a/test/integration/crud/crud.prose.test.ts +++ b/test/integration/crud/crud.prose.test.ts @@ -684,7 +684,7 @@ describe('CRUD Prose Spec Tests', () => { .bulkWrite(models, { verboseResults: true }) .catch(error => error); expect(error).to.be.instanceOf(MongoClientBulkWriteError); - expect(error.error.code).to.equal(8); + expect(error.cause.code).to.equal(8); expect(error.partialResult).to.exist; // TODO: Need to handle batches in cursor one at a time and not call toArray() expect(error.partialResult.upsertedCount).to.equal(2); diff --git a/test/tools/unified-spec-runner/match.ts b/test/tools/unified-spec-runner/match.ts index 6214e815c2..21fa3b4067 100644 --- a/test/tools/unified-spec-runner/match.ts +++ b/test/tools/unified-spec-runner/match.ts @@ -767,7 +767,7 @@ export function expectErrorCheck( if (expected.errorCode != null) { if (error instanceof MongoClientBulkWriteError) { - expect(error.error).to.have.property('code', expected.errorCode); + expect(error.cause).to.have.property('code', expected.errorCode); } else { expect(error, expectMessage).to.have.property('code', expected.errorCode); } @@ -810,7 +810,7 @@ export function expectErrorCheck( if (expected.errorResponse != null) { if (error instanceof MongoClientBulkWriteError) { - resultCheck(error.error, expected.errorResponse, entities); + resultCheck(error.cause, expected.errorResponse, entities); } else { resultCheck(error, expected.errorResponse, entities); } diff --git a/test/unit/index.test.ts b/test/unit/index.test.ts index a208489f7b..883cc4b4ba 100644 --- a/test/unit/index.test.ts +++ b/test/unit/index.test.ts @@ -75,7 +75,6 @@ const EXPECTED_EXPORTS = [ 'MongoClientAuthProviders', 'MongoClientBulkWriteCursorError', 'MongoClientBulkWriteExecutionError', - 'MongoClientBulkWriteUpdateError', 'MongoCompatibilityError', 'MongoCryptAzureKMSRequestError', 'MongoCryptCreateDataKeyError', diff --git a/test/unit/operations/client_bulk_write/command_builder.test.ts b/test/unit/operations/client_bulk_write/command_builder.test.ts index e92966795b..ef3cc6f0b0 100644 --- a/test/unit/operations/client_bulk_write/command_builder.test.ts +++ b/test/unit/operations/client_bulk_write/command_builder.test.ts @@ -34,7 +34,7 @@ describe('ClientBulkWriteCommandBuilder', function () { ordered: false, comment: { bulk: 'write' } }); - const command = builder.buildBatch(48000000, 100000); + const command = builder.buildBatch(48000000, 100000, 16777216); it('sets the bulkWrite command', function () { expect(command.bulkWrite).to.equal(1); @@ -79,7 +79,7 @@ describe('ClientBulkWriteCommandBuilder', function () { document: { _id: id, name: 1 } }; const builder = new ClientBulkWriteCommandBuilder([model], {}); - const command = builder.buildBatch(48000000, 100000); + const command = builder.buildBatch(48000000, 100000, 16777216); it('sets the bulkWrite command', function () { expect(command.bulkWrite).to.equal(1); @@ -122,8 +122,8 @@ describe('ClientBulkWriteCommandBuilder', function () { document: { _id: idTwo, name: 2 } }; const builder = new ClientBulkWriteCommandBuilder([modelOne, modelTwo], {}); - const commandOne = builder.buildBatch(48000000, 1); - const commandTwo = builder.buildBatch(48000000, 1); + const commandOne = builder.buildBatch(48000000, 1, 16777216); + const commandTwo = builder.buildBatch(48000000, 1, 16777216); it('splits the operations into multiple commands', function () { expect(commandOne.ops.documents).to.deep.equal([ @@ -149,8 +149,8 @@ describe('ClientBulkWriteCommandBuilder', function () { document: { _id: idTwo, name: 2 } }; const builder = new ClientBulkWriteCommandBuilder([modelOne, modelTwo], {}); - const commandOne = builder.buildBatch(1090, 100000); - const commandTwo = builder.buildBatch(1090, 100000); + const commandOne = builder.buildBatch(1090, 100000, 16777216); + const commandTwo = builder.buildBatch(1090, 100000, 16777216); it('splits the operations into multiple commands', function () { expect(commandOne.ops.documents).to.deep.equal([ @@ -176,7 +176,7 @@ describe('ClientBulkWriteCommandBuilder', function () { document: { _id: idTwo, name: 2 } }; const builder = new ClientBulkWriteCommandBuilder([modelOne, modelTwo], {}); - const command = builder.buildBatch(48000000, 100000); + const command = builder.buildBatch(48000000, 100000, 16777216); it('sets the bulkWrite command', function () { expect(command.bulkWrite).to.equal(1); @@ -210,7 +210,7 @@ describe('ClientBulkWriteCommandBuilder', function () { document: { _id: idTwo, name: 2 } }; const builder = new ClientBulkWriteCommandBuilder([modelOne, modelTwo], {}); - const command = builder.buildBatch(48000000, 100000); + const command = builder.buildBatch(48000000, 100000, 16777216); it('sets the bulkWrite command', function () { expect(command.bulkWrite).to.equal(1); @@ -253,7 +253,7 @@ describe('ClientBulkWriteCommandBuilder', function () { document: { _id: idThree, name: 2 } }; const builder = new ClientBulkWriteCommandBuilder([modelOne, modelTwo, modelThree], {}); - const command = builder.buildBatch(48000000, 100000); + const command = builder.buildBatch(48000000, 100000, 16777216); it('sets the bulkWrite command', function () { expect(command.bulkWrite).to.equal(1); From 3c2bd6114c0c7a64f288e96e6429338e908fc833 Mon Sep 17 00:00:00 2001 From: Durran Jordan Date: Fri, 4 Oct 2024 16:27:00 +0200 Subject: [PATCH 03/29] fix: exports --- src/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/index.ts b/src/index.ts index 97f964ce54..34ffee7bb3 100644 --- a/src/index.ts +++ b/src/index.ts @@ -46,6 +46,7 @@ export { MongoBatchReExecutionError, MongoChangeStreamError, MongoClientBulkWriteCursorError, + MongoClientBulkWriteError, MongoClientBulkWriteExecutionError, MongoCompatibilityError, MongoCursorExhaustedError, From ccd25a1b53f076163133dd368338eb3f63328294 Mon Sep 17 00:00:00 2001 From: Durran Jordan Date: Fri, 4 Oct 2024 16:32:09 +0200 Subject: [PATCH 04/29] test: make retryable --- src/operations/client_bulk_write/client_bulk_write.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/operations/client_bulk_write/client_bulk_write.ts b/src/operations/client_bulk_write/client_bulk_write.ts index ec98efcf4a..e75e2c8f7e 100644 --- a/src/operations/client_bulk_write/client_bulk_write.ts +++ b/src/operations/client_bulk_write/client_bulk_write.ts @@ -83,5 +83,6 @@ export class ClientBulkWriteOperation extends CommandOperation Date: Fri, 4 Oct 2024 17:01:12 +0200 Subject: [PATCH 05/29] fix: tests --- src/index.ts | 1 + test/unit/index.test.ts | 2 ++ 2 files changed, 3 insertions(+) diff --git a/src/index.ts b/src/index.ts index 34ffee7bb3..9538ce1d5c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -478,6 +478,7 @@ export type { } from './operations/aggregate'; export type { AnyClientBulkWriteModel, + ClientBulkWriteError, ClientBulkWriteOptions, ClientBulkWriteResult, ClientDeleteManyModel, diff --git a/test/unit/index.test.ts b/test/unit/index.test.ts index 883cc4b4ba..4322ae39d4 100644 --- a/test/unit/index.test.ts +++ b/test/unit/index.test.ts @@ -27,6 +27,7 @@ const EXPECTED_EXPORTS = [ 'CancellationToken', 'ChangeStream', 'ChangeStreamCursor', + 'ClientBulkWriteError', 'ClientEncryption', 'ClientSession', 'Code', @@ -74,6 +75,7 @@ const EXPECTED_EXPORTS = [ 'MongoClient', 'MongoClientAuthProviders', 'MongoClientBulkWriteCursorError', + 'MongoClientBulkWriteError', 'MongoClientBulkWriteExecutionError', 'MongoCompatibilityError', 'MongoCryptAzureKMSRequestError', From 6182bd1dd2691c365e2fe8eb58b08200c5526dc1 Mon Sep 17 00:00:00 2001 From: Durran Jordan Date: Mon, 7 Oct 2024 18:53:47 +0200 Subject: [PATCH 06/29] fix: batch reset on retry --- .../client_bulk_write/client_bulk_write.ts | 7 ++++++- src/operations/client_bulk_write/command_builder.ts | 13 +++++++++++++ src/operations/client_bulk_write/common.ts | 1 + src/operations/execute_operation.ts | 4 ++++ src/operations/operation.ts | 7 ++++++- test/unit/index.test.ts | 1 - 6 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/operations/client_bulk_write/client_bulk_write.ts b/src/operations/client_bulk_write/client_bulk_write.ts index e75e2c8f7e..6257fdca63 100644 --- a/src/operations/client_bulk_write/client_bulk_write.ts +++ b/src/operations/client_bulk_write/client_bulk_write.ts @@ -27,6 +27,10 @@ export class ClientBulkWriteOperation extends CommandOperation(); + // In the case of retries we need to mark where we started this batch. + this.previousModelIndex = this.currentModelIndex; while (this.currentModelIndex < this.models.length) { const model = this.models[this.currentModelIndex]; diff --git a/src/operations/client_bulk_write/common.ts b/src/operations/client_bulk_write/common.ts index e3de61ad6e..11234cf4ea 100644 --- a/src/operations/client_bulk_write/common.ts +++ b/src/operations/client_bulk_write/common.ts @@ -181,6 +181,7 @@ export interface ClientBulkWriteResult { deleteResults?: Map; } +/** @public */ export interface ClientBulkWriteError { code: number; message: string; diff --git a/src/operations/execute_operation.ts b/src/operations/execute_operation.ts index 97e6045073..919e376f3d 100644 --- a/src/operations/execute_operation.ts +++ b/src/operations/execute_operation.ts @@ -260,6 +260,10 @@ async function tryOperation< } try { + // If tries > 0 and we are command batching we need to reset the batch. + if (tries > 0 && operation.hasAspect(Aspect.COMMAND_BATCHING)) { + operation.resetBatch(); + } return await operation.execute(server, session); } catch (operationError) { if (!(operationError instanceof MongoError)) throw operationError; diff --git a/src/operations/operation.ts b/src/operations/operation.ts index b51cca4020..12f168b76e 100644 --- a/src/operations/operation.ts +++ b/src/operations/operation.ts @@ -11,7 +11,8 @@ export const Aspect = { EXPLAINABLE: Symbol('EXPLAINABLE'), SKIP_COLLATION: Symbol('SKIP_COLLATION'), CURSOR_CREATING: Symbol('CURSOR_CREATING'), - MUST_SELECT_SAME_SERVER: Symbol('MUST_SELECT_SAME_SERVER') + MUST_SELECT_SAME_SERVER: Symbol('MUST_SELECT_SAME_SERVER'), + COMMAND_BATCHING: Symbol('COMMAND_BATCHING') } as const; /** @public */ @@ -98,6 +99,10 @@ export abstract class AbstractOperation { this[kSession] = undefined; } + resetBatch(): boolean { + return true; + } + get canRetryRead(): boolean { return this.hasAspect(Aspect.RETRYABLE) && this.hasAspect(Aspect.READ_OPERATION); } diff --git a/test/unit/index.test.ts b/test/unit/index.test.ts index 4322ae39d4..595f372c43 100644 --- a/test/unit/index.test.ts +++ b/test/unit/index.test.ts @@ -27,7 +27,6 @@ const EXPECTED_EXPORTS = [ 'CancellationToken', 'ChangeStream', 'ChangeStreamCursor', - 'ClientBulkWriteError', 'ClientEncryption', 'ClientSession', 'Code', From 94463ed0d270f29f6cb0cde8746be08bf6f1ba3a Mon Sep 17 00:00:00 2001 From: Durran Jordan Date: Mon, 7 Oct 2024 20:12:28 +0200 Subject: [PATCH 07/29] fix: write concern error results --- .../client_bulk_write/results_merger.ts | 71 +++++++++++-------- src/operations/execute_operation.ts | 1 + 2 files changed, 44 insertions(+), 28 deletions(-) diff --git a/src/operations/client_bulk_write/results_merger.ts b/src/operations/client_bulk_write/results_merger.ts index 95dfaf4f1b..3824ae2a38 100644 --- a/src/operations/client_bulk_write/results_merger.ts +++ b/src/operations/client_bulk_write/results_merger.ts @@ -63,33 +63,7 @@ export class ClientBulkWriteResultsMerger { // Only add to maps if ok: 1 if (document.ok === 1) { if (this.options.verboseResults) { - // Get the corresponding operation from the command. - const operation = cursor.operations[document.idx]; - // Handle insert results. - if ('insert' in operation) { - this.result.insertResults?.set(document.idx + this.currentBatchOffset, { - insertedId: operation.document._id - }); - } - // Handle update results. - if ('update' in operation) { - const result: ClientUpdateResult = { - matchedCount: document.n, - modifiedCount: document.nModified ?? 0, - // Check if the bulk did actually upsert. - didUpsert: document.upserted != null - }; - if (document.upserted) { - result.upsertedId = document.upserted._id; - } - this.result.updateResults?.set(document.idx + this.currentBatchOffset, result); - } - // Handle delete results. - if ('delete' in operation) { - this.result.deleteResults?.set(document.idx + this.currentBatchOffset, { - deletedCount: document.n - }); - } + this.processDocument(cursor, document); } } else { // If an individual write error is encountered during an ordered bulk write, drivers MUST @@ -124,7 +98,13 @@ export class ClientBulkWriteResultsMerger { deletedCount: result.nDeleted, writeConcernError: result.writeConcernError }; - // docs = result.cursor.firstBatch; + if (this.options.verboseResults && result.cursor.firstBatch) { + for (const document of result.cursor.firstBatch) { + if (document.ok === 1) { + this.processDocument(cursor, document); + } + } + } } else { throw error; } @@ -152,6 +132,41 @@ export class ClientBulkWriteResultsMerger { return this.result; } + /** + * Process an invididual document in the results. + * @param cursor - The cursor. + * @param document - The document to process. + */ + private processDocument(cursor: ClientBulkWriteCursor, document: Document) { + // Get the corresponding operation from the command. + const operation = cursor.operations[document.idx]; + // Handle insert results. + if ('insert' in operation) { + this.result.insertResults?.set(document.idx + this.currentBatchOffset, { + insertedId: operation.document._id + }); + } + // Handle update results. + if ('update' in operation) { + const result: ClientUpdateResult = { + matchedCount: document.n, + modifiedCount: document.nModified ?? 0, + // Check if the bulk did actually upsert. + didUpsert: document.upserted != null + }; + if (document.upserted) { + result.upsertedId = document.upserted._id; + } + this.result.updateResults?.set(document.idx + this.currentBatchOffset, result); + } + // Handle delete results. + if ('delete' in operation) { + this.result.deleteResults?.set(document.idx + this.currentBatchOffset, { + deletedCount: document.n + }); + } + } + /** * Increment the result counts. * @param document - The document with the results. diff --git a/src/operations/execute_operation.ts b/src/operations/execute_operation.ts index 919e376f3d..0cdbe2174c 100644 --- a/src/operations/execute_operation.ts +++ b/src/operations/execute_operation.ts @@ -262,6 +262,7 @@ async function tryOperation< try { // If tries > 0 and we are command batching we need to reset the batch. if (tries > 0 && operation.hasAspect(Aspect.COMMAND_BATCHING)) { + console.log('retrying'); operation.resetBatch(); } return await operation.execute(server, session); From 4d57b895ad6bc3ba66a09194513855e5584da186 Mon Sep 17 00:00:00 2001 From: Durran Jordan Date: Mon, 7 Oct 2024 20:39:10 +0200 Subject: [PATCH 08/29] chore: console --- src/operations/execute_operation.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/operations/execute_operation.ts b/src/operations/execute_operation.ts index 0cdbe2174c..919e376f3d 100644 --- a/src/operations/execute_operation.ts +++ b/src/operations/execute_operation.ts @@ -262,7 +262,6 @@ async function tryOperation< try { // If tries > 0 and we are command batching we need to reset the batch. if (tries > 0 && operation.hasAspect(Aspect.COMMAND_BATCHING)) { - console.log('retrying'); operation.resetBatch(); } return await operation.execute(server, session); From 2fe5d23d0cdd14a1bc657353d6daf6b2bd042951 Mon Sep 17 00:00:00 2001 From: Durran Jordan Date: Mon, 7 Oct 2024 21:07:41 +0200 Subject: [PATCH 09/29] chore: debug --- src/operations/client_bulk_write/results_merger.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/operations/client_bulk_write/results_merger.ts b/src/operations/client_bulk_write/results_merger.ts index 3824ae2a38..551b9251d2 100644 --- a/src/operations/client_bulk_write/results_merger.ts +++ b/src/operations/client_bulk_write/results_merger.ts @@ -70,6 +70,7 @@ export class ClientBulkWriteResultsMerger { // record the error in writeErrors and immediately throw the exception. Otherwise, drivers // MUST continue to iterate the results cursor and execute any further bulkWrite batches. if (this.options.ordered) { + console.log(document); const error = new MongoClientBulkWriteError({ message: 'Mongo client ordered bulk write encountered a write error.' }); From 03de03111351577517d9d55bbf1d511cc4c29f21 Mon Sep 17 00:00:00 2001 From: Durran Jordan Date: Mon, 7 Oct 2024 22:09:21 +0200 Subject: [PATCH 10/29] fix: check if retryable --- src/operations/client_bulk_write/client_bulk_write.ts | 4 ++++ src/operations/client_bulk_write/command_builder.ts | 5 +++++ src/operations/client_bulk_write/results_merger.ts | 1 - 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/operations/client_bulk_write/client_bulk_write.ts b/src/operations/client_bulk_write/client_bulk_write.ts index 6257fdca63..091474a123 100644 --- a/src/operations/client_bulk_write/client_bulk_write.ts +++ b/src/operations/client_bulk_write/client_bulk_write.ts @@ -31,6 +31,10 @@ export class ClientBulkWriteOperation extends CommandOperation { + return model.name === 'deleteMany' || model.name === 'updateMany'; + }); } /** diff --git a/src/operations/client_bulk_write/results_merger.ts b/src/operations/client_bulk_write/results_merger.ts index 551b9251d2..3824ae2a38 100644 --- a/src/operations/client_bulk_write/results_merger.ts +++ b/src/operations/client_bulk_write/results_merger.ts @@ -70,7 +70,6 @@ export class ClientBulkWriteResultsMerger { // record the error in writeErrors and immediately throw the exception. Otherwise, drivers // MUST continue to iterate the results cursor and execute any further bulkWrite batches. if (this.options.ordered) { - console.log(document); const error = new MongoClientBulkWriteError({ message: 'Mongo client ordered bulk write encountered a write error.' }); From 2200ff309a0e4eee58f6760e48c7782588d2ebca Mon Sep 17 00:00:00 2001 From: Durran Jordan Date: Mon, 7 Oct 2024 22:50:06 +0200 Subject: [PATCH 11/29] chore: debug --- test/spec/crud/{unified => }/aggregate-allowdiskuse.json | 0 test/spec/crud/{unified => }/aggregate-allowdiskuse.yml | 0 test/spec/crud/{unified => }/aggregate-collation.json | 0 test/spec/crud/{unified => }/aggregate-collation.yml | 0 test/spec/crud/{unified => }/aggregate-let.json | 0 test/spec/crud/{unified => }/aggregate-let.yml | 0 test/spec/crud/{unified => }/aggregate-merge-errorResponse.json | 0 test/spec/crud/{unified => }/aggregate-merge-errorResponse.yml | 0 test/spec/crud/{unified => }/aggregate-merge.json | 0 test/spec/crud/{unified => }/aggregate-merge.yml | 0 test/spec/crud/{unified => }/aggregate-out-readConcern.json | 0 test/spec/crud/{unified => }/aggregate-out-readConcern.yml | 0 test/spec/crud/{unified => }/aggregate-out.json | 0 test/spec/crud/{unified => }/aggregate-out.yml | 0 test/spec/crud/{unified => }/aggregate-write-readPreference.json | 0 test/spec/crud/{unified => }/aggregate-write-readPreference.yml | 0 test/spec/crud/{unified => }/aggregate.json | 0 test/spec/crud/{unified => }/aggregate.yml | 0 .../crud/{unified => }/bulkWrite-arrayFilters-clientError.json | 0 .../crud/{unified => }/bulkWrite-arrayFilters-clientError.yml | 0 test/spec/crud/{unified => }/bulkWrite-arrayFilters.json | 0 test/spec/crud/{unified => }/bulkWrite-arrayFilters.yml | 0 test/spec/crud/{unified => }/bulkWrite-collation.json | 0 test/spec/crud/{unified => }/bulkWrite-collation.yml | 0 test/spec/crud/{unified => }/bulkWrite-comment.json | 0 test/spec/crud/{unified => }/bulkWrite-comment.yml | 0 .../crud/{unified => }/bulkWrite-delete-hint-clientError.json | 0 .../crud/{unified => }/bulkWrite-delete-hint-clientError.yml | 0 .../crud/{unified => }/bulkWrite-delete-hint-serverError.json | 0 .../crud/{unified => }/bulkWrite-delete-hint-serverError.yml | 0 test/spec/crud/{unified => }/bulkWrite-delete-hint.json | 0 test/spec/crud/{unified => }/bulkWrite-delete-hint.yml | 0 .../{unified => }/bulkWrite-deleteMany-hint-unacknowledged.json | 0 .../{unified => }/bulkWrite-deleteMany-hint-unacknowledged.yml | 0 test/spec/crud/{unified => }/bulkWrite-deleteMany-let.json | 0 test/spec/crud/{unified => }/bulkWrite-deleteMany-let.yml | 0 .../{unified => }/bulkWrite-deleteOne-hint-unacknowledged.json | 0 .../{unified => }/bulkWrite-deleteOne-hint-unacknowledged.yml | 0 test/spec/crud/{unified => }/bulkWrite-deleteOne-let.json | 0 test/spec/crud/{unified => }/bulkWrite-deleteOne-let.yml | 0 test/spec/crud/{unified => }/bulkWrite-errorResponse.json | 0 test/spec/crud/{unified => }/bulkWrite-errorResponse.yml | 0 .../crud/{unified => }/bulkWrite-insertOne-dots_and_dollars.json | 0 .../crud/{unified => }/bulkWrite-insertOne-dots_and_dollars.yml | 0 .../{unified => }/bulkWrite-replaceOne-dots_and_dollars.json | 0 .../crud/{unified => }/bulkWrite-replaceOne-dots_and_dollars.yml | 0 .../{unified => }/bulkWrite-replaceOne-hint-unacknowledged.json | 0 .../{unified => }/bulkWrite-replaceOne-hint-unacknowledged.yml | 0 test/spec/crud/{unified => }/bulkWrite-replaceOne-let.json | 0 test/spec/crud/{unified => }/bulkWrite-replaceOne-let.yml | 0 .../crud/{unified => }/bulkWrite-update-hint-clientError.json | 0 .../crud/{unified => }/bulkWrite-update-hint-clientError.yml | 0 .../crud/{unified => }/bulkWrite-update-hint-serverError.json | 0 .../crud/{unified => }/bulkWrite-update-hint-serverError.yml | 0 test/spec/crud/{unified => }/bulkWrite-update-hint.json | 0 test/spec/crud/{unified => }/bulkWrite-update-hint.yml | 0 test/spec/crud/{unified => }/bulkWrite-update-validation.json | 0 test/spec/crud/{unified => }/bulkWrite-update-validation.yml | 0 .../{unified => }/bulkWrite-updateMany-dots_and_dollars.json | 0 .../crud/{unified => }/bulkWrite-updateMany-dots_and_dollars.yml | 0 .../{unified => }/bulkWrite-updateMany-hint-unacknowledged.json | 0 .../{unified => }/bulkWrite-updateMany-hint-unacknowledged.yml | 0 test/spec/crud/{unified => }/bulkWrite-updateMany-let.json | 0 test/spec/crud/{unified => }/bulkWrite-updateMany-let.yml | 0 .../crud/{unified => }/bulkWrite-updateOne-dots_and_dollars.json | 0 .../crud/{unified => }/bulkWrite-updateOne-dots_and_dollars.yml | 0 .../{unified => }/bulkWrite-updateOne-hint-unacknowledged.json | 0 .../{unified => }/bulkWrite-updateOne-hint-unacknowledged.yml | 0 test/spec/crud/{unified => }/bulkWrite-updateOne-let.json | 0 test/spec/crud/{unified => }/bulkWrite-updateOne-let.yml | 0 test/spec/crud/{unified => }/bulkWrite.json | 0 test/spec/crud/{unified => }/bulkWrite.yml | 0 test/spec/crud/{unified => }/count-collation.json | 0 test/spec/crud/{unified => }/count-collation.yml | 0 test/spec/crud/{unified => }/count-empty.json | 0 test/spec/crud/{unified => }/count-empty.yml | 0 test/spec/crud/{unified => }/count.json | 0 test/spec/crud/{unified => }/count.yml | 0 test/spec/crud/{unified => }/countDocuments-comment.json | 0 test/spec/crud/{unified => }/countDocuments-comment.yml | 0 .../crud/{unified => }/db-aggregate-write-readPreference.json | 0 .../crud/{unified => }/db-aggregate-write-readPreference.yml | 0 test/spec/crud/{unified => }/db-aggregate.json | 0 test/spec/crud/{unified => }/db-aggregate.yml | 0 test/spec/crud/{unified => }/deleteMany-collation.json | 0 test/spec/crud/{unified => }/deleteMany-collation.yml | 0 test/spec/crud/{unified => }/deleteMany-comment.json | 0 test/spec/crud/{unified => }/deleteMany-comment.yml | 0 test/spec/crud/{unified => }/deleteMany-hint-clientError.json | 0 test/spec/crud/{unified => }/deleteMany-hint-clientError.yml | 0 test/spec/crud/{unified => }/deleteMany-hint-serverError.json | 0 test/spec/crud/{unified => }/deleteMany-hint-serverError.yml | 0 test/spec/crud/{unified => }/deleteMany-hint-unacknowledged.json | 0 test/spec/crud/{unified => }/deleteMany-hint-unacknowledged.yml | 0 test/spec/crud/{unified => }/deleteMany-hint.json | 0 test/spec/crud/{unified => }/deleteMany-hint.yml | 0 test/spec/crud/{unified => }/deleteMany-let.json | 0 test/spec/crud/{unified => }/deleteMany-let.yml | 0 test/spec/crud/{unified => }/deleteMany.json | 0 test/spec/crud/{unified => }/deleteMany.yml | 0 test/spec/crud/{unified => }/deleteOne-collation.json | 0 test/spec/crud/{unified => }/deleteOne-collation.yml | 0 test/spec/crud/{unified => }/deleteOne-comment.json | 0 test/spec/crud/{unified => }/deleteOne-comment.yml | 0 test/spec/crud/{unified => }/deleteOne-errorResponse.json | 0 test/spec/crud/{unified => }/deleteOne-errorResponse.yml | 0 test/spec/crud/{unified => }/deleteOne-hint-clientError.json | 0 test/spec/crud/{unified => }/deleteOne-hint-clientError.yml | 0 test/spec/crud/{unified => }/deleteOne-hint-serverError.json | 0 test/spec/crud/{unified => }/deleteOne-hint-serverError.yml | 0 test/spec/crud/{unified => }/deleteOne-hint-unacknowledged.json | 0 test/spec/crud/{unified => }/deleteOne-hint-unacknowledged.yml | 0 test/spec/crud/{unified => }/deleteOne-hint.json | 0 test/spec/crud/{unified => }/deleteOne-hint.yml | 0 test/spec/crud/{unified => }/deleteOne-let.json | 0 test/spec/crud/{unified => }/deleteOne-let.yml | 0 test/spec/crud/{unified => }/deleteOne.json | 0 test/spec/crud/{unified => }/deleteOne.yml | 0 test/spec/crud/{unified => }/distinct-collation.json | 0 test/spec/crud/{unified => }/distinct-collation.yml | 0 test/spec/crud/{unified => }/distinct-comment.json | 0 test/spec/crud/{unified => }/distinct-comment.yml | 0 test/spec/crud/{unified => }/distinct.json | 0 test/spec/crud/{unified => }/distinct.yml | 0 test/spec/crud/{unified => }/estimatedDocumentCount-comment.json | 0 test/spec/crud/{unified => }/estimatedDocumentCount-comment.yml | 0 test/spec/crud/{unified => }/estimatedDocumentCount.json | 0 test/spec/crud/{unified => }/estimatedDocumentCount.yml | 0 test/spec/crud/{unified => }/find-allowdiskuse-clientError.json | 0 test/spec/crud/{unified => }/find-allowdiskuse-clientError.yml | 0 test/spec/crud/{unified => }/find-allowdiskuse-serverError.json | 0 test/spec/crud/{unified => }/find-allowdiskuse-serverError.yml | 0 test/spec/crud/{unified => }/find-allowdiskuse.json | 0 test/spec/crud/{unified => }/find-allowdiskuse.yml | 0 test/spec/crud/{unified => }/find-collation.json | 0 test/spec/crud/{unified => }/find-collation.yml | 0 test/spec/crud/{unified => }/find-comment.json | 0 test/spec/crud/{unified => }/find-comment.yml | 0 test/spec/crud/{unified => }/find-let.json | 0 test/spec/crud/{unified => }/find-let.yml | 0 test/spec/crud/{unified => }/find.json | 0 test/spec/crud/{unified => }/find.yml | 0 test/spec/crud/{unified => }/findOneAndDelete-collation.json | 0 test/spec/crud/{unified => }/findOneAndDelete-collation.yml | 0 test/spec/crud/{unified => }/findOneAndDelete-comment.json | 0 test/spec/crud/{unified => }/findOneAndDelete-comment.yml | 0 .../crud/{unified => }/findOneAndDelete-hint-clientError.json | 0 .../crud/{unified => }/findOneAndDelete-hint-clientError.yml | 0 .../crud/{unified => }/findOneAndDelete-hint-serverError.json | 0 .../crud/{unified => }/findOneAndDelete-hint-serverError.yml | 0 .../crud/{unified => }/findOneAndDelete-hint-unacknowledged.json | 0 .../crud/{unified => }/findOneAndDelete-hint-unacknowledged.yml | 0 test/spec/crud/{unified => }/findOneAndDelete-hint.json | 0 test/spec/crud/{unified => }/findOneAndDelete-hint.yml | 0 test/spec/crud/{unified => }/findOneAndDelete-let.json | 0 test/spec/crud/{unified => }/findOneAndDelete-let.yml | 0 test/spec/crud/{unified => }/findOneAndDelete.json | 0 test/spec/crud/{unified => }/findOneAndDelete.yml | 0 test/spec/crud/{unified => }/findOneAndReplace-collation.json | 0 test/spec/crud/{unified => }/findOneAndReplace-collation.yml | 0 test/spec/crud/{unified => }/findOneAndReplace-comment.json | 0 test/spec/crud/{unified => }/findOneAndReplace-comment.yml | 0 .../crud/{unified => }/findOneAndReplace-dots_and_dollars.json | 0 .../crud/{unified => }/findOneAndReplace-dots_and_dollars.yml | 0 .../crud/{unified => }/findOneAndReplace-hint-clientError.json | 0 .../crud/{unified => }/findOneAndReplace-hint-clientError.yml | 0 .../crud/{unified => }/findOneAndReplace-hint-serverError.json | 0 .../crud/{unified => }/findOneAndReplace-hint-serverError.yml | 0 .../{unified => }/findOneAndReplace-hint-unacknowledged.json | 0 .../crud/{unified => }/findOneAndReplace-hint-unacknowledged.yml | 0 test/spec/crud/{unified => }/findOneAndReplace-hint.json | 0 test/spec/crud/{unified => }/findOneAndReplace-hint.yml | 0 test/spec/crud/{unified => }/findOneAndReplace-let.json | 0 test/spec/crud/{unified => }/findOneAndReplace-let.yml | 0 test/spec/crud/{unified => }/findOneAndReplace-upsert.json | 0 test/spec/crud/{unified => }/findOneAndReplace-upsert.yml | 0 test/spec/crud/{unified => }/findOneAndReplace.json | 0 test/spec/crud/{unified => }/findOneAndReplace.yml | 0 test/spec/crud/{unified => }/findOneAndUpdate-arrayFilters.json | 0 test/spec/crud/{unified => }/findOneAndUpdate-arrayFilters.yml | 0 test/spec/crud/{unified => }/findOneAndUpdate-collation.json | 0 test/spec/crud/{unified => }/findOneAndUpdate-collation.yml | 0 test/spec/crud/{unified => }/findOneAndUpdate-comment.json | 0 test/spec/crud/{unified => }/findOneAndUpdate-comment.yml | 0 .../crud/{unified => }/findOneAndUpdate-dots_and_dollars.json | 0 .../crud/{unified => }/findOneAndUpdate-dots_and_dollars.yml | 0 test/spec/crud/{unified => }/findOneAndUpdate-errorResponse.json | 0 test/spec/crud/{unified => }/findOneAndUpdate-errorResponse.yml | 0 .../crud/{unified => }/findOneAndUpdate-hint-clientError.json | 0 .../crud/{unified => }/findOneAndUpdate-hint-clientError.yml | 0 .../crud/{unified => }/findOneAndUpdate-hint-serverError.json | 0 .../crud/{unified => }/findOneAndUpdate-hint-serverError.yml | 0 .../crud/{unified => }/findOneAndUpdate-hint-unacknowledged.json | 0 .../crud/{unified => }/findOneAndUpdate-hint-unacknowledged.yml | 0 test/spec/crud/{unified => }/findOneAndUpdate-hint.json | 0 test/spec/crud/{unified => }/findOneAndUpdate-hint.yml | 0 test/spec/crud/{unified => }/findOneAndUpdate-let.json | 0 test/spec/crud/{unified => }/findOneAndUpdate-let.yml | 0 test/spec/crud/{unified => }/findOneAndUpdate.json | 0 test/spec/crud/{unified => }/findOneAndUpdate.yml | 0 test/spec/crud/{unified => }/insertMany-comment.json | 0 test/spec/crud/{unified => }/insertMany-comment.yml | 0 test/spec/crud/{unified => }/insertMany-dots_and_dollars.json | 0 test/spec/crud/{unified => }/insertMany-dots_and_dollars.yml | 0 test/spec/crud/{unified => }/insertMany.json | 0 test/spec/crud/{unified => }/insertMany.yml | 0 test/spec/crud/{unified => }/insertOne-comment.json | 0 test/spec/crud/{unified => }/insertOne-comment.yml | 0 test/spec/crud/{unified => }/insertOne-dots_and_dollars.json | 0 test/spec/crud/{unified => }/insertOne-dots_and_dollars.yml | 0 test/spec/crud/{unified => }/insertOne-errorResponse.json | 0 test/spec/crud/{unified => }/insertOne-errorResponse.yml | 0 test/spec/crud/{unified => }/insertOne.json | 0 test/spec/crud/{unified => }/insertOne.yml | 0 test/spec/crud/{unified => }/replaceOne-collation.json | 0 test/spec/crud/{unified => }/replaceOne-collation.yml | 0 test/spec/crud/{unified => }/replaceOne-comment.json | 0 test/spec/crud/{unified => }/replaceOne-comment.yml | 0 test/spec/crud/{unified => }/replaceOne-dots_and_dollars.json | 0 test/spec/crud/{unified => }/replaceOne-dots_and_dollars.yml | 0 test/spec/crud/{unified => }/replaceOne-hint-unacknowledged.json | 0 test/spec/crud/{unified => }/replaceOne-hint-unacknowledged.yml | 0 test/spec/crud/{unified => }/replaceOne-hint.json | 0 test/spec/crud/{unified => }/replaceOne-hint.yml | 0 test/spec/crud/{unified => }/replaceOne-let.json | 0 test/spec/crud/{unified => }/replaceOne-let.yml | 0 test/spec/crud/{unified => }/replaceOne-validation.json | 0 test/spec/crud/{unified => }/replaceOne-validation.yml | 0 test/spec/crud/{unified => }/replaceOne.json | 0 test/spec/crud/{unified => }/replaceOne.yml | 0 test/spec/crud/{unified => }/updateMany-arrayFilters.json | 0 test/spec/crud/{unified => }/updateMany-arrayFilters.yml | 0 test/spec/crud/{unified => }/updateMany-collation.json | 0 test/spec/crud/{unified => }/updateMany-collation.yml | 0 test/spec/crud/{unified => }/updateMany-comment.json | 0 test/spec/crud/{unified => }/updateMany-comment.yml | 0 test/spec/crud/{unified => }/updateMany-dots_and_dollars.json | 0 test/spec/crud/{unified => }/updateMany-dots_and_dollars.yml | 0 test/spec/crud/{unified => }/updateMany-hint-clientError.json | 0 test/spec/crud/{unified => }/updateMany-hint-clientError.yml | 0 test/spec/crud/{unified => }/updateMany-hint-serverError.json | 0 test/spec/crud/{unified => }/updateMany-hint-serverError.yml | 0 test/spec/crud/{unified => }/updateMany-hint-unacknowledged.json | 0 test/spec/crud/{unified => }/updateMany-hint-unacknowledged.yml | 0 test/spec/crud/{unified => }/updateMany-hint.json | 0 test/spec/crud/{unified => }/updateMany-hint.yml | 0 test/spec/crud/{unified => }/updateMany-let.json | 0 test/spec/crud/{unified => }/updateMany-let.yml | 0 test/spec/crud/{unified => }/updateMany-validation.json | 0 test/spec/crud/{unified => }/updateMany-validation.yml | 0 test/spec/crud/{unified => }/updateMany.json | 0 test/spec/crud/{unified => }/updateMany.yml | 0 test/spec/crud/{unified => }/updateOne-arrayFilters.json | 0 test/spec/crud/{unified => }/updateOne-arrayFilters.yml | 0 test/spec/crud/{unified => }/updateOne-collation.json | 0 test/spec/crud/{unified => }/updateOne-collation.yml | 0 test/spec/crud/{unified => }/updateOne-comment.json | 0 test/spec/crud/{unified => }/updateOne-comment.yml | 0 test/spec/crud/{unified => }/updateOne-dots_and_dollars.json | 0 test/spec/crud/{unified => }/updateOne-dots_and_dollars.yml | 0 test/spec/crud/{unified => }/updateOne-errorResponse.json | 0 test/spec/crud/{unified => }/updateOne-errorResponse.yml | 0 test/spec/crud/{unified => }/updateOne-hint-clientError.json | 0 test/spec/crud/{unified => }/updateOne-hint-clientError.yml | 0 test/spec/crud/{unified => }/updateOne-hint-serverError.json | 0 test/spec/crud/{unified => }/updateOne-hint-serverError.yml | 0 test/spec/crud/{unified => }/updateOne-hint-unacknowledged.json | 0 test/spec/crud/{unified => }/updateOne-hint-unacknowledged.yml | 0 test/spec/crud/{unified => }/updateOne-hint.json | 0 test/spec/crud/{unified => }/updateOne-hint.yml | 0 test/spec/crud/{unified => }/updateOne-let.json | 0 test/spec/crud/{unified => }/updateOne-let.yml | 0 test/spec/crud/{unified => }/updateOne-validation.json | 0 test/spec/crud/{unified => }/updateOne-validation.yml | 0 test/spec/crud/{unified => }/updateOne.json | 0 test/spec/crud/{unified => }/updateOne.yml | 0 test/spec/crud/{unified => }/updateWithPipelines.json | 0 test/spec/crud/{unified => }/updateWithPipelines.yml | 0 test/tools/unified-spec-runner/match.ts | 1 + 279 files changed, 1 insertion(+) rename test/spec/crud/{unified => }/aggregate-allowdiskuse.json (100%) rename test/spec/crud/{unified => }/aggregate-allowdiskuse.yml (100%) rename test/spec/crud/{unified => }/aggregate-collation.json (100%) rename test/spec/crud/{unified => }/aggregate-collation.yml (100%) rename test/spec/crud/{unified => }/aggregate-let.json (100%) rename test/spec/crud/{unified => }/aggregate-let.yml (100%) rename test/spec/crud/{unified => }/aggregate-merge-errorResponse.json (100%) rename test/spec/crud/{unified => }/aggregate-merge-errorResponse.yml (100%) rename test/spec/crud/{unified => }/aggregate-merge.json (100%) rename test/spec/crud/{unified => }/aggregate-merge.yml (100%) rename test/spec/crud/{unified => }/aggregate-out-readConcern.json (100%) rename test/spec/crud/{unified => }/aggregate-out-readConcern.yml (100%) rename test/spec/crud/{unified => }/aggregate-out.json (100%) rename test/spec/crud/{unified => }/aggregate-out.yml (100%) rename test/spec/crud/{unified => }/aggregate-write-readPreference.json (100%) rename test/spec/crud/{unified => }/aggregate-write-readPreference.yml (100%) rename test/spec/crud/{unified => }/aggregate.json (100%) rename test/spec/crud/{unified => }/aggregate.yml (100%) rename test/spec/crud/{unified => }/bulkWrite-arrayFilters-clientError.json (100%) rename test/spec/crud/{unified => }/bulkWrite-arrayFilters-clientError.yml (100%) rename test/spec/crud/{unified => }/bulkWrite-arrayFilters.json (100%) rename test/spec/crud/{unified => }/bulkWrite-arrayFilters.yml (100%) rename test/spec/crud/{unified => }/bulkWrite-collation.json (100%) rename test/spec/crud/{unified => }/bulkWrite-collation.yml (100%) rename test/spec/crud/{unified => }/bulkWrite-comment.json (100%) rename test/spec/crud/{unified => }/bulkWrite-comment.yml (100%) rename test/spec/crud/{unified => }/bulkWrite-delete-hint-clientError.json (100%) rename test/spec/crud/{unified => }/bulkWrite-delete-hint-clientError.yml (100%) rename test/spec/crud/{unified => }/bulkWrite-delete-hint-serverError.json (100%) rename test/spec/crud/{unified => }/bulkWrite-delete-hint-serverError.yml (100%) rename test/spec/crud/{unified => }/bulkWrite-delete-hint.json (100%) rename test/spec/crud/{unified => }/bulkWrite-delete-hint.yml (100%) rename test/spec/crud/{unified => }/bulkWrite-deleteMany-hint-unacknowledged.json (100%) rename test/spec/crud/{unified => }/bulkWrite-deleteMany-hint-unacknowledged.yml (100%) rename test/spec/crud/{unified => }/bulkWrite-deleteMany-let.json (100%) rename test/spec/crud/{unified => }/bulkWrite-deleteMany-let.yml (100%) rename test/spec/crud/{unified => }/bulkWrite-deleteOne-hint-unacknowledged.json (100%) rename test/spec/crud/{unified => }/bulkWrite-deleteOne-hint-unacknowledged.yml (100%) rename test/spec/crud/{unified => }/bulkWrite-deleteOne-let.json (100%) rename test/spec/crud/{unified => }/bulkWrite-deleteOne-let.yml (100%) rename test/spec/crud/{unified => }/bulkWrite-errorResponse.json (100%) rename test/spec/crud/{unified => }/bulkWrite-errorResponse.yml (100%) rename test/spec/crud/{unified => }/bulkWrite-insertOne-dots_and_dollars.json (100%) rename test/spec/crud/{unified => }/bulkWrite-insertOne-dots_and_dollars.yml (100%) rename test/spec/crud/{unified => }/bulkWrite-replaceOne-dots_and_dollars.json (100%) rename test/spec/crud/{unified => }/bulkWrite-replaceOne-dots_and_dollars.yml (100%) rename test/spec/crud/{unified => }/bulkWrite-replaceOne-hint-unacknowledged.json (100%) rename test/spec/crud/{unified => }/bulkWrite-replaceOne-hint-unacknowledged.yml (100%) rename test/spec/crud/{unified => }/bulkWrite-replaceOne-let.json (100%) rename test/spec/crud/{unified => }/bulkWrite-replaceOne-let.yml (100%) rename test/spec/crud/{unified => }/bulkWrite-update-hint-clientError.json (100%) rename test/spec/crud/{unified => }/bulkWrite-update-hint-clientError.yml (100%) rename test/spec/crud/{unified => }/bulkWrite-update-hint-serverError.json (100%) rename test/spec/crud/{unified => }/bulkWrite-update-hint-serverError.yml (100%) rename test/spec/crud/{unified => }/bulkWrite-update-hint.json (100%) rename test/spec/crud/{unified => }/bulkWrite-update-hint.yml (100%) rename test/spec/crud/{unified => }/bulkWrite-update-validation.json (100%) rename test/spec/crud/{unified => }/bulkWrite-update-validation.yml (100%) rename test/spec/crud/{unified => }/bulkWrite-updateMany-dots_and_dollars.json (100%) rename test/spec/crud/{unified => }/bulkWrite-updateMany-dots_and_dollars.yml (100%) rename test/spec/crud/{unified => }/bulkWrite-updateMany-hint-unacknowledged.json (100%) rename test/spec/crud/{unified => }/bulkWrite-updateMany-hint-unacknowledged.yml (100%) rename test/spec/crud/{unified => }/bulkWrite-updateMany-let.json (100%) rename test/spec/crud/{unified => }/bulkWrite-updateMany-let.yml (100%) rename test/spec/crud/{unified => }/bulkWrite-updateOne-dots_and_dollars.json (100%) rename test/spec/crud/{unified => }/bulkWrite-updateOne-dots_and_dollars.yml (100%) rename test/spec/crud/{unified => }/bulkWrite-updateOne-hint-unacknowledged.json (100%) rename test/spec/crud/{unified => }/bulkWrite-updateOne-hint-unacknowledged.yml (100%) rename test/spec/crud/{unified => }/bulkWrite-updateOne-let.json (100%) rename test/spec/crud/{unified => }/bulkWrite-updateOne-let.yml (100%) rename test/spec/crud/{unified => }/bulkWrite.json (100%) rename test/spec/crud/{unified => }/bulkWrite.yml (100%) rename test/spec/crud/{unified => }/count-collation.json (100%) rename test/spec/crud/{unified => }/count-collation.yml (100%) rename test/spec/crud/{unified => }/count-empty.json (100%) rename test/spec/crud/{unified => }/count-empty.yml (100%) rename test/spec/crud/{unified => }/count.json (100%) rename test/spec/crud/{unified => }/count.yml (100%) rename test/spec/crud/{unified => }/countDocuments-comment.json (100%) rename test/spec/crud/{unified => }/countDocuments-comment.yml (100%) rename test/spec/crud/{unified => }/db-aggregate-write-readPreference.json (100%) rename test/spec/crud/{unified => }/db-aggregate-write-readPreference.yml (100%) rename test/spec/crud/{unified => }/db-aggregate.json (100%) rename test/spec/crud/{unified => }/db-aggregate.yml (100%) rename test/spec/crud/{unified => }/deleteMany-collation.json (100%) rename test/spec/crud/{unified => }/deleteMany-collation.yml (100%) rename test/spec/crud/{unified => }/deleteMany-comment.json (100%) rename test/spec/crud/{unified => }/deleteMany-comment.yml (100%) rename test/spec/crud/{unified => }/deleteMany-hint-clientError.json (100%) rename test/spec/crud/{unified => }/deleteMany-hint-clientError.yml (100%) rename test/spec/crud/{unified => }/deleteMany-hint-serverError.json (100%) rename test/spec/crud/{unified => }/deleteMany-hint-serverError.yml (100%) rename test/spec/crud/{unified => }/deleteMany-hint-unacknowledged.json (100%) rename test/spec/crud/{unified => }/deleteMany-hint-unacknowledged.yml (100%) rename test/spec/crud/{unified => }/deleteMany-hint.json (100%) rename test/spec/crud/{unified => }/deleteMany-hint.yml (100%) rename test/spec/crud/{unified => }/deleteMany-let.json (100%) rename test/spec/crud/{unified => }/deleteMany-let.yml (100%) rename test/spec/crud/{unified => }/deleteMany.json (100%) rename test/spec/crud/{unified => }/deleteMany.yml (100%) rename test/spec/crud/{unified => }/deleteOne-collation.json (100%) rename test/spec/crud/{unified => }/deleteOne-collation.yml (100%) rename test/spec/crud/{unified => }/deleteOne-comment.json (100%) rename test/spec/crud/{unified => }/deleteOne-comment.yml (100%) rename test/spec/crud/{unified => }/deleteOne-errorResponse.json (100%) rename test/spec/crud/{unified => }/deleteOne-errorResponse.yml (100%) rename test/spec/crud/{unified => }/deleteOne-hint-clientError.json (100%) rename test/spec/crud/{unified => }/deleteOne-hint-clientError.yml (100%) rename test/spec/crud/{unified => }/deleteOne-hint-serverError.json (100%) rename test/spec/crud/{unified => }/deleteOne-hint-serverError.yml (100%) rename test/spec/crud/{unified => }/deleteOne-hint-unacknowledged.json (100%) rename test/spec/crud/{unified => }/deleteOne-hint-unacknowledged.yml (100%) rename test/spec/crud/{unified => }/deleteOne-hint.json (100%) rename test/spec/crud/{unified => }/deleteOne-hint.yml (100%) rename test/spec/crud/{unified => }/deleteOne-let.json (100%) rename test/spec/crud/{unified => }/deleteOne-let.yml (100%) rename test/spec/crud/{unified => }/deleteOne.json (100%) rename test/spec/crud/{unified => }/deleteOne.yml (100%) rename test/spec/crud/{unified => }/distinct-collation.json (100%) rename test/spec/crud/{unified => }/distinct-collation.yml (100%) rename test/spec/crud/{unified => }/distinct-comment.json (100%) rename test/spec/crud/{unified => }/distinct-comment.yml (100%) rename test/spec/crud/{unified => }/distinct.json (100%) rename test/spec/crud/{unified => }/distinct.yml (100%) rename test/spec/crud/{unified => }/estimatedDocumentCount-comment.json (100%) rename test/spec/crud/{unified => }/estimatedDocumentCount-comment.yml (100%) rename test/spec/crud/{unified => }/estimatedDocumentCount.json (100%) rename test/spec/crud/{unified => }/estimatedDocumentCount.yml (100%) rename test/spec/crud/{unified => }/find-allowdiskuse-clientError.json (100%) rename test/spec/crud/{unified => }/find-allowdiskuse-clientError.yml (100%) rename test/spec/crud/{unified => }/find-allowdiskuse-serverError.json (100%) rename test/spec/crud/{unified => }/find-allowdiskuse-serverError.yml (100%) rename test/spec/crud/{unified => }/find-allowdiskuse.json (100%) rename test/spec/crud/{unified => }/find-allowdiskuse.yml (100%) rename test/spec/crud/{unified => }/find-collation.json (100%) rename test/spec/crud/{unified => }/find-collation.yml (100%) rename test/spec/crud/{unified => }/find-comment.json (100%) rename test/spec/crud/{unified => }/find-comment.yml (100%) rename test/spec/crud/{unified => }/find-let.json (100%) rename test/spec/crud/{unified => }/find-let.yml (100%) rename test/spec/crud/{unified => }/find.json (100%) rename test/spec/crud/{unified => }/find.yml (100%) rename test/spec/crud/{unified => }/findOneAndDelete-collation.json (100%) rename test/spec/crud/{unified => }/findOneAndDelete-collation.yml (100%) rename test/spec/crud/{unified => }/findOneAndDelete-comment.json (100%) rename test/spec/crud/{unified => }/findOneAndDelete-comment.yml (100%) rename test/spec/crud/{unified => }/findOneAndDelete-hint-clientError.json (100%) rename test/spec/crud/{unified => }/findOneAndDelete-hint-clientError.yml (100%) rename test/spec/crud/{unified => }/findOneAndDelete-hint-serverError.json (100%) rename test/spec/crud/{unified => }/findOneAndDelete-hint-serverError.yml (100%) rename test/spec/crud/{unified => }/findOneAndDelete-hint-unacknowledged.json (100%) rename test/spec/crud/{unified => }/findOneAndDelete-hint-unacknowledged.yml (100%) rename test/spec/crud/{unified => }/findOneAndDelete-hint.json (100%) rename test/spec/crud/{unified => }/findOneAndDelete-hint.yml (100%) rename test/spec/crud/{unified => }/findOneAndDelete-let.json (100%) rename test/spec/crud/{unified => }/findOneAndDelete-let.yml (100%) rename test/spec/crud/{unified => }/findOneAndDelete.json (100%) rename test/spec/crud/{unified => }/findOneAndDelete.yml (100%) rename test/spec/crud/{unified => }/findOneAndReplace-collation.json (100%) rename test/spec/crud/{unified => }/findOneAndReplace-collation.yml (100%) rename test/spec/crud/{unified => }/findOneAndReplace-comment.json (100%) rename test/spec/crud/{unified => }/findOneAndReplace-comment.yml (100%) rename test/spec/crud/{unified => }/findOneAndReplace-dots_and_dollars.json (100%) rename test/spec/crud/{unified => }/findOneAndReplace-dots_and_dollars.yml (100%) rename test/spec/crud/{unified => }/findOneAndReplace-hint-clientError.json (100%) rename test/spec/crud/{unified => }/findOneAndReplace-hint-clientError.yml (100%) rename test/spec/crud/{unified => }/findOneAndReplace-hint-serverError.json (100%) rename test/spec/crud/{unified => }/findOneAndReplace-hint-serverError.yml (100%) rename test/spec/crud/{unified => }/findOneAndReplace-hint-unacknowledged.json (100%) rename test/spec/crud/{unified => }/findOneAndReplace-hint-unacknowledged.yml (100%) rename test/spec/crud/{unified => }/findOneAndReplace-hint.json (100%) rename test/spec/crud/{unified => }/findOneAndReplace-hint.yml (100%) rename test/spec/crud/{unified => }/findOneAndReplace-let.json (100%) rename test/spec/crud/{unified => }/findOneAndReplace-let.yml (100%) rename test/spec/crud/{unified => }/findOneAndReplace-upsert.json (100%) rename test/spec/crud/{unified => }/findOneAndReplace-upsert.yml (100%) rename test/spec/crud/{unified => }/findOneAndReplace.json (100%) rename test/spec/crud/{unified => }/findOneAndReplace.yml (100%) rename test/spec/crud/{unified => }/findOneAndUpdate-arrayFilters.json (100%) rename test/spec/crud/{unified => }/findOneAndUpdate-arrayFilters.yml (100%) rename test/spec/crud/{unified => }/findOneAndUpdate-collation.json (100%) rename test/spec/crud/{unified => }/findOneAndUpdate-collation.yml (100%) rename test/spec/crud/{unified => }/findOneAndUpdate-comment.json (100%) rename test/spec/crud/{unified => }/findOneAndUpdate-comment.yml (100%) rename test/spec/crud/{unified => }/findOneAndUpdate-dots_and_dollars.json (100%) rename test/spec/crud/{unified => }/findOneAndUpdate-dots_and_dollars.yml (100%) rename test/spec/crud/{unified => }/findOneAndUpdate-errorResponse.json (100%) rename test/spec/crud/{unified => }/findOneAndUpdate-errorResponse.yml (100%) rename test/spec/crud/{unified => }/findOneAndUpdate-hint-clientError.json (100%) rename test/spec/crud/{unified => }/findOneAndUpdate-hint-clientError.yml (100%) rename test/spec/crud/{unified => }/findOneAndUpdate-hint-serverError.json (100%) rename test/spec/crud/{unified => }/findOneAndUpdate-hint-serverError.yml (100%) rename test/spec/crud/{unified => }/findOneAndUpdate-hint-unacknowledged.json (100%) rename test/spec/crud/{unified => }/findOneAndUpdate-hint-unacknowledged.yml (100%) rename test/spec/crud/{unified => }/findOneAndUpdate-hint.json (100%) rename test/spec/crud/{unified => }/findOneAndUpdate-hint.yml (100%) rename test/spec/crud/{unified => }/findOneAndUpdate-let.json (100%) rename test/spec/crud/{unified => }/findOneAndUpdate-let.yml (100%) rename test/spec/crud/{unified => }/findOneAndUpdate.json (100%) rename test/spec/crud/{unified => }/findOneAndUpdate.yml (100%) rename test/spec/crud/{unified => }/insertMany-comment.json (100%) rename test/spec/crud/{unified => }/insertMany-comment.yml (100%) rename test/spec/crud/{unified => }/insertMany-dots_and_dollars.json (100%) rename test/spec/crud/{unified => }/insertMany-dots_and_dollars.yml (100%) rename test/spec/crud/{unified => }/insertMany.json (100%) rename test/spec/crud/{unified => }/insertMany.yml (100%) rename test/spec/crud/{unified => }/insertOne-comment.json (100%) rename test/spec/crud/{unified => }/insertOne-comment.yml (100%) rename test/spec/crud/{unified => }/insertOne-dots_and_dollars.json (100%) rename test/spec/crud/{unified => }/insertOne-dots_and_dollars.yml (100%) rename test/spec/crud/{unified => }/insertOne-errorResponse.json (100%) rename test/spec/crud/{unified => }/insertOne-errorResponse.yml (100%) rename test/spec/crud/{unified => }/insertOne.json (100%) rename test/spec/crud/{unified => }/insertOne.yml (100%) rename test/spec/crud/{unified => }/replaceOne-collation.json (100%) rename test/spec/crud/{unified => }/replaceOne-collation.yml (100%) rename test/spec/crud/{unified => }/replaceOne-comment.json (100%) rename test/spec/crud/{unified => }/replaceOne-comment.yml (100%) rename test/spec/crud/{unified => }/replaceOne-dots_and_dollars.json (100%) rename test/spec/crud/{unified => }/replaceOne-dots_and_dollars.yml (100%) rename test/spec/crud/{unified => }/replaceOne-hint-unacknowledged.json (100%) rename test/spec/crud/{unified => }/replaceOne-hint-unacknowledged.yml (100%) rename test/spec/crud/{unified => }/replaceOne-hint.json (100%) rename test/spec/crud/{unified => }/replaceOne-hint.yml (100%) rename test/spec/crud/{unified => }/replaceOne-let.json (100%) rename test/spec/crud/{unified => }/replaceOne-let.yml (100%) rename test/spec/crud/{unified => }/replaceOne-validation.json (100%) rename test/spec/crud/{unified => }/replaceOne-validation.yml (100%) rename test/spec/crud/{unified => }/replaceOne.json (100%) rename test/spec/crud/{unified => }/replaceOne.yml (100%) rename test/spec/crud/{unified => }/updateMany-arrayFilters.json (100%) rename test/spec/crud/{unified => }/updateMany-arrayFilters.yml (100%) rename test/spec/crud/{unified => }/updateMany-collation.json (100%) rename test/spec/crud/{unified => }/updateMany-collation.yml (100%) rename test/spec/crud/{unified => }/updateMany-comment.json (100%) rename test/spec/crud/{unified => }/updateMany-comment.yml (100%) rename test/spec/crud/{unified => }/updateMany-dots_and_dollars.json (100%) rename test/spec/crud/{unified => }/updateMany-dots_and_dollars.yml (100%) rename test/spec/crud/{unified => }/updateMany-hint-clientError.json (100%) rename test/spec/crud/{unified => }/updateMany-hint-clientError.yml (100%) rename test/spec/crud/{unified => }/updateMany-hint-serverError.json (100%) rename test/spec/crud/{unified => }/updateMany-hint-serverError.yml (100%) rename test/spec/crud/{unified => }/updateMany-hint-unacknowledged.json (100%) rename test/spec/crud/{unified => }/updateMany-hint-unacknowledged.yml (100%) rename test/spec/crud/{unified => }/updateMany-hint.json (100%) rename test/spec/crud/{unified => }/updateMany-hint.yml (100%) rename test/spec/crud/{unified => }/updateMany-let.json (100%) rename test/spec/crud/{unified => }/updateMany-let.yml (100%) rename test/spec/crud/{unified => }/updateMany-validation.json (100%) rename test/spec/crud/{unified => }/updateMany-validation.yml (100%) rename test/spec/crud/{unified => }/updateMany.json (100%) rename test/spec/crud/{unified => }/updateMany.yml (100%) rename test/spec/crud/{unified => }/updateOne-arrayFilters.json (100%) rename test/spec/crud/{unified => }/updateOne-arrayFilters.yml (100%) rename test/spec/crud/{unified => }/updateOne-collation.json (100%) rename test/spec/crud/{unified => }/updateOne-collation.yml (100%) rename test/spec/crud/{unified => }/updateOne-comment.json (100%) rename test/spec/crud/{unified => }/updateOne-comment.yml (100%) rename test/spec/crud/{unified => }/updateOne-dots_and_dollars.json (100%) rename test/spec/crud/{unified => }/updateOne-dots_and_dollars.yml (100%) rename test/spec/crud/{unified => }/updateOne-errorResponse.json (100%) rename test/spec/crud/{unified => }/updateOne-errorResponse.yml (100%) rename test/spec/crud/{unified => }/updateOne-hint-clientError.json (100%) rename test/spec/crud/{unified => }/updateOne-hint-clientError.yml (100%) rename test/spec/crud/{unified => }/updateOne-hint-serverError.json (100%) rename test/spec/crud/{unified => }/updateOne-hint-serverError.yml (100%) rename test/spec/crud/{unified => }/updateOne-hint-unacknowledged.json (100%) rename test/spec/crud/{unified => }/updateOne-hint-unacknowledged.yml (100%) rename test/spec/crud/{unified => }/updateOne-hint.json (100%) rename test/spec/crud/{unified => }/updateOne-hint.yml (100%) rename test/spec/crud/{unified => }/updateOne-let.json (100%) rename test/spec/crud/{unified => }/updateOne-let.yml (100%) rename test/spec/crud/{unified => }/updateOne-validation.json (100%) rename test/spec/crud/{unified => }/updateOne-validation.yml (100%) rename test/spec/crud/{unified => }/updateOne.json (100%) rename test/spec/crud/{unified => }/updateOne.yml (100%) rename test/spec/crud/{unified => }/updateWithPipelines.json (100%) rename test/spec/crud/{unified => }/updateWithPipelines.yml (100%) diff --git a/test/spec/crud/unified/aggregate-allowdiskuse.json b/test/spec/crud/aggregate-allowdiskuse.json similarity index 100% rename from test/spec/crud/unified/aggregate-allowdiskuse.json rename to test/spec/crud/aggregate-allowdiskuse.json diff --git a/test/spec/crud/unified/aggregate-allowdiskuse.yml b/test/spec/crud/aggregate-allowdiskuse.yml similarity index 100% rename from test/spec/crud/unified/aggregate-allowdiskuse.yml rename to test/spec/crud/aggregate-allowdiskuse.yml diff --git a/test/spec/crud/unified/aggregate-collation.json b/test/spec/crud/aggregate-collation.json similarity index 100% rename from test/spec/crud/unified/aggregate-collation.json rename to test/spec/crud/aggregate-collation.json diff --git a/test/spec/crud/unified/aggregate-collation.yml b/test/spec/crud/aggregate-collation.yml similarity index 100% rename from test/spec/crud/unified/aggregate-collation.yml rename to test/spec/crud/aggregate-collation.yml diff --git a/test/spec/crud/unified/aggregate-let.json b/test/spec/crud/aggregate-let.json similarity index 100% rename from test/spec/crud/unified/aggregate-let.json rename to test/spec/crud/aggregate-let.json diff --git a/test/spec/crud/unified/aggregate-let.yml b/test/spec/crud/aggregate-let.yml similarity index 100% rename from test/spec/crud/unified/aggregate-let.yml rename to test/spec/crud/aggregate-let.yml diff --git a/test/spec/crud/unified/aggregate-merge-errorResponse.json b/test/spec/crud/aggregate-merge-errorResponse.json similarity index 100% rename from test/spec/crud/unified/aggregate-merge-errorResponse.json rename to test/spec/crud/aggregate-merge-errorResponse.json diff --git a/test/spec/crud/unified/aggregate-merge-errorResponse.yml b/test/spec/crud/aggregate-merge-errorResponse.yml similarity index 100% rename from test/spec/crud/unified/aggregate-merge-errorResponse.yml rename to test/spec/crud/aggregate-merge-errorResponse.yml diff --git a/test/spec/crud/unified/aggregate-merge.json b/test/spec/crud/aggregate-merge.json similarity index 100% rename from test/spec/crud/unified/aggregate-merge.json rename to test/spec/crud/aggregate-merge.json diff --git a/test/spec/crud/unified/aggregate-merge.yml b/test/spec/crud/aggregate-merge.yml similarity index 100% rename from test/spec/crud/unified/aggregate-merge.yml rename to test/spec/crud/aggregate-merge.yml diff --git a/test/spec/crud/unified/aggregate-out-readConcern.json b/test/spec/crud/aggregate-out-readConcern.json similarity index 100% rename from test/spec/crud/unified/aggregate-out-readConcern.json rename to test/spec/crud/aggregate-out-readConcern.json diff --git a/test/spec/crud/unified/aggregate-out-readConcern.yml b/test/spec/crud/aggregate-out-readConcern.yml similarity index 100% rename from test/spec/crud/unified/aggregate-out-readConcern.yml rename to test/spec/crud/aggregate-out-readConcern.yml diff --git a/test/spec/crud/unified/aggregate-out.json b/test/spec/crud/aggregate-out.json similarity index 100% rename from test/spec/crud/unified/aggregate-out.json rename to test/spec/crud/aggregate-out.json diff --git a/test/spec/crud/unified/aggregate-out.yml b/test/spec/crud/aggregate-out.yml similarity index 100% rename from test/spec/crud/unified/aggregate-out.yml rename to test/spec/crud/aggregate-out.yml diff --git a/test/spec/crud/unified/aggregate-write-readPreference.json b/test/spec/crud/aggregate-write-readPreference.json similarity index 100% rename from test/spec/crud/unified/aggregate-write-readPreference.json rename to test/spec/crud/aggregate-write-readPreference.json diff --git a/test/spec/crud/unified/aggregate-write-readPreference.yml b/test/spec/crud/aggregate-write-readPreference.yml similarity index 100% rename from test/spec/crud/unified/aggregate-write-readPreference.yml rename to test/spec/crud/aggregate-write-readPreference.yml diff --git a/test/spec/crud/unified/aggregate.json b/test/spec/crud/aggregate.json similarity index 100% rename from test/spec/crud/unified/aggregate.json rename to test/spec/crud/aggregate.json diff --git a/test/spec/crud/unified/aggregate.yml b/test/spec/crud/aggregate.yml similarity index 100% rename from test/spec/crud/unified/aggregate.yml rename to test/spec/crud/aggregate.yml diff --git a/test/spec/crud/unified/bulkWrite-arrayFilters-clientError.json b/test/spec/crud/bulkWrite-arrayFilters-clientError.json similarity index 100% rename from test/spec/crud/unified/bulkWrite-arrayFilters-clientError.json rename to test/spec/crud/bulkWrite-arrayFilters-clientError.json diff --git a/test/spec/crud/unified/bulkWrite-arrayFilters-clientError.yml b/test/spec/crud/bulkWrite-arrayFilters-clientError.yml similarity index 100% rename from test/spec/crud/unified/bulkWrite-arrayFilters-clientError.yml rename to test/spec/crud/bulkWrite-arrayFilters-clientError.yml diff --git a/test/spec/crud/unified/bulkWrite-arrayFilters.json b/test/spec/crud/bulkWrite-arrayFilters.json similarity index 100% rename from test/spec/crud/unified/bulkWrite-arrayFilters.json rename to test/spec/crud/bulkWrite-arrayFilters.json diff --git a/test/spec/crud/unified/bulkWrite-arrayFilters.yml b/test/spec/crud/bulkWrite-arrayFilters.yml similarity index 100% rename from test/spec/crud/unified/bulkWrite-arrayFilters.yml rename to test/spec/crud/bulkWrite-arrayFilters.yml diff --git a/test/spec/crud/unified/bulkWrite-collation.json b/test/spec/crud/bulkWrite-collation.json similarity index 100% rename from test/spec/crud/unified/bulkWrite-collation.json rename to test/spec/crud/bulkWrite-collation.json diff --git a/test/spec/crud/unified/bulkWrite-collation.yml b/test/spec/crud/bulkWrite-collation.yml similarity index 100% rename from test/spec/crud/unified/bulkWrite-collation.yml rename to test/spec/crud/bulkWrite-collation.yml diff --git a/test/spec/crud/unified/bulkWrite-comment.json b/test/spec/crud/bulkWrite-comment.json similarity index 100% rename from test/spec/crud/unified/bulkWrite-comment.json rename to test/spec/crud/bulkWrite-comment.json diff --git a/test/spec/crud/unified/bulkWrite-comment.yml b/test/spec/crud/bulkWrite-comment.yml similarity index 100% rename from test/spec/crud/unified/bulkWrite-comment.yml rename to test/spec/crud/bulkWrite-comment.yml diff --git a/test/spec/crud/unified/bulkWrite-delete-hint-clientError.json b/test/spec/crud/bulkWrite-delete-hint-clientError.json similarity index 100% rename from test/spec/crud/unified/bulkWrite-delete-hint-clientError.json rename to test/spec/crud/bulkWrite-delete-hint-clientError.json diff --git a/test/spec/crud/unified/bulkWrite-delete-hint-clientError.yml b/test/spec/crud/bulkWrite-delete-hint-clientError.yml similarity index 100% rename from test/spec/crud/unified/bulkWrite-delete-hint-clientError.yml rename to test/spec/crud/bulkWrite-delete-hint-clientError.yml diff --git a/test/spec/crud/unified/bulkWrite-delete-hint-serverError.json b/test/spec/crud/bulkWrite-delete-hint-serverError.json similarity index 100% rename from test/spec/crud/unified/bulkWrite-delete-hint-serverError.json rename to test/spec/crud/bulkWrite-delete-hint-serverError.json diff --git a/test/spec/crud/unified/bulkWrite-delete-hint-serverError.yml b/test/spec/crud/bulkWrite-delete-hint-serverError.yml similarity index 100% rename from test/spec/crud/unified/bulkWrite-delete-hint-serverError.yml rename to test/spec/crud/bulkWrite-delete-hint-serverError.yml diff --git a/test/spec/crud/unified/bulkWrite-delete-hint.json b/test/spec/crud/bulkWrite-delete-hint.json similarity index 100% rename from test/spec/crud/unified/bulkWrite-delete-hint.json rename to test/spec/crud/bulkWrite-delete-hint.json diff --git a/test/spec/crud/unified/bulkWrite-delete-hint.yml b/test/spec/crud/bulkWrite-delete-hint.yml similarity index 100% rename from test/spec/crud/unified/bulkWrite-delete-hint.yml rename to test/spec/crud/bulkWrite-delete-hint.yml diff --git a/test/spec/crud/unified/bulkWrite-deleteMany-hint-unacknowledged.json b/test/spec/crud/bulkWrite-deleteMany-hint-unacknowledged.json similarity index 100% rename from test/spec/crud/unified/bulkWrite-deleteMany-hint-unacknowledged.json rename to test/spec/crud/bulkWrite-deleteMany-hint-unacknowledged.json diff --git a/test/spec/crud/unified/bulkWrite-deleteMany-hint-unacknowledged.yml b/test/spec/crud/bulkWrite-deleteMany-hint-unacknowledged.yml similarity index 100% rename from test/spec/crud/unified/bulkWrite-deleteMany-hint-unacknowledged.yml rename to test/spec/crud/bulkWrite-deleteMany-hint-unacknowledged.yml diff --git a/test/spec/crud/unified/bulkWrite-deleteMany-let.json b/test/spec/crud/bulkWrite-deleteMany-let.json similarity index 100% rename from test/spec/crud/unified/bulkWrite-deleteMany-let.json rename to test/spec/crud/bulkWrite-deleteMany-let.json diff --git a/test/spec/crud/unified/bulkWrite-deleteMany-let.yml b/test/spec/crud/bulkWrite-deleteMany-let.yml similarity index 100% rename from test/spec/crud/unified/bulkWrite-deleteMany-let.yml rename to test/spec/crud/bulkWrite-deleteMany-let.yml diff --git a/test/spec/crud/unified/bulkWrite-deleteOne-hint-unacknowledged.json b/test/spec/crud/bulkWrite-deleteOne-hint-unacknowledged.json similarity index 100% rename from test/spec/crud/unified/bulkWrite-deleteOne-hint-unacknowledged.json rename to test/spec/crud/bulkWrite-deleteOne-hint-unacknowledged.json diff --git a/test/spec/crud/unified/bulkWrite-deleteOne-hint-unacknowledged.yml b/test/spec/crud/bulkWrite-deleteOne-hint-unacknowledged.yml similarity index 100% rename from test/spec/crud/unified/bulkWrite-deleteOne-hint-unacknowledged.yml rename to test/spec/crud/bulkWrite-deleteOne-hint-unacknowledged.yml diff --git a/test/spec/crud/unified/bulkWrite-deleteOne-let.json b/test/spec/crud/bulkWrite-deleteOne-let.json similarity index 100% rename from test/spec/crud/unified/bulkWrite-deleteOne-let.json rename to test/spec/crud/bulkWrite-deleteOne-let.json diff --git a/test/spec/crud/unified/bulkWrite-deleteOne-let.yml b/test/spec/crud/bulkWrite-deleteOne-let.yml similarity index 100% rename from test/spec/crud/unified/bulkWrite-deleteOne-let.yml rename to test/spec/crud/bulkWrite-deleteOne-let.yml diff --git a/test/spec/crud/unified/bulkWrite-errorResponse.json b/test/spec/crud/bulkWrite-errorResponse.json similarity index 100% rename from test/spec/crud/unified/bulkWrite-errorResponse.json rename to test/spec/crud/bulkWrite-errorResponse.json diff --git a/test/spec/crud/unified/bulkWrite-errorResponse.yml b/test/spec/crud/bulkWrite-errorResponse.yml similarity index 100% rename from test/spec/crud/unified/bulkWrite-errorResponse.yml rename to test/spec/crud/bulkWrite-errorResponse.yml diff --git a/test/spec/crud/unified/bulkWrite-insertOne-dots_and_dollars.json b/test/spec/crud/bulkWrite-insertOne-dots_and_dollars.json similarity index 100% rename from test/spec/crud/unified/bulkWrite-insertOne-dots_and_dollars.json rename to test/spec/crud/bulkWrite-insertOne-dots_and_dollars.json diff --git a/test/spec/crud/unified/bulkWrite-insertOne-dots_and_dollars.yml b/test/spec/crud/bulkWrite-insertOne-dots_and_dollars.yml similarity index 100% rename from test/spec/crud/unified/bulkWrite-insertOne-dots_and_dollars.yml rename to test/spec/crud/bulkWrite-insertOne-dots_and_dollars.yml diff --git a/test/spec/crud/unified/bulkWrite-replaceOne-dots_and_dollars.json b/test/spec/crud/bulkWrite-replaceOne-dots_and_dollars.json similarity index 100% rename from test/spec/crud/unified/bulkWrite-replaceOne-dots_and_dollars.json rename to test/spec/crud/bulkWrite-replaceOne-dots_and_dollars.json diff --git a/test/spec/crud/unified/bulkWrite-replaceOne-dots_and_dollars.yml b/test/spec/crud/bulkWrite-replaceOne-dots_and_dollars.yml similarity index 100% rename from test/spec/crud/unified/bulkWrite-replaceOne-dots_and_dollars.yml rename to test/spec/crud/bulkWrite-replaceOne-dots_and_dollars.yml diff --git a/test/spec/crud/unified/bulkWrite-replaceOne-hint-unacknowledged.json b/test/spec/crud/bulkWrite-replaceOne-hint-unacknowledged.json similarity index 100% rename from test/spec/crud/unified/bulkWrite-replaceOne-hint-unacknowledged.json rename to test/spec/crud/bulkWrite-replaceOne-hint-unacknowledged.json diff --git a/test/spec/crud/unified/bulkWrite-replaceOne-hint-unacknowledged.yml b/test/spec/crud/bulkWrite-replaceOne-hint-unacknowledged.yml similarity index 100% rename from test/spec/crud/unified/bulkWrite-replaceOne-hint-unacknowledged.yml rename to test/spec/crud/bulkWrite-replaceOne-hint-unacknowledged.yml diff --git a/test/spec/crud/unified/bulkWrite-replaceOne-let.json b/test/spec/crud/bulkWrite-replaceOne-let.json similarity index 100% rename from test/spec/crud/unified/bulkWrite-replaceOne-let.json rename to test/spec/crud/bulkWrite-replaceOne-let.json diff --git a/test/spec/crud/unified/bulkWrite-replaceOne-let.yml b/test/spec/crud/bulkWrite-replaceOne-let.yml similarity index 100% rename from test/spec/crud/unified/bulkWrite-replaceOne-let.yml rename to test/spec/crud/bulkWrite-replaceOne-let.yml diff --git a/test/spec/crud/unified/bulkWrite-update-hint-clientError.json b/test/spec/crud/bulkWrite-update-hint-clientError.json similarity index 100% rename from test/spec/crud/unified/bulkWrite-update-hint-clientError.json rename to test/spec/crud/bulkWrite-update-hint-clientError.json diff --git a/test/spec/crud/unified/bulkWrite-update-hint-clientError.yml b/test/spec/crud/bulkWrite-update-hint-clientError.yml similarity index 100% rename from test/spec/crud/unified/bulkWrite-update-hint-clientError.yml rename to test/spec/crud/bulkWrite-update-hint-clientError.yml diff --git a/test/spec/crud/unified/bulkWrite-update-hint-serverError.json b/test/spec/crud/bulkWrite-update-hint-serverError.json similarity index 100% rename from test/spec/crud/unified/bulkWrite-update-hint-serverError.json rename to test/spec/crud/bulkWrite-update-hint-serverError.json diff --git a/test/spec/crud/unified/bulkWrite-update-hint-serverError.yml b/test/spec/crud/bulkWrite-update-hint-serverError.yml similarity index 100% rename from test/spec/crud/unified/bulkWrite-update-hint-serverError.yml rename to test/spec/crud/bulkWrite-update-hint-serverError.yml diff --git a/test/spec/crud/unified/bulkWrite-update-hint.json b/test/spec/crud/bulkWrite-update-hint.json similarity index 100% rename from test/spec/crud/unified/bulkWrite-update-hint.json rename to test/spec/crud/bulkWrite-update-hint.json diff --git a/test/spec/crud/unified/bulkWrite-update-hint.yml b/test/spec/crud/bulkWrite-update-hint.yml similarity index 100% rename from test/spec/crud/unified/bulkWrite-update-hint.yml rename to test/spec/crud/bulkWrite-update-hint.yml diff --git a/test/spec/crud/unified/bulkWrite-update-validation.json b/test/spec/crud/bulkWrite-update-validation.json similarity index 100% rename from test/spec/crud/unified/bulkWrite-update-validation.json rename to test/spec/crud/bulkWrite-update-validation.json diff --git a/test/spec/crud/unified/bulkWrite-update-validation.yml b/test/spec/crud/bulkWrite-update-validation.yml similarity index 100% rename from test/spec/crud/unified/bulkWrite-update-validation.yml rename to test/spec/crud/bulkWrite-update-validation.yml diff --git a/test/spec/crud/unified/bulkWrite-updateMany-dots_and_dollars.json b/test/spec/crud/bulkWrite-updateMany-dots_and_dollars.json similarity index 100% rename from test/spec/crud/unified/bulkWrite-updateMany-dots_and_dollars.json rename to test/spec/crud/bulkWrite-updateMany-dots_and_dollars.json diff --git a/test/spec/crud/unified/bulkWrite-updateMany-dots_and_dollars.yml b/test/spec/crud/bulkWrite-updateMany-dots_and_dollars.yml similarity index 100% rename from test/spec/crud/unified/bulkWrite-updateMany-dots_and_dollars.yml rename to test/spec/crud/bulkWrite-updateMany-dots_and_dollars.yml diff --git a/test/spec/crud/unified/bulkWrite-updateMany-hint-unacknowledged.json b/test/spec/crud/bulkWrite-updateMany-hint-unacknowledged.json similarity index 100% rename from test/spec/crud/unified/bulkWrite-updateMany-hint-unacknowledged.json rename to test/spec/crud/bulkWrite-updateMany-hint-unacknowledged.json diff --git a/test/spec/crud/unified/bulkWrite-updateMany-hint-unacknowledged.yml b/test/spec/crud/bulkWrite-updateMany-hint-unacknowledged.yml similarity index 100% rename from test/spec/crud/unified/bulkWrite-updateMany-hint-unacknowledged.yml rename to test/spec/crud/bulkWrite-updateMany-hint-unacknowledged.yml diff --git a/test/spec/crud/unified/bulkWrite-updateMany-let.json b/test/spec/crud/bulkWrite-updateMany-let.json similarity index 100% rename from test/spec/crud/unified/bulkWrite-updateMany-let.json rename to test/spec/crud/bulkWrite-updateMany-let.json diff --git a/test/spec/crud/unified/bulkWrite-updateMany-let.yml b/test/spec/crud/bulkWrite-updateMany-let.yml similarity index 100% rename from test/spec/crud/unified/bulkWrite-updateMany-let.yml rename to test/spec/crud/bulkWrite-updateMany-let.yml diff --git a/test/spec/crud/unified/bulkWrite-updateOne-dots_and_dollars.json b/test/spec/crud/bulkWrite-updateOne-dots_and_dollars.json similarity index 100% rename from test/spec/crud/unified/bulkWrite-updateOne-dots_and_dollars.json rename to test/spec/crud/bulkWrite-updateOne-dots_and_dollars.json diff --git a/test/spec/crud/unified/bulkWrite-updateOne-dots_and_dollars.yml b/test/spec/crud/bulkWrite-updateOne-dots_and_dollars.yml similarity index 100% rename from test/spec/crud/unified/bulkWrite-updateOne-dots_and_dollars.yml rename to test/spec/crud/bulkWrite-updateOne-dots_and_dollars.yml diff --git a/test/spec/crud/unified/bulkWrite-updateOne-hint-unacknowledged.json b/test/spec/crud/bulkWrite-updateOne-hint-unacknowledged.json similarity index 100% rename from test/spec/crud/unified/bulkWrite-updateOne-hint-unacknowledged.json rename to test/spec/crud/bulkWrite-updateOne-hint-unacknowledged.json diff --git a/test/spec/crud/unified/bulkWrite-updateOne-hint-unacknowledged.yml b/test/spec/crud/bulkWrite-updateOne-hint-unacknowledged.yml similarity index 100% rename from test/spec/crud/unified/bulkWrite-updateOne-hint-unacknowledged.yml rename to test/spec/crud/bulkWrite-updateOne-hint-unacknowledged.yml diff --git a/test/spec/crud/unified/bulkWrite-updateOne-let.json b/test/spec/crud/bulkWrite-updateOne-let.json similarity index 100% rename from test/spec/crud/unified/bulkWrite-updateOne-let.json rename to test/spec/crud/bulkWrite-updateOne-let.json diff --git a/test/spec/crud/unified/bulkWrite-updateOne-let.yml b/test/spec/crud/bulkWrite-updateOne-let.yml similarity index 100% rename from test/spec/crud/unified/bulkWrite-updateOne-let.yml rename to test/spec/crud/bulkWrite-updateOne-let.yml diff --git a/test/spec/crud/unified/bulkWrite.json b/test/spec/crud/bulkWrite.json similarity index 100% rename from test/spec/crud/unified/bulkWrite.json rename to test/spec/crud/bulkWrite.json diff --git a/test/spec/crud/unified/bulkWrite.yml b/test/spec/crud/bulkWrite.yml similarity index 100% rename from test/spec/crud/unified/bulkWrite.yml rename to test/spec/crud/bulkWrite.yml diff --git a/test/spec/crud/unified/count-collation.json b/test/spec/crud/count-collation.json similarity index 100% rename from test/spec/crud/unified/count-collation.json rename to test/spec/crud/count-collation.json diff --git a/test/spec/crud/unified/count-collation.yml b/test/spec/crud/count-collation.yml similarity index 100% rename from test/spec/crud/unified/count-collation.yml rename to test/spec/crud/count-collation.yml diff --git a/test/spec/crud/unified/count-empty.json b/test/spec/crud/count-empty.json similarity index 100% rename from test/spec/crud/unified/count-empty.json rename to test/spec/crud/count-empty.json diff --git a/test/spec/crud/unified/count-empty.yml b/test/spec/crud/count-empty.yml similarity index 100% rename from test/spec/crud/unified/count-empty.yml rename to test/spec/crud/count-empty.yml diff --git a/test/spec/crud/unified/count.json b/test/spec/crud/count.json similarity index 100% rename from test/spec/crud/unified/count.json rename to test/spec/crud/count.json diff --git a/test/spec/crud/unified/count.yml b/test/spec/crud/count.yml similarity index 100% rename from test/spec/crud/unified/count.yml rename to test/spec/crud/count.yml diff --git a/test/spec/crud/unified/countDocuments-comment.json b/test/spec/crud/countDocuments-comment.json similarity index 100% rename from test/spec/crud/unified/countDocuments-comment.json rename to test/spec/crud/countDocuments-comment.json diff --git a/test/spec/crud/unified/countDocuments-comment.yml b/test/spec/crud/countDocuments-comment.yml similarity index 100% rename from test/spec/crud/unified/countDocuments-comment.yml rename to test/spec/crud/countDocuments-comment.yml diff --git a/test/spec/crud/unified/db-aggregate-write-readPreference.json b/test/spec/crud/db-aggregate-write-readPreference.json similarity index 100% rename from test/spec/crud/unified/db-aggregate-write-readPreference.json rename to test/spec/crud/db-aggregate-write-readPreference.json diff --git a/test/spec/crud/unified/db-aggregate-write-readPreference.yml b/test/spec/crud/db-aggregate-write-readPreference.yml similarity index 100% rename from test/spec/crud/unified/db-aggregate-write-readPreference.yml rename to test/spec/crud/db-aggregate-write-readPreference.yml diff --git a/test/spec/crud/unified/db-aggregate.json b/test/spec/crud/db-aggregate.json similarity index 100% rename from test/spec/crud/unified/db-aggregate.json rename to test/spec/crud/db-aggregate.json diff --git a/test/spec/crud/unified/db-aggregate.yml b/test/spec/crud/db-aggregate.yml similarity index 100% rename from test/spec/crud/unified/db-aggregate.yml rename to test/spec/crud/db-aggregate.yml diff --git a/test/spec/crud/unified/deleteMany-collation.json b/test/spec/crud/deleteMany-collation.json similarity index 100% rename from test/spec/crud/unified/deleteMany-collation.json rename to test/spec/crud/deleteMany-collation.json diff --git a/test/spec/crud/unified/deleteMany-collation.yml b/test/spec/crud/deleteMany-collation.yml similarity index 100% rename from test/spec/crud/unified/deleteMany-collation.yml rename to test/spec/crud/deleteMany-collation.yml diff --git a/test/spec/crud/unified/deleteMany-comment.json b/test/spec/crud/deleteMany-comment.json similarity index 100% rename from test/spec/crud/unified/deleteMany-comment.json rename to test/spec/crud/deleteMany-comment.json diff --git a/test/spec/crud/unified/deleteMany-comment.yml b/test/spec/crud/deleteMany-comment.yml similarity index 100% rename from test/spec/crud/unified/deleteMany-comment.yml rename to test/spec/crud/deleteMany-comment.yml diff --git a/test/spec/crud/unified/deleteMany-hint-clientError.json b/test/spec/crud/deleteMany-hint-clientError.json similarity index 100% rename from test/spec/crud/unified/deleteMany-hint-clientError.json rename to test/spec/crud/deleteMany-hint-clientError.json diff --git a/test/spec/crud/unified/deleteMany-hint-clientError.yml b/test/spec/crud/deleteMany-hint-clientError.yml similarity index 100% rename from test/spec/crud/unified/deleteMany-hint-clientError.yml rename to test/spec/crud/deleteMany-hint-clientError.yml diff --git a/test/spec/crud/unified/deleteMany-hint-serverError.json b/test/spec/crud/deleteMany-hint-serverError.json similarity index 100% rename from test/spec/crud/unified/deleteMany-hint-serverError.json rename to test/spec/crud/deleteMany-hint-serverError.json diff --git a/test/spec/crud/unified/deleteMany-hint-serverError.yml b/test/spec/crud/deleteMany-hint-serverError.yml similarity index 100% rename from test/spec/crud/unified/deleteMany-hint-serverError.yml rename to test/spec/crud/deleteMany-hint-serverError.yml diff --git a/test/spec/crud/unified/deleteMany-hint-unacknowledged.json b/test/spec/crud/deleteMany-hint-unacknowledged.json similarity index 100% rename from test/spec/crud/unified/deleteMany-hint-unacknowledged.json rename to test/spec/crud/deleteMany-hint-unacknowledged.json diff --git a/test/spec/crud/unified/deleteMany-hint-unacknowledged.yml b/test/spec/crud/deleteMany-hint-unacknowledged.yml similarity index 100% rename from test/spec/crud/unified/deleteMany-hint-unacknowledged.yml rename to test/spec/crud/deleteMany-hint-unacknowledged.yml diff --git a/test/spec/crud/unified/deleteMany-hint.json b/test/spec/crud/deleteMany-hint.json similarity index 100% rename from test/spec/crud/unified/deleteMany-hint.json rename to test/spec/crud/deleteMany-hint.json diff --git a/test/spec/crud/unified/deleteMany-hint.yml b/test/spec/crud/deleteMany-hint.yml similarity index 100% rename from test/spec/crud/unified/deleteMany-hint.yml rename to test/spec/crud/deleteMany-hint.yml diff --git a/test/spec/crud/unified/deleteMany-let.json b/test/spec/crud/deleteMany-let.json similarity index 100% rename from test/spec/crud/unified/deleteMany-let.json rename to test/spec/crud/deleteMany-let.json diff --git a/test/spec/crud/unified/deleteMany-let.yml b/test/spec/crud/deleteMany-let.yml similarity index 100% rename from test/spec/crud/unified/deleteMany-let.yml rename to test/spec/crud/deleteMany-let.yml diff --git a/test/spec/crud/unified/deleteMany.json b/test/spec/crud/deleteMany.json similarity index 100% rename from test/spec/crud/unified/deleteMany.json rename to test/spec/crud/deleteMany.json diff --git a/test/spec/crud/unified/deleteMany.yml b/test/spec/crud/deleteMany.yml similarity index 100% rename from test/spec/crud/unified/deleteMany.yml rename to test/spec/crud/deleteMany.yml diff --git a/test/spec/crud/unified/deleteOne-collation.json b/test/spec/crud/deleteOne-collation.json similarity index 100% rename from test/spec/crud/unified/deleteOne-collation.json rename to test/spec/crud/deleteOne-collation.json diff --git a/test/spec/crud/unified/deleteOne-collation.yml b/test/spec/crud/deleteOne-collation.yml similarity index 100% rename from test/spec/crud/unified/deleteOne-collation.yml rename to test/spec/crud/deleteOne-collation.yml diff --git a/test/spec/crud/unified/deleteOne-comment.json b/test/spec/crud/deleteOne-comment.json similarity index 100% rename from test/spec/crud/unified/deleteOne-comment.json rename to test/spec/crud/deleteOne-comment.json diff --git a/test/spec/crud/unified/deleteOne-comment.yml b/test/spec/crud/deleteOne-comment.yml similarity index 100% rename from test/spec/crud/unified/deleteOne-comment.yml rename to test/spec/crud/deleteOne-comment.yml diff --git a/test/spec/crud/unified/deleteOne-errorResponse.json b/test/spec/crud/deleteOne-errorResponse.json similarity index 100% rename from test/spec/crud/unified/deleteOne-errorResponse.json rename to test/spec/crud/deleteOne-errorResponse.json diff --git a/test/spec/crud/unified/deleteOne-errorResponse.yml b/test/spec/crud/deleteOne-errorResponse.yml similarity index 100% rename from test/spec/crud/unified/deleteOne-errorResponse.yml rename to test/spec/crud/deleteOne-errorResponse.yml diff --git a/test/spec/crud/unified/deleteOne-hint-clientError.json b/test/spec/crud/deleteOne-hint-clientError.json similarity index 100% rename from test/spec/crud/unified/deleteOne-hint-clientError.json rename to test/spec/crud/deleteOne-hint-clientError.json diff --git a/test/spec/crud/unified/deleteOne-hint-clientError.yml b/test/spec/crud/deleteOne-hint-clientError.yml similarity index 100% rename from test/spec/crud/unified/deleteOne-hint-clientError.yml rename to test/spec/crud/deleteOne-hint-clientError.yml diff --git a/test/spec/crud/unified/deleteOne-hint-serverError.json b/test/spec/crud/deleteOne-hint-serverError.json similarity index 100% rename from test/spec/crud/unified/deleteOne-hint-serverError.json rename to test/spec/crud/deleteOne-hint-serverError.json diff --git a/test/spec/crud/unified/deleteOne-hint-serverError.yml b/test/spec/crud/deleteOne-hint-serverError.yml similarity index 100% rename from test/spec/crud/unified/deleteOne-hint-serverError.yml rename to test/spec/crud/deleteOne-hint-serverError.yml diff --git a/test/spec/crud/unified/deleteOne-hint-unacknowledged.json b/test/spec/crud/deleteOne-hint-unacknowledged.json similarity index 100% rename from test/spec/crud/unified/deleteOne-hint-unacknowledged.json rename to test/spec/crud/deleteOne-hint-unacknowledged.json diff --git a/test/spec/crud/unified/deleteOne-hint-unacknowledged.yml b/test/spec/crud/deleteOne-hint-unacknowledged.yml similarity index 100% rename from test/spec/crud/unified/deleteOne-hint-unacknowledged.yml rename to test/spec/crud/deleteOne-hint-unacknowledged.yml diff --git a/test/spec/crud/unified/deleteOne-hint.json b/test/spec/crud/deleteOne-hint.json similarity index 100% rename from test/spec/crud/unified/deleteOne-hint.json rename to test/spec/crud/deleteOne-hint.json diff --git a/test/spec/crud/unified/deleteOne-hint.yml b/test/spec/crud/deleteOne-hint.yml similarity index 100% rename from test/spec/crud/unified/deleteOne-hint.yml rename to test/spec/crud/deleteOne-hint.yml diff --git a/test/spec/crud/unified/deleteOne-let.json b/test/spec/crud/deleteOne-let.json similarity index 100% rename from test/spec/crud/unified/deleteOne-let.json rename to test/spec/crud/deleteOne-let.json diff --git a/test/spec/crud/unified/deleteOne-let.yml b/test/spec/crud/deleteOne-let.yml similarity index 100% rename from test/spec/crud/unified/deleteOne-let.yml rename to test/spec/crud/deleteOne-let.yml diff --git a/test/spec/crud/unified/deleteOne.json b/test/spec/crud/deleteOne.json similarity index 100% rename from test/spec/crud/unified/deleteOne.json rename to test/spec/crud/deleteOne.json diff --git a/test/spec/crud/unified/deleteOne.yml b/test/spec/crud/deleteOne.yml similarity index 100% rename from test/spec/crud/unified/deleteOne.yml rename to test/spec/crud/deleteOne.yml diff --git a/test/spec/crud/unified/distinct-collation.json b/test/spec/crud/distinct-collation.json similarity index 100% rename from test/spec/crud/unified/distinct-collation.json rename to test/spec/crud/distinct-collation.json diff --git a/test/spec/crud/unified/distinct-collation.yml b/test/spec/crud/distinct-collation.yml similarity index 100% rename from test/spec/crud/unified/distinct-collation.yml rename to test/spec/crud/distinct-collation.yml diff --git a/test/spec/crud/unified/distinct-comment.json b/test/spec/crud/distinct-comment.json similarity index 100% rename from test/spec/crud/unified/distinct-comment.json rename to test/spec/crud/distinct-comment.json diff --git a/test/spec/crud/unified/distinct-comment.yml b/test/spec/crud/distinct-comment.yml similarity index 100% rename from test/spec/crud/unified/distinct-comment.yml rename to test/spec/crud/distinct-comment.yml diff --git a/test/spec/crud/unified/distinct.json b/test/spec/crud/distinct.json similarity index 100% rename from test/spec/crud/unified/distinct.json rename to test/spec/crud/distinct.json diff --git a/test/spec/crud/unified/distinct.yml b/test/spec/crud/distinct.yml similarity index 100% rename from test/spec/crud/unified/distinct.yml rename to test/spec/crud/distinct.yml diff --git a/test/spec/crud/unified/estimatedDocumentCount-comment.json b/test/spec/crud/estimatedDocumentCount-comment.json similarity index 100% rename from test/spec/crud/unified/estimatedDocumentCount-comment.json rename to test/spec/crud/estimatedDocumentCount-comment.json diff --git a/test/spec/crud/unified/estimatedDocumentCount-comment.yml b/test/spec/crud/estimatedDocumentCount-comment.yml similarity index 100% rename from test/spec/crud/unified/estimatedDocumentCount-comment.yml rename to test/spec/crud/estimatedDocumentCount-comment.yml diff --git a/test/spec/crud/unified/estimatedDocumentCount.json b/test/spec/crud/estimatedDocumentCount.json similarity index 100% rename from test/spec/crud/unified/estimatedDocumentCount.json rename to test/spec/crud/estimatedDocumentCount.json diff --git a/test/spec/crud/unified/estimatedDocumentCount.yml b/test/spec/crud/estimatedDocumentCount.yml similarity index 100% rename from test/spec/crud/unified/estimatedDocumentCount.yml rename to test/spec/crud/estimatedDocumentCount.yml diff --git a/test/spec/crud/unified/find-allowdiskuse-clientError.json b/test/spec/crud/find-allowdiskuse-clientError.json similarity index 100% rename from test/spec/crud/unified/find-allowdiskuse-clientError.json rename to test/spec/crud/find-allowdiskuse-clientError.json diff --git a/test/spec/crud/unified/find-allowdiskuse-clientError.yml b/test/spec/crud/find-allowdiskuse-clientError.yml similarity index 100% rename from test/spec/crud/unified/find-allowdiskuse-clientError.yml rename to test/spec/crud/find-allowdiskuse-clientError.yml diff --git a/test/spec/crud/unified/find-allowdiskuse-serverError.json b/test/spec/crud/find-allowdiskuse-serverError.json similarity index 100% rename from test/spec/crud/unified/find-allowdiskuse-serverError.json rename to test/spec/crud/find-allowdiskuse-serverError.json diff --git a/test/spec/crud/unified/find-allowdiskuse-serverError.yml b/test/spec/crud/find-allowdiskuse-serverError.yml similarity index 100% rename from test/spec/crud/unified/find-allowdiskuse-serverError.yml rename to test/spec/crud/find-allowdiskuse-serverError.yml diff --git a/test/spec/crud/unified/find-allowdiskuse.json b/test/spec/crud/find-allowdiskuse.json similarity index 100% rename from test/spec/crud/unified/find-allowdiskuse.json rename to test/spec/crud/find-allowdiskuse.json diff --git a/test/spec/crud/unified/find-allowdiskuse.yml b/test/spec/crud/find-allowdiskuse.yml similarity index 100% rename from test/spec/crud/unified/find-allowdiskuse.yml rename to test/spec/crud/find-allowdiskuse.yml diff --git a/test/spec/crud/unified/find-collation.json b/test/spec/crud/find-collation.json similarity index 100% rename from test/spec/crud/unified/find-collation.json rename to test/spec/crud/find-collation.json diff --git a/test/spec/crud/unified/find-collation.yml b/test/spec/crud/find-collation.yml similarity index 100% rename from test/spec/crud/unified/find-collation.yml rename to test/spec/crud/find-collation.yml diff --git a/test/spec/crud/unified/find-comment.json b/test/spec/crud/find-comment.json similarity index 100% rename from test/spec/crud/unified/find-comment.json rename to test/spec/crud/find-comment.json diff --git a/test/spec/crud/unified/find-comment.yml b/test/spec/crud/find-comment.yml similarity index 100% rename from test/spec/crud/unified/find-comment.yml rename to test/spec/crud/find-comment.yml diff --git a/test/spec/crud/unified/find-let.json b/test/spec/crud/find-let.json similarity index 100% rename from test/spec/crud/unified/find-let.json rename to test/spec/crud/find-let.json diff --git a/test/spec/crud/unified/find-let.yml b/test/spec/crud/find-let.yml similarity index 100% rename from test/spec/crud/unified/find-let.yml rename to test/spec/crud/find-let.yml diff --git a/test/spec/crud/unified/find.json b/test/spec/crud/find.json similarity index 100% rename from test/spec/crud/unified/find.json rename to test/spec/crud/find.json diff --git a/test/spec/crud/unified/find.yml b/test/spec/crud/find.yml similarity index 100% rename from test/spec/crud/unified/find.yml rename to test/spec/crud/find.yml diff --git a/test/spec/crud/unified/findOneAndDelete-collation.json b/test/spec/crud/findOneAndDelete-collation.json similarity index 100% rename from test/spec/crud/unified/findOneAndDelete-collation.json rename to test/spec/crud/findOneAndDelete-collation.json diff --git a/test/spec/crud/unified/findOneAndDelete-collation.yml b/test/spec/crud/findOneAndDelete-collation.yml similarity index 100% rename from test/spec/crud/unified/findOneAndDelete-collation.yml rename to test/spec/crud/findOneAndDelete-collation.yml diff --git a/test/spec/crud/unified/findOneAndDelete-comment.json b/test/spec/crud/findOneAndDelete-comment.json similarity index 100% rename from test/spec/crud/unified/findOneAndDelete-comment.json rename to test/spec/crud/findOneAndDelete-comment.json diff --git a/test/spec/crud/unified/findOneAndDelete-comment.yml b/test/spec/crud/findOneAndDelete-comment.yml similarity index 100% rename from test/spec/crud/unified/findOneAndDelete-comment.yml rename to test/spec/crud/findOneAndDelete-comment.yml diff --git a/test/spec/crud/unified/findOneAndDelete-hint-clientError.json b/test/spec/crud/findOneAndDelete-hint-clientError.json similarity index 100% rename from test/spec/crud/unified/findOneAndDelete-hint-clientError.json rename to test/spec/crud/findOneAndDelete-hint-clientError.json diff --git a/test/spec/crud/unified/findOneAndDelete-hint-clientError.yml b/test/spec/crud/findOneAndDelete-hint-clientError.yml similarity index 100% rename from test/spec/crud/unified/findOneAndDelete-hint-clientError.yml rename to test/spec/crud/findOneAndDelete-hint-clientError.yml diff --git a/test/spec/crud/unified/findOneAndDelete-hint-serverError.json b/test/spec/crud/findOneAndDelete-hint-serverError.json similarity index 100% rename from test/spec/crud/unified/findOneAndDelete-hint-serverError.json rename to test/spec/crud/findOneAndDelete-hint-serverError.json diff --git a/test/spec/crud/unified/findOneAndDelete-hint-serverError.yml b/test/spec/crud/findOneAndDelete-hint-serverError.yml similarity index 100% rename from test/spec/crud/unified/findOneAndDelete-hint-serverError.yml rename to test/spec/crud/findOneAndDelete-hint-serverError.yml diff --git a/test/spec/crud/unified/findOneAndDelete-hint-unacknowledged.json b/test/spec/crud/findOneAndDelete-hint-unacknowledged.json similarity index 100% rename from test/spec/crud/unified/findOneAndDelete-hint-unacknowledged.json rename to test/spec/crud/findOneAndDelete-hint-unacknowledged.json diff --git a/test/spec/crud/unified/findOneAndDelete-hint-unacknowledged.yml b/test/spec/crud/findOneAndDelete-hint-unacknowledged.yml similarity index 100% rename from test/spec/crud/unified/findOneAndDelete-hint-unacknowledged.yml rename to test/spec/crud/findOneAndDelete-hint-unacknowledged.yml diff --git a/test/spec/crud/unified/findOneAndDelete-hint.json b/test/spec/crud/findOneAndDelete-hint.json similarity index 100% rename from test/spec/crud/unified/findOneAndDelete-hint.json rename to test/spec/crud/findOneAndDelete-hint.json diff --git a/test/spec/crud/unified/findOneAndDelete-hint.yml b/test/spec/crud/findOneAndDelete-hint.yml similarity index 100% rename from test/spec/crud/unified/findOneAndDelete-hint.yml rename to test/spec/crud/findOneAndDelete-hint.yml diff --git a/test/spec/crud/unified/findOneAndDelete-let.json b/test/spec/crud/findOneAndDelete-let.json similarity index 100% rename from test/spec/crud/unified/findOneAndDelete-let.json rename to test/spec/crud/findOneAndDelete-let.json diff --git a/test/spec/crud/unified/findOneAndDelete-let.yml b/test/spec/crud/findOneAndDelete-let.yml similarity index 100% rename from test/spec/crud/unified/findOneAndDelete-let.yml rename to test/spec/crud/findOneAndDelete-let.yml diff --git a/test/spec/crud/unified/findOneAndDelete.json b/test/spec/crud/findOneAndDelete.json similarity index 100% rename from test/spec/crud/unified/findOneAndDelete.json rename to test/spec/crud/findOneAndDelete.json diff --git a/test/spec/crud/unified/findOneAndDelete.yml b/test/spec/crud/findOneAndDelete.yml similarity index 100% rename from test/spec/crud/unified/findOneAndDelete.yml rename to test/spec/crud/findOneAndDelete.yml diff --git a/test/spec/crud/unified/findOneAndReplace-collation.json b/test/spec/crud/findOneAndReplace-collation.json similarity index 100% rename from test/spec/crud/unified/findOneAndReplace-collation.json rename to test/spec/crud/findOneAndReplace-collation.json diff --git a/test/spec/crud/unified/findOneAndReplace-collation.yml b/test/spec/crud/findOneAndReplace-collation.yml similarity index 100% rename from test/spec/crud/unified/findOneAndReplace-collation.yml rename to test/spec/crud/findOneAndReplace-collation.yml diff --git a/test/spec/crud/unified/findOneAndReplace-comment.json b/test/spec/crud/findOneAndReplace-comment.json similarity index 100% rename from test/spec/crud/unified/findOneAndReplace-comment.json rename to test/spec/crud/findOneAndReplace-comment.json diff --git a/test/spec/crud/unified/findOneAndReplace-comment.yml b/test/spec/crud/findOneAndReplace-comment.yml similarity index 100% rename from test/spec/crud/unified/findOneAndReplace-comment.yml rename to test/spec/crud/findOneAndReplace-comment.yml diff --git a/test/spec/crud/unified/findOneAndReplace-dots_and_dollars.json b/test/spec/crud/findOneAndReplace-dots_and_dollars.json similarity index 100% rename from test/spec/crud/unified/findOneAndReplace-dots_and_dollars.json rename to test/spec/crud/findOneAndReplace-dots_and_dollars.json diff --git a/test/spec/crud/unified/findOneAndReplace-dots_and_dollars.yml b/test/spec/crud/findOneAndReplace-dots_and_dollars.yml similarity index 100% rename from test/spec/crud/unified/findOneAndReplace-dots_and_dollars.yml rename to test/spec/crud/findOneAndReplace-dots_and_dollars.yml diff --git a/test/spec/crud/unified/findOneAndReplace-hint-clientError.json b/test/spec/crud/findOneAndReplace-hint-clientError.json similarity index 100% rename from test/spec/crud/unified/findOneAndReplace-hint-clientError.json rename to test/spec/crud/findOneAndReplace-hint-clientError.json diff --git a/test/spec/crud/unified/findOneAndReplace-hint-clientError.yml b/test/spec/crud/findOneAndReplace-hint-clientError.yml similarity index 100% rename from test/spec/crud/unified/findOneAndReplace-hint-clientError.yml rename to test/spec/crud/findOneAndReplace-hint-clientError.yml diff --git a/test/spec/crud/unified/findOneAndReplace-hint-serverError.json b/test/spec/crud/findOneAndReplace-hint-serverError.json similarity index 100% rename from test/spec/crud/unified/findOneAndReplace-hint-serverError.json rename to test/spec/crud/findOneAndReplace-hint-serverError.json diff --git a/test/spec/crud/unified/findOneAndReplace-hint-serverError.yml b/test/spec/crud/findOneAndReplace-hint-serverError.yml similarity index 100% rename from test/spec/crud/unified/findOneAndReplace-hint-serverError.yml rename to test/spec/crud/findOneAndReplace-hint-serverError.yml diff --git a/test/spec/crud/unified/findOneAndReplace-hint-unacknowledged.json b/test/spec/crud/findOneAndReplace-hint-unacknowledged.json similarity index 100% rename from test/spec/crud/unified/findOneAndReplace-hint-unacknowledged.json rename to test/spec/crud/findOneAndReplace-hint-unacknowledged.json diff --git a/test/spec/crud/unified/findOneAndReplace-hint-unacknowledged.yml b/test/spec/crud/findOneAndReplace-hint-unacknowledged.yml similarity index 100% rename from test/spec/crud/unified/findOneAndReplace-hint-unacknowledged.yml rename to test/spec/crud/findOneAndReplace-hint-unacknowledged.yml diff --git a/test/spec/crud/unified/findOneAndReplace-hint.json b/test/spec/crud/findOneAndReplace-hint.json similarity index 100% rename from test/spec/crud/unified/findOneAndReplace-hint.json rename to test/spec/crud/findOneAndReplace-hint.json diff --git a/test/spec/crud/unified/findOneAndReplace-hint.yml b/test/spec/crud/findOneAndReplace-hint.yml similarity index 100% rename from test/spec/crud/unified/findOneAndReplace-hint.yml rename to test/spec/crud/findOneAndReplace-hint.yml diff --git a/test/spec/crud/unified/findOneAndReplace-let.json b/test/spec/crud/findOneAndReplace-let.json similarity index 100% rename from test/spec/crud/unified/findOneAndReplace-let.json rename to test/spec/crud/findOneAndReplace-let.json diff --git a/test/spec/crud/unified/findOneAndReplace-let.yml b/test/spec/crud/findOneAndReplace-let.yml similarity index 100% rename from test/spec/crud/unified/findOneAndReplace-let.yml rename to test/spec/crud/findOneAndReplace-let.yml diff --git a/test/spec/crud/unified/findOneAndReplace-upsert.json b/test/spec/crud/findOneAndReplace-upsert.json similarity index 100% rename from test/spec/crud/unified/findOneAndReplace-upsert.json rename to test/spec/crud/findOneAndReplace-upsert.json diff --git a/test/spec/crud/unified/findOneAndReplace-upsert.yml b/test/spec/crud/findOneAndReplace-upsert.yml similarity index 100% rename from test/spec/crud/unified/findOneAndReplace-upsert.yml rename to test/spec/crud/findOneAndReplace-upsert.yml diff --git a/test/spec/crud/unified/findOneAndReplace.json b/test/spec/crud/findOneAndReplace.json similarity index 100% rename from test/spec/crud/unified/findOneAndReplace.json rename to test/spec/crud/findOneAndReplace.json diff --git a/test/spec/crud/unified/findOneAndReplace.yml b/test/spec/crud/findOneAndReplace.yml similarity index 100% rename from test/spec/crud/unified/findOneAndReplace.yml rename to test/spec/crud/findOneAndReplace.yml diff --git a/test/spec/crud/unified/findOneAndUpdate-arrayFilters.json b/test/spec/crud/findOneAndUpdate-arrayFilters.json similarity index 100% rename from test/spec/crud/unified/findOneAndUpdate-arrayFilters.json rename to test/spec/crud/findOneAndUpdate-arrayFilters.json diff --git a/test/spec/crud/unified/findOneAndUpdate-arrayFilters.yml b/test/spec/crud/findOneAndUpdate-arrayFilters.yml similarity index 100% rename from test/spec/crud/unified/findOneAndUpdate-arrayFilters.yml rename to test/spec/crud/findOneAndUpdate-arrayFilters.yml diff --git a/test/spec/crud/unified/findOneAndUpdate-collation.json b/test/spec/crud/findOneAndUpdate-collation.json similarity index 100% rename from test/spec/crud/unified/findOneAndUpdate-collation.json rename to test/spec/crud/findOneAndUpdate-collation.json diff --git a/test/spec/crud/unified/findOneAndUpdate-collation.yml b/test/spec/crud/findOneAndUpdate-collation.yml similarity index 100% rename from test/spec/crud/unified/findOneAndUpdate-collation.yml rename to test/spec/crud/findOneAndUpdate-collation.yml diff --git a/test/spec/crud/unified/findOneAndUpdate-comment.json b/test/spec/crud/findOneAndUpdate-comment.json similarity index 100% rename from test/spec/crud/unified/findOneAndUpdate-comment.json rename to test/spec/crud/findOneAndUpdate-comment.json diff --git a/test/spec/crud/unified/findOneAndUpdate-comment.yml b/test/spec/crud/findOneAndUpdate-comment.yml similarity index 100% rename from test/spec/crud/unified/findOneAndUpdate-comment.yml rename to test/spec/crud/findOneAndUpdate-comment.yml diff --git a/test/spec/crud/unified/findOneAndUpdate-dots_and_dollars.json b/test/spec/crud/findOneAndUpdate-dots_and_dollars.json similarity index 100% rename from test/spec/crud/unified/findOneAndUpdate-dots_and_dollars.json rename to test/spec/crud/findOneAndUpdate-dots_and_dollars.json diff --git a/test/spec/crud/unified/findOneAndUpdate-dots_and_dollars.yml b/test/spec/crud/findOneAndUpdate-dots_and_dollars.yml similarity index 100% rename from test/spec/crud/unified/findOneAndUpdate-dots_and_dollars.yml rename to test/spec/crud/findOneAndUpdate-dots_and_dollars.yml diff --git a/test/spec/crud/unified/findOneAndUpdate-errorResponse.json b/test/spec/crud/findOneAndUpdate-errorResponse.json similarity index 100% rename from test/spec/crud/unified/findOneAndUpdate-errorResponse.json rename to test/spec/crud/findOneAndUpdate-errorResponse.json diff --git a/test/spec/crud/unified/findOneAndUpdate-errorResponse.yml b/test/spec/crud/findOneAndUpdate-errorResponse.yml similarity index 100% rename from test/spec/crud/unified/findOneAndUpdate-errorResponse.yml rename to test/spec/crud/findOneAndUpdate-errorResponse.yml diff --git a/test/spec/crud/unified/findOneAndUpdate-hint-clientError.json b/test/spec/crud/findOneAndUpdate-hint-clientError.json similarity index 100% rename from test/spec/crud/unified/findOneAndUpdate-hint-clientError.json rename to test/spec/crud/findOneAndUpdate-hint-clientError.json diff --git a/test/spec/crud/unified/findOneAndUpdate-hint-clientError.yml b/test/spec/crud/findOneAndUpdate-hint-clientError.yml similarity index 100% rename from test/spec/crud/unified/findOneAndUpdate-hint-clientError.yml rename to test/spec/crud/findOneAndUpdate-hint-clientError.yml diff --git a/test/spec/crud/unified/findOneAndUpdate-hint-serverError.json b/test/spec/crud/findOneAndUpdate-hint-serverError.json similarity index 100% rename from test/spec/crud/unified/findOneAndUpdate-hint-serverError.json rename to test/spec/crud/findOneAndUpdate-hint-serverError.json diff --git a/test/spec/crud/unified/findOneAndUpdate-hint-serverError.yml b/test/spec/crud/findOneAndUpdate-hint-serverError.yml similarity index 100% rename from test/spec/crud/unified/findOneAndUpdate-hint-serverError.yml rename to test/spec/crud/findOneAndUpdate-hint-serverError.yml diff --git a/test/spec/crud/unified/findOneAndUpdate-hint-unacknowledged.json b/test/spec/crud/findOneAndUpdate-hint-unacknowledged.json similarity index 100% rename from test/spec/crud/unified/findOneAndUpdate-hint-unacknowledged.json rename to test/spec/crud/findOneAndUpdate-hint-unacknowledged.json diff --git a/test/spec/crud/unified/findOneAndUpdate-hint-unacknowledged.yml b/test/spec/crud/findOneAndUpdate-hint-unacknowledged.yml similarity index 100% rename from test/spec/crud/unified/findOneAndUpdate-hint-unacknowledged.yml rename to test/spec/crud/findOneAndUpdate-hint-unacknowledged.yml diff --git a/test/spec/crud/unified/findOneAndUpdate-hint.json b/test/spec/crud/findOneAndUpdate-hint.json similarity index 100% rename from test/spec/crud/unified/findOneAndUpdate-hint.json rename to test/spec/crud/findOneAndUpdate-hint.json diff --git a/test/spec/crud/unified/findOneAndUpdate-hint.yml b/test/spec/crud/findOneAndUpdate-hint.yml similarity index 100% rename from test/spec/crud/unified/findOneAndUpdate-hint.yml rename to test/spec/crud/findOneAndUpdate-hint.yml diff --git a/test/spec/crud/unified/findOneAndUpdate-let.json b/test/spec/crud/findOneAndUpdate-let.json similarity index 100% rename from test/spec/crud/unified/findOneAndUpdate-let.json rename to test/spec/crud/findOneAndUpdate-let.json diff --git a/test/spec/crud/unified/findOneAndUpdate-let.yml b/test/spec/crud/findOneAndUpdate-let.yml similarity index 100% rename from test/spec/crud/unified/findOneAndUpdate-let.yml rename to test/spec/crud/findOneAndUpdate-let.yml diff --git a/test/spec/crud/unified/findOneAndUpdate.json b/test/spec/crud/findOneAndUpdate.json similarity index 100% rename from test/spec/crud/unified/findOneAndUpdate.json rename to test/spec/crud/findOneAndUpdate.json diff --git a/test/spec/crud/unified/findOneAndUpdate.yml b/test/spec/crud/findOneAndUpdate.yml similarity index 100% rename from test/spec/crud/unified/findOneAndUpdate.yml rename to test/spec/crud/findOneAndUpdate.yml diff --git a/test/spec/crud/unified/insertMany-comment.json b/test/spec/crud/insertMany-comment.json similarity index 100% rename from test/spec/crud/unified/insertMany-comment.json rename to test/spec/crud/insertMany-comment.json diff --git a/test/spec/crud/unified/insertMany-comment.yml b/test/spec/crud/insertMany-comment.yml similarity index 100% rename from test/spec/crud/unified/insertMany-comment.yml rename to test/spec/crud/insertMany-comment.yml diff --git a/test/spec/crud/unified/insertMany-dots_and_dollars.json b/test/spec/crud/insertMany-dots_and_dollars.json similarity index 100% rename from test/spec/crud/unified/insertMany-dots_and_dollars.json rename to test/spec/crud/insertMany-dots_and_dollars.json diff --git a/test/spec/crud/unified/insertMany-dots_and_dollars.yml b/test/spec/crud/insertMany-dots_and_dollars.yml similarity index 100% rename from test/spec/crud/unified/insertMany-dots_and_dollars.yml rename to test/spec/crud/insertMany-dots_and_dollars.yml diff --git a/test/spec/crud/unified/insertMany.json b/test/spec/crud/insertMany.json similarity index 100% rename from test/spec/crud/unified/insertMany.json rename to test/spec/crud/insertMany.json diff --git a/test/spec/crud/unified/insertMany.yml b/test/spec/crud/insertMany.yml similarity index 100% rename from test/spec/crud/unified/insertMany.yml rename to test/spec/crud/insertMany.yml diff --git a/test/spec/crud/unified/insertOne-comment.json b/test/spec/crud/insertOne-comment.json similarity index 100% rename from test/spec/crud/unified/insertOne-comment.json rename to test/spec/crud/insertOne-comment.json diff --git a/test/spec/crud/unified/insertOne-comment.yml b/test/spec/crud/insertOne-comment.yml similarity index 100% rename from test/spec/crud/unified/insertOne-comment.yml rename to test/spec/crud/insertOne-comment.yml diff --git a/test/spec/crud/unified/insertOne-dots_and_dollars.json b/test/spec/crud/insertOne-dots_and_dollars.json similarity index 100% rename from test/spec/crud/unified/insertOne-dots_and_dollars.json rename to test/spec/crud/insertOne-dots_and_dollars.json diff --git a/test/spec/crud/unified/insertOne-dots_and_dollars.yml b/test/spec/crud/insertOne-dots_and_dollars.yml similarity index 100% rename from test/spec/crud/unified/insertOne-dots_and_dollars.yml rename to test/spec/crud/insertOne-dots_and_dollars.yml diff --git a/test/spec/crud/unified/insertOne-errorResponse.json b/test/spec/crud/insertOne-errorResponse.json similarity index 100% rename from test/spec/crud/unified/insertOne-errorResponse.json rename to test/spec/crud/insertOne-errorResponse.json diff --git a/test/spec/crud/unified/insertOne-errorResponse.yml b/test/spec/crud/insertOne-errorResponse.yml similarity index 100% rename from test/spec/crud/unified/insertOne-errorResponse.yml rename to test/spec/crud/insertOne-errorResponse.yml diff --git a/test/spec/crud/unified/insertOne.json b/test/spec/crud/insertOne.json similarity index 100% rename from test/spec/crud/unified/insertOne.json rename to test/spec/crud/insertOne.json diff --git a/test/spec/crud/unified/insertOne.yml b/test/spec/crud/insertOne.yml similarity index 100% rename from test/spec/crud/unified/insertOne.yml rename to test/spec/crud/insertOne.yml diff --git a/test/spec/crud/unified/replaceOne-collation.json b/test/spec/crud/replaceOne-collation.json similarity index 100% rename from test/spec/crud/unified/replaceOne-collation.json rename to test/spec/crud/replaceOne-collation.json diff --git a/test/spec/crud/unified/replaceOne-collation.yml b/test/spec/crud/replaceOne-collation.yml similarity index 100% rename from test/spec/crud/unified/replaceOne-collation.yml rename to test/spec/crud/replaceOne-collation.yml diff --git a/test/spec/crud/unified/replaceOne-comment.json b/test/spec/crud/replaceOne-comment.json similarity index 100% rename from test/spec/crud/unified/replaceOne-comment.json rename to test/spec/crud/replaceOne-comment.json diff --git a/test/spec/crud/unified/replaceOne-comment.yml b/test/spec/crud/replaceOne-comment.yml similarity index 100% rename from test/spec/crud/unified/replaceOne-comment.yml rename to test/spec/crud/replaceOne-comment.yml diff --git a/test/spec/crud/unified/replaceOne-dots_and_dollars.json b/test/spec/crud/replaceOne-dots_and_dollars.json similarity index 100% rename from test/spec/crud/unified/replaceOne-dots_and_dollars.json rename to test/spec/crud/replaceOne-dots_and_dollars.json diff --git a/test/spec/crud/unified/replaceOne-dots_and_dollars.yml b/test/spec/crud/replaceOne-dots_and_dollars.yml similarity index 100% rename from test/spec/crud/unified/replaceOne-dots_and_dollars.yml rename to test/spec/crud/replaceOne-dots_and_dollars.yml diff --git a/test/spec/crud/unified/replaceOne-hint-unacknowledged.json b/test/spec/crud/replaceOne-hint-unacknowledged.json similarity index 100% rename from test/spec/crud/unified/replaceOne-hint-unacknowledged.json rename to test/spec/crud/replaceOne-hint-unacknowledged.json diff --git a/test/spec/crud/unified/replaceOne-hint-unacknowledged.yml b/test/spec/crud/replaceOne-hint-unacknowledged.yml similarity index 100% rename from test/spec/crud/unified/replaceOne-hint-unacknowledged.yml rename to test/spec/crud/replaceOne-hint-unacknowledged.yml diff --git a/test/spec/crud/unified/replaceOne-hint.json b/test/spec/crud/replaceOne-hint.json similarity index 100% rename from test/spec/crud/unified/replaceOne-hint.json rename to test/spec/crud/replaceOne-hint.json diff --git a/test/spec/crud/unified/replaceOne-hint.yml b/test/spec/crud/replaceOne-hint.yml similarity index 100% rename from test/spec/crud/unified/replaceOne-hint.yml rename to test/spec/crud/replaceOne-hint.yml diff --git a/test/spec/crud/unified/replaceOne-let.json b/test/spec/crud/replaceOne-let.json similarity index 100% rename from test/spec/crud/unified/replaceOne-let.json rename to test/spec/crud/replaceOne-let.json diff --git a/test/spec/crud/unified/replaceOne-let.yml b/test/spec/crud/replaceOne-let.yml similarity index 100% rename from test/spec/crud/unified/replaceOne-let.yml rename to test/spec/crud/replaceOne-let.yml diff --git a/test/spec/crud/unified/replaceOne-validation.json b/test/spec/crud/replaceOne-validation.json similarity index 100% rename from test/spec/crud/unified/replaceOne-validation.json rename to test/spec/crud/replaceOne-validation.json diff --git a/test/spec/crud/unified/replaceOne-validation.yml b/test/spec/crud/replaceOne-validation.yml similarity index 100% rename from test/spec/crud/unified/replaceOne-validation.yml rename to test/spec/crud/replaceOne-validation.yml diff --git a/test/spec/crud/unified/replaceOne.json b/test/spec/crud/replaceOne.json similarity index 100% rename from test/spec/crud/unified/replaceOne.json rename to test/spec/crud/replaceOne.json diff --git a/test/spec/crud/unified/replaceOne.yml b/test/spec/crud/replaceOne.yml similarity index 100% rename from test/spec/crud/unified/replaceOne.yml rename to test/spec/crud/replaceOne.yml diff --git a/test/spec/crud/unified/updateMany-arrayFilters.json b/test/spec/crud/updateMany-arrayFilters.json similarity index 100% rename from test/spec/crud/unified/updateMany-arrayFilters.json rename to test/spec/crud/updateMany-arrayFilters.json diff --git a/test/spec/crud/unified/updateMany-arrayFilters.yml b/test/spec/crud/updateMany-arrayFilters.yml similarity index 100% rename from test/spec/crud/unified/updateMany-arrayFilters.yml rename to test/spec/crud/updateMany-arrayFilters.yml diff --git a/test/spec/crud/unified/updateMany-collation.json b/test/spec/crud/updateMany-collation.json similarity index 100% rename from test/spec/crud/unified/updateMany-collation.json rename to test/spec/crud/updateMany-collation.json diff --git a/test/spec/crud/unified/updateMany-collation.yml b/test/spec/crud/updateMany-collation.yml similarity index 100% rename from test/spec/crud/unified/updateMany-collation.yml rename to test/spec/crud/updateMany-collation.yml diff --git a/test/spec/crud/unified/updateMany-comment.json b/test/spec/crud/updateMany-comment.json similarity index 100% rename from test/spec/crud/unified/updateMany-comment.json rename to test/spec/crud/updateMany-comment.json diff --git a/test/spec/crud/unified/updateMany-comment.yml b/test/spec/crud/updateMany-comment.yml similarity index 100% rename from test/spec/crud/unified/updateMany-comment.yml rename to test/spec/crud/updateMany-comment.yml diff --git a/test/spec/crud/unified/updateMany-dots_and_dollars.json b/test/spec/crud/updateMany-dots_and_dollars.json similarity index 100% rename from test/spec/crud/unified/updateMany-dots_and_dollars.json rename to test/spec/crud/updateMany-dots_and_dollars.json diff --git a/test/spec/crud/unified/updateMany-dots_and_dollars.yml b/test/spec/crud/updateMany-dots_and_dollars.yml similarity index 100% rename from test/spec/crud/unified/updateMany-dots_and_dollars.yml rename to test/spec/crud/updateMany-dots_and_dollars.yml diff --git a/test/spec/crud/unified/updateMany-hint-clientError.json b/test/spec/crud/updateMany-hint-clientError.json similarity index 100% rename from test/spec/crud/unified/updateMany-hint-clientError.json rename to test/spec/crud/updateMany-hint-clientError.json diff --git a/test/spec/crud/unified/updateMany-hint-clientError.yml b/test/spec/crud/updateMany-hint-clientError.yml similarity index 100% rename from test/spec/crud/unified/updateMany-hint-clientError.yml rename to test/spec/crud/updateMany-hint-clientError.yml diff --git a/test/spec/crud/unified/updateMany-hint-serverError.json b/test/spec/crud/updateMany-hint-serverError.json similarity index 100% rename from test/spec/crud/unified/updateMany-hint-serverError.json rename to test/spec/crud/updateMany-hint-serverError.json diff --git a/test/spec/crud/unified/updateMany-hint-serverError.yml b/test/spec/crud/updateMany-hint-serverError.yml similarity index 100% rename from test/spec/crud/unified/updateMany-hint-serverError.yml rename to test/spec/crud/updateMany-hint-serverError.yml diff --git a/test/spec/crud/unified/updateMany-hint-unacknowledged.json b/test/spec/crud/updateMany-hint-unacknowledged.json similarity index 100% rename from test/spec/crud/unified/updateMany-hint-unacknowledged.json rename to test/spec/crud/updateMany-hint-unacknowledged.json diff --git a/test/spec/crud/unified/updateMany-hint-unacknowledged.yml b/test/spec/crud/updateMany-hint-unacknowledged.yml similarity index 100% rename from test/spec/crud/unified/updateMany-hint-unacknowledged.yml rename to test/spec/crud/updateMany-hint-unacknowledged.yml diff --git a/test/spec/crud/unified/updateMany-hint.json b/test/spec/crud/updateMany-hint.json similarity index 100% rename from test/spec/crud/unified/updateMany-hint.json rename to test/spec/crud/updateMany-hint.json diff --git a/test/spec/crud/unified/updateMany-hint.yml b/test/spec/crud/updateMany-hint.yml similarity index 100% rename from test/spec/crud/unified/updateMany-hint.yml rename to test/spec/crud/updateMany-hint.yml diff --git a/test/spec/crud/unified/updateMany-let.json b/test/spec/crud/updateMany-let.json similarity index 100% rename from test/spec/crud/unified/updateMany-let.json rename to test/spec/crud/updateMany-let.json diff --git a/test/spec/crud/unified/updateMany-let.yml b/test/spec/crud/updateMany-let.yml similarity index 100% rename from test/spec/crud/unified/updateMany-let.yml rename to test/spec/crud/updateMany-let.yml diff --git a/test/spec/crud/unified/updateMany-validation.json b/test/spec/crud/updateMany-validation.json similarity index 100% rename from test/spec/crud/unified/updateMany-validation.json rename to test/spec/crud/updateMany-validation.json diff --git a/test/spec/crud/unified/updateMany-validation.yml b/test/spec/crud/updateMany-validation.yml similarity index 100% rename from test/spec/crud/unified/updateMany-validation.yml rename to test/spec/crud/updateMany-validation.yml diff --git a/test/spec/crud/unified/updateMany.json b/test/spec/crud/updateMany.json similarity index 100% rename from test/spec/crud/unified/updateMany.json rename to test/spec/crud/updateMany.json diff --git a/test/spec/crud/unified/updateMany.yml b/test/spec/crud/updateMany.yml similarity index 100% rename from test/spec/crud/unified/updateMany.yml rename to test/spec/crud/updateMany.yml diff --git a/test/spec/crud/unified/updateOne-arrayFilters.json b/test/spec/crud/updateOne-arrayFilters.json similarity index 100% rename from test/spec/crud/unified/updateOne-arrayFilters.json rename to test/spec/crud/updateOne-arrayFilters.json diff --git a/test/spec/crud/unified/updateOne-arrayFilters.yml b/test/spec/crud/updateOne-arrayFilters.yml similarity index 100% rename from test/spec/crud/unified/updateOne-arrayFilters.yml rename to test/spec/crud/updateOne-arrayFilters.yml diff --git a/test/spec/crud/unified/updateOne-collation.json b/test/spec/crud/updateOne-collation.json similarity index 100% rename from test/spec/crud/unified/updateOne-collation.json rename to test/spec/crud/updateOne-collation.json diff --git a/test/spec/crud/unified/updateOne-collation.yml b/test/spec/crud/updateOne-collation.yml similarity index 100% rename from test/spec/crud/unified/updateOne-collation.yml rename to test/spec/crud/updateOne-collation.yml diff --git a/test/spec/crud/unified/updateOne-comment.json b/test/spec/crud/updateOne-comment.json similarity index 100% rename from test/spec/crud/unified/updateOne-comment.json rename to test/spec/crud/updateOne-comment.json diff --git a/test/spec/crud/unified/updateOne-comment.yml b/test/spec/crud/updateOne-comment.yml similarity index 100% rename from test/spec/crud/unified/updateOne-comment.yml rename to test/spec/crud/updateOne-comment.yml diff --git a/test/spec/crud/unified/updateOne-dots_and_dollars.json b/test/spec/crud/updateOne-dots_and_dollars.json similarity index 100% rename from test/spec/crud/unified/updateOne-dots_and_dollars.json rename to test/spec/crud/updateOne-dots_and_dollars.json diff --git a/test/spec/crud/unified/updateOne-dots_and_dollars.yml b/test/spec/crud/updateOne-dots_and_dollars.yml similarity index 100% rename from test/spec/crud/unified/updateOne-dots_and_dollars.yml rename to test/spec/crud/updateOne-dots_and_dollars.yml diff --git a/test/spec/crud/unified/updateOne-errorResponse.json b/test/spec/crud/updateOne-errorResponse.json similarity index 100% rename from test/spec/crud/unified/updateOne-errorResponse.json rename to test/spec/crud/updateOne-errorResponse.json diff --git a/test/spec/crud/unified/updateOne-errorResponse.yml b/test/spec/crud/updateOne-errorResponse.yml similarity index 100% rename from test/spec/crud/unified/updateOne-errorResponse.yml rename to test/spec/crud/updateOne-errorResponse.yml diff --git a/test/spec/crud/unified/updateOne-hint-clientError.json b/test/spec/crud/updateOne-hint-clientError.json similarity index 100% rename from test/spec/crud/unified/updateOne-hint-clientError.json rename to test/spec/crud/updateOne-hint-clientError.json diff --git a/test/spec/crud/unified/updateOne-hint-clientError.yml b/test/spec/crud/updateOne-hint-clientError.yml similarity index 100% rename from test/spec/crud/unified/updateOne-hint-clientError.yml rename to test/spec/crud/updateOne-hint-clientError.yml diff --git a/test/spec/crud/unified/updateOne-hint-serverError.json b/test/spec/crud/updateOne-hint-serverError.json similarity index 100% rename from test/spec/crud/unified/updateOne-hint-serverError.json rename to test/spec/crud/updateOne-hint-serverError.json diff --git a/test/spec/crud/unified/updateOne-hint-serverError.yml b/test/spec/crud/updateOne-hint-serverError.yml similarity index 100% rename from test/spec/crud/unified/updateOne-hint-serverError.yml rename to test/spec/crud/updateOne-hint-serverError.yml diff --git a/test/spec/crud/unified/updateOne-hint-unacknowledged.json b/test/spec/crud/updateOne-hint-unacknowledged.json similarity index 100% rename from test/spec/crud/unified/updateOne-hint-unacknowledged.json rename to test/spec/crud/updateOne-hint-unacknowledged.json diff --git a/test/spec/crud/unified/updateOne-hint-unacknowledged.yml b/test/spec/crud/updateOne-hint-unacknowledged.yml similarity index 100% rename from test/spec/crud/unified/updateOne-hint-unacknowledged.yml rename to test/spec/crud/updateOne-hint-unacknowledged.yml diff --git a/test/spec/crud/unified/updateOne-hint.json b/test/spec/crud/updateOne-hint.json similarity index 100% rename from test/spec/crud/unified/updateOne-hint.json rename to test/spec/crud/updateOne-hint.json diff --git a/test/spec/crud/unified/updateOne-hint.yml b/test/spec/crud/updateOne-hint.yml similarity index 100% rename from test/spec/crud/unified/updateOne-hint.yml rename to test/spec/crud/updateOne-hint.yml diff --git a/test/spec/crud/unified/updateOne-let.json b/test/spec/crud/updateOne-let.json similarity index 100% rename from test/spec/crud/unified/updateOne-let.json rename to test/spec/crud/updateOne-let.json diff --git a/test/spec/crud/unified/updateOne-let.yml b/test/spec/crud/updateOne-let.yml similarity index 100% rename from test/spec/crud/unified/updateOne-let.yml rename to test/spec/crud/updateOne-let.yml diff --git a/test/spec/crud/unified/updateOne-validation.json b/test/spec/crud/updateOne-validation.json similarity index 100% rename from test/spec/crud/unified/updateOne-validation.json rename to test/spec/crud/updateOne-validation.json diff --git a/test/spec/crud/unified/updateOne-validation.yml b/test/spec/crud/updateOne-validation.yml similarity index 100% rename from test/spec/crud/unified/updateOne-validation.yml rename to test/spec/crud/updateOne-validation.yml diff --git a/test/spec/crud/unified/updateOne.json b/test/spec/crud/updateOne.json similarity index 100% rename from test/spec/crud/unified/updateOne.json rename to test/spec/crud/updateOne.json diff --git a/test/spec/crud/unified/updateOne.yml b/test/spec/crud/updateOne.yml similarity index 100% rename from test/spec/crud/unified/updateOne.yml rename to test/spec/crud/updateOne.yml diff --git a/test/spec/crud/unified/updateWithPipelines.json b/test/spec/crud/updateWithPipelines.json similarity index 100% rename from test/spec/crud/unified/updateWithPipelines.json rename to test/spec/crud/updateWithPipelines.json diff --git a/test/spec/crud/unified/updateWithPipelines.yml b/test/spec/crud/updateWithPipelines.yml similarity index 100% rename from test/spec/crud/unified/updateWithPipelines.yml rename to test/spec/crud/updateWithPipelines.yml diff --git a/test/tools/unified-spec-runner/match.ts b/test/tools/unified-spec-runner/match.ts index 21fa3b4067..418e1fb59d 100644 --- a/test/tools/unified-spec-runner/match.ts +++ b/test/tools/unified-spec-runner/match.ts @@ -782,6 +782,7 @@ export function expectErrorCheck( if (error instanceof MongoClientBulkWriteError) { mongoError = error.error; } + console.log(error, mongoError); for (const errorLabel of expected.errorLabelsContain) { expect( mongoError.hasErrorLabel(errorLabel), From 68322487d575a48a76df304d6dc730a3c9eef57d Mon Sep 17 00:00:00 2001 From: Durran Jordan Date: Mon, 7 Oct 2024 22:50:25 +0200 Subject: [PATCH 12/29] Revert "chore: debug" This reverts commit 237f87920d36609a0431fda86a9a4258ee16b4aa. --- test/spec/crud/{ => unified}/aggregate-allowdiskuse.json | 0 test/spec/crud/{ => unified}/aggregate-allowdiskuse.yml | 0 test/spec/crud/{ => unified}/aggregate-collation.json | 0 test/spec/crud/{ => unified}/aggregate-collation.yml | 0 test/spec/crud/{ => unified}/aggregate-let.json | 0 test/spec/crud/{ => unified}/aggregate-let.yml | 0 test/spec/crud/{ => unified}/aggregate-merge-errorResponse.json | 0 test/spec/crud/{ => unified}/aggregate-merge-errorResponse.yml | 0 test/spec/crud/{ => unified}/aggregate-merge.json | 0 test/spec/crud/{ => unified}/aggregate-merge.yml | 0 test/spec/crud/{ => unified}/aggregate-out-readConcern.json | 0 test/spec/crud/{ => unified}/aggregate-out-readConcern.yml | 0 test/spec/crud/{ => unified}/aggregate-out.json | 0 test/spec/crud/{ => unified}/aggregate-out.yml | 0 test/spec/crud/{ => unified}/aggregate-write-readPreference.json | 0 test/spec/crud/{ => unified}/aggregate-write-readPreference.yml | 0 test/spec/crud/{ => unified}/aggregate.json | 0 test/spec/crud/{ => unified}/aggregate.yml | 0 .../crud/{ => unified}/bulkWrite-arrayFilters-clientError.json | 0 .../crud/{ => unified}/bulkWrite-arrayFilters-clientError.yml | 0 test/spec/crud/{ => unified}/bulkWrite-arrayFilters.json | 0 test/spec/crud/{ => unified}/bulkWrite-arrayFilters.yml | 0 test/spec/crud/{ => unified}/bulkWrite-collation.json | 0 test/spec/crud/{ => unified}/bulkWrite-collation.yml | 0 test/spec/crud/{ => unified}/bulkWrite-comment.json | 0 test/spec/crud/{ => unified}/bulkWrite-comment.yml | 0 .../crud/{ => unified}/bulkWrite-delete-hint-clientError.json | 0 .../crud/{ => unified}/bulkWrite-delete-hint-clientError.yml | 0 .../crud/{ => unified}/bulkWrite-delete-hint-serverError.json | 0 .../crud/{ => unified}/bulkWrite-delete-hint-serverError.yml | 0 test/spec/crud/{ => unified}/bulkWrite-delete-hint.json | 0 test/spec/crud/{ => unified}/bulkWrite-delete-hint.yml | 0 .../{ => unified}/bulkWrite-deleteMany-hint-unacknowledged.json | 0 .../{ => unified}/bulkWrite-deleteMany-hint-unacknowledged.yml | 0 test/spec/crud/{ => unified}/bulkWrite-deleteMany-let.json | 0 test/spec/crud/{ => unified}/bulkWrite-deleteMany-let.yml | 0 .../{ => unified}/bulkWrite-deleteOne-hint-unacknowledged.json | 0 .../{ => unified}/bulkWrite-deleteOne-hint-unacknowledged.yml | 0 test/spec/crud/{ => unified}/bulkWrite-deleteOne-let.json | 0 test/spec/crud/{ => unified}/bulkWrite-deleteOne-let.yml | 0 test/spec/crud/{ => unified}/bulkWrite-errorResponse.json | 0 test/spec/crud/{ => unified}/bulkWrite-errorResponse.yml | 0 .../crud/{ => unified}/bulkWrite-insertOne-dots_and_dollars.json | 0 .../crud/{ => unified}/bulkWrite-insertOne-dots_and_dollars.yml | 0 .../{ => unified}/bulkWrite-replaceOne-dots_and_dollars.json | 0 .../crud/{ => unified}/bulkWrite-replaceOne-dots_and_dollars.yml | 0 .../{ => unified}/bulkWrite-replaceOne-hint-unacknowledged.json | 0 .../{ => unified}/bulkWrite-replaceOne-hint-unacknowledged.yml | 0 test/spec/crud/{ => unified}/bulkWrite-replaceOne-let.json | 0 test/spec/crud/{ => unified}/bulkWrite-replaceOne-let.yml | 0 .../crud/{ => unified}/bulkWrite-update-hint-clientError.json | 0 .../crud/{ => unified}/bulkWrite-update-hint-clientError.yml | 0 .../crud/{ => unified}/bulkWrite-update-hint-serverError.json | 0 .../crud/{ => unified}/bulkWrite-update-hint-serverError.yml | 0 test/spec/crud/{ => unified}/bulkWrite-update-hint.json | 0 test/spec/crud/{ => unified}/bulkWrite-update-hint.yml | 0 test/spec/crud/{ => unified}/bulkWrite-update-validation.json | 0 test/spec/crud/{ => unified}/bulkWrite-update-validation.yml | 0 .../{ => unified}/bulkWrite-updateMany-dots_and_dollars.json | 0 .../crud/{ => unified}/bulkWrite-updateMany-dots_and_dollars.yml | 0 .../{ => unified}/bulkWrite-updateMany-hint-unacknowledged.json | 0 .../{ => unified}/bulkWrite-updateMany-hint-unacknowledged.yml | 0 test/spec/crud/{ => unified}/bulkWrite-updateMany-let.json | 0 test/spec/crud/{ => unified}/bulkWrite-updateMany-let.yml | 0 .../crud/{ => unified}/bulkWrite-updateOne-dots_and_dollars.json | 0 .../crud/{ => unified}/bulkWrite-updateOne-dots_and_dollars.yml | 0 .../{ => unified}/bulkWrite-updateOne-hint-unacknowledged.json | 0 .../{ => unified}/bulkWrite-updateOne-hint-unacknowledged.yml | 0 test/spec/crud/{ => unified}/bulkWrite-updateOne-let.json | 0 test/spec/crud/{ => unified}/bulkWrite-updateOne-let.yml | 0 test/spec/crud/{ => unified}/bulkWrite.json | 0 test/spec/crud/{ => unified}/bulkWrite.yml | 0 test/spec/crud/{ => unified}/count-collation.json | 0 test/spec/crud/{ => unified}/count-collation.yml | 0 test/spec/crud/{ => unified}/count-empty.json | 0 test/spec/crud/{ => unified}/count-empty.yml | 0 test/spec/crud/{ => unified}/count.json | 0 test/spec/crud/{ => unified}/count.yml | 0 test/spec/crud/{ => unified}/countDocuments-comment.json | 0 test/spec/crud/{ => unified}/countDocuments-comment.yml | 0 .../crud/{ => unified}/db-aggregate-write-readPreference.json | 0 .../crud/{ => unified}/db-aggregate-write-readPreference.yml | 0 test/spec/crud/{ => unified}/db-aggregate.json | 0 test/spec/crud/{ => unified}/db-aggregate.yml | 0 test/spec/crud/{ => unified}/deleteMany-collation.json | 0 test/spec/crud/{ => unified}/deleteMany-collation.yml | 0 test/spec/crud/{ => unified}/deleteMany-comment.json | 0 test/spec/crud/{ => unified}/deleteMany-comment.yml | 0 test/spec/crud/{ => unified}/deleteMany-hint-clientError.json | 0 test/spec/crud/{ => unified}/deleteMany-hint-clientError.yml | 0 test/spec/crud/{ => unified}/deleteMany-hint-serverError.json | 0 test/spec/crud/{ => unified}/deleteMany-hint-serverError.yml | 0 test/spec/crud/{ => unified}/deleteMany-hint-unacknowledged.json | 0 test/spec/crud/{ => unified}/deleteMany-hint-unacknowledged.yml | 0 test/spec/crud/{ => unified}/deleteMany-hint.json | 0 test/spec/crud/{ => unified}/deleteMany-hint.yml | 0 test/spec/crud/{ => unified}/deleteMany-let.json | 0 test/spec/crud/{ => unified}/deleteMany-let.yml | 0 test/spec/crud/{ => unified}/deleteMany.json | 0 test/spec/crud/{ => unified}/deleteMany.yml | 0 test/spec/crud/{ => unified}/deleteOne-collation.json | 0 test/spec/crud/{ => unified}/deleteOne-collation.yml | 0 test/spec/crud/{ => unified}/deleteOne-comment.json | 0 test/spec/crud/{ => unified}/deleteOne-comment.yml | 0 test/spec/crud/{ => unified}/deleteOne-errorResponse.json | 0 test/spec/crud/{ => unified}/deleteOne-errorResponse.yml | 0 test/spec/crud/{ => unified}/deleteOne-hint-clientError.json | 0 test/spec/crud/{ => unified}/deleteOne-hint-clientError.yml | 0 test/spec/crud/{ => unified}/deleteOne-hint-serverError.json | 0 test/spec/crud/{ => unified}/deleteOne-hint-serverError.yml | 0 test/spec/crud/{ => unified}/deleteOne-hint-unacknowledged.json | 0 test/spec/crud/{ => unified}/deleteOne-hint-unacknowledged.yml | 0 test/spec/crud/{ => unified}/deleteOne-hint.json | 0 test/spec/crud/{ => unified}/deleteOne-hint.yml | 0 test/spec/crud/{ => unified}/deleteOne-let.json | 0 test/spec/crud/{ => unified}/deleteOne-let.yml | 0 test/spec/crud/{ => unified}/deleteOne.json | 0 test/spec/crud/{ => unified}/deleteOne.yml | 0 test/spec/crud/{ => unified}/distinct-collation.json | 0 test/spec/crud/{ => unified}/distinct-collation.yml | 0 test/spec/crud/{ => unified}/distinct-comment.json | 0 test/spec/crud/{ => unified}/distinct-comment.yml | 0 test/spec/crud/{ => unified}/distinct.json | 0 test/spec/crud/{ => unified}/distinct.yml | 0 test/spec/crud/{ => unified}/estimatedDocumentCount-comment.json | 0 test/spec/crud/{ => unified}/estimatedDocumentCount-comment.yml | 0 test/spec/crud/{ => unified}/estimatedDocumentCount.json | 0 test/spec/crud/{ => unified}/estimatedDocumentCount.yml | 0 test/spec/crud/{ => unified}/find-allowdiskuse-clientError.json | 0 test/spec/crud/{ => unified}/find-allowdiskuse-clientError.yml | 0 test/spec/crud/{ => unified}/find-allowdiskuse-serverError.json | 0 test/spec/crud/{ => unified}/find-allowdiskuse-serverError.yml | 0 test/spec/crud/{ => unified}/find-allowdiskuse.json | 0 test/spec/crud/{ => unified}/find-allowdiskuse.yml | 0 test/spec/crud/{ => unified}/find-collation.json | 0 test/spec/crud/{ => unified}/find-collation.yml | 0 test/spec/crud/{ => unified}/find-comment.json | 0 test/spec/crud/{ => unified}/find-comment.yml | 0 test/spec/crud/{ => unified}/find-let.json | 0 test/spec/crud/{ => unified}/find-let.yml | 0 test/spec/crud/{ => unified}/find.json | 0 test/spec/crud/{ => unified}/find.yml | 0 test/spec/crud/{ => unified}/findOneAndDelete-collation.json | 0 test/spec/crud/{ => unified}/findOneAndDelete-collation.yml | 0 test/spec/crud/{ => unified}/findOneAndDelete-comment.json | 0 test/spec/crud/{ => unified}/findOneAndDelete-comment.yml | 0 .../crud/{ => unified}/findOneAndDelete-hint-clientError.json | 0 .../crud/{ => unified}/findOneAndDelete-hint-clientError.yml | 0 .../crud/{ => unified}/findOneAndDelete-hint-serverError.json | 0 .../crud/{ => unified}/findOneAndDelete-hint-serverError.yml | 0 .../crud/{ => unified}/findOneAndDelete-hint-unacknowledged.json | 0 .../crud/{ => unified}/findOneAndDelete-hint-unacknowledged.yml | 0 test/spec/crud/{ => unified}/findOneAndDelete-hint.json | 0 test/spec/crud/{ => unified}/findOneAndDelete-hint.yml | 0 test/spec/crud/{ => unified}/findOneAndDelete-let.json | 0 test/spec/crud/{ => unified}/findOneAndDelete-let.yml | 0 test/spec/crud/{ => unified}/findOneAndDelete.json | 0 test/spec/crud/{ => unified}/findOneAndDelete.yml | 0 test/spec/crud/{ => unified}/findOneAndReplace-collation.json | 0 test/spec/crud/{ => unified}/findOneAndReplace-collation.yml | 0 test/spec/crud/{ => unified}/findOneAndReplace-comment.json | 0 test/spec/crud/{ => unified}/findOneAndReplace-comment.yml | 0 .../crud/{ => unified}/findOneAndReplace-dots_and_dollars.json | 0 .../crud/{ => unified}/findOneAndReplace-dots_and_dollars.yml | 0 .../crud/{ => unified}/findOneAndReplace-hint-clientError.json | 0 .../crud/{ => unified}/findOneAndReplace-hint-clientError.yml | 0 .../crud/{ => unified}/findOneAndReplace-hint-serverError.json | 0 .../crud/{ => unified}/findOneAndReplace-hint-serverError.yml | 0 .../{ => unified}/findOneAndReplace-hint-unacknowledged.json | 0 .../crud/{ => unified}/findOneAndReplace-hint-unacknowledged.yml | 0 test/spec/crud/{ => unified}/findOneAndReplace-hint.json | 0 test/spec/crud/{ => unified}/findOneAndReplace-hint.yml | 0 test/spec/crud/{ => unified}/findOneAndReplace-let.json | 0 test/spec/crud/{ => unified}/findOneAndReplace-let.yml | 0 test/spec/crud/{ => unified}/findOneAndReplace-upsert.json | 0 test/spec/crud/{ => unified}/findOneAndReplace-upsert.yml | 0 test/spec/crud/{ => unified}/findOneAndReplace.json | 0 test/spec/crud/{ => unified}/findOneAndReplace.yml | 0 test/spec/crud/{ => unified}/findOneAndUpdate-arrayFilters.json | 0 test/spec/crud/{ => unified}/findOneAndUpdate-arrayFilters.yml | 0 test/spec/crud/{ => unified}/findOneAndUpdate-collation.json | 0 test/spec/crud/{ => unified}/findOneAndUpdate-collation.yml | 0 test/spec/crud/{ => unified}/findOneAndUpdate-comment.json | 0 test/spec/crud/{ => unified}/findOneAndUpdate-comment.yml | 0 .../crud/{ => unified}/findOneAndUpdate-dots_and_dollars.json | 0 .../crud/{ => unified}/findOneAndUpdate-dots_and_dollars.yml | 0 test/spec/crud/{ => unified}/findOneAndUpdate-errorResponse.json | 0 test/spec/crud/{ => unified}/findOneAndUpdate-errorResponse.yml | 0 .../crud/{ => unified}/findOneAndUpdate-hint-clientError.json | 0 .../crud/{ => unified}/findOneAndUpdate-hint-clientError.yml | 0 .../crud/{ => unified}/findOneAndUpdate-hint-serverError.json | 0 .../crud/{ => unified}/findOneAndUpdate-hint-serverError.yml | 0 .../crud/{ => unified}/findOneAndUpdate-hint-unacknowledged.json | 0 .../crud/{ => unified}/findOneAndUpdate-hint-unacknowledged.yml | 0 test/spec/crud/{ => unified}/findOneAndUpdate-hint.json | 0 test/spec/crud/{ => unified}/findOneAndUpdate-hint.yml | 0 test/spec/crud/{ => unified}/findOneAndUpdate-let.json | 0 test/spec/crud/{ => unified}/findOneAndUpdate-let.yml | 0 test/spec/crud/{ => unified}/findOneAndUpdate.json | 0 test/spec/crud/{ => unified}/findOneAndUpdate.yml | 0 test/spec/crud/{ => unified}/insertMany-comment.json | 0 test/spec/crud/{ => unified}/insertMany-comment.yml | 0 test/spec/crud/{ => unified}/insertMany-dots_and_dollars.json | 0 test/spec/crud/{ => unified}/insertMany-dots_and_dollars.yml | 0 test/spec/crud/{ => unified}/insertMany.json | 0 test/spec/crud/{ => unified}/insertMany.yml | 0 test/spec/crud/{ => unified}/insertOne-comment.json | 0 test/spec/crud/{ => unified}/insertOne-comment.yml | 0 test/spec/crud/{ => unified}/insertOne-dots_and_dollars.json | 0 test/spec/crud/{ => unified}/insertOne-dots_and_dollars.yml | 0 test/spec/crud/{ => unified}/insertOne-errorResponse.json | 0 test/spec/crud/{ => unified}/insertOne-errorResponse.yml | 0 test/spec/crud/{ => unified}/insertOne.json | 0 test/spec/crud/{ => unified}/insertOne.yml | 0 test/spec/crud/{ => unified}/replaceOne-collation.json | 0 test/spec/crud/{ => unified}/replaceOne-collation.yml | 0 test/spec/crud/{ => unified}/replaceOne-comment.json | 0 test/spec/crud/{ => unified}/replaceOne-comment.yml | 0 test/spec/crud/{ => unified}/replaceOne-dots_and_dollars.json | 0 test/spec/crud/{ => unified}/replaceOne-dots_and_dollars.yml | 0 test/spec/crud/{ => unified}/replaceOne-hint-unacknowledged.json | 0 test/spec/crud/{ => unified}/replaceOne-hint-unacknowledged.yml | 0 test/spec/crud/{ => unified}/replaceOne-hint.json | 0 test/spec/crud/{ => unified}/replaceOne-hint.yml | 0 test/spec/crud/{ => unified}/replaceOne-let.json | 0 test/spec/crud/{ => unified}/replaceOne-let.yml | 0 test/spec/crud/{ => unified}/replaceOne-validation.json | 0 test/spec/crud/{ => unified}/replaceOne-validation.yml | 0 test/spec/crud/{ => unified}/replaceOne.json | 0 test/spec/crud/{ => unified}/replaceOne.yml | 0 test/spec/crud/{ => unified}/updateMany-arrayFilters.json | 0 test/spec/crud/{ => unified}/updateMany-arrayFilters.yml | 0 test/spec/crud/{ => unified}/updateMany-collation.json | 0 test/spec/crud/{ => unified}/updateMany-collation.yml | 0 test/spec/crud/{ => unified}/updateMany-comment.json | 0 test/spec/crud/{ => unified}/updateMany-comment.yml | 0 test/spec/crud/{ => unified}/updateMany-dots_and_dollars.json | 0 test/spec/crud/{ => unified}/updateMany-dots_and_dollars.yml | 0 test/spec/crud/{ => unified}/updateMany-hint-clientError.json | 0 test/spec/crud/{ => unified}/updateMany-hint-clientError.yml | 0 test/spec/crud/{ => unified}/updateMany-hint-serverError.json | 0 test/spec/crud/{ => unified}/updateMany-hint-serverError.yml | 0 test/spec/crud/{ => unified}/updateMany-hint-unacknowledged.json | 0 test/spec/crud/{ => unified}/updateMany-hint-unacknowledged.yml | 0 test/spec/crud/{ => unified}/updateMany-hint.json | 0 test/spec/crud/{ => unified}/updateMany-hint.yml | 0 test/spec/crud/{ => unified}/updateMany-let.json | 0 test/spec/crud/{ => unified}/updateMany-let.yml | 0 test/spec/crud/{ => unified}/updateMany-validation.json | 0 test/spec/crud/{ => unified}/updateMany-validation.yml | 0 test/spec/crud/{ => unified}/updateMany.json | 0 test/spec/crud/{ => unified}/updateMany.yml | 0 test/spec/crud/{ => unified}/updateOne-arrayFilters.json | 0 test/spec/crud/{ => unified}/updateOne-arrayFilters.yml | 0 test/spec/crud/{ => unified}/updateOne-collation.json | 0 test/spec/crud/{ => unified}/updateOne-collation.yml | 0 test/spec/crud/{ => unified}/updateOne-comment.json | 0 test/spec/crud/{ => unified}/updateOne-comment.yml | 0 test/spec/crud/{ => unified}/updateOne-dots_and_dollars.json | 0 test/spec/crud/{ => unified}/updateOne-dots_and_dollars.yml | 0 test/spec/crud/{ => unified}/updateOne-errorResponse.json | 0 test/spec/crud/{ => unified}/updateOne-errorResponse.yml | 0 test/spec/crud/{ => unified}/updateOne-hint-clientError.json | 0 test/spec/crud/{ => unified}/updateOne-hint-clientError.yml | 0 test/spec/crud/{ => unified}/updateOne-hint-serverError.json | 0 test/spec/crud/{ => unified}/updateOne-hint-serverError.yml | 0 test/spec/crud/{ => unified}/updateOne-hint-unacknowledged.json | 0 test/spec/crud/{ => unified}/updateOne-hint-unacknowledged.yml | 0 test/spec/crud/{ => unified}/updateOne-hint.json | 0 test/spec/crud/{ => unified}/updateOne-hint.yml | 0 test/spec/crud/{ => unified}/updateOne-let.json | 0 test/spec/crud/{ => unified}/updateOne-let.yml | 0 test/spec/crud/{ => unified}/updateOne-validation.json | 0 test/spec/crud/{ => unified}/updateOne-validation.yml | 0 test/spec/crud/{ => unified}/updateOne.json | 0 test/spec/crud/{ => unified}/updateOne.yml | 0 test/spec/crud/{ => unified}/updateWithPipelines.json | 0 test/spec/crud/{ => unified}/updateWithPipelines.yml | 0 test/tools/unified-spec-runner/match.ts | 1 - 279 files changed, 1 deletion(-) rename test/spec/crud/{ => unified}/aggregate-allowdiskuse.json (100%) rename test/spec/crud/{ => unified}/aggregate-allowdiskuse.yml (100%) rename test/spec/crud/{ => unified}/aggregate-collation.json (100%) rename test/spec/crud/{ => unified}/aggregate-collation.yml (100%) rename test/spec/crud/{ => unified}/aggregate-let.json (100%) rename test/spec/crud/{ => unified}/aggregate-let.yml (100%) rename test/spec/crud/{ => unified}/aggregate-merge-errorResponse.json (100%) rename test/spec/crud/{ => unified}/aggregate-merge-errorResponse.yml (100%) rename test/spec/crud/{ => unified}/aggregate-merge.json (100%) rename test/spec/crud/{ => unified}/aggregate-merge.yml (100%) rename test/spec/crud/{ => unified}/aggregate-out-readConcern.json (100%) rename test/spec/crud/{ => unified}/aggregate-out-readConcern.yml (100%) rename test/spec/crud/{ => unified}/aggregate-out.json (100%) rename test/spec/crud/{ => unified}/aggregate-out.yml (100%) rename test/spec/crud/{ => unified}/aggregate-write-readPreference.json (100%) rename test/spec/crud/{ => unified}/aggregate-write-readPreference.yml (100%) rename test/spec/crud/{ => unified}/aggregate.json (100%) rename test/spec/crud/{ => unified}/aggregate.yml (100%) rename test/spec/crud/{ => unified}/bulkWrite-arrayFilters-clientError.json (100%) rename test/spec/crud/{ => unified}/bulkWrite-arrayFilters-clientError.yml (100%) rename test/spec/crud/{ => unified}/bulkWrite-arrayFilters.json (100%) rename test/spec/crud/{ => unified}/bulkWrite-arrayFilters.yml (100%) rename test/spec/crud/{ => unified}/bulkWrite-collation.json (100%) rename test/spec/crud/{ => unified}/bulkWrite-collation.yml (100%) rename test/spec/crud/{ => unified}/bulkWrite-comment.json (100%) rename test/spec/crud/{ => unified}/bulkWrite-comment.yml (100%) rename test/spec/crud/{ => unified}/bulkWrite-delete-hint-clientError.json (100%) rename test/spec/crud/{ => unified}/bulkWrite-delete-hint-clientError.yml (100%) rename test/spec/crud/{ => unified}/bulkWrite-delete-hint-serverError.json (100%) rename test/spec/crud/{ => unified}/bulkWrite-delete-hint-serverError.yml (100%) rename test/spec/crud/{ => unified}/bulkWrite-delete-hint.json (100%) rename test/spec/crud/{ => unified}/bulkWrite-delete-hint.yml (100%) rename test/spec/crud/{ => unified}/bulkWrite-deleteMany-hint-unacknowledged.json (100%) rename test/spec/crud/{ => unified}/bulkWrite-deleteMany-hint-unacknowledged.yml (100%) rename test/spec/crud/{ => unified}/bulkWrite-deleteMany-let.json (100%) rename test/spec/crud/{ => unified}/bulkWrite-deleteMany-let.yml (100%) rename test/spec/crud/{ => unified}/bulkWrite-deleteOne-hint-unacknowledged.json (100%) rename test/spec/crud/{ => unified}/bulkWrite-deleteOne-hint-unacknowledged.yml (100%) rename test/spec/crud/{ => unified}/bulkWrite-deleteOne-let.json (100%) rename test/spec/crud/{ => unified}/bulkWrite-deleteOne-let.yml (100%) rename test/spec/crud/{ => unified}/bulkWrite-errorResponse.json (100%) rename test/spec/crud/{ => unified}/bulkWrite-errorResponse.yml (100%) rename test/spec/crud/{ => unified}/bulkWrite-insertOne-dots_and_dollars.json (100%) rename test/spec/crud/{ => unified}/bulkWrite-insertOne-dots_and_dollars.yml (100%) rename test/spec/crud/{ => unified}/bulkWrite-replaceOne-dots_and_dollars.json (100%) rename test/spec/crud/{ => unified}/bulkWrite-replaceOne-dots_and_dollars.yml (100%) rename test/spec/crud/{ => unified}/bulkWrite-replaceOne-hint-unacknowledged.json (100%) rename test/spec/crud/{ => unified}/bulkWrite-replaceOne-hint-unacknowledged.yml (100%) rename test/spec/crud/{ => unified}/bulkWrite-replaceOne-let.json (100%) rename test/spec/crud/{ => unified}/bulkWrite-replaceOne-let.yml (100%) rename test/spec/crud/{ => unified}/bulkWrite-update-hint-clientError.json (100%) rename test/spec/crud/{ => unified}/bulkWrite-update-hint-clientError.yml (100%) rename test/spec/crud/{ => unified}/bulkWrite-update-hint-serverError.json (100%) rename test/spec/crud/{ => unified}/bulkWrite-update-hint-serverError.yml (100%) rename test/spec/crud/{ => unified}/bulkWrite-update-hint.json (100%) rename test/spec/crud/{ => unified}/bulkWrite-update-hint.yml (100%) rename test/spec/crud/{ => unified}/bulkWrite-update-validation.json (100%) rename test/spec/crud/{ => unified}/bulkWrite-update-validation.yml (100%) rename test/spec/crud/{ => unified}/bulkWrite-updateMany-dots_and_dollars.json (100%) rename test/spec/crud/{ => unified}/bulkWrite-updateMany-dots_and_dollars.yml (100%) rename test/spec/crud/{ => unified}/bulkWrite-updateMany-hint-unacknowledged.json (100%) rename test/spec/crud/{ => unified}/bulkWrite-updateMany-hint-unacknowledged.yml (100%) rename test/spec/crud/{ => unified}/bulkWrite-updateMany-let.json (100%) rename test/spec/crud/{ => unified}/bulkWrite-updateMany-let.yml (100%) rename test/spec/crud/{ => unified}/bulkWrite-updateOne-dots_and_dollars.json (100%) rename test/spec/crud/{ => unified}/bulkWrite-updateOne-dots_and_dollars.yml (100%) rename test/spec/crud/{ => unified}/bulkWrite-updateOne-hint-unacknowledged.json (100%) rename test/spec/crud/{ => unified}/bulkWrite-updateOne-hint-unacknowledged.yml (100%) rename test/spec/crud/{ => unified}/bulkWrite-updateOne-let.json (100%) rename test/spec/crud/{ => unified}/bulkWrite-updateOne-let.yml (100%) rename test/spec/crud/{ => unified}/bulkWrite.json (100%) rename test/spec/crud/{ => unified}/bulkWrite.yml (100%) rename test/spec/crud/{ => unified}/count-collation.json (100%) rename test/spec/crud/{ => unified}/count-collation.yml (100%) rename test/spec/crud/{ => unified}/count-empty.json (100%) rename test/spec/crud/{ => unified}/count-empty.yml (100%) rename test/spec/crud/{ => unified}/count.json (100%) rename test/spec/crud/{ => unified}/count.yml (100%) rename test/spec/crud/{ => unified}/countDocuments-comment.json (100%) rename test/spec/crud/{ => unified}/countDocuments-comment.yml (100%) rename test/spec/crud/{ => unified}/db-aggregate-write-readPreference.json (100%) rename test/spec/crud/{ => unified}/db-aggregate-write-readPreference.yml (100%) rename test/spec/crud/{ => unified}/db-aggregate.json (100%) rename test/spec/crud/{ => unified}/db-aggregate.yml (100%) rename test/spec/crud/{ => unified}/deleteMany-collation.json (100%) rename test/spec/crud/{ => unified}/deleteMany-collation.yml (100%) rename test/spec/crud/{ => unified}/deleteMany-comment.json (100%) rename test/spec/crud/{ => unified}/deleteMany-comment.yml (100%) rename test/spec/crud/{ => unified}/deleteMany-hint-clientError.json (100%) rename test/spec/crud/{ => unified}/deleteMany-hint-clientError.yml (100%) rename test/spec/crud/{ => unified}/deleteMany-hint-serverError.json (100%) rename test/spec/crud/{ => unified}/deleteMany-hint-serverError.yml (100%) rename test/spec/crud/{ => unified}/deleteMany-hint-unacknowledged.json (100%) rename test/spec/crud/{ => unified}/deleteMany-hint-unacknowledged.yml (100%) rename test/spec/crud/{ => unified}/deleteMany-hint.json (100%) rename test/spec/crud/{ => unified}/deleteMany-hint.yml (100%) rename test/spec/crud/{ => unified}/deleteMany-let.json (100%) rename test/spec/crud/{ => unified}/deleteMany-let.yml (100%) rename test/spec/crud/{ => unified}/deleteMany.json (100%) rename test/spec/crud/{ => unified}/deleteMany.yml (100%) rename test/spec/crud/{ => unified}/deleteOne-collation.json (100%) rename test/spec/crud/{ => unified}/deleteOne-collation.yml (100%) rename test/spec/crud/{ => unified}/deleteOne-comment.json (100%) rename test/spec/crud/{ => unified}/deleteOne-comment.yml (100%) rename test/spec/crud/{ => unified}/deleteOne-errorResponse.json (100%) rename test/spec/crud/{ => unified}/deleteOne-errorResponse.yml (100%) rename test/spec/crud/{ => unified}/deleteOne-hint-clientError.json (100%) rename test/spec/crud/{ => unified}/deleteOne-hint-clientError.yml (100%) rename test/spec/crud/{ => unified}/deleteOne-hint-serverError.json (100%) rename test/spec/crud/{ => unified}/deleteOne-hint-serverError.yml (100%) rename test/spec/crud/{ => unified}/deleteOne-hint-unacknowledged.json (100%) rename test/spec/crud/{ => unified}/deleteOne-hint-unacknowledged.yml (100%) rename test/spec/crud/{ => unified}/deleteOne-hint.json (100%) rename test/spec/crud/{ => unified}/deleteOne-hint.yml (100%) rename test/spec/crud/{ => unified}/deleteOne-let.json (100%) rename test/spec/crud/{ => unified}/deleteOne-let.yml (100%) rename test/spec/crud/{ => unified}/deleteOne.json (100%) rename test/spec/crud/{ => unified}/deleteOne.yml (100%) rename test/spec/crud/{ => unified}/distinct-collation.json (100%) rename test/spec/crud/{ => unified}/distinct-collation.yml (100%) rename test/spec/crud/{ => unified}/distinct-comment.json (100%) rename test/spec/crud/{ => unified}/distinct-comment.yml (100%) rename test/spec/crud/{ => unified}/distinct.json (100%) rename test/spec/crud/{ => unified}/distinct.yml (100%) rename test/spec/crud/{ => unified}/estimatedDocumentCount-comment.json (100%) rename test/spec/crud/{ => unified}/estimatedDocumentCount-comment.yml (100%) rename test/spec/crud/{ => unified}/estimatedDocumentCount.json (100%) rename test/spec/crud/{ => unified}/estimatedDocumentCount.yml (100%) rename test/spec/crud/{ => unified}/find-allowdiskuse-clientError.json (100%) rename test/spec/crud/{ => unified}/find-allowdiskuse-clientError.yml (100%) rename test/spec/crud/{ => unified}/find-allowdiskuse-serverError.json (100%) rename test/spec/crud/{ => unified}/find-allowdiskuse-serverError.yml (100%) rename test/spec/crud/{ => unified}/find-allowdiskuse.json (100%) rename test/spec/crud/{ => unified}/find-allowdiskuse.yml (100%) rename test/spec/crud/{ => unified}/find-collation.json (100%) rename test/spec/crud/{ => unified}/find-collation.yml (100%) rename test/spec/crud/{ => unified}/find-comment.json (100%) rename test/spec/crud/{ => unified}/find-comment.yml (100%) rename test/spec/crud/{ => unified}/find-let.json (100%) rename test/spec/crud/{ => unified}/find-let.yml (100%) rename test/spec/crud/{ => unified}/find.json (100%) rename test/spec/crud/{ => unified}/find.yml (100%) rename test/spec/crud/{ => unified}/findOneAndDelete-collation.json (100%) rename test/spec/crud/{ => unified}/findOneAndDelete-collation.yml (100%) rename test/spec/crud/{ => unified}/findOneAndDelete-comment.json (100%) rename test/spec/crud/{ => unified}/findOneAndDelete-comment.yml (100%) rename test/spec/crud/{ => unified}/findOneAndDelete-hint-clientError.json (100%) rename test/spec/crud/{ => unified}/findOneAndDelete-hint-clientError.yml (100%) rename test/spec/crud/{ => unified}/findOneAndDelete-hint-serverError.json (100%) rename test/spec/crud/{ => unified}/findOneAndDelete-hint-serverError.yml (100%) rename test/spec/crud/{ => unified}/findOneAndDelete-hint-unacknowledged.json (100%) rename test/spec/crud/{ => unified}/findOneAndDelete-hint-unacknowledged.yml (100%) rename test/spec/crud/{ => unified}/findOneAndDelete-hint.json (100%) rename test/spec/crud/{ => unified}/findOneAndDelete-hint.yml (100%) rename test/spec/crud/{ => unified}/findOneAndDelete-let.json (100%) rename test/spec/crud/{ => unified}/findOneAndDelete-let.yml (100%) rename test/spec/crud/{ => unified}/findOneAndDelete.json (100%) rename test/spec/crud/{ => unified}/findOneAndDelete.yml (100%) rename test/spec/crud/{ => unified}/findOneAndReplace-collation.json (100%) rename test/spec/crud/{ => unified}/findOneAndReplace-collation.yml (100%) rename test/spec/crud/{ => unified}/findOneAndReplace-comment.json (100%) rename test/spec/crud/{ => unified}/findOneAndReplace-comment.yml (100%) rename test/spec/crud/{ => unified}/findOneAndReplace-dots_and_dollars.json (100%) rename test/spec/crud/{ => unified}/findOneAndReplace-dots_and_dollars.yml (100%) rename test/spec/crud/{ => unified}/findOneAndReplace-hint-clientError.json (100%) rename test/spec/crud/{ => unified}/findOneAndReplace-hint-clientError.yml (100%) rename test/spec/crud/{ => unified}/findOneAndReplace-hint-serverError.json (100%) rename test/spec/crud/{ => unified}/findOneAndReplace-hint-serverError.yml (100%) rename test/spec/crud/{ => unified}/findOneAndReplace-hint-unacknowledged.json (100%) rename test/spec/crud/{ => unified}/findOneAndReplace-hint-unacknowledged.yml (100%) rename test/spec/crud/{ => unified}/findOneAndReplace-hint.json (100%) rename test/spec/crud/{ => unified}/findOneAndReplace-hint.yml (100%) rename test/spec/crud/{ => unified}/findOneAndReplace-let.json (100%) rename test/spec/crud/{ => unified}/findOneAndReplace-let.yml (100%) rename test/spec/crud/{ => unified}/findOneAndReplace-upsert.json (100%) rename test/spec/crud/{ => unified}/findOneAndReplace-upsert.yml (100%) rename test/spec/crud/{ => unified}/findOneAndReplace.json (100%) rename test/spec/crud/{ => unified}/findOneAndReplace.yml (100%) rename test/spec/crud/{ => unified}/findOneAndUpdate-arrayFilters.json (100%) rename test/spec/crud/{ => unified}/findOneAndUpdate-arrayFilters.yml (100%) rename test/spec/crud/{ => unified}/findOneAndUpdate-collation.json (100%) rename test/spec/crud/{ => unified}/findOneAndUpdate-collation.yml (100%) rename test/spec/crud/{ => unified}/findOneAndUpdate-comment.json (100%) rename test/spec/crud/{ => unified}/findOneAndUpdate-comment.yml (100%) rename test/spec/crud/{ => unified}/findOneAndUpdate-dots_and_dollars.json (100%) rename test/spec/crud/{ => unified}/findOneAndUpdate-dots_and_dollars.yml (100%) rename test/spec/crud/{ => unified}/findOneAndUpdate-errorResponse.json (100%) rename test/spec/crud/{ => unified}/findOneAndUpdate-errorResponse.yml (100%) rename test/spec/crud/{ => unified}/findOneAndUpdate-hint-clientError.json (100%) rename test/spec/crud/{ => unified}/findOneAndUpdate-hint-clientError.yml (100%) rename test/spec/crud/{ => unified}/findOneAndUpdate-hint-serverError.json (100%) rename test/spec/crud/{ => unified}/findOneAndUpdate-hint-serverError.yml (100%) rename test/spec/crud/{ => unified}/findOneAndUpdate-hint-unacknowledged.json (100%) rename test/spec/crud/{ => unified}/findOneAndUpdate-hint-unacknowledged.yml (100%) rename test/spec/crud/{ => unified}/findOneAndUpdate-hint.json (100%) rename test/spec/crud/{ => unified}/findOneAndUpdate-hint.yml (100%) rename test/spec/crud/{ => unified}/findOneAndUpdate-let.json (100%) rename test/spec/crud/{ => unified}/findOneAndUpdate-let.yml (100%) rename test/spec/crud/{ => unified}/findOneAndUpdate.json (100%) rename test/spec/crud/{ => unified}/findOneAndUpdate.yml (100%) rename test/spec/crud/{ => unified}/insertMany-comment.json (100%) rename test/spec/crud/{ => unified}/insertMany-comment.yml (100%) rename test/spec/crud/{ => unified}/insertMany-dots_and_dollars.json (100%) rename test/spec/crud/{ => unified}/insertMany-dots_and_dollars.yml (100%) rename test/spec/crud/{ => unified}/insertMany.json (100%) rename test/spec/crud/{ => unified}/insertMany.yml (100%) rename test/spec/crud/{ => unified}/insertOne-comment.json (100%) rename test/spec/crud/{ => unified}/insertOne-comment.yml (100%) rename test/spec/crud/{ => unified}/insertOne-dots_and_dollars.json (100%) rename test/spec/crud/{ => unified}/insertOne-dots_and_dollars.yml (100%) rename test/spec/crud/{ => unified}/insertOne-errorResponse.json (100%) rename test/spec/crud/{ => unified}/insertOne-errorResponse.yml (100%) rename test/spec/crud/{ => unified}/insertOne.json (100%) rename test/spec/crud/{ => unified}/insertOne.yml (100%) rename test/spec/crud/{ => unified}/replaceOne-collation.json (100%) rename test/spec/crud/{ => unified}/replaceOne-collation.yml (100%) rename test/spec/crud/{ => unified}/replaceOne-comment.json (100%) rename test/spec/crud/{ => unified}/replaceOne-comment.yml (100%) rename test/spec/crud/{ => unified}/replaceOne-dots_and_dollars.json (100%) rename test/spec/crud/{ => unified}/replaceOne-dots_and_dollars.yml (100%) rename test/spec/crud/{ => unified}/replaceOne-hint-unacknowledged.json (100%) rename test/spec/crud/{ => unified}/replaceOne-hint-unacknowledged.yml (100%) rename test/spec/crud/{ => unified}/replaceOne-hint.json (100%) rename test/spec/crud/{ => unified}/replaceOne-hint.yml (100%) rename test/spec/crud/{ => unified}/replaceOne-let.json (100%) rename test/spec/crud/{ => unified}/replaceOne-let.yml (100%) rename test/spec/crud/{ => unified}/replaceOne-validation.json (100%) rename test/spec/crud/{ => unified}/replaceOne-validation.yml (100%) rename test/spec/crud/{ => unified}/replaceOne.json (100%) rename test/spec/crud/{ => unified}/replaceOne.yml (100%) rename test/spec/crud/{ => unified}/updateMany-arrayFilters.json (100%) rename test/spec/crud/{ => unified}/updateMany-arrayFilters.yml (100%) rename test/spec/crud/{ => unified}/updateMany-collation.json (100%) rename test/spec/crud/{ => unified}/updateMany-collation.yml (100%) rename test/spec/crud/{ => unified}/updateMany-comment.json (100%) rename test/spec/crud/{ => unified}/updateMany-comment.yml (100%) rename test/spec/crud/{ => unified}/updateMany-dots_and_dollars.json (100%) rename test/spec/crud/{ => unified}/updateMany-dots_and_dollars.yml (100%) rename test/spec/crud/{ => unified}/updateMany-hint-clientError.json (100%) rename test/spec/crud/{ => unified}/updateMany-hint-clientError.yml (100%) rename test/spec/crud/{ => unified}/updateMany-hint-serverError.json (100%) rename test/spec/crud/{ => unified}/updateMany-hint-serverError.yml (100%) rename test/spec/crud/{ => unified}/updateMany-hint-unacknowledged.json (100%) rename test/spec/crud/{ => unified}/updateMany-hint-unacknowledged.yml (100%) rename test/spec/crud/{ => unified}/updateMany-hint.json (100%) rename test/spec/crud/{ => unified}/updateMany-hint.yml (100%) rename test/spec/crud/{ => unified}/updateMany-let.json (100%) rename test/spec/crud/{ => unified}/updateMany-let.yml (100%) rename test/spec/crud/{ => unified}/updateMany-validation.json (100%) rename test/spec/crud/{ => unified}/updateMany-validation.yml (100%) rename test/spec/crud/{ => unified}/updateMany.json (100%) rename test/spec/crud/{ => unified}/updateMany.yml (100%) rename test/spec/crud/{ => unified}/updateOne-arrayFilters.json (100%) rename test/spec/crud/{ => unified}/updateOne-arrayFilters.yml (100%) rename test/spec/crud/{ => unified}/updateOne-collation.json (100%) rename test/spec/crud/{ => unified}/updateOne-collation.yml (100%) rename test/spec/crud/{ => unified}/updateOne-comment.json (100%) rename test/spec/crud/{ => unified}/updateOne-comment.yml (100%) rename test/spec/crud/{ => unified}/updateOne-dots_and_dollars.json (100%) rename test/spec/crud/{ => unified}/updateOne-dots_and_dollars.yml (100%) rename test/spec/crud/{ => unified}/updateOne-errorResponse.json (100%) rename test/spec/crud/{ => unified}/updateOne-errorResponse.yml (100%) rename test/spec/crud/{ => unified}/updateOne-hint-clientError.json (100%) rename test/spec/crud/{ => unified}/updateOne-hint-clientError.yml (100%) rename test/spec/crud/{ => unified}/updateOne-hint-serverError.json (100%) rename test/spec/crud/{ => unified}/updateOne-hint-serverError.yml (100%) rename test/spec/crud/{ => unified}/updateOne-hint-unacknowledged.json (100%) rename test/spec/crud/{ => unified}/updateOne-hint-unacknowledged.yml (100%) rename test/spec/crud/{ => unified}/updateOne-hint.json (100%) rename test/spec/crud/{ => unified}/updateOne-hint.yml (100%) rename test/spec/crud/{ => unified}/updateOne-let.json (100%) rename test/spec/crud/{ => unified}/updateOne-let.yml (100%) rename test/spec/crud/{ => unified}/updateOne-validation.json (100%) rename test/spec/crud/{ => unified}/updateOne-validation.yml (100%) rename test/spec/crud/{ => unified}/updateOne.json (100%) rename test/spec/crud/{ => unified}/updateOne.yml (100%) rename test/spec/crud/{ => unified}/updateWithPipelines.json (100%) rename test/spec/crud/{ => unified}/updateWithPipelines.yml (100%) diff --git a/test/spec/crud/aggregate-allowdiskuse.json b/test/spec/crud/unified/aggregate-allowdiskuse.json similarity index 100% rename from test/spec/crud/aggregate-allowdiskuse.json rename to test/spec/crud/unified/aggregate-allowdiskuse.json diff --git a/test/spec/crud/aggregate-allowdiskuse.yml b/test/spec/crud/unified/aggregate-allowdiskuse.yml similarity index 100% rename from test/spec/crud/aggregate-allowdiskuse.yml rename to test/spec/crud/unified/aggregate-allowdiskuse.yml diff --git a/test/spec/crud/aggregate-collation.json b/test/spec/crud/unified/aggregate-collation.json similarity index 100% rename from test/spec/crud/aggregate-collation.json rename to test/spec/crud/unified/aggregate-collation.json diff --git a/test/spec/crud/aggregate-collation.yml b/test/spec/crud/unified/aggregate-collation.yml similarity index 100% rename from test/spec/crud/aggregate-collation.yml rename to test/spec/crud/unified/aggregate-collation.yml diff --git a/test/spec/crud/aggregate-let.json b/test/spec/crud/unified/aggregate-let.json similarity index 100% rename from test/spec/crud/aggregate-let.json rename to test/spec/crud/unified/aggregate-let.json diff --git a/test/spec/crud/aggregate-let.yml b/test/spec/crud/unified/aggregate-let.yml similarity index 100% rename from test/spec/crud/aggregate-let.yml rename to test/spec/crud/unified/aggregate-let.yml diff --git a/test/spec/crud/aggregate-merge-errorResponse.json b/test/spec/crud/unified/aggregate-merge-errorResponse.json similarity index 100% rename from test/spec/crud/aggregate-merge-errorResponse.json rename to test/spec/crud/unified/aggregate-merge-errorResponse.json diff --git a/test/spec/crud/aggregate-merge-errorResponse.yml b/test/spec/crud/unified/aggregate-merge-errorResponse.yml similarity index 100% rename from test/spec/crud/aggregate-merge-errorResponse.yml rename to test/spec/crud/unified/aggregate-merge-errorResponse.yml diff --git a/test/spec/crud/aggregate-merge.json b/test/spec/crud/unified/aggregate-merge.json similarity index 100% rename from test/spec/crud/aggregate-merge.json rename to test/spec/crud/unified/aggregate-merge.json diff --git a/test/spec/crud/aggregate-merge.yml b/test/spec/crud/unified/aggregate-merge.yml similarity index 100% rename from test/spec/crud/aggregate-merge.yml rename to test/spec/crud/unified/aggregate-merge.yml diff --git a/test/spec/crud/aggregate-out-readConcern.json b/test/spec/crud/unified/aggregate-out-readConcern.json similarity index 100% rename from test/spec/crud/aggregate-out-readConcern.json rename to test/spec/crud/unified/aggregate-out-readConcern.json diff --git a/test/spec/crud/aggregate-out-readConcern.yml b/test/spec/crud/unified/aggregate-out-readConcern.yml similarity index 100% rename from test/spec/crud/aggregate-out-readConcern.yml rename to test/spec/crud/unified/aggregate-out-readConcern.yml diff --git a/test/spec/crud/aggregate-out.json b/test/spec/crud/unified/aggregate-out.json similarity index 100% rename from test/spec/crud/aggregate-out.json rename to test/spec/crud/unified/aggregate-out.json diff --git a/test/spec/crud/aggregate-out.yml b/test/spec/crud/unified/aggregate-out.yml similarity index 100% rename from test/spec/crud/aggregate-out.yml rename to test/spec/crud/unified/aggregate-out.yml diff --git a/test/spec/crud/aggregate-write-readPreference.json b/test/spec/crud/unified/aggregate-write-readPreference.json similarity index 100% rename from test/spec/crud/aggregate-write-readPreference.json rename to test/spec/crud/unified/aggregate-write-readPreference.json diff --git a/test/spec/crud/aggregate-write-readPreference.yml b/test/spec/crud/unified/aggregate-write-readPreference.yml similarity index 100% rename from test/spec/crud/aggregate-write-readPreference.yml rename to test/spec/crud/unified/aggregate-write-readPreference.yml diff --git a/test/spec/crud/aggregate.json b/test/spec/crud/unified/aggregate.json similarity index 100% rename from test/spec/crud/aggregate.json rename to test/spec/crud/unified/aggregate.json diff --git a/test/spec/crud/aggregate.yml b/test/spec/crud/unified/aggregate.yml similarity index 100% rename from test/spec/crud/aggregate.yml rename to test/spec/crud/unified/aggregate.yml diff --git a/test/spec/crud/bulkWrite-arrayFilters-clientError.json b/test/spec/crud/unified/bulkWrite-arrayFilters-clientError.json similarity index 100% rename from test/spec/crud/bulkWrite-arrayFilters-clientError.json rename to test/spec/crud/unified/bulkWrite-arrayFilters-clientError.json diff --git a/test/spec/crud/bulkWrite-arrayFilters-clientError.yml b/test/spec/crud/unified/bulkWrite-arrayFilters-clientError.yml similarity index 100% rename from test/spec/crud/bulkWrite-arrayFilters-clientError.yml rename to test/spec/crud/unified/bulkWrite-arrayFilters-clientError.yml diff --git a/test/spec/crud/bulkWrite-arrayFilters.json b/test/spec/crud/unified/bulkWrite-arrayFilters.json similarity index 100% rename from test/spec/crud/bulkWrite-arrayFilters.json rename to test/spec/crud/unified/bulkWrite-arrayFilters.json diff --git a/test/spec/crud/bulkWrite-arrayFilters.yml b/test/spec/crud/unified/bulkWrite-arrayFilters.yml similarity index 100% rename from test/spec/crud/bulkWrite-arrayFilters.yml rename to test/spec/crud/unified/bulkWrite-arrayFilters.yml diff --git a/test/spec/crud/bulkWrite-collation.json b/test/spec/crud/unified/bulkWrite-collation.json similarity index 100% rename from test/spec/crud/bulkWrite-collation.json rename to test/spec/crud/unified/bulkWrite-collation.json diff --git a/test/spec/crud/bulkWrite-collation.yml b/test/spec/crud/unified/bulkWrite-collation.yml similarity index 100% rename from test/spec/crud/bulkWrite-collation.yml rename to test/spec/crud/unified/bulkWrite-collation.yml diff --git a/test/spec/crud/bulkWrite-comment.json b/test/spec/crud/unified/bulkWrite-comment.json similarity index 100% rename from test/spec/crud/bulkWrite-comment.json rename to test/spec/crud/unified/bulkWrite-comment.json diff --git a/test/spec/crud/bulkWrite-comment.yml b/test/spec/crud/unified/bulkWrite-comment.yml similarity index 100% rename from test/spec/crud/bulkWrite-comment.yml rename to test/spec/crud/unified/bulkWrite-comment.yml diff --git a/test/spec/crud/bulkWrite-delete-hint-clientError.json b/test/spec/crud/unified/bulkWrite-delete-hint-clientError.json similarity index 100% rename from test/spec/crud/bulkWrite-delete-hint-clientError.json rename to test/spec/crud/unified/bulkWrite-delete-hint-clientError.json diff --git a/test/spec/crud/bulkWrite-delete-hint-clientError.yml b/test/spec/crud/unified/bulkWrite-delete-hint-clientError.yml similarity index 100% rename from test/spec/crud/bulkWrite-delete-hint-clientError.yml rename to test/spec/crud/unified/bulkWrite-delete-hint-clientError.yml diff --git a/test/spec/crud/bulkWrite-delete-hint-serverError.json b/test/spec/crud/unified/bulkWrite-delete-hint-serverError.json similarity index 100% rename from test/spec/crud/bulkWrite-delete-hint-serverError.json rename to test/spec/crud/unified/bulkWrite-delete-hint-serverError.json diff --git a/test/spec/crud/bulkWrite-delete-hint-serverError.yml b/test/spec/crud/unified/bulkWrite-delete-hint-serverError.yml similarity index 100% rename from test/spec/crud/bulkWrite-delete-hint-serverError.yml rename to test/spec/crud/unified/bulkWrite-delete-hint-serverError.yml diff --git a/test/spec/crud/bulkWrite-delete-hint.json b/test/spec/crud/unified/bulkWrite-delete-hint.json similarity index 100% rename from test/spec/crud/bulkWrite-delete-hint.json rename to test/spec/crud/unified/bulkWrite-delete-hint.json diff --git a/test/spec/crud/bulkWrite-delete-hint.yml b/test/spec/crud/unified/bulkWrite-delete-hint.yml similarity index 100% rename from test/spec/crud/bulkWrite-delete-hint.yml rename to test/spec/crud/unified/bulkWrite-delete-hint.yml diff --git a/test/spec/crud/bulkWrite-deleteMany-hint-unacknowledged.json b/test/spec/crud/unified/bulkWrite-deleteMany-hint-unacknowledged.json similarity index 100% rename from test/spec/crud/bulkWrite-deleteMany-hint-unacknowledged.json rename to test/spec/crud/unified/bulkWrite-deleteMany-hint-unacknowledged.json diff --git a/test/spec/crud/bulkWrite-deleteMany-hint-unacknowledged.yml b/test/spec/crud/unified/bulkWrite-deleteMany-hint-unacknowledged.yml similarity index 100% rename from test/spec/crud/bulkWrite-deleteMany-hint-unacknowledged.yml rename to test/spec/crud/unified/bulkWrite-deleteMany-hint-unacknowledged.yml diff --git a/test/spec/crud/bulkWrite-deleteMany-let.json b/test/spec/crud/unified/bulkWrite-deleteMany-let.json similarity index 100% rename from test/spec/crud/bulkWrite-deleteMany-let.json rename to test/spec/crud/unified/bulkWrite-deleteMany-let.json diff --git a/test/spec/crud/bulkWrite-deleteMany-let.yml b/test/spec/crud/unified/bulkWrite-deleteMany-let.yml similarity index 100% rename from test/spec/crud/bulkWrite-deleteMany-let.yml rename to test/spec/crud/unified/bulkWrite-deleteMany-let.yml diff --git a/test/spec/crud/bulkWrite-deleteOne-hint-unacknowledged.json b/test/spec/crud/unified/bulkWrite-deleteOne-hint-unacknowledged.json similarity index 100% rename from test/spec/crud/bulkWrite-deleteOne-hint-unacknowledged.json rename to test/spec/crud/unified/bulkWrite-deleteOne-hint-unacknowledged.json diff --git a/test/spec/crud/bulkWrite-deleteOne-hint-unacknowledged.yml b/test/spec/crud/unified/bulkWrite-deleteOne-hint-unacknowledged.yml similarity index 100% rename from test/spec/crud/bulkWrite-deleteOne-hint-unacknowledged.yml rename to test/spec/crud/unified/bulkWrite-deleteOne-hint-unacknowledged.yml diff --git a/test/spec/crud/bulkWrite-deleteOne-let.json b/test/spec/crud/unified/bulkWrite-deleteOne-let.json similarity index 100% rename from test/spec/crud/bulkWrite-deleteOne-let.json rename to test/spec/crud/unified/bulkWrite-deleteOne-let.json diff --git a/test/spec/crud/bulkWrite-deleteOne-let.yml b/test/spec/crud/unified/bulkWrite-deleteOne-let.yml similarity index 100% rename from test/spec/crud/bulkWrite-deleteOne-let.yml rename to test/spec/crud/unified/bulkWrite-deleteOne-let.yml diff --git a/test/spec/crud/bulkWrite-errorResponse.json b/test/spec/crud/unified/bulkWrite-errorResponse.json similarity index 100% rename from test/spec/crud/bulkWrite-errorResponse.json rename to test/spec/crud/unified/bulkWrite-errorResponse.json diff --git a/test/spec/crud/bulkWrite-errorResponse.yml b/test/spec/crud/unified/bulkWrite-errorResponse.yml similarity index 100% rename from test/spec/crud/bulkWrite-errorResponse.yml rename to test/spec/crud/unified/bulkWrite-errorResponse.yml diff --git a/test/spec/crud/bulkWrite-insertOne-dots_and_dollars.json b/test/spec/crud/unified/bulkWrite-insertOne-dots_and_dollars.json similarity index 100% rename from test/spec/crud/bulkWrite-insertOne-dots_and_dollars.json rename to test/spec/crud/unified/bulkWrite-insertOne-dots_and_dollars.json diff --git a/test/spec/crud/bulkWrite-insertOne-dots_and_dollars.yml b/test/spec/crud/unified/bulkWrite-insertOne-dots_and_dollars.yml similarity index 100% rename from test/spec/crud/bulkWrite-insertOne-dots_and_dollars.yml rename to test/spec/crud/unified/bulkWrite-insertOne-dots_and_dollars.yml diff --git a/test/spec/crud/bulkWrite-replaceOne-dots_and_dollars.json b/test/spec/crud/unified/bulkWrite-replaceOne-dots_and_dollars.json similarity index 100% rename from test/spec/crud/bulkWrite-replaceOne-dots_and_dollars.json rename to test/spec/crud/unified/bulkWrite-replaceOne-dots_and_dollars.json diff --git a/test/spec/crud/bulkWrite-replaceOne-dots_and_dollars.yml b/test/spec/crud/unified/bulkWrite-replaceOne-dots_and_dollars.yml similarity index 100% rename from test/spec/crud/bulkWrite-replaceOne-dots_and_dollars.yml rename to test/spec/crud/unified/bulkWrite-replaceOne-dots_and_dollars.yml diff --git a/test/spec/crud/bulkWrite-replaceOne-hint-unacknowledged.json b/test/spec/crud/unified/bulkWrite-replaceOne-hint-unacknowledged.json similarity index 100% rename from test/spec/crud/bulkWrite-replaceOne-hint-unacknowledged.json rename to test/spec/crud/unified/bulkWrite-replaceOne-hint-unacknowledged.json diff --git a/test/spec/crud/bulkWrite-replaceOne-hint-unacknowledged.yml b/test/spec/crud/unified/bulkWrite-replaceOne-hint-unacknowledged.yml similarity index 100% rename from test/spec/crud/bulkWrite-replaceOne-hint-unacknowledged.yml rename to test/spec/crud/unified/bulkWrite-replaceOne-hint-unacknowledged.yml diff --git a/test/spec/crud/bulkWrite-replaceOne-let.json b/test/spec/crud/unified/bulkWrite-replaceOne-let.json similarity index 100% rename from test/spec/crud/bulkWrite-replaceOne-let.json rename to test/spec/crud/unified/bulkWrite-replaceOne-let.json diff --git a/test/spec/crud/bulkWrite-replaceOne-let.yml b/test/spec/crud/unified/bulkWrite-replaceOne-let.yml similarity index 100% rename from test/spec/crud/bulkWrite-replaceOne-let.yml rename to test/spec/crud/unified/bulkWrite-replaceOne-let.yml diff --git a/test/spec/crud/bulkWrite-update-hint-clientError.json b/test/spec/crud/unified/bulkWrite-update-hint-clientError.json similarity index 100% rename from test/spec/crud/bulkWrite-update-hint-clientError.json rename to test/spec/crud/unified/bulkWrite-update-hint-clientError.json diff --git a/test/spec/crud/bulkWrite-update-hint-clientError.yml b/test/spec/crud/unified/bulkWrite-update-hint-clientError.yml similarity index 100% rename from test/spec/crud/bulkWrite-update-hint-clientError.yml rename to test/spec/crud/unified/bulkWrite-update-hint-clientError.yml diff --git a/test/spec/crud/bulkWrite-update-hint-serverError.json b/test/spec/crud/unified/bulkWrite-update-hint-serverError.json similarity index 100% rename from test/spec/crud/bulkWrite-update-hint-serverError.json rename to test/spec/crud/unified/bulkWrite-update-hint-serverError.json diff --git a/test/spec/crud/bulkWrite-update-hint-serverError.yml b/test/spec/crud/unified/bulkWrite-update-hint-serverError.yml similarity index 100% rename from test/spec/crud/bulkWrite-update-hint-serverError.yml rename to test/spec/crud/unified/bulkWrite-update-hint-serverError.yml diff --git a/test/spec/crud/bulkWrite-update-hint.json b/test/spec/crud/unified/bulkWrite-update-hint.json similarity index 100% rename from test/spec/crud/bulkWrite-update-hint.json rename to test/spec/crud/unified/bulkWrite-update-hint.json diff --git a/test/spec/crud/bulkWrite-update-hint.yml b/test/spec/crud/unified/bulkWrite-update-hint.yml similarity index 100% rename from test/spec/crud/bulkWrite-update-hint.yml rename to test/spec/crud/unified/bulkWrite-update-hint.yml diff --git a/test/spec/crud/bulkWrite-update-validation.json b/test/spec/crud/unified/bulkWrite-update-validation.json similarity index 100% rename from test/spec/crud/bulkWrite-update-validation.json rename to test/spec/crud/unified/bulkWrite-update-validation.json diff --git a/test/spec/crud/bulkWrite-update-validation.yml b/test/spec/crud/unified/bulkWrite-update-validation.yml similarity index 100% rename from test/spec/crud/bulkWrite-update-validation.yml rename to test/spec/crud/unified/bulkWrite-update-validation.yml diff --git a/test/spec/crud/bulkWrite-updateMany-dots_and_dollars.json b/test/spec/crud/unified/bulkWrite-updateMany-dots_and_dollars.json similarity index 100% rename from test/spec/crud/bulkWrite-updateMany-dots_and_dollars.json rename to test/spec/crud/unified/bulkWrite-updateMany-dots_and_dollars.json diff --git a/test/spec/crud/bulkWrite-updateMany-dots_and_dollars.yml b/test/spec/crud/unified/bulkWrite-updateMany-dots_and_dollars.yml similarity index 100% rename from test/spec/crud/bulkWrite-updateMany-dots_and_dollars.yml rename to test/spec/crud/unified/bulkWrite-updateMany-dots_and_dollars.yml diff --git a/test/spec/crud/bulkWrite-updateMany-hint-unacknowledged.json b/test/spec/crud/unified/bulkWrite-updateMany-hint-unacknowledged.json similarity index 100% rename from test/spec/crud/bulkWrite-updateMany-hint-unacknowledged.json rename to test/spec/crud/unified/bulkWrite-updateMany-hint-unacknowledged.json diff --git a/test/spec/crud/bulkWrite-updateMany-hint-unacknowledged.yml b/test/spec/crud/unified/bulkWrite-updateMany-hint-unacknowledged.yml similarity index 100% rename from test/spec/crud/bulkWrite-updateMany-hint-unacknowledged.yml rename to test/spec/crud/unified/bulkWrite-updateMany-hint-unacknowledged.yml diff --git a/test/spec/crud/bulkWrite-updateMany-let.json b/test/spec/crud/unified/bulkWrite-updateMany-let.json similarity index 100% rename from test/spec/crud/bulkWrite-updateMany-let.json rename to test/spec/crud/unified/bulkWrite-updateMany-let.json diff --git a/test/spec/crud/bulkWrite-updateMany-let.yml b/test/spec/crud/unified/bulkWrite-updateMany-let.yml similarity index 100% rename from test/spec/crud/bulkWrite-updateMany-let.yml rename to test/spec/crud/unified/bulkWrite-updateMany-let.yml diff --git a/test/spec/crud/bulkWrite-updateOne-dots_and_dollars.json b/test/spec/crud/unified/bulkWrite-updateOne-dots_and_dollars.json similarity index 100% rename from test/spec/crud/bulkWrite-updateOne-dots_and_dollars.json rename to test/spec/crud/unified/bulkWrite-updateOne-dots_and_dollars.json diff --git a/test/spec/crud/bulkWrite-updateOne-dots_and_dollars.yml b/test/spec/crud/unified/bulkWrite-updateOne-dots_and_dollars.yml similarity index 100% rename from test/spec/crud/bulkWrite-updateOne-dots_and_dollars.yml rename to test/spec/crud/unified/bulkWrite-updateOne-dots_and_dollars.yml diff --git a/test/spec/crud/bulkWrite-updateOne-hint-unacknowledged.json b/test/spec/crud/unified/bulkWrite-updateOne-hint-unacknowledged.json similarity index 100% rename from test/spec/crud/bulkWrite-updateOne-hint-unacknowledged.json rename to test/spec/crud/unified/bulkWrite-updateOne-hint-unacknowledged.json diff --git a/test/spec/crud/bulkWrite-updateOne-hint-unacknowledged.yml b/test/spec/crud/unified/bulkWrite-updateOne-hint-unacknowledged.yml similarity index 100% rename from test/spec/crud/bulkWrite-updateOne-hint-unacknowledged.yml rename to test/spec/crud/unified/bulkWrite-updateOne-hint-unacknowledged.yml diff --git a/test/spec/crud/bulkWrite-updateOne-let.json b/test/spec/crud/unified/bulkWrite-updateOne-let.json similarity index 100% rename from test/spec/crud/bulkWrite-updateOne-let.json rename to test/spec/crud/unified/bulkWrite-updateOne-let.json diff --git a/test/spec/crud/bulkWrite-updateOne-let.yml b/test/spec/crud/unified/bulkWrite-updateOne-let.yml similarity index 100% rename from test/spec/crud/bulkWrite-updateOne-let.yml rename to test/spec/crud/unified/bulkWrite-updateOne-let.yml diff --git a/test/spec/crud/bulkWrite.json b/test/spec/crud/unified/bulkWrite.json similarity index 100% rename from test/spec/crud/bulkWrite.json rename to test/spec/crud/unified/bulkWrite.json diff --git a/test/spec/crud/bulkWrite.yml b/test/spec/crud/unified/bulkWrite.yml similarity index 100% rename from test/spec/crud/bulkWrite.yml rename to test/spec/crud/unified/bulkWrite.yml diff --git a/test/spec/crud/count-collation.json b/test/spec/crud/unified/count-collation.json similarity index 100% rename from test/spec/crud/count-collation.json rename to test/spec/crud/unified/count-collation.json diff --git a/test/spec/crud/count-collation.yml b/test/spec/crud/unified/count-collation.yml similarity index 100% rename from test/spec/crud/count-collation.yml rename to test/spec/crud/unified/count-collation.yml diff --git a/test/spec/crud/count-empty.json b/test/spec/crud/unified/count-empty.json similarity index 100% rename from test/spec/crud/count-empty.json rename to test/spec/crud/unified/count-empty.json diff --git a/test/spec/crud/count-empty.yml b/test/spec/crud/unified/count-empty.yml similarity index 100% rename from test/spec/crud/count-empty.yml rename to test/spec/crud/unified/count-empty.yml diff --git a/test/spec/crud/count.json b/test/spec/crud/unified/count.json similarity index 100% rename from test/spec/crud/count.json rename to test/spec/crud/unified/count.json diff --git a/test/spec/crud/count.yml b/test/spec/crud/unified/count.yml similarity index 100% rename from test/spec/crud/count.yml rename to test/spec/crud/unified/count.yml diff --git a/test/spec/crud/countDocuments-comment.json b/test/spec/crud/unified/countDocuments-comment.json similarity index 100% rename from test/spec/crud/countDocuments-comment.json rename to test/spec/crud/unified/countDocuments-comment.json diff --git a/test/spec/crud/countDocuments-comment.yml b/test/spec/crud/unified/countDocuments-comment.yml similarity index 100% rename from test/spec/crud/countDocuments-comment.yml rename to test/spec/crud/unified/countDocuments-comment.yml diff --git a/test/spec/crud/db-aggregate-write-readPreference.json b/test/spec/crud/unified/db-aggregate-write-readPreference.json similarity index 100% rename from test/spec/crud/db-aggregate-write-readPreference.json rename to test/spec/crud/unified/db-aggregate-write-readPreference.json diff --git a/test/spec/crud/db-aggregate-write-readPreference.yml b/test/spec/crud/unified/db-aggregate-write-readPreference.yml similarity index 100% rename from test/spec/crud/db-aggregate-write-readPreference.yml rename to test/spec/crud/unified/db-aggregate-write-readPreference.yml diff --git a/test/spec/crud/db-aggregate.json b/test/spec/crud/unified/db-aggregate.json similarity index 100% rename from test/spec/crud/db-aggregate.json rename to test/spec/crud/unified/db-aggregate.json diff --git a/test/spec/crud/db-aggregate.yml b/test/spec/crud/unified/db-aggregate.yml similarity index 100% rename from test/spec/crud/db-aggregate.yml rename to test/spec/crud/unified/db-aggregate.yml diff --git a/test/spec/crud/deleteMany-collation.json b/test/spec/crud/unified/deleteMany-collation.json similarity index 100% rename from test/spec/crud/deleteMany-collation.json rename to test/spec/crud/unified/deleteMany-collation.json diff --git a/test/spec/crud/deleteMany-collation.yml b/test/spec/crud/unified/deleteMany-collation.yml similarity index 100% rename from test/spec/crud/deleteMany-collation.yml rename to test/spec/crud/unified/deleteMany-collation.yml diff --git a/test/spec/crud/deleteMany-comment.json b/test/spec/crud/unified/deleteMany-comment.json similarity index 100% rename from test/spec/crud/deleteMany-comment.json rename to test/spec/crud/unified/deleteMany-comment.json diff --git a/test/spec/crud/deleteMany-comment.yml b/test/spec/crud/unified/deleteMany-comment.yml similarity index 100% rename from test/spec/crud/deleteMany-comment.yml rename to test/spec/crud/unified/deleteMany-comment.yml diff --git a/test/spec/crud/deleteMany-hint-clientError.json b/test/spec/crud/unified/deleteMany-hint-clientError.json similarity index 100% rename from test/spec/crud/deleteMany-hint-clientError.json rename to test/spec/crud/unified/deleteMany-hint-clientError.json diff --git a/test/spec/crud/deleteMany-hint-clientError.yml b/test/spec/crud/unified/deleteMany-hint-clientError.yml similarity index 100% rename from test/spec/crud/deleteMany-hint-clientError.yml rename to test/spec/crud/unified/deleteMany-hint-clientError.yml diff --git a/test/spec/crud/deleteMany-hint-serverError.json b/test/spec/crud/unified/deleteMany-hint-serverError.json similarity index 100% rename from test/spec/crud/deleteMany-hint-serverError.json rename to test/spec/crud/unified/deleteMany-hint-serverError.json diff --git a/test/spec/crud/deleteMany-hint-serverError.yml b/test/spec/crud/unified/deleteMany-hint-serverError.yml similarity index 100% rename from test/spec/crud/deleteMany-hint-serverError.yml rename to test/spec/crud/unified/deleteMany-hint-serverError.yml diff --git a/test/spec/crud/deleteMany-hint-unacknowledged.json b/test/spec/crud/unified/deleteMany-hint-unacknowledged.json similarity index 100% rename from test/spec/crud/deleteMany-hint-unacknowledged.json rename to test/spec/crud/unified/deleteMany-hint-unacknowledged.json diff --git a/test/spec/crud/deleteMany-hint-unacknowledged.yml b/test/spec/crud/unified/deleteMany-hint-unacknowledged.yml similarity index 100% rename from test/spec/crud/deleteMany-hint-unacknowledged.yml rename to test/spec/crud/unified/deleteMany-hint-unacknowledged.yml diff --git a/test/spec/crud/deleteMany-hint.json b/test/spec/crud/unified/deleteMany-hint.json similarity index 100% rename from test/spec/crud/deleteMany-hint.json rename to test/spec/crud/unified/deleteMany-hint.json diff --git a/test/spec/crud/deleteMany-hint.yml b/test/spec/crud/unified/deleteMany-hint.yml similarity index 100% rename from test/spec/crud/deleteMany-hint.yml rename to test/spec/crud/unified/deleteMany-hint.yml diff --git a/test/spec/crud/deleteMany-let.json b/test/spec/crud/unified/deleteMany-let.json similarity index 100% rename from test/spec/crud/deleteMany-let.json rename to test/spec/crud/unified/deleteMany-let.json diff --git a/test/spec/crud/deleteMany-let.yml b/test/spec/crud/unified/deleteMany-let.yml similarity index 100% rename from test/spec/crud/deleteMany-let.yml rename to test/spec/crud/unified/deleteMany-let.yml diff --git a/test/spec/crud/deleteMany.json b/test/spec/crud/unified/deleteMany.json similarity index 100% rename from test/spec/crud/deleteMany.json rename to test/spec/crud/unified/deleteMany.json diff --git a/test/spec/crud/deleteMany.yml b/test/spec/crud/unified/deleteMany.yml similarity index 100% rename from test/spec/crud/deleteMany.yml rename to test/spec/crud/unified/deleteMany.yml diff --git a/test/spec/crud/deleteOne-collation.json b/test/spec/crud/unified/deleteOne-collation.json similarity index 100% rename from test/spec/crud/deleteOne-collation.json rename to test/spec/crud/unified/deleteOne-collation.json diff --git a/test/spec/crud/deleteOne-collation.yml b/test/spec/crud/unified/deleteOne-collation.yml similarity index 100% rename from test/spec/crud/deleteOne-collation.yml rename to test/spec/crud/unified/deleteOne-collation.yml diff --git a/test/spec/crud/deleteOne-comment.json b/test/spec/crud/unified/deleteOne-comment.json similarity index 100% rename from test/spec/crud/deleteOne-comment.json rename to test/spec/crud/unified/deleteOne-comment.json diff --git a/test/spec/crud/deleteOne-comment.yml b/test/spec/crud/unified/deleteOne-comment.yml similarity index 100% rename from test/spec/crud/deleteOne-comment.yml rename to test/spec/crud/unified/deleteOne-comment.yml diff --git a/test/spec/crud/deleteOne-errorResponse.json b/test/spec/crud/unified/deleteOne-errorResponse.json similarity index 100% rename from test/spec/crud/deleteOne-errorResponse.json rename to test/spec/crud/unified/deleteOne-errorResponse.json diff --git a/test/spec/crud/deleteOne-errorResponse.yml b/test/spec/crud/unified/deleteOne-errorResponse.yml similarity index 100% rename from test/spec/crud/deleteOne-errorResponse.yml rename to test/spec/crud/unified/deleteOne-errorResponse.yml diff --git a/test/spec/crud/deleteOne-hint-clientError.json b/test/spec/crud/unified/deleteOne-hint-clientError.json similarity index 100% rename from test/spec/crud/deleteOne-hint-clientError.json rename to test/spec/crud/unified/deleteOne-hint-clientError.json diff --git a/test/spec/crud/deleteOne-hint-clientError.yml b/test/spec/crud/unified/deleteOne-hint-clientError.yml similarity index 100% rename from test/spec/crud/deleteOne-hint-clientError.yml rename to test/spec/crud/unified/deleteOne-hint-clientError.yml diff --git a/test/spec/crud/deleteOne-hint-serverError.json b/test/spec/crud/unified/deleteOne-hint-serverError.json similarity index 100% rename from test/spec/crud/deleteOne-hint-serverError.json rename to test/spec/crud/unified/deleteOne-hint-serverError.json diff --git a/test/spec/crud/deleteOne-hint-serverError.yml b/test/spec/crud/unified/deleteOne-hint-serverError.yml similarity index 100% rename from test/spec/crud/deleteOne-hint-serverError.yml rename to test/spec/crud/unified/deleteOne-hint-serverError.yml diff --git a/test/spec/crud/deleteOne-hint-unacknowledged.json b/test/spec/crud/unified/deleteOne-hint-unacknowledged.json similarity index 100% rename from test/spec/crud/deleteOne-hint-unacknowledged.json rename to test/spec/crud/unified/deleteOne-hint-unacknowledged.json diff --git a/test/spec/crud/deleteOne-hint-unacknowledged.yml b/test/spec/crud/unified/deleteOne-hint-unacknowledged.yml similarity index 100% rename from test/spec/crud/deleteOne-hint-unacknowledged.yml rename to test/spec/crud/unified/deleteOne-hint-unacknowledged.yml diff --git a/test/spec/crud/deleteOne-hint.json b/test/spec/crud/unified/deleteOne-hint.json similarity index 100% rename from test/spec/crud/deleteOne-hint.json rename to test/spec/crud/unified/deleteOne-hint.json diff --git a/test/spec/crud/deleteOne-hint.yml b/test/spec/crud/unified/deleteOne-hint.yml similarity index 100% rename from test/spec/crud/deleteOne-hint.yml rename to test/spec/crud/unified/deleteOne-hint.yml diff --git a/test/spec/crud/deleteOne-let.json b/test/spec/crud/unified/deleteOne-let.json similarity index 100% rename from test/spec/crud/deleteOne-let.json rename to test/spec/crud/unified/deleteOne-let.json diff --git a/test/spec/crud/deleteOne-let.yml b/test/spec/crud/unified/deleteOne-let.yml similarity index 100% rename from test/spec/crud/deleteOne-let.yml rename to test/spec/crud/unified/deleteOne-let.yml diff --git a/test/spec/crud/deleteOne.json b/test/spec/crud/unified/deleteOne.json similarity index 100% rename from test/spec/crud/deleteOne.json rename to test/spec/crud/unified/deleteOne.json diff --git a/test/spec/crud/deleteOne.yml b/test/spec/crud/unified/deleteOne.yml similarity index 100% rename from test/spec/crud/deleteOne.yml rename to test/spec/crud/unified/deleteOne.yml diff --git a/test/spec/crud/distinct-collation.json b/test/spec/crud/unified/distinct-collation.json similarity index 100% rename from test/spec/crud/distinct-collation.json rename to test/spec/crud/unified/distinct-collation.json diff --git a/test/spec/crud/distinct-collation.yml b/test/spec/crud/unified/distinct-collation.yml similarity index 100% rename from test/spec/crud/distinct-collation.yml rename to test/spec/crud/unified/distinct-collation.yml diff --git a/test/spec/crud/distinct-comment.json b/test/spec/crud/unified/distinct-comment.json similarity index 100% rename from test/spec/crud/distinct-comment.json rename to test/spec/crud/unified/distinct-comment.json diff --git a/test/spec/crud/distinct-comment.yml b/test/spec/crud/unified/distinct-comment.yml similarity index 100% rename from test/spec/crud/distinct-comment.yml rename to test/spec/crud/unified/distinct-comment.yml diff --git a/test/spec/crud/distinct.json b/test/spec/crud/unified/distinct.json similarity index 100% rename from test/spec/crud/distinct.json rename to test/spec/crud/unified/distinct.json diff --git a/test/spec/crud/distinct.yml b/test/spec/crud/unified/distinct.yml similarity index 100% rename from test/spec/crud/distinct.yml rename to test/spec/crud/unified/distinct.yml diff --git a/test/spec/crud/estimatedDocumentCount-comment.json b/test/spec/crud/unified/estimatedDocumentCount-comment.json similarity index 100% rename from test/spec/crud/estimatedDocumentCount-comment.json rename to test/spec/crud/unified/estimatedDocumentCount-comment.json diff --git a/test/spec/crud/estimatedDocumentCount-comment.yml b/test/spec/crud/unified/estimatedDocumentCount-comment.yml similarity index 100% rename from test/spec/crud/estimatedDocumentCount-comment.yml rename to test/spec/crud/unified/estimatedDocumentCount-comment.yml diff --git a/test/spec/crud/estimatedDocumentCount.json b/test/spec/crud/unified/estimatedDocumentCount.json similarity index 100% rename from test/spec/crud/estimatedDocumentCount.json rename to test/spec/crud/unified/estimatedDocumentCount.json diff --git a/test/spec/crud/estimatedDocumentCount.yml b/test/spec/crud/unified/estimatedDocumentCount.yml similarity index 100% rename from test/spec/crud/estimatedDocumentCount.yml rename to test/spec/crud/unified/estimatedDocumentCount.yml diff --git a/test/spec/crud/find-allowdiskuse-clientError.json b/test/spec/crud/unified/find-allowdiskuse-clientError.json similarity index 100% rename from test/spec/crud/find-allowdiskuse-clientError.json rename to test/spec/crud/unified/find-allowdiskuse-clientError.json diff --git a/test/spec/crud/find-allowdiskuse-clientError.yml b/test/spec/crud/unified/find-allowdiskuse-clientError.yml similarity index 100% rename from test/spec/crud/find-allowdiskuse-clientError.yml rename to test/spec/crud/unified/find-allowdiskuse-clientError.yml diff --git a/test/spec/crud/find-allowdiskuse-serverError.json b/test/spec/crud/unified/find-allowdiskuse-serverError.json similarity index 100% rename from test/spec/crud/find-allowdiskuse-serverError.json rename to test/spec/crud/unified/find-allowdiskuse-serverError.json diff --git a/test/spec/crud/find-allowdiskuse-serverError.yml b/test/spec/crud/unified/find-allowdiskuse-serverError.yml similarity index 100% rename from test/spec/crud/find-allowdiskuse-serverError.yml rename to test/spec/crud/unified/find-allowdiskuse-serverError.yml diff --git a/test/spec/crud/find-allowdiskuse.json b/test/spec/crud/unified/find-allowdiskuse.json similarity index 100% rename from test/spec/crud/find-allowdiskuse.json rename to test/spec/crud/unified/find-allowdiskuse.json diff --git a/test/spec/crud/find-allowdiskuse.yml b/test/spec/crud/unified/find-allowdiskuse.yml similarity index 100% rename from test/spec/crud/find-allowdiskuse.yml rename to test/spec/crud/unified/find-allowdiskuse.yml diff --git a/test/spec/crud/find-collation.json b/test/spec/crud/unified/find-collation.json similarity index 100% rename from test/spec/crud/find-collation.json rename to test/spec/crud/unified/find-collation.json diff --git a/test/spec/crud/find-collation.yml b/test/spec/crud/unified/find-collation.yml similarity index 100% rename from test/spec/crud/find-collation.yml rename to test/spec/crud/unified/find-collation.yml diff --git a/test/spec/crud/find-comment.json b/test/spec/crud/unified/find-comment.json similarity index 100% rename from test/spec/crud/find-comment.json rename to test/spec/crud/unified/find-comment.json diff --git a/test/spec/crud/find-comment.yml b/test/spec/crud/unified/find-comment.yml similarity index 100% rename from test/spec/crud/find-comment.yml rename to test/spec/crud/unified/find-comment.yml diff --git a/test/spec/crud/find-let.json b/test/spec/crud/unified/find-let.json similarity index 100% rename from test/spec/crud/find-let.json rename to test/spec/crud/unified/find-let.json diff --git a/test/spec/crud/find-let.yml b/test/spec/crud/unified/find-let.yml similarity index 100% rename from test/spec/crud/find-let.yml rename to test/spec/crud/unified/find-let.yml diff --git a/test/spec/crud/find.json b/test/spec/crud/unified/find.json similarity index 100% rename from test/spec/crud/find.json rename to test/spec/crud/unified/find.json diff --git a/test/spec/crud/find.yml b/test/spec/crud/unified/find.yml similarity index 100% rename from test/spec/crud/find.yml rename to test/spec/crud/unified/find.yml diff --git a/test/spec/crud/findOneAndDelete-collation.json b/test/spec/crud/unified/findOneAndDelete-collation.json similarity index 100% rename from test/spec/crud/findOneAndDelete-collation.json rename to test/spec/crud/unified/findOneAndDelete-collation.json diff --git a/test/spec/crud/findOneAndDelete-collation.yml b/test/spec/crud/unified/findOneAndDelete-collation.yml similarity index 100% rename from test/spec/crud/findOneAndDelete-collation.yml rename to test/spec/crud/unified/findOneAndDelete-collation.yml diff --git a/test/spec/crud/findOneAndDelete-comment.json b/test/spec/crud/unified/findOneAndDelete-comment.json similarity index 100% rename from test/spec/crud/findOneAndDelete-comment.json rename to test/spec/crud/unified/findOneAndDelete-comment.json diff --git a/test/spec/crud/findOneAndDelete-comment.yml b/test/spec/crud/unified/findOneAndDelete-comment.yml similarity index 100% rename from test/spec/crud/findOneAndDelete-comment.yml rename to test/spec/crud/unified/findOneAndDelete-comment.yml diff --git a/test/spec/crud/findOneAndDelete-hint-clientError.json b/test/spec/crud/unified/findOneAndDelete-hint-clientError.json similarity index 100% rename from test/spec/crud/findOneAndDelete-hint-clientError.json rename to test/spec/crud/unified/findOneAndDelete-hint-clientError.json diff --git a/test/spec/crud/findOneAndDelete-hint-clientError.yml b/test/spec/crud/unified/findOneAndDelete-hint-clientError.yml similarity index 100% rename from test/spec/crud/findOneAndDelete-hint-clientError.yml rename to test/spec/crud/unified/findOneAndDelete-hint-clientError.yml diff --git a/test/spec/crud/findOneAndDelete-hint-serverError.json b/test/spec/crud/unified/findOneAndDelete-hint-serverError.json similarity index 100% rename from test/spec/crud/findOneAndDelete-hint-serverError.json rename to test/spec/crud/unified/findOneAndDelete-hint-serverError.json diff --git a/test/spec/crud/findOneAndDelete-hint-serverError.yml b/test/spec/crud/unified/findOneAndDelete-hint-serverError.yml similarity index 100% rename from test/spec/crud/findOneAndDelete-hint-serverError.yml rename to test/spec/crud/unified/findOneAndDelete-hint-serverError.yml diff --git a/test/spec/crud/findOneAndDelete-hint-unacknowledged.json b/test/spec/crud/unified/findOneAndDelete-hint-unacknowledged.json similarity index 100% rename from test/spec/crud/findOneAndDelete-hint-unacknowledged.json rename to test/spec/crud/unified/findOneAndDelete-hint-unacknowledged.json diff --git a/test/spec/crud/findOneAndDelete-hint-unacknowledged.yml b/test/spec/crud/unified/findOneAndDelete-hint-unacknowledged.yml similarity index 100% rename from test/spec/crud/findOneAndDelete-hint-unacknowledged.yml rename to test/spec/crud/unified/findOneAndDelete-hint-unacknowledged.yml diff --git a/test/spec/crud/findOneAndDelete-hint.json b/test/spec/crud/unified/findOneAndDelete-hint.json similarity index 100% rename from test/spec/crud/findOneAndDelete-hint.json rename to test/spec/crud/unified/findOneAndDelete-hint.json diff --git a/test/spec/crud/findOneAndDelete-hint.yml b/test/spec/crud/unified/findOneAndDelete-hint.yml similarity index 100% rename from test/spec/crud/findOneAndDelete-hint.yml rename to test/spec/crud/unified/findOneAndDelete-hint.yml diff --git a/test/spec/crud/findOneAndDelete-let.json b/test/spec/crud/unified/findOneAndDelete-let.json similarity index 100% rename from test/spec/crud/findOneAndDelete-let.json rename to test/spec/crud/unified/findOneAndDelete-let.json diff --git a/test/spec/crud/findOneAndDelete-let.yml b/test/spec/crud/unified/findOneAndDelete-let.yml similarity index 100% rename from test/spec/crud/findOneAndDelete-let.yml rename to test/spec/crud/unified/findOneAndDelete-let.yml diff --git a/test/spec/crud/findOneAndDelete.json b/test/spec/crud/unified/findOneAndDelete.json similarity index 100% rename from test/spec/crud/findOneAndDelete.json rename to test/spec/crud/unified/findOneAndDelete.json diff --git a/test/spec/crud/findOneAndDelete.yml b/test/spec/crud/unified/findOneAndDelete.yml similarity index 100% rename from test/spec/crud/findOneAndDelete.yml rename to test/spec/crud/unified/findOneAndDelete.yml diff --git a/test/spec/crud/findOneAndReplace-collation.json b/test/spec/crud/unified/findOneAndReplace-collation.json similarity index 100% rename from test/spec/crud/findOneAndReplace-collation.json rename to test/spec/crud/unified/findOneAndReplace-collation.json diff --git a/test/spec/crud/findOneAndReplace-collation.yml b/test/spec/crud/unified/findOneAndReplace-collation.yml similarity index 100% rename from test/spec/crud/findOneAndReplace-collation.yml rename to test/spec/crud/unified/findOneAndReplace-collation.yml diff --git a/test/spec/crud/findOneAndReplace-comment.json b/test/spec/crud/unified/findOneAndReplace-comment.json similarity index 100% rename from test/spec/crud/findOneAndReplace-comment.json rename to test/spec/crud/unified/findOneAndReplace-comment.json diff --git a/test/spec/crud/findOneAndReplace-comment.yml b/test/spec/crud/unified/findOneAndReplace-comment.yml similarity index 100% rename from test/spec/crud/findOneAndReplace-comment.yml rename to test/spec/crud/unified/findOneAndReplace-comment.yml diff --git a/test/spec/crud/findOneAndReplace-dots_and_dollars.json b/test/spec/crud/unified/findOneAndReplace-dots_and_dollars.json similarity index 100% rename from test/spec/crud/findOneAndReplace-dots_and_dollars.json rename to test/spec/crud/unified/findOneAndReplace-dots_and_dollars.json diff --git a/test/spec/crud/findOneAndReplace-dots_and_dollars.yml b/test/spec/crud/unified/findOneAndReplace-dots_and_dollars.yml similarity index 100% rename from test/spec/crud/findOneAndReplace-dots_and_dollars.yml rename to test/spec/crud/unified/findOneAndReplace-dots_and_dollars.yml diff --git a/test/spec/crud/findOneAndReplace-hint-clientError.json b/test/spec/crud/unified/findOneAndReplace-hint-clientError.json similarity index 100% rename from test/spec/crud/findOneAndReplace-hint-clientError.json rename to test/spec/crud/unified/findOneAndReplace-hint-clientError.json diff --git a/test/spec/crud/findOneAndReplace-hint-clientError.yml b/test/spec/crud/unified/findOneAndReplace-hint-clientError.yml similarity index 100% rename from test/spec/crud/findOneAndReplace-hint-clientError.yml rename to test/spec/crud/unified/findOneAndReplace-hint-clientError.yml diff --git a/test/spec/crud/findOneAndReplace-hint-serverError.json b/test/spec/crud/unified/findOneAndReplace-hint-serverError.json similarity index 100% rename from test/spec/crud/findOneAndReplace-hint-serverError.json rename to test/spec/crud/unified/findOneAndReplace-hint-serverError.json diff --git a/test/spec/crud/findOneAndReplace-hint-serverError.yml b/test/spec/crud/unified/findOneAndReplace-hint-serverError.yml similarity index 100% rename from test/spec/crud/findOneAndReplace-hint-serverError.yml rename to test/spec/crud/unified/findOneAndReplace-hint-serverError.yml diff --git a/test/spec/crud/findOneAndReplace-hint-unacknowledged.json b/test/spec/crud/unified/findOneAndReplace-hint-unacknowledged.json similarity index 100% rename from test/spec/crud/findOneAndReplace-hint-unacknowledged.json rename to test/spec/crud/unified/findOneAndReplace-hint-unacknowledged.json diff --git a/test/spec/crud/findOneAndReplace-hint-unacknowledged.yml b/test/spec/crud/unified/findOneAndReplace-hint-unacknowledged.yml similarity index 100% rename from test/spec/crud/findOneAndReplace-hint-unacknowledged.yml rename to test/spec/crud/unified/findOneAndReplace-hint-unacknowledged.yml diff --git a/test/spec/crud/findOneAndReplace-hint.json b/test/spec/crud/unified/findOneAndReplace-hint.json similarity index 100% rename from test/spec/crud/findOneAndReplace-hint.json rename to test/spec/crud/unified/findOneAndReplace-hint.json diff --git a/test/spec/crud/findOneAndReplace-hint.yml b/test/spec/crud/unified/findOneAndReplace-hint.yml similarity index 100% rename from test/spec/crud/findOneAndReplace-hint.yml rename to test/spec/crud/unified/findOneAndReplace-hint.yml diff --git a/test/spec/crud/findOneAndReplace-let.json b/test/spec/crud/unified/findOneAndReplace-let.json similarity index 100% rename from test/spec/crud/findOneAndReplace-let.json rename to test/spec/crud/unified/findOneAndReplace-let.json diff --git a/test/spec/crud/findOneAndReplace-let.yml b/test/spec/crud/unified/findOneAndReplace-let.yml similarity index 100% rename from test/spec/crud/findOneAndReplace-let.yml rename to test/spec/crud/unified/findOneAndReplace-let.yml diff --git a/test/spec/crud/findOneAndReplace-upsert.json b/test/spec/crud/unified/findOneAndReplace-upsert.json similarity index 100% rename from test/spec/crud/findOneAndReplace-upsert.json rename to test/spec/crud/unified/findOneAndReplace-upsert.json diff --git a/test/spec/crud/findOneAndReplace-upsert.yml b/test/spec/crud/unified/findOneAndReplace-upsert.yml similarity index 100% rename from test/spec/crud/findOneAndReplace-upsert.yml rename to test/spec/crud/unified/findOneAndReplace-upsert.yml diff --git a/test/spec/crud/findOneAndReplace.json b/test/spec/crud/unified/findOneAndReplace.json similarity index 100% rename from test/spec/crud/findOneAndReplace.json rename to test/spec/crud/unified/findOneAndReplace.json diff --git a/test/spec/crud/findOneAndReplace.yml b/test/spec/crud/unified/findOneAndReplace.yml similarity index 100% rename from test/spec/crud/findOneAndReplace.yml rename to test/spec/crud/unified/findOneAndReplace.yml diff --git a/test/spec/crud/findOneAndUpdate-arrayFilters.json b/test/spec/crud/unified/findOneAndUpdate-arrayFilters.json similarity index 100% rename from test/spec/crud/findOneAndUpdate-arrayFilters.json rename to test/spec/crud/unified/findOneAndUpdate-arrayFilters.json diff --git a/test/spec/crud/findOneAndUpdate-arrayFilters.yml b/test/spec/crud/unified/findOneAndUpdate-arrayFilters.yml similarity index 100% rename from test/spec/crud/findOneAndUpdate-arrayFilters.yml rename to test/spec/crud/unified/findOneAndUpdate-arrayFilters.yml diff --git a/test/spec/crud/findOneAndUpdate-collation.json b/test/spec/crud/unified/findOneAndUpdate-collation.json similarity index 100% rename from test/spec/crud/findOneAndUpdate-collation.json rename to test/spec/crud/unified/findOneAndUpdate-collation.json diff --git a/test/spec/crud/findOneAndUpdate-collation.yml b/test/spec/crud/unified/findOneAndUpdate-collation.yml similarity index 100% rename from test/spec/crud/findOneAndUpdate-collation.yml rename to test/spec/crud/unified/findOneAndUpdate-collation.yml diff --git a/test/spec/crud/findOneAndUpdate-comment.json b/test/spec/crud/unified/findOneAndUpdate-comment.json similarity index 100% rename from test/spec/crud/findOneAndUpdate-comment.json rename to test/spec/crud/unified/findOneAndUpdate-comment.json diff --git a/test/spec/crud/findOneAndUpdate-comment.yml b/test/spec/crud/unified/findOneAndUpdate-comment.yml similarity index 100% rename from test/spec/crud/findOneAndUpdate-comment.yml rename to test/spec/crud/unified/findOneAndUpdate-comment.yml diff --git a/test/spec/crud/findOneAndUpdate-dots_and_dollars.json b/test/spec/crud/unified/findOneAndUpdate-dots_and_dollars.json similarity index 100% rename from test/spec/crud/findOneAndUpdate-dots_and_dollars.json rename to test/spec/crud/unified/findOneAndUpdate-dots_and_dollars.json diff --git a/test/spec/crud/findOneAndUpdate-dots_and_dollars.yml b/test/spec/crud/unified/findOneAndUpdate-dots_and_dollars.yml similarity index 100% rename from test/spec/crud/findOneAndUpdate-dots_and_dollars.yml rename to test/spec/crud/unified/findOneAndUpdate-dots_and_dollars.yml diff --git a/test/spec/crud/findOneAndUpdate-errorResponse.json b/test/spec/crud/unified/findOneAndUpdate-errorResponse.json similarity index 100% rename from test/spec/crud/findOneAndUpdate-errorResponse.json rename to test/spec/crud/unified/findOneAndUpdate-errorResponse.json diff --git a/test/spec/crud/findOneAndUpdate-errorResponse.yml b/test/spec/crud/unified/findOneAndUpdate-errorResponse.yml similarity index 100% rename from test/spec/crud/findOneAndUpdate-errorResponse.yml rename to test/spec/crud/unified/findOneAndUpdate-errorResponse.yml diff --git a/test/spec/crud/findOneAndUpdate-hint-clientError.json b/test/spec/crud/unified/findOneAndUpdate-hint-clientError.json similarity index 100% rename from test/spec/crud/findOneAndUpdate-hint-clientError.json rename to test/spec/crud/unified/findOneAndUpdate-hint-clientError.json diff --git a/test/spec/crud/findOneAndUpdate-hint-clientError.yml b/test/spec/crud/unified/findOneAndUpdate-hint-clientError.yml similarity index 100% rename from test/spec/crud/findOneAndUpdate-hint-clientError.yml rename to test/spec/crud/unified/findOneAndUpdate-hint-clientError.yml diff --git a/test/spec/crud/findOneAndUpdate-hint-serverError.json b/test/spec/crud/unified/findOneAndUpdate-hint-serverError.json similarity index 100% rename from test/spec/crud/findOneAndUpdate-hint-serverError.json rename to test/spec/crud/unified/findOneAndUpdate-hint-serverError.json diff --git a/test/spec/crud/findOneAndUpdate-hint-serverError.yml b/test/spec/crud/unified/findOneAndUpdate-hint-serverError.yml similarity index 100% rename from test/spec/crud/findOneAndUpdate-hint-serverError.yml rename to test/spec/crud/unified/findOneAndUpdate-hint-serverError.yml diff --git a/test/spec/crud/findOneAndUpdate-hint-unacknowledged.json b/test/spec/crud/unified/findOneAndUpdate-hint-unacknowledged.json similarity index 100% rename from test/spec/crud/findOneAndUpdate-hint-unacknowledged.json rename to test/spec/crud/unified/findOneAndUpdate-hint-unacknowledged.json diff --git a/test/spec/crud/findOneAndUpdate-hint-unacknowledged.yml b/test/spec/crud/unified/findOneAndUpdate-hint-unacknowledged.yml similarity index 100% rename from test/spec/crud/findOneAndUpdate-hint-unacknowledged.yml rename to test/spec/crud/unified/findOneAndUpdate-hint-unacknowledged.yml diff --git a/test/spec/crud/findOneAndUpdate-hint.json b/test/spec/crud/unified/findOneAndUpdate-hint.json similarity index 100% rename from test/spec/crud/findOneAndUpdate-hint.json rename to test/spec/crud/unified/findOneAndUpdate-hint.json diff --git a/test/spec/crud/findOneAndUpdate-hint.yml b/test/spec/crud/unified/findOneAndUpdate-hint.yml similarity index 100% rename from test/spec/crud/findOneAndUpdate-hint.yml rename to test/spec/crud/unified/findOneAndUpdate-hint.yml diff --git a/test/spec/crud/findOneAndUpdate-let.json b/test/spec/crud/unified/findOneAndUpdate-let.json similarity index 100% rename from test/spec/crud/findOneAndUpdate-let.json rename to test/spec/crud/unified/findOneAndUpdate-let.json diff --git a/test/spec/crud/findOneAndUpdate-let.yml b/test/spec/crud/unified/findOneAndUpdate-let.yml similarity index 100% rename from test/spec/crud/findOneAndUpdate-let.yml rename to test/spec/crud/unified/findOneAndUpdate-let.yml diff --git a/test/spec/crud/findOneAndUpdate.json b/test/spec/crud/unified/findOneAndUpdate.json similarity index 100% rename from test/spec/crud/findOneAndUpdate.json rename to test/spec/crud/unified/findOneAndUpdate.json diff --git a/test/spec/crud/findOneAndUpdate.yml b/test/spec/crud/unified/findOneAndUpdate.yml similarity index 100% rename from test/spec/crud/findOneAndUpdate.yml rename to test/spec/crud/unified/findOneAndUpdate.yml diff --git a/test/spec/crud/insertMany-comment.json b/test/spec/crud/unified/insertMany-comment.json similarity index 100% rename from test/spec/crud/insertMany-comment.json rename to test/spec/crud/unified/insertMany-comment.json diff --git a/test/spec/crud/insertMany-comment.yml b/test/spec/crud/unified/insertMany-comment.yml similarity index 100% rename from test/spec/crud/insertMany-comment.yml rename to test/spec/crud/unified/insertMany-comment.yml diff --git a/test/spec/crud/insertMany-dots_and_dollars.json b/test/spec/crud/unified/insertMany-dots_and_dollars.json similarity index 100% rename from test/spec/crud/insertMany-dots_and_dollars.json rename to test/spec/crud/unified/insertMany-dots_and_dollars.json diff --git a/test/spec/crud/insertMany-dots_and_dollars.yml b/test/spec/crud/unified/insertMany-dots_and_dollars.yml similarity index 100% rename from test/spec/crud/insertMany-dots_and_dollars.yml rename to test/spec/crud/unified/insertMany-dots_and_dollars.yml diff --git a/test/spec/crud/insertMany.json b/test/spec/crud/unified/insertMany.json similarity index 100% rename from test/spec/crud/insertMany.json rename to test/spec/crud/unified/insertMany.json diff --git a/test/spec/crud/insertMany.yml b/test/spec/crud/unified/insertMany.yml similarity index 100% rename from test/spec/crud/insertMany.yml rename to test/spec/crud/unified/insertMany.yml diff --git a/test/spec/crud/insertOne-comment.json b/test/spec/crud/unified/insertOne-comment.json similarity index 100% rename from test/spec/crud/insertOne-comment.json rename to test/spec/crud/unified/insertOne-comment.json diff --git a/test/spec/crud/insertOne-comment.yml b/test/spec/crud/unified/insertOne-comment.yml similarity index 100% rename from test/spec/crud/insertOne-comment.yml rename to test/spec/crud/unified/insertOne-comment.yml diff --git a/test/spec/crud/insertOne-dots_and_dollars.json b/test/spec/crud/unified/insertOne-dots_and_dollars.json similarity index 100% rename from test/spec/crud/insertOne-dots_and_dollars.json rename to test/spec/crud/unified/insertOne-dots_and_dollars.json diff --git a/test/spec/crud/insertOne-dots_and_dollars.yml b/test/spec/crud/unified/insertOne-dots_and_dollars.yml similarity index 100% rename from test/spec/crud/insertOne-dots_and_dollars.yml rename to test/spec/crud/unified/insertOne-dots_and_dollars.yml diff --git a/test/spec/crud/insertOne-errorResponse.json b/test/spec/crud/unified/insertOne-errorResponse.json similarity index 100% rename from test/spec/crud/insertOne-errorResponse.json rename to test/spec/crud/unified/insertOne-errorResponse.json diff --git a/test/spec/crud/insertOne-errorResponse.yml b/test/spec/crud/unified/insertOne-errorResponse.yml similarity index 100% rename from test/spec/crud/insertOne-errorResponse.yml rename to test/spec/crud/unified/insertOne-errorResponse.yml diff --git a/test/spec/crud/insertOne.json b/test/spec/crud/unified/insertOne.json similarity index 100% rename from test/spec/crud/insertOne.json rename to test/spec/crud/unified/insertOne.json diff --git a/test/spec/crud/insertOne.yml b/test/spec/crud/unified/insertOne.yml similarity index 100% rename from test/spec/crud/insertOne.yml rename to test/spec/crud/unified/insertOne.yml diff --git a/test/spec/crud/replaceOne-collation.json b/test/spec/crud/unified/replaceOne-collation.json similarity index 100% rename from test/spec/crud/replaceOne-collation.json rename to test/spec/crud/unified/replaceOne-collation.json diff --git a/test/spec/crud/replaceOne-collation.yml b/test/spec/crud/unified/replaceOne-collation.yml similarity index 100% rename from test/spec/crud/replaceOne-collation.yml rename to test/spec/crud/unified/replaceOne-collation.yml diff --git a/test/spec/crud/replaceOne-comment.json b/test/spec/crud/unified/replaceOne-comment.json similarity index 100% rename from test/spec/crud/replaceOne-comment.json rename to test/spec/crud/unified/replaceOne-comment.json diff --git a/test/spec/crud/replaceOne-comment.yml b/test/spec/crud/unified/replaceOne-comment.yml similarity index 100% rename from test/spec/crud/replaceOne-comment.yml rename to test/spec/crud/unified/replaceOne-comment.yml diff --git a/test/spec/crud/replaceOne-dots_and_dollars.json b/test/spec/crud/unified/replaceOne-dots_and_dollars.json similarity index 100% rename from test/spec/crud/replaceOne-dots_and_dollars.json rename to test/spec/crud/unified/replaceOne-dots_and_dollars.json diff --git a/test/spec/crud/replaceOne-dots_and_dollars.yml b/test/spec/crud/unified/replaceOne-dots_and_dollars.yml similarity index 100% rename from test/spec/crud/replaceOne-dots_and_dollars.yml rename to test/spec/crud/unified/replaceOne-dots_and_dollars.yml diff --git a/test/spec/crud/replaceOne-hint-unacknowledged.json b/test/spec/crud/unified/replaceOne-hint-unacknowledged.json similarity index 100% rename from test/spec/crud/replaceOne-hint-unacknowledged.json rename to test/spec/crud/unified/replaceOne-hint-unacknowledged.json diff --git a/test/spec/crud/replaceOne-hint-unacknowledged.yml b/test/spec/crud/unified/replaceOne-hint-unacknowledged.yml similarity index 100% rename from test/spec/crud/replaceOne-hint-unacknowledged.yml rename to test/spec/crud/unified/replaceOne-hint-unacknowledged.yml diff --git a/test/spec/crud/replaceOne-hint.json b/test/spec/crud/unified/replaceOne-hint.json similarity index 100% rename from test/spec/crud/replaceOne-hint.json rename to test/spec/crud/unified/replaceOne-hint.json diff --git a/test/spec/crud/replaceOne-hint.yml b/test/spec/crud/unified/replaceOne-hint.yml similarity index 100% rename from test/spec/crud/replaceOne-hint.yml rename to test/spec/crud/unified/replaceOne-hint.yml diff --git a/test/spec/crud/replaceOne-let.json b/test/spec/crud/unified/replaceOne-let.json similarity index 100% rename from test/spec/crud/replaceOne-let.json rename to test/spec/crud/unified/replaceOne-let.json diff --git a/test/spec/crud/replaceOne-let.yml b/test/spec/crud/unified/replaceOne-let.yml similarity index 100% rename from test/spec/crud/replaceOne-let.yml rename to test/spec/crud/unified/replaceOne-let.yml diff --git a/test/spec/crud/replaceOne-validation.json b/test/spec/crud/unified/replaceOne-validation.json similarity index 100% rename from test/spec/crud/replaceOne-validation.json rename to test/spec/crud/unified/replaceOne-validation.json diff --git a/test/spec/crud/replaceOne-validation.yml b/test/spec/crud/unified/replaceOne-validation.yml similarity index 100% rename from test/spec/crud/replaceOne-validation.yml rename to test/spec/crud/unified/replaceOne-validation.yml diff --git a/test/spec/crud/replaceOne.json b/test/spec/crud/unified/replaceOne.json similarity index 100% rename from test/spec/crud/replaceOne.json rename to test/spec/crud/unified/replaceOne.json diff --git a/test/spec/crud/replaceOne.yml b/test/spec/crud/unified/replaceOne.yml similarity index 100% rename from test/spec/crud/replaceOne.yml rename to test/spec/crud/unified/replaceOne.yml diff --git a/test/spec/crud/updateMany-arrayFilters.json b/test/spec/crud/unified/updateMany-arrayFilters.json similarity index 100% rename from test/spec/crud/updateMany-arrayFilters.json rename to test/spec/crud/unified/updateMany-arrayFilters.json diff --git a/test/spec/crud/updateMany-arrayFilters.yml b/test/spec/crud/unified/updateMany-arrayFilters.yml similarity index 100% rename from test/spec/crud/updateMany-arrayFilters.yml rename to test/spec/crud/unified/updateMany-arrayFilters.yml diff --git a/test/spec/crud/updateMany-collation.json b/test/spec/crud/unified/updateMany-collation.json similarity index 100% rename from test/spec/crud/updateMany-collation.json rename to test/spec/crud/unified/updateMany-collation.json diff --git a/test/spec/crud/updateMany-collation.yml b/test/spec/crud/unified/updateMany-collation.yml similarity index 100% rename from test/spec/crud/updateMany-collation.yml rename to test/spec/crud/unified/updateMany-collation.yml diff --git a/test/spec/crud/updateMany-comment.json b/test/spec/crud/unified/updateMany-comment.json similarity index 100% rename from test/spec/crud/updateMany-comment.json rename to test/spec/crud/unified/updateMany-comment.json diff --git a/test/spec/crud/updateMany-comment.yml b/test/spec/crud/unified/updateMany-comment.yml similarity index 100% rename from test/spec/crud/updateMany-comment.yml rename to test/spec/crud/unified/updateMany-comment.yml diff --git a/test/spec/crud/updateMany-dots_and_dollars.json b/test/spec/crud/unified/updateMany-dots_and_dollars.json similarity index 100% rename from test/spec/crud/updateMany-dots_and_dollars.json rename to test/spec/crud/unified/updateMany-dots_and_dollars.json diff --git a/test/spec/crud/updateMany-dots_and_dollars.yml b/test/spec/crud/unified/updateMany-dots_and_dollars.yml similarity index 100% rename from test/spec/crud/updateMany-dots_and_dollars.yml rename to test/spec/crud/unified/updateMany-dots_and_dollars.yml diff --git a/test/spec/crud/updateMany-hint-clientError.json b/test/spec/crud/unified/updateMany-hint-clientError.json similarity index 100% rename from test/spec/crud/updateMany-hint-clientError.json rename to test/spec/crud/unified/updateMany-hint-clientError.json diff --git a/test/spec/crud/updateMany-hint-clientError.yml b/test/spec/crud/unified/updateMany-hint-clientError.yml similarity index 100% rename from test/spec/crud/updateMany-hint-clientError.yml rename to test/spec/crud/unified/updateMany-hint-clientError.yml diff --git a/test/spec/crud/updateMany-hint-serverError.json b/test/spec/crud/unified/updateMany-hint-serverError.json similarity index 100% rename from test/spec/crud/updateMany-hint-serverError.json rename to test/spec/crud/unified/updateMany-hint-serverError.json diff --git a/test/spec/crud/updateMany-hint-serverError.yml b/test/spec/crud/unified/updateMany-hint-serverError.yml similarity index 100% rename from test/spec/crud/updateMany-hint-serverError.yml rename to test/spec/crud/unified/updateMany-hint-serverError.yml diff --git a/test/spec/crud/updateMany-hint-unacknowledged.json b/test/spec/crud/unified/updateMany-hint-unacknowledged.json similarity index 100% rename from test/spec/crud/updateMany-hint-unacknowledged.json rename to test/spec/crud/unified/updateMany-hint-unacknowledged.json diff --git a/test/spec/crud/updateMany-hint-unacknowledged.yml b/test/spec/crud/unified/updateMany-hint-unacknowledged.yml similarity index 100% rename from test/spec/crud/updateMany-hint-unacknowledged.yml rename to test/spec/crud/unified/updateMany-hint-unacknowledged.yml diff --git a/test/spec/crud/updateMany-hint.json b/test/spec/crud/unified/updateMany-hint.json similarity index 100% rename from test/spec/crud/updateMany-hint.json rename to test/spec/crud/unified/updateMany-hint.json diff --git a/test/spec/crud/updateMany-hint.yml b/test/spec/crud/unified/updateMany-hint.yml similarity index 100% rename from test/spec/crud/updateMany-hint.yml rename to test/spec/crud/unified/updateMany-hint.yml diff --git a/test/spec/crud/updateMany-let.json b/test/spec/crud/unified/updateMany-let.json similarity index 100% rename from test/spec/crud/updateMany-let.json rename to test/spec/crud/unified/updateMany-let.json diff --git a/test/spec/crud/updateMany-let.yml b/test/spec/crud/unified/updateMany-let.yml similarity index 100% rename from test/spec/crud/updateMany-let.yml rename to test/spec/crud/unified/updateMany-let.yml diff --git a/test/spec/crud/updateMany-validation.json b/test/spec/crud/unified/updateMany-validation.json similarity index 100% rename from test/spec/crud/updateMany-validation.json rename to test/spec/crud/unified/updateMany-validation.json diff --git a/test/spec/crud/updateMany-validation.yml b/test/spec/crud/unified/updateMany-validation.yml similarity index 100% rename from test/spec/crud/updateMany-validation.yml rename to test/spec/crud/unified/updateMany-validation.yml diff --git a/test/spec/crud/updateMany.json b/test/spec/crud/unified/updateMany.json similarity index 100% rename from test/spec/crud/updateMany.json rename to test/spec/crud/unified/updateMany.json diff --git a/test/spec/crud/updateMany.yml b/test/spec/crud/unified/updateMany.yml similarity index 100% rename from test/spec/crud/updateMany.yml rename to test/spec/crud/unified/updateMany.yml diff --git a/test/spec/crud/updateOne-arrayFilters.json b/test/spec/crud/unified/updateOne-arrayFilters.json similarity index 100% rename from test/spec/crud/updateOne-arrayFilters.json rename to test/spec/crud/unified/updateOne-arrayFilters.json diff --git a/test/spec/crud/updateOne-arrayFilters.yml b/test/spec/crud/unified/updateOne-arrayFilters.yml similarity index 100% rename from test/spec/crud/updateOne-arrayFilters.yml rename to test/spec/crud/unified/updateOne-arrayFilters.yml diff --git a/test/spec/crud/updateOne-collation.json b/test/spec/crud/unified/updateOne-collation.json similarity index 100% rename from test/spec/crud/updateOne-collation.json rename to test/spec/crud/unified/updateOne-collation.json diff --git a/test/spec/crud/updateOne-collation.yml b/test/spec/crud/unified/updateOne-collation.yml similarity index 100% rename from test/spec/crud/updateOne-collation.yml rename to test/spec/crud/unified/updateOne-collation.yml diff --git a/test/spec/crud/updateOne-comment.json b/test/spec/crud/unified/updateOne-comment.json similarity index 100% rename from test/spec/crud/updateOne-comment.json rename to test/spec/crud/unified/updateOne-comment.json diff --git a/test/spec/crud/updateOne-comment.yml b/test/spec/crud/unified/updateOne-comment.yml similarity index 100% rename from test/spec/crud/updateOne-comment.yml rename to test/spec/crud/unified/updateOne-comment.yml diff --git a/test/spec/crud/updateOne-dots_and_dollars.json b/test/spec/crud/unified/updateOne-dots_and_dollars.json similarity index 100% rename from test/spec/crud/updateOne-dots_and_dollars.json rename to test/spec/crud/unified/updateOne-dots_and_dollars.json diff --git a/test/spec/crud/updateOne-dots_and_dollars.yml b/test/spec/crud/unified/updateOne-dots_and_dollars.yml similarity index 100% rename from test/spec/crud/updateOne-dots_and_dollars.yml rename to test/spec/crud/unified/updateOne-dots_and_dollars.yml diff --git a/test/spec/crud/updateOne-errorResponse.json b/test/spec/crud/unified/updateOne-errorResponse.json similarity index 100% rename from test/spec/crud/updateOne-errorResponse.json rename to test/spec/crud/unified/updateOne-errorResponse.json diff --git a/test/spec/crud/updateOne-errorResponse.yml b/test/spec/crud/unified/updateOne-errorResponse.yml similarity index 100% rename from test/spec/crud/updateOne-errorResponse.yml rename to test/spec/crud/unified/updateOne-errorResponse.yml diff --git a/test/spec/crud/updateOne-hint-clientError.json b/test/spec/crud/unified/updateOne-hint-clientError.json similarity index 100% rename from test/spec/crud/updateOne-hint-clientError.json rename to test/spec/crud/unified/updateOne-hint-clientError.json diff --git a/test/spec/crud/updateOne-hint-clientError.yml b/test/spec/crud/unified/updateOne-hint-clientError.yml similarity index 100% rename from test/spec/crud/updateOne-hint-clientError.yml rename to test/spec/crud/unified/updateOne-hint-clientError.yml diff --git a/test/spec/crud/updateOne-hint-serverError.json b/test/spec/crud/unified/updateOne-hint-serverError.json similarity index 100% rename from test/spec/crud/updateOne-hint-serverError.json rename to test/spec/crud/unified/updateOne-hint-serverError.json diff --git a/test/spec/crud/updateOne-hint-serverError.yml b/test/spec/crud/unified/updateOne-hint-serverError.yml similarity index 100% rename from test/spec/crud/updateOne-hint-serverError.yml rename to test/spec/crud/unified/updateOne-hint-serverError.yml diff --git a/test/spec/crud/updateOne-hint-unacknowledged.json b/test/spec/crud/unified/updateOne-hint-unacknowledged.json similarity index 100% rename from test/spec/crud/updateOne-hint-unacknowledged.json rename to test/spec/crud/unified/updateOne-hint-unacknowledged.json diff --git a/test/spec/crud/updateOne-hint-unacknowledged.yml b/test/spec/crud/unified/updateOne-hint-unacknowledged.yml similarity index 100% rename from test/spec/crud/updateOne-hint-unacknowledged.yml rename to test/spec/crud/unified/updateOne-hint-unacknowledged.yml diff --git a/test/spec/crud/updateOne-hint.json b/test/spec/crud/unified/updateOne-hint.json similarity index 100% rename from test/spec/crud/updateOne-hint.json rename to test/spec/crud/unified/updateOne-hint.json diff --git a/test/spec/crud/updateOne-hint.yml b/test/spec/crud/unified/updateOne-hint.yml similarity index 100% rename from test/spec/crud/updateOne-hint.yml rename to test/spec/crud/unified/updateOne-hint.yml diff --git a/test/spec/crud/updateOne-let.json b/test/spec/crud/unified/updateOne-let.json similarity index 100% rename from test/spec/crud/updateOne-let.json rename to test/spec/crud/unified/updateOne-let.json diff --git a/test/spec/crud/updateOne-let.yml b/test/spec/crud/unified/updateOne-let.yml similarity index 100% rename from test/spec/crud/updateOne-let.yml rename to test/spec/crud/unified/updateOne-let.yml diff --git a/test/spec/crud/updateOne-validation.json b/test/spec/crud/unified/updateOne-validation.json similarity index 100% rename from test/spec/crud/updateOne-validation.json rename to test/spec/crud/unified/updateOne-validation.json diff --git a/test/spec/crud/updateOne-validation.yml b/test/spec/crud/unified/updateOne-validation.yml similarity index 100% rename from test/spec/crud/updateOne-validation.yml rename to test/spec/crud/unified/updateOne-validation.yml diff --git a/test/spec/crud/updateOne.json b/test/spec/crud/unified/updateOne.json similarity index 100% rename from test/spec/crud/updateOne.json rename to test/spec/crud/unified/updateOne.json diff --git a/test/spec/crud/updateOne.yml b/test/spec/crud/unified/updateOne.yml similarity index 100% rename from test/spec/crud/updateOne.yml rename to test/spec/crud/unified/updateOne.yml diff --git a/test/spec/crud/updateWithPipelines.json b/test/spec/crud/unified/updateWithPipelines.json similarity index 100% rename from test/spec/crud/updateWithPipelines.json rename to test/spec/crud/unified/updateWithPipelines.json diff --git a/test/spec/crud/updateWithPipelines.yml b/test/spec/crud/unified/updateWithPipelines.yml similarity index 100% rename from test/spec/crud/updateWithPipelines.yml rename to test/spec/crud/unified/updateWithPipelines.yml diff --git a/test/tools/unified-spec-runner/match.ts b/test/tools/unified-spec-runner/match.ts index 418e1fb59d..21fa3b4067 100644 --- a/test/tools/unified-spec-runner/match.ts +++ b/test/tools/unified-spec-runner/match.ts @@ -782,7 +782,6 @@ export function expectErrorCheck( if (error instanceof MongoClientBulkWriteError) { mongoError = error.error; } - console.log(error, mongoError); for (const errorLabel of expected.errorLabelsContain) { expect( mongoError.hasErrorLabel(errorLabel), From 26b40f88881e721b4dac190909c4f480914ed5fc Mon Sep 17 00:00:00 2001 From: Durran Jordan Date: Mon, 7 Oct 2024 22:53:02 +0200 Subject: [PATCH 13/29] chore: debug --- test/tools/unified-spec-runner/match.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/test/tools/unified-spec-runner/match.ts b/test/tools/unified-spec-runner/match.ts index 21fa3b4067..418e1fb59d 100644 --- a/test/tools/unified-spec-runner/match.ts +++ b/test/tools/unified-spec-runner/match.ts @@ -782,6 +782,7 @@ export function expectErrorCheck( if (error instanceof MongoClientBulkWriteError) { mongoError = error.error; } + console.log(error, mongoError); for (const errorLabel of expected.errorLabelsContain) { expect( mongoError.hasErrorLabel(errorLabel), From b1ab86eef4c1dd5204a24eb098140211de1e82cf Mon Sep 17 00:00:00 2001 From: Durran Jordan Date: Mon, 7 Oct 2024 23:27:54 +0200 Subject: [PATCH 14/29] fix: use cause --- test/tools/unified-spec-runner/match.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/tools/unified-spec-runner/match.ts b/test/tools/unified-spec-runner/match.ts index 418e1fb59d..6de70d3a38 100644 --- a/test/tools/unified-spec-runner/match.ts +++ b/test/tools/unified-spec-runner/match.ts @@ -780,7 +780,7 @@ export function expectErrorCheck( if (expected.errorLabelsContain != null) { let mongoError = error as MongoError; if (error instanceof MongoClientBulkWriteError) { - mongoError = error.error; + mongoError = error.cause as MongoError; } console.log(error, mongoError); for (const errorLabel of expected.errorLabelsContain) { From 3f81c38967cba936166991cc4b70b6083b1c29d8 Mon Sep 17 00:00:00 2001 From: Durran Jordan Date: Tue, 8 Oct 2024 00:12:17 +0200 Subject: [PATCH 15/29] test: sync tests --- test/spec/retryable-writes/unified/handshakeError.json | 8 +++++--- test/spec/retryable-writes/unified/handshakeError.yml | 4 +++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/test/spec/retryable-writes/unified/handshakeError.json b/test/spec/retryable-writes/unified/handshakeError.json index 3c46463759..93cb2e849e 100644 --- a/test/spec/retryable-writes/unified/handshakeError.json +++ b/test/spec/retryable-writes/unified/handshakeError.json @@ -1,6 +1,6 @@ { "description": "retryable writes handshake failures", - "schemaVersion": "1.3", + "schemaVersion": "1.4", "runOnRequirements": [ { "minServerVersion": "4.2", @@ -57,7 +57,8 @@ "description": "client.clientBulkWrite succeeds after retryable handshake network error", "runOnRequirements": [ { - "minServerVersion": "8.0" + "minServerVersion": "8.0", + "serverless": "forbid" } ], "operations": [ @@ -165,7 +166,8 @@ "description": "client.clientBulkWrite succeeds after retryable handshake server error (ShutdownInProgress)", "runOnRequirements": [ { - "minServerVersion": "8.0" + "minServerVersion": "8.0", + "serverless": "forbid" } ], "operations": [ diff --git a/test/spec/retryable-writes/unified/handshakeError.yml b/test/spec/retryable-writes/unified/handshakeError.yml index 131bbf2e5c..1743463370 100644 --- a/test/spec/retryable-writes/unified/handshakeError.yml +++ b/test/spec/retryable-writes/unified/handshakeError.yml @@ -2,7 +2,7 @@ description: "retryable writes handshake failures" -schemaVersion: "1.3" +schemaVersion: "1.4" # For `serverless: forbid` runOnRequirements: - minServerVersion: "4.2" @@ -53,6 +53,7 @@ tests: - description: "client.clientBulkWrite succeeds after retryable handshake network error" runOnRequirements: - minServerVersion: "8.0" # `bulkWrite` added to server 8.0 + serverless: forbid operations: - name: failPoint object: testRunner @@ -98,6 +99,7 @@ tests: - description: "client.clientBulkWrite succeeds after retryable handshake server error (ShutdownInProgress)" runOnRequirements: - minServerVersion: "8.0" # `bulkWrite` added to server 8.0 + serverless: forbid operations: - name: failPoint object: testRunner From 77022eb3414fe4d773fbe259df49528a617a8248 Mon Sep 17 00:00:00 2001 From: Durran Jordan Date: Tue, 8 Oct 2024 00:47:41 +0200 Subject: [PATCH 16/29] fix: lb pinning --- src/operations/client_bulk_write/client_bulk_write.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/operations/client_bulk_write/client_bulk_write.ts b/src/operations/client_bulk_write/client_bulk_write.ts index 091474a123..c8e20870bc 100644 --- a/src/operations/client_bulk_write/client_bulk_write.ts +++ b/src/operations/client_bulk_write/client_bulk_write.ts @@ -53,7 +53,9 @@ export class ClientBulkWriteOperation extends CommandOperation Date: Tue, 8 Oct 2024 01:54:53 +0200 Subject: [PATCH 17/29] fix: lb leak --- .../client_bulk_write/client_bulk_write.ts | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/operations/client_bulk_write/client_bulk_write.ts b/src/operations/client_bulk_write/client_bulk_write.ts index c8e20870bc..a9d9fb1e32 100644 --- a/src/operations/client_bulk_write/client_bulk_write.ts +++ b/src/operations/client_bulk_write/client_bulk_write.ts @@ -85,7 +85,21 @@ export class ClientBulkWriteOperation extends CommandOperation Date: Tue, 8 Oct 2024 02:37:13 +0200 Subject: [PATCH 18/29] chore: debug pinning --- src/operations/client_bulk_write/client_bulk_write.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/operations/client_bulk_write/client_bulk_write.ts b/src/operations/client_bulk_write/client_bulk_write.ts index a9d9fb1e32..62d07388d8 100644 --- a/src/operations/client_bulk_write/client_bulk_write.ts +++ b/src/operations/client_bulk_write/client_bulk_write.ts @@ -54,6 +54,7 @@ export class ClientBulkWriteOperation extends CommandOperation Date: Tue, 8 Oct 2024 04:24:20 +0200 Subject: [PATCH 19/29] fix: always unpin --- .../client_bulk_write/client_bulk_write.ts | 22 ++++++++----------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/src/operations/client_bulk_write/client_bulk_write.ts b/src/operations/client_bulk_write/client_bulk_write.ts index 62d07388d8..3a6d6433d7 100644 --- a/src/operations/client_bulk_write/client_bulk_write.ts +++ b/src/operations/client_bulk_write/client_bulk_write.ts @@ -86,22 +86,18 @@ export class ClientBulkWriteOperation extends CommandOperation Date: Tue, 8 Oct 2024 18:49:07 +0200 Subject: [PATCH 20/29] fix: pin in finally --- src/operations/client_bulk_write/client_bulk_write.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/operations/client_bulk_write/client_bulk_write.ts b/src/operations/client_bulk_write/client_bulk_write.ts index 3a6d6433d7..d4c002b36b 100644 --- a/src/operations/client_bulk_write/client_bulk_write.ts +++ b/src/operations/client_bulk_write/client_bulk_write.ts @@ -93,7 +93,7 @@ export class ClientBulkWriteOperation extends CommandOperation Date: Tue, 8 Oct 2024 19:59:46 +0200 Subject: [PATCH 21/29] chore: remove debug --- src/operations/client_bulk_write/client_bulk_write.ts | 2 -- test/tools/unified-spec-runner/match.ts | 1 - 2 files changed, 3 deletions(-) diff --git a/src/operations/client_bulk_write/client_bulk_write.ts b/src/operations/client_bulk_write/client_bulk_write.ts index d4c002b36b..edf955d113 100644 --- a/src/operations/client_bulk_write/client_bulk_write.ts +++ b/src/operations/client_bulk_write/client_bulk_write.ts @@ -54,7 +54,6 @@ export class ClientBulkWriteOperation extends CommandOperation Date: Tue, 8 Oct 2024 23:15:00 +0200 Subject: [PATCH 22/29] chore: comments --- .../client_bulk_write/client_bulk_write.ts | 24 ++++++--------- .../client_bulk_write/command_builder.ts | 30 +++++++++---------- 2 files changed, 24 insertions(+), 30 deletions(-) diff --git a/src/operations/client_bulk_write/client_bulk_write.ts b/src/operations/client_bulk_write/client_bulk_write.ts index edf955d113..29911d0236 100644 --- a/src/operations/client_bulk_write/client_bulk_write.ts +++ b/src/operations/client_bulk_write/client_bulk_write.ts @@ -32,7 +32,7 @@ export class ClientBulkWriteOperation extends CommandOperation { - return model.name === 'deleteMany' || model.name === 'updateMany'; - }); + this.isBatchRetryable = true; } /** @@ -104,6 +105,9 @@ export class ClientBulkWriteCommandBuilder { maxWriteBatchSize: number, maxBsonObjectSize: number ): ClientBulkWriteCommand { + // We start by assuming the batch has no multi-updates, so it is retryable + // until we find them. + this.isBatchRetryable = true; let commandLength = 0; let currentNamespaceIndex = 0; const command: ClientBulkWriteCommand = this.baseCommand(); @@ -116,6 +120,11 @@ export class ClientBulkWriteCommandBuilder { const ns = model.namespace; const nsIndex = namespaces.get(ns); + // Multi updates are not retryable. + if (model.name === 'deleteMany' || model.name === 'updateMany') { + this.isBatchRetryable = false; + } + if (nsIndex != null) { // Build the operation and serialize it to get the bytes buffer. const operation = buildOperation(model, nsIndex, this.pkFactory); @@ -379,16 +388,7 @@ function createUpdateOperation( // required only to contain atomic modifiers (i.e. keys that start with "$"). // Drivers MUST throw an error if an update document is empty or if the // document's first key does not start with "$". - if (Array.isArray(model.update)) { - if (model.update.length === 0) { - throw new MongoAPIError('Client bulk write update model pipelines may not be empty.'); - } - for (const update of model.update) { - validateUpdate(update); - } - } else { - validateUpdate(model.update); - } + validateUpdate(model.update); const document: ClientUpdateOperation = { update: index, multi: multi, From bddc0b245696f51f526f9d5cd12cbf18bbd5e333 Mon Sep 17 00:00:00 2001 From: Durran Jordan Date: Wed, 9 Oct 2024 03:05:25 +0200 Subject: [PATCH 23/29] fix: second size check --- .../client_bulk_write/command_builder.ts | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/src/operations/client_bulk_write/command_builder.ts b/src/operations/client_bulk_write/command_builder.ts index 809f72e60f..da49cfe894 100644 --- a/src/operations/client_bulk_write/command_builder.ts +++ b/src/operations/client_bulk_write/command_builder.ts @@ -137,7 +137,7 @@ export class ClientBulkWriteCommandBuilder { ); } - validateBufferSize('ops', operationBuffer, maxBsonObjectSize, maxMessageSizeBytes); + validateBufferSize('ops', operationBuffer, maxBsonObjectSize); // Check if the operation buffer can fit in the command. If it can, // then add the operation to the document sequence and increment the @@ -172,8 +172,8 @@ export class ClientBulkWriteCommandBuilder { ); } - validateBufferSize('nsInfo', nsInfoBuffer, maxBsonObjectSize, maxMessageSizeBytes); - validateBufferSize('ops', operationBuffer, maxBsonObjectSize, maxMessageSizeBytes); + validateBufferSize('nsInfo', nsInfoBuffer, maxBsonObjectSize); + validateBufferSize('ops', operationBuffer, maxBsonObjectSize); // Check if the operation and nsInfo buffers can fit in the command. If they // can, then add the operation and nsInfo to their respective document @@ -231,23 +231,12 @@ export class ClientBulkWriteCommandBuilder { } } -function validateBufferSize( - name: string, - buffer: Uint8Array, - maxBsonObjectSize: number, - maxMessageSizeBytes: number -) { +function validateBufferSize(name: string, buffer: Uint8Array, maxBsonObjectSize: number) { if (buffer.length > maxBsonObjectSize) { throw new MongoInvalidArgumentError( `Client bulk write operation ${name} of length ${buffer.length} exceeds the max bson object size of ${maxBsonObjectSize}` ); } - - if (buffer.length > maxMessageSizeBytes) { - throw new MongoInvalidArgumentError( - `Client bulk write operation ${name} of length ${buffer.length} exceeds the max message size size of ${maxMessageSizeBytes}` - ); - } } /** @internal */ From 96028559bb4c927b6ab0efde82799e597cc893ab Mon Sep 17 00:00:00 2001 From: Durran Jordan Date: Wed, 9 Oct 2024 03:29:19 +0200 Subject: [PATCH 24/29] fix: retry on batches --- src/operations/client_bulk_write/client_bulk_write.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/operations/client_bulk_write/client_bulk_write.ts b/src/operations/client_bulk_write/client_bulk_write.ts index 29911d0236..e901407cd7 100644 --- a/src/operations/client_bulk_write/client_bulk_write.ts +++ b/src/operations/client_bulk_write/client_bulk_write.ts @@ -89,6 +89,10 @@ export class ClientBulkWriteOperation extends CommandOperation Date: Wed, 9 Oct 2024 03:57:05 +0200 Subject: [PATCH 25/29] chore: debug retry --- src/operations/client_bulk_write/command_builder.ts | 1 + src/operations/command.ts | 1 + test/integration/retryable-writes/retryable_writes.spec.test.ts | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/operations/client_bulk_write/command_builder.ts b/src/operations/client_bulk_write/command_builder.ts index da49cfe894..a4e1452fbd 100644 --- a/src/operations/client_bulk_write/command_builder.ts +++ b/src/operations/client_bulk_write/command_builder.ts @@ -122,6 +122,7 @@ export class ClientBulkWriteCommandBuilder { // Multi updates are not retryable. if (model.name === 'deleteMany' || model.name === 'updateMany') { + console.log('Batch is not retryable'); this.isBatchRetryable = false; } diff --git a/src/operations/command.ts b/src/operations/command.ts index 94ccc6ceaf..57519613c9 100644 --- a/src/operations/command.ts +++ b/src/operations/command.ts @@ -166,6 +166,7 @@ export abstract class CommandOperation extends AbstractOperation { cmd = decorateWithExplain(cmd, this.explain); } + console.log(options); return await server.command(this.ns, cmd, options, responseType); } } diff --git a/test/integration/retryable-writes/retryable_writes.spec.test.ts b/test/integration/retryable-writes/retryable_writes.spec.test.ts index 87e8c1edc9..169304f74b 100644 --- a/test/integration/retryable-writes/retryable_writes.spec.test.ts +++ b/test/integration/retryable-writes/retryable_writes.spec.test.ts @@ -3,6 +3,6 @@ import * as path from 'path'; import { loadSpecTests } from '../../spec'; import { runUnifiedSuite } from '../../tools/unified-spec-runner/runner'; -describe('Retryable Writes (unified)', function () { +describe.only('Retryable Writes (unified)', function () { runUnifiedSuite(loadSpecTests(path.join('retryable-writes', 'unified'))); }); From 53dc9fc769c7b18efab7e9e449f8454f0012fef1 Mon Sep 17 00:00:00 2001 From: Durran Jordan Date: Wed, 9 Oct 2024 16:38:42 +0200 Subject: [PATCH 26/29] test: throw in loop --- src/operations/client_bulk_write/command_builder.ts | 1 - src/operations/command.ts | 1 - src/operations/execute_operation.ts | 4 ++++ 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/operations/client_bulk_write/command_builder.ts b/src/operations/client_bulk_write/command_builder.ts index a4e1452fbd..da49cfe894 100644 --- a/src/operations/client_bulk_write/command_builder.ts +++ b/src/operations/client_bulk_write/command_builder.ts @@ -122,7 +122,6 @@ export class ClientBulkWriteCommandBuilder { // Multi updates are not retryable. if (model.name === 'deleteMany' || model.name === 'updateMany') { - console.log('Batch is not retryable'); this.isBatchRetryable = false; } diff --git a/src/operations/command.ts b/src/operations/command.ts index 57519613c9..94ccc6ceaf 100644 --- a/src/operations/command.ts +++ b/src/operations/command.ts @@ -166,7 +166,6 @@ export abstract class CommandOperation extends AbstractOperation { cmd = decorateWithExplain(cmd, this.explain); } - console.log(options); return await server.command(this.ns, cmd, options, responseType); } } diff --git a/src/operations/execute_operation.ts b/src/operations/execute_operation.ts index 919e376f3d..ec7c233eec 100644 --- a/src/operations/execute_operation.ts +++ b/src/operations/execute_operation.ts @@ -230,6 +230,10 @@ async function tryOperation< }); } + if (operation.hasAspect(Aspect.COMMAND_BATCHING) && !operation.canRetryWrite) { + throw previousOperationError; + } + if (hasWriteAspect && !isRetryableWriteError(previousOperationError)) throw previousOperationError; From df7d4aacbb2a098593feea4b49fddec867065026 Mon Sep 17 00:00:00 2001 From: Durran Jordan Date: Wed, 9 Oct 2024 16:47:47 +0200 Subject: [PATCH 27/29] test: run all tests --- test/integration/retryable-writes/retryable_writes.spec.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/integration/retryable-writes/retryable_writes.spec.test.ts b/test/integration/retryable-writes/retryable_writes.spec.test.ts index 169304f74b..87e8c1edc9 100644 --- a/test/integration/retryable-writes/retryable_writes.spec.test.ts +++ b/test/integration/retryable-writes/retryable_writes.spec.test.ts @@ -3,6 +3,6 @@ import * as path from 'path'; import { loadSpecTests } from '../../spec'; import { runUnifiedSuite } from '../../tools/unified-spec-runner/runner'; -describe.only('Retryable Writes (unified)', function () { +describe('Retryable Writes (unified)', function () { runUnifiedSuite(loadSpecTests(path.join('retryable-writes', 'unified'))); }); From 7f959744f651fbc7cf8bfc5e903e33b0a0f55fcb Mon Sep 17 00:00:00 2001 From: Durran Jordan Date: Wed, 9 Oct 2024 23:01:10 +0200 Subject: [PATCH 28/29] chore: comments --- src/operations/client_bulk_write/results_merger.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/operations/client_bulk_write/results_merger.ts b/src/operations/client_bulk_write/results_merger.ts index 3824ae2a38..8114523fde 100644 --- a/src/operations/client_bulk_write/results_merger.ts +++ b/src/operations/client_bulk_write/results_merger.ts @@ -133,7 +133,7 @@ export class ClientBulkWriteResultsMerger { } /** - * Process an invididual document in the results. + * Process an individual document in the results. * @param cursor - The cursor. * @param document - The document to process. */ From f8e5c1f7ef6073a14318f11b7cacd848e3d0731e Mon Sep 17 00:00:00 2001 From: Durran Jordan Date: Thu, 10 Oct 2024 16:41:08 +0200 Subject: [PATCH 29/29] chore: add cause to invalid argument error --- src/error.ts | 4 ++-- src/operations/client_bulk_write/command_builder.ts | 12 ++++-------- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/src/error.ts b/src/error.ts index 0e192755d6..a917838948 100644 --- a/src/error.ts +++ b/src/error.ts @@ -1089,8 +1089,8 @@ export class MongoInvalidArgumentError extends MongoAPIError { * * @public **/ - constructor(message: string) { - super(message); + constructor(message: string, options?: { cause?: Error }) { + super(message, options); } override get name(): string { diff --git a/src/operations/client_bulk_write/command_builder.ts b/src/operations/client_bulk_write/command_builder.ts index da49cfe894..f85a91b16b 100644 --- a/src/operations/client_bulk_write/command_builder.ts +++ b/src/operations/client_bulk_write/command_builder.ts @@ -131,10 +131,8 @@ export class ClientBulkWriteCommandBuilder { let operationBuffer; try { operationBuffer = BSON.serialize(operation); - } catch (error) { - throw new MongoInvalidArgumentError( - `Could not serialize operation to BSON: ${error.message}.` - ); + } catch (cause) { + throw new MongoInvalidArgumentError(`Could not serialize operation to BSON`, { cause }); } validateBufferSize('ops', operationBuffer, maxBsonObjectSize); @@ -166,10 +164,8 @@ export class ClientBulkWriteCommandBuilder { try { nsInfoBuffer = BSON.serialize(nsInfo); operationBuffer = BSON.serialize(operation); - } catch (error) { - throw new MongoInvalidArgumentError( - `Could not serialize ns info and operation to BSON: ${error.message}.` - ); + } catch (cause) { + throw new MongoInvalidArgumentError(`Could not serialize ns info to BSON`, { cause }); } validateBufferSize('nsInfo', nsInfoBuffer, maxBsonObjectSize);