diff --git a/CSharpDriver.sln b/CSharpDriver.sln
index 35bfba877a6..e3d1b1323cf 100644
--- a/CSharpDriver.sln
+++ b/CSharpDriver.sln
@@ -1,11 +1,17 @@
Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Version 16
-VisualStudioVersion = 16.0.30011.22
+# Visual Studio Version 17
+VisualStudioVersion = 17.0.31919.166
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{D2012971-32BB-4C5F-BFC4-30A9994AB152}"
+ ProjectSection(SolutionItems) = preProject
+ src\Directory.Build.props = src\Directory.Build.props
+ EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{E472BDF5-61F1-461D-872B-9F53BB3ACA80}"
+ ProjectSection(SolutionItems) = preProject
+ tests\BuildProps\Tests.Build.props = tests\BuildProps\Tests.Build.props
+ EndProjectSection
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MongoDB.Bson", "src\MongoDB.Bson\MongoDB.Bson.csproj", "{9FCB42A5-3BC6-492B-8EA0-53EF32E9F8CD}"
EndProject
@@ -48,11 +54,15 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
MongoDBTest.ruleset = MongoDBTest.ruleset
EndProjectSection
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SkippableTests", "tests\SkippableTests\SkippableTests.csproj", "{D198833A-6AC3-4327-8B02-5095455192D0}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MongoDB.Driver.TestConsoleApplication", "tests\MongoDB.Driver.TestConsoleApplication\MongoDB.Driver.TestConsoleApplication.csproj", "{2E5780D2-29A5-483C-9CA2-844F45A66D0C}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AstrolabeWorkloadExecutor", "tests\AstrolabeWorkloadExecutor\AstrolabeWorkloadExecutor.csproj", "{B90F025F-89D3-436A-AD78-6AA304A6E240}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MongoDB.Driver.SmokeTests.Sdk", "tests\SmokeTests\MongoDB.Driver.SmokeTests.Sdk\MongoDB.Driver.SmokeTests.Sdk.csproj", "{B711A69F-A337-452C-95E1-A6B15C727CBA}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MongoDB.Driver.TestConsoleApplication", "tests\MongoDB.Driver.TestConsoleApplication\MongoDB.Driver.TestConsoleApplication.csproj", "{2E5780D2-29A5-483C-9CA2-844F45A66D0C}"
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SmokeTests", "SmokeTests", "{F64BF86A-1EF1-4596-84A6-6B4AB766CD77}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AstrolabeWorkloadExecutor", "tests\AstrolabeWorkloadExecutor\AstrolabeWorkloadExecutor.csproj", "{B90F025F-89D3-436A-AD78-6AA304A6E240}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MongoDB.TestHelpers", "tests\MongoDB.TestHelpers\MongoDB.TestHelpers.csproj", "{DF888021-744F-4A8B-9324-831DEFC48AB8}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -124,10 +134,6 @@ Global
{7A015030-6329-4FAD-B6E3-CED5ED53019C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7A015030-6329-4FAD-B6E3-CED5ED53019C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7A015030-6329-4FAD-B6E3-CED5ED53019C}.Release|Any CPU.Build.0 = Release|Any CPU
- {D198833A-6AC3-4327-8B02-5095455192D0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {D198833A-6AC3-4327-8B02-5095455192D0}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {D198833A-6AC3-4327-8B02-5095455192D0}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {D198833A-6AC3-4327-8B02-5095455192D0}.Release|Any CPU.Build.0 = Release|Any CPU
{2E5780D2-29A5-483C-9CA2-844F45A66D0C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2E5780D2-29A5-483C-9CA2-844F45A66D0C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2E5780D2-29A5-483C-9CA2-844F45A66D0C}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -136,6 +142,14 @@ Global
{B90F025F-89D3-436A-AD78-6AA304A6E240}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B90F025F-89D3-436A-AD78-6AA304A6E240}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B90F025F-89D3-436A-AD78-6AA304A6E240}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B711A69F-A337-452C-95E1-A6B15C727CBA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {B711A69F-A337-452C-95E1-A6B15C727CBA}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B711A69F-A337-452C-95E1-A6B15C727CBA}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {B711A69F-A337-452C-95E1-A6B15C727CBA}.Release|Any CPU.Build.0 = Release|Any CPU
+ {DF888021-744F-4A8B-9324-831DEFC48AB8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {DF888021-744F-4A8B-9324-831DEFC48AB8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {DF888021-744F-4A8B-9324-831DEFC48AB8}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {DF888021-744F-4A8B-9324-831DEFC48AB8}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -157,9 +171,11 @@ Global
{C50D554C-2771-4CC1-9B2C-BB17FB27F935} = {E472BDF5-61F1-461D-872B-9F53BB3ACA80}
{DAB8DFFD-0020-43B3-9C08-7723F5D68E90} = {E472BDF5-61F1-461D-872B-9F53BB3ACA80}
{7A015030-6329-4FAD-B6E3-CED5ED53019C} = {E472BDF5-61F1-461D-872B-9F53BB3ACA80}
- {D198833A-6AC3-4327-8B02-5095455192D0} = {E472BDF5-61F1-461D-872B-9F53BB3ACA80}
{2E5780D2-29A5-483C-9CA2-844F45A66D0C} = {E472BDF5-61F1-461D-872B-9F53BB3ACA80}
{B90F025F-89D3-436A-AD78-6AA304A6E240} = {E472BDF5-61F1-461D-872B-9F53BB3ACA80}
+ {B711A69F-A337-452C-95E1-A6B15C727CBA} = {F64BF86A-1EF1-4596-84A6-6B4AB766CD77}
+ {F64BF86A-1EF1-4596-84A6-6B4AB766CD77} = {E472BDF5-61F1-461D-872B-9F53BB3ACA80}
+ {DF888021-744F-4A8B-9324-831DEFC48AB8} = {E472BDF5-61F1-461D-872B-9F53BB3ACA80}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {24BEC44B-92B0-43AA-9B15-163459D0C098}
diff --git a/Docs/landing/data/releases.toml b/Docs/landing/data/releases.toml
index be04efff8e9..4e084a14f22 100644
--- a/Docs/landing/data/releases.toml
+++ b/Docs/landing/data/releases.toml
@@ -1,8 +1,13 @@
-current = "2.17.0"
+current = "2.18.0"
[[versions]]
- version = "2.17.0"
+ version = "2.18.0"
status = "current"
+ docs = "./2.18/"
+ api = "./2.18/apidocs"
+
+[[versions]]
+ version = "2.17.1"
docs = "./2.17/"
api = "./2.17/apidocs"
@@ -101,32 +106,32 @@ current = "2.17.0"
package = "MongoDB.Driver"
description = "The driver."
dependencies = ".NET Core Driver,.NET BSON Library"
- versions = "2.15.0,2.14.1,2.13.2,2.12.4,2.11.6,2.10.4,2.9.3,2.8.1,2.7.3,2.6.1,2.5.1,2.4.4,2.3.0,2.2.4,2.1.1,2.0.2"
+ versions = "2.18.0,2.17.1,2.16.1,2.15.1,2.14.1,2.13.3,2.12.5,2.11.6,2.10.4,2.9.3,2.8.1,2.7.3,2.6.1,2.5.1,2.4.4,2.3.0,2.2.4,2.1.1,2.0.2"
[[drivers]]
name = ".NET GridFS"
package = "MongoDB.Driver.GridFS"
description = "The GridFS library."
dependencies = ".NET Driver,.NET Core Driver,.NET BSON Library"
- versions = "2.15.0,2.14.1,2.13.2,2.12.4,2.11.6,2.10.4,2.9.3,2.8.1,2.7.3,2.6.1,2.5.1,2.4.4,2.3.0,2.2.4,2.1.1"
+ versions = "2.18.0,2.17.1,2.16.1,2.15.1,2.14.1,2.13.3,2.12.5,2.11.6,2.10.4,2.9.3,2.8.1,2.7.3,2.6.1,2.5.1,2.4.4,2.3.0,2.2.4,2.1.1"
[[drivers]]
name = ".NET Core Driver"
package = "MongoDB.Driver.Core"
description = "The core driver."
dependencies = ".NET BSON Library"
- versions = "2.15.0,2.14.1,2.13.2,2.12.4,2.11.6,2.10.4,2.9.3,2.8.1,2.7.3,2.6.1,2.5.1,2.4.4,2.3.0,2.2.4,2.1.1,2.0.2"
+ versions = "2.18.0,2.17.1,2.16.1,2.15.1,2.14.1,2.13.3,2.12.5,2.11.6,2.10.4,2.9.3,2.8.1,2.7.3,2.6.1,2.5.1,2.4.4,2.3.0,2.2.4,2.1.1,2.0.2"
[[drivers]]
name = ".NET BSON Library"
package = "MongoDB.Bson"
description = "The BSON library."
dependencies = ""
- versions = "2.15.0,2.14.1,2.13.2,2.12.4,2.11.6,2.10.4,2.9.3,2.8.1,2.7.3,2.6.1,2.5.1,2.4.4,2.3.0,2.2.4,2.1.1,2.0.2"
+ versions = "2.18.0,2.17.1,2.16.1,2.15.1,2.14.1,2.13.3,2.12.5,2.11.6,2.10.4,2.9.3,2.8.1,2.7.3,2.6.1,2.5.1,2.4.4,2.3.0,2.2.4,2.1.1,2.0.2"
[[drivers]]
name = ".NET Legacy Driver"
package = "mongocsharpdriver"
description = "The legacy driver."
dependencies = ".NET Driver,.NET Core Driver,.NET BSON Library"
- versions = "2.15.0,2.14.1,2.13.2,2.12.4,2.11.6,2.10.4,2.9.3,2.8.1,2.7.3,2.6.1,2.5.1,2.4.4,2.3.0,2.2.4,2.1.1,2.0.2,1.11"
+ versions = "2.18.0,2.17.1,2.16.1,2.15.1,2.14.1,2.13.3,2.12.5,2.11.6,2.10.4,2.9.3,2.8.1,2.7.3,2.6.1,2.5.1,2.4.4,2.3.0,2.2.4,2.1.1,2.0.2,1.11"
diff --git a/Docs/landing/static/versions.json b/Docs/landing/static/versions.json
index 994c7c0fdfd..ff94c86a683 100644
--- a/Docs/landing/static/versions.json
+++ b/Docs/landing/static/versions.json
@@ -1,4 +1,5 @@
[
+ {"version": "2.18"},
{"version": "2.17"},
{"version": "2.16"},
{"version": "2.15"},
diff --git a/Docs/reference/config.toml b/Docs/reference/config.toml
index cdd54d2e522..6e4e06c78c5 100644
--- a/Docs/reference/config.toml
+++ b/Docs/reference/config.toml
@@ -1,4 +1,4 @@
-baseurl = "/mongo-csharp-driver/2.17"
+baseurl = "/mongo-csharp-driver/2.18"
languageCode = "en-us"
title = "MongoDB .NET Driver"
theme = "mongodb"
diff --git a/Docs/reference/content/index.md b/Docs/reference/content/index.md
index bfd81d6cfa6..a21d71b973e 100644
--- a/Docs/reference/content/index.md
+++ b/Docs/reference/content/index.md
@@ -9,7 +9,7 @@ type = "index"
The [Getting Started]({{< relref "getting_started\index.md" >}}) guide contains information about system requirements, installation, and a simple tutorial to get up and running quickly.
-## What's new in 2.17.0
+## What's new in 2.18.0
The [What's New]({{< relref "what_is_new.md" >}}) section contains the major new features of the driver.
diff --git a/Docs/reference/content/reference/driver/crud/linq3.md b/Docs/reference/content/reference/driver/crud/linq3.md
index bb4a1d2a44e..37b554fa31d 100644
--- a/Docs/reference/content/reference/driver/crud/linq3.md
+++ b/Docs/reference/content/reference/driver/crud/linq3.md
@@ -11,19 +11,21 @@ title = "LINQ3"
## LINQ3
-We have implemented a new LINQ provider, which is known as LINQ3. The current LINQ provider is known as LINQ2 (and LINQ1 is the now-obsolete LINQ provider in the v1.x releases of the driver).
+We have implemented a new LINQ provider, which is known as LINQ3. The previous LINQ provider is known as LINQ2 (and LINQ1 is the now-obsolete LINQ provider in the v1.x releases of the driver).
-While we fully transition to the new LINQ provider the two LINQ providers will exist side by side. LINQ2 will continue to be the default LINQ provider for the time being.
+While we fully transition to the new LINQ provider the two LINQ providers will exist side by side. Starting with 2.19.0, LINQ3 is the default LINQ provider.
-LINQ3 is production-ready. It fixes many LINQ2 bugs and offers support for a variety of new aggregation pipeline features present in newer server versions. We encourage all users to switch to LINQ3 and report any issues encountered. The [MongoDB Analyzer](https://www.mongodb.com/docs/mongodb-analyzer/current/) will provide tooltips indicating whether a particular query is supported in LINQ2, LINQ3, or both.
+LINQ3 is production-ready. It fixes many LINQ2 bugs and offers support for a variety of new aggregation pipeline features present in newer server versions. The [MongoDB Analyzer](https://www.mongodb.com/docs/mongodb-analyzer/current/) will provide tooltips indicating whether a particular query is supported in LINQ2, LINQ3, or both.
-You can opt into the new LINQ3 provider by configuring your `MongoClient` to use the new LINQ provider as follows:
+If you encounter a problem with LINQ3, you can switch back the LINQ2 provider by configuring your `MongoClient` to use the previous LINQ provider as follows:
```csharp
var connectionString = "mongodb://localhost";
var clientSettings = MongoClientSettings.FromConnectionString(connectionString);
-clientSettings.LinqProvider = LinqProvider.V3;
+clientSettings.LinqProvider = LinqProvider.V2;
var client = new MongoClient(clientSettings);
```
The LINQ provider is only configurable at the `MongoClient` level. All LINQ queries run with a particular `MongoClient` use the same LINQ provider.
+
+If you do encounter a query that works in LINQ2 but fails in LINQ3, please file a [CSHARP ticket](https://jira.mongodb.org/browse/CSHARP) with a self-contained reproduction of the problem so that we can investigate and fix the issue.
diff --git a/Docs/reference/content/reference/driver/index.md b/Docs/reference/content/reference/driver/index.md
index 27a59e88c65..1581a8245c7 100644
--- a/Docs/reference/content/reference/driver/index.md
+++ b/Docs/reference/content/reference/driver/index.md
@@ -19,4 +19,5 @@ The MongoDB .NET Driver is mostly just a wrapper around [MongoDB.Driver.Core]({{
- [Administration]({{< relref "reference\driver\admin.md" >}})
- [Definitions and Builders]({{< relref "reference\driver\definitions.md" >}})
- [CRUD Operations]({{< relref "reference\driver\crud\index.md" >}})
-- [Error Handling]({{< relref "reference\driver\error_handling.md" >}})
\ No newline at end of file
+- [Error Handling]({{< relref "reference\driver\error_handling.md" >}})
+- [Logging]({{< relref "reference\driver\logging.md" >}})
\ No newline at end of file
diff --git a/Docs/reference/content/reference/driver/logging.md b/Docs/reference/content/reference/driver/logging.md
new file mode 100644
index 00000000000..1d6c7384a88
--- /dev/null
+++ b/Docs/reference/content/reference/driver/logging.md
@@ -0,0 +1,75 @@
++++
+date = "2022-11-22T15:36:56Z"
+draft = false
+title = "Logging"
+[menu.main]
+ parent = "Driver"
+ identifier = "Logging"
+ weight = 10
+ pre = " "
++++
+
+## Logging
+
+Starting in version 2.18, the .NET/C# driver uses the standard [.NET logging API](https://learn.microsoft.com/en-us/dotnet/core/extensions/logging?tabs=command-line). The [MongoDB logging specification](https://github.com/mongodb/specifications/blob/master/source/logging/logging.rst) defines the components, structure, and verbosity of the logs. On this page, you can learn how to set up and configure logging for your application.
+
+You can configure logging using the [`LoggingSettings`]({{< apiref "T_MongoDB_Driver_Core_Configuration_LoggingSettings" >}}). ```LoggingSettings``` contains the following properties:
+
+|Property|Description|
+|--------|-----------|
+|LoggerFactory|The [ILoggerFactory](https://learn.microsoft.com/en-us/dotnet/api/microsoft.extensions.logging.iloggerfactory?view=dotnet-plat-ext-6.0) object that will create an [ILogger](https://learn.microsoft.com/en-us/dotnet/api/microsoft.extensions.logging.ilogger?view=dotnet-plat-ext-6.0). **Data Type:** ILoggerFactory **Default:** null |
+|MaxDocumentSize|Maximum number of characters for extended JSON documents in logged messages For example, when the driver logs the [CommandStarted](https://github.com/mongodb/specifications/blob/master/source/command-logging-and-monitoring/command-logging-and-monitoring.rst#command-started-message) event, it truncates the Command field to the specified character limit. **Data Type:** int **Default:** 1000|
+
+
+The following code example creates a MongoClient that logs debug messages to the console. To do so, the code performs the following steps:
+
+- Creates a LoggerFactory, which specifies the logging destination and level
+- Creates a LoggingSettings object, passing the LoggerFactory object as a parameter to the constructor
+- Creates a MongoClient object, passing the LoggingSettings object as a parameter to the constructor
+
+
+```csharp
+ using var loggerFactory = LoggerFactory.Create(b =>
+ {
+ b.AddSimpleConsole();
+ b.SetMinimumLevel(LogLevel.Debug);
+ });
+
+ var settings = MongoClientSettings.FromConnectionString(...);
+ settings.LoggingSettings = new LoggingSettings(loggerFactory);
+ var client = new MongoClient(settings);
+```
+.NET/C# driver log category naming:
+
+|Property|Description|
+|--------|-----------|
+|MongoDB.Command|command|
+|MongoDB.SDAM|topology|
+|MongoDB.ServerSelection|serverSelection|
+|MongoDB.Connection|connection|
+|MongoDB.Internal.*|Prefix for all .NET/C# Driver internal components not described by spec|
+
+
+How to configure log categories verbosity example:
+
+```csharp
+var categoriesConfiguration = new Dictionary
+{
+ // Output all logs from all categories with Error and higher level
+ { "LogLevel:Default", "Error" },
+ // Output SDAM logs with Debug and higher level
+ { "LogLevel:MongoDB.SDAM", "Debug" }
+};
+var config = new ConfigurationBuilder()
+ .AddInMemoryCollection(categoriesConfiguration)
+ .Build();
+using var loggerFactory = LoggerFactory.Create(b =>
+{
+ b.AddConfiguration(config);
+ b.AddSimpleConsole();
+});
+
+var settings = MongoClientSettings.FromConnectionString("mongodb://localhost:27017");
+settings.LoggingSettings = new LoggingSettings(loggerFactory);
+var client = new MongoClient(settings);
+```
diff --git a/Docs/reference/content/reference/driver_core/index.md b/Docs/reference/content/reference/driver_core/index.md
index eb1535c617f..942ed5251b6 100644
--- a/Docs/reference/content/reference/driver_core/index.md
+++ b/Docs/reference/content/reference/driver_core/index.md
@@ -23,7 +23,13 @@ Connection pooling is provided for every server that is discovered. There are a
### Server Monitoring
-Each server that is discovered is monitored. By default, this monitoring happens every 10 seconds and consists of a `{ hello: 1 }` (or legacy hello) call followed by a `{ buildInfo: 1 }` call. When servers go down, the frequency of these calls will be increased to 500 milliseconds. See the [Server Discovery and Monitoring Specification](https://github.com/mongodb/specifications/blob/master/source/server-discovery-and-monitoring/server-discovery-and-monitoring-summary.rst) for more information.
+Each server that is discovered is monitored.
+
+MongoDB 4.4 or later: The `MongoClient` establishes an exhaust cursor to each discovered cluster node using `{ hello: 1 }` (or legacy hello). Cluster nodes push topology updates to `MongoClient`.
+
+MongoDB 4.2 or ealier: The `MongoClient` polls each discovered cluster node every [heartbeatFrequencyMS](https://www.mongodb.com/docs/manual/reference/connection-string/#mongodb-urioption-urioption.heartbeatFrequencyMS) (default 10 seconds, MongoDB Atlas 5 seconds) using `{ hello: 1 }` (or legacy hello).
+
+When servers go down, the frequency of these calls will be increased to 500 milliseconds. See the [Server Discovery and Monitoring Specification](https://github.com/mongodb/specifications/blob/master/source/server-discovery-and-monitoring/server-discovery-and-monitoring-summary.rst) for more information.
### Server Selection
diff --git a/Docs/reference/content/what_is_new.md b/Docs/reference/content/what_is_new.md
index 3bd4f87ec02..8923e4056bc 100644
--- a/Docs/reference/content/what_is_new.md
+++ b/Docs/reference/content/what_is_new.md
@@ -8,6 +8,16 @@ title = "What's New"
pre = " "
+++
+## What's New in 2.18.0
+
+The main new features in 2.18.0 include:
+
+* Snappy compression now uses a managed implementation
+* ZStandard compression now uses a managed implementation
+* Cache AWS credentials when possible
+* New cross driver standard logging support
+* Support for $documents aggregation pipeline stage
+
## What's New in 2.17.0
The main new features in 2.17.0 include:
diff --git a/Docs/reference/data/mongodb.toml b/Docs/reference/data/mongodb.toml
index 294417bd4a5..81c464384e8 100644
--- a/Docs/reference/data/mongodb.toml
+++ b/Docs/reference/data/mongodb.toml
@@ -1,5 +1,5 @@
githubRepo = "mongo-csharp-driver"
githubBranch = "master"
-currentVersion = "2.17"
+currentVersion = "2.18"
highlightTheme = "idea.css"
apiUrl = "apidocs/html"
diff --git a/Docs/reference/themes/mongodb/static/css/overrides.css b/Docs/reference/themes/mongodb/static/css/overrides.css
index bd7f42e083e..abbec57aa0d 100644
--- a/Docs/reference/themes/mongodb/static/css/overrides.css
+++ b/Docs/reference/themes/mongodb/static/css/overrides.css
@@ -115,3 +115,26 @@ a code {
.jsEnabled #search {
visibility: visible;
}
+
+@media print {
+ a[href]:after {
+ content: none !important;
+ }
+
+ .edit-link,
+ .sidebar,
+ .toggle-nav,
+ #header-db .nav-items {
+ display: none !important;
+ }
+
+ #header-db {
+ position: inherit !important;
+ }
+
+ .content .main-column {
+ margin-top: 0 !important;
+ margin-left: 0 !important;
+ width: 100% !important;
+ }
+}
diff --git a/GitVersion.yml b/GitVersion.yml
index 38136914e22..803f209c029 100644
--- a/GitVersion.yml
+++ b/GitVersion.yml
@@ -1 +1 @@
-next-version: 2.17.0
+next-version: 2.18.1
diff --git a/README.md b/README.md
index acb1c633066..49be990ff30 100644
--- a/README.md
+++ b/README.md
@@ -87,6 +87,7 @@ Please see our [guidelines](CONTRIBUTING.md) for contributing to the driver.
* Bar Arnon https://github.com/I3arnon
* Wan Bachtiar https://github.com/sindbach
* Mark Benvenuto https://github.com/markbenvenuto
+* Brian Buvinghausen https://github.com/buvinghausen
* Bit Diffusion Limited code@bitdiff.com
* Jimmy Bogard https://github.com/jbogard
* Ross Buggins https://github.com/rbugginsvia
@@ -105,12 +106,15 @@ Please see our [guidelines](CONTRIBUTING.md) for contributing to the driver.
* Ken Egozi mail@kenegozi.com
* Alexander Endris https://github.com/AlexEndris
* Daniel Goldman daniel@stackwave.com
+* David Golub https://github.com/dgolub
* Simon Green simon@captaincodeman.com
* Bouke Haarsma https://github.com/Bouke
* James Hadwen james.hadwen@sociustec.com
* Nuri Halperin https://github.com/nurih
+* Daniel Hegener daniel.hegener@fisglobal.com
* Nikola Irinchev https://github.com/nirinchev
* Jacob Jewell jacobjewell@eflexsystems.com
+* Vincent Kam https://github.com/vincentkam
* Danny Kendrick https://github.com/dkendrick
* Ruslan Khasanbaev https://github.com/flaksirus
* Konstantin Khitrykh https://github.com/KonH
@@ -123,6 +127,7 @@ Please see our [guidelines](CONTRIBUTING.md) for contributing to the driver.
* Maksim Krautsou https://github.com/MaKCbIMKo
* Richard Kreuter richard@10gen.com
* Daniel Lee https://github.com/dlee148
+* Ming Yau Lee https://github.com/mingyaulee
* Kevin Lewis kevin.l.lewis@gmail.com
* Dow Liu redforks@gmail.com
* Chuck Lu https://github.com/chucklu
@@ -133,6 +138,7 @@ Please see our [guidelines](CONTRIBUTING.md) for contributing to the driver.
* Alexander Nagy optimiz3@gmail.com
* Sridhar Nanjundeswaran https://github.com/sridharn
* Nathan https://github.com/terakilobyte
+* Adelin Owona https://github.com/adelinowona
* Rachelle Palmer https://github.com/techbelle
* Rich Quackenbush rich.quackenbush@captiveaire.com
* Carl Reinke https://github.com/mindless2112
@@ -142,19 +148,19 @@ Please see our [guidelines](CONTRIBUTING.md) for contributing to the driver.
* Ed Rooth edward.rooth@wallstreetjapan.com
* Katie Sadoff https://github.com/ksadoff
* Sam558 https://github.com/Sam558
+* Vladimir Setyaev setyaev_v@pgstudio.io
* Sergey Shushlyapin https://github.com/sergeyshushlyapin
* Alexey Skalozub pieceofsummer@gmail.com
* Kevin Smith https://github.com/kevbite
* Pete Smith roysvork@gmail.com
+* Matteo Spreafico https://github.com/MatteoSp
* staywellandy https://github.com/staywellandy
* Vyacheslav Stroy https://github.com/kreig
* Jake Sta. Teresa https://github.com/JakeStaTeresa
* Testo test1@doramail.com
* TimTim https://github.com/wegylexy
+* Craig Wilson https://github.com/craiggwilson
* Zhmayev Yaroslav https://github.com/salaros
* Aristarkh Zagorodnikov https://github.com/onyxmaster
-* Vincent Kam https://github.com/vincentkam
-* Craig Wilson https://github.com/craiggwilson
-* Ming Yau Lee https://github.com/mingyaulee
If you have contributed and we have neglected to add you to this list please contact one of the maintainers to be added to the list (with apologies).
diff --git a/Release Notes/Release Notes v2.17.1.md b/Release Notes/Release Notes v2.17.1.md
new file mode 100644
index 00000000000..5a075043840
--- /dev/null
+++ b/Release Notes/Release Notes v2.17.1.md
@@ -0,0 +1,27 @@
+# .NET Driver Version 2.17.1 Release Notes
+
+This is a patch release that fixes a potential data corruption bug in `RewrapManyDataKey` when rotating encrypted data encryption keys backed by GCP or Azure key services.
+
+The following conditions will trigger this bug:
+
+- A GCP-backed or Azure-backed data encryption key being rewrapped requires fetching an access token for decryption of the data encryption key.
+
+The result of this bug is that the key material for all data encryption keys being rewrapped is replaced by new randomly generated material, destroying the original key material.
+
+To mitigate potential data corruption, upgrade to this version or higher before using `RewrapManyDataKey` to rotate Azure-backed or GCP-backed data encryption keys. A backup of the key vault collection should **always** be taken before key rotation.
+
+An online version of these release notes is available at:
+
+https://github.com/mongodb/mongo-csharp-driver/blob/master/Release%20Notes/Release%20Notes%20v2.17.1.md
+
+The list of JIRA tickets resolved in this release is available at:
+
+https://jira.mongodb.org/issues/?jql=project%20%3D%20CSHARP%20AND%20fixVersion%20%3D%202.17.1%20ORDER%20BY%20key%20ASC
+
+Documentation on the .NET driver can be found at:
+
+http://mongodb.github.io/mongo-csharp-driver/
+
+## Upgrading
+
+There are no known backwards breaking changes in this release.
diff --git a/Release Notes/Release Notes v2.18.0.md b/Release Notes/Release Notes v2.18.0.md
new file mode 100644
index 00000000000..88b96dceb9f
--- /dev/null
+++ b/Release Notes/Release Notes v2.18.0.md
@@ -0,0 +1,23 @@
+# .NET Driver Version 2.18.0 Release Notes
+
+This is the general availability release for the 2.18.0 version of the driver.
+
+The main new features in 2.18.0 include:
+
+* Snappy compression now uses a managed implementation
+* ZStandard compression now uses a managed implementation
+* Cache AWS credentials when possible
+* New cross driver standard logging support
+* Support for $documents aggregation pipeline stage
+
+An online version of these release notes is available at:
+
+https://github.com/mongodb/mongo-csharp-driver/blob/master/Release%20Notes/Release%20Notes%20v2.18.0.md
+
+The full list of JIRA issues resolved in this release is available at:
+
+https://jira.mongodb.org/issues/?jql=project%20%3D%20CSHARP%20AND%20fixVersion%20%3D%202.18.0%20ORDER%20BY%20key%20ASC
+
+Documentation on the .NET driver can be found at:
+
+https://mongodb.github.io/mongo-csharp-driver/
diff --git a/Release Notes/Release Notes v2.18.1.md b/Release Notes/Release Notes v2.18.1.md
new file mode 100644
index 00000000000..2ba8bf27a25
--- /dev/null
+++ b/Release Notes/Release Notes v2.18.1.md
@@ -0,0 +1,19 @@
+# .NET Driver Version 2.18.1 Release Notes
+
+This is a patch release that addresses some issues reported since 2.18.0 was released.
+
+The main new features in 2.18.1 include:
+
+* TODO
+
+An online version of these release notes is available at:
+
+https://github.com/mongodb/mongo-csharp-driver/blob/master/Release%20Notes/Release%20Notes%20v2.18.1.md
+
+The full list of JIRA issues resolved in this release is available at:
+
+https://jira.mongodb.org/issues/?jql=project%20%3D%20CSHARP%20AND%20fixVersion%20%3D%202.18.1%20ORDER%20BY%20key%20ASC
+
+Documentation on the .NET driver can be found at:
+
+https://mongodb.github.io/mongo-csharp-driver/
diff --git a/Release Notes/Release Notes v2.19.0.md b/Release Notes/Release Notes v2.19.0.md
new file mode 100644
index 00000000000..107be22d3c1
--- /dev/null
+++ b/Release Notes/Release Notes v2.19.0.md
@@ -0,0 +1,45 @@
+# .NET Driver Version 2.19.0 Release Notes
+
+This is the general availability release for the 2.19.0 version of the driver.
+
+The main new features in 2.19.0 include:
+
+* Atlas Search builders
+* Default LinqProvider changed to LINQ3
+* Support for Range Indexes preview
+* ObjectSerializer allowed types configuration
+* Bucket and BucketAuto stages support in LINQ3
+* Support Azure VM-assigned Managed Identity for Automatic KMS Credentials
+* Native support for AWS IAM Roles
+
+### ObjectSerializer allowed types configuration
+
+The `ObjectSerializer` has been changed to only allow deserialization of types that are considered safe.
+What types are considered safe is determined by a new configurable `AllowedTypes` function (of type `Func`).
+The default `AllowedTypes` function is `ObjectSerializer.DefaultAllowedTypes` which returns true for a number of well-known framework types that we have deemed safe.
+A typical example might be to allow all the default allowed types as well as your own types. This could be accomplished as follows:
+
+```
+var objectSerializer = new ObjectSerializer(type => ObjectSerializer.DefaultAllowedTypes(type) || type.FullName.StartsWith("MyNamespace"));
+BsonSerializer.RegisterSerializer(objectSerializer);
+```
+
+More information about the `ObjectSerializer` is available in [our FAQ](https://www.mongodb.com/docs/drivers/csharp/v2.19/faq).
+
+### Default LinqProvider changed to LINQ3
+Default LinqProvider has been changed to LINQ3.
+LinqProvider can be changed back to LINQ2 in the following way:
+
+```
+var connectionString = "mongodb://localhost";
+var clientSettings = MongoClientSettings.FromConnectionString(connectionString);
+clientSettings.LinqProvider = LinqProvider.V2;
+var client = new MongoClient(clientSettings);
+```
+If you encounter a bug in LINQ3 provider, please report it in [CSHARP JIRA project](https://jira.mongodb.org/projects/CSHARP/issues).
+
+An online version of these release notes is available [here](https://github.com/mongodb/mongo-csharp-driver/blob/master/Release%20Notes/Release%20Notes%20v2.19.0.md).
+
+The full list of issues resolved in this release is available at [CSHARP JIRA project](https://jira.mongodb.org/issues/?jql=project%20%3D%20CSHARP%20AND%20fixVersion%20%3D%202.19.0%20ORDER%20BY%20key%20ASC).
+
+Documentation on the .NET driver can be found [here](https://www.mongodb.com/docs/drivers/csharp/v2.19/).
diff --git a/THIRD-PARTY-NOTICES b/THIRD-PARTY-NOTICES
index fb8b422e3d2..38ef8013836 100644
--- a/THIRD-PARTY-NOTICES
+++ b/THIRD-PARTY-NOTICES
@@ -2,9 +2,9 @@ The MongoDB .NET Driver uses third-party libraries or other resources that may
be distributed under licenses different than the MongoDB .NET Driver software.
In the event that we accidentally failed to list a required notice,
-please bring it to our attention through any of the ways detailed here:
+please bring it to our attention by opening a JIRA ticket in our issue tracker:
- mongodb-dev@googlegroups.com
+ https://jira.mongodb.org/browse/CSHARP
The attached notices are provided for information only.
@@ -85,79 +85,4 @@ https://github.com/mongodb/mongo-csharp-driver.
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
- limitations under the License.
-
-3. The following files: Snappy32NativeMethods.cs, Snappy64NativeMethods.cs, SnappyCodec.cs, SnappyStatus.cs, SnappyNativeTests.cs
-
- Original work:
- Copyright (c) 2016 - David Rouyer rouyer.david@gmail.com Copyright (c) 2011 - 2014 Robert Važan, Google Inc.
-
- Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
-
- * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
-
- * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution.
-
- * Neither the name of Robert Važan nor the names of contributors may be used to endorse or promote products derived from this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
- Modified work:
- Copyright 2020–present MongoDB Inc.
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
-4. The following files: NativeBufferInfo.cs, Zstandard64NativeMethods.cs, ZstandardNativeWrapper.cs, ZstandardStream.cs
-
- Original work:
- Copyright (c) 2016-present, Facebook, Inc. All rights reserved.
-
- Redistribution and use in source and binary forms, with or without modification,
- are permitted provided that the following conditions are met:
-
- * Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
-
- * Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
-
- * Neither the name Facebook nor the names of its contributors may be used to
- endorse or promote products derived from this software without specific
- prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
- Modified work:
- Copyright 2020–present MongoDB Inc.
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
limitations under the License.
\ No newline at end of file
diff --git a/build.cake b/build.cake
index de3418c7c7d..eb277fe4fe0 100644
--- a/build.cake
+++ b/build.cake
@@ -1,13 +1,15 @@
-#addin nuget:?package=Cake.FileHelpers&version=4.0.1
-#addin nuget:?package=Cake.Git&version=1.0.1
-#addin nuget:?package=Cake.Incubator&version=6.0.0
-#tool dotnet:?package=GitVersion.Tool&version=5.6.9
-#tool nuget:?package=JunitXml.TestLogger&version=3.0.98
+#addin nuget:?package=Cake.FileHelpers&version=5.0.0
+#addin nuget:?package=Cake.Git&version=2.0.0
+#addin nuget:?package=Cake.Incubator&version=7.0.0
+#tool dotnet:?package=GitVersion.Tool&version=5.10.3
+#tool nuget:?package=JunitXml.TestLogger&version=3.0.114
using System;
-using System.Text.RegularExpressions;
using System.Linq;
-using Cake.Common.Tools.DotNetCore.DotNetCoreVerbosity;
+using System.Runtime.InteropServices;
+using System.Text.RegularExpressions;
+using Cake.Common.Tools.DotNet.DotNetVerbosity;
+using Architecture = System.Runtime.InteropServices.Architecture;
using Path = Cake.Core.IO.Path;
const string defaultTarget = "Default";
@@ -49,7 +51,6 @@ Task("Default")
Task("Release")
.IsDependentOn("Build")
- .IsDependentOn("Test")
.IsDependentOn("Docs")
.IsDependentOn("Package");
@@ -57,18 +58,18 @@ Task("Restore")
.Does(() =>
{
// disable parallel restore to work around apparent bugs in restore
- var restoreSettings = new DotNetCoreRestoreSettings
+ var restoreSettings = new DotNetRestoreSettings
{
DisableParallel = true
};
- DotNetCoreRestore(solutionFullPath, restoreSettings);
+ DotNetRestore(solutionFullPath, restoreSettings);
});
Task("Build")
.IsDependentOn("Restore")
.Does((buildConfig) =>
{
- var settings = new DotNetCoreBuildSettings
+ var settings = new DotNetBuildSettings
{
NoRestore = true,
Configuration = configuration,
@@ -82,11 +83,11 @@ Task("Build")
if (buildConfig.IsReleaseMode)
{
Console.WriteLine("Build continuousIntegration is enabled");
- settings.MSBuildSettings = new DotNetCoreMSBuildSettings();
+ settings.MSBuildSettings = new DotNetMSBuildSettings();
// configure deterministic build for better compatibility with debug symbols (used in Package/Build tasks). Affects: *.nupkg
settings.MSBuildSettings.SetContinuousIntegrationBuild(continuousIntegrationBuild: true);
}
- DotNetCoreBuild(solutionFullPath, settings);
+ DotNetBuild(solutionFullPath, settings);
});
Task("BuildArtifacts")
@@ -113,7 +114,9 @@ Task("BuildArtifacts")
// add additional files needed by Sandcastle
if (targetFramework == "net472" && project == "MongoDB.Driver.Core")
{
+ fileNames.Add("AWSSDK.Core.dll");
fileNames.Add("DnsClient.dll");
+ fileNames.Add("Microsoft.Extensions.Logging.Abstractions.dll");
fileNames.Add("MongoDB.Libmongocrypt.dll");
fileNames.Add("SharpCompress.dll");
}
@@ -161,71 +164,37 @@ Task("Test")
Console.WriteLine($"MONGO_X509_CLIENT_CERTIFICATE_PASSWORD={mongoX509ClientCertificatePassword}");
}
- var settings = new DotNetCoreTestSettings
- {
- NoBuild = true,
- NoRestore = true,
- Configuration = configuration,
- Loggers = CreateLoggers(),
- ArgumentCustomization = args => args.Append("-- RunConfiguration.TargetPlatform=x64"),
- Framework = buildConfig.Framework
- };
-
- DotNetCoreTest(
- testProject.FullPath,
- settings
- );
+ RunTests(buildConfig, testProject);
})
.DeferOnError();
Task("TestNet472").IsDependentOn("Test");
Task("TestNetStandard20").IsDependentOn("Test");
Task("TestNetStandard21").IsDependentOn("Test");
+Task("TestNet60").IsDependentOn("Test");
Task("TestAwsAuthentication")
.IsDependentOn("Build")
.DoesForEach(
- GetFiles("./**/MongoDB.Driver.Tests.csproj"),
- testProject =>
- {
- DotNetCoreTest(
- testProject.FullPath,
- new DotNetCoreTestSettings {
- NoBuild = true,
- NoRestore = true,
- Configuration = configuration,
- ArgumentCustomization = args => args.Append("-- RunConfiguration.TargetPlatform=x64"),
- Filter = "Category=\"AwsMechanism\""
- }
- );
- });
+ items: GetFiles("./**/MongoDB.Driver.Tests.csproj"),
+ action: (BuildConfig buildConfig, Path testProject) =>
+ RunTests(buildConfig, testProject, filter: "Category=\"AwsMechanism\""));
Task("TestPlainAuthentication")
.IsDependentOn("Build")
.DoesForEach(
- GetFiles("./**/MongoDB.Driver.Tests.csproj"),
- testProject =>
- {
- DotNetCoreTest(
- testProject.FullPath,
- new DotNetCoreTestSettings {
- NoBuild = true,
- NoRestore = true,
- Configuration = configuration,
- ArgumentCustomization = args => args.Append("-- RunConfiguration.TargetPlatform=x64"),
- Filter = "Category=\"PlainMechanism\""
- }
- );
- });
+ items: GetFiles("./**/MongoDB.Driver.Tests.csproj"),
+ action: (BuildConfig buildConfig, Path testProject) =>
+ RunTests(buildConfig, testProject, filter: "Category=\"PlainMechanism\""));
// currently we are not running this Task on Evergreen (only locally occassionally)
Task("TestAllGuidRepresentations")
.IsDependentOn("Build")
.DoesForEach(
- GetFiles("./**/*.Tests.csproj")
+ items: GetFiles("./**/*.Tests.csproj")
// .Where(name => name.ToString().Contains("Bson.Tests")) // uncomment to only test Bson
.Where(name => !name.ToString().Contains("Atlas")),
- testProject =>
+ action: (BuildConfig buildConfig, Path testProject) =>
{
var modes = new string[][]
{
@@ -244,208 +213,119 @@ Task("TestAllGuidRepresentations")
Console.WriteLine($"TEST_WITH_DEFAULT_GUID_REPRESENTATION_MODE={testWithGuidRepresentationMode}");
Console.WriteLine($"TEST_WITH_DEFAULT_GUID_REPRESENTATION={testWithGuidRepresentation}");
- DotNetCoreTest(
- testProject.FullPath,
- new DotNetCoreTestSettings {
- NoBuild = true,
- NoRestore = true,
- Configuration = configuration,
- ArgumentCustomization = args => args.Append("-- RunConfiguration.TargetPlatform=x64"),
- EnvironmentVariables = new Dictionary
+ RunTests(
+ buildConfig,
+ testProject,
+ settings =>
+ {
+ settings.EnvironmentVariables = new Dictionary
{
{ "TEST_WITH_DEFAULT_GUID_REPRESENTATION_MODE", testWithGuidRepresentationMode },
{ "TEST_WITH_DEFAULT_GUID_REPRESENTATION", testWithGuidRepresentation }
- }
- }
- );
+ };
+ });
}
});
Task("TestAtlasConnectivity")
.IsDependentOn("Build")
.DoesForEach(
- GetFiles("./**/AtlasConnectivity.Tests.csproj"),
- testProject =>
-{
- DotNetCoreTest(
- testProject.FullPath,
- new DotNetCoreTestSettings {
- NoBuild = true,
- NoRestore = true,
- Configuration = configuration,
- ArgumentCustomization = args => args.Append("-- RunConfiguration.TargetPlatform=x64")
- }
- );
-});
+ items: GetFiles("./**/AtlasConnectivity.Tests.csproj"),
+ action: (BuildConfig buildConfig, Path testProject) => RunTests(buildConfig, testProject));
Task("TestAtlasDataLake")
.IsDependentOn("Build")
.DoesForEach(
- GetFiles("./**/MongoDB.Driver.Tests.csproj"),
- testProject =>
- {
- DotNetCoreTest(
- testProject.FullPath,
- new DotNetCoreTestSettings {
- NoBuild = true,
- NoRestore = true,
- Configuration = configuration,
- ArgumentCustomization = args => args.Append("-- RunConfiguration.TargetPlatform=x64"),
- Filter = "Category=\"AtlasDataLake\""
- }
- );
- });
+ items: GetFiles("./**/MongoDB.Driver.Tests.csproj"),
+ action: (BuildConfig buildConfig, Path testProject) =>
+ RunTests(buildConfig, testProject, filter: "Category=\"AtlasDataLake\""));
-Task("TestOcsp")
+Task("TestAtlasSearch")
.IsDependentOn("Build")
.DoesForEach(
- GetFiles("./**/MongoDB.Driver.Tests.csproj"),
- testProject =>
-{
- DotNetCoreTest(
- testProject.FullPath,
- new DotNetCoreTestSettings {
- NoBuild = true,
- NoRestore = true,
- Configuration = configuration,
-
- ArgumentCustomization = args => args
- .Append("--filter FullyQualifiedName~OcspIntegrationTests")
- .Append("-- RunConfiguration.TargetPlatform=x64")
- }
- );
-});
+ items: GetFiles("./**/MongoDB.Driver.Tests.csproj"),
+ action: (BuildConfig buildConfig, Path testProject) =>
+ RunTests(buildConfig, testProject, filter: "Category=\"AtlasSearch\""));
-Task("TestGssapi")
+Task("TestOcsp")
.IsDependentOn("Build")
.DoesForEach(
items: GetFiles("./**/MongoDB.Driver.Tests.csproj"),
action: (BuildConfig buildConfig, Path testProject) =>
- {
- var settings = new DotNetCoreTestSettings
- {
- NoBuild = true,
- NoRestore = true,
- Configuration = configuration,
- ArgumentCustomization = args => args.Append("-- RunConfiguration.TargetPlatform=x64"),
- Filter = "Category=\"GssapiMechanism\"",
- Framework = buildConfig.Framework
- };
+ RunTests(buildConfig, testProject, filter: "Category=\"OCSP\""));
- DotNetCoreTest(
- testProject.FullPath,
- settings
- );
- });
+Task("TestGssapi")
+ .IsDependentOn("Build")
+ .DoesForEach(
+ items: GetFiles("./**/MongoDB.Driver.Tests.csproj"),
+ action: (BuildConfig buildConfig, Path testProject) =>
+ RunTests(buildConfig, testProject, filter: "Category=\"GssapiMechanism\""));
Task("TestGssapiNet472").IsDependentOn("TestGssapi");
Task("TestGssapiNetStandard20").IsDependentOn("TestGssapi");
Task("TestGssapiNetStandard21").IsDependentOn("TestGssapi");
+Task("TestGssapiNet60").IsDependentOn("TestGssapi");
Task("TestServerless")
.IsDependentOn("Build")
.DoesForEach(
items: GetFiles("./**/MongoDB.Driver.Tests.csproj"),
action: (BuildConfig buildConfig, Path testProject) =>
- {
- var settings = new DotNetCoreTestSettings
- {
- NoBuild = true,
- NoRestore = true,
- Configuration = configuration,
- ArgumentCustomization = args => args.Append("-- RunConfiguration.TargetPlatform=x64"),
- Filter = "Category=\"Serverless\"",
- Framework = buildConfig.Framework
- };
-
- DotNetCoreTest(
- testProject.FullPath,
- settings
- );
- });
+ RunTests(buildConfig, testProject, filter: "Category=\"Serverless\""));
Task("TestServerlessNet472").IsDependentOn("TestServerless");
Task("TestServerlessNetStandard20").IsDependentOn("TestServerless");
Task("TestServerlessNetStandard21").IsDependentOn("TestServerless");
+Task("TestServerlessNet60").IsDependentOn("TestServerless");
Task("TestLoadBalanced")
.IsDependentOn("Build")
.DoesForEach(
items: GetFiles("./**/*.Tests.csproj"),
action: (BuildConfig buildConfig, Path testProject) =>
- {
- var settings = new DotNetCoreTestSettings
- {
- NoBuild = true,
- NoRestore = true,
- Configuration = configuration,
- ArgumentCustomization = args => args.Append("-- RunConfiguration.TargetPlatform=x64"),
- Filter = "Category=\"SupportLoadBalancing\"",
- Framework = buildConfig.Framework
- };
-
- DotNetCoreTest(
- testProject.FullPath,
- settings
- );
- });
+ RunTests(buildConfig, testProject, filter: "Category=\"SupportLoadBalancing\""));
Task("TestLoadBalancedNetStandard20").IsDependentOn("TestLoadBalanced");
Task("TestLoadBalancedNetStandard21").IsDependentOn("TestLoadBalanced");
+Task("TestLoadBalancedNet60").IsDependentOn("TestLoadBalanced");
Task("TestCsfleWithMockedKms")
.IsDependentOn("Build")
.DoesForEach(
items: GetFiles("./**/*.Tests.csproj"),
action: (BuildConfig buildConfig, Path testProject) =>
- {
- var settings = new DotNetCoreTestSettings
- {
- NoBuild = true,
- NoRestore = true,
- Configuration = configuration,
- Loggers = CreateLoggers(),
- ArgumentCustomization = args => args.Append("-- RunConfiguration.TargetPlatform=x64"),
- Filter = "Category=\"CSFLE\"",
- Framework = buildConfig.Framework
- };
-
- DotNetCoreTest(
- testProject.FullPath,
- settings
- );
- });
+ RunTests(buildConfig, testProject, filter: "Category=\"CSFLE\""));
Task("TestCsfleWithMockedKmsNet472").IsDependentOn("TestCsfleWithMockedKms");
Task("TestCsfleWithMockedKmsNetStandard20").IsDependentOn("TestCsfleWithMockedKms");
Task("TestCsfleWithMockedKmsNetStandard21").IsDependentOn("TestCsfleWithMockedKms");
+Task("TestCsfleWithMockedKmsNet60").IsDependentOn("TestCsfleWithMockedKms");
Task("TestCsfleWithMongocryptd")
.IsDependentOn("Build")
.DoesForEach(
items: GetFiles("./**/*.Tests.csproj"),
action: (BuildConfig buildConfig, Path testProject) =>
- {
- var settings = new DotNetCoreTestSettings
- {
- NoBuild = true,
- NoRestore = true,
- Configuration = configuration,
- Loggers = CreateLoggers(),
- ArgumentCustomization = args => args.Append("-- RunConfiguration.TargetPlatform=x64"),
- Filter = "Category=\"CSFLE\"",
- Framework = buildConfig.Framework
- };
-
- DotNetCoreTest(
- testProject.FullPath,
- settings
- );
- });
+ RunTests(buildConfig, testProject, filter: "Category=\"CSFLE\""));
Task("TestCsfleWithMongocryptdNet472").IsDependentOn("TestCsfleWithMongocryptd");
Task("TestCsfleWithMongocryptdNetStandard20").IsDependentOn("TestCsfleWithMongocryptd");
Task("TestCsfleWithMongocryptdNetStandard21").IsDependentOn("TestCsfleWithMongocryptd");
+Task("TestCsfleWithMongocryptdNet60").IsDependentOn("TestCsfleWithMongocryptd");
+
+Task("TestCsfleWithAzureKms")
+ .IsDependentOn("Build")
+ .DoesForEach(
+ items: GetFiles("./**/*.Tests.csproj"),
+ action: (BuildConfig buildConfig, Path testProject) =>
+ RunTests(buildConfig, testProject, filter: "Category=\"CsfleAZUREKMS\""));
+
+Task("TestCsfleWithGcpKms")
+ .IsDependentOn("Build")
+ .DoesForEach(
+ items: GetFiles("./**/*.Tests.csproj"),
+ action: (BuildConfig buildConfig, Path testProject) =>
+ RunTests(buildConfig, testProject, filter: "Category=\"CsfleGCPKMS\""));
Task("Docs")
.IsDependentOn("ApiDocs")
@@ -525,7 +405,7 @@ Task("Package")
Task("PackageNugetPackages")
.IsDependentOn("Build")
- .Does(() =>
+ .Does((buildConfig) =>
{
EnsureDirectoryExists(artifactsPackagesDirectory);
CleanDirectory(artifactsPackagesDirectory);
@@ -542,18 +422,18 @@ Task("PackageNugetPackages")
foreach (var project in projects)
{
var projectPath = $"{srcDirectory}\\{project}\\{project}.csproj";
- var settings = new DotNetCorePackSettings
+ var settings = new DotNetPackSettings
{
Configuration = configuration,
OutputDirectory = artifactsPackagesDirectory,
NoBuild = true, // SetContinuousIntegrationBuild is enabled for nupkg on the Build step
IncludeSymbols = true,
- MSBuildSettings = new DotNetCoreMSBuildSettings()
+ MSBuildSettings = new DotNetMSBuildSettings()
// configure deterministic build for better compatibility with debug symbols (used in Package/Build tasks). Affects: *.snupkg
- .SetContinuousIntegrationBuild(continuousIntegrationBuild: true)
- .WithProperty("PackageVersion", gitVersion.LegacySemVer)
+ .SetContinuousIntegrationBuild(continuousIntegrationBuild: true)
+ .WithProperty("PackageVersion", buildConfig.PackageVersion)
};
- DotNetCorePack(projectPath, settings);
+ DotNetPack(projectPath, settings);
}
});
@@ -596,37 +476,61 @@ Task("DumpGitVersion")
{
Information(gitVersion.Dump());
});
-
+
Task("TestsPackagingProjectReference")
.IsDependentOn("Build")
.DoesForEach(
- GetFiles("./**/*.Tests.csproj"),
- testProject =>
+ items: GetFiles("./**/*.Tests.csproj"),
+ action: (BuildConfig buildConfig, Path testProject) =>
+ RunTests(buildConfig, testProject, filter: "Category=\"Packaging\""));
+
+Task("SmokeTests")
+ .IsDependentOn("PackageNugetPackages")
+ .DoesForEach(
+ GetFiles("./**/SmokeTests/**/*.SmokeTests*.csproj"),
+ action: (BuildConfig buildConfig, Path testProject) =>
{
- var settings = new DotNetCoreTestSettings
+ var environmentVariables = new Dictionary
{
- NoBuild = true,
- NoRestore = true,
- Configuration = configuration,
- ArgumentCustomization = args => args.Append("-- RunConfiguration.TargetPlatform=x64"),
- Filter = "Category=\"Packaging\""
+ { "SmokeTestsPackageSha", gitVersion.Sha }
};
- DotNetCoreTest(
+ var toolSettings = new DotNetToolSettings { EnvironmentVariables = environmentVariables };
+
+ Information($"Updating MongoDB package: {buildConfig.PackageVersion} sha: {gitVersion.Sha}");
+
+ DotNetTool(
testProject.FullPath,
- settings
- );
+ "add package MongoDB.Driver",
+ $"--version [{buildConfig.PackageVersion}]",
+ toolSettings);
+
+ RunTests(
+ buildConfig,
+ testProject,
+ settings =>
+ {
+ settings.NoBuild = false;
+ settings.NoRestore = false;
+ settings.EnvironmentVariables = environmentVariables;
+ });
});
+Task("SmokeTestsNet472").IsDependentOn("SmokeTests");
+Task("SmokeTestsNetCoreApp21").IsDependentOn("SmokeTests");
+Task("SmokeTestsNetCoreApp31").IsDependentOn("SmokeTests");
+Task("SmokeTestsNet50").IsDependentOn("SmokeTests");
+Task("SmokeTestsNet60").IsDependentOn("SmokeTests");
+
Task("TestsPackaging")
.IsDependentOn("TestsPackagingProjectReference")
.IsDependentOn("Package")
.DoesForEach(
- () =>
- {
- var monikers = new[] { "net472", "netcoreapp21", "netcoreapp30", "net50" };
+ () =>
+ {
+ var monikers = new[] { "net472", "netcoreapp21", "netcoreapp30", "net50", "net60" };
var csprojTypes = new[] { "SDK" };
- var processorArchitectures = new[] { "x64" };
+ var processorArchitectures = new[] { "x64", "arm64" };
var projectTypes = new[] { "xunit", "console" };
return
@@ -636,7 +540,7 @@ Task("TestsPackaging")
from projectType in projectTypes
select new { Moniker = moniker, CsprojType = csprojType, ProcessorArchitecture = processorArchitecture, ProjectType = projectType };
},
- (testDetails) =>
+ (testDetails) =>
{
var moniker = testDetails.Moniker;
var csprojFormat = testDetails.CsprojType;
@@ -651,7 +555,7 @@ Task("TestsPackaging")
EnsureDirectoryExists(monikerTestFolder);
CleanDirectory(monikerTestFolder);
- var csprojFileName = $"{monikerTestFolder.GetDirectoryName()}.csproj";
+ var csprojFileName = $"{monikerTestFolder.GetDirectoryName()}.csproj";
var csprojFullPath = monikerTestFolder.CombineWithFilePath(csprojFileName);
switch (projectType)
@@ -665,12 +569,12 @@ Task("TestsPackaging")
}
Information("Creating test project...");
- DotNetCoreTool(csprojFullPath, "new xunit", $"--target-framework-override {moniker} --language C# ");
+ DotNetTool(csprojFullPath, "new xunit", $"--target-framework-override {moniker} --language C# ");
Information("Created test project");
// the below two packages are added just to allow using the same code as in xunit
Information($"Adding FluentAssertions...");
- DotNetCoreTool(
+ DotNetTool(
csprojFullPath,
"add package FluentAssertions",
$"--framework {moniker} --version 4.12.0"
@@ -680,7 +584,7 @@ Task("TestsPackaging")
var mongoDriverPackageVersion = ConfigureAndGetTestedDriverVersion(monikerTestFolder, localNugetSourceName);
Information($"Adding test package...");
- DotNetCoreTool(
+ DotNetTool(
csprojFullPath,
$"add package {mongoDbDriverPackageName}",
$"--framework {moniker} --version {mongoDriverPackageVersion}"
@@ -693,10 +597,10 @@ Task("TestsPackaging")
var files = GetFiles($"{packagingTestsDirectory}/*.cs").ToList();
CopyFiles(files, monikerTestFolder); // copy tests content
- Information("Running tests...");
- DotNetCoreTest(
+ Information("Running tests...");
+ DotNetTest(
csprojFullPath.ToString(),
- new DotNetCoreTestSettings
+ new DotNetTestSettings
{
Framework = moniker,
Configuration = configuration,
@@ -706,7 +610,7 @@ Task("TestsPackaging")
.Append($"-- RunConfiguration.TargetPlatform={processorArchitecture}")
}
);
- }
+ }
break;
case "console":
{
@@ -716,14 +620,14 @@ Task("TestsPackaging")
// The described solution works but it's tricky to implement it via scripts
return;
}
-
+
Information("Creating console project...");
- DotNetCoreTool(csprojFullPath, "new console", $"--target-framework-override {moniker} --language C# --langVersion 9");
+ DotNetTool(csprojFullPath, "new console", $"--target-framework-override {moniker} --language C# --langVersion 9");
Information("Created test project");
-
+
// the below two packages are added just to allow using the same code as in xunit
Information($"Adding FluentAssertions...");
- DotNetCoreTool(
+ DotNetTool(
csprojFullPath,
"add package FluentAssertions",
$"--framework {moniker} --version 4.12.0"
@@ -731,7 +635,7 @@ Task("TestsPackaging")
Information($"Added FluentAssertions");
Information($"Adding xunit...");
- DotNetCoreTool(
+ DotNetTool(
csprojFullPath,
"add package xunit",
$"--framework {moniker} --version 2.4.0"
@@ -741,7 +645,7 @@ Task("TestsPackaging")
var mongoDriverPackageVersion = ConfigureAndGetTestedDriverVersion(monikerTestFolder, localNugetSourceName);
Information($"Adding tested package...");
- DotNetCoreTool(
+ DotNetTool(
csprojFullPath,
$"add package {mongoDbDriverPackageName}",
$"--framework {moniker} --version {mongoDriverPackageVersion}"
@@ -754,13 +658,13 @@ Task("TestsPackaging")
var files = GetFiles($"{packagingTestsDirectory}/*.cs").ToList();
CopyFiles(files, monikerTestFolder); // copy tests content
- Information("Running console app...");
- DotNetCoreRun(
+ Information("Running console app...");
+ DotNetRun(
csprojFullPath.ToString(),
- new DotNetCoreRunSettings
+ new DotNetRunSettings
{
- EnvironmentVariables = new Dictionary()
- {
+ EnvironmentVariables = new Dictionary()
+ {
{ "DefineConstants", "CONSOLE_TEST" },
{ "PlatformTarget", processorArchitecture }
},
@@ -768,7 +672,7 @@ Task("TestsPackaging")
Configuration = configuration
}
);
- }
+ }
break;
default: throw new NotSupportedException($"Packaging tests for {projectType} is not supported.");
}
@@ -776,7 +680,7 @@ Task("TestsPackaging")
string ConfigureAndGetTestedDriverVersion(DirectoryPath directoryPath, string localNugetSourceName)
{
CreateNugetConfig(directoryPath, localNugetSourceName);
-
+
var packagesList = NuGetList(
new NuGetListSettings {
AllVersions = true,
@@ -796,13 +700,13 @@ Task("TestsPackaging")
var mongoDriverPackageVersion = packagesList.Single(p => p.Name == mongoDbDriverPackageName).Version;
Information($"Package version {mongoDriverPackageVersion}");
return mongoDriverPackageVersion;
-
- void CreateNugetConfig(DirectoryPath directoryPath, string localNugetSourceName)
+
+ void CreateNugetConfig(DirectoryPath directoryPath, string localNugetSourceName)
{
var nugetConfigPath = directoryPath.CombineWithFilePath("nuget.config");
if (FileExists(nugetConfigPath)) DeleteFile(nugetConfigPath);
-
- DotNetCoreTool(nugetConfigPath, "new nugetconfig"); // create a default nuget.config
+
+ DotNetTool(nugetConfigPath, "new nugetconfig"); // create a default nuget.config
//
//
@@ -815,19 +719,36 @@ Task("TestsPackaging")
.DeferOnError();
Setup(
- setupContext =>
+ setupContext =>
{
+ var targetPlatform = RuntimeInformation.OSArchitecture switch
+ {
+ Architecture.Arm64 => "arm64",
+ Architecture.X64 => "x64",
+ var unknownArchitecture => throw new Exception($"Unknown CPU architecture: {unknownArchitecture}.")
+ };
+
var lowerTarget = target.ToLowerInvariant();
- var framework = lowerTarget switch
+ // Apple M1 (arm64) must run on .NET 6 as the hosting process is arm64 and cannot load the previous netcoreapp2.1/3.1 runtimes.
+ // While Rosetta 2 can cross-compile x64->arm64 to run x64 code, it requires a completely separate install of the .NET runtimes
+ // in a different directory with a x64 dotnet host process. This would further complicate our testing for little additional gain.
+ var framework = targetPlatform == "arm64" ? "net6.0" : lowerTarget switch
{
- string s when s.StartsWith("test") && s.EndsWith("net472") => "net472",
- string s when s.StartsWith("test") && s.EndsWith("netstandard20") => "netcoreapp2.1",
- string s when s.StartsWith("test") && s.EndsWith("netstandard21") => "netcoreapp3.1",
+ string s when s.EndsWith("net472") => "net472",
+ string s when s.EndsWith("netstandard20") || s.EndsWith("netcoreapp21") => "netcoreapp2.1",
+ string s when s.EndsWith("netstandard21") || s.EndsWith("netcoreapp31") => "netcoreapp3.1",
+ string s when s.EndsWith("net472") => "net472",
+ string s when s.EndsWith("net50") => "net5.0",
+ string s when s.EndsWith("net60") => "net6.0",
_ => null
};
+
var isReleaseMode = lowerTarget.StartsWith("package") || lowerTarget == "release";
- Console.WriteLine($"Framework: {framework ?? "null (not set)"}, IsReleaseMode: {isReleaseMode}");
- return new BuildConfig(isReleaseMode, framework);
+ var packageVersion = lowerTarget.StartsWith("smoketests") ? gitVersion.FullSemVer.Replace('+', '-') : gitVersion.LegacySemVer;
+
+ Console.WriteLine($"Framework: {framework ?? "null (not set)"}, TargetPlatform: {targetPlatform}, IsReleaseMode: {isReleaseMode}, PackageVersion: {packageVersion}");
+ var loggers = CreateLoggers();
+ return new BuildConfig(isReleaseMode, framework, targetPlatform, packageVersion, loggers);
});
RunTarget(target);
@@ -836,11 +757,17 @@ public class BuildConfig
{
public bool IsReleaseMode { get; }
public string Framework { get; }
+ public string PackageVersion { get; }
+ public string TargetPlatform { get; }
+ public string[] Loggers { get; }
- public BuildConfig(bool isReleaseMode, string framework)
+ public BuildConfig(bool isReleaseMode, string framework, string targetPlatform, string packageVersion, string[] loggers)
{
IsReleaseMode = isReleaseMode;
Framework = framework;
+ TargetPlatform = targetPlatform;
+ PackageVersion = packageVersion;
+ Loggers = loggers;
}
}
@@ -850,5 +777,27 @@ string[] CreateLoggers()
// Evergreen CI server requires JUnit output format to display test results
var junitLogger = $"junit;LogFilePath={testResultsFile};FailureBodyFormat=Verbose";
var consoleLogger = "console;verbosity=detailed";
- return new []{ junitLogger, consoleLogger };
+ return new []{ junitLogger, consoleLogger };
+}
+
+void RunTests(BuildConfig buildConfig, Path path, string filter = null)
+{
+ RunTests(buildConfig, path, settings => settings.Filter = filter);
+}
+
+void RunTests(BuildConfig buildConfig, Path path, Action settingsAction)
+{
+ var settings = new DotNetTestSettings
+ {
+ NoBuild = true,
+ NoRestore = true,
+ Configuration = configuration,
+ Loggers = buildConfig.Loggers,
+ ArgumentCustomization = args => args.Append($"-- RunConfiguration.TargetPlatform={buildConfig.TargetPlatform}"),
+ Framework = buildConfig.Framework
+ };
+
+ settingsAction?.Invoke(settings);
+
+ DotNetTest(path.FullPath, settings);
}
\ No newline at end of file
diff --git a/build.config b/build.config
index 252a1ec71da..719f0942b7d 100644
--- a/build.config
+++ b/build.config
@@ -1,3 +1,3 @@
#!/usr/bin/env bash
-CAKE_VERSION=1.3.0
-DOTNET_VERSION=5.0.401
+CAKE_VERSION=2.2.0
+DOTNET_VERSION=6.0.400
diff --git a/build.ps1 b/build.ps1
index 7db6396c081..197bd747a45 100644
--- a/build.ps1
+++ b/build.ps1
@@ -101,6 +101,7 @@ if($FoundDotNetCliVersion -ne $DotNetVersion) {
(New-Object System.Net.WebClient).DownloadFile($DotNetUnixInstallerUri, $ScriptPath);
& bash $ScriptPath --install-dir "$InstallPath" --channel 2.1 --no-path
& bash $ScriptPath --install-dir "$InstallPath" --channel 3.1 --no-path
+ & bash $ScriptPath --install-dir "$InstallPath" --channel 5.0 --no-path
& bash $ScriptPath --version "$DotNetVersion" --install-dir "$InstallPath" --channel "$DotNetChannel" --no-path
Remove-PathVariable "$InstallPath"
@@ -111,6 +112,7 @@ if($FoundDotNetCliVersion -ne $DotNetVersion) {
(New-Object System.Net.WebClient).DownloadFile($DotNetInstallerUri, $ScriptPath);
& $ScriptPath -Channel 2.1 -InstallDir $InstallPath;
& $ScriptPath -Channel 3.1 -InstallDir $InstallPath;
+ & $ScriptPath -Channel 5.0 -InstallDir $InstallPath;
& $ScriptPath -Channel $DotNetChannel -Version $DotNetVersion -InstallDir $InstallPath;
Remove-PathVariable "$InstallPath"
diff --git a/build.sh b/build.sh
index e3aafc21fe8..1d0e31a676d 100755
--- a/build.sh
+++ b/build.sh
@@ -33,15 +33,20 @@ if [ "$DOTNET_VERSION" != "$DOTNET_INSTALLED_VERSION" ]; then
mkdir "$SCRIPT_DIR/.dotnet"
fi
curl -Lsfo "$SCRIPT_DIR/.dotnet/dotnet-install.sh" https://dot.net/v1/dotnet-install.sh
- # N.B. We explicitly install .NET Core 2.1 and 3.1 because .NET 5.0 SDK can build those TFMs
+ # N.B. We explicitly install .NET Core 2.1 and 3.1 because .NET 6.0 SDK can build those TFMs
# but will silently upgrade to a more recent runtime to execute tests if the desired runtime
# isn't available. For example, `dotnet run --framework netcoreapp3.0` will silently run
- # on .NET 5.0 if .NET Core 3.0 and 3.1 aren't installed.
+ # on .NET 6.0 if .NET Core 3.0 and 3.1 aren't installed.
# This solution is admittedly hacky as .NET Core 2.1 and 3.1 won't be installed if
# $DOTNET_VERSION matches $DOTNET_INSTALLED_VERSION, but it minimizes the changes required
# to install required dependencies on Evergreen.
- bash "$SCRIPT_DIR/.dotnet/dotnet-install.sh" --channel 2.1 --install-dir .dotnet --no-path
- bash "$SCRIPT_DIR/.dotnet/dotnet-install.sh" --channel 3.1 --install-dir .dotnet --no-path
+ # Since ARM64 support was first added in .NET 6.0, the following commands will install:
+ # | CPU | 2.1 | 3.1 | Latest |
+ # | x64 | x64 | x64 | x64 |
+ # | arm64 | x64 | x64 | arm64 |
+ bash "$SCRIPT_DIR/.dotnet/dotnet-install.sh" --channel 2.1 --architecture x64 --install-dir .dotnet --no-path
+ bash "$SCRIPT_DIR/.dotnet/dotnet-install.sh" --channel 3.1 --architecture x64 --install-dir .dotnet --no-path
+ bash "$SCRIPT_DIR/.dotnet/dotnet-install.sh" --channel 5.0 --architecture x64 --install-dir .dotnet --no-path
bash "$SCRIPT_DIR/.dotnet/dotnet-install.sh" --version $DOTNET_VERSION --install-dir .dotnet --no-path
export PATH="$SCRIPT_DIR/.dotnet":$PATH
export DOTNET_ROOT="$SCRIPT_DIR/.dotnet"
diff --git a/evergreen/evergreen.yml b/evergreen/evergreen.yml
index e826a52b4f5..85223c09a38 100644
--- a/evergreen/evergreen.yml
+++ b/evergreen/evergreen.yml
@@ -13,7 +13,7 @@ stepback: true
command_type: system
# Protect ourself against rogue test case, or curl gone wild, that runs forever
-# 60 minutes: 20 minutes is a normal test run + up to 10 minutes for test setup + 15 minutes for longer macOS tests + 15 minutes for longer macOS 1015 tests
+# 60 minutes: 20 minutes is a normal test run + up to 10 minutes for test setup + 15 minutes for longer macOS tests + 15 minutes for longer macOS 1100 tests
exec_timeout_secs: 3600
# What to do when evergreen hits the timeout (`post:` tasks are run automatically)
@@ -22,6 +22,7 @@ timeout:
params:
script: |
ls -la
+ df -h
functions:
@@ -304,8 +305,6 @@ functions:
. ./evergreen/set-virtualenv.sh
. ./evergreen/set-temp-fle-aws-creds.sh
${PREPARE_SHELL}
- OS=${OS} \
- . ./evergreen/fetch-crypt_shared-library.sh
OS=${OS} \
evergreen/add-ca-certs.sh
AUTH=${AUTH} \
@@ -317,6 +316,7 @@ functions:
CLIENT_PEM=${DRIVERS_TOOLS}/.evergreen/x509gen/client.pem \
REQUIRE_API_VERSION=${REQUIRE_API_VERSION} \
FRAMEWORK=${FRAMEWORK} \
+ CRYPT_SHARED_LIB_PATH=${CRYPT_SHARED_LIB_PATH} \
evergreen/run-tests.sh
echo "Skipping certificate removal..."
OS=${OS} \
@@ -331,10 +331,10 @@ functions:
set +x
${PREPARE_CSFLE}
export KMS_MOCK_SERVERS_ENABLED=true
+ export GCE_METADATA_HOST="localhost:5000"
+ export AZURE_IMDS_MOCK_ENDPOINT="localhost:8080"
${PREPARE_SHELL}
set +o xtrace
- OS=${OS} \
- . ./evergreen/fetch-crypt_shared-library.sh
OS=${OS} \
evergreen/add-ca-certs.sh
AUTH=${AUTH} \
@@ -345,6 +345,7 @@ functions:
CLIENT_PEM=${DRIVERS_TOOLS}/.evergreen/x509gen/client.pem \
FRAMEWORK=${FRAMEWORK} \
TARGET="TestCsfleWithMockedKms" \
+ CRYPT_SHARED_LIB_PATH=${CRYPT_SHARED_LIB_PATH} \
evergreen/run-tests.sh
OS=${OS} \
evergreen/cleanup-test-resources.sh
@@ -372,6 +373,7 @@ functions:
REQUIRE_API_VERSION=${REQUIRE_API_VERSION} \
TARGET="TestCsfleWithMongocryptd" \
FRAMEWORK=${FRAMEWORK} \
+ CRYPT_SHARED_LIB_PATH="" \
evergreen/run-tests.sh
echo "Skipping certificate removal..."
OS=${OS} \
@@ -430,7 +432,12 @@ functions:
"iam_auth_assume_role_name" : "${iam_auth_assume_role_name}",
"iam_auth_ec2_instance_account" : "${iam_auth_ec2_instance_account}",
"iam_auth_ec2_instance_secret_access_key" : "${iam_auth_ec2_instance_secret_access_key}",
- "iam_auth_ec2_instance_profile" : "${iam_auth_ec2_instance_profile}"
+ "iam_auth_ec2_instance_profile" : "${iam_auth_ec2_instance_profile}",
+ "iam_auth_assume_web_role_name": "${iam_auth_assume_web_role_name}",
+ "iam_web_identity_issuer": "${iam_web_identity_issuer}",
+ "iam_web_identity_rsa_key": "${iam_web_identity_rsa_key}",
+ "iam_web_identity_jwks_uri": "${iam_web_identity_jwks_uri}",
+ "iam_web_identity_token_file": "${iam_web_identity_token_file}"
}
EOF
@@ -439,10 +446,12 @@ functions:
type: test
params:
silent: true
+ shell: "bash"
working_dir: mongo-csharp-driver
script: |
${PREPARE_SHELL}
cd ${DRIVERS_TOOLS}/.evergreen/auth_aws
+ . ./activate-authawsvenv.sh
mongo aws_e2e_regular_aws.js
- command: shell.exec
type: test
@@ -455,21 +464,20 @@ functions:
PASS=$(urlencode "${iam_auth_ecs_secret_access_key}")
MONGODB_URI="mongodb://$USER:$PASS@localhost"
EOF
- PROJECT_DIRECTORY=${PROJECT_DIRECTORY} evergreen/run-mongodb-aws-test.sh
+ PROJECT_DIRECTORY=${PROJECT_DIRECTORY} OS=${OS} evergreen/run-mongodb-aws-test.sh
run-aws-auth-test-with-assume-role-credentials:
- command: shell.exec
type: test
params:
silent: true
+ shell: "bash"
working_dir: mongo-csharp-driver
script: |
${PREPARE_SHELL}
# The aws_e2e_assume_role script requires python3 with boto3.
- virtualenv -p C:/python/Python38/python.exe mongovenv
- . mongovenv/Scripts/activate
- pip install boto3
cd ${DRIVERS_TOOLS}/.evergreen/auth_aws
+ . ./activate-authawsvenv.sh
mongo aws_e2e_assume_role.js
- command: shell.exec
type: test
@@ -488,32 +496,140 @@ functions:
SESSION_TOKEN=$(urlencode $SESSION_TOKEN)
MONGODB_URI="mongodb://$USER:$PASS@localhost"
EOF
- PROJECT_DIRECTORY=${PROJECT_DIRECTORY} DRIVERS_TOOLS=${DRIVERS_TOOLS} evergreen/run-mongodb-aws-test.sh
+ PROJECT_DIRECTORY=${PROJECT_DIRECTORY} DRIVERS_TOOLS=${DRIVERS_TOOLS} OS=${OS} evergreen/run-mongodb-aws-test.sh
run-aws-auth-test-with-aws-EC2-credentials:
- command: shell.exec
type: test
params:
silent: true
+ shell: "bash"
working_dir: mongo-csharp-driver
script: |
${PREPARE_SHELL}
- # The aws_e2e_assume_role script requires python3 with boto3.
- virtualenv -p C:/python/Python38/python.exe mongovenv
- . mongovenv/Scripts/activate
- pip install boto3
+ if [ "${skip_EC2_auth_test}" = "true" ]; then
+ echo "This platform does not support the EC2 auth test, skipping..."
+ exit 0
+ fi
cd ${DRIVERS_TOOLS}/.evergreen/auth_aws
+ . ./activate-authawsvenv.sh
mongo aws_e2e_ec2.js
- command: shell.exec
type: test
params:
working_dir: mongo-csharp-driver
script: |
+ if [ "${skip_EC2_auth_test}" = "true" ]; then
+ echo "This platform does not support the EC2 auth test, skipping..."
+ exit 0
+ fi
# DO NOT ECHO WITH XTRACE (which PREPARE_SHELL does)
cat <<'EOF' > "${PROJECT_DIRECTORY}/prepare_mongodb_aws.sh"
MONGODB_URI="mongodb://localhost"
EOF
- PROJECT_DIRECTORY=${PROJECT_DIRECTORY} evergreen/run-mongodb-aws-test.sh
+ export AWS_EC2_ENABLED=true
+ PROJECT_DIRECTORY=${PROJECT_DIRECTORY} ASSERT_NO_URI_CREDS=true OS=$OS evergreen/run-mongodb-aws-test.sh
+
+ run-aws-auth-test-with-aws-ECS-credentials:
+ - command: shell.exec
+ type: test
+ params:
+ silent: true
+ shell: "bash"
+ working_dir: mongo-csharp-driver
+ script: |
+ ${PREPARE_SHELL}
+ if [ "${skip_ECS_auth_test}" = "true" ]; then
+ echo "This platform does not support the ECS auth test, skipping..."
+ exit 0
+ fi
+ cd ${DRIVERS_TOOLS}/.evergreen/auth_aws
+ . ./activate-authawsvenv.sh
+ echo "Project Directory: $PROJECT_DIRECTORY"
+ # SRC_DIRECTORY is workaround since EG_TOOLS expects "src" folder as a root
+ SRC_DIRECTORY=$(dirname $PROJECT_DIRECTORY)/src
+ echo "Src Directory: $SRC_DIRECTORY"
+ cp -r $PROJECT_DIRECTORY $SRC_DIRECTORY
+ # Workaround. EG_TOOLS scripts for ECS assume that a folder with EG scripts in the driver is named ".evergreen"
+ mkdir $SRC_DIRECTORY/.evergreen
+ cp -r $SRC_DIRECTORY/evergreen/run-mongodb-aws-ecs-test.sh $SRC_DIRECTORY/.evergreen/run-mongodb-aws-ecs-test.sh
+ cat < setup.js
+ const mongo_binaries = "$MONGODB_BINARIES";
+ const project_dir = "$SRC_DIRECTORY"
+ EOF
+ mongo --nodb setup.js aws_e2e_ecs.js
+ cd -
+
+ run-aws-auth-test-with-aws-web-identity-credentials:
+ - command: shell.exec
+ type: test
+ params:
+ shell: "bash"
+ working_dir: mongo-csharp-driver
+ script: |
+ ${PREPARE_SHELL}
+ if [ "${skip_web_identity_auth_test}" = "true" ]; then
+ echo "This platform does not support the web identity auth test, skipping..."
+ exit 0
+ fi
+ cd ${DRIVERS_TOOLS}/.evergreen/auth_aws
+ . ./activate-authawsvenv.sh
+ mongo aws_e2e_web_identity.js
+ - command: shell.exec
+ type: test
+ params:
+ working_dir: mongo-csharp-driver
+ silent: true
+ script: |
+ if [ "${skip_web_identity_auth_test}" = "true" ]; then
+ echo "This platform does not support the web identity auth test, skipping..."
+ exit 0
+ fi
+ # DO NOT ECHO WITH XTRACE (which PREPARE_SHELL does)
+ cat <<'EOF' > "${PROJECT_DIRECTORY}/prepare_mongodb_aws.sh"
+ export AWS_ROLE_ARN="${iam_auth_assume_web_role_name}"
+ export AWS_WEB_IDENTITY_TOKEN_FILE="${iam_web_identity_token_file}"
+ export MONGODB_URI="mongodb://localhost"
+ EOF
+ - command: shell.exec
+ type: test
+ params:
+ working_dir: mongo-csharp-driver
+ script: |
+ ${PREPARE_SHELL}
+ if [ "${skip_web_identity_auth_test}" = "true" ]; then
+ echo "This platform does not support the web identity auth test, skipping..."
+ exit 0
+ fi
+ PROJECT_DIRECTORY=${PROJECT_DIRECTORY} OS=$OS ASSERT_NO_URI_CREDS=true evergreen/run-mongodb-aws-test.sh
+ - command: shell.exec
+ type: test
+ params:
+ working_dir: mongo-csharp-driver
+ silent: true
+ script: |
+ if [ "${skip_EC2_auth_test}" = "true" ]; then
+ echo "This platform does not support the web identity auth test, skipping..."
+ exit 0
+ fi
+ # DO NOT ECHO WITH XTRACE (which PREPARE_SHELL does)
+ cat <<'EOF' > "${PROJECT_DIRECTORY}/prepare_mongodb_aws.sh"
+ export AWS_ROLE_ARN="${iam_auth_assume_web_role_name}"
+ export AWS_WEB_IDENTITY_TOKEN_FILE="${iam_web_identity_token_file}"
+ export AWS_ROLE_SESSION_NAME="test"
+ export MONGODB_URI="mongodb://localhost"
+ EOF
+ - command: shell.exec
+ type: test
+ params:
+ working_dir: mongo-csharp-driver
+ script: |
+ ${PREPARE_SHELL}
+ if [ "${skip_web_identity_auth_test}" = "true" ]; then
+ echo "This platform does not support the web identity auth test, skipping..."
+ exit 0
+ fi
+ PROJECT_DIRECTORY=${PROJECT_DIRECTORY} OS=$OS ASSERT_NO_URI_CREDS=true evergreen/run-mongodb-aws-test.sh
run-aws-auth-test-with-aws-credentials-as-environment-variables:
- command: shell.exec
@@ -534,7 +650,7 @@ functions:
working_dir: mongo-csharp-driver
script: |
${PREPARE_SHELL}
- evergreen/run-mongodb-aws-test.sh
+ OS=${OS} ASSERT_NO_URI_CREDS=true evergreen/run-mongodb-aws-test.sh
run-aws-auth-test-with-aws-credentials-and-session-token-as-environment-variables:
- command: shell.exec
@@ -557,7 +673,7 @@ functions:
working_dir: mongo-csharp-driver
script: |
${PREPARE_SHELL}
- evergreen/run-mongodb-aws-test.sh
+ OS=${OS} ASSERT_NO_URI_CREDS=true evergreen/run-mongodb-aws-test.sh
run-atlas-data-lake-test:
- command: shell.exec
@@ -568,6 +684,15 @@ functions:
${PREPARE_SHELL}
evergreen/run-atlas-data-lake-test.sh
+ run-atlas-search-test:
+ - command: shell.exec
+ type: test
+ params:
+ working_dir: mongo-csharp-driver
+ script: |
+ ${PREPARE_SHELL}
+ ATLAS_SEARCH="${ATLAS_SEARCH}" evergreen/run-atlas-search-test.sh
+
run-ocsp-test:
- command: shell.exec
type: test
@@ -597,10 +722,12 @@ functions:
- command: shell.exec
params:
background: true
+ shell: "bash"
script: |
set -o xtrace
cd ${DRIVERS_TOOLS}/.evergreen/ocsp
- nohup ./venv/Scripts/python ocsp_mock.py \
+ . ./activate-ocspvenv.sh
+ nohup python ocsp_mock.py \
--ca_file ${OCSP_ALGORITHM}/ca.pem \
--ocsp_responder_cert ${OCSP_ALGORITHM}/ca.crt \
--ocsp_responder_key ${OCSP_ALGORITHM}/ca.key \
@@ -616,10 +743,12 @@ functions:
- command: shell.exec
params:
background: true
+ shell: "bash"
script: |
set -o xtrace
cd ${DRIVERS_TOOLS}/.evergreen/ocsp
- nohup ./venv/Scripts/python ocsp_mock.py \
+ . ./activate-ocspvenv.sh
+ nohup python ocsp_mock.py \
--ca_file ${OCSP_ALGORITHM}/ca.pem \
--ocsp_responder_cert ${OCSP_ALGORITHM}/ocsp-responder.crt \
--ocsp_responder_key ${OCSP_ALGORITHM}/ocsp-responder.key \
@@ -635,10 +764,12 @@ functions:
- command: shell.exec
params:
background: true
+ shell: "bash"
script: |
set -o xtrace
cd ${DRIVERS_TOOLS}/.evergreen/ocsp
- nohup ./venv/Scripts/python.exe ocsp_mock.py \
+ . ./activate-ocspvenv.sh
+ nohup python ocsp_mock.py \
--ca_file ${OCSP_ALGORITHM}/ca.pem \
--ocsp_responder_cert ${OCSP_ALGORITHM}/ca.crt \
--ocsp_responder_key ${OCSP_ALGORITHM}/ca.key \
@@ -656,10 +787,12 @@ functions:
- command: shell.exec
params:
background: true
+ shell: "bash"
script: |
set -o xtrace
cd ${DRIVERS_TOOLS}/.evergreen/ocsp
- nohup ./venv/Scripts/python.exe ocsp_mock.py \
+ . ./activate-ocspvenv.sh
+ nohup python ocsp_mock.py \
--ca_file ${OCSP_ALGORITHM}/ca.pem \
--ocsp_responder_cert ${OCSP_ALGORITHM}/ocsp-responder.crt \
--ocsp_responder_key ${OCSP_ALGORITHM}/ocsp-responder.key \
@@ -673,14 +806,38 @@ functions:
params:
working_dir: mongo-csharp-driver
script: |
+ ${PREPARE_SHELL}
+ ${PREPARE_CSFLE}
AUTH=${AUTH} \
FRAMEWORK=${FRAMEWORK} \
SERVERLESS_ATLAS_USER="${SERVERLESS_ATLAS_USER}" \
SERVERLESS_ATLAS_PASSWORD="${SERVERLESS_ATLAS_PASSWORD}" \
SERVERLESS_URI="${SERVERLESS_URI}" \
SSL=${SSL} \
+ CRYPT_SHARED_LIB_PATH=${CRYPT_SHARED_LIB_PATH} \
evergreen/run-serverless-tests.sh
+ run-smoke-tests:
+ - command: shell.exec
+ type: test
+ params:
+ working_dir: mongo-csharp-driver
+ script: |
+ set +x
+ ${PREPARE_SHELL}
+ OS=${OS} \
+ AUTH=${AUTH} \
+ SSL=${SSL} \
+ MONGODB_URI="${MONGODB_URI}" \
+ TOPOLOGY=${TOPOLOGY} \
+ OS=${OS} \
+ COMPRESSOR=${COMPRESSOR} \
+ CLIENT_PEM=${DRIVERS_TOOLS}/.evergreen/x509gen/client.pem \
+ REQUIRE_API_VERSION=${REQUIRE_API_VERSION} \
+ TARGET="SmokeTests" \
+ FRAMEWORK=${FRAMEWORK} \
+ evergreen/run-tests.sh
+
create-serverless-instance:
- command: shell.exec
params:
@@ -713,59 +870,93 @@ functions:
start-kms-mock-servers:
- command: shell.exec
params:
+ shell: "bash"
script: |
${PREPARE_SHELL}
cd ${DRIVERS_TOOLS}/.evergreen/csfle
- . ./activate_venv.sh
+ . ./activate-kmstlsvenv.sh
- command: shell.exec
params:
background: true
+ shell: "bash"
script: |
#expired client cert
- PYTHON=$(Venv="${DRIVERS_TOOLS}/.evergreen/csfle/kmstlsvenv" OS=${OS} ${PROJECT_DIRECTORY}/evergreen/get-python-path.sh);
cd ${DRIVERS_TOOLS}/.evergreen/csfle
- $PYTHON -u kms_http_server.py -v --ca_file ../x509gen/ca.pem --cert_file ../x509gen/expired.pem --port 8000
+ . ./activate-kmstlsvenv.sh
+ python -u kms_http_server.py -v --ca_file ../x509gen/ca.pem --cert_file ../x509gen/expired.pem --port 8000
- command: shell.exec
params:
background: true
+ shell: "bash"
script: |
#wrong-host client cert
- PYTHON=$(Venv="${DRIVERS_TOOLS}/.evergreen/csfle/kmstlsvenv" OS=${OS} ${PROJECT_DIRECTORY}/evergreen/get-python-path.sh);
cd ${DRIVERS_TOOLS}/.evergreen/csfle
- $PYTHON -u kms_http_server.py -v --ca_file ../x509gen/ca.pem --cert_file ../x509gen/wrong-host.pem --port 8001
+ . ./activate-kmstlsvenv.sh
+ python -u kms_http_server.py -v --ca_file ../x509gen/ca.pem --cert_file ../x509gen/wrong-host.pem --port 8001
- command: shell.exec
params:
background: true
+ shell: "bash"
script: |
#server.pem client cert
- PYTHON=$(Venv="${DRIVERS_TOOLS}/.evergreen/csfle/kmstlsvenv" OS=${OS} ${PROJECT_DIRECTORY}/evergreen/get-python-path.sh);
cd ${DRIVERS_TOOLS}/.evergreen/csfle
- $PYTHON -u kms_http_server.py -v --ca_file ../x509gen/ca.pem --cert_file ../x509gen/server.pem --port 8002 --require_client_cert
+ . ./activate-kmstlsvenv.sh
+ python -u kms_http_server.py -v --ca_file ../x509gen/ca.pem --cert_file ../x509gen/server.pem --port 8002 --require_client_cert
- start-kms-kmip-server:
+ start-kms-mock-kmip-server:
- command: shell.exec
params:
+ shell: "bash"
script: |
${PREPARE_SHELL}
cd ${DRIVERS_TOOLS}/.evergreen/csfle
- . ./activate_venv.sh
+ . ./activate-kmstlsvenv.sh
- command: shell.exec
params:
+ shell: "bash"
background: true
script: |
- PYTHON=$(Venv="${DRIVERS_TOOLS}/.evergreen/csfle/kmstlsvenv" OS=${OS} ${PROJECT_DIRECTORY}/evergreen/get-python-path.sh);
cd ${DRIVERS_TOOLS}/.evergreen/csfle
- $PYTHON -u kms_kmip_server.py
+ . ./activate-kmstlsvenv.sh
+ python -u kms_kmip_server.py
- publish-snapshot:
+ start-kms-mock-gcp-server:
- command: shell.exec
- type: test
params:
- silent: true
- working_dir: mongo-csharp-driver
+ shell: "bash"
script: |
- # DO NOT ECHO WITH XTRACE (which PREPARE_SHELL does)
- PROJECT_DIRECTORY=${PROJECT_DIRECTORY} evergreen/publish.sh
+ ${PREPARE_SHELL}
+ cd ${DRIVERS_TOOLS}/.evergreen/csfle
+ . ./activate-kmstlsvenv.sh
+ - command: shell.exec
+ params:
+ background: true
+ shell: "bash"
+ script: |
+ cd ${DRIVERS_TOOLS}/.evergreen/csfle/gcpkms
+ . ./activate-kmstlsvenv.sh
+ python -m pip install PyJWT
+ mkdir ${DRIVERS_TOOLS}/tmp
+ echo '${GOOGLE_APPLICATION_CREDENTIALS_CONTENT}' > ${DRIVERS_TOOLS}/tmp/testgcpkms_key_file.json
+ export GOOGLE_APPLICATION_CREDENTIALS=${DRIVERS_TOOLS}/tmp/testgcpkms_key_file.json
+ python -u mock_server.py
+
+ start-kms-mock-azure-imds-server:
+ - command: shell.exec
+ params:
+ shell: "bash"
+ script: |
+ ${PREPARE_SHELL}
+ cd ${DRIVERS_TOOLS}/.evergreen/csfle
+ . ./activate-kmstlsvenv.sh
+ - command: shell.exec
+ params:
+ background: true
+ shell: "bash"
+ script: |
+ cd ${DRIVERS_TOOLS}/.evergreen/csfle
+ . ./activate-kmstlsvenv.sh
+ python bottle.py fake_azure:imds
cleanup:
- command: shell.exec
@@ -840,18 +1031,6 @@ post:
tasks:
- - name: compile
- commands:
- - func: exec-script
- vars:
- file: "evergreen/compile.sh"
- # - func: upload-build
-
- - name: test
- commands:
- - func: bootstrap-mongo-orchestration
- - func: run-tests
-
- name: test-net472
commands:
- func: bootstrap-mongo-orchestration
@@ -897,7 +1076,9 @@ tasks:
- name: test-csfle-with-mocked-kms-tls-net472
commands:
- func: start-kms-mock-servers
- - func: start-kms-kmip-server
+ - func: start-kms-mock-kmip-server
+ - func: start-kms-mock-gcp-server
+ - func: start-kms-mock-azure-imds-server
- func: bootstrap-mongo-orchestration
- func: run-csfle-with-mocked-kms-tests
vars:
@@ -906,7 +1087,9 @@ tasks:
- name: test-csfle-with-mocked-kms-tls-netstandard20
commands:
- func: start-kms-mock-servers
- - func: start-kms-kmip-server
+ - func: start-kms-mock-kmip-server
+ - func: start-kms-mock-gcp-server
+ - func: start-kms-mock-azure-imds-server
- func: bootstrap-mongo-orchestration
- func: run-csfle-with-mocked-kms-tests
vars:
@@ -915,7 +1098,9 @@ tasks:
- name: test-csfle-with-mocked-kms-tls-netstandard21
commands:
- func: start-kms-mock-servers
- - func: start-kms-kmip-server
+ - func: start-kms-mock-kmip-server
+ - func: start-kms-mock-gcp-server
+ - func: start-kms-mock-azure-imds-server
- func: bootstrap-mongo-orchestration
- func: run-csfle-with-mocked-kms-tests
vars:
@@ -931,7 +1116,7 @@ tasks:
vars:
FRAMEWORK: netstandard20
- func: stop-load-balancer
-
+
- name: test-load-balancer-netstandard21
commands:
- func: bootstrap-mongo-orchestration
@@ -981,12 +1166,15 @@ tasks:
ORCHESTRATION_FILE: "auth-aws.json"
TOPOLOGY: "server"
- func: add-aws-auth-variables-to-file
+ # This step also creates test related users, so don't avoid this step in order to run other tests
- func: run-aws-auth-test-with-regular-aws-credentials
- func: run-aws-auth-test-with-assume-role-credentials
- func: run-aws-auth-test-with-aws-credentials-as-environment-variables
+ # This step requires running run-aws-auth-test-with-assume-role-credentials before to explicitly set up instance profile
- func: run-aws-auth-test-with-aws-credentials-and-session-token-as-environment-variables
- func: run-aws-auth-test-with-aws-EC2-credentials
- # ECS test is skipped untill testing on Linux becomes possible
+ - func: run-aws-auth-test-with-aws-ECS-credentials
+ - func: run-aws-auth-test-with-aws-web-identity-credentials
- name: stable-api-tests-net472
commands:
@@ -1023,12 +1211,9 @@ tasks:
- func: bootstrap-mongohoused
- func: run-atlas-data-lake-test
- - name: publish-snapshot
- depends_on:
- - variant: ".tests-variant"
- name: test
+ - name: atlas-search-test
commands:
- - func: publish-snapshot
+ - func: run-atlas-search-test
- name: test-serverless-net472
exec_timeout_secs: 2700 # 45 minutes: 15 for setup + 30 for tests
@@ -1216,6 +1401,41 @@ tasks:
OCSP_ALGORITHM: "rsa"
OCSP_TLS_SHOULD_SUCCEED: "false"
+ - name: test-smoke-tests-net472
+ commands:
+ - func: bootstrap-mongo-orchestration
+ - func: run-smoke-tests
+ vars:
+ FRAMEWORK: net472
+
+ - name: test-smoke-tests-netcoreapp21
+ commands:
+ - func: bootstrap-mongo-orchestration
+ - func: run-smoke-tests
+ vars:
+ FRAMEWORK: netcoreapp21
+
+ - name: test-smoke-tests-netcoreapp31
+ commands:
+ - func: bootstrap-mongo-orchestration
+ - func: run-smoke-tests
+ vars:
+ FRAMEWORK: netcoreapp31
+
+ - name: test-smoke-tests-net50
+ commands:
+ - func: bootstrap-mongo-orchestration
+ - func: run-smoke-tests
+ vars:
+ FRAMEWORK: net50
+
+ - name: test-smoke-tests-net60
+ commands:
+ - func: bootstrap-mongo-orchestration
+ - func: run-smoke-tests
+ vars:
+ FRAMEWORK: net60
+
# ECDSA tests
# Disabled until https://jira.mongodb.org/browse/SPEC-1589 is resolved
# - name: test-ocsp-ecdsa-valid-cert-server-staples-ca-responder
@@ -1380,6 +1600,72 @@ tasks:
# OCSP_ALGORITHM: "ecdsa"
# OCSP_TLS_SHOULD_SUCCEED: "false"
+ - name: test-csfle-with-azure-kms
+ commands:
+ - command: shell.exec
+ type: setup
+ params:
+ working_dir: mongo-csharp-driver
+ shell: "bash"
+ script: |
+ ${PREPARE_SHELL}
+ echo "Copying files ... begin"
+ export AZUREKMS_RESOURCEGROUP=${testazurekms_resourcegroup}
+ export AZUREKMS_VMNAME=${AZUREKMS_VMNAME}
+ export AZUREKMS_PRIVATEKEYPATH=/tmp/testazurekms_privatekey
+ tar czf /tmp/mongo-csharp-driver.tgz .
+ AZUREKMS_SRC=/tmp/mongo-csharp-driver.tgz AZUREKMS_DST="~/" $DRIVERS_TOOLS/.evergreen/csfle/azurekms/copy-file.sh
+ echo "Copying files ... end"
+ echo "Untarring file ... begin"
+ AZUREKMS_CMD="tar xf mongo-csharp-driver.tgz" $DRIVERS_TOOLS/.evergreen/csfle/azurekms/run-command.sh
+ echo "Untarring file ... end"
+
+ - command: shell.exec
+ type: test
+ params:
+ working_dir: "mongo-csharp-driver"
+ shell: "bash"
+ script: |
+ ${PREPARE_SHELL}
+ export AZUREKMS_RESOURCEGROUP=${testazurekms_resourcegroup}
+ export AZUREKMS_VMNAME=${AZUREKMS_VMNAME}
+ export AZUREKMS_PRIVATEKEYPATH=/tmp/testazurekms_privatekey
+ AZUREKMS_CMD="MONGODB_URI='mongodb://localhost:27017' KEY_NAME='${testazurekms_keyname}' KEY_VAULT_ENDPOINT='${testazurekms_keyvaultendpoint}' ./evergreen/run-csfle-azure-tests.sh" $DRIVERS_TOOLS/.evergreen/csfle/azurekms/run-command.sh
+
+ - name: test-csfle-with-gcp-kms
+ commands:
+ - command: shell.exec
+ type: setup
+ params:
+ working_dir: mongo-csharp-driver
+ shell: "bash"
+ script: |
+ ${PREPARE_SHELL}
+ echo "Copying files ... begin"
+ export GCPKMS_GCLOUD=${GCPKMS_GCLOUD}
+ export GCPKMS_PROJECT=${GCPKMS_PROJECT}
+ export GCPKMS_ZONE=${GCPKMS_ZONE}
+ export GCPKMS_INSTANCENAME=${GCPKMS_INSTANCENAME}
+ tar czf /tmp/mongo-csharp-driver.tgz .
+ GCPKMS_SRC=/tmp/mongo-csharp-driver.tgz GCPKMS_DST=$GCPKMS_INSTANCENAME: $DRIVERS_TOOLS/.evergreen/csfle/gcpkms/copy-file.sh
+ echo "Copying files ... end"
+ echo "Untarring file ... begin"
+ GCPKMS_CMD="tar xf mongo-csharp-driver.tgz" $DRIVERS_TOOLS/.evergreen/csfle/gcpkms/run-command.sh
+ echo "Untarring file ... end"
+
+ - command: shell.exec
+ type: test
+ params:
+ working_dir: "mongo-csharp-driver"
+ shell: "bash"
+ script: |
+ ${PREPARE_SHELL}
+ export GCPKMS_GCLOUD=${GCPKMS_GCLOUD}
+ export GCPKMS_PROJECT=${GCPKMS_PROJECT}
+ export GCPKMS_ZONE=${GCPKMS_ZONE}
+ export GCPKMS_INSTANCENAME=${GCPKMS_INSTANCENAME}
+ GCPKMS_CMD="MONGODB_URI='mongodb://localhost:27017' ./evergreen/run-csfle-gcp-tests.sh" $DRIVERS_TOOLS/.evergreen/csfle/gcpkms/run-command.sh
+
axes:
- id: version
display_name: MongoDB Version
@@ -1424,17 +1710,30 @@ axes:
display_name: "Windows 64-bit"
variables:
OS: "windows-64"
+ skip_ECS_auth_test: true
+ skip_web_identity_auth_test: true
run_on: windows-64-vs2017-test
- id: "ubuntu-1804"
display_name: "Ubuntu 18.04"
variables:
OS: "ubuntu-1804"
run_on: ubuntu1804-test
- - id: "macos-1015"
- display_name: "macOS 10.15"
+ - id: "macos-1100"
+ display_name: "macOS 11.00"
variables:
- OS: "macos-1015"
- run_on: macos-1015
+ OS: "macos-1100"
+ skip_EC2_auth_test: true
+ skip_ECS_auth_test: true
+ skip_web_identity_auth_test: true
+ run_on: macos-1100
+ - id: "macos-1100-arm64"
+ display_name: "macOS 11.00 M1"
+ variables:
+ OS: "macos-1100-arm64"
+ skip_EC2_auth_test: true
+ skip_ECS_auth_test: true
+ skip_web_identity_auth_test: true
+ run_on: macos-1100-arm64
- id: topology
display_name: Topology
@@ -1492,26 +1791,91 @@ axes:
variables:
COMPRESSOR: "zstd"
-buildvariants:
+task_groups:
+ - name: testazurekms-task-group
+ setup_group_can_fail_task: true
+ setup_group_timeout_secs: 1800 # 30 minutes
+ setup_group:
+ - func: fetch-source
+ - func: prepare-resources
+ - func: windows-fix
+ - func: fix-absolute-paths
+ - func: init-test-results
+ - func: make-files-executable
+ - command: shell.exec
+ params:
+ shell: "bash"
+ script: |
+ ${PREPARE_SHELL}
+ echo '${testazurekms_publickey}' > /tmp/testazurekms_publickey
+ echo '${testazurekms_privatekey}' > /tmp/testazurekms_privatekey
+ # Set 600 permissions on private key file. Otherwise ssh / scp may error with permissions "are too open".
+ chmod 600 /tmp/testazurekms_privatekey
+ export AZUREKMS_CLIENTID=${testazurekms_clientid}
+ export AZUREKMS_TENANTID=${testazurekms_tenantid}
+ export AZUREKMS_SECRET=${testazurekms_secret}
+ export AZUREKMS_DRIVERS_TOOLS=$DRIVERS_TOOLS
+ export AZUREKMS_RESOURCEGROUP=${testazurekms_resourcegroup}
+ export AZUREKMS_PUBLICKEYPATH=/tmp/testazurekms_publickey
+ export AZUREKMS_PRIVATEKEYPATH=/tmp/testazurekms_privatekey
+ export AZUREKMS_SCOPE=${testazurekms_scope}
+ export AZUREKMS_VMNAME_PREFIX=CSHARPDRIVER
+ $DRIVERS_TOOLS/.evergreen/csfle/azurekms/create-and-setup-vm.sh
+ - command: expansions.update
+ params:
+ file: testazurekms-expansions.yml
+ teardown_group:
+ - command: shell.exec
+ params:
+ shell: "bash"
+ script: |
+ ${PREPARE_SHELL}
+ export AZUREKMS_VMNAME=${AZUREKMS_VMNAME}
+ export AZUREKMS_RESOURCEGROUP=${testazurekms_resourcegroup}
+ $DRIVERS_TOOLS/.evergreen/csfle/azurekms/delete-vm.sh
+ tasks:
+ - test-csfle-with-azure-kms
+
+ - name: testgcpkms-task-group
+ setup_group_can_fail_task: true
+ setup_group_timeout_secs: 1800 # 30 minutes
+ setup_group:
+ - func: fetch-source
+ - func: prepare-resources
+ - func: windows-fix
+ - func: fix-absolute-paths
+ - func: init-test-results
+ - func: make-files-executable
+ - command: shell.exec
+ params:
+ shell: "bash"
+ script: |
+ ${PREPARE_SHELL}
+ echo '${GOOGLE_APPLICATION_CREDENTIALS_CONTENT}' > /tmp/testgcpkms_key_file.json
+ export GCPKMS_KEYFILE=/tmp/testgcpkms_key_file.json
+ export GCPKMS_DRIVERS_TOOLS=$DRIVERS_TOOLS
+ export GCPKMS_SERVICEACCOUNT="${GCPKMS_SERVICEACCOUNT}"
+ export GCPKMS_MACHINETYPE="e2-standard-4"
+ $DRIVERS_TOOLS/.evergreen/csfle/gcpkms/create-and-setup-instance.sh
+ # Load the GCPKMS_GCLOUD, GCPKMS_INSTANCE, GCPKMS_REGION, and GCPKMS_ZONE expansions.
+ - command: expansions.update
+ params:
+ file: testgcpkms-expansions.yml
+ teardown_group:
+ - command: shell.exec
+ params:
+ shell: "bash"
+ script: |
+ ${PREPARE_SHELL}
+ export GCPKMS_GCLOUD=${GCPKMS_GCLOUD}
+ export GCPKMS_PROJECT=${GCPKMS_PROJECT}
+ export GCPKMS_ZONE=${GCPKMS_ZONE}
+ export GCPKMS_INSTANCENAME=${GCPKMS_INSTANCENAME}
+ $DRIVERS_TOOLS/.evergreen/csfle/gcpkms/delete-instance.sh
+ tasks:
+ - test-csfle-with-gcp-kms
-- name: windows-64-compile
- display_name: "Windows 64-bit compile"
- run_on:
- - windows-64-vs2017-compile
- tasks:
- - name: compile
-- name: ubuntu1804-compile
- display_name: "Ubuntu 18.04 compile"
- run_on:
- - ubuntu1804-test
- tasks:
- - name: compile
-- name: macos1015-compile
- display_name: "macOS 10.15 compile"
- run_on:
- - macos-1015
- tasks:
- - name: compile
+buildvariants:
- matrix_name: "secure-tests"
matrix_spec: { version: "*", topology: "*", auth: "auth", ssl: "ssl", os: "windows-64" }
@@ -1558,7 +1922,7 @@ buildvariants:
- name: test-netstandard21
- matrix_name: "tests-snappy-compression-macOS"
- matrix_spec: { compressor : "snappy", auth: "noauth", ssl: "nossl", version: ["5.0", "6.0", "rapid", "latest"], topology: "standalone", os: "macos-1015" }
+ matrix_spec: { compressor : "snappy", auth: "noauth", ssl: "nossl", version: ["5.0", "6.0", "rapid", "latest"], topology: "standalone", os: ["macos-1100", "macos-1100-arm64"] }
display_name: "${version} ${compressor} ${topology} ${auth} ${ssl} ${os} "
tags: ["tests-variant"]
tasks:
@@ -1582,7 +1946,7 @@ buildvariants:
- name: test-netstandard21
- matrix_name: "tests-zstandard-compression-macOS"
- matrix_spec: { compressor : "zstandard", auth: "noauth", ssl: "nossl", version: ["5.0", "6.0", "rapid", "latest"], topology: "standalone", os: "macos-1015" }
+ matrix_spec: { compressor : "zstandard", auth: "noauth", ssl: "nossl", version: ["5.0", "6.0", "rapid", "latest"], topology: "standalone", os: ["macos-1100", "macos-1100-arm64"] }
display_name: "${version} ${compressor} ${topology} ${auth} ${ssl} ${os} "
tags: ["tests-variant"]
tasks:
@@ -1606,14 +1970,14 @@ buildvariants:
- name: test-netstandard21
- matrix_name: "secure-tests-macOS"
- matrix_spec: { version: ["5.0", "6.0", "rapid", "latest"], topology: "replicaset", auth: "auth", ssl: "ssl", os: "macos-1015" }
+ matrix_spec: { version: ["5.0", "6.0", "rapid", "latest"], topology: "replicaset", auth: "auth", ssl: "ssl", os: ["macos-1100", "macos-1100-arm64"] }
display_name: "${version} ${topology} ${auth} ${ssl} ${os}"
tags: ["tests-variant"]
tasks:
- name: test-netstandard21
- matrix_name: "unsecure-tests-macOS"
- matrix_spec: { version: ["5.0", "6.0", "rapid", "latest"], topology: "replicaset", auth: "noauth", ssl: "nossl", os: "macos-1015" }
+ matrix_spec: { version: ["5.0", "6.0", "rapid", "latest"], topology: "replicaset", auth: "noauth", ssl: "nossl", os: ["macos-1100", "macos-1100-arm64"] }
display_name: "${version} ${topology} ${auth} ${ssl} ${os}"
tags: ["tests-variant"]
tasks:
@@ -1634,7 +1998,7 @@ buildvariants:
tasks:
- name: ".ocsp"
-- matrix_name: aws-auth-tests
+- matrix_name: aws-auth-tests-windows
matrix_spec: { version: ["4.4", "5.0", "6.0", "rapid", "latest"], topology: "standalone", os: "windows-64" }
display_name: "MONGODB-AWS Auth test ${version} ${os}"
run_on:
@@ -1642,6 +2006,22 @@ buildvariants:
tasks:
- name: aws-auth-tests
+- matrix_name: aws-auth-tests-linux
+ matrix_spec: { version: ["6.0", "rapid", "latest"], topology: "standalone", os: "ubuntu-1804" }
+ display_name: "MONGODB-AWS Auth test ${version} ${os}"
+ run_on:
+ - ubuntu1804-test
+ tasks:
+ - name: aws-auth-tests
+
+- matrix_name: aws-auth-tests-macos
+ matrix_spec: { version: ["6.0", "rapid", "latest"], topology: "standalone", os: "macos-1100" }
+ display_name: "MONGODB-AWS Auth test ${version} ${os}"
+ run_on:
+ - macos-1100
+ tasks:
+ - name: aws-auth-tests
+
- matrix_name: stable-api-tests
matrix_spec: { version: ["5.0", "6.0", "rapid", "latest"], topology: "standalone", auth: "auth", ssl: "nossl", os: "windows-64" }
display_name: "Stable API ${version} ${topology} ${auth} ${ssl} ${os}"
@@ -1654,7 +2034,7 @@ buildvariants:
- matrix_name: plain-auth-tests
matrix_spec: { os: "*" }
- display_name: "PLAIN (LDAP) Auth Tests"
+ display_name: "PLAIN (LDAP) Auth Tests ${os}"
tasks:
- name: plain-auth-tests
@@ -1701,6 +2081,13 @@ buildvariants:
tasks:
- name: atlas-data-lake-test
+- name: atlas-search-test
+ display_name: "Atlas Search Tests"
+ run_on:
+ - windows-64-vs2017-test
+ tasks:
+ - name: atlas-search-test
+
- name: gssapi-auth-tests-windows
run_on:
- windows-64-vs2017-test
@@ -1719,43 +2106,75 @@ buildvariants:
- name: test-gssapi-netstandard21
- matrix_name: "csfle-with-mocked-kms-tests-windows"
- matrix_spec: { os: "windows-64", ssl: "nossl", version: [ "5.0", "6.0", "rapid", "latest" ], topology: ["standalone"] }
+ matrix_spec: { os: "windows-64", ssl: "nossl", version: [ "4.2", "4.4", "5.0", "6.0", "rapid", "latest" ], topology: ["replicaset"] }
display_name: "CSFLE Mocked KMS ${version} ${os}"
tasks:
- name: test-csfle-with-mocked-kms-tls-net472
- name: test-csfle-with-mocked-kms-tls-netstandard20
- name: test-csfle-with-mocked-kms-tls-netstandard21
+ - name: test-csfle-with-mongocryptd-net472
+ - name: test-csfle-with-mongocryptd-netstandard20
+ - name: test-csfle-with-mongocryptd-netstandard21
- matrix_name: "csfle-with-mocked-kms-tests-linux"
- matrix_spec: { os: "ubuntu-1804", ssl: "nossl", version: [ "5.0", "6.0", "rapid", "latest" ], topology: ["standalone"] }
+ matrix_spec: { os: "ubuntu-1804", ssl: "nossl", version: [ "4.2", "4.4", "5.0", "6.0", "rapid", "latest" ], topology: ["replicaset"] }
display_name: "CSFLE Mocked KMS ${version} ${os}"
tasks:
- name: test-csfle-with-mocked-kms-tls-netstandard20
- name: test-csfle-with-mocked-kms-tls-netstandard21
+ - name: test-csfle-with-mongocryptd-netstandard20
+ - name: test-csfle-with-mongocryptd-netstandard21
- matrix_name: "csfle-with-mocked-kms-tests-macOS"
- matrix_spec: { os: "macos-1015", ssl: "nossl", version: [ "5.0", "6.0", "rapid", "latest" ], topology: ["standalone"] }
+ matrix_spec: { os: [ "macos-1100", "macos-1100-arm64" ], ssl: "nossl", version: [ "4.2", "4.4", "5.0", "6.0", "rapid", "latest" ], topology: ["replicaset"] }
display_name: "CSFLE Mocked KMS ${version} ${os}"
tasks:
- name: test-csfle-with-mocked-kms-tls-netstandard21
+ - name: test-csfle-with-mongocryptd-netstandard21
-- matrix_name: "csfle-with-mongocryptd-windows"
- matrix_spec: { os: "windows-64", ssl: "nossl", version: [ "4.2", "4.4", "5.0", "6.0", "latest" ], topology: ["replicaset"] }
- display_name: "CSFLE with mongocryptd ${version} ${os}"
+- matrix_name: "csfle-with-azure-kms-tests-linux"
+ matrix_spec: { ssl: "nossl", os: "ubuntu-1804" }
+ display_name: "CSFLE with AZURE KMS ${os}"
+ batchtime: 20160 # 14 days
tasks:
- - name: test-csfle-with-mongocryptd-net472
- - name: test-csfle-with-mongocryptd-netstandard20
+ - name: testazurekms-task-group
- name: test-csfle-with-mongocryptd-netstandard21
-- matrix_name: "csfle-with-mongocryptd-linux"
- matrix_spec: { os: "ubuntu-1804", ssl: "nossl", version: [ "4.2", "4.4", "5.0", "6.0", "latest" ], topology: ["replicaset"] }
- display_name: "CSFLE with mongocryptd ${version} ${os}"
+- matrix_name: "csfle-with-gcp-kms-tests-linux"
+ matrix_spec: { ssl: "nossl", os: "ubuntu-1804" }
+ display_name: "CSFLE with GCP KMS ${os}"
+ batchtime: 20160 # 14 days
tasks:
- - name: test-csfle-with-mongocryptd-netstandard20
+ - name: testgcpkms-task-group
- name: test-csfle-with-mongocryptd-netstandard21
-- matrix_name: "csfle-with-mongocryptd-macOS"
- matrix_spec: { os: "macos-1015", ssl: "nossl", version: [ "4.2", "4.4", "5.0", "6.0", "latest" ], topology: ["replicaset"] }
- display_name: "CSFLE with mongocryptd ${version} ${os}"
+- matrix_name: "smoke-tests-windows"
+ matrix_spec: { os: "windows-64", ssl: "nossl", version: [ "5.0", "6.0", "latest" ], topology: ["replicaset"] }
+ display_name: "smoke-tests ${version} ${os}"
+ batchtime: 1440 # 1 day
+ tasks:
+ - name: test-smoke-tests-net472
+ - name: test-smoke-tests-netcoreapp21
+ - name: test-smoke-tests-netcoreapp31
+ - name: test-smoke-tests-net50
+ - name: test-smoke-tests-net60
+
+- matrix_name: "smoke-tests-linux"
+ matrix_spec: { os: "ubuntu-1804", ssl: "nossl", version: [ "5.0", "6.0", "latest" ], topology: ["replicaset"] }
+ display_name: "smoke-tests ${version} ${os}"
+ batchtime: 1440 # 1 day
+ tasks:
+ - name: test-smoke-tests-netcoreapp21
+ - name: test-smoke-tests-netcoreapp31
+ - name: test-smoke-tests-net50
+ - name: test-smoke-tests-net60
+
+- matrix_name: "smoke-tests-macOS"
+ matrix_spec: { os: "macos-1100", ssl: "nossl", version: [ "5.0", "6.0", "latest" ], topology: ["replicaset"] }
+ display_name: "smoke-tests ${version} ${os}"
+ batchtime: 1440 # 1 day
tasks:
- - name: test-csfle-with-mongocryptd-netstandard21
\ No newline at end of file
+ - name: test-smoke-tests-netcoreapp21
+ - name: test-smoke-tests-netcoreapp31
+ - name: test-smoke-tests-net50
+ - name: test-smoke-tests-net60
diff --git a/evergreen/fetch-crypt_shared-library.sh b/evergreen/fetch-crypt_shared-library.sh
deleted file mode 100644
index 3114708ea95..00000000000
--- a/evergreen/fetch-crypt_shared-library.sh
+++ /dev/null
@@ -1,27 +0,0 @@
-#!/usr/bin/env bash
-
-# Fetch csfle shared library.
-#
-# Environment variables used as input:
-# OS The current operating system
-# DRIVERS_TOOLS
-#
-# Environment variables produced as output:
-# MONGODB_CSFLE_PATH The MONGODB_CSFLE_PATH path
-
-set -o xtrace # Write all commands first to stderr
-set -o errexit # Exit the script with an error if any of the commands fail
-
-
-PYTHON=$(OS=${OS} ${PROJECT_DIRECTORY}/evergreen/get-python-path.sh)
-$PYTHON -u ${DRIVERS_TOOLS}/.evergreen/mongodl.py --component crypt_shared --out ${DRIVERS_TOOLS}/evergreen/csfle --version 6.0.0-rc13
-
-if [[ "$OS" =~ Windows|windows ]]; then
- export CRYPT_SHARED_LIB_PATH="${DRIVERS_TOOLS}/evergreen/csfle/bin/mongo_crypt_v1.dll"
-elif [[ "$OS" =~ Mac|mac ]]; then
- export CRYPT_SHARED_LIB_PATH="${DRIVERS_TOOLS}/evergreen/csfle/lib/mongo_crypt_v1.dylib"
-else
- export CRYPT_SHARED_LIB_PATH="${DRIVERS_TOOLS}/evergreen/csfle/lib/mongo_crypt_v1.so"
-fi
-
-echo "crypt shared library path $CRYPT_SHARED_LIB_PATH"
\ No newline at end of file
diff --git a/evergreen/get-python-path.sh b/evergreen/get-python-path.sh
deleted file mode 100644
index a99b3155f22..00000000000
--- a/evergreen/get-python-path.sh
+++ /dev/null
@@ -1,29 +0,0 @@
-#!/usr/bin/env bash
-
-# Find the version of python on the system.
-#
-# Environment variables used as input:
-# Venv Venv path
-# OS The current operating system
-#
-# Environment variables produced as output:
-# PYTHON The python path
-
-# Don't write anything to output
-if [ -z "$Venv" ]; then
- if [ -e "/cygdrive/c/python/Python39/python" ]; then
- echo "/cygdrive/c/python/Python39/python"
- elif [ -e "/opt/mongodbtoolchain/v3/bin/python3" ]; then
- echo "/opt/mongodbtoolchain/v3/bin/python3"
- elif python3 --version >/dev/null 2>&1; then
- echo python3
- else
- echo python
- fi
-else
- if [[ "$OS" =~ Windows|windows ]]; then
- echo "${Venv}/Scripts/python"
- else
- echo "${Venv}/bin/python"
- fi
-fi
diff --git a/evergreen/publish.sh b/evergreen/publish.sh
deleted file mode 100755
index 4db7b6711ba..00000000000
--- a/evergreen/publish.sh
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/usr/bin/env bash
-
-# DO NOT ECHO COMMANDS AS THEY CONTAIN SECRETS!
-
-set -o errexit # Exit the script with error if any of the commands fail
-
-############################################
-# Main Program #
-############################################
-
-echo "Publishing .NET driver"
diff --git a/evergreen/run-atlas-search-test.sh b/evergreen/run-atlas-search-test.sh
new file mode 100644
index 00000000000..88b9b151a85
--- /dev/null
+++ b/evergreen/run-atlas-search-test.sh
@@ -0,0 +1,17 @@
+#!/usr/bin/env bash
+
+set -o xtrace
+set -o errexit # Exit the script with error if any of the commands fail
+
+# Environment variables produced as output
+# ATLAS_SEARCH_TESTS_ENABLED Enable atlas search tests.
+
+############################################
+# Main Program #
+############################################
+
+echo "Running Atlas Search driver tests"
+
+export ATLAS_SEARCH_TESTS_ENABLED=true
+
+powershell.exe .\\build.ps1 --target=TestAtlasSearch
\ No newline at end of file
diff --git a/evergreen/run-csfle-azure-tests.sh b/evergreen/run-csfle-azure-tests.sh
new file mode 100644
index 00000000000..52556db44b9
--- /dev/null
+++ b/evergreen/run-csfle-azure-tests.sh
@@ -0,0 +1,25 @@
+#!/bin/bash
+
+set -o xtrace
+set -o errexit # Exit the script with error if any of the commands fail
+
+# Environment variables used as input:
+# MONGODB_URI Set the URI, including an optional username/password to use to connect to the server
+# KEY_NAME Set azure kms key name
+# KEY_VAULT_ENDPOINT Set azure kms key vault endpoint
+#
+# Environment variables produced as output
+# DOTNET_SYSTEM_GLOBALIZATION_INVARIANT Workaround for the https://github.com/dotnet/core/issues/2186 issue.
+# CSFLE_AZURE_KMS_TESTS_ENABLED Enable csfle azure kms tests.
+
+############################################
+# Main Program #
+############################################
+
+echo "Running Azure Credential Acquisition Test"
+
+# fixing https://github.com/dotnet/core/issues/2186#issuecomment-671105420
+export DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1
+export CSFLE_AZURE_KMS_TESTS_ENABLED=true
+
+./build.sh --target=TestCsfleWithAzureKms
diff --git a/evergreen/run-csfle-gcp-tests.sh b/evergreen/run-csfle-gcp-tests.sh
new file mode 100644
index 00000000000..7f4819ea4b9
--- /dev/null
+++ b/evergreen/run-csfle-gcp-tests.sh
@@ -0,0 +1,18 @@
+#!/bin/bash
+
+set -o xtrace
+set -o errexit # Exit the script with error if any of the commands fail
+
+# Supported/used environment variables:
+# MONGODB_URI Set the URI, including an optional username/password to use to connect to the server
+############################################
+# Main Program #
+############################################
+
+echo "Running GCP Credential Acquisition Test"
+
+# fixing https://github.com/dotnet/core/issues/2186#issuecomment-671105420
+export DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1
+export CSFLE_GCP_KMS_TESTS_ENABLED=true
+
+./build.sh --target=TestCsfleWithGcpKms
diff --git a/evergreen/run-mongodb-aws-ecs-test.sh b/evergreen/run-mongodb-aws-ecs-test.sh
new file mode 100644
index 00000000000..cbf6390c6eb
--- /dev/null
+++ b/evergreen/run-mongodb-aws-ecs-test.sh
@@ -0,0 +1,37 @@
+#!/bin/bash
+
+# Don't trace since the URI contains a password that shouldn't show up in the logs
+set -o errexit # Exit the script with error if any of the commands fail
+
+# Environment variables used as input:
+# MONGODB_URI Set the URI, including username/password to use to connect to the server via MONGODBAWS authentication mechanism
+# ASSERT_NO_URI_CREDS Determines whether we need assert existence credentials in connection string or not
+#
+# Environment variables used as output:
+# AWS_TESTS_ENABLED Allows running AWS tests
+# AWS_ECS_ENABLED Allows running ECS tests
+#
+############################################
+# Main Program #
+############################################
+
+if [[ -z "$1" ]]; then
+ echo "usage: $0 "
+ exit 1
+fi
+export MONGODB_URI="$1"
+
+if echo "$MONGODB_URI" | grep -q "@"; then
+ echo "MONGODB_URI unexpectedly contains user credentials in ECS test!";
+ exit 1
+fi
+# Now we can safely enable xtrace
+set -o xtrace
+export AWS_TESTS_ENABLED=true
+export AWS_ECS_ENABLED=true
+
+# EG scripts for ECS assume that a root folder is "src" and all driver side scripts are placed in ".evergreen" folder.
+# So that script is copied into "src/.evergreen" before running
+cd src
+
+./build.sh --target=TestAwsAuthentication
diff --git a/evergreen/run-mongodb-aws-test.sh b/evergreen/run-mongodb-aws-test.sh
index 646b2860a42..3b9eda5fd04 100755
--- a/evergreen/run-mongodb-aws-test.sh
+++ b/evergreen/run-mongodb-aws-test.sh
@@ -5,15 +5,23 @@ set -o errexit # Exit the script with error if any of the commands fail
# Supported/used environment variables:
# MONGODB_URI Set the URI, including username/password to use to connect to the server via MONGODBAWS authentication mechanism
+# OS Current operation system
+# ASSERT_NO_URI_CREDS Determines whether we need assert existence credentials in connection string or not
############################################
# Main Program #
############################################
echo "Running MONGODB-AWS authentication tests"
+echo "OS: $OS"
-# Provision the correct connection string and set up SSL if needed
-for var in TMP TEMP NUGET_PACKAGES NUGET_HTTP_CACHE_PATH APPDATA; do setx $var z:\\data\\tmp; export $var=z:\\data\\tmp; done
+for var in TMP TEMP NUGET_PACKAGES NUGET_HTTP_CACHE_PATH APPDATA; do
+ if [[ "$OS" =~ Windows|windows ]]; then
+ export $var=z:\\data\\tmp;
+ else
+ export $var=/data/tmp;
+ fi
+done
# ensure no secrets are printed in log files
set +x
@@ -22,6 +30,7 @@ set +x
shopt -s expand_aliases # needed for `urlencode` alias
[ -s "${PROJECT_DIRECTORY}/prepare_mongodb_aws.sh" ] && source "${PROJECT_DIRECTORY}/prepare_mongodb_aws.sh"
+# Provision the correct connection string
if [ -z ${MONGODB_URI+x} ]; then
echo "MONGODB_URI is not set";
exit 1
@@ -30,10 +39,21 @@ MONGODB_URI="${MONGODB_URI}/aws?authMechanism=MONGODB-AWS"
if [[ -n ${SESSION_TOKEN} ]]; then
MONGODB_URI="${MONGODB_URI}&authMechanismProperties=AWS_SESSION_TOKEN:${SESSION_TOKEN}"
fi
+if [ "$ASSERT_NO_URI_CREDS" = "true" ]; then
+ if echo "$MONGODB_URI" | grep -q "@"; then
+ echo "MONGODB_URI unexpectedly contains user credentials!";
+ exit 1
+ fi
+fi
+
export MONGODB_URI
export AWS_TESTS_ENABLED=true
# show test output
set -x
-powershell.exe .\\build.ps1 --target TestAwsAuthentication
+if [[ "$OS" =~ Windows|windows ]]; then
+ powershell.exe .\\build.ps1 --target=TestAwsAuthentication
+else
+ ./build.sh --target=TestAwsAuthentication
+fi
\ No newline at end of file
diff --git a/evergreen/run-serverless-tests.sh b/evergreen/run-serverless-tests.sh
index d5d90252043..101dd3452d5 100644
--- a/evergreen/run-serverless-tests.sh
+++ b/evergreen/run-serverless-tests.sh
@@ -11,6 +11,7 @@ set -o errexit # Exit the script with error if any of the commands fail
# SERVERLESS_ATLAS_PASSWORD Authentiction password, must be set
# SERVERLESS_URI Single atlas proxy serverless uri, must be set
# SSL TLS connection flag, must be "ssl"
+# CRYPT_SHARED_LIB_PATH The path to crypt_shared library
# Modified/exported environment variables:
# MONGODB_URI MONGODB_URI for single host with auth details and TLS and compressor parameters
# MONGODB_URI_WITH_MULTIPLE_MONGOSES MONGODB_URI with auth details and TLS and compressor parameters
@@ -20,6 +21,8 @@ set -o errexit # Exit the script with error if any of the commands fail
# Main Program #
############################################
+echo "CRYPT_SHARED_LIB_PATH: ${CRYPT_SHARED_LIB_PATH}"
+
if [[ "$AUTH" != "auth" ]]; then
echo "Serverless tests require AUTH to be enabled"
exit 1
diff --git a/evergreen/run-tests.sh b/evergreen/run-tests.sh
index 2c6927f0155..6ff7643df24 100755
--- a/evergreen/run-tests.sh
+++ b/evergreen/run-tests.sh
@@ -69,19 +69,6 @@ provision_compressor () {
# Main Program #
############################################
echo "CRYPT_SHARED_LIB_PATH:" $CRYPT_SHARED_LIB_PATH
-
-if [ "$TARGET" == "TestCsfleWithMongocryptd" ]; then
- if [ ! -z "${CRYPT_SHARED_LIB_PATH}" ]; then
- echo "CRYPT_SHARED_LIB_PATH must be unassigned for CSFLE tests with mongocryptd, but was ${CRYPT_SHARED_LIB_PATH}" 1>&2 # write to stderr
- exit 1
- fi
-else
- if [ -z "${CRYPT_SHARED_LIB_PATH}" ]; then
- echo "CRYPT_SHARED_LIB_PATH must be assigned, but wasn't" 1>&2 # write to stderr"
- exit 1
- fi
-fi
-
echo "Initial MongoDB URI:" $MONGODB_URI
echo "Framework: " $FRAMEWORK
diff --git a/evergreen/set-temp-fle-aws-creds.sh b/evergreen/set-temp-fle-aws-creds.sh
index 53a39c5ea5f..35f36335978 100644
--- a/evergreen/set-temp-fle-aws-creds.sh
+++ b/evergreen/set-temp-fle-aws-creds.sh
@@ -29,10 +29,11 @@ echo "Triggering temporary CSFLE credentials"
get_creds() {
$PYTHON - "$@" << 'EOF'
+import sys
import boto3
client = boto3.client("sts")
credentials = client.get_session_token()["Credentials"]
-print (credentials["AccessKeyId"] + " " + credentials["SecretAccessKey"] + " " + credentials["SessionToken"])
+sys.stdout.write(credentials["AccessKeyId"] + " " + credentials["SecretAccessKey"] + " " + credentials["SessionToken"])
EOF
}
diff --git a/tests/MongoDB.Driver.Tests/Specifications/atlas-data-lake/tests/README.rst b/specifications/atlas-data-lake-testing/tests/README.rst
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/atlas-data-lake/tests/README.rst
rename to specifications/atlas-data-lake-testing/tests/README.rst
diff --git a/tests/MongoDB.Driver.Tests/Specifications/atlas-data-lake/tests/aggregate.json b/specifications/atlas-data-lake-testing/tests/aggregate.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/atlas-data-lake/tests/aggregate.json
rename to specifications/atlas-data-lake-testing/tests/aggregate.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/atlas-data-lake/tests/aggregate.yml b/specifications/atlas-data-lake-testing/tests/aggregate.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/atlas-data-lake/tests/aggregate.yml
rename to specifications/atlas-data-lake-testing/tests/aggregate.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/atlas-data-lake/tests/estimatedDocumentCount.json b/specifications/atlas-data-lake-testing/tests/estimatedDocumentCount.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/atlas-data-lake/tests/estimatedDocumentCount.json
rename to specifications/atlas-data-lake-testing/tests/estimatedDocumentCount.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/atlas-data-lake/tests/estimatedDocumentCount.yml b/specifications/atlas-data-lake-testing/tests/estimatedDocumentCount.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/atlas-data-lake/tests/estimatedDocumentCount.yml
rename to specifications/atlas-data-lake-testing/tests/estimatedDocumentCount.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/atlas-data-lake/tests/find.json b/specifications/atlas-data-lake-testing/tests/find.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/atlas-data-lake/tests/find.json
rename to specifications/atlas-data-lake-testing/tests/find.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/atlas-data-lake/tests/find.yml b/specifications/atlas-data-lake-testing/tests/find.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/atlas-data-lake/tests/find.yml
rename to specifications/atlas-data-lake-testing/tests/find.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/atlas-data-lake/tests/getMore.json b/specifications/atlas-data-lake-testing/tests/getMore.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/atlas-data-lake/tests/getMore.json
rename to specifications/atlas-data-lake-testing/tests/getMore.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/atlas-data-lake/tests/getMore.yml b/specifications/atlas-data-lake-testing/tests/getMore.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/atlas-data-lake/tests/getMore.yml
rename to specifications/atlas-data-lake-testing/tests/getMore.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/atlas-data-lake/tests/listCollections.json b/specifications/atlas-data-lake-testing/tests/listCollections.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/atlas-data-lake/tests/listCollections.json
rename to specifications/atlas-data-lake-testing/tests/listCollections.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/atlas-data-lake/tests/listCollections.yml b/specifications/atlas-data-lake-testing/tests/listCollections.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/atlas-data-lake/tests/listCollections.yml
rename to specifications/atlas-data-lake-testing/tests/listCollections.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/atlas-data-lake/tests/listDatabases.json b/specifications/atlas-data-lake-testing/tests/listDatabases.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/atlas-data-lake/tests/listDatabases.json
rename to specifications/atlas-data-lake-testing/tests/listDatabases.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/atlas-data-lake/tests/listDatabases.yml b/specifications/atlas-data-lake-testing/tests/listDatabases.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/atlas-data-lake/tests/listDatabases.yml
rename to specifications/atlas-data-lake-testing/tests/listDatabases.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/atlas-data-lake/tests/runCommand.json b/specifications/atlas-data-lake-testing/tests/runCommand.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/atlas-data-lake/tests/runCommand.json
rename to specifications/atlas-data-lake-testing/tests/runCommand.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/atlas-data-lake/tests/runCommand.yml b/specifications/atlas-data-lake-testing/tests/runCommand.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/atlas-data-lake/tests/runCommand.yml
rename to specifications/atlas-data-lake-testing/tests/runCommand.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/auth/tests/README.rst b/specifications/auth/tests/README.rst
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/auth/tests/README.rst
rename to specifications/auth/tests/README.rst
diff --git a/tests/MongoDB.Driver.Tests/Specifications/auth/tests/connection-string.json b/specifications/auth/tests/connection-string.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/auth/tests/connection-string.json
rename to specifications/auth/tests/connection-string.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/auth/tests/connection-string.yml b/specifications/auth/tests/connection-string.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/auth/tests/connection-string.yml
rename to specifications/auth/tests/connection-string.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/auth/tests/mongodb-aws.rst b/specifications/auth/tests/mongodb-aws.rst
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/auth/tests/mongodb-aws.rst
rename to specifications/auth/tests/mongodb-aws.rst
diff --git a/tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/array.json b/specifications/bson-corpus/tests/array.json
similarity index 100%
rename from tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/array.json
rename to specifications/bson-corpus/tests/array.json
diff --git a/tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/binary.json b/specifications/bson-corpus/tests/binary.json
similarity index 100%
rename from tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/binary.json
rename to specifications/bson-corpus/tests/binary.json
diff --git a/tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/boolean.json b/specifications/bson-corpus/tests/boolean.json
similarity index 100%
rename from tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/boolean.json
rename to specifications/bson-corpus/tests/boolean.json
diff --git a/tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/bsonview b/specifications/bson-corpus/tests/bsonview
similarity index 100%
rename from tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/bsonview
rename to specifications/bson-corpus/tests/bsonview
diff --git a/tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/code.json b/specifications/bson-corpus/tests/code.json
similarity index 100%
rename from tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/code.json
rename to specifications/bson-corpus/tests/code.json
diff --git a/tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/code_w_scope.json b/specifications/bson-corpus/tests/code_w_scope.json
similarity index 100%
rename from tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/code_w_scope.json
rename to specifications/bson-corpus/tests/code_w_scope.json
diff --git a/tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/datetime.json b/specifications/bson-corpus/tests/datetime.json
similarity index 100%
rename from tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/datetime.json
rename to specifications/bson-corpus/tests/datetime.json
diff --git a/tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/dbpointer.json b/specifications/bson-corpus/tests/dbpointer.json
similarity index 100%
rename from tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/dbpointer.json
rename to specifications/bson-corpus/tests/dbpointer.json
diff --git a/tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/dbref.json b/specifications/bson-corpus/tests/dbref.json
similarity index 100%
rename from tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/dbref.json
rename to specifications/bson-corpus/tests/dbref.json
diff --git a/tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/decimal128-1.json b/specifications/bson-corpus/tests/decimal128-1.json
similarity index 100%
rename from tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/decimal128-1.json
rename to specifications/bson-corpus/tests/decimal128-1.json
diff --git a/tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/decimal128-2.json b/specifications/bson-corpus/tests/decimal128-2.json
similarity index 100%
rename from tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/decimal128-2.json
rename to specifications/bson-corpus/tests/decimal128-2.json
diff --git a/tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/decimal128-3.json b/specifications/bson-corpus/tests/decimal128-3.json
similarity index 100%
rename from tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/decimal128-3.json
rename to specifications/bson-corpus/tests/decimal128-3.json
diff --git a/tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/decimal128-4.json b/specifications/bson-corpus/tests/decimal128-4.json
similarity index 100%
rename from tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/decimal128-4.json
rename to specifications/bson-corpus/tests/decimal128-4.json
diff --git a/tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/decimal128-5.json b/specifications/bson-corpus/tests/decimal128-5.json
similarity index 100%
rename from tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/decimal128-5.json
rename to specifications/bson-corpus/tests/decimal128-5.json
diff --git a/tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/decimal128-6.json b/specifications/bson-corpus/tests/decimal128-6.json
similarity index 100%
rename from tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/decimal128-6.json
rename to specifications/bson-corpus/tests/decimal128-6.json
diff --git a/tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/decimal128-7.json b/specifications/bson-corpus/tests/decimal128-7.json
similarity index 100%
rename from tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/decimal128-7.json
rename to specifications/bson-corpus/tests/decimal128-7.json
diff --git a/tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/document.json b/specifications/bson-corpus/tests/document.json
similarity index 100%
rename from tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/document.json
rename to specifications/bson-corpus/tests/document.json
diff --git a/tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/double.json b/specifications/bson-corpus/tests/double.json
similarity index 100%
rename from tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/double.json
rename to specifications/bson-corpus/tests/double.json
diff --git a/tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/int32.json b/specifications/bson-corpus/tests/int32.json
similarity index 100%
rename from tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/int32.json
rename to specifications/bson-corpus/tests/int32.json
diff --git a/tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/int64.json b/specifications/bson-corpus/tests/int64.json
similarity index 100%
rename from tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/int64.json
rename to specifications/bson-corpus/tests/int64.json
diff --git a/tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/maxkey.json b/specifications/bson-corpus/tests/maxkey.json
similarity index 100%
rename from tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/maxkey.json
rename to specifications/bson-corpus/tests/maxkey.json
diff --git a/tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/minkey.json b/specifications/bson-corpus/tests/minkey.json
similarity index 100%
rename from tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/minkey.json
rename to specifications/bson-corpus/tests/minkey.json
diff --git a/tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/multi-type-deprecated.json b/specifications/bson-corpus/tests/multi-type-deprecated.json
similarity index 100%
rename from tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/multi-type-deprecated.json
rename to specifications/bson-corpus/tests/multi-type-deprecated.json
diff --git a/tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/multi-type.json b/specifications/bson-corpus/tests/multi-type.json
similarity index 100%
rename from tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/multi-type.json
rename to specifications/bson-corpus/tests/multi-type.json
diff --git a/tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/null.json b/specifications/bson-corpus/tests/null.json
similarity index 100%
rename from tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/null.json
rename to specifications/bson-corpus/tests/null.json
diff --git a/tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/oid.json b/specifications/bson-corpus/tests/oid.json
similarity index 100%
rename from tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/oid.json
rename to specifications/bson-corpus/tests/oid.json
diff --git a/tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/regex.json b/specifications/bson-corpus/tests/regex.json
similarity index 100%
rename from tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/regex.json
rename to specifications/bson-corpus/tests/regex.json
diff --git a/tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/string.json b/specifications/bson-corpus/tests/string.json
similarity index 100%
rename from tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/string.json
rename to specifications/bson-corpus/tests/string.json
diff --git a/tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/symbol.json b/specifications/bson-corpus/tests/symbol.json
similarity index 100%
rename from tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/symbol.json
rename to specifications/bson-corpus/tests/symbol.json
diff --git a/tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/timestamp.json b/specifications/bson-corpus/tests/timestamp.json
similarity index 100%
rename from tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/timestamp.json
rename to specifications/bson-corpus/tests/timestamp.json
diff --git a/tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/top.json b/specifications/bson-corpus/tests/top.json
similarity index 100%
rename from tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/top.json
rename to specifications/bson-corpus/tests/top.json
diff --git a/tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/undefined.json b/specifications/bson-corpus/tests/undefined.json
similarity index 100%
rename from tests/MongoDB.Bson.Tests/Specifications/bson-corpus/tests/undefined.json
rename to specifications/bson-corpus/tests/undefined.json
diff --git a/tests/MongoDB.Bson.Tests/Specifications/bson/tests/README.md b/specifications/bson-decimal128/tests/README.md
similarity index 100%
rename from tests/MongoDB.Bson.Tests/Specifications/bson/tests/README.md
rename to specifications/bson-decimal128/tests/README.md
diff --git a/tests/MongoDB.Bson.Tests/Specifications/bson/tests/decimal128-1.json b/specifications/bson-decimal128/tests/decimal128-1.json
similarity index 100%
rename from tests/MongoDB.Bson.Tests/Specifications/bson/tests/decimal128-1.json
rename to specifications/bson-decimal128/tests/decimal128-1.json
diff --git a/tests/MongoDB.Bson.Tests/Specifications/bson/tests/decimal128-2.json b/specifications/bson-decimal128/tests/decimal128-2.json
similarity index 100%
rename from tests/MongoDB.Bson.Tests/Specifications/bson/tests/decimal128-2.json
rename to specifications/bson-decimal128/tests/decimal128-2.json
diff --git a/tests/MongoDB.Bson.Tests/Specifications/bson/tests/decimal128-3.json b/specifications/bson-decimal128/tests/decimal128-3.json
similarity index 100%
rename from tests/MongoDB.Bson.Tests/Specifications/bson/tests/decimal128-3.json
rename to specifications/bson-decimal128/tests/decimal128-3.json
diff --git a/tests/MongoDB.Bson.Tests/Specifications/bson/tests/decimal128-4.json b/specifications/bson-decimal128/tests/decimal128-4.json
similarity index 100%
rename from tests/MongoDB.Bson.Tests/Specifications/bson/tests/decimal128-4.json
rename to specifications/bson-decimal128/tests/decimal128-4.json
diff --git a/tests/MongoDB.Bson.Tests/Specifications/bson/tests/decimal128-5.json b/specifications/bson-decimal128/tests/decimal128-5.json
similarity index 100%
rename from tests/MongoDB.Bson.Tests/Specifications/bson/tests/decimal128-5.json
rename to specifications/bson-decimal128/tests/decimal128-5.json
diff --git a/tests/MongoDB.Bson.Tests/Specifications/bson/tests/decimal128-6.json b/specifications/bson-decimal128/tests/decimal128-6.json
similarity index 100%
rename from tests/MongoDB.Bson.Tests/Specifications/bson/tests/decimal128-6.json
rename to specifications/bson-decimal128/tests/decimal128-6.json
diff --git a/tests/MongoDB.Bson.Tests/Specifications/bson/tests/decimal128-7.json b/specifications/bson-decimal128/tests/decimal128-7.json
similarity index 100%
rename from tests/MongoDB.Bson.Tests/Specifications/bson/tests/decimal128-7.json
rename to specifications/bson-decimal128/tests/decimal128-7.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/change-streams/tests/README.rst b/specifications/change-streams/tests/README.rst
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/change-streams/tests/README.rst
rename to specifications/change-streams/tests/README.rst
diff --git a/specifications/change-streams/tests/unified/change-streams-clusterTime.json b/specifications/change-streams/tests/unified/change-streams-clusterTime.json
new file mode 100644
index 00000000000..55b4ae3fbcb
--- /dev/null
+++ b/specifications/change-streams/tests/unified/change-streams-clusterTime.json
@@ -0,0 +1,82 @@
+{
+ "description": "change-streams-clusterTime",
+ "schemaVersion": "1.4",
+ "createEntities": [
+ {
+ "client": {
+ "id": "client0",
+ "useMultipleMongoses": false
+ }
+ },
+ {
+ "database": {
+ "id": "database0",
+ "client": "client0",
+ "databaseName": "database0"
+ }
+ },
+ {
+ "collection": {
+ "id": "collection0",
+ "database": "database0",
+ "collectionName": "collection0"
+ }
+ }
+ ],
+ "runOnRequirements": [
+ {
+ "minServerVersion": "4.0.0",
+ "topologies": [
+ "replicaset",
+ "sharded-replicaset",
+ "load-balanced",
+ "sharded"
+ ],
+ "serverless": "forbid"
+ }
+ ],
+ "initialData": [
+ {
+ "collectionName": "collection0",
+ "databaseName": "database0",
+ "documents": []
+ }
+ ],
+ "tests": [
+ {
+ "description": "clusterTime is present",
+ "operations": [
+ {
+ "name": "createChangeStream",
+ "object": "collection0",
+ "arguments": {
+ "pipeline": []
+ },
+ "saveResultAsEntity": "changeStream0"
+ },
+ {
+ "name": "insertOne",
+ "object": "collection0",
+ "arguments": {
+ "document": {
+ "_id": 1
+ }
+ }
+ },
+ {
+ "name": "iterateUntilDocumentOrError",
+ "object": "changeStream0",
+ "expectResult": {
+ "ns": {
+ "db": "database0",
+ "coll": "collection0"
+ },
+ "clusterTime": {
+ "$$exists": true
+ }
+ }
+ }
+ ]
+ }
+ ]
+}
diff --git a/specifications/change-streams/tests/unified/change-streams-clusterTime.yml b/specifications/change-streams/tests/unified/change-streams-clusterTime.yml
new file mode 100644
index 00000000000..997d4d57618
--- /dev/null
+++ b/specifications/change-streams/tests/unified/change-streams-clusterTime.yml
@@ -0,0 +1,41 @@
+description: "change-streams-clusterTime"
+schemaVersion: "1.4"
+createEntities:
+ - client:
+ id: &client0 client0
+ useMultipleMongoses: false
+ - database:
+ id: &database0 database0
+ client: *client0
+ databaseName: *database0
+ - collection:
+ id: &collection0 collection0
+ database: *database0
+ collectionName: *collection0
+
+runOnRequirements:
+ - minServerVersion: "4.0.0"
+ topologies: [ replicaset, sharded-replicaset, load-balanced, sharded ]
+ serverless: forbid
+
+initialData:
+ - collectionName: *collection0
+ databaseName: *database0
+ documents: []
+
+tests:
+ - description: "clusterTime is present"
+ operations:
+ - name: createChangeStream
+ object: *collection0
+ arguments: { pipeline: [] }
+ saveResultAsEntity: &changeStream0 changeStream0
+ - name: insertOne
+ object: *collection0
+ arguments:
+ document: { _id: 1 }
+ - name: iterateUntilDocumentOrError
+ object: *changeStream0
+ expectResult:
+ ns: { db: *database0, coll: *collection0 }
+ clusterTime: { $$exists: true }
diff --git a/specifications/change-streams/tests/unified/change-streams-disambiguatedPaths.json b/specifications/change-streams/tests/unified/change-streams-disambiguatedPaths.json
new file mode 100644
index 00000000000..91d8e66da20
--- /dev/null
+++ b/specifications/change-streams/tests/unified/change-streams-disambiguatedPaths.json
@@ -0,0 +1,252 @@
+{
+ "description": "disambiguatedPaths",
+ "schemaVersion": "1.4",
+ "createEntities": [
+ {
+ "client": {
+ "id": "client0",
+ "useMultipleMongoses": false
+ }
+ },
+ {
+ "database": {
+ "id": "database0",
+ "client": "client0",
+ "databaseName": "database0"
+ }
+ },
+ {
+ "collection": {
+ "id": "collection0",
+ "database": "database0",
+ "collectionName": "collection0"
+ }
+ }
+ ],
+ "runOnRequirements": [
+ {
+ "minServerVersion": "6.1.0",
+ "topologies": [
+ "replicaset",
+ "sharded-replicaset",
+ "load-balanced",
+ "sharded"
+ ],
+ "serverless": "forbid"
+ }
+ ],
+ "initialData": [
+ {
+ "collectionName": "collection0",
+ "databaseName": "database0",
+ "documents": []
+ }
+ ],
+ "tests": [
+ {
+ "description": "disambiguatedPaths is not present when showExpandedEvents is false/unset",
+ "operations": [
+ {
+ "name": "insertOne",
+ "object": "collection0",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "a": {
+ "1": 1
+ }
+ }
+ }
+ },
+ {
+ "name": "createChangeStream",
+ "object": "collection0",
+ "arguments": {
+ "pipeline": []
+ },
+ "saveResultAsEntity": "changeStream0"
+ },
+ {
+ "name": "updateOne",
+ "object": "collection0",
+ "arguments": {
+ "filter": {
+ "_id": 1
+ },
+ "update": {
+ "$set": {
+ "a.1": 2
+ }
+ }
+ }
+ },
+ {
+ "name": "iterateUntilDocumentOrError",
+ "object": "changeStream0",
+ "expectResult": {
+ "operationType": "update",
+ "ns": {
+ "db": "database0",
+ "coll": "collection0"
+ },
+ "updateDescription": {
+ "updatedFields": {
+ "$$exists": true
+ },
+ "removedFields": {
+ "$$exists": true
+ },
+ "truncatedArrays": {
+ "$$exists": true
+ },
+ "disambiguatedPaths": {
+ "$$exists": false
+ }
+ }
+ }
+ }
+ ]
+ },
+ {
+ "description": "disambiguatedPaths is present on updateDescription when an ambiguous path is present",
+ "operations": [
+ {
+ "name": "insertOne",
+ "object": "collection0",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "a": {
+ "1": 1
+ }
+ }
+ }
+ },
+ {
+ "name": "createChangeStream",
+ "object": "collection0",
+ "arguments": {
+ "pipeline": [],
+ "showExpandedEvents": true
+ },
+ "saveResultAsEntity": "changeStream0"
+ },
+ {
+ "name": "updateOne",
+ "object": "collection0",
+ "arguments": {
+ "filter": {
+ "_id": 1
+ },
+ "update": {
+ "$set": {
+ "a.1": 2
+ }
+ }
+ }
+ },
+ {
+ "name": "iterateUntilDocumentOrError",
+ "object": "changeStream0",
+ "expectResult": {
+ "operationType": "update",
+ "ns": {
+ "db": "database0",
+ "coll": "collection0"
+ },
+ "updateDescription": {
+ "updatedFields": {
+ "$$exists": true
+ },
+ "removedFields": {
+ "$$exists": true
+ },
+ "truncatedArrays": {
+ "$$exists": true
+ },
+ "disambiguatedPaths": {
+ "a.1": [
+ "a",
+ "1"
+ ]
+ }
+ }
+ }
+ }
+ ]
+ },
+ {
+ "description": "disambiguatedPaths returns array indices as integers",
+ "operations": [
+ {
+ "name": "insertOne",
+ "object": "collection0",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "a": [
+ {
+ "1": 1
+ }
+ ]
+ }
+ }
+ },
+ {
+ "name": "createChangeStream",
+ "object": "collection0",
+ "arguments": {
+ "pipeline": [],
+ "showExpandedEvents": true
+ },
+ "saveResultAsEntity": "changeStream0"
+ },
+ {
+ "name": "updateOne",
+ "object": "collection0",
+ "arguments": {
+ "filter": {
+ "_id": 1
+ },
+ "update": {
+ "$set": {
+ "a.0.1": 2
+ }
+ }
+ }
+ },
+ {
+ "name": "iterateUntilDocumentOrError",
+ "object": "changeStream0",
+ "expectResult": {
+ "operationType": "update",
+ "ns": {
+ "db": "database0",
+ "coll": "collection0"
+ },
+ "updateDescription": {
+ "updatedFields": {
+ "$$exists": true
+ },
+ "removedFields": {
+ "$$exists": true
+ },
+ "truncatedArrays": {
+ "$$exists": true
+ },
+ "disambiguatedPaths": {
+ "a.0.1": [
+ "a",
+ {
+ "$$type": "int"
+ },
+ "1"
+ ]
+ }
+ }
+ }
+ }
+ ]
+ }
+ ]
+}
diff --git a/specifications/change-streams/tests/unified/change-streams-disambiguatedPaths.yml b/specifications/change-streams/tests/unified/change-streams-disambiguatedPaths.yml
new file mode 100644
index 00000000000..a2524d23cee
--- /dev/null
+++ b/specifications/change-streams/tests/unified/change-streams-disambiguatedPaths.yml
@@ -0,0 +1,103 @@
+description: "disambiguatedPaths"
+schemaVersion: "1.4"
+createEntities:
+ - client:
+ id: &client0 client0
+ useMultipleMongoses: false
+ - database:
+ id: &database0 database0
+ client: *client0
+ databaseName: *database0
+ - collection:
+ id: &collection0 collection0
+ database: *database0
+ collectionName: *collection0
+
+runOnRequirements:
+ - minServerVersion: "6.1.0"
+ topologies: [ replicaset, sharded-replicaset, load-balanced, sharded ]
+ serverless: forbid
+
+initialData:
+ - collectionName: *collection0
+ databaseName: *database0
+ documents: []
+
+tests:
+ - description: "disambiguatedPaths is not present when showExpandedEvents is false/unset"
+ operations:
+ - name: insertOne
+ object: *collection0
+ arguments:
+ document: { _id: 1, 'a': { '1': 1 } }
+ - name: createChangeStream
+ object: *collection0
+ arguments: { pipeline: [] }
+ saveResultAsEntity: &changeStream0 changeStream0
+ - name: updateOne
+ object: *collection0
+ arguments:
+ filter: { _id: 1 }
+ update: { $set: { 'a.1': 2 } }
+ - name: iterateUntilDocumentOrError
+ object: *changeStream0
+ expectResult:
+ operationType: "update"
+ ns: { db: *database0, coll: *collection0 }
+ updateDescription:
+ updatedFields: { $$exists: true }
+ removedFields: { $$exists: true }
+ truncatedArrays: { $$exists: true }
+ disambiguatedPaths: { $$exists: false }
+
+ - description: "disambiguatedPaths is present on updateDescription when an ambiguous path is present"
+ operations:
+ - name: insertOne
+ object: *collection0
+ arguments:
+ document: { _id: 1, 'a': { '1': 1 } }
+ - name: createChangeStream
+ object: *collection0
+ arguments: { pipeline: [], showExpandedEvents: true }
+ saveResultAsEntity: &changeStream0 changeStream0
+ - name: updateOne
+ object: *collection0
+ arguments:
+ filter: { _id: 1 }
+ update: { $set: { 'a.1': 2 } }
+ - name: iterateUntilDocumentOrError
+ object: *changeStream0
+ expectResult:
+ operationType: "update"
+ ns: { db: *database0, coll: *collection0 }
+ updateDescription:
+ updatedFields: { $$exists: true }
+ removedFields: { $$exists: true }
+ truncatedArrays: { $$exists: true }
+ disambiguatedPaths: { 'a.1': ['a', '1'] }
+
+ - description: "disambiguatedPaths returns array indices as integers"
+ operations:
+ - name: insertOne
+ object: *collection0
+ arguments:
+ document: { _id: 1, 'a': [{'1': 1 }] }
+ - name: createChangeStream
+ object: *collection0
+ arguments: { pipeline: [], showExpandedEvents: true }
+ saveResultAsEntity: &changeStream0 changeStream0
+ - name: updateOne
+ object: *collection0
+ arguments:
+ filter: { _id: 1 }
+ update: { $set: { 'a.0.1': 2 } }
+ - name: iterateUntilDocumentOrError
+ object: *changeStream0
+ expectResult:
+ operationType: "update"
+ ns: { db: *database0, coll: *collection0 }
+ updateDescription:
+ updatedFields: { $$exists: true }
+ removedFields: { $$exists: true }
+ truncatedArrays: { $$exists: true }
+ disambiguatedPaths: { 'a.0.1': ['a', { $$type: 'int' }, '1'] }
diff --git a/tests/MongoDB.Driver.Tests/Specifications/change-streams/tests/unified/change-streams-errors.json b/specifications/change-streams/tests/unified/change-streams-errors.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/change-streams/tests/unified/change-streams-errors.json
rename to specifications/change-streams/tests/unified/change-streams-errors.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/change-streams/tests/unified/change-streams-errors.yml b/specifications/change-streams/tests/unified/change-streams-errors.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/change-streams/tests/unified/change-streams-errors.yml
rename to specifications/change-streams/tests/unified/change-streams-errors.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/change-streams/tests/unified/change-streams-pre_and_post_images.json b/specifications/change-streams/tests/unified/change-streams-pre_and_post_images.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/change-streams/tests/unified/change-streams-pre_and_post_images.json
rename to specifications/change-streams/tests/unified/change-streams-pre_and_post_images.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/change-streams/tests/unified/change-streams-pre_and_post_images.yml b/specifications/change-streams/tests/unified/change-streams-pre_and_post_images.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/change-streams/tests/unified/change-streams-pre_and_post_images.yml
rename to specifications/change-streams/tests/unified/change-streams-pre_and_post_images.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/change-streams/tests/unified/change-streams-resume-allowlist.json b/specifications/change-streams/tests/unified/change-streams-resume-allowlist.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/change-streams/tests/unified/change-streams-resume-allowlist.json
rename to specifications/change-streams/tests/unified/change-streams-resume-allowlist.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/change-streams/tests/unified/change-streams-resume-allowlist.yml b/specifications/change-streams/tests/unified/change-streams-resume-allowlist.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/change-streams/tests/unified/change-streams-resume-allowlist.yml
rename to specifications/change-streams/tests/unified/change-streams-resume-allowlist.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/change-streams/tests/unified/change-streams-resume-errorLabels.json b/specifications/change-streams/tests/unified/change-streams-resume-errorLabels.json
similarity index 99%
rename from tests/MongoDB.Driver.Tests/Specifications/change-streams/tests/unified/change-streams-resume-errorLabels.json
rename to specifications/change-streams/tests/unified/change-streams-resume-errorLabels.json
index c156b550ce9..f5f4505a9f9 100644
--- a/tests/MongoDB.Driver.Tests/Specifications/change-streams/tests/unified/change-streams-resume-errorLabels.json
+++ b/specifications/change-streams/tests/unified/change-streams-resume-errorLabels.json
@@ -1478,6 +1478,11 @@
},
{
"description": "change stream resumes after StaleShardVersion",
+ "runOnRequirements": [
+ {
+ "maxServerVersion": "6.0.99"
+ }
+ ],
"operations": [
{
"name": "failPoint",
diff --git a/tests/MongoDB.Driver.Tests/Specifications/change-streams/tests/unified/change-streams-resume-errorLabels.yml b/specifications/change-streams/tests/unified/change-streams-resume-errorLabels.yml
similarity index 99%
rename from tests/MongoDB.Driver.Tests/Specifications/change-streams/tests/unified/change-streams-resume-errorLabels.yml
rename to specifications/change-streams/tests/unified/change-streams-resume-errorLabels.yml
index 93374598b1c..5879b59c6ac 100644
--- a/tests/MongoDB.Driver.Tests/Specifications/change-streams/tests/unified/change-streams-resume-errorLabels.yml
+++ b/specifications/change-streams/tests/unified/change-streams-resume-errorLabels.yml
@@ -743,6 +743,9 @@ tests:
databaseName: *database0
- description: change stream resumes after StaleShardVersion
+ runOnRequirements:
+ # StaleShardVersion is obsolete as of 6.1 and is no longer marked as resumable.
+ - maxServerVersion: "6.0.99"
operations:
- name: failPoint
object: testRunner
diff --git a/tests/MongoDB.Driver.Tests/Specifications/change-streams/tests/unified/change-streams-showExpandedEvents.json b/specifications/change-streams/tests/unified/change-streams-showExpandedEvents.json
similarity index 98%
rename from tests/MongoDB.Driver.Tests/Specifications/change-streams/tests/unified/change-streams-showExpandedEvents.json
rename to specifications/change-streams/tests/unified/change-streams-showExpandedEvents.json
index fe852b5443a..a59a818493c 100644
--- a/tests/MongoDB.Driver.Tests/Specifications/change-streams/tests/unified/change-streams-showExpandedEvents.json
+++ b/specifications/change-streams/tests/unified/change-streams-showExpandedEvents.json
@@ -8,7 +8,8 @@
"replicaset",
"sharded-replicaset",
"sharded"
- ]
+ ],
+ "serverless": "forbid"
}
],
"createEntities": [
@@ -275,7 +276,15 @@
"name": "createChangeStream",
"object": "collection0",
"arguments": {
- "pipeline": [],
+ "pipeline": [
+ {
+ "$match": {
+ "operationType": {
+ "$ne": "create"
+ }
+ }
+ }
+ ],
"showExpandedEvents": true
},
"saveResultAsEntity": "changeStream0"
diff --git a/tests/MongoDB.Driver.Tests/Specifications/change-streams/tests/unified/change-streams-showExpandedEvents.yml b/specifications/change-streams/tests/unified/change-streams-showExpandedEvents.yml
similarity index 94%
rename from tests/MongoDB.Driver.Tests/Specifications/change-streams/tests/unified/change-streams-showExpandedEvents.yml
rename to specifications/change-streams/tests/unified/change-streams-showExpandedEvents.yml
index 002e17ed330..7a15ba4b54c 100644
--- a/tests/MongoDB.Driver.Tests/Specifications/change-streams/tests/unified/change-streams-showExpandedEvents.yml
+++ b/specifications/change-streams/tests/unified/change-streams-showExpandedEvents.yml
@@ -3,6 +3,7 @@ schemaVersion: "1.7"
runOnRequirements:
- minServerVersion: "6.0.0"
topologies: [ replicaset, sharded-replicaset, sharded ]
+ serverless: forbid
createEntities:
- client:
id: &client0 client0
@@ -160,7 +161,15 @@ tests:
- name: createChangeStream
object: *collection0
arguments:
- pipeline: []
+ pipeline:
+ # On sharded clusters, the create command run when loading initial
+ # data sometimes is still reported in the change stream. To avoid
+ # this, we exclude the create command when creating the change
+ # stream, but specifically don't exclude other events to still catch
+ # driver errors.
+ - $match:
+ operationType:
+ $ne: create
showExpandedEvents: true
saveResultAsEntity: &changeStream0 changeStream0
- name: createIndex
diff --git a/tests/MongoDB.Driver.Tests/Specifications/change-streams/tests/unified/change-streams.json b/specifications/change-streams/tests/unified/change-streams.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/change-streams/tests/unified/change-streams.json
rename to specifications/change-streams/tests/unified/change-streams.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/change-streams/tests/unified/change-streams.yml b/specifications/change-streams/tests/unified/change-streams.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/change-streams/tests/unified/change-streams.yml
rename to specifications/change-streams/tests/unified/change-streams.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/prose-tests/corpus/corpus-encrypted.json b/specifications/client-side-encryption/prose-tests/corpus/corpus-encrypted.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/prose-tests/corpus/corpus-encrypted.json
rename to specifications/client-side-encryption/prose-tests/corpus/corpus-encrypted.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/prose-tests/corpus/corpus-key-aws.json b/specifications/client-side-encryption/prose-tests/corpus/corpus-key-aws.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/prose-tests/corpus/corpus-key-aws.json
rename to specifications/client-side-encryption/prose-tests/corpus/corpus-key-aws.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/prose-tests/corpus/corpus-key-azure.json b/specifications/client-side-encryption/prose-tests/corpus/corpus-key-azure.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/prose-tests/corpus/corpus-key-azure.json
rename to specifications/client-side-encryption/prose-tests/corpus/corpus-key-azure.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/prose-tests/corpus/corpus-key-gcp.json b/specifications/client-side-encryption/prose-tests/corpus/corpus-key-gcp.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/prose-tests/corpus/corpus-key-gcp.json
rename to specifications/client-side-encryption/prose-tests/corpus/corpus-key-gcp.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/prose-tests/corpus/corpus-key-kmip.json b/specifications/client-side-encryption/prose-tests/corpus/corpus-key-kmip.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/prose-tests/corpus/corpus-key-kmip.json
rename to specifications/client-side-encryption/prose-tests/corpus/corpus-key-kmip.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/prose-tests/corpus/corpus-key-local.json b/specifications/client-side-encryption/prose-tests/corpus/corpus-key-local.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/prose-tests/corpus/corpus-key-local.json
rename to specifications/client-side-encryption/prose-tests/corpus/corpus-key-local.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/prose-tests/corpus/corpus-schema.json b/specifications/client-side-encryption/prose-tests/corpus/corpus-schema.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/prose-tests/corpus/corpus-schema.json
rename to specifications/client-side-encryption/prose-tests/corpus/corpus-schema.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/prose-tests/corpus/corpus.json b/specifications/client-side-encryption/prose-tests/corpus/corpus.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/prose-tests/corpus/corpus.json
rename to specifications/client-side-encryption/prose-tests/corpus/corpus.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/prose-tests/etc/data/encryptedFields.json b/specifications/client-side-encryption/prose-tests/etc/data/encryptedFields.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/prose-tests/etc/data/encryptedFields.json
rename to specifications/client-side-encryption/prose-tests/etc/data/encryptedFields.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/prose-tests/etc/data/keys/key1-document.json b/specifications/client-side-encryption/prose-tests/etc/data/keys/key1-document.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/prose-tests/etc/data/keys/key1-document.json
rename to specifications/client-side-encryption/prose-tests/etc/data/keys/key1-document.json
diff --git a/specifications/client-side-encryption/prose-tests/etc/data/range-encryptedFields-Date.json b/specifications/client-side-encryption/prose-tests/etc/data/range-encryptedFields-Date.json
new file mode 100644
index 00000000000..e19fc1e1826
--- /dev/null
+++ b/specifications/client-side-encryption/prose-tests/etc/data/range-encryptedFields-Date.json
@@ -0,0 +1,30 @@
+{
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDate",
+ "bsonType": "date",
+ "queries": {
+ "queryType": "rangePreview",
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ },
+ "max": {
+ "$date": {
+ "$numberLong": "200"
+ }
+ }
+ }
+ }
+ ]
+}
diff --git a/specifications/client-side-encryption/prose-tests/etc/data/range-encryptedFields-DecimalNoPrecision.json b/specifications/client-side-encryption/prose-tests/etc/data/range-encryptedFields-DecimalNoPrecision.json
new file mode 100644
index 00000000000..c6d129d4ca1
--- /dev/null
+++ b/specifications/client-side-encryption/prose-tests/etc/data/range-encryptedFields-DecimalNoPrecision.json
@@ -0,0 +1,21 @@
+{
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDecimalNoPrecision",
+ "bsonType": "decimal",
+ "queries": {
+ "queryType": "rangePreview",
+ "sparsity": {
+ "$numberInt": "1"
+ }
+ }
+ }
+ ]
+ }
+
\ No newline at end of file
diff --git a/specifications/client-side-encryption/prose-tests/etc/data/range-encryptedFields-DecimalPrecision.json b/specifications/client-side-encryption/prose-tests/etc/data/range-encryptedFields-DecimalPrecision.json
new file mode 100644
index 00000000000..c23c3fa923c
--- /dev/null
+++ b/specifications/client-side-encryption/prose-tests/etc/data/range-encryptedFields-DecimalPrecision.json
@@ -0,0 +1,29 @@
+{
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDecimalPrecision",
+ "bsonType": "decimal",
+ "queries": {
+ "queryType": "rangePreview",
+ "sparsity": {
+ "$numberInt": "1"
+ },
+ "min": {
+ "$numberDecimal": "0.0"
+ },
+ "max": {
+ "$numberDecimal": "200.0"
+ },
+ "precision": {
+ "$numberInt": "2"
+ }
+ }
+ }
+ ]
+}
diff --git a/specifications/client-side-encryption/prose-tests/etc/data/range-encryptedFields-DoubleNoPrecision.json b/specifications/client-side-encryption/prose-tests/etc/data/range-encryptedFields-DoubleNoPrecision.json
new file mode 100644
index 00000000000..4af6422714b
--- /dev/null
+++ b/specifications/client-side-encryption/prose-tests/etc/data/range-encryptedFields-DoubleNoPrecision.json
@@ -0,0 +1,21 @@
+{
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDoubleNoPrecision",
+ "bsonType": "double",
+ "queries": {
+ "queryType": "rangePreview",
+ "sparsity": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ ]
+ }
+
\ No newline at end of file
diff --git a/specifications/client-side-encryption/prose-tests/etc/data/range-encryptedFields-DoublePrecision.json b/specifications/client-side-encryption/prose-tests/etc/data/range-encryptedFields-DoublePrecision.json
new file mode 100644
index 00000000000..c1f388219db
--- /dev/null
+++ b/specifications/client-side-encryption/prose-tests/etc/data/range-encryptedFields-DoublePrecision.json
@@ -0,0 +1,30 @@
+{
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDoublePrecision",
+ "bsonType": "double",
+ "queries": {
+ "queryType": "rangePreview",
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberDouble": "0.0"
+ },
+ "max": {
+ "$numberDouble": "200.0"
+ },
+ "precision": {
+ "$numberInt": "2"
+ }
+ }
+ }
+ ]
+ }
+
\ No newline at end of file
diff --git a/specifications/client-side-encryption/prose-tests/etc/data/range-encryptedFields-Int.json b/specifications/client-side-encryption/prose-tests/etc/data/range-encryptedFields-Int.json
new file mode 100644
index 00000000000..217bf6743c8
--- /dev/null
+++ b/specifications/client-side-encryption/prose-tests/etc/data/range-encryptedFields-Int.json
@@ -0,0 +1,27 @@
+{
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedInt",
+ "bsonType": "int",
+ "queries": {
+ "queryType": "rangePreview",
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberInt": "0"
+ },
+ "max": {
+ "$numberInt": "200"
+ }
+ }
+ }
+ ]
+ }
+
\ No newline at end of file
diff --git a/specifications/client-side-encryption/prose-tests/etc/data/range-encryptedFields-Long.json b/specifications/client-side-encryption/prose-tests/etc/data/range-encryptedFields-Long.json
new file mode 100644
index 00000000000..0fb87edaeff
--- /dev/null
+++ b/specifications/client-side-encryption/prose-tests/etc/data/range-encryptedFields-Long.json
@@ -0,0 +1,27 @@
+{
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedLong",
+ "bsonType": "long",
+ "queries": {
+ "queryType": "rangePreview",
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberLong": "0"
+ },
+ "max": {
+ "$numberLong": "200"
+ }
+ }
+ }
+ ]
+ }
+
\ No newline at end of file
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/prose-tests/external/external-key.json b/specifications/client-side-encryption/prose-tests/external/external-key.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/prose-tests/external/external-key.json
rename to specifications/client-side-encryption/prose-tests/external/external-key.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/prose-tests/external/external-schema.json b/specifications/client-side-encryption/prose-tests/external/external-schema.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/prose-tests/external/external-schema.json
rename to specifications/client-side-encryption/prose-tests/external/external-schema.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/prose-tests/limits/limits-doc.json b/specifications/client-side-encryption/prose-tests/limits/limits-doc.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/prose-tests/limits/limits-doc.json
rename to specifications/client-side-encryption/prose-tests/limits/limits-doc.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/prose-tests/limits/limits-key.json b/specifications/client-side-encryption/prose-tests/limits/limits-key.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/prose-tests/limits/limits-key.json
rename to specifications/client-side-encryption/prose-tests/limits/limits-key.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/prose-tests/limits/limits-schema.json b/specifications/client-side-encryption/prose-tests/limits/limits-schema.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/prose-tests/limits/limits-schema.json
rename to specifications/client-side-encryption/prose-tests/limits/limits-schema.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/README.rst b/specifications/client-side-encryption/tests/legacy/README.rst
similarity index 89%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/README.rst
rename to specifications/client-side-encryption/tests/legacy/README.rst
index c22f71f876f..b2a48f9fda7 100644
--- a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/README.rst
+++ b/specifications/client-side-encryption/tests/legacy/README.rst
@@ -330,6 +330,11 @@ Using ``crypt_shared``
On platforms where crypt_shared_ is available, drivers should prefer to test
with the ``crypt_shared`` library instead of spawning mongocryptd.
+crypt_shared_ is released alongside the server.
+crypt_shared_ is only available in versions 6.0 and above.
+Drivers SHOULD prefer testing a version of crypt_shared_ that matches the server version being tested.
+Driver tests on server versions less than 6.0 SHOULD use mongocryptd.
+
Drivers MUST continue to run all tests with mongocryptd on at least one
platform for all tested server versions.
@@ -1656,6 +1661,7 @@ Use ``clientEncryption`` to encrypt the value "encrypted indexed value" with the
class EncryptOpts {
keyId :
algorithm: "Indexed",
+ contentionFactor: 0
}
Store the result in ``insertPayload``.
@@ -1669,7 +1675,8 @@ Use ``clientEncryption`` to encrypt the value "encrypted indexed value" with the
class EncryptOpts {
keyId :
algorithm: "Indexed",
- queryType: Equality
+ queryType: "equality",
+ contentionFactor: 0
}
Store the result in ``findPayload``.
@@ -1704,7 +1711,8 @@ Use ``clientEncryption`` to encrypt the value "encrypted indexed value" with the
class EncryptOpts {
keyId :
algorithm: "Indexed",
- queryType: Equality
+ queryType: "equality",
+ contentionFactor: 0
}
Store the result in ``findPayload``.
@@ -1720,7 +1728,7 @@ Use ``clientEncryption`` to encrypt the value "encrypted indexed value" with the
class EncryptOpts {
keyId :
algorithm: "Indexed",
- queryType: Equality,
+ queryType: "equality",
contentionFactor: 10
}
@@ -1760,6 +1768,7 @@ Use ``clientEncryption`` to encrypt the value "encrypted indexed value" with the
class EncryptOpts {
keyId :
algorithm: "Indexed",
+ contentionFactor: 0
}
Store the result in ``payload``.
@@ -1785,6 +1794,8 @@ Use ``clientEncryption`` to decrypt ``payload``. Assert the returned value equal
13. Unique Index on keyAltNames
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+The following setup must occur before running each of the following test cases.
+
Setup
`````
@@ -1817,8 +1828,8 @@ The command should be equivalent to:
5. Using ``client_encryption``, create a data key with a ``local`` KMS provider and the keyAltName "def".
-Case 1: createKey()
-```````````````````
+Case 1: createDataKey()
+```````````````````````
1. Use ``client_encryption`` to create a new local data key with a keyAltName "abc" and assert the operation does not fail.
@@ -1833,8 +1844,273 @@ Case 2: addKeyAltName()
2. Use ``client_encryption`` to add a keyAltName "abc" to the key created in Step 1 and assert the operation does not fail.
-3. Repeat Step 2 and assert the operation does not fail.
+3. Repeat Step 2, assert the operation does not fail, and assert the returned key document contains the keyAltName "abc" added in Step 2.
4. Use ``client_encryption`` to add a keyAltName "def" to the key created in Step 1 and assert the operation fails due to a duplicate key server error (error code 11000).
-5. Use ``client_encryption`` to add a keyAltName "def" to the existing key and assert the operation does not fail.
+5. Use ``client_encryption`` to add a keyAltName "def" to the existing key, assert the operation does not fail, and assert the returned key document contains the keyAltName "def" added during Setup.
+
+14. Decryption Events
+~~~~~~~~~~~~~~~~~~~~~
+
+Before running each of the following test cases, perform the following Test Setup.
+
+Test Setup
+``````````
+
+Create a MongoClient named ``setupClient``.
+
+Drop and create the collection ``db.decryption_events``.
+
+Create a ClientEncryption object named ``clientEncryption`` with these options:
+
+.. code:: typescript
+
+ ClientEncryptionOpts {
+ keyVaultClient: ,
+ keyVaultNamespace: "keyvault.datakeys",
+ kmsProviders: { "local": { "key": } }
+ }
+
+Create a data key with the "local" KMS provider. Storing the result in a variable named ``keyID``.
+
+Use ``clientEncryption`` to encrypt the string "hello" with the following ``EncryptOpts``:
+
+.. code:: typescript
+
+ EncryptOpts {
+ keyId: ,
+ algorithm: "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic"
+ }
+
+Store the result in a variable named ``ciphertext``.
+
+Copy ``ciphertext`` into a variable named ``malformedCiphertext``. Change the
+last byte to a different value. This will produce an invalid HMAC tag.
+
+Create a MongoClient named ``encryptedClient`` with these ``AutoEncryptionOpts``:
+
+.. code:: typescript
+
+ AutoEncryptionOpts {
+ keyVaultNamespace: "keyvault.datakeys";
+ kmsProviders: { "local": { "key": } }
+ }
+
+Configure ``encryptedClient`` with "retryReads=false".
+Register a listener for CommandSucceeded events on ``encryptedClient``.
+The listener must store the most recent ``CommandSucceededEvent`` reply for the "aggregate" command.
+The listener must store the most recent ``CommandFailedEvent`` error for the "aggregate" command.
+
+Case 1: Command Error
+`````````````````````
+
+Use ``setupClient`` to configure the following failpoint:
+
+.. code:: typescript
+
+ {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 1
+ },
+ "data": {
+ "errorCode": 123,
+ "failCommands": [
+ "aggregate"
+ ]
+ }
+ }
+
+Use ``encryptedClient`` to run an aggregate on ``db.decryption_events``.
+
+Expect an exception to be thrown from the command error. Expect a ``CommandFailedEvent``.
+
+Case 2: Network Error
+`````````````````````
+
+Use ``setupClient`` to configure the following failpoint:
+
+.. code:: typescript
+
+ {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 1
+ },
+ "data": {
+ "errorCode": 123,
+ "closeConnection": true,
+ "failCommands": [
+ "aggregate"
+ ]
+ }
+ }
+
+Use ``encryptedClient`` to run an aggregate on ``db.decryption_events``.
+
+Expect an exception to be thrown from the network error. Expect a ``CommandFailedEvent``.
+
+Case 3: Decrypt Error
+`````````````````````
+
+Use ``encryptedClient`` to insert the document ``{ "encrypted": }`` into ``db.decryption_events``.
+
+Use ``encryptedClient`` to run an aggregate on ``db.decryption_events`` with an empty pipeline.
+
+Expect an exception to be thrown from the decryption error.
+Expect a ``CommandSucceededEvent``. Expect the ``CommandSucceededEvent.reply`` to contain BSON binary for the field ``cursor.firstBatch.encrypted``.
+
+Case 4: Decrypt Success
+```````````````````````
+
+Use ``encryptedClient`` to insert the document ``{ "encrypted": }`` into ``db.decryption_events``.
+
+Use ``encryptedClient`` to run an aggregate on ``db.decryption_events`` with an empty pipeline.
+
+Expect no exception.
+Expect a ``CommandSucceededEvent``. Expect the ``CommandSucceededEvent.reply`` to contain BSON binary for the field ``cursor.firstBatch.encrypted``.
+
+
+15. On-demand AWS Credentials
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+These tests require valid AWS credentials. Refer: `Automatic AWS Credentials`_.
+
+For these cases, create a ClientEncryption_ object :math:`C` with the following
+options:
+
+.. code-block:: typescript
+
+ ClientEncryptionOpts {
+ keyVaultClient: ,
+ keyVaultNamespace: "keyvault.datakeys",
+ kmsProviders: { "aws": {} },
+ }
+
+Case 1: Failure
+```````````````
+
+Do not run this test case in an environment where AWS credentials are available
+(e.g. via environment variables or a metadata URL). (Refer:
+`Obtaining credentials for AWS `_)
+
+Attempt to create a datakey with :math:`C` using the ``"aws"`` KMS provider.
+Expect this to fail due to a lack of KMS provider credentials.
+
+Case 2: Success
+```````````````
+
+For this test case, the environment variables ``AWS_ACCESS_KEY_ID`` and
+``AWS_SECRET_ACCESS_KEY`` must be defined and set to a valid set of AWS
+credentials.
+
+Use the client encryption to create a datakey using the ``"aws"`` KMS provider.
+This should successfully load and use the AWS credentials that were defined in
+the environment.
+
+.. _Automatic AWS Credentials: ../client-side-encryption.rst#automatic-aws-credentials
+.. _ClientEncryption: ../client-side-encryption.rst#clientencryption
+.. _auth-aws: ../../auth/auth.rst#obtaining-credentials
+
+16. Rewrap
+~~~~~~~~~~
+
+Case 1: Rewrap with separate ClientEncryption
+`````````````````````````````````````````````
+
+When the following test case requests setting ``masterKey``, use the following values based on the KMS provider:
+
+For "aws":
+
+.. code:: javascript
+
+ {
+ "region": "us-east-1",
+ "key": "arn:aws:kms:us-east-1:579766882180:key/89fcc2c4-08b0-4bd9-9f25-e30687b580d0"
+ }
+
+For "azure":
+
+.. code:: javascript
+
+ {
+ "keyVaultEndpoint": "key-vault-csfle.vault.azure.net",
+ "keyName": "key-name-csfle"
+ }
+
+For "gcp":
+
+.. code:: javascript
+
+ {
+ "projectId": "devprod-drivers",
+ "location": "global",
+ "keyRing": "key-ring-csfle",
+ "keyName": "key-name-csfle"
+ }
+
+For "kmip":
+
+.. code:: javascript
+
+ {}
+
+For "local", do not set a masterKey document.
+
+Run the following test case for each pair of KMS providers (referred to as ``srcProvider`` and ``dstProvider``).
+Include pairs where ``srcProvider`` equals ``dstProvider``.
+
+1. Drop the collection ``keyvault.datakeys``.
+
+2. Create a ``ClientEncryption`` object named ``clientEncryption1`` with these options:
+ .. code:: typescript
+
+ ClientEncryptionOpts {
+ keyVaultClient: ;
+ keyVaultNamespace: "keyvault.datakeys";
+ kmsProviders:
+ }
+
+3. Call ``clientEncryption1.createDataKey`` with ``srcProvider`` and these options:
+ .. code:: typescript
+
+ class DataKeyOpts {
+ masterKey:
+ }
+
+ Store the return value in ``keyID``.
+
+4. Call ``clientEncryption1.encrypt`` with the value "test" and these options:
+ .. code:: typescript
+
+ class EncryptOpts {
+ keyId : keyID,
+ algorithm: "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic"
+ }
+
+ Store the return value in ``ciphertext``.
+
+5. Create a ``ClientEncryption`` object named ``clientEncryption2`` with these options:
+ .. code:: typescript
+
+ ClientEncryptionOpts {
+ keyVaultClient: ;
+ keyVaultNamespace: "keyvault.datakeys";
+ kmsProviders:
+ }
+
+6. Call ``clientEncryption2.rewrapManyDataKey`` with an empty ``filter`` and these options:
+
+ .. code:: typescript
+
+ class RewrapManyDataKeyOpts {
+ provider: dstProvider
+ masterKey:
+ }
+
+ Assert that the returned ``RewrapManyDataKeyResult.bulkWriteResult.modifiedCount`` is 1.
+
+7. Call ``clientEncryption1.decrypt`` with the ``ciphertext``. Assert the return value is "test".
+
+8. Call ``clientEncryption2.decrypt`` with the ``ciphertext``. Assert the return value is "test".
\ No newline at end of file
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/aggregate.json b/specifications/client-side-encryption/tests/legacy/aggregate.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/aggregate.json
rename to specifications/client-side-encryption/tests/legacy/aggregate.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/aggregate.yml b/specifications/client-side-encryption/tests/legacy/aggregate.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/aggregate.yml
rename to specifications/client-side-encryption/tests/legacy/aggregate.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/awsTemporary.json b/specifications/client-side-encryption/tests/legacy/awsTemporary.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/awsTemporary.json
rename to specifications/client-side-encryption/tests/legacy/awsTemporary.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/awsTemporary.yml b/specifications/client-side-encryption/tests/legacy/awsTemporary.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/awsTemporary.yml
rename to specifications/client-side-encryption/tests/legacy/awsTemporary.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/azureKMS.json b/specifications/client-side-encryption/tests/legacy/azureKMS.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/azureKMS.json
rename to specifications/client-side-encryption/tests/legacy/azureKMS.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/azureKMS.yml b/specifications/client-side-encryption/tests/legacy/azureKMS.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/azureKMS.yml
rename to specifications/client-side-encryption/tests/legacy/azureKMS.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/badQueries.json b/specifications/client-side-encryption/tests/legacy/badQueries.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/badQueries.json
rename to specifications/client-side-encryption/tests/legacy/badQueries.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/badQueries.yml b/specifications/client-side-encryption/tests/legacy/badQueries.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/badQueries.yml
rename to specifications/client-side-encryption/tests/legacy/badQueries.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/badSchema.json b/specifications/client-side-encryption/tests/legacy/badSchema.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/badSchema.json
rename to specifications/client-side-encryption/tests/legacy/badSchema.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/badSchema.yml b/specifications/client-side-encryption/tests/legacy/badSchema.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/badSchema.yml
rename to specifications/client-side-encryption/tests/legacy/badSchema.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/basic.json b/specifications/client-side-encryption/tests/legacy/basic.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/basic.json
rename to specifications/client-side-encryption/tests/legacy/basic.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/basic.yml b/specifications/client-side-encryption/tests/legacy/basic.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/basic.yml
rename to specifications/client-side-encryption/tests/legacy/basic.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/bulk.json b/specifications/client-side-encryption/tests/legacy/bulk.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/bulk.json
rename to specifications/client-side-encryption/tests/legacy/bulk.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/bulk.yml b/specifications/client-side-encryption/tests/legacy/bulk.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/bulk.yml
rename to specifications/client-side-encryption/tests/legacy/bulk.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/bypassAutoEncryption.json b/specifications/client-side-encryption/tests/legacy/bypassAutoEncryption.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/bypassAutoEncryption.json
rename to specifications/client-side-encryption/tests/legacy/bypassAutoEncryption.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/bypassAutoEncryption.yml b/specifications/client-side-encryption/tests/legacy/bypassAutoEncryption.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/bypassAutoEncryption.yml
rename to specifications/client-side-encryption/tests/legacy/bypassAutoEncryption.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/bypassedCommand.json b/specifications/client-side-encryption/tests/legacy/bypassedCommand.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/bypassedCommand.json
rename to specifications/client-side-encryption/tests/legacy/bypassedCommand.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/bypassedCommand.yml b/specifications/client-side-encryption/tests/legacy/bypassedCommand.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/bypassedCommand.yml
rename to specifications/client-side-encryption/tests/legacy/bypassedCommand.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/count.json b/specifications/client-side-encryption/tests/legacy/count.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/count.json
rename to specifications/client-side-encryption/tests/legacy/count.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/count.yml b/specifications/client-side-encryption/tests/legacy/count.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/count.yml
rename to specifications/client-side-encryption/tests/legacy/count.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/countDocuments.json b/specifications/client-side-encryption/tests/legacy/countDocuments.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/countDocuments.json
rename to specifications/client-side-encryption/tests/legacy/countDocuments.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/countDocuments.yml b/specifications/client-side-encryption/tests/legacy/countDocuments.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/countDocuments.yml
rename to specifications/client-side-encryption/tests/legacy/countDocuments.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/create-and-createIndexes.json b/specifications/client-side-encryption/tests/legacy/create-and-createIndexes.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/create-and-createIndexes.json
rename to specifications/client-side-encryption/tests/legacy/create-and-createIndexes.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/create-and-createIndexes.yml b/specifications/client-side-encryption/tests/legacy/create-and-createIndexes.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/create-and-createIndexes.yml
rename to specifications/client-side-encryption/tests/legacy/create-and-createIndexes.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/delete.json b/specifications/client-side-encryption/tests/legacy/delete.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/delete.json
rename to specifications/client-side-encryption/tests/legacy/delete.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/delete.yml b/specifications/client-side-encryption/tests/legacy/delete.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/delete.yml
rename to specifications/client-side-encryption/tests/legacy/delete.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/distinct.json b/specifications/client-side-encryption/tests/legacy/distinct.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/distinct.json
rename to specifications/client-side-encryption/tests/legacy/distinct.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/distinct.yml b/specifications/client-side-encryption/tests/legacy/distinct.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/distinct.yml
rename to specifications/client-side-encryption/tests/legacy/distinct.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/explain.json b/specifications/client-side-encryption/tests/legacy/explain.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/explain.json
rename to specifications/client-side-encryption/tests/legacy/explain.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/explain.yml b/specifications/client-side-encryption/tests/legacy/explain.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/explain.yml
rename to specifications/client-side-encryption/tests/legacy/explain.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/find.json b/specifications/client-side-encryption/tests/legacy/find.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/find.json
rename to specifications/client-side-encryption/tests/legacy/find.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/find.yml b/specifications/client-side-encryption/tests/legacy/find.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/find.yml
rename to specifications/client-side-encryption/tests/legacy/find.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/findOneAndDelete.json b/specifications/client-side-encryption/tests/legacy/findOneAndDelete.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/findOneAndDelete.json
rename to specifications/client-side-encryption/tests/legacy/findOneAndDelete.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/findOneAndDelete.yml b/specifications/client-side-encryption/tests/legacy/findOneAndDelete.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/findOneAndDelete.yml
rename to specifications/client-side-encryption/tests/legacy/findOneAndDelete.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/findOneAndReplace.json b/specifications/client-side-encryption/tests/legacy/findOneAndReplace.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/findOneAndReplace.json
rename to specifications/client-side-encryption/tests/legacy/findOneAndReplace.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/findOneAndReplace.yml b/specifications/client-side-encryption/tests/legacy/findOneAndReplace.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/findOneAndReplace.yml
rename to specifications/client-side-encryption/tests/legacy/findOneAndReplace.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/findOneAndUpdate.json b/specifications/client-side-encryption/tests/legacy/findOneAndUpdate.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/findOneAndUpdate.json
rename to specifications/client-side-encryption/tests/legacy/findOneAndUpdate.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/findOneAndUpdate.yml b/specifications/client-side-encryption/tests/legacy/findOneAndUpdate.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/findOneAndUpdate.yml
rename to specifications/client-side-encryption/tests/legacy/findOneAndUpdate.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-BypassQueryAnalysis.json b/specifications/client-side-encryption/tests/legacy/fle2-BypassQueryAnalysis.json
similarity index 99%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-BypassQueryAnalysis.json
rename to specifications/client-side-encryption/tests/legacy/fle2-BypassQueryAnalysis.json
index 629faf189db..b8d06e8bcdd 100644
--- a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-BypassQueryAnalysis.json
+++ b/specifications/client-side-encryption/tests/legacy/fle2-BypassQueryAnalysis.json
@@ -4,7 +4,8 @@
"minServerVersion": "6.0.0",
"topology": [
"replicaset",
- "sharded"
+ "sharded",
+ "load-balanced"
]
}
],
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-BypassQueryAnalysis.yml b/specifications/client-side-encryption/tests/legacy/fle2-BypassQueryAnalysis.yml
similarity index 98%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-BypassQueryAnalysis.yml
rename to specifications/client-side-encryption/tests/legacy/fle2-BypassQueryAnalysis.yml
index f653527d367..e6b3d66505a 100644
--- a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-BypassQueryAnalysis.yml
+++ b/specifications/client-side-encryption/tests/legacy/fle2-BypassQueryAnalysis.yml
@@ -1,7 +1,7 @@
runOn:
- minServerVersion: "6.0.0"
# FLE 2 Encrypted collections are not supported on standalone.
- topology: [ "replicaset", "sharded" ]
+ topology: [ "replicaset", "sharded", "load-balanced" ]
database_name: &database_name "default"
collection_name: &collection_name "default"
data: []
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-Compact.json b/specifications/client-side-encryption/tests/legacy/fle2-Compact.json
similarity index 99%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-Compact.json
rename to specifications/client-side-encryption/tests/legacy/fle2-Compact.json
index 46da99cbfc3..6ca0f9ba02c 100644
--- a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-Compact.json
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Compact.json
@@ -4,7 +4,8 @@
"minServerVersion": "6.0.0",
"topology": [
"replicaset",
- "sharded"
+ "sharded",
+ "load-balanced"
]
}
],
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-Compact.yml b/specifications/client-side-encryption/tests/legacy/fle2-Compact.yml
similarity index 98%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-Compact.yml
rename to specifications/client-side-encryption/tests/legacy/fle2-Compact.yml
index b5e788f3698..6e3a198d021 100644
--- a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-Compact.yml
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Compact.yml
@@ -1,7 +1,7 @@
runOn:
- minServerVersion: "6.0.0"
# FLE 2 Encrypted collections are not supported on standalone.
- topology: [ "replicaset", "sharded" ]
+ topology: [ "replicaset", "sharded", "load-balanced" ]
database_name: &database_name "default"
collection_name: &collection_name "default"
data: []
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-CreateCollection.json b/specifications/client-side-encryption/tests/legacy/fle2-CreateCollection.json
similarity index 99%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-CreateCollection.json
rename to specifications/client-side-encryption/tests/legacy/fle2-CreateCollection.json
index 6836f40e040..9f8db41f871 100644
--- a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-CreateCollection.json
+++ b/specifications/client-side-encryption/tests/legacy/fle2-CreateCollection.json
@@ -4,7 +4,8 @@
"minServerVersion": "6.0.0",
"topology": [
"replicaset",
- "sharded"
+ "sharded",
+ "load-balanced"
]
}
],
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-CreateCollection.yml b/specifications/client-side-encryption/tests/legacy/fle2-CreateCollection.yml
similarity index 99%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-CreateCollection.yml
rename to specifications/client-side-encryption/tests/legacy/fle2-CreateCollection.yml
index 160da07ff91..78d7e55e074 100644
--- a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-CreateCollection.yml
+++ b/specifications/client-side-encryption/tests/legacy/fle2-CreateCollection.yml
@@ -2,7 +2,7 @@
runOn:
- minServerVersion: "6.0.0"
# FLE 2 Encrypted collections are not supported on standalone.
- topology: [ "replicaset", "sharded" ]
+ topology: [ "replicaset", "sharded", "load-balanced" ]
database_name: &database_name "default"
collection_name: &collection_name "default"
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-DecryptExistingData.json b/specifications/client-side-encryption/tests/legacy/fle2-DecryptExistingData.json
similarity index 98%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-DecryptExistingData.json
rename to specifications/client-side-encryption/tests/legacy/fle2-DecryptExistingData.json
index c6d0bca0d1a..e622d3334de 100644
--- a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-DecryptExistingData.json
+++ b/specifications/client-side-encryption/tests/legacy/fle2-DecryptExistingData.json
@@ -4,7 +4,8 @@
"minServerVersion": "6.0.0",
"topology": [
"replicaset",
- "sharded"
+ "sharded",
+ "load-balanced"
]
}
],
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-DecryptExistingData.yml b/specifications/client-side-encryption/tests/legacy/fle2-DecryptExistingData.yml
similarity index 97%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-DecryptExistingData.yml
rename to specifications/client-side-encryption/tests/legacy/fle2-DecryptExistingData.yml
index c799eae21dd..d1d0e2384a1 100644
--- a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-DecryptExistingData.yml
+++ b/specifications/client-side-encryption/tests/legacy/fle2-DecryptExistingData.yml
@@ -1,7 +1,7 @@
runOn:
- minServerVersion: "6.0.0"
# FLE 2 Encrypted collections are not supported on standalone.
- topology: [ "replicaset", "sharded" ]
+ topology: [ "replicaset", "sharded", "load-balanced" ]
database_name: &database_name "default"
collection_name: &collection_name "default"
data: [
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-Delete.json b/specifications/client-side-encryption/tests/legacy/fle2-Delete.json
similarity index 99%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-Delete.json
rename to specifications/client-side-encryption/tests/legacy/fle2-Delete.json
index 0e3e06396e5..86871277480 100644
--- a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-Delete.json
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Delete.json
@@ -4,7 +4,8 @@
"minServerVersion": "6.0.0",
"topology": [
"replicaset",
- "sharded"
+ "sharded",
+ "load-balanced"
]
}
],
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-Delete.yml b/specifications/client-side-encryption/tests/legacy/fle2-Delete.yml
similarity index 98%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-Delete.yml
rename to specifications/client-side-encryption/tests/legacy/fle2-Delete.yml
index 6b6714233a7..7dfe1176818 100644
--- a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-Delete.yml
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Delete.yml
@@ -1,7 +1,7 @@
runOn:
- minServerVersion: "6.0.0"
# FLE 2 Encrypted collections are not supported on standalone.
- topology: [ "replicaset", "sharded" ]
+ topology: [ "replicaset", "sharded", "load-balanced" ]
database_name: &database_name "default"
collection_name: &collection_name "default"
data: []
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-EncryptedFields-vs-EncryptedFieldsMap.json b/specifications/client-side-encryption/tests/legacy/fle2-EncryptedFields-vs-EncryptedFieldsMap.json
similarity index 99%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-EncryptedFields-vs-EncryptedFieldsMap.json
rename to specifications/client-side-encryption/tests/legacy/fle2-EncryptedFields-vs-EncryptedFieldsMap.json
index ea3eb4850c1..911b428633a 100644
--- a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-EncryptedFields-vs-EncryptedFieldsMap.json
+++ b/specifications/client-side-encryption/tests/legacy/fle2-EncryptedFields-vs-EncryptedFieldsMap.json
@@ -4,7 +4,8 @@
"minServerVersion": "6.0.0",
"topology": [
"replicaset",
- "sharded"
+ "sharded",
+ "load-balanced"
]
}
],
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-EncryptedFields-vs-EncryptedFieldsMap.yml b/specifications/client-side-encryption/tests/legacy/fle2-EncryptedFields-vs-EncryptedFieldsMap.yml
similarity index 98%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-EncryptedFields-vs-EncryptedFieldsMap.yml
rename to specifications/client-side-encryption/tests/legacy/fle2-EncryptedFields-vs-EncryptedFieldsMap.yml
index 5d26e2e8b13..ba4e7a73612 100644
--- a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-EncryptedFields-vs-EncryptedFieldsMap.yml
+++ b/specifications/client-side-encryption/tests/legacy/fle2-EncryptedFields-vs-EncryptedFieldsMap.yml
@@ -1,7 +1,7 @@
runOn:
- minServerVersion: "6.0.0"
# FLE 2 Encrypted collections are not supported on standalone.
- topology: [ "replicaset", "sharded" ]
+ topology: [ "replicaset", "sharded", "load-balanced" ]
database_name: &database_name "default"
collection_name: &collection_name "default"
data: []
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-EncryptedFields-vs-jsonSchema.json b/specifications/client-side-encryption/tests/legacy/fle2-EncryptedFields-vs-jsonSchema.json
similarity index 99%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-EncryptedFields-vs-jsonSchema.json
rename to specifications/client-side-encryption/tests/legacy/fle2-EncryptedFields-vs-jsonSchema.json
index 1d3227ee7f0..f4386483da9 100644
--- a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-EncryptedFields-vs-jsonSchema.json
+++ b/specifications/client-side-encryption/tests/legacy/fle2-EncryptedFields-vs-jsonSchema.json
@@ -4,7 +4,8 @@
"minServerVersion": "6.0.0",
"topology": [
"replicaset",
- "sharded"
+ "sharded",
+ "load-balanced"
]
}
],
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-EncryptedFields-vs-jsonSchema.yml b/specifications/client-side-encryption/tests/legacy/fle2-EncryptedFields-vs-jsonSchema.yml
similarity index 98%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-EncryptedFields-vs-jsonSchema.yml
rename to specifications/client-side-encryption/tests/legacy/fle2-EncryptedFields-vs-jsonSchema.yml
index 6b822ff7249..2ff2e4da1c1 100644
--- a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-EncryptedFields-vs-jsonSchema.yml
+++ b/specifications/client-side-encryption/tests/legacy/fle2-EncryptedFields-vs-jsonSchema.yml
@@ -1,7 +1,7 @@
runOn:
- minServerVersion: "6.0.0"
# FLE 2 Encrypted collections are not supported on standalone.
- topology: [ "replicaset", "sharded" ]
+ topology: [ "replicaset", "sharded", "load-balanced" ]
database_name: &database_name "default"
collection_name: &collection_name "default"
data: []
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-EncryptedFieldsMap-defaults.json b/specifications/client-side-encryption/tests/legacy/fle2-EncryptedFieldsMap-defaults.json
similarity index 98%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-EncryptedFieldsMap-defaults.json
rename to specifications/client-side-encryption/tests/legacy/fle2-EncryptedFieldsMap-defaults.json
index 030952e0564..60820aae95e 100644
--- a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-EncryptedFieldsMap-defaults.json
+++ b/specifications/client-side-encryption/tests/legacy/fle2-EncryptedFieldsMap-defaults.json
@@ -4,7 +4,8 @@
"minServerVersion": "6.0.0",
"topology": [
"replicaset",
- "sharded"
+ "sharded",
+ "load-balanced"
]
}
],
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-EncryptedFieldsMap-defaults.yml b/specifications/client-side-encryption/tests/legacy/fle2-EncryptedFieldsMap-defaults.yml
similarity index 97%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-EncryptedFieldsMap-defaults.yml
rename to specifications/client-side-encryption/tests/legacy/fle2-EncryptedFieldsMap-defaults.yml
index 395b8c27bd1..0ee418db058 100644
--- a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-EncryptedFieldsMap-defaults.yml
+++ b/specifications/client-side-encryption/tests/legacy/fle2-EncryptedFieldsMap-defaults.yml
@@ -1,7 +1,7 @@
runOn:
- minServerVersion: "6.0.0"
# FLE 2 Encrypted collections are not supported on standalone.
- topology: [ "replicaset", "sharded" ]
+ topology: [ "replicaset", "sharded", "load-balanced" ]
database_name: &database_name "default"
collection_name: &collection_name "default"
data: []
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-FindOneAndUpdate.json b/specifications/client-side-encryption/tests/legacy/fle2-FindOneAndUpdate.json
similarity index 99%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-FindOneAndUpdate.json
rename to specifications/client-side-encryption/tests/legacy/fle2-FindOneAndUpdate.json
index b31438876f9..de1b5c5aad0 100644
--- a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-FindOneAndUpdate.json
+++ b/specifications/client-side-encryption/tests/legacy/fle2-FindOneAndUpdate.json
@@ -4,7 +4,8 @@
"minServerVersion": "6.0.0",
"topology": [
"replicaset",
- "sharded"
+ "sharded",
+ "load-balanced"
]
}
],
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-FindOneAndUpdate.yml b/specifications/client-side-encryption/tests/legacy/fle2-FindOneAndUpdate.yml
similarity index 99%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-FindOneAndUpdate.yml
rename to specifications/client-side-encryption/tests/legacy/fle2-FindOneAndUpdate.yml
index 96ce954bec1..a5596c2c24b 100644
--- a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-FindOneAndUpdate.yml
+++ b/specifications/client-side-encryption/tests/legacy/fle2-FindOneAndUpdate.yml
@@ -1,7 +1,7 @@
runOn:
- minServerVersion: "6.0.0"
# FLE 2 Encrypted collections are not supported on standalone.
- topology: [ "replicaset", "sharded" ]
+ topology: [ "replicaset", "sharded", "load-balanced" ]
database_name: &database_name "default"
collection_name: &collection_name "default"
data: []
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-InsertFind-Indexed.json b/specifications/client-side-encryption/tests/legacy/fle2-InsertFind-Indexed.json
similarity index 99%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-InsertFind-Indexed.json
rename to specifications/client-side-encryption/tests/legacy/fle2-InsertFind-Indexed.json
index 81a549590e7..84b69d7de91 100644
--- a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-InsertFind-Indexed.json
+++ b/specifications/client-side-encryption/tests/legacy/fle2-InsertFind-Indexed.json
@@ -4,7 +4,8 @@
"minServerVersion": "6.0.0",
"topology": [
"replicaset",
- "sharded"
+ "sharded",
+ "load-balanced"
]
}
],
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-InsertFind-Indexed.yml b/specifications/client-side-encryption/tests/legacy/fle2-InsertFind-Indexed.yml
similarity index 98%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-InsertFind-Indexed.yml
rename to specifications/client-side-encryption/tests/legacy/fle2-InsertFind-Indexed.yml
index 5b785d8cf23..5c5efbcc5ef 100644
--- a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-InsertFind-Indexed.yml
+++ b/specifications/client-side-encryption/tests/legacy/fle2-InsertFind-Indexed.yml
@@ -1,7 +1,7 @@
runOn:
- minServerVersion: "6.0.0"
# FLE 2 Encrypted collections are not supported on standalone.
- topology: [ "replicaset", "sharded" ]
+ topology: [ "replicaset", "sharded", "load-balanced" ]
database_name: &database_name "default"
collection_name: &collection_name "default"
data: []
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-InsertFind-Unindexed.json b/specifications/client-side-encryption/tests/legacy/fle2-InsertFind-Unindexed.json
similarity index 98%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-InsertFind-Unindexed.json
rename to specifications/client-side-encryption/tests/legacy/fle2-InsertFind-Unindexed.json
index 1a75095907b..9b314385256 100644
--- a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-InsertFind-Unindexed.json
+++ b/specifications/client-side-encryption/tests/legacy/fle2-InsertFind-Unindexed.json
@@ -4,7 +4,8 @@
"minServerVersion": "6.0.0",
"topology": [
"replicaset",
- "sharded"
+ "sharded",
+ "load-balanced"
]
}
],
@@ -241,7 +242,7 @@
}
},
"result": {
- "errorContains": "Cannot query"
+ "errorContains": "encrypt"
}
}
]
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-InsertFind-Unindexed.yml b/specifications/client-side-encryption/tests/legacy/fle2-InsertFind-Unindexed.yml
similarity index 87%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-InsertFind-Unindexed.yml
rename to specifications/client-side-encryption/tests/legacy/fle2-InsertFind-Unindexed.yml
index 26071fff60b..71f1993e56b 100644
--- a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-InsertFind-Unindexed.yml
+++ b/specifications/client-side-encryption/tests/legacy/fle2-InsertFind-Unindexed.yml
@@ -1,7 +1,7 @@
runOn:
- minServerVersion: "6.0.0"
# FLE 2 Encrypted collections are not supported on standalone.
- topology: [ "replicaset", "sharded" ]
+ topology: [ "replicaset", "sharded", "load-balanced" ]
database_name: &database_name "default"
collection_name: &collection_name "default"
data: []
@@ -80,4 +80,8 @@ tests:
arguments:
filter: { encryptedUnindexed: "value123" }
result:
- errorContains: "Cannot query"
\ No newline at end of file
+ # Expected error message changed in https://github.com/10gen/mongo-enterprise-modules/commit/212b584d4f7a44bed41c826a180a4aff00923d7a#diff-5f12b55e8d5c52c2f62853ec595dc2c1e2e5cb4fdbf7a32739a8e3acb3c6f818
+ # Before the message was "cannot query non-indexed fields with the randomized encryption algorithm"
+ # After: "can only execute encrypted equality queries with an encrypted equality index"
+ # Use a small common substring.
+ errorContains: "encrypt"
\ No newline at end of file
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-MissingKey.json b/specifications/client-side-encryption/tests/legacy/fle2-MissingKey.json
similarity index 98%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-MissingKey.json
rename to specifications/client-side-encryption/tests/legacy/fle2-MissingKey.json
index 2db1cd77025..4210da09e43 100644
--- a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-MissingKey.json
+++ b/specifications/client-side-encryption/tests/legacy/fle2-MissingKey.json
@@ -4,7 +4,8 @@
"minServerVersion": "6.0.0",
"topology": [
"replicaset",
- "sharded"
+ "sharded",
+ "load-balanced"
]
}
],
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-MissingKey.yml b/specifications/client-side-encryption/tests/legacy/fle2-MissingKey.yml
similarity index 97%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-MissingKey.yml
rename to specifications/client-side-encryption/tests/legacy/fle2-MissingKey.yml
index 94c624538b7..937c82ee9ef 100644
--- a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-MissingKey.yml
+++ b/specifications/client-side-encryption/tests/legacy/fle2-MissingKey.yml
@@ -1,7 +1,7 @@
runOn:
- minServerVersion: "6.0.0"
# FLE 2 Encrypted collections are not supported on standalone.
- topology: [ "replicaset", "sharded" ]
+ topology: [ "replicaset", "sharded", "load-balanced" ]
database_name: &database_name "default"
collection_name: &collection_name "default"
data: [
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-NoEncryption.json b/specifications/client-side-encryption/tests/legacy/fle2-NoEncryption.json
similarity index 97%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-NoEncryption.json
rename to specifications/client-side-encryption/tests/legacy/fle2-NoEncryption.json
index e9dd586c26c..9d255bd4938 100644
--- a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-NoEncryption.json
+++ b/specifications/client-side-encryption/tests/legacy/fle2-NoEncryption.json
@@ -4,7 +4,8 @@
"minServerVersion": "6.0.0",
"topology": [
"replicaset",
- "sharded"
+ "sharded",
+ "load-balanced"
]
}
],
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-NoEncryption.yml b/specifications/client-side-encryption/tests/legacy/fle2-NoEncryption.yml
similarity index 95%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-NoEncryption.yml
rename to specifications/client-side-encryption/tests/legacy/fle2-NoEncryption.yml
index 7a547eee0fd..8725ac1ef79 100644
--- a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-NoEncryption.yml
+++ b/specifications/client-side-encryption/tests/legacy/fle2-NoEncryption.yml
@@ -1,7 +1,7 @@
runOn:
- minServerVersion: "6.0.0"
# FLE 2 Encrypted collections are not supported on standalone.
- topology: [ "replicaset", "sharded" ]
+ topology: [ "replicaset", "sharded", "load-balanced" ]
database_name: &database_name "default"
collection_name: &collection_name "default"
data: []
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-Date-Aggregate.json b/specifications/client-side-encryption/tests/legacy/fle2-Range-Date-Aggregate.json
new file mode 100644
index 00000000000..a35321cd358
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-Date-Aggregate.json
@@ -0,0 +1,514 @@
+{
+ "runOn": [
+ {
+ "minServerVersion": "6.2.0",
+ "topology": [
+ "replicaset",
+ "sharded",
+ "load-balanced"
+ ]
+ }
+ ],
+ "database_name": "default",
+ "collection_name": "default",
+ "data": [],
+ "encrypted_fields": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDate",
+ "bsonType": "date",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ },
+ "max": {
+ "$date": {
+ "$numberLong": "200"
+ }
+ }
+ }
+ }
+ ]
+ },
+ "key_vault_data": [
+ {
+ "_id": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "keyMaterial": {
+ "$binary": {
+ "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==",
+ "subType": "00"
+ }
+ },
+ "creationDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "updateDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "status": {
+ "$numberInt": "0"
+ },
+ "masterKey": {
+ "provider": "local"
+ }
+ }
+ ],
+ "tests": [
+ {
+ "description": "FLE2 Range Date. Aggregate.",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedDate": {
+ "$gt": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 1,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ ]
+ }
+ ],
+ "expectations": [
+ {
+ "command_started_event": {
+ "command": {
+ "listCollections": 1,
+ "filter": {
+ "name": "default"
+ }
+ },
+ "command_name": "listCollections"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "find": "datakeys",
+ "filter": {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ },
+ "$db": "keyvault",
+ "readConcern": {
+ "level": "majority"
+ }
+ },
+ "command_name": "find"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 0,
+ "encryptedDate": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDate",
+ "bsonType": "date",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ },
+ "max": {
+ "$date": {
+ "$numberLong": "200"
+ }
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 1,
+ "encryptedDate": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDate",
+ "bsonType": "date",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ },
+ "max": {
+ "$date": {
+ "$numberLong": "200"
+ }
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "aggregate": "default",
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedDate": {
+ "$gt": {
+ "$binary": {
+ "base64": "CnEFAAADcGF5bG9hZABBBQAABGcABQUAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVjACAAAAAAKs6X8gaa+AJ6PpxVicsk7iCXpSYIkQ5zB0KnXqlfCWgAAzEAfQAAAAVkACAAAAAAtL3QIvnZqCF72eS6lKr8ilff7R6kiNklokiTuaU5wNsFcwAgAAAAAEtqr3/X731VB+VrbFcY8ZrJKRo2E0Fd+C8L0EMNcvcCBWMAIAAAAABYTWOKsDZ7cgPhiKDR2bE5CFGz4MuEwZbzZ0z46eGzBQADMgB9AAAABWQAIAAAAAB99ZW/7KwXKzl5M3XQsAJ3JbEef90IoxFYBArNiYzlgQVzACAAAAAAYO/qaw0+92HAryxOUG7iK6hnIy3OaUA9jIqtHdvcq8YFYwAgAAAAABSqgKlxv5LXoxUO3zNmqGztlZhL2S150WiR/eycv7CWAAMzAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVjACAAAAAAfsofSP7nQHv8ic8ZW0aNlWxplS46Z+mywPR4rQk+wcgAAzQAfQAAAAVkACAAAAAAV22FGF7ZDwK/EYiGNMlm/QuT3saQdyJM/Fn+ZyQug1oFcwAgAAAAACo7GwCvbcs5UHQMgds9/1QMklEVdjZigpuOFGrDmmxtBWMAIAAAAADu3L42J/oqNLe/XNYpodf2fhmPdcLhqO4J24o0hiveXwADNQB9AAAABWQAIAAAAADFspsMG7yHjKppyllon1KqAsTrHaZ6JzNqnSz8o6iTvwVzACAAAAAAeiA5pqVIQQ9s6UY/P8v5Jjkl3I7iFNeLDYehikrINrsFYwAgAAAAAAUljtCIvjRnLB2UPTEeRIz11Snl5SOBUNaXMXig4rqKAAM2AH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVjACAAAAAAD51NYesiO4Fo7w7iWBfqAFxEqkaDVctpvzZ28nT4SE8AAzcAfQAAAAVkACAAAAAAYfLwnoxK6XAGQrJFy8+TIJoq38ldBaO75h4zA4ZX5tQFcwAgAAAAAC2wk8UcJH5X5XGnDBYmel6srpBkzBhHtt3Jw1u5TSJ1BWMAIAAAAABJDtFhJ2tPbowp1UUmOCN/rqSqHRL1dtMu0c47vIlK4wADOAB9AAAABWQAIAAAAADGvyrtKkIcaV17ynZA7b2k5Pz6OhvxdWNkDvDWJIja8wVzACAAAAAAOLypVKNxf/wR1G8OZjUUsTQzDYeNNhhITxGMSp7euS4FYwAgAAAAAE6kvmXPqTnYIH4EJmNhy8OLVJZFOmdiBXLMorhELjKWAAM5AH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVjACAAAAAA85AiE+bNFAYQTXQAFexgeczdVhf8FUnf16WzJlI/kmsAAAVlACAAAAAA65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+wSY20AAAAAAAAAAAAAEHBheWxvYWRJZAAAAAAAEGZpcnN0T3BlcmF0b3IAAQAAAAA=",
+ "subType": "06"
+ }
+ }
+ }
+ }
+ }
+ ],
+ "cursor": {},
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDate",
+ "bsonType": "date",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ },
+ "max": {
+ "$date": {
+ "$numberLong": "200"
+ }
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "aggregate"
+ }
+ }
+ ],
+ "outcome": {
+ "collection": {
+ "data": [
+ {
+ "_id": 0,
+ "encryptedDate": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=",
+ "subType": "00"
+ }
+ }
+ ]
+ },
+ {
+ "_id": 1,
+ "encryptedDate": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "bE1vqWj3KNyM7cCYUv/cnYm8BPaUL3eMp5syTHq6NF4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "25j9sQXZCihCmHKvTHgaBsAVZFcGPn7JjHdrCGlwyyw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FA74j21GUEJb1DJBOpR9nVnjaDZnd8yAQNuaW9Qi26g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kJv//KVkbrobIBf+QeWC5jxn20mx/P0R1N6aCSMgKM8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zB+Whi9IUUGxfLEe+lGuIzLX4LFbIhaIAm5lRk65QTc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ybO1QU3CgvhO8JgRXH+HxKszWcpl5aGDYYVa75fHa1g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "X3Y3eSAbbMg//JgiHHiFpYOpV61t8kkDexI+CQyitH4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SlNHXyqVFGDPrX/2ppwog6l4pwj3PKda2TkZbqgfSfA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "McjV8xwTF3xI7863DYOBdyvIv6UpzThl6v9vBRk05bI=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ ]
+}
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-Date-Aggregate.yml b/specifications/client-side-encryption/tests/legacy/fle2-Range-Date-Aggregate.yml
new file mode 100644
index 00000000000..4d17344dc53
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-Date-Aggregate.yml
@@ -0,0 +1,227 @@
+# Requires libmongocrypt 1.7.0.
+runOn:
+ - minServerVersion: "6.2.0"
+ # FLE 2 Encrypted collections are not supported on standalone.
+ topology: [ "replicaset", "sharded", "load-balanced" ]
+database_name: &database_name "default"
+collection_name: &collection_name "default"
+data: []
+encrypted_fields: &encrypted_fields {'escCollection': 'enxcol_.default.esc', 'eccCollection': 'enxcol_.default.ecc', 'ecocCollection': 'enxcol_.default.ecoc', 'fields': [{'keyId': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'path': 'encryptedDate', 'bsonType': 'date', 'queries': {'queryType': 'rangePreview', 'contention': {'$numberLong': '0'}, 'sparsity': {'$numberLong': '1'}, 'min': {'$date': {'$numberLong': '0'}}, 'max': {'$date': {'$numberLong': '200'}}}}]}
+key_vault_data: [ {'_id': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'keyMaterial': {'$binary': {'base64': 'sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==', 'subType': '00'}}, 'creationDate': {'$date': {'$numberLong': '1648914851981'}}, 'updateDate': {'$date': {'$numberLong': '1648914851981'}}, 'status': {'$numberInt': '0'}, 'masterKey': {'provider': 'local'}} ]
+tests:
+ - description: "FLE2 Range Date. Aggregate."
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments:
+ document: &doc0 { _id: 0, encryptedDate: {$date: { $numberLong: "0" }} }
+ - name: insertOne
+ arguments:
+ document: &doc1 { _id: 1, encryptedDate: {$date: { $numberLong: "1" }} }
+ - name: aggregate
+ arguments:
+ pipeline: [{ $match: { "encryptedDate": { $gt: {$date: {$numberLong: "0" }}} } }]
+ result: [*doc1]
+ expectations:
+ - command_started_event:
+ command:
+ listCollections: 1
+ filter:
+ name: *collection_name
+ command_name: listCollections
+ - command_started_event:
+ command:
+ find: datakeys
+ filter: {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ }
+ $db: keyvault
+ readConcern: { level: "majority" }
+ command_name: find
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc0_encrypted { "_id": 0, "encryptedDate": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc1_encrypted { "_id": 1, "encryptedDate": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ aggregate: *collection_name
+ pipeline: [
+ {
+ "$match": {
+ "encryptedDate": {
+ "$gt": {
+ "$binary": {
+ "base64": "CnEFAAADcGF5bG9hZABBBQAABGcABQUAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVjACAAAAAAKs6X8gaa+AJ6PpxVicsk7iCXpSYIkQ5zB0KnXqlfCWgAAzEAfQAAAAVkACAAAAAAtL3QIvnZqCF72eS6lKr8ilff7R6kiNklokiTuaU5wNsFcwAgAAAAAEtqr3/X731VB+VrbFcY8ZrJKRo2E0Fd+C8L0EMNcvcCBWMAIAAAAABYTWOKsDZ7cgPhiKDR2bE5CFGz4MuEwZbzZ0z46eGzBQADMgB9AAAABWQAIAAAAAB99ZW/7KwXKzl5M3XQsAJ3JbEef90IoxFYBArNiYzlgQVzACAAAAAAYO/qaw0+92HAryxOUG7iK6hnIy3OaUA9jIqtHdvcq8YFYwAgAAAAABSqgKlxv5LXoxUO3zNmqGztlZhL2S150WiR/eycv7CWAAMzAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVjACAAAAAAfsofSP7nQHv8ic8ZW0aNlWxplS46Z+mywPR4rQk+wcgAAzQAfQAAAAVkACAAAAAAV22FGF7ZDwK/EYiGNMlm/QuT3saQdyJM/Fn+ZyQug1oFcwAgAAAAACo7GwCvbcs5UHQMgds9/1QMklEVdjZigpuOFGrDmmxtBWMAIAAAAADu3L42J/oqNLe/XNYpodf2fhmPdcLhqO4J24o0hiveXwADNQB9AAAABWQAIAAAAADFspsMG7yHjKppyllon1KqAsTrHaZ6JzNqnSz8o6iTvwVzACAAAAAAeiA5pqVIQQ9s6UY/P8v5Jjkl3I7iFNeLDYehikrINrsFYwAgAAAAAAUljtCIvjRnLB2UPTEeRIz11Snl5SOBUNaXMXig4rqKAAM2AH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVjACAAAAAAD51NYesiO4Fo7w7iWBfqAFxEqkaDVctpvzZ28nT4SE8AAzcAfQAAAAVkACAAAAAAYfLwnoxK6XAGQrJFy8+TIJoq38ldBaO75h4zA4ZX5tQFcwAgAAAAAC2wk8UcJH5X5XGnDBYmel6srpBkzBhHtt3Jw1u5TSJ1BWMAIAAAAABJDtFhJ2tPbowp1UUmOCN/rqSqHRL1dtMu0c47vIlK4wADOAB9AAAABWQAIAAAAADGvyrtKkIcaV17ynZA7b2k5Pz6OhvxdWNkDvDWJIja8wVzACAAAAAAOLypVKNxf/wR1G8OZjUUsTQzDYeNNhhITxGMSp7euS4FYwAgAAAAAE6kvmXPqTnYIH4EJmNhy8OLVJZFOmdiBXLMorhELjKWAAM5AH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVjACAAAAAA85AiE+bNFAYQTXQAFexgeczdVhf8FUnf16WzJlI/kmsAAAVlACAAAAAA65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+wSY20AAAAAAAAAAAAAEHBheWxvYWRJZAAAAAAAEGZpcnN0T3BlcmF0b3IAAQAAAAA=",
+ "subType": "06"
+ }
+ }
+ }
+ }
+ }
+ ]
+ cursor: {}
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: aggregate
+ outcome:
+ collection:
+ # Outcome is checked using a separate MongoClient without auto encryption.
+ data:
+ -
+ {
+ "_id": 0,
+ "encryptedDate": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ -
+ {
+ "_id": 1,
+ "encryptedDate": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "bE1vqWj3KNyM7cCYUv/cnYm8BPaUL3eMp5syTHq6NF4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "25j9sQXZCihCmHKvTHgaBsAVZFcGPn7JjHdrCGlwyyw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FA74j21GUEJb1DJBOpR9nVnjaDZnd8yAQNuaW9Qi26g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kJv//KVkbrobIBf+QeWC5jxn20mx/P0R1N6aCSMgKM8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zB+Whi9IUUGxfLEe+lGuIzLX4LFbIhaIAm5lRk65QTc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ybO1QU3CgvhO8JgRXH+HxKszWcpl5aGDYYVa75fHa1g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "X3Y3eSAbbMg//JgiHHiFpYOpV61t8kkDexI+CQyitH4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SlNHXyqVFGDPrX/2ppwog6l4pwj3PKda2TkZbqgfSfA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "McjV8xwTF3xI7863DYOBdyvIv6UpzThl6v9vBRk05bI=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
\ No newline at end of file
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-Date-Correctness.json b/specifications/client-side-encryption/tests/legacy/fle2-Range-Date-Correctness.json
new file mode 100644
index 00000000000..5832e854183
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-Date-Correctness.json
@@ -0,0 +1,1842 @@
+{
+ "runOn": [
+ {
+ "minServerVersion": "6.2.0",
+ "topology": [
+ "replicaset",
+ "sharded",
+ "load-balanced"
+ ]
+ }
+ ],
+ "database_name": "default",
+ "collection_name": "default",
+ "data": [],
+ "encrypted_fields": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDate",
+ "bsonType": "date",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ },
+ "max": {
+ "$date": {
+ "$numberLong": "200"
+ }
+ }
+ }
+ }
+ ]
+ },
+ "key_vault_data": [
+ {
+ "_id": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "keyMaterial": {
+ "$binary": {
+ "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==",
+ "subType": "00"
+ }
+ },
+ "creationDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "updateDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "status": {
+ "$numberInt": "0"
+ },
+ "masterKey": {
+ "provider": "local"
+ }
+ }
+ ],
+ "tests": [
+ {
+ "description": "Find with $gt",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDate": {
+ "$gt": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ }
+ },
+ "result": [
+ {
+ "_id": 1,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Find with $gte",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDate": {
+ "$gte": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ },
+ "sort": {
+ "_id": 1
+ }
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ }
+ },
+ {
+ "_id": 1,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Find with $gt with no results",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDate": {
+ "$gt": {
+ "$date": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ }
+ },
+ "result": []
+ }
+ ]
+ },
+ {
+ "description": "Find with $lt",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDate": {
+ "$lt": {
+ "$date": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ }
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Find with $lte",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDate": {
+ "$lte": {
+ "$date": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ },
+ "sort": {
+ "_id": 1
+ }
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ }
+ },
+ {
+ "_id": 1,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Find with $lt below min",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDate": {
+ "$lt": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ }
+ },
+ "result": {
+ "errorContains": "must be greater than the range minimum"
+ }
+ }
+ ]
+ },
+ {
+ "description": "Find with $gt above max",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDate": {
+ "$gt": {
+ "$date": {
+ "$numberLong": "200"
+ }
+ }
+ }
+ }
+ },
+ "result": {
+ "errorContains": "must be less than the range maximum"
+ }
+ }
+ ]
+ },
+ {
+ "description": "Find with $gt and $lt",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDate": {
+ "$gt": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ },
+ "$lt": {
+ "$date": {
+ "$numberLong": "2"
+ }
+ }
+ }
+ }
+ },
+ "result": [
+ {
+ "_id": 1,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Find with equality",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ },
+ "result": [
+ {
+ "_id": 1,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Find with full range",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDate": {
+ "$gte": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ },
+ "$lte": {
+ "$date": {
+ "$numberLong": "200"
+ }
+ }
+ }
+ },
+ "sort": {
+ "_id": 1
+ }
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ }
+ },
+ {
+ "_id": 1,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Find with $in",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDate": {
+ "$in": [
+ {
+ "$date": {
+ "$numberLong": "0"
+ }
+ }
+ ]
+ }
+ }
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Insert out of range",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "-1"
+ }
+ }
+ }
+ },
+ "result": {
+ "errorContains": "value must be greater than or equal to the minimum value"
+ }
+ }
+ ]
+ },
+ {
+ "description": "Insert min and max",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 200,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "200"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {},
+ "sort": {
+ "_id": 1
+ }
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ }
+ },
+ {
+ "_id": 200,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "200"
+ }
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with $gte",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedDate": {
+ "$gte": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ }
+ },
+ {
+ "$sort": {
+ "_id": 1
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ }
+ },
+ {
+ "_id": 1,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with $gt with no results",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedDate": {
+ "$gt": {
+ "$date": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ }
+ }
+ ]
+ },
+ "result": []
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with $lt",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedDate": {
+ "$lt": {
+ "$date": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with $lte",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedDate": {
+ "$lte": {
+ "$date": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ }
+ },
+ {
+ "$sort": {
+ "_id": 1
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ }
+ },
+ {
+ "_id": 1,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with $lt below min",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedDate": {
+ "$lt": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ }
+ }
+ ]
+ },
+ "result": {
+ "errorContains": "must be greater than the range minimum"
+ }
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with $gt above max",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedDate": {
+ "$gt": {
+ "$date": {
+ "$numberLong": "200"
+ }
+ }
+ }
+ }
+ }
+ ]
+ },
+ "result": {
+ "errorContains": "must be less than the range maximum"
+ }
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with $gt and $lt",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedDate": {
+ "$gt": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ },
+ "$lt": {
+ "$date": {
+ "$numberLong": "2"
+ }
+ }
+ }
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 1,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with equality",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 1,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with full range",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedDate": {
+ "$gte": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ },
+ "$lte": {
+ "$date": {
+ "$numberLong": "200"
+ }
+ }
+ }
+ }
+ },
+ {
+ "$sort": {
+ "_id": 1
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ }
+ },
+ {
+ "_id": 1,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with $in",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedDate": {
+ "$in": [
+ {
+ "$date": {
+ "$numberLong": "0"
+ }
+ }
+ ]
+ }
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Wrong type: Insert Double",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDate": {
+ "$numberDouble": "0"
+ }
+ }
+ },
+ "result": {
+ "errorContains": "cannot encrypt element"
+ }
+ }
+ ]
+ },
+ {
+ "description": "Wrong type: Find Double",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDate": {
+ "$gte": {
+ "$numberDouble": "0"
+ }
+ }
+ }
+ },
+ "result": {
+ "errorContains": "value type is a date"
+ }
+ }
+ ]
+ }
+ ]
+}
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-Date-Correctness.yml b/specifications/client-side-encryption/tests/legacy/fle2-Range-Date-Correctness.yml
new file mode 100644
index 00000000000..65382eec6b5
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-Date-Correctness.yml
@@ -0,0 +1,420 @@
+# Test correctness results.
+# Does not include command monitoring expectations or outcome assertions to make tests more readable.
+# Requires libmongocrypt 1.7.0.
+runOn:
+ - minServerVersion: "6.2.0"
+ # FLE 2 Encrypted collections are not supported on standalone.
+ topology: [ "replicaset", "sharded", "load-balanced" ]
+database_name: &database_name "default"
+collection_name: &collection_name "default"
+data: []
+encrypted_fields: &encrypted_fields {'escCollection': 'enxcol_.default.esc', 'eccCollection': 'enxcol_.default.ecc', 'ecocCollection': 'enxcol_.default.ecoc', 'fields': [{'keyId': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'path': 'encryptedDate', 'bsonType': 'date', 'queries': {'queryType': 'rangePreview', 'contention': {'$numberLong': '0'}, 'sparsity': {'$numberLong': '1'}, 'min': {'$date': {'$numberLong': '0'}}, 'max': {'$date': {'$numberLong': '200'}}}}]}
+key_vault_data: [ {'_id': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'keyMaterial': {'$binary': {'base64': 'sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==', 'subType': '00'}}, 'creationDate': {'$date': {'$numberLong': '1648914851981'}}, 'updateDate': {'$date': {'$numberLong': '1648914851981'}}, 'status': {'$numberInt': '0'}, 'masterKey': {'provider': 'local'}} ]
+tests:
+ - description: "Find with $gt"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments:
+ document: &doc0 { _id: 0, encryptedDate: { $date: { $numberLong: "0" } } }
+ - name: insertOne
+ arguments:
+ document: &doc1 { _id: 1, encryptedDate: { $date: { $numberLong: "1" } } }
+ - name: find
+ arguments:
+ filter: { encryptedDate: { $gt: { $date: { $numberLong: "0" } } }}
+ result: [*doc1]
+
+ - description: "Find with $gte"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedDate: { $gte: { $date: { $numberLong: "0" } } }}
+ # sort so results from range queries are ordered.
+ sort: { _id: 1 }
+ result: [*doc0, *doc1]
+
+ - description: "Find with $gt with no results"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedDate: { $gt: { $date: { $numberLong: "1" } } }}
+ result: []
+
+ - description: "Find with $lt"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedDate: { $lt: { $date: { $numberLong: "1" } } }}
+ result: [*doc0]
+
+ - description: "Find with $lte"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedDate: { $lte: { $date: { $numberLong: "1" } } }}
+ # sort so results from range queries are ordered.
+ sort: { _id: 1 }
+ result: [*doc0, *doc1]
+
+ - description: "Find with $lt below min"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedDate: { $lt: { $date: { $numberLong: "0" } } }}
+ result:
+ errorContains: must be greater than the range minimum
+
+ - description: "Find with $gt above max"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedDate: { $gt: { $date: { $numberLong: "200" } } }}
+ result:
+ errorContains: must be less than the range maximum
+
+ - description: "Find with $gt and $lt"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedDate: { $gt: { $date: { $numberLong: "0" } }, $lt: { $date: {$numberLong: "2"}} }}
+ result: [*doc1]
+
+ - description: "Find with equality"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedDate: { $date: { $numberLong: "0" } } }
+ result: [*doc0]
+ - name: find
+ arguments:
+ filter: { encryptedDate: { $date: { $numberLong: "1" } } }
+ result: [*doc1]
+
+ - description: "Find with full range"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedDate: { $gte: { $date: {$numberLong: "0"}}, $lte: { $date: {$numberLong: "200"} } } }
+ # sort so results from range queries are ordered.
+ sort: { _id: 1 }
+ result: [*doc0, *doc1]
+
+ - description: "Find with $in"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedDate: { $in: [ {$date: {$numberLong: "0"}} ] } }
+ result: [*doc0]
+
+ - description: "Insert out of range"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments:
+ document: { _id: 0, encryptedDate: {$date: { $numberLong: "-1" }}}
+ result:
+ errorContains: value must be greater than or equal to the minimum value
+
+ - description: "Insert min and max"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments:
+ document: *doc0
+ - name: insertOne
+ arguments:
+ document: &doc200 { _id: 200, encryptedDate: { $date: { $numberLong: "200" } }}
+ - name: find
+ arguments:
+ filter: {}
+ # sort so results from range queries are ordered.
+ sort: { _id: 1 }
+ result: [*doc0, *doc200]
+
+ - description: "Aggregate with $gte"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedDate: { $gte: { $date: { $numberLong: "0" } } }} }
+ # sort so results from range queries are ordered.
+ - { $sort: { _id: 1 }}
+ result: [*doc0, *doc1]
+
+ - description: "Aggregate with $gt with no results"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedDate: { $gt: { $date: { $numberLong: "1" } } }} }
+ result: []
+
+ - description: "Aggregate with $lt"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedDate: { $lt: { $date: { $numberLong: "1" } } }} }
+ result: [*doc0]
+
+ - description: "Aggregate with $lte"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedDate: { $lte: { $date: { $numberLong: "1" } } }} }
+ # sort so results from range queries are ordered.
+ - { $sort: { _id: 1 }}
+ result: [*doc0, *doc1]
+
+ - description: "Aggregate with $lt below min"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedDate: { $lt: { $date: { $numberLong: "0" } } }} }
+ result:
+ errorContains: must be greater than the range minimum
+
+ - description: "Aggregate with $gt above max"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedDate: { $gt: { $date: { $numberLong: "200" } } }} }
+ result:
+ errorContains: must be less than the range maximum
+
+ - description: "Aggregate with $gt and $lt"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedDate: { $gt: { $date: { $numberLong: "0" } }, $lt: { $date: {$numberLong: "2"}} }} }
+ result: [*doc1]
+
+ - description: "Aggregate with equality"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedDate: { $date: { $numberLong: "0" } } } }
+ result: [*doc0]
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedDate: { $date: { $numberLong: "1" } } } }
+ result: [*doc1]
+
+ - description: "Aggregate with full range"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedDate: { $gte: {$date: {$numberLong: "0"}}, $lte: {$date: {$numberLong: "200"}} } } }
+ # sort so results from range queries are ordered.
+ - { $sort: { _id: 1 }}
+ result: [*doc0, *doc1]
+
+ - description: "Aggregate with $in"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedDate: { $in: [ {$date: {$numberLong: "0"}} ] } } }
+ result: [*doc0]
+
+ - description: "Wrong type: Insert Double"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: { _id: 0, encryptedDate: { $numberDouble: "0" }} }
+ result:
+ # Expect an error from mongocryptd.
+ errorContains: "cannot encrypt element"
+
+ - description: "Wrong type: Find Double"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: find
+ arguments:
+ filter: { encryptedDate: { $gte: { $numberDouble: "0" } }}
+ result:
+ # expect an error mongocryptd.
+ errorContains: "value type is a date"
\ No newline at end of file
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-Date-Delete.json b/specifications/client-side-encryption/tests/legacy/fle2-Range-Date-Delete.json
new file mode 100644
index 00000000000..b5856e76206
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-Date-Delete.json
@@ -0,0 +1,459 @@
+{
+ "runOn": [
+ {
+ "minServerVersion": "6.2.0",
+ "topology": [
+ "replicaset",
+ "sharded",
+ "load-balanced"
+ ]
+ }
+ ],
+ "database_name": "default",
+ "collection_name": "default",
+ "data": [],
+ "encrypted_fields": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDate",
+ "bsonType": "date",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ },
+ "max": {
+ "$date": {
+ "$numberLong": "200"
+ }
+ }
+ }
+ }
+ ]
+ },
+ "key_vault_data": [
+ {
+ "_id": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "keyMaterial": {
+ "$binary": {
+ "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==",
+ "subType": "00"
+ }
+ },
+ "creationDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "updateDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "status": {
+ "$numberInt": "0"
+ },
+ "masterKey": {
+ "provider": "local"
+ }
+ }
+ ],
+ "tests": [
+ {
+ "description": "FLE2 Range Date. Delete.",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "deleteOne",
+ "arguments": {
+ "filter": {
+ "encryptedDate": {
+ "$gt": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ }
+ },
+ "result": {
+ "deletedCount": 1
+ }
+ }
+ ],
+ "expectations": [
+ {
+ "command_started_event": {
+ "command": {
+ "listCollections": 1,
+ "filter": {
+ "name": "default"
+ }
+ },
+ "command_name": "listCollections"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "find": "datakeys",
+ "filter": {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ },
+ "$db": "keyvault",
+ "readConcern": {
+ "level": "majority"
+ }
+ },
+ "command_name": "find"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 0,
+ "encryptedDate": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDate",
+ "bsonType": "date",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ },
+ "max": {
+ "$date": {
+ "$numberLong": "200"
+ }
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 1,
+ "encryptedDate": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDate",
+ "bsonType": "date",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ },
+ "max": {
+ "$date": {
+ "$numberLong": "200"
+ }
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "delete": "default",
+ "deletes": [
+ {
+ "q": {
+ "encryptedDate": {
+ "$gt": {
+ "$binary": {
+ "base64": "CnEFAAADcGF5bG9hZABBBQAABGcABQUAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVjACAAAAAAKs6X8gaa+AJ6PpxVicsk7iCXpSYIkQ5zB0KnXqlfCWgAAzEAfQAAAAVkACAAAAAAtL3QIvnZqCF72eS6lKr8ilff7R6kiNklokiTuaU5wNsFcwAgAAAAAEtqr3/X731VB+VrbFcY8ZrJKRo2E0Fd+C8L0EMNcvcCBWMAIAAAAABYTWOKsDZ7cgPhiKDR2bE5CFGz4MuEwZbzZ0z46eGzBQADMgB9AAAABWQAIAAAAAB99ZW/7KwXKzl5M3XQsAJ3JbEef90IoxFYBArNiYzlgQVzACAAAAAAYO/qaw0+92HAryxOUG7iK6hnIy3OaUA9jIqtHdvcq8YFYwAgAAAAABSqgKlxv5LXoxUO3zNmqGztlZhL2S150WiR/eycv7CWAAMzAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVjACAAAAAAfsofSP7nQHv8ic8ZW0aNlWxplS46Z+mywPR4rQk+wcgAAzQAfQAAAAVkACAAAAAAV22FGF7ZDwK/EYiGNMlm/QuT3saQdyJM/Fn+ZyQug1oFcwAgAAAAACo7GwCvbcs5UHQMgds9/1QMklEVdjZigpuOFGrDmmxtBWMAIAAAAADu3L42J/oqNLe/XNYpodf2fhmPdcLhqO4J24o0hiveXwADNQB9AAAABWQAIAAAAADFspsMG7yHjKppyllon1KqAsTrHaZ6JzNqnSz8o6iTvwVzACAAAAAAeiA5pqVIQQ9s6UY/P8v5Jjkl3I7iFNeLDYehikrINrsFYwAgAAAAAAUljtCIvjRnLB2UPTEeRIz11Snl5SOBUNaXMXig4rqKAAM2AH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVjACAAAAAAD51NYesiO4Fo7w7iWBfqAFxEqkaDVctpvzZ28nT4SE8AAzcAfQAAAAVkACAAAAAAYfLwnoxK6XAGQrJFy8+TIJoq38ldBaO75h4zA4ZX5tQFcwAgAAAAAC2wk8UcJH5X5XGnDBYmel6srpBkzBhHtt3Jw1u5TSJ1BWMAIAAAAABJDtFhJ2tPbowp1UUmOCN/rqSqHRL1dtMu0c47vIlK4wADOAB9AAAABWQAIAAAAADGvyrtKkIcaV17ynZA7b2k5Pz6OhvxdWNkDvDWJIja8wVzACAAAAAAOLypVKNxf/wR1G8OZjUUsTQzDYeNNhhITxGMSp7euS4FYwAgAAAAAE6kvmXPqTnYIH4EJmNhy8OLVJZFOmdiBXLMorhELjKWAAM5AH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVjACAAAAAA85AiE+bNFAYQTXQAFexgeczdVhf8FUnf16WzJlI/kmsAAAVlACAAAAAA65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+wSY20AAAAAAAAAAAAAEHBheWxvYWRJZAAAAAAAEGZpcnN0T3BlcmF0b3IAAQAAAAA=",
+ "subType": "06"
+ }
+ }
+ }
+ },
+ "limit": 1
+ }
+ ],
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDate",
+ "bsonType": "date",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ },
+ "max": {
+ "$date": {
+ "$numberLong": "200"
+ }
+ }
+ }
+ }
+ ]
+ }
+ },
+ "deleteTokens": {
+ "default.default": {
+ "encryptedDate": {
+ "e": {
+ "$binary": {
+ "base64": "65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+w=",
+ "subType": "00"
+ }
+ },
+ "o": {
+ "$binary": {
+ "base64": "noN+05JsuO1oDg59yypIGj45i+eFH6HOTXOPpeZ//Mk=",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "command_name": "delete"
+ }
+ }
+ ],
+ "outcome": {
+ "collection": {
+ "data": [
+ {
+ "_id": 0,
+ "encryptedDate": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ ]
+}
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-Date-Delete.yml b/specifications/client-side-encryption/tests/legacy/fle2-Range-Date-Delete.yml
new file mode 100644
index 00000000000..6bb2535bb46
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-Date-Delete.yml
@@ -0,0 +1,185 @@
+# Requires libmongocrypt 1.7.0.
+runOn:
+ - minServerVersion: "6.2.0"
+ # FLE 2 Encrypted collections are not supported on standalone.
+ topology: [ "replicaset", "sharded", "load-balanced" ]
+database_name: &database_name "default"
+collection_name: &collection_name "default"
+data: []
+encrypted_fields: &encrypted_fields {'escCollection': 'enxcol_.default.esc', 'eccCollection': 'enxcol_.default.ecc', 'ecocCollection': 'enxcol_.default.ecoc', 'fields': [{'keyId': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'path': 'encryptedDate', 'bsonType': 'date', 'queries': {'queryType': 'rangePreview', 'contention': {'$numberLong': '0'}, 'sparsity': {'$numberLong': '1'}, 'min': {'$date': {'$numberLong': '0'}}, 'max': {'$date': {'$numberLong': '200'}}}}]}
+key_vault_data: [ {'_id': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'keyMaterial': {'$binary': {'base64': 'sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==', 'subType': '00'}}, 'creationDate': {'$date': {'$numberLong': '1648914851981'}}, 'updateDate': {'$date': {'$numberLong': '1648914851981'}}, 'status': {'$numberInt': '0'}, 'masterKey': {'provider': 'local'}} ]
+tests:
+ - description: "FLE2 Range Date. Delete."
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments:
+ document: &doc0 { _id: 0, encryptedDate: {$date: { $numberLong: "0" }} }
+ - name: insertOne
+ arguments:
+ document: &doc1 { _id: 1, encryptedDate: {$date: { $numberLong: "1" }} }
+ - name: deleteOne
+ arguments:
+ filter: { "encryptedDate": { $gt: {$date: {$numberLong: "0" }}} }
+ result:
+ deletedCount: 1
+ expectations:
+ - command_started_event:
+ command:
+ listCollections: 1
+ filter:
+ name: *collection_name
+ command_name: listCollections
+ - command_started_event:
+ command:
+ find: datakeys
+ filter: {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ }
+ $db: keyvault
+ readConcern: { level: "majority" }
+ command_name: find
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc0_encrypted { "_id": 0, "encryptedDate": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc1_encrypted { "_id": 1, "encryptedDate": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ delete: *collection_name
+ deletes: [
+ {
+ "q": {
+ "encryptedDate": {
+ "$gt": {
+ "$binary": {
+ "base64": "CnEFAAADcGF5bG9hZABBBQAABGcABQUAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVjACAAAAAAKs6X8gaa+AJ6PpxVicsk7iCXpSYIkQ5zB0KnXqlfCWgAAzEAfQAAAAVkACAAAAAAtL3QIvnZqCF72eS6lKr8ilff7R6kiNklokiTuaU5wNsFcwAgAAAAAEtqr3/X731VB+VrbFcY8ZrJKRo2E0Fd+C8L0EMNcvcCBWMAIAAAAABYTWOKsDZ7cgPhiKDR2bE5CFGz4MuEwZbzZ0z46eGzBQADMgB9AAAABWQAIAAAAAB99ZW/7KwXKzl5M3XQsAJ3JbEef90IoxFYBArNiYzlgQVzACAAAAAAYO/qaw0+92HAryxOUG7iK6hnIy3OaUA9jIqtHdvcq8YFYwAgAAAAABSqgKlxv5LXoxUO3zNmqGztlZhL2S150WiR/eycv7CWAAMzAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVjACAAAAAAfsofSP7nQHv8ic8ZW0aNlWxplS46Z+mywPR4rQk+wcgAAzQAfQAAAAVkACAAAAAAV22FGF7ZDwK/EYiGNMlm/QuT3saQdyJM/Fn+ZyQug1oFcwAgAAAAACo7GwCvbcs5UHQMgds9/1QMklEVdjZigpuOFGrDmmxtBWMAIAAAAADu3L42J/oqNLe/XNYpodf2fhmPdcLhqO4J24o0hiveXwADNQB9AAAABWQAIAAAAADFspsMG7yHjKppyllon1KqAsTrHaZ6JzNqnSz8o6iTvwVzACAAAAAAeiA5pqVIQQ9s6UY/P8v5Jjkl3I7iFNeLDYehikrINrsFYwAgAAAAAAUljtCIvjRnLB2UPTEeRIz11Snl5SOBUNaXMXig4rqKAAM2AH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVjACAAAAAAD51NYesiO4Fo7w7iWBfqAFxEqkaDVctpvzZ28nT4SE8AAzcAfQAAAAVkACAAAAAAYfLwnoxK6XAGQrJFy8+TIJoq38ldBaO75h4zA4ZX5tQFcwAgAAAAAC2wk8UcJH5X5XGnDBYmel6srpBkzBhHtt3Jw1u5TSJ1BWMAIAAAAABJDtFhJ2tPbowp1UUmOCN/rqSqHRL1dtMu0c47vIlK4wADOAB9AAAABWQAIAAAAADGvyrtKkIcaV17ynZA7b2k5Pz6OhvxdWNkDvDWJIja8wVzACAAAAAAOLypVKNxf/wR1G8OZjUUsTQzDYeNNhhITxGMSp7euS4FYwAgAAAAAE6kvmXPqTnYIH4EJmNhy8OLVJZFOmdiBXLMorhELjKWAAM5AH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVjACAAAAAA85AiE+bNFAYQTXQAFexgeczdVhf8FUnf16WzJlI/kmsAAAVlACAAAAAA65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+wSY20AAAAAAAAAAAAAEHBheWxvYWRJZAAAAAAAEGZpcnN0T3BlcmF0b3IAAQAAAAA=",
+ "subType": "06"
+ }
+ }
+ }
+ },
+ "limit": 1
+ }
+ ]
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ "deleteTokens": {
+ "default.default": {
+ "encryptedDate": {
+ "e": {
+ "$binary": {
+ "base64": "65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+w=",
+ "subType": "00"
+ }
+ },
+ "o": {
+ "$binary": {
+ "base64": "noN+05JsuO1oDg59yypIGj45i+eFH6HOTXOPpeZ//Mk=",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ command_name: delete
+ outcome:
+ collection:
+ # Outcome is checked using a separate MongoClient without auto encryption.
+ data:
+ -
+ {
+ "_id": 0,
+ "encryptedDate": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
\ No newline at end of file
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-Date-FindOneAndUpdate.json b/specifications/client-side-encryption/tests/legacy/fle2-Range-Date-FindOneAndUpdate.json
new file mode 100644
index 00000000000..a59258a466e
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-Date-FindOneAndUpdate.json
@@ -0,0 +1,538 @@
+{
+ "runOn": [
+ {
+ "minServerVersion": "6.2.0",
+ "topology": [
+ "replicaset",
+ "sharded",
+ "load-balanced"
+ ]
+ }
+ ],
+ "database_name": "default",
+ "collection_name": "default",
+ "data": [],
+ "encrypted_fields": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDate",
+ "bsonType": "date",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ },
+ "max": {
+ "$date": {
+ "$numberLong": "200"
+ }
+ }
+ }
+ }
+ ]
+ },
+ "key_vault_data": [
+ {
+ "_id": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "keyMaterial": {
+ "$binary": {
+ "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==",
+ "subType": "00"
+ }
+ },
+ "creationDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "updateDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "status": {
+ "$numberInt": "0"
+ },
+ "masterKey": {
+ "provider": "local"
+ }
+ }
+ ],
+ "tests": [
+ {
+ "description": "FLE2 Range Date. FindOneAndUpdate.",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "findOneAndUpdate",
+ "arguments": {
+ "filter": {
+ "encryptedDate": {
+ "$gt": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ },
+ "update": {
+ "$set": {
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "2"
+ }
+ }
+ }
+ },
+ "returnDocument": "Before"
+ },
+ "result": {
+ "_id": 1,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ }
+ ],
+ "expectations": [
+ {
+ "command_started_event": {
+ "command": {
+ "listCollections": 1,
+ "filter": {
+ "name": "default"
+ }
+ },
+ "command_name": "listCollections"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "find": "datakeys",
+ "filter": {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ },
+ "$db": "keyvault",
+ "readConcern": {
+ "level": "majority"
+ }
+ },
+ "command_name": "find"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 0,
+ "encryptedDate": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDate",
+ "bsonType": "date",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ },
+ "max": {
+ "$date": {
+ "$numberLong": "200"
+ }
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 1,
+ "encryptedDate": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDate",
+ "bsonType": "date",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ },
+ "max": {
+ "$date": {
+ "$numberLong": "200"
+ }
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "findAndModify": "default",
+ "query": {
+ "encryptedDate": {
+ "$gt": {
+ "$binary": {
+ "base64": "CnEFAAADcGF5bG9hZABBBQAABGcABQUAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVjACAAAAAAKs6X8gaa+AJ6PpxVicsk7iCXpSYIkQ5zB0KnXqlfCWgAAzEAfQAAAAVkACAAAAAAtL3QIvnZqCF72eS6lKr8ilff7R6kiNklokiTuaU5wNsFcwAgAAAAAEtqr3/X731VB+VrbFcY8ZrJKRo2E0Fd+C8L0EMNcvcCBWMAIAAAAABYTWOKsDZ7cgPhiKDR2bE5CFGz4MuEwZbzZ0z46eGzBQADMgB9AAAABWQAIAAAAAB99ZW/7KwXKzl5M3XQsAJ3JbEef90IoxFYBArNiYzlgQVzACAAAAAAYO/qaw0+92HAryxOUG7iK6hnIy3OaUA9jIqtHdvcq8YFYwAgAAAAABSqgKlxv5LXoxUO3zNmqGztlZhL2S150WiR/eycv7CWAAMzAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVjACAAAAAAfsofSP7nQHv8ic8ZW0aNlWxplS46Z+mywPR4rQk+wcgAAzQAfQAAAAVkACAAAAAAV22FGF7ZDwK/EYiGNMlm/QuT3saQdyJM/Fn+ZyQug1oFcwAgAAAAACo7GwCvbcs5UHQMgds9/1QMklEVdjZigpuOFGrDmmxtBWMAIAAAAADu3L42J/oqNLe/XNYpodf2fhmPdcLhqO4J24o0hiveXwADNQB9AAAABWQAIAAAAADFspsMG7yHjKppyllon1KqAsTrHaZ6JzNqnSz8o6iTvwVzACAAAAAAeiA5pqVIQQ9s6UY/P8v5Jjkl3I7iFNeLDYehikrINrsFYwAgAAAAAAUljtCIvjRnLB2UPTEeRIz11Snl5SOBUNaXMXig4rqKAAM2AH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVjACAAAAAAD51NYesiO4Fo7w7iWBfqAFxEqkaDVctpvzZ28nT4SE8AAzcAfQAAAAVkACAAAAAAYfLwnoxK6XAGQrJFy8+TIJoq38ldBaO75h4zA4ZX5tQFcwAgAAAAAC2wk8UcJH5X5XGnDBYmel6srpBkzBhHtt3Jw1u5TSJ1BWMAIAAAAABJDtFhJ2tPbowp1UUmOCN/rqSqHRL1dtMu0c47vIlK4wADOAB9AAAABWQAIAAAAADGvyrtKkIcaV17ynZA7b2k5Pz6OhvxdWNkDvDWJIja8wVzACAAAAAAOLypVKNxf/wR1G8OZjUUsTQzDYeNNhhITxGMSp7euS4FYwAgAAAAAE6kvmXPqTnYIH4EJmNhy8OLVJZFOmdiBXLMorhELjKWAAM5AH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVjACAAAAAA85AiE+bNFAYQTXQAFexgeczdVhf8FUnf16WzJlI/kmsAAAVlACAAAAAA65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+wSY20AAAAAAAAAAAAAEHBheWxvYWRJZAAAAAAAEGZpcnN0T3BlcmF0b3IAAQAAAAA=",
+ "subType": "06"
+ }
+ }
+ }
+ },
+ "update": {
+ "$set": {
+ "encryptedDate": {
+ "$$type": "binData"
+ }
+ }
+ },
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDate",
+ "bsonType": "date",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ },
+ "max": {
+ "$date": {
+ "$numberLong": "200"
+ }
+ }
+ }
+ }
+ ]
+ }
+ },
+ "deleteTokens": {
+ "default.default": {
+ "encryptedDate": {
+ "e": {
+ "$binary": {
+ "base64": "65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+w=",
+ "subType": "00"
+ }
+ },
+ "o": {
+ "$binary": {
+ "base64": "noN+05JsuO1oDg59yypIGj45i+eFH6HOTXOPpeZ//Mk=",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "command_name": "findAndModify"
+ }
+ }
+ ],
+ "outcome": {
+ "collection": {
+ "data": [
+ {
+ "_id": 0,
+ "encryptedDate": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=",
+ "subType": "00"
+ }
+ }
+ ]
+ },
+ {
+ "_id": 1,
+ "encryptedDate": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "DLCAJs+W2PL2DV5YChCL6dYrQNr+j4p3L7xhVaub4ic=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hyDcE6QQjPrYJaIS/n7evEZFYcm31Tj89CpEYGF45cI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "F08nMDWDZc+DbWM7XCEJNNCEYyinRmrvGP7EWhmp4is=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cXH4688amcDc8kZOJq4UP8cE3R58Zl7e+Qo/1jyspps=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "uURBxvTp3FBCVkd+LPqyuY7d6rMW6SGIJQEPY/wtkZI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "jG3hax1L3RBp9t38vUt53FsBxgr/+Si/vVISpAylYpE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kwtIW8MhH9Ky5xNjBx8gFA/SHh2YVphie7g5FGBzals=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FHflwFuEMu4xX0ZApHi+pdlBH+oevAtXckCUb5Wv0xU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ty4cnzJdAlbQKnh7px3GEYjBnvO+jIOaKjoTRDtmh3M=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ ]
+}
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-Date-FindOneAndUpdate.yml b/specifications/client-side-encryption/tests/legacy/fle2-Range-Date-FindOneAndUpdate.yml
new file mode 100644
index 00000000000..d220bf8ddf7
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-Date-FindOneAndUpdate.yml
@@ -0,0 +1,243 @@
+# Requires libmongocrypt 1.7.0.
+runOn:
+ - minServerVersion: "6.2.0"
+ # FLE 2 Encrypted collections are not supported on standalone.
+ topology: [ "replicaset", "sharded", "load-balanced" ]
+database_name: &database_name "default"
+collection_name: &collection_name "default"
+data: []
+encrypted_fields: &encrypted_fields {'escCollection': 'enxcol_.default.esc', 'eccCollection': 'enxcol_.default.ecc', 'ecocCollection': 'enxcol_.default.ecoc', 'fields': [{'keyId': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'path': 'encryptedDate', 'bsonType': 'date', 'queries': {'queryType': 'rangePreview', 'contention': {'$numberLong': '0'}, 'sparsity': {'$numberLong': '1'}, 'min': {'$date': {'$numberLong': '0'}}, 'max': {'$date': {'$numberLong': '200'}}}}]}
+key_vault_data: [ {'_id': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'keyMaterial': {'$binary': {'base64': 'sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==', 'subType': '00'}}, 'creationDate': {'$date': {'$numberLong': '1648914851981'}}, 'updateDate': {'$date': {'$numberLong': '1648914851981'}}, 'status': {'$numberInt': '0'}, 'masterKey': {'provider': 'local'}} ]
+tests:
+ - description: "FLE2 Range Date. FindOneAndUpdate."
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments:
+ document: &doc0 { _id: 0, encryptedDate: {$date: { $numberLong: "0" }} }
+ - name: insertOne
+ arguments:
+ document: &doc1 { _id: 1, encryptedDate: {$date: { $numberLong: "1" }} }
+ - name: findOneAndUpdate
+ arguments:
+ filter: { encryptedDate: { $gt: {$date: {$numberLong: "0"}}} }
+ update: { "$set": { "encryptedDate": {$date: {$numberLong: "2"}}}}
+ returnDocument: Before
+ result: *doc1
+ expectations:
+ - command_started_event:
+ command:
+ listCollections: 1
+ filter:
+ name: *collection_name
+ command_name: listCollections
+ - command_started_event:
+ command:
+ find: datakeys
+ filter: {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ }
+ $db: keyvault
+ readConcern: { level: "majority" }
+ command_name: find
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc0_encrypted { "_id": 0, "encryptedDate": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc1_encrypted { "_id": 1, "encryptedDate": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ findAndModify: *collection_name
+ query: {
+ "encryptedDate": {
+ "$gt": {
+ "$binary": {
+ "base64": "CnEFAAADcGF5bG9hZABBBQAABGcABQUAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVjACAAAAAAKs6X8gaa+AJ6PpxVicsk7iCXpSYIkQ5zB0KnXqlfCWgAAzEAfQAAAAVkACAAAAAAtL3QIvnZqCF72eS6lKr8ilff7R6kiNklokiTuaU5wNsFcwAgAAAAAEtqr3/X731VB+VrbFcY8ZrJKRo2E0Fd+C8L0EMNcvcCBWMAIAAAAABYTWOKsDZ7cgPhiKDR2bE5CFGz4MuEwZbzZ0z46eGzBQADMgB9AAAABWQAIAAAAAB99ZW/7KwXKzl5M3XQsAJ3JbEef90IoxFYBArNiYzlgQVzACAAAAAAYO/qaw0+92HAryxOUG7iK6hnIy3OaUA9jIqtHdvcq8YFYwAgAAAAABSqgKlxv5LXoxUO3zNmqGztlZhL2S150WiR/eycv7CWAAMzAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVjACAAAAAAfsofSP7nQHv8ic8ZW0aNlWxplS46Z+mywPR4rQk+wcgAAzQAfQAAAAVkACAAAAAAV22FGF7ZDwK/EYiGNMlm/QuT3saQdyJM/Fn+ZyQug1oFcwAgAAAAACo7GwCvbcs5UHQMgds9/1QMklEVdjZigpuOFGrDmmxtBWMAIAAAAADu3L42J/oqNLe/XNYpodf2fhmPdcLhqO4J24o0hiveXwADNQB9AAAABWQAIAAAAADFspsMG7yHjKppyllon1KqAsTrHaZ6JzNqnSz8o6iTvwVzACAAAAAAeiA5pqVIQQ9s6UY/P8v5Jjkl3I7iFNeLDYehikrINrsFYwAgAAAAAAUljtCIvjRnLB2UPTEeRIz11Snl5SOBUNaXMXig4rqKAAM2AH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVjACAAAAAAD51NYesiO4Fo7w7iWBfqAFxEqkaDVctpvzZ28nT4SE8AAzcAfQAAAAVkACAAAAAAYfLwnoxK6XAGQrJFy8+TIJoq38ldBaO75h4zA4ZX5tQFcwAgAAAAAC2wk8UcJH5X5XGnDBYmel6srpBkzBhHtt3Jw1u5TSJ1BWMAIAAAAABJDtFhJ2tPbowp1UUmOCN/rqSqHRL1dtMu0c47vIlK4wADOAB9AAAABWQAIAAAAADGvyrtKkIcaV17ynZA7b2k5Pz6OhvxdWNkDvDWJIja8wVzACAAAAAAOLypVKNxf/wR1G8OZjUUsTQzDYeNNhhITxGMSp7euS4FYwAgAAAAAE6kvmXPqTnYIH4EJmNhy8OLVJZFOmdiBXLMorhELjKWAAM5AH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVjACAAAAAA85AiE+bNFAYQTXQAFexgeczdVhf8FUnf16WzJlI/kmsAAAVlACAAAAAA65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+wSY20AAAAAAAAAAAAAEHBheWxvYWRJZAAAAAAAEGZpcnN0T3BlcmF0b3IAAQAAAAA=",
+ "subType": "06"
+ }
+ }
+ }
+ }
+ update: { "$set": {"encryptedDate": { $$type: "binData" }} }
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ "deleteTokens": {
+ "default.default": {
+ "encryptedDate": {
+ "e": {
+ "$binary": {
+ "base64": "65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+w=",
+ "subType": "00"
+ }
+ },
+ "o": {
+ "$binary": {
+ "base64": "noN+05JsuO1oDg59yypIGj45i+eFH6HOTXOPpeZ//Mk=",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ command_name: findAndModify
+ outcome:
+ collection:
+ # Outcome is checked using a separate MongoClient without auto encryption.
+ data:
+ -
+ {
+ "_id": 0,
+ "encryptedDate": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ -
+ {
+ "_id": 1,
+ "encryptedDate": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "DLCAJs+W2PL2DV5YChCL6dYrQNr+j4p3L7xhVaub4ic=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hyDcE6QQjPrYJaIS/n7evEZFYcm31Tj89CpEYGF45cI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "F08nMDWDZc+DbWM7XCEJNNCEYyinRmrvGP7EWhmp4is=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cXH4688amcDc8kZOJq4UP8cE3R58Zl7e+Qo/1jyspps=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "uURBxvTp3FBCVkd+LPqyuY7d6rMW6SGIJQEPY/wtkZI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "jG3hax1L3RBp9t38vUt53FsBxgr/+Si/vVISpAylYpE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kwtIW8MhH9Ky5xNjBx8gFA/SHh2YVphie7g5FGBzals=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FHflwFuEMu4xX0ZApHi+pdlBH+oevAtXckCUb5Wv0xU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ty4cnzJdAlbQKnh7px3GEYjBnvO+jIOaKjoTRDtmh3M=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
\ No newline at end of file
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-Date-InsertFind.json b/specifications/client-side-encryption/tests/legacy/fle2-Range-Date-InsertFind.json
new file mode 100644
index 00000000000..4357fafeea5
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-Date-InsertFind.json
@@ -0,0 +1,505 @@
+{
+ "runOn": [
+ {
+ "minServerVersion": "6.2.0",
+ "topology": [
+ "replicaset",
+ "sharded",
+ "load-balanced"
+ ]
+ }
+ ],
+ "database_name": "default",
+ "collection_name": "default",
+ "data": [],
+ "encrypted_fields": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDate",
+ "bsonType": "date",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ },
+ "max": {
+ "$date": {
+ "$numberLong": "200"
+ }
+ }
+ }
+ }
+ ]
+ },
+ "key_vault_data": [
+ {
+ "_id": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "keyMaterial": {
+ "$binary": {
+ "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==",
+ "subType": "00"
+ }
+ },
+ "creationDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "updateDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "status": {
+ "$numberInt": "0"
+ },
+ "masterKey": {
+ "provider": "local"
+ }
+ }
+ ],
+ "tests": [
+ {
+ "description": "FLE2 Range Date. Insert and Find.",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDate": {
+ "$gt": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ }
+ },
+ "result": [
+ {
+ "_id": 1,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ ]
+ }
+ ],
+ "expectations": [
+ {
+ "command_started_event": {
+ "command": {
+ "listCollections": 1,
+ "filter": {
+ "name": "default"
+ }
+ },
+ "command_name": "listCollections"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "find": "datakeys",
+ "filter": {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ },
+ "$db": "keyvault",
+ "readConcern": {
+ "level": "majority"
+ }
+ },
+ "command_name": "find"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 0,
+ "encryptedDate": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDate",
+ "bsonType": "date",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ },
+ "max": {
+ "$date": {
+ "$numberLong": "200"
+ }
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 1,
+ "encryptedDate": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDate",
+ "bsonType": "date",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ },
+ "max": {
+ "$date": {
+ "$numberLong": "200"
+ }
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "find": "default",
+ "filter": {
+ "encryptedDate": {
+ "$gt": {
+ "$binary": {
+ "base64": "CnEFAAADcGF5bG9hZABBBQAABGcABQUAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVjACAAAAAAKs6X8gaa+AJ6PpxVicsk7iCXpSYIkQ5zB0KnXqlfCWgAAzEAfQAAAAVkACAAAAAAtL3QIvnZqCF72eS6lKr8ilff7R6kiNklokiTuaU5wNsFcwAgAAAAAEtqr3/X731VB+VrbFcY8ZrJKRo2E0Fd+C8L0EMNcvcCBWMAIAAAAABYTWOKsDZ7cgPhiKDR2bE5CFGz4MuEwZbzZ0z46eGzBQADMgB9AAAABWQAIAAAAAB99ZW/7KwXKzl5M3XQsAJ3JbEef90IoxFYBArNiYzlgQVzACAAAAAAYO/qaw0+92HAryxOUG7iK6hnIy3OaUA9jIqtHdvcq8YFYwAgAAAAABSqgKlxv5LXoxUO3zNmqGztlZhL2S150WiR/eycv7CWAAMzAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVjACAAAAAAfsofSP7nQHv8ic8ZW0aNlWxplS46Z+mywPR4rQk+wcgAAzQAfQAAAAVkACAAAAAAV22FGF7ZDwK/EYiGNMlm/QuT3saQdyJM/Fn+ZyQug1oFcwAgAAAAACo7GwCvbcs5UHQMgds9/1QMklEVdjZigpuOFGrDmmxtBWMAIAAAAADu3L42J/oqNLe/XNYpodf2fhmPdcLhqO4J24o0hiveXwADNQB9AAAABWQAIAAAAADFspsMG7yHjKppyllon1KqAsTrHaZ6JzNqnSz8o6iTvwVzACAAAAAAeiA5pqVIQQ9s6UY/P8v5Jjkl3I7iFNeLDYehikrINrsFYwAgAAAAAAUljtCIvjRnLB2UPTEeRIz11Snl5SOBUNaXMXig4rqKAAM2AH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVjACAAAAAAD51NYesiO4Fo7w7iWBfqAFxEqkaDVctpvzZ28nT4SE8AAzcAfQAAAAVkACAAAAAAYfLwnoxK6XAGQrJFy8+TIJoq38ldBaO75h4zA4ZX5tQFcwAgAAAAAC2wk8UcJH5X5XGnDBYmel6srpBkzBhHtt3Jw1u5TSJ1BWMAIAAAAABJDtFhJ2tPbowp1UUmOCN/rqSqHRL1dtMu0c47vIlK4wADOAB9AAAABWQAIAAAAADGvyrtKkIcaV17ynZA7b2k5Pz6OhvxdWNkDvDWJIja8wVzACAAAAAAOLypVKNxf/wR1G8OZjUUsTQzDYeNNhhITxGMSp7euS4FYwAgAAAAAE6kvmXPqTnYIH4EJmNhy8OLVJZFOmdiBXLMorhELjKWAAM5AH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVjACAAAAAA85AiE+bNFAYQTXQAFexgeczdVhf8FUnf16WzJlI/kmsAAAVlACAAAAAA65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+wSY20AAAAAAAAAAAAAEHBheWxvYWRJZAAAAAAAEGZpcnN0T3BlcmF0b3IAAQAAAAA=",
+ "subType": "06"
+ }
+ }
+ }
+ },
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDate",
+ "bsonType": "date",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ },
+ "max": {
+ "$date": {
+ "$numberLong": "200"
+ }
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "find"
+ }
+ }
+ ],
+ "outcome": {
+ "collection": {
+ "data": [
+ {
+ "_id": 0,
+ "encryptedDate": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=",
+ "subType": "00"
+ }
+ }
+ ]
+ },
+ {
+ "_id": 1,
+ "encryptedDate": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "bE1vqWj3KNyM7cCYUv/cnYm8BPaUL3eMp5syTHq6NF4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "25j9sQXZCihCmHKvTHgaBsAVZFcGPn7JjHdrCGlwyyw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FA74j21GUEJb1DJBOpR9nVnjaDZnd8yAQNuaW9Qi26g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kJv//KVkbrobIBf+QeWC5jxn20mx/P0R1N6aCSMgKM8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zB+Whi9IUUGxfLEe+lGuIzLX4LFbIhaIAm5lRk65QTc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ybO1QU3CgvhO8JgRXH+HxKszWcpl5aGDYYVa75fHa1g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "X3Y3eSAbbMg//JgiHHiFpYOpV61t8kkDexI+CQyitH4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SlNHXyqVFGDPrX/2ppwog6l4pwj3PKda2TkZbqgfSfA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "McjV8xwTF3xI7863DYOBdyvIv6UpzThl6v9vBRk05bI=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ ]
+}
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-Date-InsertFind.yml b/specifications/client-side-encryption/tests/legacy/fle2-Range-Date-InsertFind.yml
new file mode 100644
index 00000000000..50a06cedafd
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-Date-InsertFind.yml
@@ -0,0 +1,221 @@
+# Requires libmongocrypt 1.7.0.
+runOn:
+ - minServerVersion: "6.2.0"
+ # FLE 2 Encrypted collections are not supported on standalone.
+ topology: [ "replicaset", "sharded", "load-balanced" ]
+database_name: &database_name "default"
+collection_name: &collection_name "default"
+data: []
+encrypted_fields: &encrypted_fields {'escCollection': 'enxcol_.default.esc', 'eccCollection': 'enxcol_.default.ecc', 'ecocCollection': 'enxcol_.default.ecoc', 'fields': [{'keyId': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'path': 'encryptedDate', 'bsonType': 'date', 'queries': {'queryType': 'rangePreview', 'contention': {'$numberLong': '0'}, 'sparsity': {'$numberLong': '1'}, 'min': {'$date': {'$numberLong': '0'}}, 'max': {'$date': {'$numberLong': '200'}}}}]}
+key_vault_data: [ {'_id': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'keyMaterial': {'$binary': {'base64': 'sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==', 'subType': '00'}}, 'creationDate': {'$date': {'$numberLong': '1648914851981'}}, 'updateDate': {'$date': {'$numberLong': '1648914851981'}}, 'status': {'$numberInt': '0'}, 'masterKey': {'provider': 'local'}} ]
+tests:
+ - description: "FLE2 Range Date. Insert and Find."
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments:
+ document: &doc0 { _id: 0, encryptedDate: { $date: { $numberLong: "0" }} }
+ - name: insertOne
+ arguments:
+ document: &doc1 { _id: 1, encryptedDate: { $date: { $numberLong: "1" }} }
+ - name: find
+ arguments:
+ filter: { encryptedDate: { $gt: { $date: { $numberLong: "0" }} } }
+ result: [*doc1]
+ expectations:
+ - command_started_event:
+ command:
+ listCollections: 1
+ filter:
+ name: *collection_name
+ command_name: listCollections
+ - command_started_event:
+ command:
+ find: datakeys
+ filter: {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ }
+ $db: keyvault
+ readConcern: { level: "majority" }
+ command_name: find
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc0_encrypted { "_id": 0, "encryptedDate": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc1_encrypted { "_id": 1, "encryptedDate": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ find: *collection_name
+ filter:
+ "encryptedDate": {
+ "$gt": {
+ "$binary": {
+ "base64": "CnEFAAADcGF5bG9hZABBBQAABGcABQUAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVjACAAAAAAKs6X8gaa+AJ6PpxVicsk7iCXpSYIkQ5zB0KnXqlfCWgAAzEAfQAAAAVkACAAAAAAtL3QIvnZqCF72eS6lKr8ilff7R6kiNklokiTuaU5wNsFcwAgAAAAAEtqr3/X731VB+VrbFcY8ZrJKRo2E0Fd+C8L0EMNcvcCBWMAIAAAAABYTWOKsDZ7cgPhiKDR2bE5CFGz4MuEwZbzZ0z46eGzBQADMgB9AAAABWQAIAAAAAB99ZW/7KwXKzl5M3XQsAJ3JbEef90IoxFYBArNiYzlgQVzACAAAAAAYO/qaw0+92HAryxOUG7iK6hnIy3OaUA9jIqtHdvcq8YFYwAgAAAAABSqgKlxv5LXoxUO3zNmqGztlZhL2S150WiR/eycv7CWAAMzAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVjACAAAAAAfsofSP7nQHv8ic8ZW0aNlWxplS46Z+mywPR4rQk+wcgAAzQAfQAAAAVkACAAAAAAV22FGF7ZDwK/EYiGNMlm/QuT3saQdyJM/Fn+ZyQug1oFcwAgAAAAACo7GwCvbcs5UHQMgds9/1QMklEVdjZigpuOFGrDmmxtBWMAIAAAAADu3L42J/oqNLe/XNYpodf2fhmPdcLhqO4J24o0hiveXwADNQB9AAAABWQAIAAAAADFspsMG7yHjKppyllon1KqAsTrHaZ6JzNqnSz8o6iTvwVzACAAAAAAeiA5pqVIQQ9s6UY/P8v5Jjkl3I7iFNeLDYehikrINrsFYwAgAAAAAAUljtCIvjRnLB2UPTEeRIz11Snl5SOBUNaXMXig4rqKAAM2AH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVjACAAAAAAD51NYesiO4Fo7w7iWBfqAFxEqkaDVctpvzZ28nT4SE8AAzcAfQAAAAVkACAAAAAAYfLwnoxK6XAGQrJFy8+TIJoq38ldBaO75h4zA4ZX5tQFcwAgAAAAAC2wk8UcJH5X5XGnDBYmel6srpBkzBhHtt3Jw1u5TSJ1BWMAIAAAAABJDtFhJ2tPbowp1UUmOCN/rqSqHRL1dtMu0c47vIlK4wADOAB9AAAABWQAIAAAAADGvyrtKkIcaV17ynZA7b2k5Pz6OhvxdWNkDvDWJIja8wVzACAAAAAAOLypVKNxf/wR1G8OZjUUsTQzDYeNNhhITxGMSp7euS4FYwAgAAAAAE6kvmXPqTnYIH4EJmNhy8OLVJZFOmdiBXLMorhELjKWAAM5AH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVjACAAAAAA85AiE+bNFAYQTXQAFexgeczdVhf8FUnf16WzJlI/kmsAAAVlACAAAAAA65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+wSY20AAAAAAAAAAAAAEHBheWxvYWRJZAAAAAAAEGZpcnN0T3BlcmF0b3IAAQAAAAA=",
+ "subType": "06"
+ }
+ }
+ }
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: find
+ outcome:
+ collection:
+ # Outcome is checked using a separate MongoClient without auto encryption.
+ data:
+ -
+ {
+ "_id": 0,
+ "encryptedDate": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ -
+ {
+ "_id": 1,
+ "encryptedDate": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "bE1vqWj3KNyM7cCYUv/cnYm8BPaUL3eMp5syTHq6NF4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "25j9sQXZCihCmHKvTHgaBsAVZFcGPn7JjHdrCGlwyyw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FA74j21GUEJb1DJBOpR9nVnjaDZnd8yAQNuaW9Qi26g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kJv//KVkbrobIBf+QeWC5jxn20mx/P0R1N6aCSMgKM8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zB+Whi9IUUGxfLEe+lGuIzLX4LFbIhaIAm5lRk65QTc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ybO1QU3CgvhO8JgRXH+HxKszWcpl5aGDYYVa75fHa1g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "X3Y3eSAbbMg//JgiHHiFpYOpV61t8kkDexI+CQyitH4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SlNHXyqVFGDPrX/2ppwog6l4pwj3PKda2TkZbqgfSfA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "McjV8xwTF3xI7863DYOBdyvIv6UpzThl6v9vBRk05bI=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
\ No newline at end of file
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-Date-Update.json b/specifications/client-side-encryption/tests/legacy/fle2-Range-Date-Update.json
new file mode 100644
index 00000000000..fd170554f62
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-Date-Update.json
@@ -0,0 +1,540 @@
+{
+ "runOn": [
+ {
+ "minServerVersion": "6.2.0",
+ "topology": [
+ "replicaset",
+ "sharded",
+ "load-balanced"
+ ]
+ }
+ ],
+ "database_name": "default",
+ "collection_name": "default",
+ "data": [],
+ "encrypted_fields": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDate",
+ "bsonType": "date",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ },
+ "max": {
+ "$date": {
+ "$numberLong": "200"
+ }
+ }
+ }
+ }
+ ]
+ },
+ "key_vault_data": [
+ {
+ "_id": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "keyMaterial": {
+ "$binary": {
+ "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==",
+ "subType": "00"
+ }
+ },
+ "creationDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "updateDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "status": {
+ "$numberInt": "0"
+ },
+ "masterKey": {
+ "provider": "local"
+ }
+ }
+ ],
+ "tests": [
+ {
+ "description": "FLE2 Range Date. Update.",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ }
+ },
+ {
+ "name": "updateOne",
+ "arguments": {
+ "filter": {
+ "encryptedDate": {
+ "$gt": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ },
+ "update": {
+ "$set": {
+ "encryptedDate": {
+ "$date": {
+ "$numberLong": "2"
+ }
+ }
+ }
+ }
+ },
+ "result": {
+ "matchedCount": 1,
+ "modifiedCount": 1,
+ "upsertedCount": 0
+ }
+ }
+ ],
+ "expectations": [
+ {
+ "command_started_event": {
+ "command": {
+ "listCollections": 1,
+ "filter": {
+ "name": "default"
+ }
+ },
+ "command_name": "listCollections"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "find": "datakeys",
+ "filter": {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ },
+ "$db": "keyvault",
+ "readConcern": {
+ "level": "majority"
+ }
+ },
+ "command_name": "find"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 0,
+ "encryptedDate": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDate",
+ "bsonType": "date",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ },
+ "max": {
+ "$date": {
+ "$numberLong": "200"
+ }
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 1,
+ "encryptedDate": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDate",
+ "bsonType": "date",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ },
+ "max": {
+ "$date": {
+ "$numberLong": "200"
+ }
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command_name": "update",
+ "command": {
+ "update": "default",
+ "ordered": true,
+ "updates": [
+ {
+ "q": {
+ "encryptedDate": {
+ "$gt": {
+ "$binary": {
+ "base64": "CnEFAAADcGF5bG9hZABBBQAABGcABQUAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVjACAAAAAAKs6X8gaa+AJ6PpxVicsk7iCXpSYIkQ5zB0KnXqlfCWgAAzEAfQAAAAVkACAAAAAAtL3QIvnZqCF72eS6lKr8ilff7R6kiNklokiTuaU5wNsFcwAgAAAAAEtqr3/X731VB+VrbFcY8ZrJKRo2E0Fd+C8L0EMNcvcCBWMAIAAAAABYTWOKsDZ7cgPhiKDR2bE5CFGz4MuEwZbzZ0z46eGzBQADMgB9AAAABWQAIAAAAAB99ZW/7KwXKzl5M3XQsAJ3JbEef90IoxFYBArNiYzlgQVzACAAAAAAYO/qaw0+92HAryxOUG7iK6hnIy3OaUA9jIqtHdvcq8YFYwAgAAAAABSqgKlxv5LXoxUO3zNmqGztlZhL2S150WiR/eycv7CWAAMzAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVjACAAAAAAfsofSP7nQHv8ic8ZW0aNlWxplS46Z+mywPR4rQk+wcgAAzQAfQAAAAVkACAAAAAAV22FGF7ZDwK/EYiGNMlm/QuT3saQdyJM/Fn+ZyQug1oFcwAgAAAAACo7GwCvbcs5UHQMgds9/1QMklEVdjZigpuOFGrDmmxtBWMAIAAAAADu3L42J/oqNLe/XNYpodf2fhmPdcLhqO4J24o0hiveXwADNQB9AAAABWQAIAAAAADFspsMG7yHjKppyllon1KqAsTrHaZ6JzNqnSz8o6iTvwVzACAAAAAAeiA5pqVIQQ9s6UY/P8v5Jjkl3I7iFNeLDYehikrINrsFYwAgAAAAAAUljtCIvjRnLB2UPTEeRIz11Snl5SOBUNaXMXig4rqKAAM2AH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVjACAAAAAAD51NYesiO4Fo7w7iWBfqAFxEqkaDVctpvzZ28nT4SE8AAzcAfQAAAAVkACAAAAAAYfLwnoxK6XAGQrJFy8+TIJoq38ldBaO75h4zA4ZX5tQFcwAgAAAAAC2wk8UcJH5X5XGnDBYmel6srpBkzBhHtt3Jw1u5TSJ1BWMAIAAAAABJDtFhJ2tPbowp1UUmOCN/rqSqHRL1dtMu0c47vIlK4wADOAB9AAAABWQAIAAAAADGvyrtKkIcaV17ynZA7b2k5Pz6OhvxdWNkDvDWJIja8wVzACAAAAAAOLypVKNxf/wR1G8OZjUUsTQzDYeNNhhITxGMSp7euS4FYwAgAAAAAE6kvmXPqTnYIH4EJmNhy8OLVJZFOmdiBXLMorhELjKWAAM5AH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVjACAAAAAA85AiE+bNFAYQTXQAFexgeczdVhf8FUnf16WzJlI/kmsAAAVlACAAAAAA65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+wSY20AAAAAAAAAAAAAEHBheWxvYWRJZAAAAAAAEGZpcnN0T3BlcmF0b3IAAQAAAAA=",
+ "subType": "06"
+ }
+ }
+ }
+ },
+ "u": {
+ "$set": {
+ "encryptedDate": {
+ "$$type": "binData"
+ }
+ }
+ }
+ }
+ ],
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDate",
+ "bsonType": "date",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$date": {
+ "$numberLong": "0"
+ }
+ },
+ "max": {
+ "$date": {
+ "$numberLong": "200"
+ }
+ }
+ }
+ }
+ ]
+ }
+ },
+ "deleteTokens": {
+ "default.default": {
+ "encryptedDate": {
+ "e": {
+ "$binary": {
+ "base64": "65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+w=",
+ "subType": "00"
+ }
+ },
+ "o": {
+ "$binary": {
+ "base64": "noN+05JsuO1oDg59yypIGj45i+eFH6HOTXOPpeZ//Mk=",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "$db": "default"
+ }
+ }
+ }
+ ],
+ "outcome": {
+ "collection": {
+ "data": [
+ {
+ "_id": 0,
+ "encryptedDate": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=",
+ "subType": "00"
+ }
+ }
+ ]
+ },
+ {
+ "_id": 1,
+ "encryptedDate": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "DLCAJs+W2PL2DV5YChCL6dYrQNr+j4p3L7xhVaub4ic=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hyDcE6QQjPrYJaIS/n7evEZFYcm31Tj89CpEYGF45cI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "F08nMDWDZc+DbWM7XCEJNNCEYyinRmrvGP7EWhmp4is=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cXH4688amcDc8kZOJq4UP8cE3R58Zl7e+Qo/1jyspps=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "uURBxvTp3FBCVkd+LPqyuY7d6rMW6SGIJQEPY/wtkZI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "jG3hax1L3RBp9t38vUt53FsBxgr/+Si/vVISpAylYpE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kwtIW8MhH9Ky5xNjBx8gFA/SHh2YVphie7g5FGBzals=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FHflwFuEMu4xX0ZApHi+pdlBH+oevAtXckCUb5Wv0xU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ty4cnzJdAlbQKnh7px3GEYjBnvO+jIOaKjoTRDtmh3M=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ ]
+}
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-Date-Update.yml b/specifications/client-side-encryption/tests/legacy/fle2-Range-Date-Update.yml
new file mode 100644
index 00000000000..ba327caad7d
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-Date-Update.yml
@@ -0,0 +1,260 @@
+# Requires libmongocrypt 1.7.0.
+runOn:
+ - minServerVersion: "6.2.0"
+ # FLE 2 Encrypted collections are not supported on standalone.
+ topology: [ "replicaset", "sharded", "load-balanced" ]
+database_name: &database_name "default"
+collection_name: &collection_name "default"
+data: []
+encrypted_fields: &encrypted_fields {'escCollection': 'enxcol_.default.esc', 'eccCollection': 'enxcol_.default.ecc', 'ecocCollection': 'enxcol_.default.ecoc', 'fields': [{'keyId': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'path': 'encryptedDate', 'bsonType': 'date', 'queries': {'queryType': 'rangePreview', 'contention': {'$numberLong': '0'}, 'sparsity': {'$numberLong': '1'}, 'min': {'$date': {'$numberLong': '0'}}, 'max': {'$date': {'$numberLong': '200'}}}}]}
+key_vault_data: [ {'_id': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'keyMaterial': {'$binary': {'base64': 'sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==', 'subType': '00'}}, 'creationDate': {'$date': {'$numberLong': '1648914851981'}}, 'updateDate': {'$date': {'$numberLong': '1648914851981'}}, 'status': {'$numberInt': '0'}, 'masterKey': {'provider': 'local'}} ]
+tests:
+ - description: "FLE2 Range Date. Update."
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments:
+ document: &doc0 { _id: 0, encryptedDate: { $date: { $numberLong: "0" } }}
+ - name: insertOne
+ arguments:
+ document: &doc1 { _id: 1, encryptedDate: { $date: { $numberLong: "1" } }}
+ - name: updateOne
+ arguments:
+ filter: { encryptedDate: { $gt: { $date: { $numberLong: "0" } } }}
+ update: { "$set": { "encryptedDate": { $date: { $numberLong: "2" } }}}
+ result:
+ matchedCount: 1
+ modifiedCount: 1
+ upsertedCount: 0
+ expectations:
+ - command_started_event:
+ command:
+ listCollections: 1
+ filter:
+ name: *collection_name
+ command_name: listCollections
+ - command_started_event:
+ command:
+ find: datakeys
+ filter: {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ }
+ $db: keyvault
+ readConcern: { level: "majority" }
+ command_name: find
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc0_encrypted { "_id": 0, "encryptedDate": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc1_encrypted { "_id": 1, "encryptedDate": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command_name: update
+ command:
+ {
+ "update": "default",
+ "ordered": true,
+ "updates": [
+ {
+ "q": {
+ "encryptedDate": {
+ "$gt": {
+ "$binary": {
+ "base64": "CnEFAAADcGF5bG9hZABBBQAABGcABQUAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVjACAAAAAAKs6X8gaa+AJ6PpxVicsk7iCXpSYIkQ5zB0KnXqlfCWgAAzEAfQAAAAVkACAAAAAAtL3QIvnZqCF72eS6lKr8ilff7R6kiNklokiTuaU5wNsFcwAgAAAAAEtqr3/X731VB+VrbFcY8ZrJKRo2E0Fd+C8L0EMNcvcCBWMAIAAAAABYTWOKsDZ7cgPhiKDR2bE5CFGz4MuEwZbzZ0z46eGzBQADMgB9AAAABWQAIAAAAAB99ZW/7KwXKzl5M3XQsAJ3JbEef90IoxFYBArNiYzlgQVzACAAAAAAYO/qaw0+92HAryxOUG7iK6hnIy3OaUA9jIqtHdvcq8YFYwAgAAAAABSqgKlxv5LXoxUO3zNmqGztlZhL2S150WiR/eycv7CWAAMzAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVjACAAAAAAfsofSP7nQHv8ic8ZW0aNlWxplS46Z+mywPR4rQk+wcgAAzQAfQAAAAVkACAAAAAAV22FGF7ZDwK/EYiGNMlm/QuT3saQdyJM/Fn+ZyQug1oFcwAgAAAAACo7GwCvbcs5UHQMgds9/1QMklEVdjZigpuOFGrDmmxtBWMAIAAAAADu3L42J/oqNLe/XNYpodf2fhmPdcLhqO4J24o0hiveXwADNQB9AAAABWQAIAAAAADFspsMG7yHjKppyllon1KqAsTrHaZ6JzNqnSz8o6iTvwVzACAAAAAAeiA5pqVIQQ9s6UY/P8v5Jjkl3I7iFNeLDYehikrINrsFYwAgAAAAAAUljtCIvjRnLB2UPTEeRIz11Snl5SOBUNaXMXig4rqKAAM2AH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVjACAAAAAAD51NYesiO4Fo7w7iWBfqAFxEqkaDVctpvzZ28nT4SE8AAzcAfQAAAAVkACAAAAAAYfLwnoxK6XAGQrJFy8+TIJoq38ldBaO75h4zA4ZX5tQFcwAgAAAAAC2wk8UcJH5X5XGnDBYmel6srpBkzBhHtt3Jw1u5TSJ1BWMAIAAAAABJDtFhJ2tPbowp1UUmOCN/rqSqHRL1dtMu0c47vIlK4wADOAB9AAAABWQAIAAAAADGvyrtKkIcaV17ynZA7b2k5Pz6OhvxdWNkDvDWJIja8wVzACAAAAAAOLypVKNxf/wR1G8OZjUUsTQzDYeNNhhITxGMSp7euS4FYwAgAAAAAE6kvmXPqTnYIH4EJmNhy8OLVJZFOmdiBXLMorhELjKWAAM5AH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVjACAAAAAA85AiE+bNFAYQTXQAFexgeczdVhf8FUnf16WzJlI/kmsAAAVlACAAAAAA65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+wSY20AAAAAAAAAAAAAEHBheWxvYWRJZAAAAAAAEGZpcnN0T3BlcmF0b3IAAQAAAAA=",
+ "subType": "06"
+ }
+ }
+ }
+ },
+ "u": {
+ "$set": {
+ "encryptedDate": { $$type: "binData" }
+ }
+ }
+ }
+ ],
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": *encrypted_fields
+ },
+ "deleteTokens": {
+ "default.default": {
+ "encryptedDate": {
+ "e": {
+ "$binary": {
+ "base64": "65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+w=",
+ "subType": "00"
+ }
+ },
+ "o": {
+ "$binary": {
+ "base64": "noN+05JsuO1oDg59yypIGj45i+eFH6HOTXOPpeZ//Mk=",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "$db": "default"
+ }
+
+ outcome:
+ collection:
+ # Outcome is checked using a separate MongoClient without auto encryption.
+ data:
+ -
+ {
+ "_id": 0,
+ "encryptedDate": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ -
+ {
+ "_id": 1,
+ "encryptedDate": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "DLCAJs+W2PL2DV5YChCL6dYrQNr+j4p3L7xhVaub4ic=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hyDcE6QQjPrYJaIS/n7evEZFYcm31Tj89CpEYGF45cI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "F08nMDWDZc+DbWM7XCEJNNCEYyinRmrvGP7EWhmp4is=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cXH4688amcDc8kZOJq4UP8cE3R58Zl7e+Qo/1jyspps=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "uURBxvTp3FBCVkd+LPqyuY7d6rMW6SGIJQEPY/wtkZI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "jG3hax1L3RBp9t38vUt53FsBxgr/+Si/vVISpAylYpE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kwtIW8MhH9Ky5xNjBx8gFA/SHh2YVphie7g5FGBzals=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FHflwFuEMu4xX0ZApHi+pdlBH+oevAtXckCUb5Wv0xU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ty4cnzJdAlbQKnh7px3GEYjBnvO+jIOaKjoTRDtmh3M=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
\ No newline at end of file
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-Decimal-Aggregate.json b/specifications/client-side-encryption/tests/legacy/fle2-Range-Decimal-Aggregate.json
new file mode 100644
index 00000000000..73d2cf4892d
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-Decimal-Aggregate.json
@@ -0,0 +1,1908 @@
+{
+ "runOn": [
+ {
+ "minServerVersion": "6.2.0",
+ "topology": [
+ "replicaset"
+ ]
+ }
+ ],
+ "database_name": "default",
+ "collection_name": "default",
+ "data": [],
+ "encrypted_fields": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDecimal",
+ "bsonType": "decimal",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ ]
+ },
+ "key_vault_data": [
+ {
+ "_id": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "keyMaterial": {
+ "$binary": {
+ "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==",
+ "subType": "00"
+ }
+ },
+ "creationDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "updateDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "status": {
+ "$numberInt": "0"
+ },
+ "masterKey": {
+ "provider": "local"
+ }
+ }
+ ],
+ "tests": [
+ {
+ "description": "FLE2 Range Decimal. Aggregate.",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDecimal": {
+ "$numberDecimal": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDecimal": {
+ "$numberDecimal": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedDecimal": {
+ "$gt": {
+ "$numberDecimal": "0"
+ }
+ }
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 1,
+ "encryptedDecimal": {
+ "$numberDecimal": "1"
+ }
+ }
+ ]
+ }
+ ],
+ "expectations": [
+ {
+ "command_started_event": {
+ "command": {
+ "listCollections": 1,
+ "filter": {
+ "name": "default"
+ }
+ },
+ "command_name": "listCollections"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "find": "datakeys",
+ "filter": {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ },
+ "$db": "keyvault",
+ "readConcern": {
+ "level": "majority"
+ }
+ },
+ "command_name": "find"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 0,
+ "encryptedDecimal": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDecimal",
+ "bsonType": "decimal",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 1,
+ "encryptedDecimal": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDecimal",
+ "bsonType": "decimal",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "aggregate": "default",
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedDecimal": {
+ "$gt": {
+ "$binary": {
+ "base64": "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",
+ "subType": "06"
+ }
+ }
+ }
+ }
+ }
+ ],
+ "cursor": {},
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDecimal",
+ "bsonType": "decimal",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "aggregate"
+ }
+ }
+ ],
+ "outcome": {
+ "collection": {
+ "data": [
+ {
+ "_id": {
+ "$numberInt": "0"
+ },
+ "encryptedDecimal": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rbf3AeBEv4wWFAKknqDxRW5cLNkFvbIs6iJjc6LShQY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "n+XAuFnP8Dov9TnhGFxNx0K/MnVM9WbJ7RouEu0ndO0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yRXojuVdn5GQtD97qYlaCL6cOLmZ7Cvcb3wFjkLUIdM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "DuIkdRPITRs55I4SZmgomAHCIsDQmXRhW8+MOznkzSk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SsBk+Et1lTbU+QRPx+xyJ/jMkmfG+QCvQEpip2YYrzA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "crCIzOd8KhHvvUlX7M1v9bhvU4pLdTc+X2SuqoKU5Ek=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YOWdCw4UrqnxkAaVjqmC4sKQDMVMHEpFGnlxpxdaU6E=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "M3SShp81Ff8tQ632qKbv9MUcN6wjDaBReI0VXNu6Xh4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "gzHlSPxpM0hT75kQvWFzGlOxKvDoiKQZOr19V6l2zXI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "s3JnppOGYw9SL2Q1kMAZs948v2F5PrpXjGei/HioDWs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cG6+3Gk/zEH68P/uuuwiAUVCuyJwa1LeV+t29FlPPAo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dupdvR3AyJtM+g9NDKiaLVOtGca387JQp8w+V03m7Ig=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JqEQc5svj2jTvZ6LLA5ivE+kTb/0aRemSEmxk4G7Zrg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "szcXXXKnob+p3SoM4yED2R920LeJ7cVsclPMFTe4CeI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "o1QoGVXmuBdHwHm7aCtGMlMVKrjFdYvJXpoq6uhIAZ0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Jfm5wPlqqLCJRGQIqRq2NGmpn7s0Vrih2H3YAOoI2YU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zMHLb8ARbsYo8Ld05bqnGFf1Usha6EGb8QKwdSAyps0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yQdtq9lh5pugL7/i0Bj/PuZUUBUIzf+7wj1rl5y736w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wGWVZdO7qIuyDg/BqDgqjgoQ02h5YYgwXQB1oCin2NE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "by9HMLj6NTEpgztZ5HSN6GxImkXPcaFINYDzgZY33X8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tWo0vbasi7bXmn/MsOx13VC1IsWtpx/nYp0uj4iMzdA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tQQpndUYd5O87lOtrGjH3wl9VsOK0ray7RMasL90sBM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cQjXEDCMsOpKLLf+vlTgIHA+cbSJdzqhbSX9Wvh95aA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "7yMpU48IxK9SzP2cx3VnTownGEwFmeFofuuFT97SuuY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kSOx1kz0CmBgzKQHZlo65ZUY1DIv9A99JRm+Us2y6Ew=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ubQpdPBe6/xvtr+AcXdfYLSvYCR4ot0tivehkCsupb4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xal+iCJ6FTefRQToyoNksc9NCZShyn04NDGi4IYrcoM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "d7jU4iOK50xHxlkSifcxlZFCM46TSgQzoYivxG3HNLY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tJvl2nsBLBVzL3pp6sKWCL4UXeh3q/roYBJjSb74ve0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "OIUCaKRvIx9t1w6Hxlz1IcQTdPNCfdRNwnnTm10W+X0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "A9tvzsiElotOUVIB4CqfQp9mAwqvTM35YkmAR170aHA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lI8gpK7hpb7c9x4RQugsxMnQay5LZJmwslZdvMx/dcE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dNCzh40U0XvdKnSDi3HRQOWQftEsDVqc4uUvsVFGoq8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "IP+iwEBWBwVVZIdpaMu8k5+soFCz+TZkYn3drKZ9grE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pnqyh6e0y5svHkJDShlN9CHV0WvMBE4QbtJpQw5ZCXc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "elEl42tbVDoRTLjAhZUFEtXiut4b3PVhg/1ZLZSQdtE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "vHuu2FxwclMHqyE6JBYbTYgbEkB0dqb/JuaxsvfwsmY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xTf7NCe3Gf8QpE78HR5OknlLTKfs9J+RN9UZpH6fnso=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "XiWSasRnJAulGR6+LCVD3mwRObXylqYWR9jvpywq12c=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "MZMxEQ5ikx0PG1YFIExv0UnTZogsvgeOEZTpzvBDn4w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yZMyMZBDrWbAhvnic7vvIYhmO9m5H2iuv0c8KNZrBzY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xxM14hTPY5j0vvcK2C7YAEjzdsfUTFHozHC0hEo1bxI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+01rqR1xVwkpGXcstbk1ItJqFVjH6Q8MGxEN3Cm9Y1A=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xOpLV0Z2VTRJ3iWtnWZcsyjXubTIkYWo31cO+HV1o1k=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "BWUOLqgLBqc5NwxVlSV5H3KFQPXbCp7mdo+jF+8cJqY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "fuQb1S6xZDGlrEbK+kI23aL53PP1PVNwqICnZNt9Yzg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SfscnoibFttahLdPVC4Ee+47ewGFKpDSU7M6HX19bKE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rpSW2awybNVeKtat91VFxqbINoTfNhPfQAu+d73Xtf8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "9M/CP9ccOIIj2LLFmE0GFDO0Ban2wsNalEXfM6+h+1s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "WrEMG49l1ye4MhXs5ZS9tz8P6h+hDvthIg/2wW9ne1Q=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ImNhbfeyfH8qIEeA5ic0s3dAQBdzzTBS+CPsNih9vZ0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dWP33YDSn04UKJN2ogh2Rui0iW/0q2y18OCDRVcfyoo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lYv0isAtfGh6H9tdp3cp2eHU7q2J+uk7QrgcxtK3w7Y=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "VGMoamB/+7zTOYcY/pqJc96xlv2PdW4hwsIAEIslTDQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yNeBWMF7BnD9wVwz2PgJsvWr77QiVvvWUvJF0+fqBug=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SfpvObJ+tJBXSvqeN7vlOfmhYign635lciYAJIjUtY8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dsen4NqjzVGjpjufiTMs3+gqeD09EbnuogPgxrJECwg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pxCWVM3sn19NsFEpgHbgLa+PmYlhN3mMiP0Wk8kJhYw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q11KNvJszjYIB9n9HcC+N4uz11a3eRj1L3BH9scKMDQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "A1PmkgcEToWh1JiVWE6mI5jUu7poxWWuCUt/cgRUUDc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "qJo3Hu4PJeanL7XEaWXO/n3YsodhZyd+MJOOmB9Kpd8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "BkBKLO8URFscfRY9Bav/1+L9mLohDgNr/MkZtGiraIs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rZq5WA3Hx3xthOyHAJXK//f8pE2qbz7YKu3TIMp9GFY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "X07a/Lm80p5xd4RFs1dNmw+90tmPDPdGiAKVZkxd4zY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6YrBn2ofIw1b5ooakrLOwF41BWrps8OO0H9WH4/rtlE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "0l86Ag5OszXpa78SlOUV3K9nff5iC1p0mRXtLg9M1s4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Hn6yuxFHodeyu7ISlhYrbSf9pTiH4TDEvbYLWjTwFO0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zdf4y2etKBuIpkEU1zMwoCkCsdisfXZCh8QPamm+drY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rOQ9oMdiK5xxGH+jPzOvwVqdGGnF3+HkJXxn81s6hp4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "61aKKsE3+BJHHWYvs3xSIBvlRmKswmaOo5rygQJguUg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "KuDb/GIzqDM8wv7m7m8AECiWJbae5EKKtJRugZx7kR0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Q+t8t2TmNUiCIorVr9F3AlVnX+Mpt2ZYvN+s8UGict8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tJRZIpKxUgHyL83kW8cvfjkxN3z6WoNnUg+SQw+LK+k=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pnUsYjip8SvW0+m9mR5WWTkpK+p6uwJ6yBUAlBnFKMk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "PArHlz+yPRYDycAP/PgnI/AkP8Wgmfg++Vf4UG1Bf0E=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wnIh53Q3jeK8jEBe1n8kJLa89/H0BxO26ZU8SRIAs9Q=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "4F8U59gzBLGhq58PEWQk2nch+R0Va7eTUoxMneReUIA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ihKagIW3uT1dm22ROr/g5QaCpxZVj2+Fs/YSdM2Noco=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "EJtUOOwjkrPUi9mavYAi+Gom9Y2DuFll7aDwo4mq0M0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dIkr8dbaVRQFskAVT6B286BbcBBt1pZPEOcTZqk4ZcI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "aYVAcZYkH/Tieoa1XOjE/zCy5AJcVTHjS0NG2QB7muA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "sBidL6y8TenseetpioIAAtn0lK/7C8MoW4JXpVYi3z8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "0Dd2klU/t4R86c2WJcJDAd57k/N7OjvYSO5Vf8KH8sw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "I3jZ92WEVmZmgaIkLbuWhBxl7EM6bEjiEttgBJunArA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "aGHoQMlgJoGvArjfIbc3nnkoc8SWBxcrN7hSmjMRzos=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "bpiWPnF/KVBQr5F6MEwc5ZZayzIRvQOLDAm4ntwOi8g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tI7QVKbE6avWgDD9h4QKyFlnTxFCwd2iLySKakxNR/I=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "XGsge0CnoaXgE3rcpKm8AEeku5QVfokS3kcI+JKV1lk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JQxlryW2Q5WOwfrjAnaZxDvC83Dg6sjRVP5zegf2WiM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YFuHKJOfoqp1iGVxoFjx7bLYgVdsN4GuUFxEgO9HJ5s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Z6vUdiCR18ylKomf08uxcQHeRtmyav7/Ecvzz4av3k4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SPGo1Ib5AiP/tSllL7Z5PAypvnKdwJLzt8imfIMSEJQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "m94Nh6PFFQFLIib9Cu5LAKavhXnagSHG6F5EF8lD96I=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pfEkQI98mB+gm1+JbmVurPAODMFPJ4E8DnqfVyUWbSo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "DNj3OVRLbr43s0vd+rgWghOL3FqeO/60npdojC8Ry/M=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kAYIQrjHVu49W8FTxyxJeiLVRWWjC9fPcBn+Hx1F+Ss=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "aCSO7UVOpoQvu/iridarxkxV1SVxU1i9HVSYXUAeXk4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Gh6hTP/yj1IKlXQ+Q69KTfMlGZjEcXoRLGbQHNFo/1s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "/gDgIFQ4tAlJk3GN48IS5Qa5IPmErwGk8CHxAbp6gs0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "PICyimwPjxpusyKxNssOOwUotAUbygpyEtORsVGXT8g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "4lu+cBHyAUvuxC6JUNyHLzHsCogGSWFFnUCkDwfQdgI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pSndkmoNUJwXjgkbkgOrT5f9nSvuoMEZOkwAN9ElRaE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tyW+D4i26QihNM5MuBM+wnt5AdWGSJaJ4X5ydc9iWTU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "9Syjr8RoxUgPKr+O5rsCu07AvcebA4P8IVKyS1NVLWc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "67tPfDYnK2tmrioI51fOBG0ygajcV0pLo5+Zm/rEW7U=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "y0EiPRxYTuS1eVTIaPQUQBBxwkyxNckbePvKgChwd0M=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "NWd+2veAaeXQgR3vCvzlI4R1WW67D5YsVLdoXfdb8qg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "PY5RQqKQsL2GqBBSPNOEVpojNFRX/NijCghIpxD6CZk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lcvwTyEjFlssCJtdjRpdN6oY+C7bxZY+WA+QAqzj9zg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CWE7XRNylvTwO/9Fv56dNqUaQWMmESNS/GNIwgBaEI0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ijwlrUeS8nRYqK1F8kiCYF0mNDolEZS+/lJO1Lg93C8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "8KzV+qYGYuIjoNj8eEpnTuHrMYuhzphl80rS6wrODuU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wDyTLjSEFF895hSQsHvmoEQVS6KIkZOtq1c9dVogm9I=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SGrtPuMYCjUrfKF0Pq/thdaQzmGBMUvlwN3ORIu9tHU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "KySHON3hIoUk4xWcwTqk6IL0kgjzjxgMBObVIkCGvk4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hBIdS9j0XJPeT4ot73ngELkpUoSixvRBvdOL9z48jY8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Tx6um0q9HjS5ZvlFhvukpI6ORnyrXMWVW1OoxvgqII0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zFKlyfX5H81+d4A4J3FKn4T5JfG+OWtR06ddyX4Mxas=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cGgCDuPV7MeMMYEDpgOupqyNP4BQ4H7rBnd2QygumgM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "IPaUoy98v11EoglTpJ4kBlEawoZ8y7BPwzjLYBpkvHQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Pfo4Am6tOWAyZNn8G9W5HWWGC3ZWmX0igI/RRB870Ro=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "fnTSjd7bC1Udoq6iM7UDnHAC/lsIXSHp/Gy332qw+/I=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "fApBgVRrTDyEumkeWs5p3ag9KB48SbU4Si0dl7Ns9rc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "QxudfBItgoCnUj5NXVnSmWH3HK76YtKkMmzn4lyyUYY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "sSOvwhKa29Wq94bZ5jGIiJQGbG1uBrKSBfOYBz/oZeI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FdaMgwwJ0NKsqmPZLC5oE+/0D74Dfpvig3LaI5yW5Fs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "sRWBy12IERN43BSZIrnBfC9+zFBUdvjTlkqIH81NGt4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "/4tIRpxKhoOwnXAiFn1Z7Xmric4USOIfKvTYQXk3QTc=",
+ "subType": "00"
+ }
+ }
+ ]
+ },
+ {
+ "_id": {
+ "$numberInt": "1"
+ },
+ "encryptedDecimal": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "bE1vqWj3KNyM7cCYUv/cnYm8BPaUL3eMp5syTHq6NF4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RGTjNVEsNJb+DG7DpPOam8rQWD5HZAMpRyiTQaw7tk8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "I93Md7QNPGmEEGYU1+VVCqBPBEvXdqHPtTJtMOn06Yk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "GecBFQ1PemlECWZWCl7f74vmsL6eB6mzQ9n6tK6FYfs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "QpjhZl+O1ORifgtCZuWAdcP6OKL7IZ2cA46v8FJcV28=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RlQWwhU+uVv0a+9IB5cUkEfvHBvOw3B1Sx6WfPWMqes=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ubb81XTC7U+4tcNzf1oYvOY6gR5hC2Izqx54f4GuJ0E=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6M4Q5NMQ9TqNnjzGOxIkiUIY8TEL0I3XD1QnhefQUqU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "BtInzk9t2FFMCEY6AQ7zN8jwrrZEs2irSv6q0Q4NaIw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6vxXfETu9cuBIpRBo3jUUU04mJIH/aAhLX8K6VI5Xv0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wXPCdS+q23zi1bkPnaVG2j0PsVtxdeSLJ//h6J1x8RU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "KY3KkfBAsN2l80wbpj41G0gwBR5KmmFnZcagg7D3ENk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tI8NFAxXCX4VOnY5X73K6KI/Yspd3aR94KV39MhJlAw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "nFxH0UC3mATKA6Vboz+QX/hAjj19kF/SH6H5Cne7qC0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q8hYqIYaIi7nOdG/7qQZYnz8Bsacfi66M1nVku4SH08=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "4saA92R4arp4anvD9xFtze+sNcQqTEhPHyl1h70A8NE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "DbIziOBRRyeQS6RtBR09E37LV+CTKrEjGoRMLSpG6eE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Fv80Plp/7w2gnVqrwawLd6qhJ10G4NCDm3re67cNq4Y=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "T/T2oiQCBBES4YN7EodzPRdabZSFlYIClHBym+bQUZE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ZQgHD3l46Ujqtbnj1VbbeM29C9wJzOhz+yZ/7XdSrxk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ltlFKzWvyZvHxDFOYDd/XXJ6kUiJj0ln2HTCEz2o4Z4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "flW8A7bltC1u8bzx0WJtxosGJdOVsJFfbx33jxnpFGg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SXO+92QbMKwUSG2t27ciunV1c3VvFkUuDmSczpRe008=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+KioGs1GM+xRBzFE67ePTWj04KMSE5/Y6qUF7nJ5kvU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "L3xNVbh6YH+RzqABN+5Jgb7T234Efpn766DmUvxIxgg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hPF+60mBYPjh21dEmPlBhKgyc9S2qLtTkypYvnqP2Fc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "EletRsETy2HcjaPIm2c8CkT7ch/P3pJJDC8hasepcSU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "r5bMXUaNKqLPxZ+TG9HYTG4aSDgcpim27rN8rQFkM0w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "0Q7Erdr8+/S0wUEDDIqlS5XjBVWvhZY65K0uUDb6+Ns=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xEcnhXy35hbXNVBPOOt3TUHbxvKfQ48KjA9b6/rbMqQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "T8bEpiQNgsEudXvyKE9SZlSvbpV/LUaslsdqgSFltyo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hIoiaF2YjnxDbODfhFEB+JGZ5nf8suD3Shck5bwQ3N0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "qnA6qzejeRJ0rsZaZ0zOvKAaXyxt5lpscKQNYFZNl4k=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "anAKCL2DN/le2VaP0n2ucYSEH/DaaEH/8Sa4OqTZsRA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JCZlBJaFm618oWYSnT9Jr1MtwFVw4BZjOzO+5yWgR90=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yxyk4n9762WzcDVGnTn4jCqUnSMIVCrLDIjCX1QVj34=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "fDI6fdKvDJwim5/CQwWZEzcrXE3LHgy7FTtffcC7tXE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Vex+gcz5T+WkzsVZQrkqUR2ryyZbnaOGuWpYvjN0zCw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "8TLEXz+Gbbp6llHpZXVjLsdlYY9f6hrKpHVpyfDe0RY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "7fTyt5BrunypS65TfOzFW2E2qdIuT4SLeDeGlbQoJCs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "8fKGrkqN0/KuSjyXgDBmRauDKrSa//JBKRWHEB9xBf4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "s4codmG7uN4ss6P357jL21lazEe90M9GOK5WrOknSV0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RkSpua8XF+NUdxVDU90EbLUTTyZFX3tt3atBTroFaRk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "LnTCuCDyAHK5B9KXzjtwGmWB+qergQk2OCjnIx9MI2A=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cBFh0virAX4pVXf/udIGI2951i0+0aZAdJcBVGtYnT4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "G54X6myQXWZ5fw/G31en3QbdgfXzL9+hFTtJpnWMqDI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "EdsiiuezcsFJFnYIyGjCOhnqMj1BOwTB5EFxN+ERUkg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dVH9MXLtk0WTwGQ3xmrhOqfropMUkDW3o6paNPGl3NU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "sB3HqXKWY3pKbuEH8BTbfNIGfbY+7/ZbOc3XC+JRNNI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "WHyDk62Xhqbo4/iie2aLIM4x2uuAjv6102dJSHI58oM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pNUFuHpeNRDUZ/NrtII2c6sNc9eGR1lIUlIyXKERA+0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "UPa+pdCqnN0bfAptdzldQOSd01gidrDKy8KhWrpSKAI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "l+7dOAlo+HUffMqFYXL6pgUFeTbwOM9CjKQLxEoLtc4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SRnDXV/rN6C8xwMutv9E1luv3DOUio3VkgPr8Cpm7Ew=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "QcH6gl+gX7xZ7OWhUNQMbndJy0Piz49pDo6RsnLkVSA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "t+uL4DnfsI/Zll/KXWW1cOKX3Hu8WIkm3pt9efCVSAQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "myutHDctku/+Uug/nD8gRbYvmx/IovtoAAC2/fz2oHA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6C+cjD0e0nSCP6cPqQYbNG7SlOd6Mfvi8hyfm7Ng+D8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zg01JSoOj9oBKT0S1ldJucXzY5AKgreS+h2xJreWTOs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "7qQ80/FjodHl1m1py/Oii0/9C/xWbLdhaRXQ+kkCP10=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YwWMNH07vL6c5Nhg+MRnVByhzUunu8y0VLM9z/XvR5U=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Dle8bU98+fudAbc14SToZFkwvV3tcYVsjDug0NWljpc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "J+eKL1vPJmlzltvhI6Li5Fz/TJmi3Ng+ehRTcs46API=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zB3XzfFygLwC3WHkj0up+VbEd25KKoce1vOpG/5bwK4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "vnVnmOnL+z2pqwE+A6cVKS0Iwy4F4/2IiElJca9bUQM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+lG5r/Fpqry3BtFuvY67+RntmHAMDoLVOSGc6ZoXPb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "L5MXQertqc6uj7ADe8aWKbd1sYHPCE7P1VYVg9Zc3VI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "imKONuZgopt0bhM3GMX2WVPwQYMTobuUUEdhcLfHs4c=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "eOkU1J1uVbiVFWBerbXsSIVcF2nqiicTkFy4x7kFHB8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "gI0uDhXeoH/UatDQKEf4qo8FHzWZDhb/wuWTqbq/ID4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cOkd5Aa3btYhtojE/smsF/PJnULqQ4NNqTkU6KXTFmo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "AWNJMs1MTe294oFipp8Y6P0CjpkZ4qCZoClQF3XcHq8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6gJtlzXOFhGYrVbTuRMmvMlDTwXdNtR9aGBlHZPwIMw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "LEmwVGA/xsEG7UrcOoYLFu6KCXgijzFznenknuDacm8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "mIRFPTXRrGaPtp/Ydij2jgkRe4uoUvAKxW2d8b9zYL0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "B+Uv2u48WALOO0L311z+eryjYQzKJVMfdHMZPhOAFmY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "INXXp0wDyVCq+NtfIrrC2ciETmyW/dWB/48/u4yLEZ4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "se7DGo8XrlrQDLEcco1tZrQt9kDe+0RTyl2bw/quG4w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "vr0m2+Zk9lbN6UgWCyn8xJWJOokU3IDYab5U5q1+CgQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "XI+eJ8Gy2JktG1gICgoj1qpsfy1tKmH0kglWbaQH6DA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "A+UCuNnuAUqnQzspA6TVqUPRmtZmpSex5HFw7THRxs0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xaH2Ehfljd19uo0Fvb3iwkdaiWEVQd2YPoitgEPkhSM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "S/iZBJGcc8+qZxyMtab65MMBoSglybwk3x58Nb86gnY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "w14ZE5qqY5YgkS4Zcs9YNbrQbY1XfGOOHNn9bOYnFVQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "0MhGd/jEF1vjkKGp+ZMn9SjLK54jkp9W4Hg+Sp/oxaI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "92QZ73e/NRTYgCm4aifaKth6aAsKnLLccBc0zx/qUTY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "WOjzemCgFJOiGIp81RSVh/tFlzSTj9eFWcBnsiv2Ycs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "DrsP9CmfKPjw5yLL8bnSeAxfNzAwlb+Z8OqCiKgBY7o=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lMogqg8veBv6mri3/drMe9afJiKMvevkmGcw9BedfLo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "TxqwNcY8Tg2MPpNdkPBwvfpuTttSYRHU26DGECKYQ9o=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "l0u1b4b4vYACWIwfnB7PZac4oDEgjQZCzHruNPTgAIY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "iVSGQ+cCfhbWIrY/v/WBORK92elu9gfRKyGhr6r/k00=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yK1forG50diEXte8ECzjfpHeYsPyuQ/dgxbxn/nzY5k=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "gIfTLCD3VwnOwkC0zPXWTqaITxX6ZplA69PO2a6zolc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "O/Zxlgh3WqpzJ7+Sd8XWMVID4/GXJUUWaSqfgDUi3b0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ZQ6yv368zwahUqSUYH/StL0Qgz/TwS1CzlMjVDvCciI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "m2rPEYkjwyiKdonMrKlcF7hya4lFOAUwEePJ3SgrNx8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Mq0yl5iVKlq71bT/dT/fXOWf2n90bTnXFnOdGDN0JOc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6qDGMXipPLC2O6EAAMjO2F9xx4rdqZso4IkPpH2304U=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "jvQHRQQa2RIszE2LX2Hv2LbRhYawJ6qmtRt8HZzFQXg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ovJXQrkZlpeHRciKyE/WWNm5O389gRgzx1W+Dw596X4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "a4kgRNvYctGYqyQv9qScL/WkljTYVylJ9pE9KDULlxU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "qV4Q48vPiCJMTjljotzYKI/zfExWpkKOSHGcAjGyDig=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "jtI7zbBF+QW/aYYTkn90zzyHLXLgmy7l1bzgMb2oqic=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q0KmJl9txPdn962UNvnfe6UFhdk9YaFZuTm33F+csso=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ULNdEqeZJgtmNOhN/Y9INzsE9AnxWYwOMn+pIbRXIFs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "R4oz9+wkdjpKe5tE1jpG7IURAnfvS5fLP4LrD5cZfTE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "qG5Z7VhwSu/HT/YFTgDzyAAzJKq51xPw2HeEV5btYC4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "OM/1DmIIZ5Qyhtq8TGkHTBEMVKjAnKRZMRXYtTG8ctc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "2R5vZbljLXnDFA99YfGuRB7pAdPJVKsT25zLNMC0fUk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "OMbavF2EmdAz1fHkLV3ctFEUDfriKhoT2gidwHZ9z1o=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "MWT4Zrw3/vVvTYMa1Is5Pjr3wEwnBfnEAPPUAHKQhNU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tBkRPfG9yxfKocQx5pAJX0oEHKPL0Tgtr+0UYe09InE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lqxpnDR/H0YgH7RcfKoNoaaRhe1SIazIeMbQ1fu9y3Q=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "utT1UdR22PWOTrOkZauztX613lAplV4eh/ejTRb7ZSk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "S+Y2yFyKi/a6FXhih4yGo29X8I8OT6/zwEoX6NMKT4o=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "QSjVppg29x6oS5yBg8OFjrFt0tuTpWCuKxfIy0k8YnE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "y3r6/Xsfvsl3HksXlVYkJgHUqpQGfICxg3x9f8Zw1qM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "BSltHzEwDjFN4du9rDHAPvl22atlcTioEtt+gC5L1tk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "0arGXjSN0006UnXbrWsGqhvBair569DeFDUME3Df3rA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "s/DumaMad08S+PBUUcrS+v42K0z8HgcdiQtrFAEu2Qs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "EzJ8Y8N0OQBTlnvrK82PdevDNZZO4E6CNgYVu8Cj6Ks=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "VA4vr8jBPI5QdiPrULzzZjBMIUbG3V7Slg5zm0bFcKc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YAOvEB2ZLtq9LQiFViBHWaxxWVVonC2rNYj9tN9s3L0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hgaHMo9aAGS+nBwvqnTjZO+YkiQPY1c1XcIYeaYKHyI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YvaoLt3ZpH0atB0tNzwMjpoxRYJXl0DqSjisMJiGVBE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "EMmW6CptFsiLoPOi5/uAJQ2FmeLg6mCpuVLLrRWk7Mc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "1jQsNMarSnarlYmXEuoFokeBMg/090qUD9wqo1Zn8Gs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hupXNKhRpJxpyDAAP1TgJ5JMZh9lhbMk6s7D7dMS3C8=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ ]
+}
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-Decimal-Aggregate.yml b/specifications/client-side-encryption/tests/legacy/fle2-Range-Decimal-Aggregate.yml
new file mode 100644
index 00000000000..20c9cfd51ed
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-Decimal-Aggregate.yml
@@ -0,0 +1,1673 @@
+# Requires libmongocrypt 1.7.0.
+runOn:
+ - minServerVersion: "6.2.0"
+ # FLE 2 Encrypted collections are not supported on standalone.
+ # Tests for Decimal (without precision) must only run against a replica set. Decimal (without precision) queries are expected to take a long time and may exceed the default mongos timeout.
+ topology: [ "replicaset" ]
+database_name: &database_name "default"
+collection_name: &collection_name "default"
+data: []
+encrypted_fields: &encrypted_fields {'escCollection': 'enxcol_.default.esc', 'eccCollection': 'enxcol_.default.ecc', 'ecocCollection': 'enxcol_.default.ecoc', 'fields': [{'keyId': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'path': 'encryptedDecimal', 'bsonType': 'decimal', 'queries': {'queryType': 'rangePreview', 'contention': {'$numberLong': '0'}, 'sparsity': {'$numberLong': '1'}}}]}
+key_vault_data: [ {'_id': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'keyMaterial': {'$binary': {'base64': 'sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==', 'subType': '00'}}, 'creationDate': {'$date': {'$numberLong': '1648914851981'}}, 'updateDate': {'$date': {'$numberLong': '1648914851981'}}, 'status': {'$numberInt': '0'}, 'masterKey': {'provider': 'local'}} ]
+tests:
+ - description: "FLE2 Range Decimal. Aggregate."
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments:
+ document: &doc0 { _id: 0, encryptedDecimal: { $numberDecimal: "0" } }
+ - name: insertOne
+ arguments:
+ document: &doc1 { _id: 1, encryptedDecimal: { $numberDecimal: "1" } }
+ - name: aggregate
+ arguments:
+ pipeline: [{ $match: { "encryptedDecimal": { $gt: {$numberDecimal: "0" }} } }]
+ result: [*doc1]
+ expectations:
+ - command_started_event:
+ command:
+ listCollections: 1
+ filter:
+ name: *collection_name
+ command_name: listCollections
+ - command_started_event:
+ command:
+ find: datakeys
+ filter: {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ }
+ $db: keyvault
+ readConcern: { level: "majority" }
+ command_name: find
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc0_encrypted { "_id": 0, "encryptedDecimal": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc1_encrypted { "_id": 1, "encryptedDecimal": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ aggregate: *collection_name
+ pipeline: [
+ {
+ "$match": {
+ "encryptedDecimal": {
+ "$gt": {
+ "$binary": {
+ "base64": "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",
+ "subType": "06"
+ }
+ }
+ }
+ }
+ }
+ ]
+ cursor: {}
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: aggregate
+ outcome:
+ collection:
+ # Outcome is checked using a separate MongoClient without auto encryption.
+ data:
+ -
+ {
+ "_id": {
+ "$numberInt": "0"
+ },
+ "encryptedDecimal": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rbf3AeBEv4wWFAKknqDxRW5cLNkFvbIs6iJjc6LShQY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "n+XAuFnP8Dov9TnhGFxNx0K/MnVM9WbJ7RouEu0ndO0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yRXojuVdn5GQtD97qYlaCL6cOLmZ7Cvcb3wFjkLUIdM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "DuIkdRPITRs55I4SZmgomAHCIsDQmXRhW8+MOznkzSk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SsBk+Et1lTbU+QRPx+xyJ/jMkmfG+QCvQEpip2YYrzA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "crCIzOd8KhHvvUlX7M1v9bhvU4pLdTc+X2SuqoKU5Ek=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YOWdCw4UrqnxkAaVjqmC4sKQDMVMHEpFGnlxpxdaU6E=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "M3SShp81Ff8tQ632qKbv9MUcN6wjDaBReI0VXNu6Xh4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "gzHlSPxpM0hT75kQvWFzGlOxKvDoiKQZOr19V6l2zXI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "s3JnppOGYw9SL2Q1kMAZs948v2F5PrpXjGei/HioDWs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cG6+3Gk/zEH68P/uuuwiAUVCuyJwa1LeV+t29FlPPAo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dupdvR3AyJtM+g9NDKiaLVOtGca387JQp8w+V03m7Ig=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JqEQc5svj2jTvZ6LLA5ivE+kTb/0aRemSEmxk4G7Zrg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "szcXXXKnob+p3SoM4yED2R920LeJ7cVsclPMFTe4CeI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "o1QoGVXmuBdHwHm7aCtGMlMVKrjFdYvJXpoq6uhIAZ0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Jfm5wPlqqLCJRGQIqRq2NGmpn7s0Vrih2H3YAOoI2YU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zMHLb8ARbsYo8Ld05bqnGFf1Usha6EGb8QKwdSAyps0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yQdtq9lh5pugL7/i0Bj/PuZUUBUIzf+7wj1rl5y736w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wGWVZdO7qIuyDg/BqDgqjgoQ02h5YYgwXQB1oCin2NE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "by9HMLj6NTEpgztZ5HSN6GxImkXPcaFINYDzgZY33X8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tWo0vbasi7bXmn/MsOx13VC1IsWtpx/nYp0uj4iMzdA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tQQpndUYd5O87lOtrGjH3wl9VsOK0ray7RMasL90sBM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cQjXEDCMsOpKLLf+vlTgIHA+cbSJdzqhbSX9Wvh95aA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "7yMpU48IxK9SzP2cx3VnTownGEwFmeFofuuFT97SuuY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kSOx1kz0CmBgzKQHZlo65ZUY1DIv9A99JRm+Us2y6Ew=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ubQpdPBe6/xvtr+AcXdfYLSvYCR4ot0tivehkCsupb4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xal+iCJ6FTefRQToyoNksc9NCZShyn04NDGi4IYrcoM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "d7jU4iOK50xHxlkSifcxlZFCM46TSgQzoYivxG3HNLY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tJvl2nsBLBVzL3pp6sKWCL4UXeh3q/roYBJjSb74ve0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "OIUCaKRvIx9t1w6Hxlz1IcQTdPNCfdRNwnnTm10W+X0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "A9tvzsiElotOUVIB4CqfQp9mAwqvTM35YkmAR170aHA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lI8gpK7hpb7c9x4RQugsxMnQay5LZJmwslZdvMx/dcE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dNCzh40U0XvdKnSDi3HRQOWQftEsDVqc4uUvsVFGoq8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "IP+iwEBWBwVVZIdpaMu8k5+soFCz+TZkYn3drKZ9grE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pnqyh6e0y5svHkJDShlN9CHV0WvMBE4QbtJpQw5ZCXc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "elEl42tbVDoRTLjAhZUFEtXiut4b3PVhg/1ZLZSQdtE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "vHuu2FxwclMHqyE6JBYbTYgbEkB0dqb/JuaxsvfwsmY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xTf7NCe3Gf8QpE78HR5OknlLTKfs9J+RN9UZpH6fnso=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "XiWSasRnJAulGR6+LCVD3mwRObXylqYWR9jvpywq12c=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "MZMxEQ5ikx0PG1YFIExv0UnTZogsvgeOEZTpzvBDn4w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yZMyMZBDrWbAhvnic7vvIYhmO9m5H2iuv0c8KNZrBzY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xxM14hTPY5j0vvcK2C7YAEjzdsfUTFHozHC0hEo1bxI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+01rqR1xVwkpGXcstbk1ItJqFVjH6Q8MGxEN3Cm9Y1A=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xOpLV0Z2VTRJ3iWtnWZcsyjXubTIkYWo31cO+HV1o1k=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "BWUOLqgLBqc5NwxVlSV5H3KFQPXbCp7mdo+jF+8cJqY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "fuQb1S6xZDGlrEbK+kI23aL53PP1PVNwqICnZNt9Yzg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SfscnoibFttahLdPVC4Ee+47ewGFKpDSU7M6HX19bKE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rpSW2awybNVeKtat91VFxqbINoTfNhPfQAu+d73Xtf8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "9M/CP9ccOIIj2LLFmE0GFDO0Ban2wsNalEXfM6+h+1s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "WrEMG49l1ye4MhXs5ZS9tz8P6h+hDvthIg/2wW9ne1Q=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ImNhbfeyfH8qIEeA5ic0s3dAQBdzzTBS+CPsNih9vZ0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dWP33YDSn04UKJN2ogh2Rui0iW/0q2y18OCDRVcfyoo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lYv0isAtfGh6H9tdp3cp2eHU7q2J+uk7QrgcxtK3w7Y=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "VGMoamB/+7zTOYcY/pqJc96xlv2PdW4hwsIAEIslTDQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yNeBWMF7BnD9wVwz2PgJsvWr77QiVvvWUvJF0+fqBug=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SfpvObJ+tJBXSvqeN7vlOfmhYign635lciYAJIjUtY8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dsen4NqjzVGjpjufiTMs3+gqeD09EbnuogPgxrJECwg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pxCWVM3sn19NsFEpgHbgLa+PmYlhN3mMiP0Wk8kJhYw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q11KNvJszjYIB9n9HcC+N4uz11a3eRj1L3BH9scKMDQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "A1PmkgcEToWh1JiVWE6mI5jUu7poxWWuCUt/cgRUUDc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "qJo3Hu4PJeanL7XEaWXO/n3YsodhZyd+MJOOmB9Kpd8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "BkBKLO8URFscfRY9Bav/1+L9mLohDgNr/MkZtGiraIs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rZq5WA3Hx3xthOyHAJXK//f8pE2qbz7YKu3TIMp9GFY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "X07a/Lm80p5xd4RFs1dNmw+90tmPDPdGiAKVZkxd4zY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6YrBn2ofIw1b5ooakrLOwF41BWrps8OO0H9WH4/rtlE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "0l86Ag5OszXpa78SlOUV3K9nff5iC1p0mRXtLg9M1s4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Hn6yuxFHodeyu7ISlhYrbSf9pTiH4TDEvbYLWjTwFO0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zdf4y2etKBuIpkEU1zMwoCkCsdisfXZCh8QPamm+drY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rOQ9oMdiK5xxGH+jPzOvwVqdGGnF3+HkJXxn81s6hp4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "61aKKsE3+BJHHWYvs3xSIBvlRmKswmaOo5rygQJguUg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "KuDb/GIzqDM8wv7m7m8AECiWJbae5EKKtJRugZx7kR0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Q+t8t2TmNUiCIorVr9F3AlVnX+Mpt2ZYvN+s8UGict8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tJRZIpKxUgHyL83kW8cvfjkxN3z6WoNnUg+SQw+LK+k=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pnUsYjip8SvW0+m9mR5WWTkpK+p6uwJ6yBUAlBnFKMk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "PArHlz+yPRYDycAP/PgnI/AkP8Wgmfg++Vf4UG1Bf0E=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wnIh53Q3jeK8jEBe1n8kJLa89/H0BxO26ZU8SRIAs9Q=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "4F8U59gzBLGhq58PEWQk2nch+R0Va7eTUoxMneReUIA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ihKagIW3uT1dm22ROr/g5QaCpxZVj2+Fs/YSdM2Noco=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "EJtUOOwjkrPUi9mavYAi+Gom9Y2DuFll7aDwo4mq0M0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dIkr8dbaVRQFskAVT6B286BbcBBt1pZPEOcTZqk4ZcI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "aYVAcZYkH/Tieoa1XOjE/zCy5AJcVTHjS0NG2QB7muA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "sBidL6y8TenseetpioIAAtn0lK/7C8MoW4JXpVYi3z8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "0Dd2klU/t4R86c2WJcJDAd57k/N7OjvYSO5Vf8KH8sw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "I3jZ92WEVmZmgaIkLbuWhBxl7EM6bEjiEttgBJunArA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "aGHoQMlgJoGvArjfIbc3nnkoc8SWBxcrN7hSmjMRzos=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "bpiWPnF/KVBQr5F6MEwc5ZZayzIRvQOLDAm4ntwOi8g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tI7QVKbE6avWgDD9h4QKyFlnTxFCwd2iLySKakxNR/I=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "XGsge0CnoaXgE3rcpKm8AEeku5QVfokS3kcI+JKV1lk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JQxlryW2Q5WOwfrjAnaZxDvC83Dg6sjRVP5zegf2WiM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YFuHKJOfoqp1iGVxoFjx7bLYgVdsN4GuUFxEgO9HJ5s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Z6vUdiCR18ylKomf08uxcQHeRtmyav7/Ecvzz4av3k4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SPGo1Ib5AiP/tSllL7Z5PAypvnKdwJLzt8imfIMSEJQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "m94Nh6PFFQFLIib9Cu5LAKavhXnagSHG6F5EF8lD96I=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pfEkQI98mB+gm1+JbmVurPAODMFPJ4E8DnqfVyUWbSo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "DNj3OVRLbr43s0vd+rgWghOL3FqeO/60npdojC8Ry/M=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kAYIQrjHVu49W8FTxyxJeiLVRWWjC9fPcBn+Hx1F+Ss=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "aCSO7UVOpoQvu/iridarxkxV1SVxU1i9HVSYXUAeXk4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Gh6hTP/yj1IKlXQ+Q69KTfMlGZjEcXoRLGbQHNFo/1s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "/gDgIFQ4tAlJk3GN48IS5Qa5IPmErwGk8CHxAbp6gs0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "PICyimwPjxpusyKxNssOOwUotAUbygpyEtORsVGXT8g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "4lu+cBHyAUvuxC6JUNyHLzHsCogGSWFFnUCkDwfQdgI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pSndkmoNUJwXjgkbkgOrT5f9nSvuoMEZOkwAN9ElRaE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tyW+D4i26QihNM5MuBM+wnt5AdWGSJaJ4X5ydc9iWTU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "9Syjr8RoxUgPKr+O5rsCu07AvcebA4P8IVKyS1NVLWc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "67tPfDYnK2tmrioI51fOBG0ygajcV0pLo5+Zm/rEW7U=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "y0EiPRxYTuS1eVTIaPQUQBBxwkyxNckbePvKgChwd0M=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "NWd+2veAaeXQgR3vCvzlI4R1WW67D5YsVLdoXfdb8qg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "PY5RQqKQsL2GqBBSPNOEVpojNFRX/NijCghIpxD6CZk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lcvwTyEjFlssCJtdjRpdN6oY+C7bxZY+WA+QAqzj9zg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CWE7XRNylvTwO/9Fv56dNqUaQWMmESNS/GNIwgBaEI0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ijwlrUeS8nRYqK1F8kiCYF0mNDolEZS+/lJO1Lg93C8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "8KzV+qYGYuIjoNj8eEpnTuHrMYuhzphl80rS6wrODuU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wDyTLjSEFF895hSQsHvmoEQVS6KIkZOtq1c9dVogm9I=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SGrtPuMYCjUrfKF0Pq/thdaQzmGBMUvlwN3ORIu9tHU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "KySHON3hIoUk4xWcwTqk6IL0kgjzjxgMBObVIkCGvk4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hBIdS9j0XJPeT4ot73ngELkpUoSixvRBvdOL9z48jY8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Tx6um0q9HjS5ZvlFhvukpI6ORnyrXMWVW1OoxvgqII0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zFKlyfX5H81+d4A4J3FKn4T5JfG+OWtR06ddyX4Mxas=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cGgCDuPV7MeMMYEDpgOupqyNP4BQ4H7rBnd2QygumgM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "IPaUoy98v11EoglTpJ4kBlEawoZ8y7BPwzjLYBpkvHQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Pfo4Am6tOWAyZNn8G9W5HWWGC3ZWmX0igI/RRB870Ro=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "fnTSjd7bC1Udoq6iM7UDnHAC/lsIXSHp/Gy332qw+/I=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "fApBgVRrTDyEumkeWs5p3ag9KB48SbU4Si0dl7Ns9rc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "QxudfBItgoCnUj5NXVnSmWH3HK76YtKkMmzn4lyyUYY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "sSOvwhKa29Wq94bZ5jGIiJQGbG1uBrKSBfOYBz/oZeI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FdaMgwwJ0NKsqmPZLC5oE+/0D74Dfpvig3LaI5yW5Fs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "sRWBy12IERN43BSZIrnBfC9+zFBUdvjTlkqIH81NGt4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "/4tIRpxKhoOwnXAiFn1Z7Xmric4USOIfKvTYQXk3QTc=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ -
+ {
+ "_id": {
+ "$numberInt": "1"
+ },
+ "encryptedDecimal": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "bE1vqWj3KNyM7cCYUv/cnYm8BPaUL3eMp5syTHq6NF4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RGTjNVEsNJb+DG7DpPOam8rQWD5HZAMpRyiTQaw7tk8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "I93Md7QNPGmEEGYU1+VVCqBPBEvXdqHPtTJtMOn06Yk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "GecBFQ1PemlECWZWCl7f74vmsL6eB6mzQ9n6tK6FYfs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "QpjhZl+O1ORifgtCZuWAdcP6OKL7IZ2cA46v8FJcV28=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RlQWwhU+uVv0a+9IB5cUkEfvHBvOw3B1Sx6WfPWMqes=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ubb81XTC7U+4tcNzf1oYvOY6gR5hC2Izqx54f4GuJ0E=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6M4Q5NMQ9TqNnjzGOxIkiUIY8TEL0I3XD1QnhefQUqU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "BtInzk9t2FFMCEY6AQ7zN8jwrrZEs2irSv6q0Q4NaIw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6vxXfETu9cuBIpRBo3jUUU04mJIH/aAhLX8K6VI5Xv0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wXPCdS+q23zi1bkPnaVG2j0PsVtxdeSLJ//h6J1x8RU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "KY3KkfBAsN2l80wbpj41G0gwBR5KmmFnZcagg7D3ENk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tI8NFAxXCX4VOnY5X73K6KI/Yspd3aR94KV39MhJlAw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "nFxH0UC3mATKA6Vboz+QX/hAjj19kF/SH6H5Cne7qC0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q8hYqIYaIi7nOdG/7qQZYnz8Bsacfi66M1nVku4SH08=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "4saA92R4arp4anvD9xFtze+sNcQqTEhPHyl1h70A8NE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "DbIziOBRRyeQS6RtBR09E37LV+CTKrEjGoRMLSpG6eE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Fv80Plp/7w2gnVqrwawLd6qhJ10G4NCDm3re67cNq4Y=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "T/T2oiQCBBES4YN7EodzPRdabZSFlYIClHBym+bQUZE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ZQgHD3l46Ujqtbnj1VbbeM29C9wJzOhz+yZ/7XdSrxk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ltlFKzWvyZvHxDFOYDd/XXJ6kUiJj0ln2HTCEz2o4Z4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "flW8A7bltC1u8bzx0WJtxosGJdOVsJFfbx33jxnpFGg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SXO+92QbMKwUSG2t27ciunV1c3VvFkUuDmSczpRe008=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+KioGs1GM+xRBzFE67ePTWj04KMSE5/Y6qUF7nJ5kvU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "L3xNVbh6YH+RzqABN+5Jgb7T234Efpn766DmUvxIxgg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hPF+60mBYPjh21dEmPlBhKgyc9S2qLtTkypYvnqP2Fc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "EletRsETy2HcjaPIm2c8CkT7ch/P3pJJDC8hasepcSU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "r5bMXUaNKqLPxZ+TG9HYTG4aSDgcpim27rN8rQFkM0w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "0Q7Erdr8+/S0wUEDDIqlS5XjBVWvhZY65K0uUDb6+Ns=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xEcnhXy35hbXNVBPOOt3TUHbxvKfQ48KjA9b6/rbMqQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "T8bEpiQNgsEudXvyKE9SZlSvbpV/LUaslsdqgSFltyo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hIoiaF2YjnxDbODfhFEB+JGZ5nf8suD3Shck5bwQ3N0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "qnA6qzejeRJ0rsZaZ0zOvKAaXyxt5lpscKQNYFZNl4k=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "anAKCL2DN/le2VaP0n2ucYSEH/DaaEH/8Sa4OqTZsRA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JCZlBJaFm618oWYSnT9Jr1MtwFVw4BZjOzO+5yWgR90=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yxyk4n9762WzcDVGnTn4jCqUnSMIVCrLDIjCX1QVj34=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "fDI6fdKvDJwim5/CQwWZEzcrXE3LHgy7FTtffcC7tXE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Vex+gcz5T+WkzsVZQrkqUR2ryyZbnaOGuWpYvjN0zCw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "8TLEXz+Gbbp6llHpZXVjLsdlYY9f6hrKpHVpyfDe0RY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "7fTyt5BrunypS65TfOzFW2E2qdIuT4SLeDeGlbQoJCs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "8fKGrkqN0/KuSjyXgDBmRauDKrSa//JBKRWHEB9xBf4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "s4codmG7uN4ss6P357jL21lazEe90M9GOK5WrOknSV0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RkSpua8XF+NUdxVDU90EbLUTTyZFX3tt3atBTroFaRk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "LnTCuCDyAHK5B9KXzjtwGmWB+qergQk2OCjnIx9MI2A=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cBFh0virAX4pVXf/udIGI2951i0+0aZAdJcBVGtYnT4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "G54X6myQXWZ5fw/G31en3QbdgfXzL9+hFTtJpnWMqDI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "EdsiiuezcsFJFnYIyGjCOhnqMj1BOwTB5EFxN+ERUkg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dVH9MXLtk0WTwGQ3xmrhOqfropMUkDW3o6paNPGl3NU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "sB3HqXKWY3pKbuEH8BTbfNIGfbY+7/ZbOc3XC+JRNNI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "WHyDk62Xhqbo4/iie2aLIM4x2uuAjv6102dJSHI58oM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pNUFuHpeNRDUZ/NrtII2c6sNc9eGR1lIUlIyXKERA+0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "UPa+pdCqnN0bfAptdzldQOSd01gidrDKy8KhWrpSKAI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "l+7dOAlo+HUffMqFYXL6pgUFeTbwOM9CjKQLxEoLtc4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SRnDXV/rN6C8xwMutv9E1luv3DOUio3VkgPr8Cpm7Ew=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "QcH6gl+gX7xZ7OWhUNQMbndJy0Piz49pDo6RsnLkVSA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "t+uL4DnfsI/Zll/KXWW1cOKX3Hu8WIkm3pt9efCVSAQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "myutHDctku/+Uug/nD8gRbYvmx/IovtoAAC2/fz2oHA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6C+cjD0e0nSCP6cPqQYbNG7SlOd6Mfvi8hyfm7Ng+D8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zg01JSoOj9oBKT0S1ldJucXzY5AKgreS+h2xJreWTOs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "7qQ80/FjodHl1m1py/Oii0/9C/xWbLdhaRXQ+kkCP10=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YwWMNH07vL6c5Nhg+MRnVByhzUunu8y0VLM9z/XvR5U=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Dle8bU98+fudAbc14SToZFkwvV3tcYVsjDug0NWljpc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "J+eKL1vPJmlzltvhI6Li5Fz/TJmi3Ng+ehRTcs46API=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zB3XzfFygLwC3WHkj0up+VbEd25KKoce1vOpG/5bwK4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "vnVnmOnL+z2pqwE+A6cVKS0Iwy4F4/2IiElJca9bUQM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+lG5r/Fpqry3BtFuvY67+RntmHAMDoLVOSGc6ZoXPb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "L5MXQertqc6uj7ADe8aWKbd1sYHPCE7P1VYVg9Zc3VI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "imKONuZgopt0bhM3GMX2WVPwQYMTobuUUEdhcLfHs4c=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "eOkU1J1uVbiVFWBerbXsSIVcF2nqiicTkFy4x7kFHB8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "gI0uDhXeoH/UatDQKEf4qo8FHzWZDhb/wuWTqbq/ID4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cOkd5Aa3btYhtojE/smsF/PJnULqQ4NNqTkU6KXTFmo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "AWNJMs1MTe294oFipp8Y6P0CjpkZ4qCZoClQF3XcHq8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6gJtlzXOFhGYrVbTuRMmvMlDTwXdNtR9aGBlHZPwIMw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "LEmwVGA/xsEG7UrcOoYLFu6KCXgijzFznenknuDacm8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "mIRFPTXRrGaPtp/Ydij2jgkRe4uoUvAKxW2d8b9zYL0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "B+Uv2u48WALOO0L311z+eryjYQzKJVMfdHMZPhOAFmY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "INXXp0wDyVCq+NtfIrrC2ciETmyW/dWB/48/u4yLEZ4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "se7DGo8XrlrQDLEcco1tZrQt9kDe+0RTyl2bw/quG4w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "vr0m2+Zk9lbN6UgWCyn8xJWJOokU3IDYab5U5q1+CgQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "XI+eJ8Gy2JktG1gICgoj1qpsfy1tKmH0kglWbaQH6DA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "A+UCuNnuAUqnQzspA6TVqUPRmtZmpSex5HFw7THRxs0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xaH2Ehfljd19uo0Fvb3iwkdaiWEVQd2YPoitgEPkhSM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "S/iZBJGcc8+qZxyMtab65MMBoSglybwk3x58Nb86gnY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "w14ZE5qqY5YgkS4Zcs9YNbrQbY1XfGOOHNn9bOYnFVQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "0MhGd/jEF1vjkKGp+ZMn9SjLK54jkp9W4Hg+Sp/oxaI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "92QZ73e/NRTYgCm4aifaKth6aAsKnLLccBc0zx/qUTY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "WOjzemCgFJOiGIp81RSVh/tFlzSTj9eFWcBnsiv2Ycs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "DrsP9CmfKPjw5yLL8bnSeAxfNzAwlb+Z8OqCiKgBY7o=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lMogqg8veBv6mri3/drMe9afJiKMvevkmGcw9BedfLo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "TxqwNcY8Tg2MPpNdkPBwvfpuTttSYRHU26DGECKYQ9o=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "l0u1b4b4vYACWIwfnB7PZac4oDEgjQZCzHruNPTgAIY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "iVSGQ+cCfhbWIrY/v/WBORK92elu9gfRKyGhr6r/k00=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yK1forG50diEXte8ECzjfpHeYsPyuQ/dgxbxn/nzY5k=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "gIfTLCD3VwnOwkC0zPXWTqaITxX6ZplA69PO2a6zolc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "O/Zxlgh3WqpzJ7+Sd8XWMVID4/GXJUUWaSqfgDUi3b0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ZQ6yv368zwahUqSUYH/StL0Qgz/TwS1CzlMjVDvCciI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "m2rPEYkjwyiKdonMrKlcF7hya4lFOAUwEePJ3SgrNx8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Mq0yl5iVKlq71bT/dT/fXOWf2n90bTnXFnOdGDN0JOc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6qDGMXipPLC2O6EAAMjO2F9xx4rdqZso4IkPpH2304U=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "jvQHRQQa2RIszE2LX2Hv2LbRhYawJ6qmtRt8HZzFQXg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ovJXQrkZlpeHRciKyE/WWNm5O389gRgzx1W+Dw596X4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "a4kgRNvYctGYqyQv9qScL/WkljTYVylJ9pE9KDULlxU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "qV4Q48vPiCJMTjljotzYKI/zfExWpkKOSHGcAjGyDig=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "jtI7zbBF+QW/aYYTkn90zzyHLXLgmy7l1bzgMb2oqic=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q0KmJl9txPdn962UNvnfe6UFhdk9YaFZuTm33F+csso=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ULNdEqeZJgtmNOhN/Y9INzsE9AnxWYwOMn+pIbRXIFs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "R4oz9+wkdjpKe5tE1jpG7IURAnfvS5fLP4LrD5cZfTE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "qG5Z7VhwSu/HT/YFTgDzyAAzJKq51xPw2HeEV5btYC4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "OM/1DmIIZ5Qyhtq8TGkHTBEMVKjAnKRZMRXYtTG8ctc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "2R5vZbljLXnDFA99YfGuRB7pAdPJVKsT25zLNMC0fUk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "OMbavF2EmdAz1fHkLV3ctFEUDfriKhoT2gidwHZ9z1o=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "MWT4Zrw3/vVvTYMa1Is5Pjr3wEwnBfnEAPPUAHKQhNU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tBkRPfG9yxfKocQx5pAJX0oEHKPL0Tgtr+0UYe09InE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lqxpnDR/H0YgH7RcfKoNoaaRhe1SIazIeMbQ1fu9y3Q=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "utT1UdR22PWOTrOkZauztX613lAplV4eh/ejTRb7ZSk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "S+Y2yFyKi/a6FXhih4yGo29X8I8OT6/zwEoX6NMKT4o=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "QSjVppg29x6oS5yBg8OFjrFt0tuTpWCuKxfIy0k8YnE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "y3r6/Xsfvsl3HksXlVYkJgHUqpQGfICxg3x9f8Zw1qM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "BSltHzEwDjFN4du9rDHAPvl22atlcTioEtt+gC5L1tk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "0arGXjSN0006UnXbrWsGqhvBair569DeFDUME3Df3rA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "s/DumaMad08S+PBUUcrS+v42K0z8HgcdiQtrFAEu2Qs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "EzJ8Y8N0OQBTlnvrK82PdevDNZZO4E6CNgYVu8Cj6Ks=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "VA4vr8jBPI5QdiPrULzzZjBMIUbG3V7Slg5zm0bFcKc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YAOvEB2ZLtq9LQiFViBHWaxxWVVonC2rNYj9tN9s3L0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hgaHMo9aAGS+nBwvqnTjZO+YkiQPY1c1XcIYeaYKHyI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YvaoLt3ZpH0atB0tNzwMjpoxRYJXl0DqSjisMJiGVBE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "EMmW6CptFsiLoPOi5/uAJQ2FmeLg6mCpuVLLrRWk7Mc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "1jQsNMarSnarlYmXEuoFokeBMg/090qUD9wqo1Zn8Gs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hupXNKhRpJxpyDAAP1TgJ5JMZh9lhbMk6s7D7dMS3C8=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+
\ No newline at end of file
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-Decimal-Correctness.json b/specifications/client-side-encryption/tests/legacy/fle2-Range-Decimal-Correctness.json
new file mode 100644
index 00000000000..89b7bd3118b
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-Decimal-Correctness.json
@@ -0,0 +1,1158 @@
+{
+ "runOn": [
+ {
+ "minServerVersion": "6.2.0",
+ "topology": [
+ "replicaset"
+ ]
+ }
+ ],
+ "database_name": "default",
+ "collection_name": "default",
+ "data": [],
+ "encrypted_fields": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDecimal",
+ "bsonType": "decimal",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ ]
+ },
+ "key_vault_data": [
+ {
+ "_id": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "keyMaterial": {
+ "$binary": {
+ "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==",
+ "subType": "00"
+ }
+ },
+ "creationDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "updateDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "status": {
+ "$numberInt": "0"
+ },
+ "masterKey": {
+ "provider": "local"
+ }
+ }
+ ],
+ "tests": [
+ {
+ "description": "Find with $gt",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDecimal": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDecimal": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDecimal": {
+ "$gt": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ }
+ },
+ "result": [
+ {
+ "_id": 1,
+ "encryptedDecimal": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Find with $gte",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDecimal": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDecimal": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDecimal": {
+ "$gte": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ },
+ "sort": {
+ "_id": 1
+ }
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedDecimal": {
+ "$numberDecimal": "0.0"
+ }
+ },
+ {
+ "_id": 1,
+ "encryptedDecimal": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Find with $gt with no results",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDecimal": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDecimal": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDecimal": {
+ "$gt": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ }
+ },
+ "result": []
+ }
+ ]
+ },
+ {
+ "description": "Find with $lt",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDecimal": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDecimal": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDecimal": {
+ "$lt": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ }
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedDecimal": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Find with $lte",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDecimal": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDecimal": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDecimal": {
+ "$lte": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ },
+ "sort": {
+ "_id": 1
+ }
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedDecimal": {
+ "$numberDecimal": "0.0"
+ }
+ },
+ {
+ "_id": 1,
+ "encryptedDecimal": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Find with $gt and $lt",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDecimal": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDecimal": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDecimal": {
+ "$gt": {
+ "$numberDecimal": "0.0"
+ },
+ "$lt": {
+ "$numberDecimal": "2.0"
+ }
+ }
+ }
+ },
+ "result": [
+ {
+ "_id": 1,
+ "encryptedDecimal": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Find with equality",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDecimal": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDecimal": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDecimal": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedDecimal": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ ]
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDecimal": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ },
+ "result": [
+ {
+ "_id": 1,
+ "encryptedDecimal": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Find with $in",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDecimal": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDecimal": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDecimal": {
+ "$in": [
+ {
+ "$numberDecimal": "0.0"
+ }
+ ]
+ }
+ }
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedDecimal": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with $gte",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDecimal": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDecimal": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedDecimal": {
+ "$gte": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "$sort": {
+ "_id": 1
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedDecimal": {
+ "$numberDecimal": "0.0"
+ }
+ },
+ {
+ "_id": 1,
+ "encryptedDecimal": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with $gt with no results",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDecimal": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDecimal": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedDecimal": {
+ "$gt": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ }
+ }
+ ]
+ },
+ "result": []
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with $lt",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDecimal": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDecimal": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedDecimal": {
+ "$lt": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedDecimal": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with $lte",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDecimal": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDecimal": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedDecimal": {
+ "$lte": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "$sort": {
+ "_id": 1
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedDecimal": {
+ "$numberDecimal": "0.0"
+ }
+ },
+ {
+ "_id": 1,
+ "encryptedDecimal": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with $gt and $lt",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDecimal": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDecimal": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedDecimal": {
+ "$gt": {
+ "$numberDecimal": "0.0"
+ },
+ "$lt": {
+ "$numberDecimal": "2.0"
+ }
+ }
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 1,
+ "encryptedDecimal": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with equality",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDecimal": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDecimal": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedDecimal": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedDecimal": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ ]
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedDecimal": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 1,
+ "encryptedDecimal": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with $in",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDecimal": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDecimal": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedDecimal": {
+ "$in": [
+ {
+ "$numberDecimal": "0.0"
+ }
+ ]
+ }
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedDecimal": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Wrong type: Insert Int",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDecimal": {
+ "$numberInt": "0"
+ }
+ }
+ },
+ "result": {
+ "errorContains": "cannot encrypt element"
+ }
+ }
+ ]
+ },
+ {
+ "description": "Wrong type: Find Int",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDecimal": {
+ "$gte": {
+ "$numberInt": "0"
+ }
+ }
+ },
+ "sort": {
+ "_id": 1
+ }
+ },
+ "result": {
+ "errorContains": "field type is not supported"
+ }
+ }
+ ]
+ }
+ ]
+}
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-Decimal-Correctness.yml b/specifications/client-side-encryption/tests/legacy/fle2-Range-Decimal-Correctness.yml
new file mode 100644
index 00000000000..03df38175f2
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-Decimal-Correctness.yml
@@ -0,0 +1,291 @@
+# Test correctness results.
+# Does not include command monitoring expectations or outcome assertions to make tests more readable.
+# Requires libmongocrypt 1.7.0.
+runOn:
+ - minServerVersion: "6.2.0"
+ # FLE 2 Encrypted collections are not supported on standalone.
+ # Tests for Decimal (without precision) must only run against a replica set. Decimal (without precision) queries are expected to take a long time and may exceed the default mongos timeout.
+ topology: [ "replicaset" ]
+database_name: &database_name "default"
+collection_name: &collection_name "default"
+data: []
+encrypted_fields: &encrypted_fields {'escCollection': 'enxcol_.default.esc', 'eccCollection': 'enxcol_.default.ecc', 'ecocCollection': 'enxcol_.default.ecoc', 'fields': [{'keyId': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'path': 'encryptedDecimal', 'bsonType': 'decimal', 'queries': {'queryType': 'rangePreview', 'contention': {'$numberLong': '0'}, 'sparsity': {'$numberLong': '1'}}}]}
+key_vault_data: [ {'_id': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'keyMaterial': {'$binary': {'base64': 'sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==', 'subType': '00'}}, 'creationDate': {'$date': {'$numberLong': '1648914851981'}}, 'updateDate': {'$date': {'$numberLong': '1648914851981'}}, 'status': {'$numberInt': '0'}, 'masterKey': {'provider': 'local'}} ]
+tests:
+ - description: "Find with $gt"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments:
+ document: &doc0 { _id: 0, encryptedDecimal: { $numberDecimal: "0.0" } }
+ - name: insertOne
+ arguments:
+ document: &doc1 { _id: 1, encryptedDecimal: { $numberDecimal: "1.0" } }
+ - name: find
+ arguments:
+ filter: { encryptedDecimal: { $gt: { $numberDecimal: "0.0" } }}
+ result: [*doc1]
+
+ - description: "Find with $gte"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedDecimal: { $gte: { $numberDecimal: "0.0" } }}
+ # sort so results from range queries are ordered.
+ sort: { _id: 1 }
+ result: [*doc0, *doc1]
+
+ - description: "Find with $gt with no results"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedDecimal: { $gt: { $numberDecimal: "1.0" } }}
+ result: []
+
+ - description: "Find with $lt"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedDecimal: { $lt: { $numberDecimal: "1.0" } }}
+ result: [*doc0]
+
+ - description: "Find with $lte"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedDecimal: { $lte: { $numberDecimal: "1.0" } }}
+ # sort so results from range queries are ordered.
+ sort: { _id: 1 }
+ result: [*doc0, *doc1]
+
+ - description: "Find with $gt and $lt"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedDecimal: { $gt: { $numberDecimal: "0.0" }, $lt: { $numberDecimal: "2.0"} }}
+ result: [*doc1]
+
+ - description: "Find with equality"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedDecimal: { $numberDecimal: "0.0" } }
+ result: [*doc0]
+ - name: find
+ arguments:
+ filter: { encryptedDecimal: { $numberDecimal: "1.0" } }
+ result: [*doc1]
+
+ - description: "Find with $in"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedDecimal: { $in: [ {$numberDecimal: "0.0"} ] } }
+ result: [*doc0]
+
+ - description: "Aggregate with $gte"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedDecimal: { $gte: { $numberDecimal: "0.0" } }} }
+ # sort so results from range queries are ordered.
+ - { $sort: { _id: 1 }}
+ result: [*doc0, *doc1]
+
+ - description: "Aggregate with $gt with no results"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedDecimal: { $gt: { $numberDecimal: "1.0" } }} }
+ result: []
+
+ - description: "Aggregate with $lt"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedDecimal: { $lt: { $numberDecimal: "1.0" } }} }
+ result: [*doc0]
+
+ - description: "Aggregate with $lte"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedDecimal: { $lte: { $numberDecimal: "1.0" } }} }
+ # sort so results from range queries are ordered.
+ - { $sort: { _id: 1 }}
+ result: [*doc0, *doc1]
+
+ - description: "Aggregate with $gt and $lt"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedDecimal: { $gt: { $numberDecimal: "0.0" }, $lt: { $numberDecimal: "2.0"} }} }
+ result: [*doc1]
+
+ - description: "Aggregate with equality"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedDecimal: { $numberDecimal: "0.0" } } }
+ result: [*doc0]
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedDecimal: { $numberDecimal: "1.0" } } }
+ result: [*doc1]
+
+ - description: "Aggregate with $in"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedDecimal: { $in: [ {$numberDecimal: "0.0"} ] } } }
+ result: [*doc0]
+
+ - description: "Wrong type: Insert Int"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: { _id: 0, encryptedDecimal: { $numberInt: "0" }} }
+ result:
+ # Expect an error from mongocryptd.
+ errorContains: "cannot encrypt element"
+
+ - description: "Wrong type: Find Int"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: find
+ arguments:
+ filter: { encryptedDecimal: { $gte: { $numberInt: "0" } }}
+ # sort so results from range queries are ordered.
+ sort: { _id: 1 }
+ result:
+ # expect an error from libmongocrypt.
+ errorContains: "field type is not supported"
\ No newline at end of file
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-Decimal-Delete.json b/specifications/client-side-encryption/tests/legacy/fle2-Range-Decimal-Delete.json
new file mode 100644
index 00000000000..0463be1c69f
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-Decimal-Delete.json
@@ -0,0 +1,1133 @@
+{
+ "runOn": [
+ {
+ "minServerVersion": "6.2.0",
+ "topology": [
+ "replicaset"
+ ]
+ }
+ ],
+ "database_name": "default",
+ "collection_name": "default",
+ "data": [],
+ "encrypted_fields": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDecimal",
+ "bsonType": "decimal",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ ]
+ },
+ "key_vault_data": [
+ {
+ "_id": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "keyMaterial": {
+ "$binary": {
+ "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==",
+ "subType": "00"
+ }
+ },
+ "creationDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "updateDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "status": {
+ "$numberInt": "0"
+ },
+ "masterKey": {
+ "provider": "local"
+ }
+ }
+ ],
+ "tests": [
+ {
+ "description": "FLE2 Range Decimal. Delete.",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDecimal": {
+ "$numberDecimal": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDecimal": {
+ "$numberDecimal": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "deleteOne",
+ "arguments": {
+ "filter": {
+ "encryptedDecimal": {
+ "$gt": {
+ "$numberDecimal": "0"
+ }
+ }
+ }
+ },
+ "result": {
+ "deletedCount": 1
+ }
+ }
+ ],
+ "expectations": [
+ {
+ "command_started_event": {
+ "command": {
+ "listCollections": 1,
+ "filter": {
+ "name": "default"
+ }
+ },
+ "command_name": "listCollections"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "find": "datakeys",
+ "filter": {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ },
+ "$db": "keyvault",
+ "readConcern": {
+ "level": "majority"
+ }
+ },
+ "command_name": "find"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 0,
+ "encryptedDecimal": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDecimal",
+ "bsonType": "decimal",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 1,
+ "encryptedDecimal": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDecimal",
+ "bsonType": "decimal",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "delete": "default",
+ "deletes": [
+ {
+ "q": {
+ "encryptedDecimal": {
+ "$gt": {
+ "$binary": {
+ "base64": "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",
+ "subType": "06"
+ }
+ }
+ }
+ },
+ "limit": 1
+ }
+ ],
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDecimal",
+ "bsonType": "decimal",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ ]
+ }
+ },
+ "deleteTokens": {
+ "default.default": {
+ "encryptedDecimal": {
+ "e": {
+ "$binary": {
+ "base64": "65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+w=",
+ "subType": "00"
+ }
+ },
+ "o": {
+ "$binary": {
+ "base64": "noN+05JsuO1oDg59yypIGj45i+eFH6HOTXOPpeZ//Mk=",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "command_name": "delete"
+ }
+ }
+ ],
+ "outcome": {
+ "collection": {
+ "data": [
+ {
+ "_id": {
+ "$numberInt": "0"
+ },
+ "encryptedDecimal": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rbf3AeBEv4wWFAKknqDxRW5cLNkFvbIs6iJjc6LShQY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "n+XAuFnP8Dov9TnhGFxNx0K/MnVM9WbJ7RouEu0ndO0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yRXojuVdn5GQtD97qYlaCL6cOLmZ7Cvcb3wFjkLUIdM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "DuIkdRPITRs55I4SZmgomAHCIsDQmXRhW8+MOznkzSk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SsBk+Et1lTbU+QRPx+xyJ/jMkmfG+QCvQEpip2YYrzA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "crCIzOd8KhHvvUlX7M1v9bhvU4pLdTc+X2SuqoKU5Ek=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YOWdCw4UrqnxkAaVjqmC4sKQDMVMHEpFGnlxpxdaU6E=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "M3SShp81Ff8tQ632qKbv9MUcN6wjDaBReI0VXNu6Xh4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "gzHlSPxpM0hT75kQvWFzGlOxKvDoiKQZOr19V6l2zXI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "s3JnppOGYw9SL2Q1kMAZs948v2F5PrpXjGei/HioDWs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cG6+3Gk/zEH68P/uuuwiAUVCuyJwa1LeV+t29FlPPAo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dupdvR3AyJtM+g9NDKiaLVOtGca387JQp8w+V03m7Ig=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JqEQc5svj2jTvZ6LLA5ivE+kTb/0aRemSEmxk4G7Zrg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "szcXXXKnob+p3SoM4yED2R920LeJ7cVsclPMFTe4CeI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "o1QoGVXmuBdHwHm7aCtGMlMVKrjFdYvJXpoq6uhIAZ0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Jfm5wPlqqLCJRGQIqRq2NGmpn7s0Vrih2H3YAOoI2YU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zMHLb8ARbsYo8Ld05bqnGFf1Usha6EGb8QKwdSAyps0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yQdtq9lh5pugL7/i0Bj/PuZUUBUIzf+7wj1rl5y736w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wGWVZdO7qIuyDg/BqDgqjgoQ02h5YYgwXQB1oCin2NE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "by9HMLj6NTEpgztZ5HSN6GxImkXPcaFINYDzgZY33X8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tWo0vbasi7bXmn/MsOx13VC1IsWtpx/nYp0uj4iMzdA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tQQpndUYd5O87lOtrGjH3wl9VsOK0ray7RMasL90sBM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cQjXEDCMsOpKLLf+vlTgIHA+cbSJdzqhbSX9Wvh95aA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "7yMpU48IxK9SzP2cx3VnTownGEwFmeFofuuFT97SuuY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kSOx1kz0CmBgzKQHZlo65ZUY1DIv9A99JRm+Us2y6Ew=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ubQpdPBe6/xvtr+AcXdfYLSvYCR4ot0tivehkCsupb4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xal+iCJ6FTefRQToyoNksc9NCZShyn04NDGi4IYrcoM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "d7jU4iOK50xHxlkSifcxlZFCM46TSgQzoYivxG3HNLY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tJvl2nsBLBVzL3pp6sKWCL4UXeh3q/roYBJjSb74ve0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "OIUCaKRvIx9t1w6Hxlz1IcQTdPNCfdRNwnnTm10W+X0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "A9tvzsiElotOUVIB4CqfQp9mAwqvTM35YkmAR170aHA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lI8gpK7hpb7c9x4RQugsxMnQay5LZJmwslZdvMx/dcE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dNCzh40U0XvdKnSDi3HRQOWQftEsDVqc4uUvsVFGoq8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "IP+iwEBWBwVVZIdpaMu8k5+soFCz+TZkYn3drKZ9grE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pnqyh6e0y5svHkJDShlN9CHV0WvMBE4QbtJpQw5ZCXc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "elEl42tbVDoRTLjAhZUFEtXiut4b3PVhg/1ZLZSQdtE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "vHuu2FxwclMHqyE6JBYbTYgbEkB0dqb/JuaxsvfwsmY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xTf7NCe3Gf8QpE78HR5OknlLTKfs9J+RN9UZpH6fnso=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "XiWSasRnJAulGR6+LCVD3mwRObXylqYWR9jvpywq12c=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "MZMxEQ5ikx0PG1YFIExv0UnTZogsvgeOEZTpzvBDn4w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yZMyMZBDrWbAhvnic7vvIYhmO9m5H2iuv0c8KNZrBzY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xxM14hTPY5j0vvcK2C7YAEjzdsfUTFHozHC0hEo1bxI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+01rqR1xVwkpGXcstbk1ItJqFVjH6Q8MGxEN3Cm9Y1A=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xOpLV0Z2VTRJ3iWtnWZcsyjXubTIkYWo31cO+HV1o1k=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "BWUOLqgLBqc5NwxVlSV5H3KFQPXbCp7mdo+jF+8cJqY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "fuQb1S6xZDGlrEbK+kI23aL53PP1PVNwqICnZNt9Yzg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SfscnoibFttahLdPVC4Ee+47ewGFKpDSU7M6HX19bKE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rpSW2awybNVeKtat91VFxqbINoTfNhPfQAu+d73Xtf8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "9M/CP9ccOIIj2LLFmE0GFDO0Ban2wsNalEXfM6+h+1s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "WrEMG49l1ye4MhXs5ZS9tz8P6h+hDvthIg/2wW9ne1Q=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ImNhbfeyfH8qIEeA5ic0s3dAQBdzzTBS+CPsNih9vZ0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dWP33YDSn04UKJN2ogh2Rui0iW/0q2y18OCDRVcfyoo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lYv0isAtfGh6H9tdp3cp2eHU7q2J+uk7QrgcxtK3w7Y=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "VGMoamB/+7zTOYcY/pqJc96xlv2PdW4hwsIAEIslTDQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yNeBWMF7BnD9wVwz2PgJsvWr77QiVvvWUvJF0+fqBug=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SfpvObJ+tJBXSvqeN7vlOfmhYign635lciYAJIjUtY8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dsen4NqjzVGjpjufiTMs3+gqeD09EbnuogPgxrJECwg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pxCWVM3sn19NsFEpgHbgLa+PmYlhN3mMiP0Wk8kJhYw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q11KNvJszjYIB9n9HcC+N4uz11a3eRj1L3BH9scKMDQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "A1PmkgcEToWh1JiVWE6mI5jUu7poxWWuCUt/cgRUUDc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "qJo3Hu4PJeanL7XEaWXO/n3YsodhZyd+MJOOmB9Kpd8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "BkBKLO8URFscfRY9Bav/1+L9mLohDgNr/MkZtGiraIs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rZq5WA3Hx3xthOyHAJXK//f8pE2qbz7YKu3TIMp9GFY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "X07a/Lm80p5xd4RFs1dNmw+90tmPDPdGiAKVZkxd4zY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6YrBn2ofIw1b5ooakrLOwF41BWrps8OO0H9WH4/rtlE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "0l86Ag5OszXpa78SlOUV3K9nff5iC1p0mRXtLg9M1s4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Hn6yuxFHodeyu7ISlhYrbSf9pTiH4TDEvbYLWjTwFO0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zdf4y2etKBuIpkEU1zMwoCkCsdisfXZCh8QPamm+drY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rOQ9oMdiK5xxGH+jPzOvwVqdGGnF3+HkJXxn81s6hp4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "61aKKsE3+BJHHWYvs3xSIBvlRmKswmaOo5rygQJguUg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "KuDb/GIzqDM8wv7m7m8AECiWJbae5EKKtJRugZx7kR0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Q+t8t2TmNUiCIorVr9F3AlVnX+Mpt2ZYvN+s8UGict8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tJRZIpKxUgHyL83kW8cvfjkxN3z6WoNnUg+SQw+LK+k=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pnUsYjip8SvW0+m9mR5WWTkpK+p6uwJ6yBUAlBnFKMk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "PArHlz+yPRYDycAP/PgnI/AkP8Wgmfg++Vf4UG1Bf0E=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wnIh53Q3jeK8jEBe1n8kJLa89/H0BxO26ZU8SRIAs9Q=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "4F8U59gzBLGhq58PEWQk2nch+R0Va7eTUoxMneReUIA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ihKagIW3uT1dm22ROr/g5QaCpxZVj2+Fs/YSdM2Noco=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "EJtUOOwjkrPUi9mavYAi+Gom9Y2DuFll7aDwo4mq0M0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dIkr8dbaVRQFskAVT6B286BbcBBt1pZPEOcTZqk4ZcI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "aYVAcZYkH/Tieoa1XOjE/zCy5AJcVTHjS0NG2QB7muA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "sBidL6y8TenseetpioIAAtn0lK/7C8MoW4JXpVYi3z8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "0Dd2klU/t4R86c2WJcJDAd57k/N7OjvYSO5Vf8KH8sw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "I3jZ92WEVmZmgaIkLbuWhBxl7EM6bEjiEttgBJunArA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "aGHoQMlgJoGvArjfIbc3nnkoc8SWBxcrN7hSmjMRzos=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "bpiWPnF/KVBQr5F6MEwc5ZZayzIRvQOLDAm4ntwOi8g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tI7QVKbE6avWgDD9h4QKyFlnTxFCwd2iLySKakxNR/I=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "XGsge0CnoaXgE3rcpKm8AEeku5QVfokS3kcI+JKV1lk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JQxlryW2Q5WOwfrjAnaZxDvC83Dg6sjRVP5zegf2WiM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YFuHKJOfoqp1iGVxoFjx7bLYgVdsN4GuUFxEgO9HJ5s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Z6vUdiCR18ylKomf08uxcQHeRtmyav7/Ecvzz4av3k4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SPGo1Ib5AiP/tSllL7Z5PAypvnKdwJLzt8imfIMSEJQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "m94Nh6PFFQFLIib9Cu5LAKavhXnagSHG6F5EF8lD96I=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pfEkQI98mB+gm1+JbmVurPAODMFPJ4E8DnqfVyUWbSo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "DNj3OVRLbr43s0vd+rgWghOL3FqeO/60npdojC8Ry/M=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kAYIQrjHVu49W8FTxyxJeiLVRWWjC9fPcBn+Hx1F+Ss=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "aCSO7UVOpoQvu/iridarxkxV1SVxU1i9HVSYXUAeXk4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Gh6hTP/yj1IKlXQ+Q69KTfMlGZjEcXoRLGbQHNFo/1s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "/gDgIFQ4tAlJk3GN48IS5Qa5IPmErwGk8CHxAbp6gs0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "PICyimwPjxpusyKxNssOOwUotAUbygpyEtORsVGXT8g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "4lu+cBHyAUvuxC6JUNyHLzHsCogGSWFFnUCkDwfQdgI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pSndkmoNUJwXjgkbkgOrT5f9nSvuoMEZOkwAN9ElRaE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tyW+D4i26QihNM5MuBM+wnt5AdWGSJaJ4X5ydc9iWTU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "9Syjr8RoxUgPKr+O5rsCu07AvcebA4P8IVKyS1NVLWc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "67tPfDYnK2tmrioI51fOBG0ygajcV0pLo5+Zm/rEW7U=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "y0EiPRxYTuS1eVTIaPQUQBBxwkyxNckbePvKgChwd0M=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "NWd+2veAaeXQgR3vCvzlI4R1WW67D5YsVLdoXfdb8qg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "PY5RQqKQsL2GqBBSPNOEVpojNFRX/NijCghIpxD6CZk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lcvwTyEjFlssCJtdjRpdN6oY+C7bxZY+WA+QAqzj9zg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CWE7XRNylvTwO/9Fv56dNqUaQWMmESNS/GNIwgBaEI0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ijwlrUeS8nRYqK1F8kiCYF0mNDolEZS+/lJO1Lg93C8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "8KzV+qYGYuIjoNj8eEpnTuHrMYuhzphl80rS6wrODuU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wDyTLjSEFF895hSQsHvmoEQVS6KIkZOtq1c9dVogm9I=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SGrtPuMYCjUrfKF0Pq/thdaQzmGBMUvlwN3ORIu9tHU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "KySHON3hIoUk4xWcwTqk6IL0kgjzjxgMBObVIkCGvk4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hBIdS9j0XJPeT4ot73ngELkpUoSixvRBvdOL9z48jY8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Tx6um0q9HjS5ZvlFhvukpI6ORnyrXMWVW1OoxvgqII0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zFKlyfX5H81+d4A4J3FKn4T5JfG+OWtR06ddyX4Mxas=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cGgCDuPV7MeMMYEDpgOupqyNP4BQ4H7rBnd2QygumgM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "IPaUoy98v11EoglTpJ4kBlEawoZ8y7BPwzjLYBpkvHQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Pfo4Am6tOWAyZNn8G9W5HWWGC3ZWmX0igI/RRB870Ro=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "fnTSjd7bC1Udoq6iM7UDnHAC/lsIXSHp/Gy332qw+/I=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "fApBgVRrTDyEumkeWs5p3ag9KB48SbU4Si0dl7Ns9rc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "QxudfBItgoCnUj5NXVnSmWH3HK76YtKkMmzn4lyyUYY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "sSOvwhKa29Wq94bZ5jGIiJQGbG1uBrKSBfOYBz/oZeI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FdaMgwwJ0NKsqmPZLC5oE+/0D74Dfpvig3LaI5yW5Fs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "sRWBy12IERN43BSZIrnBfC9+zFBUdvjTlkqIH81NGt4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "/4tIRpxKhoOwnXAiFn1Z7Xmric4USOIfKvTYQXk3QTc=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ ]
+}
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-Decimal-Delete.yml b/specifications/client-side-encryption/tests/legacy/fle2-Range-Decimal-Delete.yml
new file mode 100644
index 00000000000..fa2daa78e61
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-Decimal-Delete.yml
@@ -0,0 +1,908 @@
+# Requires libmongocrypt 1.7.0.
+runOn:
+ - minServerVersion: "6.2.0"
+ # FLE 2 Encrypted collections are not supported on standalone.
+ # Tests for Decimal (without precision) must only run against a replica set. Decimal (without precision) queries are expected to take a long time and may exceed the default mongos timeout.
+ topology: [ "replicaset" ]
+database_name: &database_name "default"
+collection_name: &collection_name "default"
+data: []
+encrypted_fields: &encrypted_fields {'escCollection': 'enxcol_.default.esc', 'eccCollection': 'enxcol_.default.ecc', 'ecocCollection': 'enxcol_.default.ecoc', 'fields': [{'keyId': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'path': 'encryptedDecimal', 'bsonType': 'decimal', 'queries': {'queryType': 'rangePreview', 'contention': {'$numberLong': '0'}, 'sparsity': {'$numberLong': '1'}}}]}
+key_vault_data: [ {'_id': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'keyMaterial': {'$binary': {'base64': 'sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==', 'subType': '00'}}, 'creationDate': {'$date': {'$numberLong': '1648914851981'}}, 'updateDate': {'$date': {'$numberLong': '1648914851981'}}, 'status': {'$numberInt': '0'}, 'masterKey': {'provider': 'local'}} ]
+tests:
+ - description: "FLE2 Range Decimal. Delete."
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments:
+ document: &doc0 { _id: 0, encryptedDecimal: { $numberDecimal: "0" } }
+ - name: insertOne
+ arguments:
+ document: &doc1 { _id: 1, encryptedDecimal: { $numberDecimal: "1" } }
+ - name: deleteOne
+ arguments:
+ filter: { "encryptedDecimal": { $gt: {$numberDecimal: "0" }} }
+ result:
+ deletedCount: 1
+ expectations:
+ - command_started_event:
+ command:
+ listCollections: 1
+ filter:
+ name: *collection_name
+ command_name: listCollections
+ - command_started_event:
+ command:
+ find: datakeys
+ filter: {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ }
+ $db: keyvault
+ readConcern: { level: "majority" }
+ command_name: find
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc0_encrypted { "_id": 0, "encryptedDecimal": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc1_encrypted { "_id": 1, "encryptedDecimal": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ delete: *collection_name
+ deletes: [
+ {
+ "q": {
+ "encryptedDecimal": {
+ "$gt": {
+ "$binary": {
+ "base64": "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",
+ "subType": "06"
+ }
+ }
+ }
+ },
+ "limit": 1
+ }
+ ]
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ "deleteTokens": {
+ "default.default": {
+ "encryptedDecimal": {
+ "e": {
+ "$binary": {
+ "base64": "65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+w=",
+ "subType": "00"
+ }
+ },
+ "o": {
+ "$binary": {
+ "base64": "noN+05JsuO1oDg59yypIGj45i+eFH6HOTXOPpeZ//Mk=",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ command_name: delete
+ outcome:
+ collection:
+ # Outcome is checked using a separate MongoClient without auto encryption.
+ data:
+ -
+ {
+ "_id": {
+ "$numberInt": "0"
+ },
+ "encryptedDecimal": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rbf3AeBEv4wWFAKknqDxRW5cLNkFvbIs6iJjc6LShQY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "n+XAuFnP8Dov9TnhGFxNx0K/MnVM9WbJ7RouEu0ndO0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yRXojuVdn5GQtD97qYlaCL6cOLmZ7Cvcb3wFjkLUIdM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "DuIkdRPITRs55I4SZmgomAHCIsDQmXRhW8+MOznkzSk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SsBk+Et1lTbU+QRPx+xyJ/jMkmfG+QCvQEpip2YYrzA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "crCIzOd8KhHvvUlX7M1v9bhvU4pLdTc+X2SuqoKU5Ek=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YOWdCw4UrqnxkAaVjqmC4sKQDMVMHEpFGnlxpxdaU6E=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "M3SShp81Ff8tQ632qKbv9MUcN6wjDaBReI0VXNu6Xh4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "gzHlSPxpM0hT75kQvWFzGlOxKvDoiKQZOr19V6l2zXI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "s3JnppOGYw9SL2Q1kMAZs948v2F5PrpXjGei/HioDWs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cG6+3Gk/zEH68P/uuuwiAUVCuyJwa1LeV+t29FlPPAo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dupdvR3AyJtM+g9NDKiaLVOtGca387JQp8w+V03m7Ig=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JqEQc5svj2jTvZ6LLA5ivE+kTb/0aRemSEmxk4G7Zrg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "szcXXXKnob+p3SoM4yED2R920LeJ7cVsclPMFTe4CeI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "o1QoGVXmuBdHwHm7aCtGMlMVKrjFdYvJXpoq6uhIAZ0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Jfm5wPlqqLCJRGQIqRq2NGmpn7s0Vrih2H3YAOoI2YU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zMHLb8ARbsYo8Ld05bqnGFf1Usha6EGb8QKwdSAyps0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yQdtq9lh5pugL7/i0Bj/PuZUUBUIzf+7wj1rl5y736w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wGWVZdO7qIuyDg/BqDgqjgoQ02h5YYgwXQB1oCin2NE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "by9HMLj6NTEpgztZ5HSN6GxImkXPcaFINYDzgZY33X8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tWo0vbasi7bXmn/MsOx13VC1IsWtpx/nYp0uj4iMzdA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tQQpndUYd5O87lOtrGjH3wl9VsOK0ray7RMasL90sBM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cQjXEDCMsOpKLLf+vlTgIHA+cbSJdzqhbSX9Wvh95aA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "7yMpU48IxK9SzP2cx3VnTownGEwFmeFofuuFT97SuuY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kSOx1kz0CmBgzKQHZlo65ZUY1DIv9A99JRm+Us2y6Ew=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ubQpdPBe6/xvtr+AcXdfYLSvYCR4ot0tivehkCsupb4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xal+iCJ6FTefRQToyoNksc9NCZShyn04NDGi4IYrcoM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "d7jU4iOK50xHxlkSifcxlZFCM46TSgQzoYivxG3HNLY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tJvl2nsBLBVzL3pp6sKWCL4UXeh3q/roYBJjSb74ve0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "OIUCaKRvIx9t1w6Hxlz1IcQTdPNCfdRNwnnTm10W+X0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "A9tvzsiElotOUVIB4CqfQp9mAwqvTM35YkmAR170aHA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lI8gpK7hpb7c9x4RQugsxMnQay5LZJmwslZdvMx/dcE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dNCzh40U0XvdKnSDi3HRQOWQftEsDVqc4uUvsVFGoq8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "IP+iwEBWBwVVZIdpaMu8k5+soFCz+TZkYn3drKZ9grE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pnqyh6e0y5svHkJDShlN9CHV0WvMBE4QbtJpQw5ZCXc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "elEl42tbVDoRTLjAhZUFEtXiut4b3PVhg/1ZLZSQdtE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "vHuu2FxwclMHqyE6JBYbTYgbEkB0dqb/JuaxsvfwsmY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xTf7NCe3Gf8QpE78HR5OknlLTKfs9J+RN9UZpH6fnso=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "XiWSasRnJAulGR6+LCVD3mwRObXylqYWR9jvpywq12c=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "MZMxEQ5ikx0PG1YFIExv0UnTZogsvgeOEZTpzvBDn4w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yZMyMZBDrWbAhvnic7vvIYhmO9m5H2iuv0c8KNZrBzY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xxM14hTPY5j0vvcK2C7YAEjzdsfUTFHozHC0hEo1bxI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+01rqR1xVwkpGXcstbk1ItJqFVjH6Q8MGxEN3Cm9Y1A=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xOpLV0Z2VTRJ3iWtnWZcsyjXubTIkYWo31cO+HV1o1k=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "BWUOLqgLBqc5NwxVlSV5H3KFQPXbCp7mdo+jF+8cJqY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "fuQb1S6xZDGlrEbK+kI23aL53PP1PVNwqICnZNt9Yzg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SfscnoibFttahLdPVC4Ee+47ewGFKpDSU7M6HX19bKE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rpSW2awybNVeKtat91VFxqbINoTfNhPfQAu+d73Xtf8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "9M/CP9ccOIIj2LLFmE0GFDO0Ban2wsNalEXfM6+h+1s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "WrEMG49l1ye4MhXs5ZS9tz8P6h+hDvthIg/2wW9ne1Q=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ImNhbfeyfH8qIEeA5ic0s3dAQBdzzTBS+CPsNih9vZ0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dWP33YDSn04UKJN2ogh2Rui0iW/0q2y18OCDRVcfyoo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lYv0isAtfGh6H9tdp3cp2eHU7q2J+uk7QrgcxtK3w7Y=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "VGMoamB/+7zTOYcY/pqJc96xlv2PdW4hwsIAEIslTDQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yNeBWMF7BnD9wVwz2PgJsvWr77QiVvvWUvJF0+fqBug=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SfpvObJ+tJBXSvqeN7vlOfmhYign635lciYAJIjUtY8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dsen4NqjzVGjpjufiTMs3+gqeD09EbnuogPgxrJECwg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pxCWVM3sn19NsFEpgHbgLa+PmYlhN3mMiP0Wk8kJhYw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q11KNvJszjYIB9n9HcC+N4uz11a3eRj1L3BH9scKMDQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "A1PmkgcEToWh1JiVWE6mI5jUu7poxWWuCUt/cgRUUDc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "qJo3Hu4PJeanL7XEaWXO/n3YsodhZyd+MJOOmB9Kpd8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "BkBKLO8URFscfRY9Bav/1+L9mLohDgNr/MkZtGiraIs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rZq5WA3Hx3xthOyHAJXK//f8pE2qbz7YKu3TIMp9GFY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "X07a/Lm80p5xd4RFs1dNmw+90tmPDPdGiAKVZkxd4zY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6YrBn2ofIw1b5ooakrLOwF41BWrps8OO0H9WH4/rtlE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "0l86Ag5OszXpa78SlOUV3K9nff5iC1p0mRXtLg9M1s4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Hn6yuxFHodeyu7ISlhYrbSf9pTiH4TDEvbYLWjTwFO0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zdf4y2etKBuIpkEU1zMwoCkCsdisfXZCh8QPamm+drY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rOQ9oMdiK5xxGH+jPzOvwVqdGGnF3+HkJXxn81s6hp4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "61aKKsE3+BJHHWYvs3xSIBvlRmKswmaOo5rygQJguUg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "KuDb/GIzqDM8wv7m7m8AECiWJbae5EKKtJRugZx7kR0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Q+t8t2TmNUiCIorVr9F3AlVnX+Mpt2ZYvN+s8UGict8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tJRZIpKxUgHyL83kW8cvfjkxN3z6WoNnUg+SQw+LK+k=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pnUsYjip8SvW0+m9mR5WWTkpK+p6uwJ6yBUAlBnFKMk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "PArHlz+yPRYDycAP/PgnI/AkP8Wgmfg++Vf4UG1Bf0E=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wnIh53Q3jeK8jEBe1n8kJLa89/H0BxO26ZU8SRIAs9Q=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "4F8U59gzBLGhq58PEWQk2nch+R0Va7eTUoxMneReUIA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ihKagIW3uT1dm22ROr/g5QaCpxZVj2+Fs/YSdM2Noco=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "EJtUOOwjkrPUi9mavYAi+Gom9Y2DuFll7aDwo4mq0M0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dIkr8dbaVRQFskAVT6B286BbcBBt1pZPEOcTZqk4ZcI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "aYVAcZYkH/Tieoa1XOjE/zCy5AJcVTHjS0NG2QB7muA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "sBidL6y8TenseetpioIAAtn0lK/7C8MoW4JXpVYi3z8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "0Dd2klU/t4R86c2WJcJDAd57k/N7OjvYSO5Vf8KH8sw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "I3jZ92WEVmZmgaIkLbuWhBxl7EM6bEjiEttgBJunArA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "aGHoQMlgJoGvArjfIbc3nnkoc8SWBxcrN7hSmjMRzos=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "bpiWPnF/KVBQr5F6MEwc5ZZayzIRvQOLDAm4ntwOi8g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tI7QVKbE6avWgDD9h4QKyFlnTxFCwd2iLySKakxNR/I=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "XGsge0CnoaXgE3rcpKm8AEeku5QVfokS3kcI+JKV1lk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JQxlryW2Q5WOwfrjAnaZxDvC83Dg6sjRVP5zegf2WiM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YFuHKJOfoqp1iGVxoFjx7bLYgVdsN4GuUFxEgO9HJ5s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Z6vUdiCR18ylKomf08uxcQHeRtmyav7/Ecvzz4av3k4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SPGo1Ib5AiP/tSllL7Z5PAypvnKdwJLzt8imfIMSEJQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "m94Nh6PFFQFLIib9Cu5LAKavhXnagSHG6F5EF8lD96I=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pfEkQI98mB+gm1+JbmVurPAODMFPJ4E8DnqfVyUWbSo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "DNj3OVRLbr43s0vd+rgWghOL3FqeO/60npdojC8Ry/M=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kAYIQrjHVu49W8FTxyxJeiLVRWWjC9fPcBn+Hx1F+Ss=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "aCSO7UVOpoQvu/iridarxkxV1SVxU1i9HVSYXUAeXk4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Gh6hTP/yj1IKlXQ+Q69KTfMlGZjEcXoRLGbQHNFo/1s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "/gDgIFQ4tAlJk3GN48IS5Qa5IPmErwGk8CHxAbp6gs0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "PICyimwPjxpusyKxNssOOwUotAUbygpyEtORsVGXT8g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "4lu+cBHyAUvuxC6JUNyHLzHsCogGSWFFnUCkDwfQdgI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pSndkmoNUJwXjgkbkgOrT5f9nSvuoMEZOkwAN9ElRaE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tyW+D4i26QihNM5MuBM+wnt5AdWGSJaJ4X5ydc9iWTU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "9Syjr8RoxUgPKr+O5rsCu07AvcebA4P8IVKyS1NVLWc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "67tPfDYnK2tmrioI51fOBG0ygajcV0pLo5+Zm/rEW7U=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "y0EiPRxYTuS1eVTIaPQUQBBxwkyxNckbePvKgChwd0M=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "NWd+2veAaeXQgR3vCvzlI4R1WW67D5YsVLdoXfdb8qg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "PY5RQqKQsL2GqBBSPNOEVpojNFRX/NijCghIpxD6CZk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lcvwTyEjFlssCJtdjRpdN6oY+C7bxZY+WA+QAqzj9zg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CWE7XRNylvTwO/9Fv56dNqUaQWMmESNS/GNIwgBaEI0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ijwlrUeS8nRYqK1F8kiCYF0mNDolEZS+/lJO1Lg93C8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "8KzV+qYGYuIjoNj8eEpnTuHrMYuhzphl80rS6wrODuU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wDyTLjSEFF895hSQsHvmoEQVS6KIkZOtq1c9dVogm9I=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SGrtPuMYCjUrfKF0Pq/thdaQzmGBMUvlwN3ORIu9tHU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "KySHON3hIoUk4xWcwTqk6IL0kgjzjxgMBObVIkCGvk4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hBIdS9j0XJPeT4ot73ngELkpUoSixvRBvdOL9z48jY8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Tx6um0q9HjS5ZvlFhvukpI6ORnyrXMWVW1OoxvgqII0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zFKlyfX5H81+d4A4J3FKn4T5JfG+OWtR06ddyX4Mxas=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cGgCDuPV7MeMMYEDpgOupqyNP4BQ4H7rBnd2QygumgM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "IPaUoy98v11EoglTpJ4kBlEawoZ8y7BPwzjLYBpkvHQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Pfo4Am6tOWAyZNn8G9W5HWWGC3ZWmX0igI/RRB870Ro=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "fnTSjd7bC1Udoq6iM7UDnHAC/lsIXSHp/Gy332qw+/I=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "fApBgVRrTDyEumkeWs5p3ag9KB48SbU4Si0dl7Ns9rc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "QxudfBItgoCnUj5NXVnSmWH3HK76YtKkMmzn4lyyUYY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "sSOvwhKa29Wq94bZ5jGIiJQGbG1uBrKSBfOYBz/oZeI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FdaMgwwJ0NKsqmPZLC5oE+/0D74Dfpvig3LaI5yW5Fs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "sRWBy12IERN43BSZIrnBfC9+zFBUdvjTlkqIH81NGt4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "/4tIRpxKhoOwnXAiFn1Z7Xmric4USOIfKvTYQXk3QTc=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
\ No newline at end of file
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-Decimal-FindOneAndUpdate.json b/specifications/client-side-encryption/tests/legacy/fle2-Range-Decimal-FindOneAndUpdate.json
new file mode 100644
index 00000000000..d0e29677714
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-Decimal-FindOneAndUpdate.json
@@ -0,0 +1,1930 @@
+{
+ "runOn": [
+ {
+ "minServerVersion": "6.2.0",
+ "topology": [
+ "replicaset"
+ ]
+ }
+ ],
+ "database_name": "default",
+ "collection_name": "default",
+ "data": [],
+ "encrypted_fields": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDecimal",
+ "bsonType": "decimal",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ ]
+ },
+ "key_vault_data": [
+ {
+ "_id": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "keyMaterial": {
+ "$binary": {
+ "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==",
+ "subType": "00"
+ }
+ },
+ "creationDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "updateDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "status": {
+ "$numberInt": "0"
+ },
+ "masterKey": {
+ "provider": "local"
+ }
+ }
+ ],
+ "tests": [
+ {
+ "description": "FLE2 Range Decimal. FindOneAndUpdate.",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDecimal": {
+ "$numberDecimal": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDecimal": {
+ "$numberDecimal": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "findOneAndUpdate",
+ "arguments": {
+ "filter": {
+ "encryptedDecimal": {
+ "$gt": {
+ "$numberDecimal": "0"
+ }
+ }
+ },
+ "update": {
+ "$set": {
+ "encryptedDecimal": {
+ "$numberDecimal": "2"
+ }
+ }
+ },
+ "returnDocument": "Before"
+ },
+ "result": {
+ "_id": 1,
+ "encryptedDecimal": {
+ "$numberDecimal": "1"
+ }
+ }
+ }
+ ],
+ "expectations": [
+ {
+ "command_started_event": {
+ "command": {
+ "listCollections": 1,
+ "filter": {
+ "name": "default"
+ }
+ },
+ "command_name": "listCollections"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "find": "datakeys",
+ "filter": {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ },
+ "$db": "keyvault",
+ "readConcern": {
+ "level": "majority"
+ }
+ },
+ "command_name": "find"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 0,
+ "encryptedDecimal": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDecimal",
+ "bsonType": "decimal",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 1,
+ "encryptedDecimal": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDecimal",
+ "bsonType": "decimal",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "findAndModify": "default",
+ "query": {
+ "encryptedDecimal": {
+ "$gt": {
+ "$binary": {
+ "base64": "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",
+ "subType": "06"
+ }
+ }
+ }
+ },
+ "update": {
+ "$set": {
+ "encryptedDecimal": {
+ "$$type": "binData"
+ }
+ }
+ },
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDecimal",
+ "bsonType": "decimal",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ ]
+ }
+ },
+ "deleteTokens": {
+ "default.default": {
+ "encryptedDecimal": {
+ "e": {
+ "$binary": {
+ "base64": "65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+w=",
+ "subType": "00"
+ }
+ },
+ "o": {
+ "$binary": {
+ "base64": "noN+05JsuO1oDg59yypIGj45i+eFH6HOTXOPpeZ//Mk=",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "command_name": "findAndModify"
+ }
+ }
+ ],
+ "outcome": {
+ "collection": {
+ "data": [
+ {
+ "_id": {
+ "$numberInt": "0"
+ },
+ "encryptedDecimal": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rbf3AeBEv4wWFAKknqDxRW5cLNkFvbIs6iJjc6LShQY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "n+XAuFnP8Dov9TnhGFxNx0K/MnVM9WbJ7RouEu0ndO0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yRXojuVdn5GQtD97qYlaCL6cOLmZ7Cvcb3wFjkLUIdM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "DuIkdRPITRs55I4SZmgomAHCIsDQmXRhW8+MOznkzSk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SsBk+Et1lTbU+QRPx+xyJ/jMkmfG+QCvQEpip2YYrzA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "crCIzOd8KhHvvUlX7M1v9bhvU4pLdTc+X2SuqoKU5Ek=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YOWdCw4UrqnxkAaVjqmC4sKQDMVMHEpFGnlxpxdaU6E=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "M3SShp81Ff8tQ632qKbv9MUcN6wjDaBReI0VXNu6Xh4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "gzHlSPxpM0hT75kQvWFzGlOxKvDoiKQZOr19V6l2zXI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "s3JnppOGYw9SL2Q1kMAZs948v2F5PrpXjGei/HioDWs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cG6+3Gk/zEH68P/uuuwiAUVCuyJwa1LeV+t29FlPPAo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dupdvR3AyJtM+g9NDKiaLVOtGca387JQp8w+V03m7Ig=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JqEQc5svj2jTvZ6LLA5ivE+kTb/0aRemSEmxk4G7Zrg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "szcXXXKnob+p3SoM4yED2R920LeJ7cVsclPMFTe4CeI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "o1QoGVXmuBdHwHm7aCtGMlMVKrjFdYvJXpoq6uhIAZ0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Jfm5wPlqqLCJRGQIqRq2NGmpn7s0Vrih2H3YAOoI2YU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zMHLb8ARbsYo8Ld05bqnGFf1Usha6EGb8QKwdSAyps0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yQdtq9lh5pugL7/i0Bj/PuZUUBUIzf+7wj1rl5y736w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wGWVZdO7qIuyDg/BqDgqjgoQ02h5YYgwXQB1oCin2NE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "by9HMLj6NTEpgztZ5HSN6GxImkXPcaFINYDzgZY33X8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tWo0vbasi7bXmn/MsOx13VC1IsWtpx/nYp0uj4iMzdA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tQQpndUYd5O87lOtrGjH3wl9VsOK0ray7RMasL90sBM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cQjXEDCMsOpKLLf+vlTgIHA+cbSJdzqhbSX9Wvh95aA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "7yMpU48IxK9SzP2cx3VnTownGEwFmeFofuuFT97SuuY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kSOx1kz0CmBgzKQHZlo65ZUY1DIv9A99JRm+Us2y6Ew=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ubQpdPBe6/xvtr+AcXdfYLSvYCR4ot0tivehkCsupb4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xal+iCJ6FTefRQToyoNksc9NCZShyn04NDGi4IYrcoM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "d7jU4iOK50xHxlkSifcxlZFCM46TSgQzoYivxG3HNLY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tJvl2nsBLBVzL3pp6sKWCL4UXeh3q/roYBJjSb74ve0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "OIUCaKRvIx9t1w6Hxlz1IcQTdPNCfdRNwnnTm10W+X0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "A9tvzsiElotOUVIB4CqfQp9mAwqvTM35YkmAR170aHA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lI8gpK7hpb7c9x4RQugsxMnQay5LZJmwslZdvMx/dcE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dNCzh40U0XvdKnSDi3HRQOWQftEsDVqc4uUvsVFGoq8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "IP+iwEBWBwVVZIdpaMu8k5+soFCz+TZkYn3drKZ9grE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pnqyh6e0y5svHkJDShlN9CHV0WvMBE4QbtJpQw5ZCXc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "elEl42tbVDoRTLjAhZUFEtXiut4b3PVhg/1ZLZSQdtE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "vHuu2FxwclMHqyE6JBYbTYgbEkB0dqb/JuaxsvfwsmY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xTf7NCe3Gf8QpE78HR5OknlLTKfs9J+RN9UZpH6fnso=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "XiWSasRnJAulGR6+LCVD3mwRObXylqYWR9jvpywq12c=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "MZMxEQ5ikx0PG1YFIExv0UnTZogsvgeOEZTpzvBDn4w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yZMyMZBDrWbAhvnic7vvIYhmO9m5H2iuv0c8KNZrBzY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xxM14hTPY5j0vvcK2C7YAEjzdsfUTFHozHC0hEo1bxI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+01rqR1xVwkpGXcstbk1ItJqFVjH6Q8MGxEN3Cm9Y1A=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xOpLV0Z2VTRJ3iWtnWZcsyjXubTIkYWo31cO+HV1o1k=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "BWUOLqgLBqc5NwxVlSV5H3KFQPXbCp7mdo+jF+8cJqY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "fuQb1S6xZDGlrEbK+kI23aL53PP1PVNwqICnZNt9Yzg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SfscnoibFttahLdPVC4Ee+47ewGFKpDSU7M6HX19bKE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rpSW2awybNVeKtat91VFxqbINoTfNhPfQAu+d73Xtf8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "9M/CP9ccOIIj2LLFmE0GFDO0Ban2wsNalEXfM6+h+1s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "WrEMG49l1ye4MhXs5ZS9tz8P6h+hDvthIg/2wW9ne1Q=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ImNhbfeyfH8qIEeA5ic0s3dAQBdzzTBS+CPsNih9vZ0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dWP33YDSn04UKJN2ogh2Rui0iW/0q2y18OCDRVcfyoo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lYv0isAtfGh6H9tdp3cp2eHU7q2J+uk7QrgcxtK3w7Y=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "VGMoamB/+7zTOYcY/pqJc96xlv2PdW4hwsIAEIslTDQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yNeBWMF7BnD9wVwz2PgJsvWr77QiVvvWUvJF0+fqBug=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SfpvObJ+tJBXSvqeN7vlOfmhYign635lciYAJIjUtY8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dsen4NqjzVGjpjufiTMs3+gqeD09EbnuogPgxrJECwg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pxCWVM3sn19NsFEpgHbgLa+PmYlhN3mMiP0Wk8kJhYw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q11KNvJszjYIB9n9HcC+N4uz11a3eRj1L3BH9scKMDQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "A1PmkgcEToWh1JiVWE6mI5jUu7poxWWuCUt/cgRUUDc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "qJo3Hu4PJeanL7XEaWXO/n3YsodhZyd+MJOOmB9Kpd8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "BkBKLO8URFscfRY9Bav/1+L9mLohDgNr/MkZtGiraIs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rZq5WA3Hx3xthOyHAJXK//f8pE2qbz7YKu3TIMp9GFY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "X07a/Lm80p5xd4RFs1dNmw+90tmPDPdGiAKVZkxd4zY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6YrBn2ofIw1b5ooakrLOwF41BWrps8OO0H9WH4/rtlE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "0l86Ag5OszXpa78SlOUV3K9nff5iC1p0mRXtLg9M1s4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Hn6yuxFHodeyu7ISlhYrbSf9pTiH4TDEvbYLWjTwFO0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zdf4y2etKBuIpkEU1zMwoCkCsdisfXZCh8QPamm+drY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rOQ9oMdiK5xxGH+jPzOvwVqdGGnF3+HkJXxn81s6hp4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "61aKKsE3+BJHHWYvs3xSIBvlRmKswmaOo5rygQJguUg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "KuDb/GIzqDM8wv7m7m8AECiWJbae5EKKtJRugZx7kR0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Q+t8t2TmNUiCIorVr9F3AlVnX+Mpt2ZYvN+s8UGict8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tJRZIpKxUgHyL83kW8cvfjkxN3z6WoNnUg+SQw+LK+k=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pnUsYjip8SvW0+m9mR5WWTkpK+p6uwJ6yBUAlBnFKMk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "PArHlz+yPRYDycAP/PgnI/AkP8Wgmfg++Vf4UG1Bf0E=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wnIh53Q3jeK8jEBe1n8kJLa89/H0BxO26ZU8SRIAs9Q=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "4F8U59gzBLGhq58PEWQk2nch+R0Va7eTUoxMneReUIA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ihKagIW3uT1dm22ROr/g5QaCpxZVj2+Fs/YSdM2Noco=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "EJtUOOwjkrPUi9mavYAi+Gom9Y2DuFll7aDwo4mq0M0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dIkr8dbaVRQFskAVT6B286BbcBBt1pZPEOcTZqk4ZcI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "aYVAcZYkH/Tieoa1XOjE/zCy5AJcVTHjS0NG2QB7muA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "sBidL6y8TenseetpioIAAtn0lK/7C8MoW4JXpVYi3z8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "0Dd2klU/t4R86c2WJcJDAd57k/N7OjvYSO5Vf8KH8sw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "I3jZ92WEVmZmgaIkLbuWhBxl7EM6bEjiEttgBJunArA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "aGHoQMlgJoGvArjfIbc3nnkoc8SWBxcrN7hSmjMRzos=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "bpiWPnF/KVBQr5F6MEwc5ZZayzIRvQOLDAm4ntwOi8g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tI7QVKbE6avWgDD9h4QKyFlnTxFCwd2iLySKakxNR/I=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "XGsge0CnoaXgE3rcpKm8AEeku5QVfokS3kcI+JKV1lk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JQxlryW2Q5WOwfrjAnaZxDvC83Dg6sjRVP5zegf2WiM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YFuHKJOfoqp1iGVxoFjx7bLYgVdsN4GuUFxEgO9HJ5s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Z6vUdiCR18ylKomf08uxcQHeRtmyav7/Ecvzz4av3k4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SPGo1Ib5AiP/tSllL7Z5PAypvnKdwJLzt8imfIMSEJQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "m94Nh6PFFQFLIib9Cu5LAKavhXnagSHG6F5EF8lD96I=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pfEkQI98mB+gm1+JbmVurPAODMFPJ4E8DnqfVyUWbSo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "DNj3OVRLbr43s0vd+rgWghOL3FqeO/60npdojC8Ry/M=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kAYIQrjHVu49W8FTxyxJeiLVRWWjC9fPcBn+Hx1F+Ss=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "aCSO7UVOpoQvu/iridarxkxV1SVxU1i9HVSYXUAeXk4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Gh6hTP/yj1IKlXQ+Q69KTfMlGZjEcXoRLGbQHNFo/1s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "/gDgIFQ4tAlJk3GN48IS5Qa5IPmErwGk8CHxAbp6gs0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "PICyimwPjxpusyKxNssOOwUotAUbygpyEtORsVGXT8g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "4lu+cBHyAUvuxC6JUNyHLzHsCogGSWFFnUCkDwfQdgI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pSndkmoNUJwXjgkbkgOrT5f9nSvuoMEZOkwAN9ElRaE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tyW+D4i26QihNM5MuBM+wnt5AdWGSJaJ4X5ydc9iWTU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "9Syjr8RoxUgPKr+O5rsCu07AvcebA4P8IVKyS1NVLWc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "67tPfDYnK2tmrioI51fOBG0ygajcV0pLo5+Zm/rEW7U=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "y0EiPRxYTuS1eVTIaPQUQBBxwkyxNckbePvKgChwd0M=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "NWd+2veAaeXQgR3vCvzlI4R1WW67D5YsVLdoXfdb8qg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "PY5RQqKQsL2GqBBSPNOEVpojNFRX/NijCghIpxD6CZk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lcvwTyEjFlssCJtdjRpdN6oY+C7bxZY+WA+QAqzj9zg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CWE7XRNylvTwO/9Fv56dNqUaQWMmESNS/GNIwgBaEI0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ijwlrUeS8nRYqK1F8kiCYF0mNDolEZS+/lJO1Lg93C8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "8KzV+qYGYuIjoNj8eEpnTuHrMYuhzphl80rS6wrODuU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wDyTLjSEFF895hSQsHvmoEQVS6KIkZOtq1c9dVogm9I=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SGrtPuMYCjUrfKF0Pq/thdaQzmGBMUvlwN3ORIu9tHU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "KySHON3hIoUk4xWcwTqk6IL0kgjzjxgMBObVIkCGvk4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hBIdS9j0XJPeT4ot73ngELkpUoSixvRBvdOL9z48jY8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Tx6um0q9HjS5ZvlFhvukpI6ORnyrXMWVW1OoxvgqII0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zFKlyfX5H81+d4A4J3FKn4T5JfG+OWtR06ddyX4Mxas=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cGgCDuPV7MeMMYEDpgOupqyNP4BQ4H7rBnd2QygumgM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "IPaUoy98v11EoglTpJ4kBlEawoZ8y7BPwzjLYBpkvHQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Pfo4Am6tOWAyZNn8G9W5HWWGC3ZWmX0igI/RRB870Ro=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "fnTSjd7bC1Udoq6iM7UDnHAC/lsIXSHp/Gy332qw+/I=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "fApBgVRrTDyEumkeWs5p3ag9KB48SbU4Si0dl7Ns9rc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "QxudfBItgoCnUj5NXVnSmWH3HK76YtKkMmzn4lyyUYY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "sSOvwhKa29Wq94bZ5jGIiJQGbG1uBrKSBfOYBz/oZeI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FdaMgwwJ0NKsqmPZLC5oE+/0D74Dfpvig3LaI5yW5Fs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "sRWBy12IERN43BSZIrnBfC9+zFBUdvjTlkqIH81NGt4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "/4tIRpxKhoOwnXAiFn1Z7Xmric4USOIfKvTYQXk3QTc=",
+ "subType": "00"
+ }
+ }
+ ]
+ },
+ {
+ "_id": {
+ "$numberInt": "1"
+ },
+ "encryptedDecimal": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "DLCAJs+W2PL2DV5YChCL6dYrQNr+j4p3L7xhVaub4ic=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Mr/laWHUijZT5VT3x2a7crb7wgd/UXOGz8jr8BVqBpM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wXVD/HSbBljko0jJcaxJ1nrzs2+pchLQqYR3vywS8SU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "VDCpBYsJIxTfcI6Zgf7FTmKMxUffQv+Ys8zt5dlK76I=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zYDslUwOUVNwTYkETfjceH/PU3bac9X3UuQyYJ19qK0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rAOmHSz18Jx107xpbv9fYcPOmh/KPAqge0PAtuhIRnc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "BFOB1OGVUen7VsOuS0g8Ti7oDsTt2Yj/k/7ta8YAdGM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "2fckE5SPs0GU+akDkUEM6mm0EtcV3WDE/sQsnTtodlk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "mi9+aNjuwIvaMpSHENvKzKRAmX9cYguo2mXLvOoftHQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "K6TWn4VcWWkz/gkUkLmbtwkG7SNeABICmLDnoYJFlLU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Z+2/cEtGU0Fq7QJFNGA/0y4aWAsw0ncG6X0LYRqwS3c=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rrSIf+lgcNZFbbUkS9BmE045jRWBpcBJXHzfMVEFuzE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "KlHL3Kyje1/LMIfgbCqw1SolxffJvvgsYBV5y77wxuA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hzJ1YBoETmYeCh352dBmG8d8Wse/bUcqojTWpWQlgsc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lSdcllDXx8MA+s0GULjDA1lQkcV0L8/aHtZ6dM2pZ2c=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "HGr7JLTTA7ksAnlmjSIwwdBVvgr3fv46/FTdiCPYpos=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "mMr25v1VwOEVZ8xaNUTHJCcsYqV+kwK6RzGYilxPtJ4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "129hJbziPJzNo0IoTU3bECdge0FtaPW8dm4dyNVNwYU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "doiLJ96qoo+v7NqIAZLq6BI5axV8Id8gT5vyJ1ZZ0PM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cW/Lcul3xYmfyvI/0x/+ybN78aQmBK1XIGs1EEU09N8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "1aVIwzu9N5EJV9yEES+/g6hOTH7cA2NTcLIc59cu0wU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kw5tyl7Ew0r1wFyrN1mB9FiVW2hK2BxxxUuJDNWjyjQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ADAY2YBrm6RJBDY/eLLcfNxmSJku+mefz74gH66oyco=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "8gkqB1LojzPrstpFG7RHYmWxXpIlPDTqWnNsXH7XDRU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "TESfVQMDQjfTZmHmUeYUE2XrokJ6CcrsKx/GmypGjOw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "qFM+HFVQ539S0Ouynd1fBHoemFxtU9PRxE5+Dq7Ljy4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "jPiFgUZteSmOg4wf3bsEKCZzcnxmMoILsgp/GaZD+dM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YaWUgJhYgPNN7TkFK16H8SsQS226JguaVhOIQxZwQNQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "x90/Qk3AgyaFsvWf2KUCu5XF3j76WFSjt/GrnG01060=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ZGWybWL/xlEdMYRFCZDUoz10sywTf7U/7wufsb78lH0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "8l4ganN66jIcdxfHAdYLaym/mdzUUQ8TViw3MDRySPc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "c8p5XEGTqxqvRGVlR+nkxw9uUdoqDqTB0jlYQ361qMA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "1ZGFLlpQBcU3zIUg8MmgWwFKVz/SaA7eSYFrfe3Hb70=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "34529174M77rHr3Ftn9r8jU4a5ztYtyVhMn1wryZSkU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YkQ4pxFWzc49MS0vZM6S8mNo4wAwo21rePBeF3C+9mI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "MhOf4mYY00KKVhptOcXf0bXB7WfuuM801MRJg4vXPgc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "7pbbD8ihNIYIBJ3tAUPGzHpFPpIeCTAk5L88qCB0/9w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "C9Q5PoNJTQo6pmNzXEEXUEqH22//UUWY1gqILcIywec=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "AqGVk1QjDNDLYWGRBX/nv9QdGR2SEgXZEhF0EWBAiSE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "/sGI3VCbJUKATULJmhTayPOeVW+5MjWSvVCqS77sRbU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yOtbL0ih7gsuoxVtRrACMz+4N5uo7jIR7zzmtih2Beo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "uA6dkb2Iyg9Su8UNDvZzkPx33kPZtWr/CCuEY+XgzUM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "1DoSFPdHIplqZk+DyWAmEPckWwXw/GdB25NLmzeEZhk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "OfDVS0T3ZuIXI/LNbTp6C9UbPIWLKiMy6Wx+9tqNl+g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "3PZjHXbmG6GtPz+iapKtQ3yY4PoFFgjIy+fV2xQv1YU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kaoLN0BoBWsmqE7kKkJQejATmLShd8qffcAmlhsxsGY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "vpiw9KgQdegGmp7IJnSGX2miujRLU0xzs0ITTqbPW7c=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "NuXFf7xGUefYjIUTuMxNUTCfVHrF8oL0AT7dPv5Plk4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "8Tz53LxtfEBJ9eR+d2690kwNsqPV6XyKo2PlqZCbUrc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "e6zsOmHSyV8tyQtSX6BSwui6wK9v1xG3giY/IILJQ2w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "2fedFMCxa2DzmIpfbDKGXhQg0PPwbUv6vIWdwwlvhms=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yEJKMFnWXTC8tJUfzCInzQRByNEPjHxpw4L4m8No91Q=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YbFuWwOiFuQyOzIJXDbOkCWC2DyrG+248TBuVCa1pXU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "w7IkwGdrguwDrar5+w0Z3va5wXyZ4VXJkDMISyRjPGo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YmJUoILTRJPhyIyWyXJTsQ6KSZHHbEpwPVup6Ldm/Ko=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FvMjcwVZJmfh6FP/yBg2wgskK+KHD8YVUY6WtrE8xbg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "h4HCtD4HyYz0nci49IVAa10Z4NJD/FHnRMV4sRX6qro=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "nC7BpXCmym+a0Is2kReM9cYN2M1Eh5rVo8fjms14Oiw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "1qtVWaeVo649ZZZtN8gXbwLgMWGLhz8beODbvru0I7Q=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Ej+mC0QFyMNIiSjR939S+iGBm7dm+1xObu5IcF/OpbU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "UQ8LbUG3cMegbr9yKfKanAPQE1EfPkFciVDrNqZ5GHY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "4iI3mXIDjnX+ralk1HhJY43mZx2uTJM7hsv9MQzTX7E=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "0WQCcs3rvsasgohERHHCaBM4Iy6yomS4qJ5To3/yYiw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "qDCTVPoue1/DOAGNAlUstdA9Sid8MgEY4e5EzHcVHRk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "9F9Mus0UnlzHb8E8ImxgXtz6SU98YXD0JqswOKw/Bzs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pctHpHKVBBcsahQ6TNh6/1V1ZrqOtKSAPtATV6BJqh0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "vfR3C/4cPkVdxtNaqtF/v635ONbhTf5WbwJM6s4EXNE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ejP43xUBIex6szDcqExAFpx1IE/Ksi5ywJ84GKDFRrs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "jbP4AWYd3S2f3ejmMG7dS5IbrFol48UUoT+ve3JLN6U=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CiDifI7958sUjNqJUBQULeyF7x0Up3loPWvYKw9uAuw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "e2dQFsiHqd2BFHNhlSxocjd+cPs4wkcUW/CnCz4KNuM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "PJFckVmzBipqaEqsuP2mkjhJE4qhw36NhfQ9DcOHyEU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "S3MeuJhET/B8VcfZYDR9fvX0nscDj416jdDekhmK11s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CGVHZRXpuNtQviDB2Kj03Q8uvs4w3RwTgV847R7GwPw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yUGgmgyLrxbEpDVy89XN3c2cmFpZXWWmuJ/35zVZ+Jw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "inb6Q97mL1a9onfNTT8v9wsoi/fz7KXKq3p8j90AU9c=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CCyYx/4npq9xGO1lsCo8ZJhFO9/tN7DB+/DTE778rYg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "LNnYw4fwbiAZu0kBdAHPEm/OFnreS+oArdB5O/l/I98=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "P006SxmUS/RjiQJVYPdMFnNo3827GIEmSzagggkg05Q=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "oyvwY+WsnYV6UHuPki1o0ILJ2jN4uyXf9yaUNtZJyBA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "36Lk3RHWh1wmtCWC/Yj6jNIo17U5y6SofAgQjzjVxD8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "vOOo8FqeHnuO9mqOYjIb4vgwIwVyXZ5Y+bY5d9tGFUM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "bJiDJjwQRNxqxlGjRm5lLziFhcfTDCnQ/qU1V85qcRg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "2Qgrm1n0wUELAQnpkEiIHB856yv76q8jLbpiucetcm0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "5ciPOYxTK0WDwwYyfs7yiVymwtYQXDELLxmM4JLl4/o=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "31dC2WUSIOKQc4jwT6PikfeYTwi80mTlh7P31T5KNQU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YluTV2Mu53EGCKLcWfHZb0BM/IPW2xJdG3vYlDMEsM4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dh/8lGo2Ek6KukSwutH6Q35iy8TgV0FN0SJqe0ZVHN8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "EVw6HpIs3BKen2qY2gz4y5dw1JpXilfh07msZfQqJpc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FYolLla9L8EZMROEdWetozroU40Dnmwwx2jIMrr7c1A=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "8M6k4QIutSIj6CM41vvkQtuFsaGrjoR9SZJVSLbfGKQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "9LM0VoddDNHway442MqY+Z7vohB2UHau/cddshhzf40=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "66i8Ytco4Yq/FMl6pIRZazz3CZlu8fO2OI6Pne0pvHU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "2a/HgX+MjZxjXtSvHgF1yEpHMJBkl8Caee8XrJtn0WM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "frhBM662c4ZVG7mWP8K/HhRjd01lydW/cPcHnDjifqc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6k1T7Q1t668PBqv6fwpVnT1HWh7Am5LtbKvwPJKcpGU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "UlJ5Edfusp8S/Pyhw6KTglIejmbr1HO0zUeHn/qFETA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "jsxsB+1ECB3assUdoC333do9tYH+LglHmVSJHy4N8Hg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "2nzIQxGYF7j3bGsIesECEOqhObKs/9ywknPHeJ3yges=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xJYKtuWrX90JrJVoYtnwP7Ce59XQGFYoalxpNfBXEH0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "NLI5lriBTleGCELcHBtNnmnvwSRkHHaLOX4cKboMgTw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hUOQV0RmE5aJdJww1AR9rirJG4zOYPo+6cCkgn/BGvQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "h4G2Of76AgxcUziBwCyH+ayMOpdBWzg4yFrTfehSC2c=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "VuamM75RzGfQpj2/Y1jSVuQLrhy6OAwlZxjuQLB/9Ss=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kn9+hLq7hvw02xr9vrplOCDXKBTuFhfbX7d5v/l85Pg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "fAiGqKyLZpGngBYFbtYUYt8LUrJ49vYafiboifTDjxs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "BxRILymgfVJCczqjUIWXcfrfSgrrYkxTM5VTg0HkZLY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CrFY/PzfPU2zsFkGLu/dI6mEeizZzCR+uYgjZBAHro0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "AEbrIuwvXLTtYgMjOqnGQ8y8axUn5Ukrn7UZRSyfQVw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ouWeVH3PEFg+dKWlXc6BmqirJOaVWjJbMzZbCsce4dA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+hd6xFB+EG+kVP7WH4uMd1CLaWMnt5xJRaY/Guuga9Q=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zmpGalfAOL3gmcUMJYcLYIRT/2VDO/1Dw4KdYZoNcng=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "2PbHAoM/46J2UIZ/vyksKzmVVfxA7YUyIxWeL/N/vBk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "7fD9x+zk5MVFesb59Klqiwwmve7P5ON/5COURXj5smE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tlrNQ4jaq051iaWonuv1sSrYhKkL1LtNZuHsvATha3s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "fBodm28iClNpvlRyVq0dOdXQ08S7/N3aDwid+PdWvRo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "O+/nnRqT3Zv7yMMGug8GhKHaWy6u7BfRGtZoj0sdN1c=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "5AZZ/RTMY4Photnm/cpXZr/HnFRi3eljacMsipkJLHA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "oFVyo/kgoMxBIk2VE52ySSimeyU+Gr0EfCwapXnTpKA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Z8v59DfcnviA0mzvnUk+URVO0UuqAWvtarEgJva/n1c=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "P64GOntZ+zBJEHkigoh9FSxSO+rJTqR20z5aiGQ9an4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xMbSuDPfWuO/Dm7wuVl06GnzG9uzTlJJX9vFy7boGlY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kXPB19mRClxdH2UsHwlttS6lLU2uHvzuZgZz7kC45jU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "NDVjVYXAw4k0w4tFzvs7QDq39aaU3HQor4I2XMKKnCk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "uKw/+ErVfpTO1dGUfd3T/eWfZW3nUxXCdBGdjvHtZ88=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "av0uxEzWkizYWm0QUM/MN1hLibnxPvCWJKwjOV4yVQY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ERwUC47dvgOBzIsEESMIioLYbFOxOe8PtJTnmDkKuHM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "2gseKlG5Le12fS/vj4eaED4lturF16kAgJ1TpW3HxEE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "7Cvg0Y3j/5i2F1TeXxlMmU7xwif5dCmwkZAOrVC5K2Y=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ ]
+}
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-Decimal-FindOneAndUpdate.yml b/specifications/client-side-encryption/tests/legacy/fle2-Range-Decimal-FindOneAndUpdate.yml
new file mode 100644
index 00000000000..3b772cd6d78
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-Decimal-FindOneAndUpdate.yml
@@ -0,0 +1,1688 @@
+# Requires libmongocrypt 1.7.0.
+runOn:
+ - minServerVersion: "6.2.0"
+ # FLE 2 Encrypted collections are not supported on standalone.
+ # Tests for Decimal (without precision) must only run against a replica set. Decimal (without precision) queries are expected to take a long time and may exceed the default mongos timeout.
+ topology: [ "replicaset" ]
+database_name: &database_name "default"
+collection_name: &collection_name "default"
+data: []
+encrypted_fields: &encrypted_fields {'escCollection': 'enxcol_.default.esc', 'eccCollection': 'enxcol_.default.ecc', 'ecocCollection': 'enxcol_.default.ecoc', 'fields': [{'keyId': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'path': 'encryptedDecimal', 'bsonType': 'decimal', 'queries': {'queryType': 'rangePreview', 'contention': {'$numberLong': '0'}, 'sparsity': {'$numberLong': '1'}}}]}
+key_vault_data: [ {'_id': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'keyMaterial': {'$binary': {'base64': 'sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==', 'subType': '00'}}, 'creationDate': {'$date': {'$numberLong': '1648914851981'}}, 'updateDate': {'$date': {'$numberLong': '1648914851981'}}, 'status': {'$numberInt': '0'}, 'masterKey': {'provider': 'local'}} ]
+tests:
+ - description: "FLE2 Range Decimal. FindOneAndUpdate."
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments:
+ document: &doc0 { _id: 0, encryptedDecimal: { $numberDecimal: "0" } }
+ - name: insertOne
+ arguments:
+ document: &doc1 { _id: 1, encryptedDecimal: { $numberDecimal: "1" } }
+ - name: findOneAndUpdate
+ arguments:
+ filter: { encryptedDecimal: { $gt: {$numberDecimal: "0"}} }
+ update: { "$set": { "encryptedDecimal": {$numberDecimal: "2"}}}
+ returnDocument: Before
+ result: *doc1
+ expectations:
+ - command_started_event:
+ command:
+ listCollections: 1
+ filter:
+ name: *collection_name
+ command_name: listCollections
+ - command_started_event:
+ command:
+ find: datakeys
+ filter: {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ }
+ $db: keyvault
+ readConcern: { level: "majority" }
+ command_name: find
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc0_encrypted { "_id": 0, "encryptedDecimal": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc1_encrypted { "_id": 1, "encryptedDecimal": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ findAndModify: *collection_name
+ query: {
+ "encryptedDecimal": {
+ "$gt": {
+ "$binary": {
+ "base64": "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",
+ "subType": "06"
+ }
+ }
+ }
+ }
+ update: { "$set": {"encryptedDecimal": { $$type: "binData" }} }
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ "deleteTokens": {
+ "default.default": {
+ "encryptedDecimal": {
+ "e": {
+ "$binary": {
+ "base64": "65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+w=",
+ "subType": "00"
+ }
+ },
+ "o": {
+ "$binary": {
+ "base64": "noN+05JsuO1oDg59yypIGj45i+eFH6HOTXOPpeZ//Mk=",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ command_name: findAndModify
+ outcome:
+ collection:
+ # Outcome is checked using a separate MongoClient without auto encryption.
+ data:
+ -
+ {
+ "_id": {
+ "$numberInt": "0"
+ },
+ "encryptedDecimal": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rbf3AeBEv4wWFAKknqDxRW5cLNkFvbIs6iJjc6LShQY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "n+XAuFnP8Dov9TnhGFxNx0K/MnVM9WbJ7RouEu0ndO0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yRXojuVdn5GQtD97qYlaCL6cOLmZ7Cvcb3wFjkLUIdM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "DuIkdRPITRs55I4SZmgomAHCIsDQmXRhW8+MOznkzSk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SsBk+Et1lTbU+QRPx+xyJ/jMkmfG+QCvQEpip2YYrzA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "crCIzOd8KhHvvUlX7M1v9bhvU4pLdTc+X2SuqoKU5Ek=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YOWdCw4UrqnxkAaVjqmC4sKQDMVMHEpFGnlxpxdaU6E=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "M3SShp81Ff8tQ632qKbv9MUcN6wjDaBReI0VXNu6Xh4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "gzHlSPxpM0hT75kQvWFzGlOxKvDoiKQZOr19V6l2zXI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "s3JnppOGYw9SL2Q1kMAZs948v2F5PrpXjGei/HioDWs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cG6+3Gk/zEH68P/uuuwiAUVCuyJwa1LeV+t29FlPPAo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dupdvR3AyJtM+g9NDKiaLVOtGca387JQp8w+V03m7Ig=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JqEQc5svj2jTvZ6LLA5ivE+kTb/0aRemSEmxk4G7Zrg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "szcXXXKnob+p3SoM4yED2R920LeJ7cVsclPMFTe4CeI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "o1QoGVXmuBdHwHm7aCtGMlMVKrjFdYvJXpoq6uhIAZ0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Jfm5wPlqqLCJRGQIqRq2NGmpn7s0Vrih2H3YAOoI2YU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zMHLb8ARbsYo8Ld05bqnGFf1Usha6EGb8QKwdSAyps0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yQdtq9lh5pugL7/i0Bj/PuZUUBUIzf+7wj1rl5y736w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wGWVZdO7qIuyDg/BqDgqjgoQ02h5YYgwXQB1oCin2NE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "by9HMLj6NTEpgztZ5HSN6GxImkXPcaFINYDzgZY33X8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tWo0vbasi7bXmn/MsOx13VC1IsWtpx/nYp0uj4iMzdA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tQQpndUYd5O87lOtrGjH3wl9VsOK0ray7RMasL90sBM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cQjXEDCMsOpKLLf+vlTgIHA+cbSJdzqhbSX9Wvh95aA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "7yMpU48IxK9SzP2cx3VnTownGEwFmeFofuuFT97SuuY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kSOx1kz0CmBgzKQHZlo65ZUY1DIv9A99JRm+Us2y6Ew=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ubQpdPBe6/xvtr+AcXdfYLSvYCR4ot0tivehkCsupb4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xal+iCJ6FTefRQToyoNksc9NCZShyn04NDGi4IYrcoM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "d7jU4iOK50xHxlkSifcxlZFCM46TSgQzoYivxG3HNLY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tJvl2nsBLBVzL3pp6sKWCL4UXeh3q/roYBJjSb74ve0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "OIUCaKRvIx9t1w6Hxlz1IcQTdPNCfdRNwnnTm10W+X0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "A9tvzsiElotOUVIB4CqfQp9mAwqvTM35YkmAR170aHA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lI8gpK7hpb7c9x4RQugsxMnQay5LZJmwslZdvMx/dcE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dNCzh40U0XvdKnSDi3HRQOWQftEsDVqc4uUvsVFGoq8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "IP+iwEBWBwVVZIdpaMu8k5+soFCz+TZkYn3drKZ9grE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pnqyh6e0y5svHkJDShlN9CHV0WvMBE4QbtJpQw5ZCXc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "elEl42tbVDoRTLjAhZUFEtXiut4b3PVhg/1ZLZSQdtE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "vHuu2FxwclMHqyE6JBYbTYgbEkB0dqb/JuaxsvfwsmY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xTf7NCe3Gf8QpE78HR5OknlLTKfs9J+RN9UZpH6fnso=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "XiWSasRnJAulGR6+LCVD3mwRObXylqYWR9jvpywq12c=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "MZMxEQ5ikx0PG1YFIExv0UnTZogsvgeOEZTpzvBDn4w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yZMyMZBDrWbAhvnic7vvIYhmO9m5H2iuv0c8KNZrBzY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xxM14hTPY5j0vvcK2C7YAEjzdsfUTFHozHC0hEo1bxI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+01rqR1xVwkpGXcstbk1ItJqFVjH6Q8MGxEN3Cm9Y1A=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xOpLV0Z2VTRJ3iWtnWZcsyjXubTIkYWo31cO+HV1o1k=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "BWUOLqgLBqc5NwxVlSV5H3KFQPXbCp7mdo+jF+8cJqY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "fuQb1S6xZDGlrEbK+kI23aL53PP1PVNwqICnZNt9Yzg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SfscnoibFttahLdPVC4Ee+47ewGFKpDSU7M6HX19bKE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rpSW2awybNVeKtat91VFxqbINoTfNhPfQAu+d73Xtf8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "9M/CP9ccOIIj2LLFmE0GFDO0Ban2wsNalEXfM6+h+1s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "WrEMG49l1ye4MhXs5ZS9tz8P6h+hDvthIg/2wW9ne1Q=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ImNhbfeyfH8qIEeA5ic0s3dAQBdzzTBS+CPsNih9vZ0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dWP33YDSn04UKJN2ogh2Rui0iW/0q2y18OCDRVcfyoo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lYv0isAtfGh6H9tdp3cp2eHU7q2J+uk7QrgcxtK3w7Y=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "VGMoamB/+7zTOYcY/pqJc96xlv2PdW4hwsIAEIslTDQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yNeBWMF7BnD9wVwz2PgJsvWr77QiVvvWUvJF0+fqBug=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SfpvObJ+tJBXSvqeN7vlOfmhYign635lciYAJIjUtY8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dsen4NqjzVGjpjufiTMs3+gqeD09EbnuogPgxrJECwg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pxCWVM3sn19NsFEpgHbgLa+PmYlhN3mMiP0Wk8kJhYw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q11KNvJszjYIB9n9HcC+N4uz11a3eRj1L3BH9scKMDQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "A1PmkgcEToWh1JiVWE6mI5jUu7poxWWuCUt/cgRUUDc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "qJo3Hu4PJeanL7XEaWXO/n3YsodhZyd+MJOOmB9Kpd8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "BkBKLO8URFscfRY9Bav/1+L9mLohDgNr/MkZtGiraIs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rZq5WA3Hx3xthOyHAJXK//f8pE2qbz7YKu3TIMp9GFY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "X07a/Lm80p5xd4RFs1dNmw+90tmPDPdGiAKVZkxd4zY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6YrBn2ofIw1b5ooakrLOwF41BWrps8OO0H9WH4/rtlE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "0l86Ag5OszXpa78SlOUV3K9nff5iC1p0mRXtLg9M1s4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Hn6yuxFHodeyu7ISlhYrbSf9pTiH4TDEvbYLWjTwFO0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zdf4y2etKBuIpkEU1zMwoCkCsdisfXZCh8QPamm+drY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rOQ9oMdiK5xxGH+jPzOvwVqdGGnF3+HkJXxn81s6hp4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "61aKKsE3+BJHHWYvs3xSIBvlRmKswmaOo5rygQJguUg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "KuDb/GIzqDM8wv7m7m8AECiWJbae5EKKtJRugZx7kR0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Q+t8t2TmNUiCIorVr9F3AlVnX+Mpt2ZYvN+s8UGict8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tJRZIpKxUgHyL83kW8cvfjkxN3z6WoNnUg+SQw+LK+k=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pnUsYjip8SvW0+m9mR5WWTkpK+p6uwJ6yBUAlBnFKMk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "PArHlz+yPRYDycAP/PgnI/AkP8Wgmfg++Vf4UG1Bf0E=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wnIh53Q3jeK8jEBe1n8kJLa89/H0BxO26ZU8SRIAs9Q=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "4F8U59gzBLGhq58PEWQk2nch+R0Va7eTUoxMneReUIA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ihKagIW3uT1dm22ROr/g5QaCpxZVj2+Fs/YSdM2Noco=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "EJtUOOwjkrPUi9mavYAi+Gom9Y2DuFll7aDwo4mq0M0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dIkr8dbaVRQFskAVT6B286BbcBBt1pZPEOcTZqk4ZcI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "aYVAcZYkH/Tieoa1XOjE/zCy5AJcVTHjS0NG2QB7muA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "sBidL6y8TenseetpioIAAtn0lK/7C8MoW4JXpVYi3z8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "0Dd2klU/t4R86c2WJcJDAd57k/N7OjvYSO5Vf8KH8sw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "I3jZ92WEVmZmgaIkLbuWhBxl7EM6bEjiEttgBJunArA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "aGHoQMlgJoGvArjfIbc3nnkoc8SWBxcrN7hSmjMRzos=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "bpiWPnF/KVBQr5F6MEwc5ZZayzIRvQOLDAm4ntwOi8g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tI7QVKbE6avWgDD9h4QKyFlnTxFCwd2iLySKakxNR/I=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "XGsge0CnoaXgE3rcpKm8AEeku5QVfokS3kcI+JKV1lk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JQxlryW2Q5WOwfrjAnaZxDvC83Dg6sjRVP5zegf2WiM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YFuHKJOfoqp1iGVxoFjx7bLYgVdsN4GuUFxEgO9HJ5s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Z6vUdiCR18ylKomf08uxcQHeRtmyav7/Ecvzz4av3k4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SPGo1Ib5AiP/tSllL7Z5PAypvnKdwJLzt8imfIMSEJQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "m94Nh6PFFQFLIib9Cu5LAKavhXnagSHG6F5EF8lD96I=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pfEkQI98mB+gm1+JbmVurPAODMFPJ4E8DnqfVyUWbSo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "DNj3OVRLbr43s0vd+rgWghOL3FqeO/60npdojC8Ry/M=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kAYIQrjHVu49W8FTxyxJeiLVRWWjC9fPcBn+Hx1F+Ss=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "aCSO7UVOpoQvu/iridarxkxV1SVxU1i9HVSYXUAeXk4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Gh6hTP/yj1IKlXQ+Q69KTfMlGZjEcXoRLGbQHNFo/1s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "/gDgIFQ4tAlJk3GN48IS5Qa5IPmErwGk8CHxAbp6gs0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "PICyimwPjxpusyKxNssOOwUotAUbygpyEtORsVGXT8g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "4lu+cBHyAUvuxC6JUNyHLzHsCogGSWFFnUCkDwfQdgI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pSndkmoNUJwXjgkbkgOrT5f9nSvuoMEZOkwAN9ElRaE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tyW+D4i26QihNM5MuBM+wnt5AdWGSJaJ4X5ydc9iWTU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "9Syjr8RoxUgPKr+O5rsCu07AvcebA4P8IVKyS1NVLWc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "67tPfDYnK2tmrioI51fOBG0ygajcV0pLo5+Zm/rEW7U=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "y0EiPRxYTuS1eVTIaPQUQBBxwkyxNckbePvKgChwd0M=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "NWd+2veAaeXQgR3vCvzlI4R1WW67D5YsVLdoXfdb8qg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "PY5RQqKQsL2GqBBSPNOEVpojNFRX/NijCghIpxD6CZk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lcvwTyEjFlssCJtdjRpdN6oY+C7bxZY+WA+QAqzj9zg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CWE7XRNylvTwO/9Fv56dNqUaQWMmESNS/GNIwgBaEI0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ijwlrUeS8nRYqK1F8kiCYF0mNDolEZS+/lJO1Lg93C8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "8KzV+qYGYuIjoNj8eEpnTuHrMYuhzphl80rS6wrODuU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wDyTLjSEFF895hSQsHvmoEQVS6KIkZOtq1c9dVogm9I=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SGrtPuMYCjUrfKF0Pq/thdaQzmGBMUvlwN3ORIu9tHU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "KySHON3hIoUk4xWcwTqk6IL0kgjzjxgMBObVIkCGvk4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hBIdS9j0XJPeT4ot73ngELkpUoSixvRBvdOL9z48jY8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Tx6um0q9HjS5ZvlFhvukpI6ORnyrXMWVW1OoxvgqII0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zFKlyfX5H81+d4A4J3FKn4T5JfG+OWtR06ddyX4Mxas=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cGgCDuPV7MeMMYEDpgOupqyNP4BQ4H7rBnd2QygumgM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "IPaUoy98v11EoglTpJ4kBlEawoZ8y7BPwzjLYBpkvHQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Pfo4Am6tOWAyZNn8G9W5HWWGC3ZWmX0igI/RRB870Ro=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "fnTSjd7bC1Udoq6iM7UDnHAC/lsIXSHp/Gy332qw+/I=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "fApBgVRrTDyEumkeWs5p3ag9KB48SbU4Si0dl7Ns9rc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "QxudfBItgoCnUj5NXVnSmWH3HK76YtKkMmzn4lyyUYY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "sSOvwhKa29Wq94bZ5jGIiJQGbG1uBrKSBfOYBz/oZeI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FdaMgwwJ0NKsqmPZLC5oE+/0D74Dfpvig3LaI5yW5Fs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "sRWBy12IERN43BSZIrnBfC9+zFBUdvjTlkqIH81NGt4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "/4tIRpxKhoOwnXAiFn1Z7Xmric4USOIfKvTYQXk3QTc=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ -
+ {
+ "_id": {
+ "$numberInt": "1"
+ },
+ "encryptedDecimal": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "DLCAJs+W2PL2DV5YChCL6dYrQNr+j4p3L7xhVaub4ic=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Mr/laWHUijZT5VT3x2a7crb7wgd/UXOGz8jr8BVqBpM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wXVD/HSbBljko0jJcaxJ1nrzs2+pchLQqYR3vywS8SU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "VDCpBYsJIxTfcI6Zgf7FTmKMxUffQv+Ys8zt5dlK76I=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zYDslUwOUVNwTYkETfjceH/PU3bac9X3UuQyYJ19qK0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rAOmHSz18Jx107xpbv9fYcPOmh/KPAqge0PAtuhIRnc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "BFOB1OGVUen7VsOuS0g8Ti7oDsTt2Yj/k/7ta8YAdGM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "2fckE5SPs0GU+akDkUEM6mm0EtcV3WDE/sQsnTtodlk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "mi9+aNjuwIvaMpSHENvKzKRAmX9cYguo2mXLvOoftHQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "K6TWn4VcWWkz/gkUkLmbtwkG7SNeABICmLDnoYJFlLU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Z+2/cEtGU0Fq7QJFNGA/0y4aWAsw0ncG6X0LYRqwS3c=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rrSIf+lgcNZFbbUkS9BmE045jRWBpcBJXHzfMVEFuzE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "KlHL3Kyje1/LMIfgbCqw1SolxffJvvgsYBV5y77wxuA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hzJ1YBoETmYeCh352dBmG8d8Wse/bUcqojTWpWQlgsc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lSdcllDXx8MA+s0GULjDA1lQkcV0L8/aHtZ6dM2pZ2c=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "HGr7JLTTA7ksAnlmjSIwwdBVvgr3fv46/FTdiCPYpos=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "mMr25v1VwOEVZ8xaNUTHJCcsYqV+kwK6RzGYilxPtJ4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "129hJbziPJzNo0IoTU3bECdge0FtaPW8dm4dyNVNwYU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "doiLJ96qoo+v7NqIAZLq6BI5axV8Id8gT5vyJ1ZZ0PM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cW/Lcul3xYmfyvI/0x/+ybN78aQmBK1XIGs1EEU09N8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "1aVIwzu9N5EJV9yEES+/g6hOTH7cA2NTcLIc59cu0wU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kw5tyl7Ew0r1wFyrN1mB9FiVW2hK2BxxxUuJDNWjyjQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ADAY2YBrm6RJBDY/eLLcfNxmSJku+mefz74gH66oyco=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "8gkqB1LojzPrstpFG7RHYmWxXpIlPDTqWnNsXH7XDRU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "TESfVQMDQjfTZmHmUeYUE2XrokJ6CcrsKx/GmypGjOw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "qFM+HFVQ539S0Ouynd1fBHoemFxtU9PRxE5+Dq7Ljy4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "jPiFgUZteSmOg4wf3bsEKCZzcnxmMoILsgp/GaZD+dM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YaWUgJhYgPNN7TkFK16H8SsQS226JguaVhOIQxZwQNQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "x90/Qk3AgyaFsvWf2KUCu5XF3j76WFSjt/GrnG01060=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ZGWybWL/xlEdMYRFCZDUoz10sywTf7U/7wufsb78lH0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "8l4ganN66jIcdxfHAdYLaym/mdzUUQ8TViw3MDRySPc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "c8p5XEGTqxqvRGVlR+nkxw9uUdoqDqTB0jlYQ361qMA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "1ZGFLlpQBcU3zIUg8MmgWwFKVz/SaA7eSYFrfe3Hb70=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "34529174M77rHr3Ftn9r8jU4a5ztYtyVhMn1wryZSkU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YkQ4pxFWzc49MS0vZM6S8mNo4wAwo21rePBeF3C+9mI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "MhOf4mYY00KKVhptOcXf0bXB7WfuuM801MRJg4vXPgc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "7pbbD8ihNIYIBJ3tAUPGzHpFPpIeCTAk5L88qCB0/9w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "C9Q5PoNJTQo6pmNzXEEXUEqH22//UUWY1gqILcIywec=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "AqGVk1QjDNDLYWGRBX/nv9QdGR2SEgXZEhF0EWBAiSE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "/sGI3VCbJUKATULJmhTayPOeVW+5MjWSvVCqS77sRbU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yOtbL0ih7gsuoxVtRrACMz+4N5uo7jIR7zzmtih2Beo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "uA6dkb2Iyg9Su8UNDvZzkPx33kPZtWr/CCuEY+XgzUM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "1DoSFPdHIplqZk+DyWAmEPckWwXw/GdB25NLmzeEZhk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "OfDVS0T3ZuIXI/LNbTp6C9UbPIWLKiMy6Wx+9tqNl+g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "3PZjHXbmG6GtPz+iapKtQ3yY4PoFFgjIy+fV2xQv1YU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kaoLN0BoBWsmqE7kKkJQejATmLShd8qffcAmlhsxsGY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "vpiw9KgQdegGmp7IJnSGX2miujRLU0xzs0ITTqbPW7c=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "NuXFf7xGUefYjIUTuMxNUTCfVHrF8oL0AT7dPv5Plk4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "8Tz53LxtfEBJ9eR+d2690kwNsqPV6XyKo2PlqZCbUrc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "e6zsOmHSyV8tyQtSX6BSwui6wK9v1xG3giY/IILJQ2w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "2fedFMCxa2DzmIpfbDKGXhQg0PPwbUv6vIWdwwlvhms=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yEJKMFnWXTC8tJUfzCInzQRByNEPjHxpw4L4m8No91Q=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YbFuWwOiFuQyOzIJXDbOkCWC2DyrG+248TBuVCa1pXU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "w7IkwGdrguwDrar5+w0Z3va5wXyZ4VXJkDMISyRjPGo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YmJUoILTRJPhyIyWyXJTsQ6KSZHHbEpwPVup6Ldm/Ko=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FvMjcwVZJmfh6FP/yBg2wgskK+KHD8YVUY6WtrE8xbg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "h4HCtD4HyYz0nci49IVAa10Z4NJD/FHnRMV4sRX6qro=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "nC7BpXCmym+a0Is2kReM9cYN2M1Eh5rVo8fjms14Oiw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "1qtVWaeVo649ZZZtN8gXbwLgMWGLhz8beODbvru0I7Q=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Ej+mC0QFyMNIiSjR939S+iGBm7dm+1xObu5IcF/OpbU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "UQ8LbUG3cMegbr9yKfKanAPQE1EfPkFciVDrNqZ5GHY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "4iI3mXIDjnX+ralk1HhJY43mZx2uTJM7hsv9MQzTX7E=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "0WQCcs3rvsasgohERHHCaBM4Iy6yomS4qJ5To3/yYiw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "qDCTVPoue1/DOAGNAlUstdA9Sid8MgEY4e5EzHcVHRk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "9F9Mus0UnlzHb8E8ImxgXtz6SU98YXD0JqswOKw/Bzs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pctHpHKVBBcsahQ6TNh6/1V1ZrqOtKSAPtATV6BJqh0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "vfR3C/4cPkVdxtNaqtF/v635ONbhTf5WbwJM6s4EXNE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ejP43xUBIex6szDcqExAFpx1IE/Ksi5ywJ84GKDFRrs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "jbP4AWYd3S2f3ejmMG7dS5IbrFol48UUoT+ve3JLN6U=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CiDifI7958sUjNqJUBQULeyF7x0Up3loPWvYKw9uAuw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "e2dQFsiHqd2BFHNhlSxocjd+cPs4wkcUW/CnCz4KNuM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "PJFckVmzBipqaEqsuP2mkjhJE4qhw36NhfQ9DcOHyEU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "S3MeuJhET/B8VcfZYDR9fvX0nscDj416jdDekhmK11s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CGVHZRXpuNtQviDB2Kj03Q8uvs4w3RwTgV847R7GwPw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yUGgmgyLrxbEpDVy89XN3c2cmFpZXWWmuJ/35zVZ+Jw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "inb6Q97mL1a9onfNTT8v9wsoi/fz7KXKq3p8j90AU9c=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CCyYx/4npq9xGO1lsCo8ZJhFO9/tN7DB+/DTE778rYg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "LNnYw4fwbiAZu0kBdAHPEm/OFnreS+oArdB5O/l/I98=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "P006SxmUS/RjiQJVYPdMFnNo3827GIEmSzagggkg05Q=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "oyvwY+WsnYV6UHuPki1o0ILJ2jN4uyXf9yaUNtZJyBA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "36Lk3RHWh1wmtCWC/Yj6jNIo17U5y6SofAgQjzjVxD8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "vOOo8FqeHnuO9mqOYjIb4vgwIwVyXZ5Y+bY5d9tGFUM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "bJiDJjwQRNxqxlGjRm5lLziFhcfTDCnQ/qU1V85qcRg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "2Qgrm1n0wUELAQnpkEiIHB856yv76q8jLbpiucetcm0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "5ciPOYxTK0WDwwYyfs7yiVymwtYQXDELLxmM4JLl4/o=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "31dC2WUSIOKQc4jwT6PikfeYTwi80mTlh7P31T5KNQU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YluTV2Mu53EGCKLcWfHZb0BM/IPW2xJdG3vYlDMEsM4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dh/8lGo2Ek6KukSwutH6Q35iy8TgV0FN0SJqe0ZVHN8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "EVw6HpIs3BKen2qY2gz4y5dw1JpXilfh07msZfQqJpc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FYolLla9L8EZMROEdWetozroU40Dnmwwx2jIMrr7c1A=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "8M6k4QIutSIj6CM41vvkQtuFsaGrjoR9SZJVSLbfGKQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "9LM0VoddDNHway442MqY+Z7vohB2UHau/cddshhzf40=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "66i8Ytco4Yq/FMl6pIRZazz3CZlu8fO2OI6Pne0pvHU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "2a/HgX+MjZxjXtSvHgF1yEpHMJBkl8Caee8XrJtn0WM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "frhBM662c4ZVG7mWP8K/HhRjd01lydW/cPcHnDjifqc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6k1T7Q1t668PBqv6fwpVnT1HWh7Am5LtbKvwPJKcpGU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "UlJ5Edfusp8S/Pyhw6KTglIejmbr1HO0zUeHn/qFETA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "jsxsB+1ECB3assUdoC333do9tYH+LglHmVSJHy4N8Hg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "2nzIQxGYF7j3bGsIesECEOqhObKs/9ywknPHeJ3yges=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xJYKtuWrX90JrJVoYtnwP7Ce59XQGFYoalxpNfBXEH0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "NLI5lriBTleGCELcHBtNnmnvwSRkHHaLOX4cKboMgTw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hUOQV0RmE5aJdJww1AR9rirJG4zOYPo+6cCkgn/BGvQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "h4G2Of76AgxcUziBwCyH+ayMOpdBWzg4yFrTfehSC2c=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "VuamM75RzGfQpj2/Y1jSVuQLrhy6OAwlZxjuQLB/9Ss=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kn9+hLq7hvw02xr9vrplOCDXKBTuFhfbX7d5v/l85Pg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "fAiGqKyLZpGngBYFbtYUYt8LUrJ49vYafiboifTDjxs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "BxRILymgfVJCczqjUIWXcfrfSgrrYkxTM5VTg0HkZLY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CrFY/PzfPU2zsFkGLu/dI6mEeizZzCR+uYgjZBAHro0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "AEbrIuwvXLTtYgMjOqnGQ8y8axUn5Ukrn7UZRSyfQVw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ouWeVH3PEFg+dKWlXc6BmqirJOaVWjJbMzZbCsce4dA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+hd6xFB+EG+kVP7WH4uMd1CLaWMnt5xJRaY/Guuga9Q=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zmpGalfAOL3gmcUMJYcLYIRT/2VDO/1Dw4KdYZoNcng=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "2PbHAoM/46J2UIZ/vyksKzmVVfxA7YUyIxWeL/N/vBk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "7fD9x+zk5MVFesb59Klqiwwmve7P5ON/5COURXj5smE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tlrNQ4jaq051iaWonuv1sSrYhKkL1LtNZuHsvATha3s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "fBodm28iClNpvlRyVq0dOdXQ08S7/N3aDwid+PdWvRo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "O+/nnRqT3Zv7yMMGug8GhKHaWy6u7BfRGtZoj0sdN1c=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "5AZZ/RTMY4Photnm/cpXZr/HnFRi3eljacMsipkJLHA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "oFVyo/kgoMxBIk2VE52ySSimeyU+Gr0EfCwapXnTpKA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Z8v59DfcnviA0mzvnUk+URVO0UuqAWvtarEgJva/n1c=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "P64GOntZ+zBJEHkigoh9FSxSO+rJTqR20z5aiGQ9an4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xMbSuDPfWuO/Dm7wuVl06GnzG9uzTlJJX9vFy7boGlY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kXPB19mRClxdH2UsHwlttS6lLU2uHvzuZgZz7kC45jU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "NDVjVYXAw4k0w4tFzvs7QDq39aaU3HQor4I2XMKKnCk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "uKw/+ErVfpTO1dGUfd3T/eWfZW3nUxXCdBGdjvHtZ88=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "av0uxEzWkizYWm0QUM/MN1hLibnxPvCWJKwjOV4yVQY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ERwUC47dvgOBzIsEESMIioLYbFOxOe8PtJTnmDkKuHM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "2gseKlG5Le12fS/vj4eaED4lturF16kAgJ1TpW3HxEE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "7Cvg0Y3j/5i2F1TeXxlMmU7xwif5dCmwkZAOrVC5K2Y=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
\ No newline at end of file
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-Decimal-InsertFind.json b/specifications/client-side-encryption/tests/legacy/fle2-Range-Decimal-InsertFind.json
new file mode 100644
index 00000000000..cea03e23fe8
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-Decimal-InsertFind.json
@@ -0,0 +1,1899 @@
+{
+ "runOn": [
+ {
+ "minServerVersion": "6.2.0",
+ "topology": [
+ "replicaset"
+ ]
+ }
+ ],
+ "database_name": "default",
+ "collection_name": "default",
+ "data": [],
+ "encrypted_fields": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDecimal",
+ "bsonType": "decimal",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ ]
+ },
+ "key_vault_data": [
+ {
+ "_id": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "keyMaterial": {
+ "$binary": {
+ "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==",
+ "subType": "00"
+ }
+ },
+ "creationDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "updateDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "status": {
+ "$numberInt": "0"
+ },
+ "masterKey": {
+ "provider": "local"
+ }
+ }
+ ],
+ "tests": [
+ {
+ "description": "FLE2 Range Decimal. Insert and Find.",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDecimal": {
+ "$numberDecimal": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDecimal": {
+ "$numberDecimal": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDecimal": {
+ "$gt": {
+ "$numberDecimal": "0"
+ }
+ }
+ }
+ },
+ "result": [
+ {
+ "_id": 1,
+ "encryptedDecimal": {
+ "$numberDecimal": "1"
+ }
+ }
+ ]
+ }
+ ],
+ "expectations": [
+ {
+ "command_started_event": {
+ "command": {
+ "listCollections": 1,
+ "filter": {
+ "name": "default"
+ }
+ },
+ "command_name": "listCollections"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "find": "datakeys",
+ "filter": {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ },
+ "$db": "keyvault",
+ "readConcern": {
+ "level": "majority"
+ }
+ },
+ "command_name": "find"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 0,
+ "encryptedDecimal": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDecimal",
+ "bsonType": "decimal",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 1,
+ "encryptedDecimal": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDecimal",
+ "bsonType": "decimal",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "find": "default",
+ "filter": {
+ "encryptedDecimal": {
+ "$gt": {
+ "$binary": {
+ "base64": "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",
+ "subType": "06"
+ }
+ }
+ }
+ },
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDecimal",
+ "bsonType": "decimal",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "find"
+ }
+ }
+ ],
+ "outcome": {
+ "collection": {
+ "data": [
+ {
+ "_id": {
+ "$numberInt": "0"
+ },
+ "encryptedDecimal": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rbf3AeBEv4wWFAKknqDxRW5cLNkFvbIs6iJjc6LShQY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "n+XAuFnP8Dov9TnhGFxNx0K/MnVM9WbJ7RouEu0ndO0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yRXojuVdn5GQtD97qYlaCL6cOLmZ7Cvcb3wFjkLUIdM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "DuIkdRPITRs55I4SZmgomAHCIsDQmXRhW8+MOznkzSk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SsBk+Et1lTbU+QRPx+xyJ/jMkmfG+QCvQEpip2YYrzA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "crCIzOd8KhHvvUlX7M1v9bhvU4pLdTc+X2SuqoKU5Ek=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YOWdCw4UrqnxkAaVjqmC4sKQDMVMHEpFGnlxpxdaU6E=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "M3SShp81Ff8tQ632qKbv9MUcN6wjDaBReI0VXNu6Xh4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "gzHlSPxpM0hT75kQvWFzGlOxKvDoiKQZOr19V6l2zXI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "s3JnppOGYw9SL2Q1kMAZs948v2F5PrpXjGei/HioDWs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cG6+3Gk/zEH68P/uuuwiAUVCuyJwa1LeV+t29FlPPAo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dupdvR3AyJtM+g9NDKiaLVOtGca387JQp8w+V03m7Ig=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JqEQc5svj2jTvZ6LLA5ivE+kTb/0aRemSEmxk4G7Zrg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "szcXXXKnob+p3SoM4yED2R920LeJ7cVsclPMFTe4CeI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "o1QoGVXmuBdHwHm7aCtGMlMVKrjFdYvJXpoq6uhIAZ0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Jfm5wPlqqLCJRGQIqRq2NGmpn7s0Vrih2H3YAOoI2YU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zMHLb8ARbsYo8Ld05bqnGFf1Usha6EGb8QKwdSAyps0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yQdtq9lh5pugL7/i0Bj/PuZUUBUIzf+7wj1rl5y736w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wGWVZdO7qIuyDg/BqDgqjgoQ02h5YYgwXQB1oCin2NE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "by9HMLj6NTEpgztZ5HSN6GxImkXPcaFINYDzgZY33X8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tWo0vbasi7bXmn/MsOx13VC1IsWtpx/nYp0uj4iMzdA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tQQpndUYd5O87lOtrGjH3wl9VsOK0ray7RMasL90sBM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cQjXEDCMsOpKLLf+vlTgIHA+cbSJdzqhbSX9Wvh95aA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "7yMpU48IxK9SzP2cx3VnTownGEwFmeFofuuFT97SuuY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kSOx1kz0CmBgzKQHZlo65ZUY1DIv9A99JRm+Us2y6Ew=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ubQpdPBe6/xvtr+AcXdfYLSvYCR4ot0tivehkCsupb4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xal+iCJ6FTefRQToyoNksc9NCZShyn04NDGi4IYrcoM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "d7jU4iOK50xHxlkSifcxlZFCM46TSgQzoYivxG3HNLY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tJvl2nsBLBVzL3pp6sKWCL4UXeh3q/roYBJjSb74ve0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "OIUCaKRvIx9t1w6Hxlz1IcQTdPNCfdRNwnnTm10W+X0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "A9tvzsiElotOUVIB4CqfQp9mAwqvTM35YkmAR170aHA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lI8gpK7hpb7c9x4RQugsxMnQay5LZJmwslZdvMx/dcE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dNCzh40U0XvdKnSDi3HRQOWQftEsDVqc4uUvsVFGoq8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "IP+iwEBWBwVVZIdpaMu8k5+soFCz+TZkYn3drKZ9grE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pnqyh6e0y5svHkJDShlN9CHV0WvMBE4QbtJpQw5ZCXc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "elEl42tbVDoRTLjAhZUFEtXiut4b3PVhg/1ZLZSQdtE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "vHuu2FxwclMHqyE6JBYbTYgbEkB0dqb/JuaxsvfwsmY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xTf7NCe3Gf8QpE78HR5OknlLTKfs9J+RN9UZpH6fnso=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "XiWSasRnJAulGR6+LCVD3mwRObXylqYWR9jvpywq12c=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "MZMxEQ5ikx0PG1YFIExv0UnTZogsvgeOEZTpzvBDn4w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yZMyMZBDrWbAhvnic7vvIYhmO9m5H2iuv0c8KNZrBzY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xxM14hTPY5j0vvcK2C7YAEjzdsfUTFHozHC0hEo1bxI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+01rqR1xVwkpGXcstbk1ItJqFVjH6Q8MGxEN3Cm9Y1A=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xOpLV0Z2VTRJ3iWtnWZcsyjXubTIkYWo31cO+HV1o1k=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "BWUOLqgLBqc5NwxVlSV5H3KFQPXbCp7mdo+jF+8cJqY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "fuQb1S6xZDGlrEbK+kI23aL53PP1PVNwqICnZNt9Yzg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SfscnoibFttahLdPVC4Ee+47ewGFKpDSU7M6HX19bKE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rpSW2awybNVeKtat91VFxqbINoTfNhPfQAu+d73Xtf8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "9M/CP9ccOIIj2LLFmE0GFDO0Ban2wsNalEXfM6+h+1s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "WrEMG49l1ye4MhXs5ZS9tz8P6h+hDvthIg/2wW9ne1Q=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ImNhbfeyfH8qIEeA5ic0s3dAQBdzzTBS+CPsNih9vZ0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dWP33YDSn04UKJN2ogh2Rui0iW/0q2y18OCDRVcfyoo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lYv0isAtfGh6H9tdp3cp2eHU7q2J+uk7QrgcxtK3w7Y=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "VGMoamB/+7zTOYcY/pqJc96xlv2PdW4hwsIAEIslTDQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yNeBWMF7BnD9wVwz2PgJsvWr77QiVvvWUvJF0+fqBug=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SfpvObJ+tJBXSvqeN7vlOfmhYign635lciYAJIjUtY8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dsen4NqjzVGjpjufiTMs3+gqeD09EbnuogPgxrJECwg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pxCWVM3sn19NsFEpgHbgLa+PmYlhN3mMiP0Wk8kJhYw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q11KNvJszjYIB9n9HcC+N4uz11a3eRj1L3BH9scKMDQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "A1PmkgcEToWh1JiVWE6mI5jUu7poxWWuCUt/cgRUUDc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "qJo3Hu4PJeanL7XEaWXO/n3YsodhZyd+MJOOmB9Kpd8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "BkBKLO8URFscfRY9Bav/1+L9mLohDgNr/MkZtGiraIs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rZq5WA3Hx3xthOyHAJXK//f8pE2qbz7YKu3TIMp9GFY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "X07a/Lm80p5xd4RFs1dNmw+90tmPDPdGiAKVZkxd4zY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6YrBn2ofIw1b5ooakrLOwF41BWrps8OO0H9WH4/rtlE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "0l86Ag5OszXpa78SlOUV3K9nff5iC1p0mRXtLg9M1s4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Hn6yuxFHodeyu7ISlhYrbSf9pTiH4TDEvbYLWjTwFO0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zdf4y2etKBuIpkEU1zMwoCkCsdisfXZCh8QPamm+drY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rOQ9oMdiK5xxGH+jPzOvwVqdGGnF3+HkJXxn81s6hp4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "61aKKsE3+BJHHWYvs3xSIBvlRmKswmaOo5rygQJguUg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "KuDb/GIzqDM8wv7m7m8AECiWJbae5EKKtJRugZx7kR0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Q+t8t2TmNUiCIorVr9F3AlVnX+Mpt2ZYvN+s8UGict8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tJRZIpKxUgHyL83kW8cvfjkxN3z6WoNnUg+SQw+LK+k=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pnUsYjip8SvW0+m9mR5WWTkpK+p6uwJ6yBUAlBnFKMk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "PArHlz+yPRYDycAP/PgnI/AkP8Wgmfg++Vf4UG1Bf0E=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wnIh53Q3jeK8jEBe1n8kJLa89/H0BxO26ZU8SRIAs9Q=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "4F8U59gzBLGhq58PEWQk2nch+R0Va7eTUoxMneReUIA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ihKagIW3uT1dm22ROr/g5QaCpxZVj2+Fs/YSdM2Noco=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "EJtUOOwjkrPUi9mavYAi+Gom9Y2DuFll7aDwo4mq0M0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dIkr8dbaVRQFskAVT6B286BbcBBt1pZPEOcTZqk4ZcI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "aYVAcZYkH/Tieoa1XOjE/zCy5AJcVTHjS0NG2QB7muA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "sBidL6y8TenseetpioIAAtn0lK/7C8MoW4JXpVYi3z8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "0Dd2klU/t4R86c2WJcJDAd57k/N7OjvYSO5Vf8KH8sw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "I3jZ92WEVmZmgaIkLbuWhBxl7EM6bEjiEttgBJunArA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "aGHoQMlgJoGvArjfIbc3nnkoc8SWBxcrN7hSmjMRzos=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "bpiWPnF/KVBQr5F6MEwc5ZZayzIRvQOLDAm4ntwOi8g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tI7QVKbE6avWgDD9h4QKyFlnTxFCwd2iLySKakxNR/I=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "XGsge0CnoaXgE3rcpKm8AEeku5QVfokS3kcI+JKV1lk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JQxlryW2Q5WOwfrjAnaZxDvC83Dg6sjRVP5zegf2WiM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YFuHKJOfoqp1iGVxoFjx7bLYgVdsN4GuUFxEgO9HJ5s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Z6vUdiCR18ylKomf08uxcQHeRtmyav7/Ecvzz4av3k4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SPGo1Ib5AiP/tSllL7Z5PAypvnKdwJLzt8imfIMSEJQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "m94Nh6PFFQFLIib9Cu5LAKavhXnagSHG6F5EF8lD96I=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pfEkQI98mB+gm1+JbmVurPAODMFPJ4E8DnqfVyUWbSo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "DNj3OVRLbr43s0vd+rgWghOL3FqeO/60npdojC8Ry/M=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kAYIQrjHVu49W8FTxyxJeiLVRWWjC9fPcBn+Hx1F+Ss=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "aCSO7UVOpoQvu/iridarxkxV1SVxU1i9HVSYXUAeXk4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Gh6hTP/yj1IKlXQ+Q69KTfMlGZjEcXoRLGbQHNFo/1s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "/gDgIFQ4tAlJk3GN48IS5Qa5IPmErwGk8CHxAbp6gs0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "PICyimwPjxpusyKxNssOOwUotAUbygpyEtORsVGXT8g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "4lu+cBHyAUvuxC6JUNyHLzHsCogGSWFFnUCkDwfQdgI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pSndkmoNUJwXjgkbkgOrT5f9nSvuoMEZOkwAN9ElRaE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tyW+D4i26QihNM5MuBM+wnt5AdWGSJaJ4X5ydc9iWTU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "9Syjr8RoxUgPKr+O5rsCu07AvcebA4P8IVKyS1NVLWc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "67tPfDYnK2tmrioI51fOBG0ygajcV0pLo5+Zm/rEW7U=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "y0EiPRxYTuS1eVTIaPQUQBBxwkyxNckbePvKgChwd0M=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "NWd+2veAaeXQgR3vCvzlI4R1WW67D5YsVLdoXfdb8qg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "PY5RQqKQsL2GqBBSPNOEVpojNFRX/NijCghIpxD6CZk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lcvwTyEjFlssCJtdjRpdN6oY+C7bxZY+WA+QAqzj9zg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CWE7XRNylvTwO/9Fv56dNqUaQWMmESNS/GNIwgBaEI0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ijwlrUeS8nRYqK1F8kiCYF0mNDolEZS+/lJO1Lg93C8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "8KzV+qYGYuIjoNj8eEpnTuHrMYuhzphl80rS6wrODuU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wDyTLjSEFF895hSQsHvmoEQVS6KIkZOtq1c9dVogm9I=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SGrtPuMYCjUrfKF0Pq/thdaQzmGBMUvlwN3ORIu9tHU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "KySHON3hIoUk4xWcwTqk6IL0kgjzjxgMBObVIkCGvk4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hBIdS9j0XJPeT4ot73ngELkpUoSixvRBvdOL9z48jY8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Tx6um0q9HjS5ZvlFhvukpI6ORnyrXMWVW1OoxvgqII0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zFKlyfX5H81+d4A4J3FKn4T5JfG+OWtR06ddyX4Mxas=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cGgCDuPV7MeMMYEDpgOupqyNP4BQ4H7rBnd2QygumgM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "IPaUoy98v11EoglTpJ4kBlEawoZ8y7BPwzjLYBpkvHQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Pfo4Am6tOWAyZNn8G9W5HWWGC3ZWmX0igI/RRB870Ro=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "fnTSjd7bC1Udoq6iM7UDnHAC/lsIXSHp/Gy332qw+/I=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "fApBgVRrTDyEumkeWs5p3ag9KB48SbU4Si0dl7Ns9rc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "QxudfBItgoCnUj5NXVnSmWH3HK76YtKkMmzn4lyyUYY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "sSOvwhKa29Wq94bZ5jGIiJQGbG1uBrKSBfOYBz/oZeI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FdaMgwwJ0NKsqmPZLC5oE+/0D74Dfpvig3LaI5yW5Fs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "sRWBy12IERN43BSZIrnBfC9+zFBUdvjTlkqIH81NGt4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "/4tIRpxKhoOwnXAiFn1Z7Xmric4USOIfKvTYQXk3QTc=",
+ "subType": "00"
+ }
+ }
+ ]
+ },
+ {
+ "_id": {
+ "$numberInt": "1"
+ },
+ "encryptedDecimal": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "bE1vqWj3KNyM7cCYUv/cnYm8BPaUL3eMp5syTHq6NF4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RGTjNVEsNJb+DG7DpPOam8rQWD5HZAMpRyiTQaw7tk8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "I93Md7QNPGmEEGYU1+VVCqBPBEvXdqHPtTJtMOn06Yk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "GecBFQ1PemlECWZWCl7f74vmsL6eB6mzQ9n6tK6FYfs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "QpjhZl+O1ORifgtCZuWAdcP6OKL7IZ2cA46v8FJcV28=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RlQWwhU+uVv0a+9IB5cUkEfvHBvOw3B1Sx6WfPWMqes=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ubb81XTC7U+4tcNzf1oYvOY6gR5hC2Izqx54f4GuJ0E=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6M4Q5NMQ9TqNnjzGOxIkiUIY8TEL0I3XD1QnhefQUqU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "BtInzk9t2FFMCEY6AQ7zN8jwrrZEs2irSv6q0Q4NaIw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6vxXfETu9cuBIpRBo3jUUU04mJIH/aAhLX8K6VI5Xv0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wXPCdS+q23zi1bkPnaVG2j0PsVtxdeSLJ//h6J1x8RU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "KY3KkfBAsN2l80wbpj41G0gwBR5KmmFnZcagg7D3ENk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tI8NFAxXCX4VOnY5X73K6KI/Yspd3aR94KV39MhJlAw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "nFxH0UC3mATKA6Vboz+QX/hAjj19kF/SH6H5Cne7qC0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q8hYqIYaIi7nOdG/7qQZYnz8Bsacfi66M1nVku4SH08=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "4saA92R4arp4anvD9xFtze+sNcQqTEhPHyl1h70A8NE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "DbIziOBRRyeQS6RtBR09E37LV+CTKrEjGoRMLSpG6eE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Fv80Plp/7w2gnVqrwawLd6qhJ10G4NCDm3re67cNq4Y=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "T/T2oiQCBBES4YN7EodzPRdabZSFlYIClHBym+bQUZE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ZQgHD3l46Ujqtbnj1VbbeM29C9wJzOhz+yZ/7XdSrxk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ltlFKzWvyZvHxDFOYDd/XXJ6kUiJj0ln2HTCEz2o4Z4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "flW8A7bltC1u8bzx0WJtxosGJdOVsJFfbx33jxnpFGg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SXO+92QbMKwUSG2t27ciunV1c3VvFkUuDmSczpRe008=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+KioGs1GM+xRBzFE67ePTWj04KMSE5/Y6qUF7nJ5kvU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "L3xNVbh6YH+RzqABN+5Jgb7T234Efpn766DmUvxIxgg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hPF+60mBYPjh21dEmPlBhKgyc9S2qLtTkypYvnqP2Fc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "EletRsETy2HcjaPIm2c8CkT7ch/P3pJJDC8hasepcSU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "r5bMXUaNKqLPxZ+TG9HYTG4aSDgcpim27rN8rQFkM0w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "0Q7Erdr8+/S0wUEDDIqlS5XjBVWvhZY65K0uUDb6+Ns=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xEcnhXy35hbXNVBPOOt3TUHbxvKfQ48KjA9b6/rbMqQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "T8bEpiQNgsEudXvyKE9SZlSvbpV/LUaslsdqgSFltyo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hIoiaF2YjnxDbODfhFEB+JGZ5nf8suD3Shck5bwQ3N0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "qnA6qzejeRJ0rsZaZ0zOvKAaXyxt5lpscKQNYFZNl4k=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "anAKCL2DN/le2VaP0n2ucYSEH/DaaEH/8Sa4OqTZsRA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JCZlBJaFm618oWYSnT9Jr1MtwFVw4BZjOzO+5yWgR90=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yxyk4n9762WzcDVGnTn4jCqUnSMIVCrLDIjCX1QVj34=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "fDI6fdKvDJwim5/CQwWZEzcrXE3LHgy7FTtffcC7tXE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Vex+gcz5T+WkzsVZQrkqUR2ryyZbnaOGuWpYvjN0zCw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "8TLEXz+Gbbp6llHpZXVjLsdlYY9f6hrKpHVpyfDe0RY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "7fTyt5BrunypS65TfOzFW2E2qdIuT4SLeDeGlbQoJCs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "8fKGrkqN0/KuSjyXgDBmRauDKrSa//JBKRWHEB9xBf4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "s4codmG7uN4ss6P357jL21lazEe90M9GOK5WrOknSV0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RkSpua8XF+NUdxVDU90EbLUTTyZFX3tt3atBTroFaRk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "LnTCuCDyAHK5B9KXzjtwGmWB+qergQk2OCjnIx9MI2A=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cBFh0virAX4pVXf/udIGI2951i0+0aZAdJcBVGtYnT4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "G54X6myQXWZ5fw/G31en3QbdgfXzL9+hFTtJpnWMqDI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "EdsiiuezcsFJFnYIyGjCOhnqMj1BOwTB5EFxN+ERUkg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dVH9MXLtk0WTwGQ3xmrhOqfropMUkDW3o6paNPGl3NU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "sB3HqXKWY3pKbuEH8BTbfNIGfbY+7/ZbOc3XC+JRNNI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "WHyDk62Xhqbo4/iie2aLIM4x2uuAjv6102dJSHI58oM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pNUFuHpeNRDUZ/NrtII2c6sNc9eGR1lIUlIyXKERA+0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "UPa+pdCqnN0bfAptdzldQOSd01gidrDKy8KhWrpSKAI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "l+7dOAlo+HUffMqFYXL6pgUFeTbwOM9CjKQLxEoLtc4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SRnDXV/rN6C8xwMutv9E1luv3DOUio3VkgPr8Cpm7Ew=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "QcH6gl+gX7xZ7OWhUNQMbndJy0Piz49pDo6RsnLkVSA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "t+uL4DnfsI/Zll/KXWW1cOKX3Hu8WIkm3pt9efCVSAQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "myutHDctku/+Uug/nD8gRbYvmx/IovtoAAC2/fz2oHA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6C+cjD0e0nSCP6cPqQYbNG7SlOd6Mfvi8hyfm7Ng+D8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zg01JSoOj9oBKT0S1ldJucXzY5AKgreS+h2xJreWTOs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "7qQ80/FjodHl1m1py/Oii0/9C/xWbLdhaRXQ+kkCP10=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YwWMNH07vL6c5Nhg+MRnVByhzUunu8y0VLM9z/XvR5U=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Dle8bU98+fudAbc14SToZFkwvV3tcYVsjDug0NWljpc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "J+eKL1vPJmlzltvhI6Li5Fz/TJmi3Ng+ehRTcs46API=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zB3XzfFygLwC3WHkj0up+VbEd25KKoce1vOpG/5bwK4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "vnVnmOnL+z2pqwE+A6cVKS0Iwy4F4/2IiElJca9bUQM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+lG5r/Fpqry3BtFuvY67+RntmHAMDoLVOSGc6ZoXPb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "L5MXQertqc6uj7ADe8aWKbd1sYHPCE7P1VYVg9Zc3VI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "imKONuZgopt0bhM3GMX2WVPwQYMTobuUUEdhcLfHs4c=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "eOkU1J1uVbiVFWBerbXsSIVcF2nqiicTkFy4x7kFHB8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "gI0uDhXeoH/UatDQKEf4qo8FHzWZDhb/wuWTqbq/ID4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cOkd5Aa3btYhtojE/smsF/PJnULqQ4NNqTkU6KXTFmo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "AWNJMs1MTe294oFipp8Y6P0CjpkZ4qCZoClQF3XcHq8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6gJtlzXOFhGYrVbTuRMmvMlDTwXdNtR9aGBlHZPwIMw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "LEmwVGA/xsEG7UrcOoYLFu6KCXgijzFznenknuDacm8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "mIRFPTXRrGaPtp/Ydij2jgkRe4uoUvAKxW2d8b9zYL0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "B+Uv2u48WALOO0L311z+eryjYQzKJVMfdHMZPhOAFmY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "INXXp0wDyVCq+NtfIrrC2ciETmyW/dWB/48/u4yLEZ4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "se7DGo8XrlrQDLEcco1tZrQt9kDe+0RTyl2bw/quG4w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "vr0m2+Zk9lbN6UgWCyn8xJWJOokU3IDYab5U5q1+CgQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "XI+eJ8Gy2JktG1gICgoj1qpsfy1tKmH0kglWbaQH6DA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "A+UCuNnuAUqnQzspA6TVqUPRmtZmpSex5HFw7THRxs0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xaH2Ehfljd19uo0Fvb3iwkdaiWEVQd2YPoitgEPkhSM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "S/iZBJGcc8+qZxyMtab65MMBoSglybwk3x58Nb86gnY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "w14ZE5qqY5YgkS4Zcs9YNbrQbY1XfGOOHNn9bOYnFVQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "0MhGd/jEF1vjkKGp+ZMn9SjLK54jkp9W4Hg+Sp/oxaI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "92QZ73e/NRTYgCm4aifaKth6aAsKnLLccBc0zx/qUTY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "WOjzemCgFJOiGIp81RSVh/tFlzSTj9eFWcBnsiv2Ycs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "DrsP9CmfKPjw5yLL8bnSeAxfNzAwlb+Z8OqCiKgBY7o=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lMogqg8veBv6mri3/drMe9afJiKMvevkmGcw9BedfLo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "TxqwNcY8Tg2MPpNdkPBwvfpuTttSYRHU26DGECKYQ9o=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "l0u1b4b4vYACWIwfnB7PZac4oDEgjQZCzHruNPTgAIY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "iVSGQ+cCfhbWIrY/v/WBORK92elu9gfRKyGhr6r/k00=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yK1forG50diEXte8ECzjfpHeYsPyuQ/dgxbxn/nzY5k=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "gIfTLCD3VwnOwkC0zPXWTqaITxX6ZplA69PO2a6zolc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "O/Zxlgh3WqpzJ7+Sd8XWMVID4/GXJUUWaSqfgDUi3b0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ZQ6yv368zwahUqSUYH/StL0Qgz/TwS1CzlMjVDvCciI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "m2rPEYkjwyiKdonMrKlcF7hya4lFOAUwEePJ3SgrNx8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Mq0yl5iVKlq71bT/dT/fXOWf2n90bTnXFnOdGDN0JOc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6qDGMXipPLC2O6EAAMjO2F9xx4rdqZso4IkPpH2304U=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "jvQHRQQa2RIszE2LX2Hv2LbRhYawJ6qmtRt8HZzFQXg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ovJXQrkZlpeHRciKyE/WWNm5O389gRgzx1W+Dw596X4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "a4kgRNvYctGYqyQv9qScL/WkljTYVylJ9pE9KDULlxU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "qV4Q48vPiCJMTjljotzYKI/zfExWpkKOSHGcAjGyDig=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "jtI7zbBF+QW/aYYTkn90zzyHLXLgmy7l1bzgMb2oqic=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q0KmJl9txPdn962UNvnfe6UFhdk9YaFZuTm33F+csso=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ULNdEqeZJgtmNOhN/Y9INzsE9AnxWYwOMn+pIbRXIFs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "R4oz9+wkdjpKe5tE1jpG7IURAnfvS5fLP4LrD5cZfTE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "qG5Z7VhwSu/HT/YFTgDzyAAzJKq51xPw2HeEV5btYC4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "OM/1DmIIZ5Qyhtq8TGkHTBEMVKjAnKRZMRXYtTG8ctc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "2R5vZbljLXnDFA99YfGuRB7pAdPJVKsT25zLNMC0fUk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "OMbavF2EmdAz1fHkLV3ctFEUDfriKhoT2gidwHZ9z1o=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "MWT4Zrw3/vVvTYMa1Is5Pjr3wEwnBfnEAPPUAHKQhNU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tBkRPfG9yxfKocQx5pAJX0oEHKPL0Tgtr+0UYe09InE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lqxpnDR/H0YgH7RcfKoNoaaRhe1SIazIeMbQ1fu9y3Q=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "utT1UdR22PWOTrOkZauztX613lAplV4eh/ejTRb7ZSk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "S+Y2yFyKi/a6FXhih4yGo29X8I8OT6/zwEoX6NMKT4o=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "QSjVppg29x6oS5yBg8OFjrFt0tuTpWCuKxfIy0k8YnE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "y3r6/Xsfvsl3HksXlVYkJgHUqpQGfICxg3x9f8Zw1qM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "BSltHzEwDjFN4du9rDHAPvl22atlcTioEtt+gC5L1tk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "0arGXjSN0006UnXbrWsGqhvBair569DeFDUME3Df3rA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "s/DumaMad08S+PBUUcrS+v42K0z8HgcdiQtrFAEu2Qs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "EzJ8Y8N0OQBTlnvrK82PdevDNZZO4E6CNgYVu8Cj6Ks=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "VA4vr8jBPI5QdiPrULzzZjBMIUbG3V7Slg5zm0bFcKc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YAOvEB2ZLtq9LQiFViBHWaxxWVVonC2rNYj9tN9s3L0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hgaHMo9aAGS+nBwvqnTjZO+YkiQPY1c1XcIYeaYKHyI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YvaoLt3ZpH0atB0tNzwMjpoxRYJXl0DqSjisMJiGVBE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "EMmW6CptFsiLoPOi5/uAJQ2FmeLg6mCpuVLLrRWk7Mc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "1jQsNMarSnarlYmXEuoFokeBMg/090qUD9wqo1Zn8Gs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hupXNKhRpJxpyDAAP1TgJ5JMZh9lhbMk6s7D7dMS3C8=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ ]
+}
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-Decimal-InsertFind.yml b/specifications/client-side-encryption/tests/legacy/fle2-Range-Decimal-InsertFind.yml
new file mode 100644
index 00000000000..48d44264a84
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-Decimal-InsertFind.yml
@@ -0,0 +1,1666 @@
+# Requires libmongocrypt 1.7.0.
+runOn:
+ - minServerVersion: "6.2.0"
+ # FLE 2 Encrypted collections are not supported on standalone.
+ # Tests for Decimal (without precision) must only run against a replica set. Decimal (without precision) queries are expected to take a long time and may exceed the default mongos timeout.
+ topology: [ "replicaset" ]
+database_name: &database_name "default"
+collection_name: &collection_name "default"
+data: []
+encrypted_fields: &encrypted_fields {'escCollection': 'enxcol_.default.esc', 'eccCollection': 'enxcol_.default.ecc', 'ecocCollection': 'enxcol_.default.ecoc', 'fields': [{'keyId': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'path': 'encryptedDecimal', 'bsonType': 'decimal', 'queries': {'queryType': 'rangePreview', 'contention': {'$numberLong': '0'}, 'sparsity': {'$numberLong': '1'}}}]}
+key_vault_data: [ {'_id': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'keyMaterial': {'$binary': {'base64': 'sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==', 'subType': '00'}}, 'creationDate': {'$date': {'$numberLong': '1648914851981'}}, 'updateDate': {'$date': {'$numberLong': '1648914851981'}}, 'status': {'$numberInt': '0'}, 'masterKey': {'provider': 'local'}} ]
+tests:
+ - description: "FLE2 Range Decimal. Insert and Find."
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments:
+ document: &doc0 { _id: 0, encryptedDecimal: { $numberDecimal: "0" } }
+ - name: insertOne
+ arguments:
+ document: &doc1 { _id: 1, encryptedDecimal: { $numberDecimal: "1" } }
+ - name: find
+ arguments:
+ filter: { encryptedDecimal: { $gt: { $numberDecimal: "0" } } }
+ result: [*doc1]
+ expectations:
+ - command_started_event:
+ command:
+ listCollections: 1
+ filter:
+ name: *collection_name
+ command_name: listCollections
+ - command_started_event:
+ command:
+ find: datakeys
+ filter: {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ }
+ $db: keyvault
+ readConcern: { level: "majority" }
+ command_name: find
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc0_encrypted { "_id": 0, "encryptedDecimal": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc1_encrypted { "_id": 1, "encryptedDecimal": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ find: *collection_name
+ filter:
+ "encryptedDecimal": {
+ "$gt": {
+ "$binary": {
+ "base64": "CgljAAADcGF5bG9hZADZYgAABGcAnWIAAAMwAH0AAAAFZAAgAAAAAJu2KgiI8vM+kz9qD3ZQzFQY5qbgYqCqHG5R4jAlnlwXBXMAIAAAAAAAUXxFXsz764T79sGCdhxvNd5b6E/9p61FonsHyEIhogVjACAAAAAAeEtIU/sp7zwjA/VArYkCzkUUiRiQOmlTaVZvfUqbEp0AAzEAfQAAAAVkACAAAAAAPQPvL0ARjujSv2Rkm8r7spVsgeC1K3FWcskGGZ3OdDIFcwAgAAAAACgNn660GmefR8jLqzgR1u5O+Uocx9GyEHiBqVGko5FZBWMAIAAAAACMKx1UyNAN4yVafFht8jp4w4LNaJcLhnozfSMzDHD3owADMgB9AAAABWQAIAAAAAD2Zi6kcxmaD2mY3VWrP+wYJMPg6cSBIYPapxaFQxYFdQVzACAAAAAAM/cV36BLBY3xFBXsXJY8M9EHHOc/qrmdc2CJmj3M89gFYwAgAAAAAHdek2wlAQ5BQORVjudyziRTV0EKx8qbsnoDiw4HG2xaAAMzAH0AAAAFZAAgAAAAAOaNqI9srQ/mI9gwbk+VkizGBBH/PPWOVusgnfPk3tY1BXMAIAAAAAAc96O/pwKCmHCagT6T/QV/wz4vqO+R22GsZ1dse2Vg6QVjACAAAAAA3tld+twIlVWnCTXElspau5k02CwxXDjh+3u1CQtV/W4AAzQAfQAAAAVkACAAAAAA0XlQgy/Yu97EQOjronl9b3dcR1DFn3deuVhtTLbJZHkFcwAgAAAAACoMnpVl6EFJak8A+t5N4RFnQhkQEBnNAx8wDqmq5U/dBWMAIAAAAABRmXIchytMNz4J439viiY5FZ1OB3AXJBkZ3udUqHpsqAADNQB9AAAABWQAIAAAAAAOtpNexRxfv0yRFvZO9DhlkpU4mDuAb8ykdLnE5Vf1VAVzACAAAAAAeblFKm/30orP16uQpZslvsoS8s0xfNPIBlw3VkHeekYFYwAgAAAAAJQdzGMO2s1AkdKz3ZPytivrQphUFVhvhMcXjvUGzHBDAAM2AH0AAAAFZAAgAAAAAIr8xAFm1zPmrvW4Vy5Ct0W8FxMmyPmFzdWVzesBhAJFBXMAIAAAAABYeeXjJEzTHwxab6pUiCRiZjxgtN59a1y8Szy3hfkg+gVjACAAAAAA161loizzKvXS1Po/3bxeNICmKpsPSK9Q+EpkISK3jVoAAzcAfQAAAAVkACAAAAAAl+ibLk0/+EwoqeC8S8cGgAtjtpQWGEZDsybMPnrrkwEFcwAgAAAAAHPPBudWgQ+HUorLDpJMqhS9VBF2VF5aLcxgrM1s+yU7BWMAIAAAAAACyakB3CZWEjbxK0u9Sflc3+EafBAQFbvBpCxKvxuEQAADOAB9AAAABWQAIAAAAACR9erwLTb+tcWFZgJ2MEfM0PKI9uuwIjDTHADRFgD+SQVzACAAAAAAcOop8TXsGUVQoKhzUllMYWxL93xCOkwtIpV8Q6hiSYYFYwAgAAAAAJ43998lzKoVqWm99ZzKHJLeVscGNCVoKDvpUtt2rDI9AAM5AH0AAAAFZAAgAAAAALv0vCPgh7QpmM8Ug6ad5ioZJCh7pLMdT8FYyQioBQ6KBXMAIAAAAADsCPyIG8t6ApQkRk1fX/sfc1kpuWCWP8gAEpnYoBSHrQVjACAAAAAAj2h1WLr0EFEFZ31djx3BtLIbAtdE05ax54opkJo4/bQAAzEwAH0AAAAFZAAgAAAAAIW4AxJgYoM0pcNTwk1RSbyjZGIqgKL1hcTJmNrnZmoPBXMAIAAAAAAZpfx3EFO0vY0f1eHnE0PazgqeNDTaj+pPJMUNW8lFrAVjACAAAAAAqFD83E8POmo6pdqg7D+jWtngbgcV99mbQBxkbpX7ds4AAzExAH0AAAAFZAAgAAAAAKliO6L9zgeuufjj174hvmQGNRbmYYs9yAirL7OxwEW3BXMAIAAAAAAqU7vs3DWUQ95Eq8OejwWnD0GuXd+ASi/uD6S0l8MM1QVjACAAAAAAp0cwpAh7SiuStPwYNVvp83N5GWyWRWA7UGRxHDDj8g8AAzEyAH0AAAAFZAAgAAAAAOGQcCBkk+j/Kzjt/Cs6g3BZPJG81wIHBS8JewHGpgk+BXMAIAAAAABjrxZXWCkdzrExwCgyHaafuPSQ4V4x2k9kUCAqUaYKDQVjACAAAAAAJr/tEuxScrJJEMECy4itHf1y5+gO2l5sBjgM/EOLXw0AAzEzAH0AAAAFZAAgAAAAAPmCNEt4t97waOSd5hNi2fNCdWEkmcFJ37LI9k4Az4/5BXMAIAAAAABX7DuDPNg+duvELf3NbLWkPMFw2HGLgWGHyVWcPvSNCAVjACAAAAAAeNCEn5Z3A5CgCnIgaBl2N8p0t+5rRY06vGg6ePVMaTUAAzE0AH0AAAAFZAAgAAAAAD4vtVUYRNB+FD9yoQ2FVJH3nMeJeKbi6eZfth638YqbBXMAIAAAAAANCuUB4OdmuD6LaDK2f3vaqfgYYvg40wDXOBbcFjTqLwVjACAAAAAATozHsao4er/Uk5H/pKe/1JEo/3h4Pgah2RgJHXf2PeYAAzE1AH0AAAAFZAAgAAAAAJPIRzjmTjbdIvshG6UslbEOd797ZSIdjGAhGWxVQvK1BXMAIAAAAABgmJ0Jh8WLs9IYs/a7DBjDWd8J3thW/AGJK7zDnMeYOAVjACAAAAAAtD48LbnCkTvacfz8DvR1ixsbYceiJxJRV7tLqDUWvVwAAzE2AH0AAAAFZAAgAAAAAABQyKQPoW8wGPIqnsTv69+DzIdRkohRhOhDmyVHkw9WBXMAIAAAAAAqWA2X4tB/h3O1Xlawtz6ndI6WaTwgU1QYflL35opu5gVjACAAAAAAphx2eRFGSW/tm3HxilqRv5Zj5TtOy4KSGiCIm6yJANYAAzE3AH0AAAAFZAAgAAAAACB7NOyGQ1Id3MYnxtBXqyZ5Ul/lHH6p1b10U63DfT6bBXMAIAAAAADpOryIcndxztkHSfLN3Kzq29sD8djS0PspDSqERMqokQVjACAAAAAAIHYCljTfUu/Ox23Nrjz2Z6cqQpn4s0sJV/SxkC9UtIEAAzE4AH0AAAAFZAAgAAAAAKVfXLfs8XA14CRTB56oZwV+bFJN5BHraTXbqEXZDmTkBXMAIAAAAAASRWTsfGOpqdffiOodoqIgBzG/yzFyjR5CfUsIUIWGpgVjACAAAAAAGs7l0GsFNkQMcJBUuUsEOMuQupbEvi7MDcezspsCY3EAAzE5AH0AAAAFZAAgAAAAAH/aZr4EuS0/noQR9rcF8vwoaxnxrwgOsSJ0ys8PkHhGBXMAIAAAAACd7ObGQW7qfddcvyxRTkPuvq/PHu7+6I5dxwS1Lzy5XAVjACAAAAAAWnfsbdu5Qvb62rEpBR90qh+3jdYfp266dmuNPLoXys4AAzIwAH0AAAAFZAAgAAAAAKvlcpFFNq0oA+urq3w6d80PK1HHHw0H0yVWvU9aHijXBXMAIAAAAADWnAHQ5Fhlcjawki7kWzdqjM2f6IdGJblojrYElWjsZgVjACAAAAAAdNxswYIMjqVta8sLC8wniMm6gOgIgG5eWTPAxItBJJ4AAzIxAH0AAAAFZAAgAAAAAH/2aMezEOddrq+dNOkDrdqf13h2ttOnexZsJxG1G6PNBXMAIAAAAABNtgnibjC4VKy5poYjvdsBBnVvDTF/4mmEAxsXVgZVKgVjACAAAAAArWXr2Myg8T8/0eYBCUXDOsIR//zqZtlE6Lb1YZJkvYcAAzIyAH0AAAAFZAAgAAAAAF2wZoDL6/V59QqO8vdRZWDpXpkV4h4KOCSn5e7x7nmzBXMAIAAAAADLZBu7LCYjbThaVUqMK14H/elrVOYIKJQCx4C9Yjw37gVjACAAAAAAWeF6F8pBeCm27PWjQGrlyN7JHp9WqCNnwFzqZ+V51t0AAzIzAH0AAAAFZAAgAAAAAH27yYaLn9zh2CpvaoomUPercSfJRUmBY6XFqmhcXi9QBXMAIAAAAAAUwumVlIYIs9JhDhSj0R0+59psCMsFk94E62VxkPt42QVjACAAAAAAjbsmlVrfexmULer3RtGwnOf20pF0xv4Z46OHOaIwgzEAAzI0AH0AAAAFZAAgAAAAALMg2kNAO4AFFs/mW3In04yFeN4AP6Vo0klyUoT06RquBXMAIAAAAAAgGWJbeIdwlpqXCyVIYSs0dt54Rfc8JF4b8uYc+YUj0AVjACAAAAAAsNKKan8cMW1oYFmQiyPZbepuJlDD0/CQUS21++CP16kAAzI1AH0AAAAFZAAgAAAAALas/i1T2DFCEmrrLEi7O2ngJZyFHialOoedVXS+OjenBXMAIAAAAAA1kK0QxY4REcGxHeMkgumyF7iwlsRFtw9MlbSSoQY7uAVjACAAAAAAUGZ/BwF6Q9hcFBC8F5ed6RwYWJ1/OahRwljBloMgkFAAAzI2AH0AAAAFZAAgAAAAAP1TejmWg1CEuNSMt6NUgeQ5lT+oBoeyF7d2l5xQrbXWBXMAIAAAAABPX0kj6obggdJShmqtVfueKHplH4ZrXusiwrRDHMOKeQVjACAAAAAApU9zcPAQ2xOspmwhjWN90v2m2clQ4rk7WBmm/nUyOHQAAzI3AH0AAAAFZAAgAAAAAMrKn+QPa/NxYezNhlOX9nyEkN1kE/gW7EuZkVqYl0b8BXMAIAAAAABUoZMSPUywRGfX2EEencJEKH5x/P9ySUVrhStAwgR/LgVjACAAAAAAl/hDhauhBkda/I/kLr/XLxyso2guawC2isj+tDQhfMoAAzI4AH0AAAAFZAAgAAAAAMmD1+a+oVbiUZd1HuZqdgtdVsVKwuWAn3/M1B6QGBM3BXMAIAAAAACLyytOYuZ9WEsIrrtJbXUx4QgipbaAbmlJvSZVkGi0CAVjACAAAAAAVKbMdxvkfCBoqJCUVjLrtKF90a80LocckdFc7LvYuWIAAzI5AH0AAAAFZAAgAAAAAOVKV7IuFwmYP1qVv8h0NvJmfPICu8yQhzjG7oJdTLDoBXMAIAAAAABL70XLfQLKRsw1deJ2MUvxSWKxpF/Ez73jqtbLvqbuogVjACAAAAAARiC2ShVCKMjjiqB6xg+jDIYJNhhWqmceO07EC8rEXkoAAzMwAH0AAAAFZAAgAAAAAKS/1RSAQma+xV9rz04IcdzmavtrBDjOKPM+Z2NEyYfPBXMAIAAAAAAOJDWGORDgfRv8+w5nunh41wXb2hCA0MRzwnLnQtIqPgVjACAAAAAAWU2Vw2Rta8oHxPPfOWQa86tjYWndb0E3RNlZ9gthHt0AAzMxAH0AAAAFZAAgAAAAAFeq8o82uNY1X8cH6OhdTzHNBUnCChsEDs5tm0kPBz3qBXMAIAAAAABaxMBbsaeEj/EDtr8nZfrhhhirBRPJwVamDo5WwbgvTQVjACAAAAAAqcsCyJuLvxG8STrUI1Ccaga760+4fbmIPc6bXodea0gAAzMyAH0AAAAFZAAgAAAAAI8IKIfDrohHh2cjspJHCovqroSr5N3QyVtNzFvT5+FzBXMAIAAAAABXHXteKG0DoOMmECKp6ro1MZNQvXGzqTDdZ0DUc8QfFAVjACAAAAAA47u7VuqtYJ4jt5CcGrUacopqApwpqEpIpkalvCRtul0AAzMzAH0AAAAFZAAgAAAAAJkHvm15kIu1OtAiaByj5ieWqzxiu/epK6c/9+KYIrB0BXMAIAAAAACzg5TcyANk0nes/wCJudd1BwlkWWF6zw3nGclq5v3SJQVjACAAAAAAvTQRtEYdIj2+bfJNamvrgWRoBsYYjMQx9MyuFwSfKmYAAzM0AH0AAAAFZAAgAAAAAAYSOvEWWuSg1Aym7EssNLR+xsY7e9BcwsX4JKlnSHJcBXMAIAAAAABT48eY3PXVDOjw7JpNjOe1j2JyI3LjDnQoqZ8Je5B2KgVjACAAAAAA4eLwHqiSgM1pMqjK3QFgYauOnI3emnlOK3rgQPuec4AAAzM1AH0AAAAFZAAgAAAAAGQxC9L1e9DfO5XZvX1yvc3hTLtQEdKO9FPMkyg0Y9ZABXMAIAAAAADtmcMNJwdWLxQEArMGZQyzpnu+Z5yMmPAkvgq4eAKwNQVjACAAAAAAxA7XR9Cp6671TiZesvqE/EPKVPXfGDaYuDnce+MaZw0AAzM2AH0AAAAFZAAgAAAAADLHK2LNCNRO0pv8n4fAsxwtUqCNnVK8rRgNiQfXpHSdBXMAIAAAAACf16EBIHRKD3SzjRW+LMOl+47QXA3CJhMzlcqyFRW22AVjACAAAAAA9F9Ztm39rTapXoeRmzk6eUoa3MDPatwoQD5PvD+3xGEAAzM3AH0AAAAFZAAgAAAAAHiZJiXKNF8bbukQGsdYkEi95I+FSBHy1I5/hK2uEZruBXMAIAAAAADE+lZBa8HDUJPN+bF6xI9x4N7GF9pj3vBR7y0BcfFhBAVjACAAAAAArsw2CrSC2y02EiWJxViVxlYRIXtWARpUTwO/mfqS7O4AAzM4AH0AAAAFZAAgAAAAAI1oa2OIw5TvhT14tYCGmhanUoYcCZtNbrVbeoMldHNZBXMAIAAAAAAx2nS0Ipblf2XOgBiUOuJFBupBhe7nb6QPLZlA4aMPCgVjACAAAAAAaVoGxV5YH4urmcw3Zocg+QHoq+hA0u6nIkconI0MtZoAAzM5AH0AAAAFZAAgAAAAABgTWS3Yap7Q59hii/uPPimHWXsr+DUmsqfwt/X73qsOBXMAIAAAAACKK05liW5KrmEAvtpCB1WUltruzUylDDpjea//UlWoOAVjACAAAAAAAI3iOqWSA+DpgNr/neIRpt85Q8pLS/81ZKDnbC4io/0AAzQwAH0AAAAFZAAgAAAAABOAnBPXDp6i9TISQXvcNKwGDLepZTu3cKrB4vKnSCjBBXMAIAAAAADjjzZO7UowAAvpwyG8BNOVqLCccMFk3aDK4unUeft5ywVjACAAAAAAIZqKrUcbtze/K3CUKdchuVXQYkgj6jQfIeMZ3GrtYeEAAzQxAH0AAAAFZAAgAAAAAHN8hyvT1lYrAsdiV5GBdd5jhtrAYE/KnSjw2Ka9hjz9BXMAIAAAAAD794JK7EeXBs+D7yOVK7nWF8SbZ/7U8gZ7nnT9JFNwTAVjACAAAAAAQ4K5cDGLM/2L7KbMt537tsG1eiWrboKMj6pXVfBDIBoAAzQyAH0AAAAFZAAgAAAAAO93bPrq8bsnp1AtNd9ETnXIz0lH/2HYN/vuw9wA3fyFBXMAIAAAAABHlls5fbaF2oAGqptC481XQ4eYxInTC29aElfmVZgDUgVjACAAAAAAe0oLBk+ZaipcPgjjHvACAyA42cLY8i+s+V0EsarulZkAAzQzAH0AAAAFZAAgAAAAAL1YsAZm1SA0ztU6ySIrQgCCA74V6rr0/4iIygCcaJL6BXMAIAAAAADTXWTHWovGmUR1Zg9l/Aqq9H5mOCJQQrb/Dfae7e3wKAVjACAAAAAAAeXpcv0oCp9iY/U81w+WJjFjGn60KLQEURJd/pSoaJgAAzQ0AH0AAAAFZAAgAAAAAEoFAeHk0RZ9kD+cJRD3j7PcE5gzWKnyBrF1I/MDNp5mBXMAIAAAAACgHtc2hMBRSZjKw8RAdDHK+Pi1HeyjiBuAslGVNcW5tAVjACAAAAAAmSJiRfjmuwq5cYfadeYQRkPqbGYYrMNTQeyhBEAYClEAAzQ1AH0AAAAFZAAgAAAAAAW+7DmSN/LX+/0uBVJDHIc2dhxAGz4+ehyyz8fAnNGoBXMAIAAAAAA6Ilw42EvvfLJ3Eq8Afd+FjPoPcQutZO6ltmCLEr8kxQVjACAAAAAAUHZ9EwBIvDI4PUeCOzZCuVN9g9h5Zvq2mSpmejPLBE8AAzQ2AH0AAAAFZAAgAAAAANBdV7M7kuYO3EMoQItAbXv4t2cIhfaT9V6+s4cg9djlBXMAIAAAAABvz4MIvZWxxrcJCL5qxLfFhXiUYB1OLHdKEjco94SgDgVjACAAAAAAvz1koQRh+weAUstLWz/iHxFrLReN4KtQjdEU/zrKOFsAAzQ3AH0AAAAFZAAgAAAAAMoAoiAn1kc79j5oPZtlMWHMhhgwNhLUnvqkqIFvcH1NBXMAIAAAAADcJTW7WiCyW0Z9YDUYwppXhLj4Ac1povpJvcAq+i48MQVjACAAAAAARL0k3Uwe7OUwTejHMoNwK+twNHQznmo1vVUZaH7h8BIAAzQ4AH0AAAAFZAAgAAAAACI3j5QP7dWHpcT6WO/OhsWwRJNASBYqIBDNzW8IorEyBXMAIAAAAABxUpBSjXwCKDdGP9hYU+RvyR+96kChfvyyRC4jZmztqAVjACAAAAAA93/qZqyku1BJePH5hmMWsMfuMlF7TOFZp7z2wLJNdeYAAzQ5AH0AAAAFZAAgAAAAAKsbycEuQSeNrF8Qnxqw3x3og8JmQabwGqnDbqzFRVrrBXMAIAAAAACno/3ef2JZJS93SVVzmOZSN+jjJHT8s0XYq2M46d2sLAVjACAAAAAARUbN9bbz8Balyw8pmBLg3L5dy3aQ9s8IgqpVLeQzTkUAAzUwAH0AAAAFZAAgAAAAAPXIcoO8TiULqlxzb74NFg+I8kWX5uXIDUPnh2DobIoMBXMAIAAAAADR6/drkdTpnr9g1XNvKDwtBRBdKn7c2c4ZNUVK5CThdQVjACAAAAAAnJXYvnjljaE6ajRF+h90FXzJ9EJY26D0oG9t61ZMzqgAAzUxAH0AAAAFZAAgAAAAAEa03ZOJmfHT6/nVadvIw71jVxEuIloyvxXraYEW7u7pBXMAIAAAAADzRlBJK75FLiKjz3djqcgjCLo/e3yntI3MnPS48OORhgVjACAAAAAAbFS6SmTSDF3AsPceQrRwMMRoAnzL/k5avSHlIji5zYIAAzUyAH0AAAAFZAAgAAAAAKx8NLSZUU04pSSGmHa5fh2oLHsEN5mmNMNHL95/tuC9BXMAIAAAAAA59hcXVaN3MNdHoo11OcH1aPRzHCwpVjO9mGfMz4xh3QVjACAAAAAAoIvo/iOb/eXJv7w4KSQo74DOyO4uAIO09Ba7JZw9ousAAzUzAH0AAAAFZAAgAAAAAHNKAUxUqBFNS9Ea9NgCZoXMWgwhP4x0/OvoaPRWMquXBXMAIAAAAABUZ551mnP4ZjX+PXU9ttomzuOpo427MVynpkyq+nsYCQVjACAAAAAAlCTphL00SYotztwI+txbHAFTusjh1nNbiya24rM1dUEAAzU0AH0AAAAFZAAgAAAAALfGXDlyDVcGaqtyHkLT0qpuRhJQLgCxtznazhFtuyn/BXMAIAAAAABipxlXDq14C62pXhwAeen5+syA+/C6bN4rtZYcO4zKwAVjACAAAAAA431CBTW4s3IQde024W2cz5iEnj8EJ7p07esepoVDxmQAAzU1AH0AAAAFZAAgAAAAANoEr8sheJjg4UCfBkuUzarU9NFoy1xwbXjs5ifVDeA9BXMAIAAAAABPoyTf6M+xeZVGES4aNzVlq7LgjqZXJ/QunjYVusGUEAVjACAAAAAAywuLdjJJuXewOXMAr25GMBEif8+P74+pGaENUn+XIB8AAzU2AH0AAAAFZAAgAAAAAKvDiK+xjlBe1uQ3SZTNQl2lClIIvpP/5CHwY6Kb3WlgBXMAIAAAAAANnxImq5MFbWaRBHdJp+yD09bVlcFtiFDYsy1eDZj+iQVjACAAAAAAvwntX1RgeNfp5oiD+r3sAKIbMGy1yEblODDYWec1xuIAAzU3AH0AAAAFZAAgAAAAAF49IlFH9RmSUSvUQpEPUedEksrQUcjsOv44nMkwXhjzBXMAIAAAAADJtWGbk0bZzmk20obz+mNsp86UCu/nLLlbg7ppxYn7PgVjACAAAAAAKW8QTERGXwh6fE4gJsULcmu80B4BMkMaZR9USn/C6RgAAzU4AH0AAAAFZAAgAAAAAOuSJyuvz50lp3BzXlFKnq62QkN2quNU1Gq1IDsnFoJCBXMAIAAAAAAqavH1d93XV3IzshWlMnzznucadBF0ND092/2ApI1AcAVjACAAAAAAmVcLt9hf9/q+2O3K4cvFAsvnCsSofHZ5iTzIaR5YKFIAAzU5AH0AAAAFZAAgAAAAALtgC4Whb4ZdkCiI30zY6fwlsxSa7lEaOAU3SfUXr02XBXMAIAAAAACgdZ6U1ZVgUaZZwbIaCdlANpCw6TZV0bwg3DS1NC/mnAVjACAAAAAAYJOnAwVW0gPl1jkCxAL1ZAhKkJ1+ShfwyaIaipflCegAAzYwAH0AAAAFZAAgAAAAAF6PfplcGp6vek1ThwenMHVkbZgrc/dHgdsgx1VdPqZ5BXMAIAAAAACha3qhWkqmuwJSEXPozDO8y1ZdRLyzt9Crt2vjGnT7AAVjACAAAAAA1JYhGDDvtf8b2Pup5jdzQmy325tGo27n/5thjZ/GI4sAAzYxAH0AAAAFZAAgAAAAAKoLEhLvLjKc7lhOJfx+VrGJCx9tXlOSa9bxQzGR6rfbBXMAIAAAAAAIDK5wNnjRMBzET7x/KAMExL/zi1IumJM92XTgXfoPoAVjACAAAAAAhoVLxo0hXbxAzz2BWbeRxAzk08TbVuHxJkdsbCISswkAAzYyAH0AAAAFZAAgAAAAADoQv6lutRmh5scQFvIW6K5JBquLxszuygM1tzBiGknIBXMAIAAAAADAD+JjW7FoBQ76/rsECmmcL76bmyfXpUU/awqIsZdO+wVjACAAAAAAwLIixR/svwADNhtiOZ9mDF2rUqEvuPx2tUSQbhOpersAAzYzAH0AAAAFZAAgAAAAAJNHUGAgn56KekghO19d11nai3lAh0JAlWfeP+6w4lJBBXMAIAAAAAD9XGJlvz59msJvA6St9fKW9CG4JoHV61rlWWnkdBRLzwVjACAAAAAAKMVXumaH5QOt5WVHFip9xWx9e5I/5Y9uEO0UAX6dy7QAAzY0AH0AAAAFZAAgAAAAAHgYoMGjEE6fAlAhICv0+doHcVX8CmMVxyq7+jlyGrvmBXMAIAAAAAC/5MQZgTHuIr/O5Z3mXPvqrom5JTQ8IeSpQGhO9sB+8gVjACAAAAAAPMgD8Rqnd94atKnMyPjlTwthUQ710MKJVqgtwNXLFWwAAzY1AH0AAAAFZAAgAAAAANpIljbxHOM7pydY877gpRQvYY2TGK7igqgGsavqGPBABXMAIAAAAAAqHyEu9gpurPOulApPnr0x9wrygY/7mXe9rAC+tPK80wVjACAAAAAAezZExYLAbjyMsVuSrWGQ+LsXYEcp6AFMANkQ496mTXcAAzY2AH0AAAAFZAAgAAAAAGR+gEaZTeGNgG9BuM1bX2R9ed4FCxBA9F9QvdQDAjZwBXMAIAAAAABSkrYFQ6pf8MZ1flgmeIRkxaSh/Eep4Btdx4QYnGGnwAVjACAAAAAAQ011358xXtVDOyGPpF2+zGoMdiQ8PGCB1QfDcluYUF4AAzY3AH0AAAAFZAAgAAAAAFNprhQ3ZwIcYbuzLolAT5n/vc14P9kUUQComDu6eFyKBXMAIAAAAAAcx9z9pk32YbPV/sfPZl9ALIEVsqoLXgqWLVK/tP+heAVjACAAAAAA3eqduo9CWE5BePqBq7KCh5++QqXnyjCwybB15Zoeiu4AAzY4AH0AAAAFZAAgAAAAADgyPqQdqQrgfmJjRFAILTHzXbdw5kpKyfeoEcy6YYG/BXMAIAAAAAAE+3XsBQ8VAxAkN81au+f3FDeCD/s7KoZD+fnM1MJSSAVjACAAAAAAWHAiQNo6HBkIhf72fVQxJLaCtNeTqn2OuMmYZjT7PRkAAzY5AH0AAAAFZAAgAAAAAI0CT7JNngTCTUSei1Arw7eHWCD0jumv2rb7imjWIlWABXMAIAAAAABSP8t6ya0SyCphXMwnru6ZUDXWElN0NfBvEOhDvW9bJQVjACAAAAAAbfZdoqMQ71hNIsycNHl6JpSmAFDPSfgzdWkGqFZNoScAAzcwAH0AAAAFZAAgAAAAAD/FIrGYFDjyYmVb7oTMVwweWP7A6F9LnyIuNO4MjBnXBXMAIAAAAACIZgJCQRZu7NhuNMyOqCn1tf+DfU1qm10TPCfj5JYV3wVjACAAAAAAZCaO06/DjOBjNrTxB8jdxM7X4XvNu9QTa2Y00kZJwgEAAzcxAH0AAAAFZAAgAAAAAHIkVuNDkSS1cHIThKc/O0r2/ubaABTOi8Q1r/dvBAsEBXMAIAAAAADdHYqchEiJLM340c3Q4vJABmmth3+MKzwLYlsG6GS7sQVjACAAAAAA4byh4Re83zUZxvEH4iJSsnFei+ohsWxjSpB5YoAPawIAAzcyAH0AAAAFZAAgAAAAAJmoDILNhC6kn3masElfnjIjP1VjsjRavGk1gSUIjh1NBXMAIAAAAAD97Ilvp3XF8T6MmVVcxMPcdL80RgQ09UoC6PnoOvZ1IQVjACAAAAAAx9wkqPvtzrL9EFDmFvktI129ti8IAdHn0oudubGPWAAAAzczAH0AAAAFZAAgAAAAAI5bm3YO0Xgf0VT+qjVTTfvckecM3Cwqj7DTKZXf8/NXBXMAIAAAAAD/m+h8fBhWaHm6Ykuz0WX1xL4Eme3ErLObyEVJf8NCywVjACAAAAAAiGdTXD22l1zDxHeF4NXUTiBnNTsdpzJRwM6riTPuOogAAzc0AH0AAAAFZAAgAAAAANqo4+p6qdtCzcB4BX1wQ6llU7eFBnuu4MtZwp4B6mDlBXMAIAAAAAAGiz+VaukMZ+6IH4jtn4KWWdKK4/W+O+gRioQDrfzpMgVjACAAAAAAl/wlBjSJW/hKkll8HSBCGw4Ce1pJ5rZuhVE09hKq4jQAAzc1AH0AAAAFZAAgAAAAAPrFXmHP2Y4YAm7b/aqsdn/DPoDkv7B8egWkfe23XsM1BXMAIAAAAAAGhwpKAr7skeqHm3oseSbO7qKNhmYsuUrECBxJ5k+D2AVjACAAAAAAKSsxERy2OBhb5MiH9/H2BET2oeU6yVihiAoWi/16FroAAzc2AH0AAAAFZAAgAAAAABzjYxwAjXxXc0Uxv18rH8I3my0Aguow0kTwKyxbrm+cBXMAIAAAAADVbqJVr6IdokuhXkEtXF0C2gINLiAjMVN20lE20Vmp2QVjACAAAAAACJ+VAwl9X88mjC76yzkWeL4K6AamNYjbNkpS9B6fQE4AAzc3AH0AAAAFZAAgAAAAAFMm2feF2fFCm/UC6AfIyepX/xJDSmnnolQIBnHcPmb5BXMAIAAAAABLI11kFrQoaNVZFmq/38aRNImPOjdJh0Lo6irI8M/AaAVjACAAAAAAZFgYh4nV8YN+/AAqe/QhKDkNBPg8KraCG7y3bOzhPV4AAzc4AH0AAAAFZAAgAAAAAJvXB3KyNiNtQko4SSzo/9b2qmM2zU9CQTTDfLSBWMgRBXMAIAAAAAAvjuVP7KsLRDeqVqRziTKpBrjVyqKiIbO9Gw8Wl2wFTAVjACAAAAAARuBn3JdQ8so7Gy0XVH0CtlvtRoJWhSrJP6eRIqbyWh8AAzc5AH0AAAAFZAAgAAAAAPGdcxDiid8z8XYnfdDivNMYVPgBKdGOUw6UStU+48CdBXMAIAAAAAARj6g1Ap0eEfuCZ4X2TsEw+Djrhto3fA5nLwPaY0vCTgVjACAAAAAATxLY6SkcLPaoOBJpQsggEqoxgJgiY9seP3fBQM05PckAAzgwAH0AAAAFZAAgAAAAAP5rGPrYGt3aKob5f/ldP0qrW7bmWvqnKY4QwdDWz400BXMAIAAAAADTQkW2ymaaf/bhteOOGmSrIR97bAnJx+yN3yMj1bTeewVjACAAAAAA6O+wIMt3xMITuCxVrqOCNBPX5F122G+/Is+EYkzUvVYAAzgxAH0AAAAFZAAgAAAAAAlz6wJze5UkIxKpJOZFGCOf3v2KByWyI6NB6JM9wNcBBXMAIAAAAABUC7P/neUIHHoZtq0jFVBHY75tSFYr1Y5S16YN5XxC1QVjACAAAAAANv97jMd9JmZ7lMeCzK7jaZHZYsZJNl6N9g9WXzd2om0AAzgyAH0AAAAFZAAgAAAAAFJ8AtHcjia/9Y5pLEc3qVgH5xKiXw12G9Kn2A1EY8McBXMAIAAAAAAxe7Bdw7eUSBk/oAawa7uicTEDgXLymRNhBy1LAxhDvwVjACAAAAAAtOUZ2NeUWwESpq95O92dhqYBt8RtFnjT43E7k9mQF3oAAzgzAH0AAAAFZAAgAAAAAO8uwQUaKFb6vqR3Sv3Wn4QAonC2exOC9lGG1juqP5DtBXMAIAAAAABZf1KyJgQg8/Rf5c02DgDK2aQu0rNCOvaL60ohDHyY+gVjACAAAAAA5nAWj1Ek8p0MLYZEB3yoVFDfBYZ+/ZpIo71u+W9hprcAAzg0AH0AAAAFZAAgAAAAAE8YtqyRsGCeiR6hhiyisR/hccmK4nZqIMzO4lUBmEFzBXMAIAAAAAC1UYOSKqAeG1UJiKjWFVskRhuFKpj9Ezy+lICZvFlN5AVjACAAAAAA37oP30mTzVftI2FL9Uwyls/jqLqbmRDQk7p7nlx44uYAAzg1AH0AAAAFZAAgAAAAAPhCrMausDx1QUIEqp9rUdRKyM6a9AAx7jQ3ILIu8wNIBXMAIAAAAACmH8lotGCiF2q9VQxhsS+7LAZv79VUAsOUALaGxE/EpAVjACAAAAAAhVIkl8p19VZ0gpg32s++Jda3qsVSVB5tV4CKrtjhE3IAAzg2AH0AAAAFZAAgAAAAAOBi/GAYFcstMSJPgp3VkMiuuUUCrZytvqYaU8dwm8v2BXMAIAAAAACEZSZVyD3pKzGlbdwlYmWQhHHTV5SnNLknl2Gw8IaUTQVjACAAAAAAriBex2kK//RPhyVpCYJDBng4l5w8jD3m8BF7dVAP0p8AAzg3AH0AAAAFZAAgAAAAAIQuup+YGfH3mflzWopN8J1X8o8a0d9CSGIvrA5HOzraBXMAIAAAAADYvNLURXsC2ITMqK14LABQBI+hZZ5wNf24JMcKLW+84AVjACAAAAAAGeUzdG2kQrx5XypXJezZmPVzMYuqYZw7Bhbl4EPT0SMAAzg4AH0AAAAFZAAgAAAAAKsh0ADyOnVocFrOrf6MpTrNvAj8iaiE923DPryu124gBXMAIAAAAADg24a8NVE1GyScc6tmnTbmu5ulzO+896fE92lN08MeswVjACAAAAAAbO+DEBY3STVMQN7CbxmHDUBYrDR+80e797u/VmiK4vcAAzg5AH0AAAAFZAAgAAAAAKkVC2Y6HtRmv72tDnPUSjJBvse7SxLqnr09/Uuj9sVVBXMAIAAAAABYNFUkH7ylPMN+Bc3HWX1e0flGYNbtJNCY9SltJCW/UAVjACAAAAAAHlE3RLKcXpXto7Mr8nRgzEsmhjfGh4vcgPxashCSMg4AAzkwAH0AAAAFZAAgAAAAADDggcwcb/Yn1Kk39sOHsv7BO/MfP3m/AJzjGH506Wf9BXMAIAAAAAAYZIsdjICS0+BDyRUPnrSAZfPrwtuMaEDEn0/ijLNQmAVjACAAAAAA1c/sy3255NofBQrnBNSmVkSzMgsGPaaOUJShddVrnuQAAzkxAH0AAAAFZAAgAAAAAEWY7dEUOJBgjOoWVht1wLehsWAzB3rSOBtLgTuM2HC8BXMAIAAAAAAAoswiHRROurjwUW8u8D5EUT+67yvrgpB/j6PzBDAfVwVjACAAAAAALBvQumG8m7/bzJjGWN2cHSAncdN8jMtOSmEhEhGom24AAzkyAH0AAAAFZAAgAAAAAPZaapeAUUFPA7JTCMOWHJa9lnPFh0/gXfAPjA1ezm4ZBXMAIAAAAACmJvLY2nivw7/b3DOKH/X7bBXjJwoowqb1GtEFO3OYgAVjACAAAAAAGCDHuUJusGHKQ+r9nrFChmUUsRcqZKPGsRiLSk5gbFcAAzkzAH0AAAAFZAAgAAAAAK00u6jadxCZAiA+fTsPVDsnW5p5LCr4+kZZZOTDuZlfBXMAIAAAAAAote4zTEYMDgaaQbAdN8Dzv93ljPLdGjJzvnRn3KXgtQVjACAAAAAApZ6l+OrocOqgFek7WOqOP9JruTWZ+iW+5zdL3DZwzhkAAzk0AH0AAAAFZAAgAAAAAFbgabdyymiEVYYwtJSWa7lfl/oYuj/SukzJeDOR6wPVBXMAIAAAAADAFGFjS1vPbN6mQEhkDYTD6V2V23Ys9gUEUMGNvMPkaAVjACAAAAAAeICKly5Xtwmfd4JFD+5e1UWpu4V3KoRim7jeBICDs+UAAzk1AH0AAAAFZAAgAAAAABNMR6UBv2E627CqLtQ/eDYx7OEwQ7JrR4mSHFa1N8tLBXMAIAAAAAAxH4gucI4UmNVB7625C6hFSVCuIpJO3lusJlPuL8H5EQVjACAAAAAA0/uh1hrAlGGna/njCVaCqBwubxkifzF0zjCDQrIJOtUAAzk2AH0AAAAFZAAgAAAAAG8cd6WBneNunlqrQ2EmNf35W7OGObGq9WL4ePX+LUDmBXMAIAAAAAAjJ2+sX87NSis9hBsgb1QprVRnO7Bf+GObCGoUqyPE4wVjACAAAAAAAoJ4Ufdq45T9Aun5FupHlaBCIUsmUn6dXgV9KorpFikAAzk3AH0AAAAFZAAgAAAAAFWOUGkUpy8yf6gB3dio/aOfRKh7XuhvsUj48iESFJrGBXMAIAAAAAAY7sCDMcrUXvNuL6dO0m11WyijzXZvPIcOKob6IpC4PQVjACAAAAAAO/QFjczoznH95Iu0YEVMsU1GA1yxSGL8bcwSweNzAtkAAzk4AH0AAAAFZAAgAAAAAGUrIdKxOihwNmo6B+aG+Ag1qa0+iqdksHOjQj+Oy9bZBXMAIAAAAABwa5dbI2KmzBDNBTQBEkjZv4sPaeRkRNejcjdVymRFKQVjACAAAAAAUtdJucZoQvvPJiy65RonQrxBCcvtfHslpbgLbtWirCYAAzk5AH0AAAAFZAAgAAAAAOx89xV/hRk64/CkM9N2EMK6aldII0c8smdcsZ46NbP8BXMAIAAAAADBF6tfQ+7q9kTuLyuyrSnDgmrdmrXkdhl980i1KHuGHgVjACAAAAAAVc5njbLX1afpsuG662U/OBo4LanEk06lKbQtd95fswgAAzEwMAB9AAAABWQAIAAAAADJDdC9aEFl4Y8J/awHbnXGHjfP+VXQilPHJg7ewaJI7AVzACAAAAAAE+tqRl6EcBMXvbr4GDiNIYObTsYpa1n6BJk9EjIJVicFYwAgAAAAAITXOaLyGsYLUvOemQXxvnAHBwM/t3sMwfQus2aGoII+AAMxMDEAfQAAAAVkACAAAAAA3F9rjEKhpoHuTULVGgfUsGGwJs3bISrXkFP1v6KoQLgFcwAgAAAAAIBf0tXw96Z/Ds0XSIHX/zk3MzUR/7WZR/J6FpxRWChtBWMAIAAAAABzRshE3O7JzVjSGQSabvFXpen8sGUCAyr8hIIevROrjgADMTAyAH0AAAAFZAAgAAAAAOYIYoWkX7dGuyKfi3XssUlc7u/gWzqrR9KMkikKVdmSBXMAIAAAAABVF2OYjRTGi9Tw8XCAwZWLpX35Yl271TlNWp6N/nROhAVjACAAAAAAyGLbmHhe8eTQC8L2eDRcezUWULLZ9E8DPic7Mfp8/+4AAzEwMwB9AAAABWQAIAAAAACMtPm12YtdEAvqu6Eji1yuRXnu1RJP6h0l7pH3lSH4MwVzACAAAAAAENyCFfyUAh1veQBGx+cxiB7Sasrj41jzCGflZkB5cRMFYwAgAAAAAA92s3DQ3aIVOrRzusqU+xdK7cnQGCDJiyLF+su3F1ZDAAMxMDQAfQAAAAVkACAAAAAAvlI4lDcs6GB1cnm/Tzo014CXWqidCdyE5t2lknWQd4QFcwAgAAAAAD60SpNc4O2KT7J0llKdSpcX1/Xxs97N715a1HsTFkmBBWMAIAAAAABR3y/ZE3VZqBhqfUttX4bzW9wkpDoexfYZIG2fMwftcQADMTA1AH0AAAAFZAAgAAAAAKl8zcHJRDjSjJeV/WvMxulW1zrTFtaeBy/aKKhadc6UBXMAIAAAAADBdWQl5SBIvtZZLIHszePwkO14W1mQ0izUk2Ov21cPNAVjACAAAAAAHvQLJ2X4ncjVv1BsOd/jbVouRPwf4222WlGSzPyAfnsAAzEwNgB9AAAABWQAIAAAAABb6LXDWqCp1beQgQjj8I3sRTtFhlrmiBi+h/+ikmrvugVzACAAAAAA9stpgTecT7uTyaGNs3K9Bp0A7R0QaIAOfscyMXHBPX8FYwAgAAAAANTp7TwMatTSeLH3GvsrB3IOvJo+0B8HRGUFcRzJVesdAAMxMDcAfQAAAAVkACAAAAAA97NTT+81PhDhgptNtp4epzA0tP4iNb9j1AWkiiiKGM8FcwAgAAAAAKPbHg7ise16vxmdPCzksA/2Mn/qST0L9Xe8vnQugVkcBWMAIAAAAACVl3ds8xRdGFPAtZ+WtC4ojC1q5OzB6dSJoOLaJsdhhgADMTA4AH0AAAAFZAAgAAAAAMqpayM2XotEFmm0gwQd9rIzApy0X+7HfOhNk6VU7F5lBXMAIAAAAACJR9+q5T9qFHXFNgGbZnPubG8rkO6cwWhzITQTmd6VgwVjACAAAAAAEEOCUo+ihRGl1kuHlabWBWUFyJPAXSXzpQB4od57cMEAAzEwOQB9AAAABWQAIAAAAADQnslvt6Hm2kJPmqsTVYQHE/wWeZ4bE1XSkt7TKy0r1gVzACAAAAAA8URTA4ZMrhHPvlp53TH6FDCzS+0+61qHm5XK6UiOrKEFYwAgAAAAANSmECEsZgXBpoAzAIwaU3H0K/6HIutCn+ELRGBFzykkAAMxMTAAfQAAAAVkACAAAAAAhujlgFPFczsdCGXtQ/002Ck8YWQHHzvWvUHrkbjv4rwFcwAgAAAAALbV0lLGcSGfE7mDM3n/fgEvi+ifjl7WZ5b3aqjDNvx9BWMAIAAAAACKzGyyRT/3KSmGlKMHpswxj7pNu3rCmOETZ2DUhQsCBgADMTExAH0AAAAFZAAgAAAAABm/6pF96j26Jm7z5KkY1y33zcAEXLx2n0DwC03bs/ixBXMAIAAAAAD01OMvTZI/mqMgxIhA5nLs068mW+GKl3OW3ilf2D8+LgVjACAAAAAAnPa8PTfcaSSAdzNAC54IMTicbShbtt/cSnFHz7u7g8wAAzExMgB9AAAABWQAIAAAAACfw9/te4GkHZAapC9sDMHHHZgmlTrccyJDPFciOMSOcwVzACAAAAAAIIC1ZpHObvmMwUfqDRPl4C1aeuHwujM1G/yJbvybMNAFYwAgAAAAAKeagivKdHk7wAFEPHyDhsm9mDNWH5UPB+oIIlmfbzSOAAMxMTMAfQAAAAVkACAAAAAAkxHJRbnShpPOylLoDdNShfILeA1hChKFQY9qQyZ5VmsFcwAgAAAAAKidrY+rC3hTY+YWu2a7fuMH2RD/XaiTIBW1hrxNCQOJBWMAIAAAAADH8s64PC+lo8Ul4oujBlb/irtJSwu12V0HbvNzj/9qUQADMTE0AH0AAAAFZAAgAAAAAByuYl8dBvfaZ0LO/81JW4hYypeNmvLMaxsIdvqMPrWoBXMAIAAAAABNddwobOUJzm9HOUD8BMZJqkNCUCqstHZkC76FIdNg9AVjACAAAAAA4SEPY+qEZ2dCu/9485IEVybiM3Z7szXYM+izxklNm14AAzExNQB9AAAABWQAIAAAAABxMy7X5hf7AXGDz3Y/POu1ZpkMlNcSvSP92NOO/Gs7wAVzACAAAAAAHJshWo2T5wU2zvqCyJzcJQKQaHFHpCpMc9oWBXkpUPoFYwAgAAAAANeYm2aAT9f6T9uwQyH4sw2DUQyKTpo/CHt+Bb67ao4TAAMxMTYAfQAAAAVkACAAAAAAlqbslixl7Zw3bRlibZbe/WmKw23k8uKeIzPKYEtbIy0FcwAgAAAAAHEKwpUxkxOfef5HYvulXPmdbzTivwdwrSYIHDeNRcpcBWMAIAAAAAASUKCgxGu2U42qfKiyMimLPiZBMurf5v8lQJUSrhAWIAADMTE3AH0AAAAFZAAgAAAAAMXrXx0saZ+5gORmwM2FLuZG6iuO2YS+1IGPoAtDKoKBBXMAIAAAAADIQsxCr8CfFKaBcx8kIeSywnGh7JHjKRJ9vJd9x79y7wVjACAAAAAAPzOTJ088k9QdGUpZ1ubUdkw3pTGkNF8bui4a9wqeo08AAzExOAB9AAAABWQAIAAAAAAm83FA9yDUpwkbKTihe7m53u+DivS9BU2b4vQMtCVQ2AVzACAAAAAAz3m1UB/AbZPa4QSKFDnUgHaT78+6iGOFAtouiBorEgEFYwAgAAAAAHuM0gIDED47c9rdQ4MVtVzpVfn5zTF7eokO4lew4EM+AAMxMTkAfQAAAAVkACAAAAAAJRzYK0PUwr9RPG2/7yID0WgcTJPB2Xjccp5LAPDYunkFcwAgAAAAAIIh24h3DrltAzNFhF+MEmPrZtzr1PhCofhChZqfCW+jBWMAIAAAAAD6LppOeSiLHFI7EOBAz9pZPKU7LWbRWIINTlqw4zmJ5gADMTIwAH0AAAAFZAAgAAAAAHSaHWs/dnmI9sc7nB50VB2Bzs0kHapMHCQdyVEYY30TBXMAIAAAAACkV22lhEjWv/9/DubfHBAcwJggKI5mIbSK5L2nyqloqQVjACAAAAAA1I5pLbnlFf/EfJlhE0RFIioDjzKrWNh4TO8H/ksrbMcAAzEyMQB9AAAABWQAIAAAAAAC/I4TQRtCl12YZmdGz17X4GqSQgfwCPgRBwdHmdwu+QVzACAAAAAAx8f3z2ut/RAZhleari4vCEE+tNIn4ikjoUwzitfQ588FYwAgAAAAADX1qVlsvYru6YDBMtmlQoIBhLSbVykBtft8wn/A+ohJAAMxMjIAfQAAAAVkACAAAAAADGB5yU2XT0fse/MPWgvBvZikVxrl5pf3S5K1hceKWooFcwAgAAAAAIxTmlLHMjNaVDEfJbXvRez0SEPWFREBJCT6qTHsrljoBWMAIAAAAAD+RiUk9IWfaDWXtzLp2NX/vCCeU9amFnQgpJjy56dQXQADMTIzAH0AAAAFZAAgAAAAABmO7QD9vxWMmFjIHz13lyOeV6vHT6mYCsWxF7hb/yOjBXMAIAAAAACT9lmgkiqzuWG24afuzYiCeK9gmJqacmxAruIukd0xEAVjACAAAAAAyiZxtuOZQNSit4wFMJS3jnqLbDzyJ0OtDTKs6r0EO0cAAzEyNAB9AAAABWQAIAAAAAAfPUoy7QyZKhIIURso+mkP9qr1izbjETqF5s22GwjCjAVzACAAAAAAvLMsIDQ/go4VUxeh50UHmsvMvfx51cwyONnRD2odvC0FYwAgAAAAAMwY/KvSIOLoSHOq4TQ1V9ZSCPZc34SdPooPL4gYXa7UAAMxMjUAfQAAAAVkACAAAAAAE3ZqUar0Bq2zWbARE0bAv98jBlK9UJ73/xcwdMWWlSkFcwAgAAAAAK4M+MmC+9sFiFsumMyJZQKxWmmJiuG9H7IzKw083xxkBWMAIAAAAACpywsi9vc979ApgH3BDzph7Y4VIAkQhji97sswzdLAYwADMTI2AH0AAAAFZAAgAAAAAMo8FJiOq63cAmyk2O7eI7GcbQh/1j4RrMTqly3rexftBXMAIAAAAADjVmpd0WiRGTw/gAqEgGolt2EI7Csv14vKdmYoMD0aAgVjACAAAAAAEPmYjDZnMZdkaYlLZLlRgist9kCrSQe0mSuKxPwwYbQAAzEyNwB9AAAABWQAIAAAAACu5IGaIx7A3Jvly/kzlCsSA4s3iJwuIl8jEdRH0k93NwVzACAAAAAA9NRUyxYE+t0Xyosyt6vIfMFW/vBoYg6sR+jBNs4JAxIFYwAgAAAAAKMbsr4JCCodHmkBvfhOe7BJigKiJik95wLeu3PjLSpXAAMxMjgAfQAAAAVkACAAAAAALkRy0GJInXYLA+cgjs6Myb0a+Gu9hgXhHvhLNoGWfckFcwAgAAAAANbALyt9zCSvwnLaWCd2/y2eoB7qkWTvv1Ldu8r40JPuBWMAIAAAAABi0dME7AUSoeMv4yIgnGMgrX9G+Uk6HV+I9/9zzABcZwADMTI5AH0AAAAFZAAgAAAAAGoUK/DSWhT8LZhszSUqDbTrp8cSA7rdqmADKL+MILtTBXMAIAAAAABHnEE9bVa6lvhfhEMkkV2kzSSxH/sMW/FIJuw3CzWs6wVjACAAAAAAagOaxIb7co+HxAXhfI9ahHLUNqmGuN/4JxeR9sm6PdkAAzEzMAB9AAAABWQAIAAAAAC922ZDQE3h2fQKibGMZ9hV0WNlmrPYYSdtaSyYxsWYqgVzACAAAAAAagMovciKK6WVjIc2cCj8nK5O/gVOFFVeVAJpRp89tmQFYwAgAAAAAAMsWoODZkTvKSNWzloogbp/AiFFspENp49RwKjWpMLHAAMxMzEAfQAAAAVkACAAAAAAtK+JqX3K/z2txjAU15DgX4y90DS2YLfIJFolCOkJJJwFcwAgAAAAAMnR5V7gfX7MNqqUdL5AkWlkhyFXaBRVNej+Rcn8lrQkBWMAIAAAAADOmDHuXwsu9uwKYYSN5XIb/TG3K5DB5aci/X1ATKTaSwADMTMyAH0AAAAFZAAgAAAAAAeGrIMK/bac6kPczxbvRYqKMkcpeI2FjdMpD91FDWIvBXMAIAAAAAAix62z1LeS8yvSXCl5gHSIomjyx76fF3S1lp9k900hygVjACAAAAAAUK1Gzlm0meDhYPL7ZgKaCD0qz7Zb5rtnPn1EEW3UZxoAAzEzMwB9AAAABWQAIAAAAACphf298InM0Us4HT8o1W1MGw0D/02vd7Jh+U0h7qaFaQVzACAAAAAAFXtk7YpqsOJxsqGWSIL+YcBE96G3Zz9D31gPqDW94y8FYwAgAAAAAEA5mnfyccI1SjyYftq3qCuORs/NxzzqUA+fxn3FRjVsAAMxMzQAfQAAAAVkACAAAAAATLDS2cuDVM3yDMuWNgk2iGKBTzPpfJMbvxVOSY39ZfcFcwAgAAAAAPT5wRi2cLHIUflXzm6EQB/m7xdThP80ir1VV/JBBqvxBWMAIAAAAABTj7i+CxxNVkbnAkSYga/v2X3/NH3nD/FRiOo2FPkzvAADMTM1AH0AAAAFZAAgAAAAAJNjExiZVX7jfFGfYpQu16qxLN0YPqVU/5CQ/Y67YSinBXMAIAAAAABMpm2+6KrkRUlXzQoMPHrQmIO6dkQz66tYdfTeA3dKqQVjACAAAAAATkNGECGUFzo34ItVnTEmxbe8dbde8QzMgEEdjMhRLz8AAzEzNgB9AAAABWQAIAAAAABlFkYtLCx901X6QVVMkSn6Z7k30UF4xHaA0OZJJ9bdyQVzACAAAAAATez+F9GHcGzTp7jjv4feboUNb8JCkIp4EqcPFisnq7MFYwAgAAAAAOHfn3eVRhSWn61AfZuAnCGleSLluJ3sF9IFGUWrCsBaAAMxMzcAfQAAAAVkACAAAAAA8NJKN0IxZnruhswGQkiruv8Ih0EMwDcSZx/Xasup9dkFcwAgAAAAAKaJZRxzA+Igeydvuk6cSwUHXcrmT4PjhuPu//FslpdnBWMAIAAAAAC3Cs/mKg+sbU/BC9QWFglOau6FWAP1sJqqSZOEOdzh+gADMTM4AH0AAAAFZAAgAAAAABHxHdEClz7hbSSgE58+dWLlSMJnoPz+jFxp4bB1GmLQBXMAIAAAAAD3nSvT6aGD+A110J/NwEfp0nPutlmuB5B+wA3CC3noGAVjACAAAAAA56lpvjMjFzR6NMGiSF1es1X01dwINWqaxyq3UUL8XJ0AAzEzOQB9AAAABWQAIAAAAAC/o8qW/ifk3KuJ01VFkyNLgQafxB5/bGs2G5VyyVafOwVzACAAAAAA1bMqAFGDHSl6BYNLbxApvkAv2K1/oafywiX0MDz1dGUFYwAgAAAAAMjJrrd6E5DyUuXkWZsAqo020Qvom6xqAluQLod5SmtdAAMxNDAAfQAAAAVkACAAAAAAY2V8I1bz3a1AxTtmED6UhdhA09huFkuuEX8R+d/WDPUFcwAgAAAAAPTVoNRiI76tcRKqd+JBBVyy4+YcKST42p0QX2BtmQ2VBWMAIAAAAAD0kQXxOWWOfIzqhJk5Rnvp/h5VXcGxxLZ8HMvVVH++YQADMTQxAH0AAAAFZAAgAAAAAO2kSsW0WGN9AOtK4xK2SHrGhWiaAbMEKT4iZkRpaDN/BXMAIAAAAABKGzQcPM8LT2dwOggxoWjv/1imYWabbG/G4kBw8OWaxAVjACAAAAAAT3sD7PTrAPtOtiSRrG4IKmSNr/uWgX8TvIyZpZzj4wkAAzE0MgB9AAAABWQAIAAAAAAiCwzNEEaH/mDam68IdDftnhthyUFdb+ZCNSBQ91WlHQVzACAAAAAA7tHyHcxCzmbJeFYZyPm4mEgkTGKOvwY4MX82OvH0Jn8FYwAgAAAAAP4A3nd470CwvaGzyJLfzbrw7ePJV35V3Cw6tuiPFlsCAAMxNDMAfQAAAAVkACAAAAAAGuCHVNJSuoVkpPOnS5s89GuA+BLi2IPBUr2Bg1sWEPIFcwAgAAAAAEl1gncS5/xO7bQ/KQSstRV3rOT2SW6nV92ZANeG2SR6BWMAIAAAAADi6/zM3xSBXEfpRpvEdeycRDl08SmwwLey72qgZaY7FwADMTQ0AH0AAAAFZAAgAAAAAMfxz7gEaoCdPvXrubDhCZUS0ARLZc1svgbXgMDlVBPgBXMAIAAAAAB6a5dDA3fuT5Vz2KvAcbUEFX/+B7Nw2p1QqbPoQ5TTuAVjACAAAAAAB4Kp5ewWpFMJ2T+QCrfw2eJV70L4M+GM8khV1JwqOqQAAzE0NQB9AAAABWQAIAAAAACnYsqF/VzmjIImC9+dqrHO1TM6lJ6fRwM0mM6Wf6paOwVzACAAAAAA5tgZzch8uDCR1ky3SllVaKVpxAlbrhvlNDTazZZRZOAFYwAgAAAAALDJDWkmExE4L8hf2CDNLuF+dgivUGXb7ZvBp90EALm+AAMxNDYAfQAAAAVkACAAAAAAEC0sIVmadtW4YMuRXH7RpAhXclsd+3bmqGXCMeaT014FcwAgAAAAABPpXh0uzpsJJB+IRUNajmMB9WGwswfpw5T9xk3Xj6ANBWMAIAAAAABauth7HsI90juToIGY6149TbrxP8Emoa+5Izilj9zeWQADMTQ3AH0AAAAFZAAgAAAAABaIB3n49Xm9cOafSrQsE0WCcYp8rMIO/qVwIlMF5YLRBXMAIAAAAAC9EyWJV3xOu9bzgdJ/yX+ko7qLf1u3AxNMataW2C9EzQVjACAAAAAAy7IAYSgbqP7CyvurHMoEq1eO08TIPNO/XcS1L5RKXHkAAzE0OAB9AAAABWQAIAAAAAA5rZItA/cocRnngYqcJ3nBXQ+l688aKz3EQyLbYYunPAVzACAAAAAAwKyA+L7TgxztPClLrIMk2JXR+w7c04N3ZOqPgjvrIvsFYwAgAAAAABaAwqPDgkTaz4888/3PeF64+vtHbLtAZgFgEurWT5kbAAMxNDkAfQAAAAVkACAAAAAA3htn7oHJ0YYpIrs+Mzyh85Ys67HwAdv5LQl1mCdoMWkFcwAgAAAAAEHjCtNNLenHuSIYux6ezAHsXDaj2DlTF67ToDhDDe6HBWMAIAAAAAAVwUZIMifuPtmiFSEctLt+bOFo1T4fgGiWNsZAP0ddeQADMTUwAH0AAAAFZAAgAAAAAEnt18Km/nqggfIJWxzTr9r3hnXNaueG6XO9A5G11LnGBXMAIAAAAAD7QxzGMN/ard5TfFLecE6uusMmXG2+RBsBR+/NCQHUwAVjACAAAAAAIPTDniUskKj5mEzULdlKtIDquwjcqkwunJyhmBazNNcAAzE1MQB9AAAABWQAIAAAAAAVAKK/GoY8AACu/hyMpO4hdLq6JnEyWNzkyci9sbaD/wVzACAAAAAA2HmeqpMlvvBpV2zQTYIRmsc4MFlfHRwLof0ycJgMg/MFYwAgAAAAACHHCAszhxijRN9Es+XRQxXo7JQ6g2qM6f5sIdMy0VKbAAMxNTIAfQAAAAVkACAAAAAAhHyq1GQC/GiMwpYjcsfkNxolJ10ARKjIjfkW1Wipzi0FcwAgAAAAAD/uaGWxTDq87F8XZ6CrFI+RNa8yMqfSZdqK00Kj833BBWMAIAAAAAD1mJD7i29l2xloVHwS1n0CbkyodWeFfZM1KF1r4HqNIgADMTUzAH0AAAAFZAAgAAAAABAJJxHoZD+MQBWqm9UM9Dd3z5ZohIZGWRaRVRsMptKQBXMAIAAAAADrE/ca+gqj/SH4oao4wE4qn2ovoTydzcMbDbrfnUs3zAVjACAAAAAAAIUpF9mApVCMCckE7S+K9RL6TPtlTTYuzUsj9E6oIpUAAzE1NAB9AAAABWQAIAAAAAAv01wz7VG9mTepjXQi6Zma+7b/OVBaKVkWNbgDLr1mFgVzACAAAAAA0I5sxz8r6wkCp5Tgvr+iL4p6MxSOq5d3e1kZG+0b7NkFYwAgAAAAAKwOaUTAOw6Y1F5vFrbDf8yVua5Fm6hKhkdIrzejuaatAAMxNTUAfQAAAAVkACAAAAAAWXecRwxSon68xaa9THXnRDw5ZfzARKnvvjTjtbae6T0FcwAgAAAAAPh0UfUMEo7eILCMv2tiJQe1bF9qtXq7GJtC6H5Va4fIBWMAIAAAAAASanx14WR2rmomuZ2x/nuD8j75pYzz+ZAt/v7uRcoOEQADMTU2AH0AAAAFZAAgAAAAAEY5WL8/LpX36iAB1wlQrMO/xHVjoO9BePVzbUlBYo+bBXMAIAAAAABoKcpadDXUARedDvTmzUzWPe1jTuvD0z9oIcZmKuiSXwVjACAAAAAAWhdUWP186dYAIDx6RtC0o/lzwYNvYBXm4RWFMbcU3YkAAzE1NwB9AAAABWQAIAAAAADnJnWqsfx0xqNnqfFGCxIplVu8mXjaHTViJT9+y2RuTgVzACAAAAAAWAaSCwIXDwdYxWf2NZTly/iKVfG/KDjHUcA1BokN5sMFYwAgAAAAAPS3GDNsHgCuTgEWTHiEStoY0VMzlopZ8L7wPUquK7ayAAMxNTgAfQAAAAVkACAAAAAAsPG7LaIpJvcwqcbtfFUpIjj+vpNj70Zjaw3eV9T+QYsFcwAgAAAAAJQ71zi0NlCyY8ZQs3IasJ4gB1PmWx57HpnlCf3+hmhqBWMAIAAAAABmDfQAQeyeutCB+wSn4RmErwYEkYpyBeCYA+3iutFzAQADMTU5AH0AAAAFZAAgAAAAAAGiSqKaQDakMi1W87rFAhkogfRAevnwQ41onWNUJKtuBXMAIAAAAAASgiDpXfGh7E47KkOD8MAcX8+BnDShlnU5JAGdnPdqOAVjACAAAAAAucFM6KF1YHEhH9vn16ox+VSqNEykMGaJzhLPsLI7qk8AAzE2MAB9AAAABWQAIAAAAAB7L4EnhjKA5xJD3ORhH2wOA1BvpnQ+7IjRYi+jjVEaJAVzACAAAAAAuhBIm0nL3FJnVJId+7CKDASEo+l2E89Z9/5aWSITK4AFYwAgAAAAALxpb5qDek038/wz4E//KIrwwo0voaqwlB7cTXSQ44EHAAMxNjEAfQAAAAVkACAAAAAAaROn1NaDZFOGEWw724dsXBAm6bgmL5i0cki6QZQNrOoFcwAgAAAAANVT8R6UvhrAlyqYlxtmnvkR4uYK/hlvyQmBu/LP6/3ZBWMAIAAAAAC1ONheOA57vNof7iZM3b82xk1abqT0bppzjQnHCmnUIwADMTYyAH0AAAAFZAAgAAAAADqSR5e0/Th59LrauDA7OnGD1Xr3H3NokfVxzDWOFaN7BXMAIAAAAACt30faNwTWRbvmykDpiDYUOCwA6QDbBBYBFWS7rdOB4AVjACAAAAAAQZlvU/gzOwW2rcr5+W43Q6EkfX8oX1TpRJWEAZAULx4AAzE2MwB9AAAABWQAIAAAAADmtb1ZgpZjSeodPG/hIVlsnS8hoRRwRbrTVx89VwL62AVzACAAAAAAi38e1g6sEyVfSDkzZbaZXGxKI/zKNbMasOl2LYoWrq8FYwAgAAAAAFWkHkxPA28FjeUjeRILC0tX8OJcanhPP68QxM5s1kcMAAMxNjQAfQAAAAVkACAAAAAAf/f7AWVgBxoKjr7YsEQ4w/fqSvuQWV2HMiA3rQ7ur0sFcwAgAAAAADkkeJozP6FFhUdRIN74H4UhIHue+eVbOs1NvbdWYFQrBWMAIAAAAADS3qKdAEzPtGMFpsisEhnOfF0zfxmLXjHKKaNCzX4PhQADMTY1AH0AAAAFZAAgAAAAAI2WEOymtuFpdKi4ctanPLnlQud+yMKKb8p/nfKmIy56BXMAIAAAAADVKrJmhjr1rfF3p+T+tl7UFd1B7+BfJRk0e7a4im7ozgVjACAAAAAAxeqPjcgDwae+AgEXg3hU118dHoy6rcHd6jAJrGik+EcAAzE2NgB9AAAABWQAIAAAAAAuHU9Qd79hjyvKOujGanSGDIQlxzsql8JytTZhEnPw+AVzACAAAAAAjF2gV/4+sOHVgDd/oR5wDi9zL7NGpGD+NsEpGXy/a4QFYwAgAAAAAIFYquIAyUn3D2peptolq3s8oIgSLEIctqBYx6qEeQTxAAMxNjcAfQAAAAVkACAAAAAA7dQDkt3iyWYCT94d7yqUtPPwp4qkC0ddu+HFdHgVKEkFcwAgAAAAANuYvtvZBTEq4Rm9+5eb7VuFopowkrAuv86PGP8Q8/QvBWMAIAAAAABBO8poBKW/RWjdHBARy3Rzghz3frQIZEPE/nSKWYlVPgADMTY4AH0AAAAFZAAgAAAAAAwnZSDhL4tNGYxlHPhKYB8s28dY5ScSwiKZm3UhT8U3BXMAIAAAAABDoY6dhivufTURQExyC9Gx3ocpl09bgbbQLChj3qVGbgVjACAAAAAA4JWOs1XAUgX3rGBBGEDDIC9/i9khJ+FgIcwfvj/SnS0AAzE2OQB9AAAABWQAIAAAAAC2VuRdaC4ZJmLdNOvD6R2tnvkyARteqXouJmI46V306QVzACAAAAAAMn1Z6B35wFTX9mEYAPM+IiJ5hauEwfD0CyIvBrxHg7IFYwAgAAAAAMRQnV65wbGlT+7Wj/HvGPLKg8NBnhkQ8Hx/MIyWvynTAAMxNzAAfQAAAAVkACAAAAAAVerb7qVNy457rNOHOgDSKyWl5ojun7iWrv1uHPXrIZQFcwAgAAAAAIDcYS9j5z+gx0xdJj09L7876r/vjvKTi/d3bXDE3PhyBWMAIAAAAAANDuaZsI2eS6/qiSdG9pCLjcPdKS96xWUJr84V/1La7gADMTcxAH0AAAAFZAAgAAAAAH/E44yLxKCJjuSmU9A8SEhbmkDOx1PqqtYcZtgOzJdrBXMAIAAAAABgLh9v2HjBbogrRoQ82LS6KjZQnzjxyJH4PH+F3jupSAVjACAAAAAAd93miIlZ/uuhzjVBt0BPjzeewxih6TSzkzbsNhpMjA8AAzE3MgB9AAAABWQAIAAAAAAlNUdDL+f/SSQ5074mrq0JNh7CTXwTbbhsQyDwWeDVMwVzACAAAAAANIH2IlSNG0kUw4qz0budjcWn8mNR9cJlYUqPYdonucAFYwAgAAAAAF9OccClBu1j8BVMDmMtJyCxnhWCbg9FuY/8nhuFGJknAAMxNzMAfQAAAAVkACAAAAAASZ+CvUDtlk/R4HAQ3a+PHrKeY/8ifAfh0oXYFqliu80FcwAgAAAAAJelpzPgM65OZFt/mvGGpwibclQ49wH+1gbUGzd9OindBWMAIAAAAAC63uwNXVbd1VP5If++NprVRsHCbomU9Iq3GxCttNAweAADMTc0AH0AAAAFZAAgAAAAAN9fkoUVbvFV2vMNMAkak4gYfEnzwKI3eDM3pnDK5q3lBXMAIAAAAACnDkgVNVNUlbQ9RhR6Aot2nVy+U4km6+GHPkLr631jEAVjACAAAAAA5d2REAVBZI9rUfeqJ9jhePmRXvrGolUbMTFiC78k/OIAAzE3NQB9AAAABWQAIAAAAAASyK3b1nmNCMptVEGOjwoxYLLS9fYWm/Zxilqea0jpEQVzACAAAAAADDHsGrbqlKGEpxlvfyqOJKQJjwJrzsrB7k3HG0AUJbkFYwAgAAAAACZHzWGY3PEL4uPSKPezGGJkyScYw/Vt3bKmX5inVMaOAAMxNzYAfQAAAAVkACAAAAAAlSP9iK31GlcG9MKGbLmq+VXMslURr+As736rrVNXcsUFcwAgAAAAAAvbj0zfq9zzi8XReheKFbCB+h9IsOLgXPPpI5vrEJNZBWMAIAAAAABb9Y2Ox3MeHCfGnMxpR7nk6hwIJg0J8/tT8fZHwxMCBQADMTc3AH0AAAAFZAAgAAAAAOJNORH8Bev97gVU7y6bznOxJ+E6Qoykur1QP76hG1/7BXMAIAAAAAC+C1PtOOrSZgzBAGhr+dPe/kR0JUw9GTwLVNr61xC1aAVjACAAAAAA4rDk/UlRHudzR12i5Ivcb5Pxwn63JX2Sjf2xrlALL7kAAzE3OAB9AAAABWQAIAAAAAAKcHzLUomavInN6upPkyWhAqYQACP/vdVCIYpiy6U6HgVzACAAAAAATsR4KItY6R2+U7Gg6sJdaEcf58gjd1OulyWovIqfxKcFYwAgAAAAAEac2NX3v0n87D/eUM/a3Gj+5Axs896SCidMyOMaOz6zAAMxNzkAfQAAAAVkACAAAAAAqTOLiMpCdR59tLZzzIPqJvbCNvz2XQL9ust0qYaehtcFcwAgAAAAAArefox/3k5xGOeiw2m6NUdzuGxmPwcu5IFcj+jMwHgHBWMAIAAAAABK08kOnYjDWhLJ70iVhd3XEj0Q0srEQttJTawBm6GuOwADMTgwAH0AAAAFZAAgAAAAAIPSqSeVzSRgNVNmrPYHmUMgykCY27NbdDUNhE5kx/SgBXMAIAAAAAAhX90nNfxyXmZe/+btZ7q6xMX4PFyj0paM1ccJ/5IUUQVjACAAAAAA/9XTbq8UVKJbIeYtfNg8pdDrpDqbCwVr5Rq3Tb4dFwwAAzE4MQB9AAAABWQAIAAAAACLn5DxiqAosHGXIAY96FwFKjeqrzXWf3VJIQMwx1fl4gVzACAAAAAAindvU27nveutopdvuHmzdENBbeGFtI3Qcsr07jxmvm8FYwAgAAAAAJ3GMHBeIaCyFV5zBgcUMpjfIDcdoaTYQSyQN2shVJMWAAMxODIAfQAAAAVkACAAAAAA7i2S6rHRSPBwZEn59yxaS7HiYBOmObIkeyCcFU42kf8FcwAgAAAAAGb3RSEyBmgarkTvyLWtOLJcPwCKbCRkESG4RZjVmY4iBWMAIAAAAABKIdcHRSJ3dnevw5Pj0BfULPqmDOA7KBDREMGv5rXUEAADMTgzAH0AAAAFZAAgAAAAAFz+M+H/Z94mdPW5oP51B4HWptp1rxcMWAjnlHvWJDWrBXMAIAAAAACBFEOQyL7ZHu4Cq33QvXkmKuH5ibG/Md3RaED9CtG5HwVjACAAAAAABf2EvIMumZohp2E/sHWEJW4VMU3ez95hwWU9pjKGRCYAAzE4NAB9AAAABWQAIAAAAAAE7c2x3Z3aM1XGfLNk/XQ9jCazNRbGhVm7H8c2NjS5ywVzACAAAAAARJ9h8fdcwA19velF3L/Wcvi2rCzewlKZ2nA0p8bT9uwFYwAgAAAAAPl1vH6JaJGZSJ8au0NK58X4gqleryub8slUhA0HRtzmAAMxODUAfQAAAAVkACAAAAAAVoRt9B9dNVvIMGN+ea5TzRzQC+lqSZ8dd/170zU5o9cFcwAgAAAAAEwM95XZin5mv2yhCI8+ugtKuvRVmNgzzIQN0yi1+9aIBWMAIAAAAAA+rgph1avVrhyHl/6G+HtASJSiJkv7u2UPYj+25fwtLAADMTg2AH0AAAAFZAAgAAAAAKRDkjyWv/etlYT4GyoXrmBED2FgZHnhc+l9Wsl06cH2BXMAIAAAAABohlpm3K850Vndf3NmNE0hHqDlNbSR8/IvMidQ3LnIZAVjACAAAAAAKw6WqWDrI7ZfyndtrftL3uh7BaF/FQxhkh8b0Zl547gAAzE4NwB9AAAABWQAIAAAAAC3DFh5oklLCNLY90bgWm68dFXz65JpAZSp1K99MBTPAQVzACAAAAAAQgZecmxEUZVHoptEQClDwAf8smI3WynQ/i+JBP0g+kQFYwAgAAAAADmUpVNJUwrydIllFvI/aau1703nk6tF2sfzkgFlWsKCAAMxODgAfQAAAAVkACAAAAAAQ5WKvWSB503qeNlOI2Tpjd5blheNr6OBO8pfJfPNstcFcwAgAAAAAKwHgQLSDJ5NwLBQbY5OnblQIsVDpGV7q3RCbFLD1U4/BWMAIAAAAADKOab9GTEiaybo9o4J72Pb9LiQU/CuKoQm6Jtlmo/IeQADMTg5AH0AAAAFZAAgAAAAAGfhFY3RGRm5ZgWRQef1tXxHBq5Y6fXaLAR4yJhrTBplBXMAIAAAAACKEF0ApLoB6lP2UqTFsTQYNc9OdDrs/vziPGzttGVLKQVjACAAAAAAvJcnqBNCZgHe+Q7Cqk+yiAaIuSJIRItXEsAlKy9PES4AAzE5MAB9AAAABWQAIAAAAAAIM73gPcgzgotYHLeMa2zAU4mFsr7CbILUZWfnuKSwagVzACAAAAAAJCSu98uV8xv88f2BIOWzt6p+6EjQStMBdkGPUkgN79cFYwAgAAAAABQqDP10DcaqEY7vxFS7U/9xcadDASONow1+xmVsPZ11AAMxOTEAfQAAAAVkACAAAAAAkWmHCUsiMy1pwZTHxVPBzPTrWFBUDqHNrVqcyyt7nO8FcwAgAAAAAMv2CebFRG/br7USELR98sIdgE9OQCRBGV5JZCO+uPMgBWMAIAAAAABxLEFq6nFVI3WaYhggo1d6oeDsBSm4wCW0T6D0yE/puwADMTkyAH0AAAAFZAAgAAAAAGInUYv0lP/rK7McM8taEHXRefk8Q2AunrvWqdfSV7UaBXMAIAAAAACE+WPxJ3gan7iRTbIxXXx+bKVcaf8kP4JD8DcwU0aL7wVjACAAAAAAiThzC5jAZ5D6xuCIsUD1aLy7KxmT2Fb8ybTkLxvj17MAAzE5MwB9AAAABWQAIAAAAACmHlg2ud3cplXlTsNTpvNnY6Qm1Fce0m899COamoDjaQVzACAAAAAArtJQeJIlepBWRU2aYar7+YGYVQ7dfDc1oxgTmA8r9q0FYwAgAAAAADZpcxtBFv18EdmhxsoxlDs253tNB5zqVY/h+nFD1isIAAMxOTQAfQAAAAVkACAAAAAApzcWSAbZWV/Rq+ylRNqqlJqNVR4fhXrz4633/MQOQgcFcwAgAAAAAN/jz/bsEleiuCl+li83EWlG6UMHA8CyaOMRKCkXkSCPBWMAIAAAAADSTHgALJugYsjIvSK1o0UwG6VizNokXQ/tnPNjOpGB1AAABWUAIAAAAADrmnP3kS2GpCl+gdL2da90KHTkBX46iQ/sZRoj7uPz7BJjbQAAAAAAAAAAAAAQcGF5bG9hZElkAAAAAAAQZmlyc3RPcGVyYXRvcgABAAAAAA==",
+ "subType": "06"
+ }
+ }
+ }
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: find
+ outcome:
+ collection:
+ # Outcome is checked using a separate MongoClient without auto encryption.
+ data:
+ -
+ {
+ "_id": {
+ "$numberInt": "0"
+ },
+ "encryptedDecimal": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rbf3AeBEv4wWFAKknqDxRW5cLNkFvbIs6iJjc6LShQY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "n+XAuFnP8Dov9TnhGFxNx0K/MnVM9WbJ7RouEu0ndO0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yRXojuVdn5GQtD97qYlaCL6cOLmZ7Cvcb3wFjkLUIdM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "DuIkdRPITRs55I4SZmgomAHCIsDQmXRhW8+MOznkzSk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SsBk+Et1lTbU+QRPx+xyJ/jMkmfG+QCvQEpip2YYrzA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "crCIzOd8KhHvvUlX7M1v9bhvU4pLdTc+X2SuqoKU5Ek=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YOWdCw4UrqnxkAaVjqmC4sKQDMVMHEpFGnlxpxdaU6E=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "M3SShp81Ff8tQ632qKbv9MUcN6wjDaBReI0VXNu6Xh4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "gzHlSPxpM0hT75kQvWFzGlOxKvDoiKQZOr19V6l2zXI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "s3JnppOGYw9SL2Q1kMAZs948v2F5PrpXjGei/HioDWs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cG6+3Gk/zEH68P/uuuwiAUVCuyJwa1LeV+t29FlPPAo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dupdvR3AyJtM+g9NDKiaLVOtGca387JQp8w+V03m7Ig=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JqEQc5svj2jTvZ6LLA5ivE+kTb/0aRemSEmxk4G7Zrg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "szcXXXKnob+p3SoM4yED2R920LeJ7cVsclPMFTe4CeI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "o1QoGVXmuBdHwHm7aCtGMlMVKrjFdYvJXpoq6uhIAZ0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Jfm5wPlqqLCJRGQIqRq2NGmpn7s0Vrih2H3YAOoI2YU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zMHLb8ARbsYo8Ld05bqnGFf1Usha6EGb8QKwdSAyps0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yQdtq9lh5pugL7/i0Bj/PuZUUBUIzf+7wj1rl5y736w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wGWVZdO7qIuyDg/BqDgqjgoQ02h5YYgwXQB1oCin2NE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "by9HMLj6NTEpgztZ5HSN6GxImkXPcaFINYDzgZY33X8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tWo0vbasi7bXmn/MsOx13VC1IsWtpx/nYp0uj4iMzdA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tQQpndUYd5O87lOtrGjH3wl9VsOK0ray7RMasL90sBM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cQjXEDCMsOpKLLf+vlTgIHA+cbSJdzqhbSX9Wvh95aA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "7yMpU48IxK9SzP2cx3VnTownGEwFmeFofuuFT97SuuY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kSOx1kz0CmBgzKQHZlo65ZUY1DIv9A99JRm+Us2y6Ew=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ubQpdPBe6/xvtr+AcXdfYLSvYCR4ot0tivehkCsupb4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xal+iCJ6FTefRQToyoNksc9NCZShyn04NDGi4IYrcoM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "d7jU4iOK50xHxlkSifcxlZFCM46TSgQzoYivxG3HNLY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tJvl2nsBLBVzL3pp6sKWCL4UXeh3q/roYBJjSb74ve0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "OIUCaKRvIx9t1w6Hxlz1IcQTdPNCfdRNwnnTm10W+X0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "A9tvzsiElotOUVIB4CqfQp9mAwqvTM35YkmAR170aHA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lI8gpK7hpb7c9x4RQugsxMnQay5LZJmwslZdvMx/dcE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dNCzh40U0XvdKnSDi3HRQOWQftEsDVqc4uUvsVFGoq8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "IP+iwEBWBwVVZIdpaMu8k5+soFCz+TZkYn3drKZ9grE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pnqyh6e0y5svHkJDShlN9CHV0WvMBE4QbtJpQw5ZCXc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "elEl42tbVDoRTLjAhZUFEtXiut4b3PVhg/1ZLZSQdtE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "vHuu2FxwclMHqyE6JBYbTYgbEkB0dqb/JuaxsvfwsmY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xTf7NCe3Gf8QpE78HR5OknlLTKfs9J+RN9UZpH6fnso=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "XiWSasRnJAulGR6+LCVD3mwRObXylqYWR9jvpywq12c=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "MZMxEQ5ikx0PG1YFIExv0UnTZogsvgeOEZTpzvBDn4w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yZMyMZBDrWbAhvnic7vvIYhmO9m5H2iuv0c8KNZrBzY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xxM14hTPY5j0vvcK2C7YAEjzdsfUTFHozHC0hEo1bxI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+01rqR1xVwkpGXcstbk1ItJqFVjH6Q8MGxEN3Cm9Y1A=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xOpLV0Z2VTRJ3iWtnWZcsyjXubTIkYWo31cO+HV1o1k=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "BWUOLqgLBqc5NwxVlSV5H3KFQPXbCp7mdo+jF+8cJqY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "fuQb1S6xZDGlrEbK+kI23aL53PP1PVNwqICnZNt9Yzg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SfscnoibFttahLdPVC4Ee+47ewGFKpDSU7M6HX19bKE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rpSW2awybNVeKtat91VFxqbINoTfNhPfQAu+d73Xtf8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "9M/CP9ccOIIj2LLFmE0GFDO0Ban2wsNalEXfM6+h+1s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "WrEMG49l1ye4MhXs5ZS9tz8P6h+hDvthIg/2wW9ne1Q=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ImNhbfeyfH8qIEeA5ic0s3dAQBdzzTBS+CPsNih9vZ0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dWP33YDSn04UKJN2ogh2Rui0iW/0q2y18OCDRVcfyoo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lYv0isAtfGh6H9tdp3cp2eHU7q2J+uk7QrgcxtK3w7Y=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "VGMoamB/+7zTOYcY/pqJc96xlv2PdW4hwsIAEIslTDQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yNeBWMF7BnD9wVwz2PgJsvWr77QiVvvWUvJF0+fqBug=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SfpvObJ+tJBXSvqeN7vlOfmhYign635lciYAJIjUtY8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dsen4NqjzVGjpjufiTMs3+gqeD09EbnuogPgxrJECwg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pxCWVM3sn19NsFEpgHbgLa+PmYlhN3mMiP0Wk8kJhYw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q11KNvJszjYIB9n9HcC+N4uz11a3eRj1L3BH9scKMDQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "A1PmkgcEToWh1JiVWE6mI5jUu7poxWWuCUt/cgRUUDc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "qJo3Hu4PJeanL7XEaWXO/n3YsodhZyd+MJOOmB9Kpd8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "BkBKLO8URFscfRY9Bav/1+L9mLohDgNr/MkZtGiraIs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rZq5WA3Hx3xthOyHAJXK//f8pE2qbz7YKu3TIMp9GFY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "X07a/Lm80p5xd4RFs1dNmw+90tmPDPdGiAKVZkxd4zY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6YrBn2ofIw1b5ooakrLOwF41BWrps8OO0H9WH4/rtlE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "0l86Ag5OszXpa78SlOUV3K9nff5iC1p0mRXtLg9M1s4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Hn6yuxFHodeyu7ISlhYrbSf9pTiH4TDEvbYLWjTwFO0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zdf4y2etKBuIpkEU1zMwoCkCsdisfXZCh8QPamm+drY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rOQ9oMdiK5xxGH+jPzOvwVqdGGnF3+HkJXxn81s6hp4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "61aKKsE3+BJHHWYvs3xSIBvlRmKswmaOo5rygQJguUg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "KuDb/GIzqDM8wv7m7m8AECiWJbae5EKKtJRugZx7kR0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Q+t8t2TmNUiCIorVr9F3AlVnX+Mpt2ZYvN+s8UGict8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tJRZIpKxUgHyL83kW8cvfjkxN3z6WoNnUg+SQw+LK+k=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pnUsYjip8SvW0+m9mR5WWTkpK+p6uwJ6yBUAlBnFKMk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "PArHlz+yPRYDycAP/PgnI/AkP8Wgmfg++Vf4UG1Bf0E=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wnIh53Q3jeK8jEBe1n8kJLa89/H0BxO26ZU8SRIAs9Q=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "4F8U59gzBLGhq58PEWQk2nch+R0Va7eTUoxMneReUIA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ihKagIW3uT1dm22ROr/g5QaCpxZVj2+Fs/YSdM2Noco=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "EJtUOOwjkrPUi9mavYAi+Gom9Y2DuFll7aDwo4mq0M0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dIkr8dbaVRQFskAVT6B286BbcBBt1pZPEOcTZqk4ZcI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "aYVAcZYkH/Tieoa1XOjE/zCy5AJcVTHjS0NG2QB7muA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "sBidL6y8TenseetpioIAAtn0lK/7C8MoW4JXpVYi3z8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "0Dd2klU/t4R86c2WJcJDAd57k/N7OjvYSO5Vf8KH8sw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "I3jZ92WEVmZmgaIkLbuWhBxl7EM6bEjiEttgBJunArA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "aGHoQMlgJoGvArjfIbc3nnkoc8SWBxcrN7hSmjMRzos=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "bpiWPnF/KVBQr5F6MEwc5ZZayzIRvQOLDAm4ntwOi8g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tI7QVKbE6avWgDD9h4QKyFlnTxFCwd2iLySKakxNR/I=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "XGsge0CnoaXgE3rcpKm8AEeku5QVfokS3kcI+JKV1lk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JQxlryW2Q5WOwfrjAnaZxDvC83Dg6sjRVP5zegf2WiM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YFuHKJOfoqp1iGVxoFjx7bLYgVdsN4GuUFxEgO9HJ5s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Z6vUdiCR18ylKomf08uxcQHeRtmyav7/Ecvzz4av3k4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SPGo1Ib5AiP/tSllL7Z5PAypvnKdwJLzt8imfIMSEJQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "m94Nh6PFFQFLIib9Cu5LAKavhXnagSHG6F5EF8lD96I=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pfEkQI98mB+gm1+JbmVurPAODMFPJ4E8DnqfVyUWbSo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "DNj3OVRLbr43s0vd+rgWghOL3FqeO/60npdojC8Ry/M=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kAYIQrjHVu49W8FTxyxJeiLVRWWjC9fPcBn+Hx1F+Ss=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "aCSO7UVOpoQvu/iridarxkxV1SVxU1i9HVSYXUAeXk4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Gh6hTP/yj1IKlXQ+Q69KTfMlGZjEcXoRLGbQHNFo/1s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "/gDgIFQ4tAlJk3GN48IS5Qa5IPmErwGk8CHxAbp6gs0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "PICyimwPjxpusyKxNssOOwUotAUbygpyEtORsVGXT8g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "4lu+cBHyAUvuxC6JUNyHLzHsCogGSWFFnUCkDwfQdgI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pSndkmoNUJwXjgkbkgOrT5f9nSvuoMEZOkwAN9ElRaE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tyW+D4i26QihNM5MuBM+wnt5AdWGSJaJ4X5ydc9iWTU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "9Syjr8RoxUgPKr+O5rsCu07AvcebA4P8IVKyS1NVLWc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "67tPfDYnK2tmrioI51fOBG0ygajcV0pLo5+Zm/rEW7U=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "y0EiPRxYTuS1eVTIaPQUQBBxwkyxNckbePvKgChwd0M=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "NWd+2veAaeXQgR3vCvzlI4R1WW67D5YsVLdoXfdb8qg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "PY5RQqKQsL2GqBBSPNOEVpojNFRX/NijCghIpxD6CZk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lcvwTyEjFlssCJtdjRpdN6oY+C7bxZY+WA+QAqzj9zg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CWE7XRNylvTwO/9Fv56dNqUaQWMmESNS/GNIwgBaEI0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ijwlrUeS8nRYqK1F8kiCYF0mNDolEZS+/lJO1Lg93C8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "8KzV+qYGYuIjoNj8eEpnTuHrMYuhzphl80rS6wrODuU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wDyTLjSEFF895hSQsHvmoEQVS6KIkZOtq1c9dVogm9I=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SGrtPuMYCjUrfKF0Pq/thdaQzmGBMUvlwN3ORIu9tHU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "KySHON3hIoUk4xWcwTqk6IL0kgjzjxgMBObVIkCGvk4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hBIdS9j0XJPeT4ot73ngELkpUoSixvRBvdOL9z48jY8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Tx6um0q9HjS5ZvlFhvukpI6ORnyrXMWVW1OoxvgqII0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zFKlyfX5H81+d4A4J3FKn4T5JfG+OWtR06ddyX4Mxas=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cGgCDuPV7MeMMYEDpgOupqyNP4BQ4H7rBnd2QygumgM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "IPaUoy98v11EoglTpJ4kBlEawoZ8y7BPwzjLYBpkvHQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Pfo4Am6tOWAyZNn8G9W5HWWGC3ZWmX0igI/RRB870Ro=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "fnTSjd7bC1Udoq6iM7UDnHAC/lsIXSHp/Gy332qw+/I=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "fApBgVRrTDyEumkeWs5p3ag9KB48SbU4Si0dl7Ns9rc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "QxudfBItgoCnUj5NXVnSmWH3HK76YtKkMmzn4lyyUYY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "sSOvwhKa29Wq94bZ5jGIiJQGbG1uBrKSBfOYBz/oZeI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FdaMgwwJ0NKsqmPZLC5oE+/0D74Dfpvig3LaI5yW5Fs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "sRWBy12IERN43BSZIrnBfC9+zFBUdvjTlkqIH81NGt4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "/4tIRpxKhoOwnXAiFn1Z7Xmric4USOIfKvTYQXk3QTc=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ -
+ {
+ "_id": {
+ "$numberInt": "1"
+ },
+ "encryptedDecimal": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "bE1vqWj3KNyM7cCYUv/cnYm8BPaUL3eMp5syTHq6NF4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RGTjNVEsNJb+DG7DpPOam8rQWD5HZAMpRyiTQaw7tk8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "I93Md7QNPGmEEGYU1+VVCqBPBEvXdqHPtTJtMOn06Yk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "GecBFQ1PemlECWZWCl7f74vmsL6eB6mzQ9n6tK6FYfs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "QpjhZl+O1ORifgtCZuWAdcP6OKL7IZ2cA46v8FJcV28=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RlQWwhU+uVv0a+9IB5cUkEfvHBvOw3B1Sx6WfPWMqes=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ubb81XTC7U+4tcNzf1oYvOY6gR5hC2Izqx54f4GuJ0E=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6M4Q5NMQ9TqNnjzGOxIkiUIY8TEL0I3XD1QnhefQUqU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "BtInzk9t2FFMCEY6AQ7zN8jwrrZEs2irSv6q0Q4NaIw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6vxXfETu9cuBIpRBo3jUUU04mJIH/aAhLX8K6VI5Xv0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wXPCdS+q23zi1bkPnaVG2j0PsVtxdeSLJ//h6J1x8RU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "KY3KkfBAsN2l80wbpj41G0gwBR5KmmFnZcagg7D3ENk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tI8NFAxXCX4VOnY5X73K6KI/Yspd3aR94KV39MhJlAw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "nFxH0UC3mATKA6Vboz+QX/hAjj19kF/SH6H5Cne7qC0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q8hYqIYaIi7nOdG/7qQZYnz8Bsacfi66M1nVku4SH08=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "4saA92R4arp4anvD9xFtze+sNcQqTEhPHyl1h70A8NE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "DbIziOBRRyeQS6RtBR09E37LV+CTKrEjGoRMLSpG6eE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Fv80Plp/7w2gnVqrwawLd6qhJ10G4NCDm3re67cNq4Y=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "T/T2oiQCBBES4YN7EodzPRdabZSFlYIClHBym+bQUZE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ZQgHD3l46Ujqtbnj1VbbeM29C9wJzOhz+yZ/7XdSrxk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ltlFKzWvyZvHxDFOYDd/XXJ6kUiJj0ln2HTCEz2o4Z4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "flW8A7bltC1u8bzx0WJtxosGJdOVsJFfbx33jxnpFGg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SXO+92QbMKwUSG2t27ciunV1c3VvFkUuDmSczpRe008=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+KioGs1GM+xRBzFE67ePTWj04KMSE5/Y6qUF7nJ5kvU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "L3xNVbh6YH+RzqABN+5Jgb7T234Efpn766DmUvxIxgg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hPF+60mBYPjh21dEmPlBhKgyc9S2qLtTkypYvnqP2Fc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "EletRsETy2HcjaPIm2c8CkT7ch/P3pJJDC8hasepcSU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "r5bMXUaNKqLPxZ+TG9HYTG4aSDgcpim27rN8rQFkM0w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "0Q7Erdr8+/S0wUEDDIqlS5XjBVWvhZY65K0uUDb6+Ns=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xEcnhXy35hbXNVBPOOt3TUHbxvKfQ48KjA9b6/rbMqQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "T8bEpiQNgsEudXvyKE9SZlSvbpV/LUaslsdqgSFltyo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hIoiaF2YjnxDbODfhFEB+JGZ5nf8suD3Shck5bwQ3N0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "qnA6qzejeRJ0rsZaZ0zOvKAaXyxt5lpscKQNYFZNl4k=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "anAKCL2DN/le2VaP0n2ucYSEH/DaaEH/8Sa4OqTZsRA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JCZlBJaFm618oWYSnT9Jr1MtwFVw4BZjOzO+5yWgR90=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yxyk4n9762WzcDVGnTn4jCqUnSMIVCrLDIjCX1QVj34=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "fDI6fdKvDJwim5/CQwWZEzcrXE3LHgy7FTtffcC7tXE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Vex+gcz5T+WkzsVZQrkqUR2ryyZbnaOGuWpYvjN0zCw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "8TLEXz+Gbbp6llHpZXVjLsdlYY9f6hrKpHVpyfDe0RY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "7fTyt5BrunypS65TfOzFW2E2qdIuT4SLeDeGlbQoJCs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "8fKGrkqN0/KuSjyXgDBmRauDKrSa//JBKRWHEB9xBf4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "s4codmG7uN4ss6P357jL21lazEe90M9GOK5WrOknSV0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RkSpua8XF+NUdxVDU90EbLUTTyZFX3tt3atBTroFaRk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "LnTCuCDyAHK5B9KXzjtwGmWB+qergQk2OCjnIx9MI2A=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cBFh0virAX4pVXf/udIGI2951i0+0aZAdJcBVGtYnT4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "G54X6myQXWZ5fw/G31en3QbdgfXzL9+hFTtJpnWMqDI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "EdsiiuezcsFJFnYIyGjCOhnqMj1BOwTB5EFxN+ERUkg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dVH9MXLtk0WTwGQ3xmrhOqfropMUkDW3o6paNPGl3NU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "sB3HqXKWY3pKbuEH8BTbfNIGfbY+7/ZbOc3XC+JRNNI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "WHyDk62Xhqbo4/iie2aLIM4x2uuAjv6102dJSHI58oM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pNUFuHpeNRDUZ/NrtII2c6sNc9eGR1lIUlIyXKERA+0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "UPa+pdCqnN0bfAptdzldQOSd01gidrDKy8KhWrpSKAI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "l+7dOAlo+HUffMqFYXL6pgUFeTbwOM9CjKQLxEoLtc4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SRnDXV/rN6C8xwMutv9E1luv3DOUio3VkgPr8Cpm7Ew=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "QcH6gl+gX7xZ7OWhUNQMbndJy0Piz49pDo6RsnLkVSA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "t+uL4DnfsI/Zll/KXWW1cOKX3Hu8WIkm3pt9efCVSAQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "myutHDctku/+Uug/nD8gRbYvmx/IovtoAAC2/fz2oHA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6C+cjD0e0nSCP6cPqQYbNG7SlOd6Mfvi8hyfm7Ng+D8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zg01JSoOj9oBKT0S1ldJucXzY5AKgreS+h2xJreWTOs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "7qQ80/FjodHl1m1py/Oii0/9C/xWbLdhaRXQ+kkCP10=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YwWMNH07vL6c5Nhg+MRnVByhzUunu8y0VLM9z/XvR5U=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Dle8bU98+fudAbc14SToZFkwvV3tcYVsjDug0NWljpc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "J+eKL1vPJmlzltvhI6Li5Fz/TJmi3Ng+ehRTcs46API=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zB3XzfFygLwC3WHkj0up+VbEd25KKoce1vOpG/5bwK4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "vnVnmOnL+z2pqwE+A6cVKS0Iwy4F4/2IiElJca9bUQM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+lG5r/Fpqry3BtFuvY67+RntmHAMDoLVOSGc6ZoXPb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "L5MXQertqc6uj7ADe8aWKbd1sYHPCE7P1VYVg9Zc3VI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "imKONuZgopt0bhM3GMX2WVPwQYMTobuUUEdhcLfHs4c=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "eOkU1J1uVbiVFWBerbXsSIVcF2nqiicTkFy4x7kFHB8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "gI0uDhXeoH/UatDQKEf4qo8FHzWZDhb/wuWTqbq/ID4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cOkd5Aa3btYhtojE/smsF/PJnULqQ4NNqTkU6KXTFmo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "AWNJMs1MTe294oFipp8Y6P0CjpkZ4qCZoClQF3XcHq8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6gJtlzXOFhGYrVbTuRMmvMlDTwXdNtR9aGBlHZPwIMw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "LEmwVGA/xsEG7UrcOoYLFu6KCXgijzFznenknuDacm8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "mIRFPTXRrGaPtp/Ydij2jgkRe4uoUvAKxW2d8b9zYL0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "B+Uv2u48WALOO0L311z+eryjYQzKJVMfdHMZPhOAFmY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "INXXp0wDyVCq+NtfIrrC2ciETmyW/dWB/48/u4yLEZ4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "se7DGo8XrlrQDLEcco1tZrQt9kDe+0RTyl2bw/quG4w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "vr0m2+Zk9lbN6UgWCyn8xJWJOokU3IDYab5U5q1+CgQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "XI+eJ8Gy2JktG1gICgoj1qpsfy1tKmH0kglWbaQH6DA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "A+UCuNnuAUqnQzspA6TVqUPRmtZmpSex5HFw7THRxs0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xaH2Ehfljd19uo0Fvb3iwkdaiWEVQd2YPoitgEPkhSM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "S/iZBJGcc8+qZxyMtab65MMBoSglybwk3x58Nb86gnY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "w14ZE5qqY5YgkS4Zcs9YNbrQbY1XfGOOHNn9bOYnFVQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "0MhGd/jEF1vjkKGp+ZMn9SjLK54jkp9W4Hg+Sp/oxaI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "92QZ73e/NRTYgCm4aifaKth6aAsKnLLccBc0zx/qUTY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "WOjzemCgFJOiGIp81RSVh/tFlzSTj9eFWcBnsiv2Ycs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "DrsP9CmfKPjw5yLL8bnSeAxfNzAwlb+Z8OqCiKgBY7o=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lMogqg8veBv6mri3/drMe9afJiKMvevkmGcw9BedfLo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "TxqwNcY8Tg2MPpNdkPBwvfpuTttSYRHU26DGECKYQ9o=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "l0u1b4b4vYACWIwfnB7PZac4oDEgjQZCzHruNPTgAIY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "iVSGQ+cCfhbWIrY/v/WBORK92elu9gfRKyGhr6r/k00=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yK1forG50diEXte8ECzjfpHeYsPyuQ/dgxbxn/nzY5k=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "gIfTLCD3VwnOwkC0zPXWTqaITxX6ZplA69PO2a6zolc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "O/Zxlgh3WqpzJ7+Sd8XWMVID4/GXJUUWaSqfgDUi3b0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ZQ6yv368zwahUqSUYH/StL0Qgz/TwS1CzlMjVDvCciI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "m2rPEYkjwyiKdonMrKlcF7hya4lFOAUwEePJ3SgrNx8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Mq0yl5iVKlq71bT/dT/fXOWf2n90bTnXFnOdGDN0JOc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6qDGMXipPLC2O6EAAMjO2F9xx4rdqZso4IkPpH2304U=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "jvQHRQQa2RIszE2LX2Hv2LbRhYawJ6qmtRt8HZzFQXg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ovJXQrkZlpeHRciKyE/WWNm5O389gRgzx1W+Dw596X4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "a4kgRNvYctGYqyQv9qScL/WkljTYVylJ9pE9KDULlxU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "qV4Q48vPiCJMTjljotzYKI/zfExWpkKOSHGcAjGyDig=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "jtI7zbBF+QW/aYYTkn90zzyHLXLgmy7l1bzgMb2oqic=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q0KmJl9txPdn962UNvnfe6UFhdk9YaFZuTm33F+csso=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ULNdEqeZJgtmNOhN/Y9INzsE9AnxWYwOMn+pIbRXIFs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "R4oz9+wkdjpKe5tE1jpG7IURAnfvS5fLP4LrD5cZfTE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "qG5Z7VhwSu/HT/YFTgDzyAAzJKq51xPw2HeEV5btYC4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "OM/1DmIIZ5Qyhtq8TGkHTBEMVKjAnKRZMRXYtTG8ctc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "2R5vZbljLXnDFA99YfGuRB7pAdPJVKsT25zLNMC0fUk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "OMbavF2EmdAz1fHkLV3ctFEUDfriKhoT2gidwHZ9z1o=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "MWT4Zrw3/vVvTYMa1Is5Pjr3wEwnBfnEAPPUAHKQhNU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tBkRPfG9yxfKocQx5pAJX0oEHKPL0Tgtr+0UYe09InE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lqxpnDR/H0YgH7RcfKoNoaaRhe1SIazIeMbQ1fu9y3Q=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "utT1UdR22PWOTrOkZauztX613lAplV4eh/ejTRb7ZSk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "S+Y2yFyKi/a6FXhih4yGo29X8I8OT6/zwEoX6NMKT4o=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "QSjVppg29x6oS5yBg8OFjrFt0tuTpWCuKxfIy0k8YnE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "y3r6/Xsfvsl3HksXlVYkJgHUqpQGfICxg3x9f8Zw1qM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "BSltHzEwDjFN4du9rDHAPvl22atlcTioEtt+gC5L1tk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "0arGXjSN0006UnXbrWsGqhvBair569DeFDUME3Df3rA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "s/DumaMad08S+PBUUcrS+v42K0z8HgcdiQtrFAEu2Qs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "EzJ8Y8N0OQBTlnvrK82PdevDNZZO4E6CNgYVu8Cj6Ks=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "VA4vr8jBPI5QdiPrULzzZjBMIUbG3V7Slg5zm0bFcKc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YAOvEB2ZLtq9LQiFViBHWaxxWVVonC2rNYj9tN9s3L0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hgaHMo9aAGS+nBwvqnTjZO+YkiQPY1c1XcIYeaYKHyI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YvaoLt3ZpH0atB0tNzwMjpoxRYJXl0DqSjisMJiGVBE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "EMmW6CptFsiLoPOi5/uAJQ2FmeLg6mCpuVLLrRWk7Mc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "1jQsNMarSnarlYmXEuoFokeBMg/090qUD9wqo1Zn8Gs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hupXNKhRpJxpyDAAP1TgJ5JMZh9lhbMk6s7D7dMS3C8=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
\ No newline at end of file
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-Decimal-Update.json b/specifications/client-side-encryption/tests/legacy/fle2-Range-Decimal-Update.json
new file mode 100644
index 00000000000..2f8b991cf72
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-Decimal-Update.json
@@ -0,0 +1,1934 @@
+{
+ "runOn": [
+ {
+ "minServerVersion": "6.2.0",
+ "topology": [
+ "replicaset"
+ ]
+ }
+ ],
+ "database_name": "default",
+ "collection_name": "default",
+ "data": [],
+ "encrypted_fields": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDecimal",
+ "bsonType": "decimal",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ ]
+ },
+ "key_vault_data": [
+ {
+ "_id": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "keyMaterial": {
+ "$binary": {
+ "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==",
+ "subType": "00"
+ }
+ },
+ "creationDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "updateDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "status": {
+ "$numberInt": "0"
+ },
+ "masterKey": {
+ "provider": "local"
+ }
+ }
+ ],
+ "tests": [
+ {
+ "description": "FLE2 Range Decimal. Update.",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDecimal": {
+ "$numberDecimal": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDecimal": {
+ "$numberDecimal": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "updateOne",
+ "arguments": {
+ "filter": {
+ "encryptedDecimal": {
+ "$gt": {
+ "$numberDecimal": "0"
+ }
+ }
+ },
+ "update": {
+ "$set": {
+ "encryptedDecimal": {
+ "$numberDecimal": "2"
+ }
+ }
+ }
+ },
+ "result": {
+ "matchedCount": 1,
+ "modifiedCount": 1,
+ "upsertedCount": 0
+ }
+ }
+ ],
+ "expectations": [
+ {
+ "command_started_event": {
+ "command": {
+ "listCollections": 1,
+ "filter": {
+ "name": "default"
+ }
+ },
+ "command_name": "listCollections"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "find": "datakeys",
+ "filter": {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ },
+ "$db": "keyvault",
+ "readConcern": {
+ "level": "majority"
+ }
+ },
+ "command_name": "find"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 0,
+ "encryptedDecimal": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDecimal",
+ "bsonType": "decimal",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 1,
+ "encryptedDecimal": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDecimal",
+ "bsonType": "decimal",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command_name": "update",
+ "command": {
+ "update": "default",
+ "ordered": true,
+ "updates": [
+ {
+ "q": {
+ "encryptedDecimal": {
+ "$gt": {
+ "$binary": {
+ "base64": "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",
+ "subType": "06"
+ }
+ }
+ }
+ },
+ "u": {
+ "$set": {
+ "encryptedDecimal": {
+ "$$type": "binData"
+ }
+ }
+ }
+ }
+ ],
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDecimal",
+ "bsonType": "decimal",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ ]
+ }
+ },
+ "deleteTokens": {
+ "default.default": {
+ "encryptedDecimal": {
+ "e": {
+ "$binary": {
+ "base64": "65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+w=",
+ "subType": "00"
+ }
+ },
+ "o": {
+ "$binary": {
+ "base64": "noN+05JsuO1oDg59yypIGj45i+eFH6HOTXOPpeZ//Mk=",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "$db": "default"
+ }
+ }
+ }
+ ],
+ "outcome": {
+ "collection": {
+ "data": [
+ {
+ "_id": {
+ "$numberInt": "0"
+ },
+ "encryptedDecimal": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rbf3AeBEv4wWFAKknqDxRW5cLNkFvbIs6iJjc6LShQY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "n+XAuFnP8Dov9TnhGFxNx0K/MnVM9WbJ7RouEu0ndO0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yRXojuVdn5GQtD97qYlaCL6cOLmZ7Cvcb3wFjkLUIdM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "DuIkdRPITRs55I4SZmgomAHCIsDQmXRhW8+MOznkzSk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SsBk+Et1lTbU+QRPx+xyJ/jMkmfG+QCvQEpip2YYrzA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "crCIzOd8KhHvvUlX7M1v9bhvU4pLdTc+X2SuqoKU5Ek=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YOWdCw4UrqnxkAaVjqmC4sKQDMVMHEpFGnlxpxdaU6E=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "M3SShp81Ff8tQ632qKbv9MUcN6wjDaBReI0VXNu6Xh4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "gzHlSPxpM0hT75kQvWFzGlOxKvDoiKQZOr19V6l2zXI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "s3JnppOGYw9SL2Q1kMAZs948v2F5PrpXjGei/HioDWs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cG6+3Gk/zEH68P/uuuwiAUVCuyJwa1LeV+t29FlPPAo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dupdvR3AyJtM+g9NDKiaLVOtGca387JQp8w+V03m7Ig=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JqEQc5svj2jTvZ6LLA5ivE+kTb/0aRemSEmxk4G7Zrg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "szcXXXKnob+p3SoM4yED2R920LeJ7cVsclPMFTe4CeI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "o1QoGVXmuBdHwHm7aCtGMlMVKrjFdYvJXpoq6uhIAZ0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Jfm5wPlqqLCJRGQIqRq2NGmpn7s0Vrih2H3YAOoI2YU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zMHLb8ARbsYo8Ld05bqnGFf1Usha6EGb8QKwdSAyps0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yQdtq9lh5pugL7/i0Bj/PuZUUBUIzf+7wj1rl5y736w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wGWVZdO7qIuyDg/BqDgqjgoQ02h5YYgwXQB1oCin2NE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "by9HMLj6NTEpgztZ5HSN6GxImkXPcaFINYDzgZY33X8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tWo0vbasi7bXmn/MsOx13VC1IsWtpx/nYp0uj4iMzdA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tQQpndUYd5O87lOtrGjH3wl9VsOK0ray7RMasL90sBM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cQjXEDCMsOpKLLf+vlTgIHA+cbSJdzqhbSX9Wvh95aA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "7yMpU48IxK9SzP2cx3VnTownGEwFmeFofuuFT97SuuY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kSOx1kz0CmBgzKQHZlo65ZUY1DIv9A99JRm+Us2y6Ew=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ubQpdPBe6/xvtr+AcXdfYLSvYCR4ot0tivehkCsupb4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xal+iCJ6FTefRQToyoNksc9NCZShyn04NDGi4IYrcoM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "d7jU4iOK50xHxlkSifcxlZFCM46TSgQzoYivxG3HNLY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tJvl2nsBLBVzL3pp6sKWCL4UXeh3q/roYBJjSb74ve0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "OIUCaKRvIx9t1w6Hxlz1IcQTdPNCfdRNwnnTm10W+X0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "A9tvzsiElotOUVIB4CqfQp9mAwqvTM35YkmAR170aHA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lI8gpK7hpb7c9x4RQugsxMnQay5LZJmwslZdvMx/dcE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dNCzh40U0XvdKnSDi3HRQOWQftEsDVqc4uUvsVFGoq8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "IP+iwEBWBwVVZIdpaMu8k5+soFCz+TZkYn3drKZ9grE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pnqyh6e0y5svHkJDShlN9CHV0WvMBE4QbtJpQw5ZCXc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "elEl42tbVDoRTLjAhZUFEtXiut4b3PVhg/1ZLZSQdtE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "vHuu2FxwclMHqyE6JBYbTYgbEkB0dqb/JuaxsvfwsmY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xTf7NCe3Gf8QpE78HR5OknlLTKfs9J+RN9UZpH6fnso=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "XiWSasRnJAulGR6+LCVD3mwRObXylqYWR9jvpywq12c=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "MZMxEQ5ikx0PG1YFIExv0UnTZogsvgeOEZTpzvBDn4w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yZMyMZBDrWbAhvnic7vvIYhmO9m5H2iuv0c8KNZrBzY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xxM14hTPY5j0vvcK2C7YAEjzdsfUTFHozHC0hEo1bxI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+01rqR1xVwkpGXcstbk1ItJqFVjH6Q8MGxEN3Cm9Y1A=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xOpLV0Z2VTRJ3iWtnWZcsyjXubTIkYWo31cO+HV1o1k=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "BWUOLqgLBqc5NwxVlSV5H3KFQPXbCp7mdo+jF+8cJqY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "fuQb1S6xZDGlrEbK+kI23aL53PP1PVNwqICnZNt9Yzg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SfscnoibFttahLdPVC4Ee+47ewGFKpDSU7M6HX19bKE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rpSW2awybNVeKtat91VFxqbINoTfNhPfQAu+d73Xtf8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "9M/CP9ccOIIj2LLFmE0GFDO0Ban2wsNalEXfM6+h+1s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "WrEMG49l1ye4MhXs5ZS9tz8P6h+hDvthIg/2wW9ne1Q=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ImNhbfeyfH8qIEeA5ic0s3dAQBdzzTBS+CPsNih9vZ0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dWP33YDSn04UKJN2ogh2Rui0iW/0q2y18OCDRVcfyoo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lYv0isAtfGh6H9tdp3cp2eHU7q2J+uk7QrgcxtK3w7Y=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "VGMoamB/+7zTOYcY/pqJc96xlv2PdW4hwsIAEIslTDQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yNeBWMF7BnD9wVwz2PgJsvWr77QiVvvWUvJF0+fqBug=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SfpvObJ+tJBXSvqeN7vlOfmhYign635lciYAJIjUtY8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dsen4NqjzVGjpjufiTMs3+gqeD09EbnuogPgxrJECwg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pxCWVM3sn19NsFEpgHbgLa+PmYlhN3mMiP0Wk8kJhYw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q11KNvJszjYIB9n9HcC+N4uz11a3eRj1L3BH9scKMDQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "A1PmkgcEToWh1JiVWE6mI5jUu7poxWWuCUt/cgRUUDc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "qJo3Hu4PJeanL7XEaWXO/n3YsodhZyd+MJOOmB9Kpd8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "BkBKLO8URFscfRY9Bav/1+L9mLohDgNr/MkZtGiraIs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rZq5WA3Hx3xthOyHAJXK//f8pE2qbz7YKu3TIMp9GFY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "X07a/Lm80p5xd4RFs1dNmw+90tmPDPdGiAKVZkxd4zY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6YrBn2ofIw1b5ooakrLOwF41BWrps8OO0H9WH4/rtlE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "0l86Ag5OszXpa78SlOUV3K9nff5iC1p0mRXtLg9M1s4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Hn6yuxFHodeyu7ISlhYrbSf9pTiH4TDEvbYLWjTwFO0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zdf4y2etKBuIpkEU1zMwoCkCsdisfXZCh8QPamm+drY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rOQ9oMdiK5xxGH+jPzOvwVqdGGnF3+HkJXxn81s6hp4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "61aKKsE3+BJHHWYvs3xSIBvlRmKswmaOo5rygQJguUg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "KuDb/GIzqDM8wv7m7m8AECiWJbae5EKKtJRugZx7kR0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Q+t8t2TmNUiCIorVr9F3AlVnX+Mpt2ZYvN+s8UGict8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tJRZIpKxUgHyL83kW8cvfjkxN3z6WoNnUg+SQw+LK+k=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pnUsYjip8SvW0+m9mR5WWTkpK+p6uwJ6yBUAlBnFKMk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "PArHlz+yPRYDycAP/PgnI/AkP8Wgmfg++Vf4UG1Bf0E=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wnIh53Q3jeK8jEBe1n8kJLa89/H0BxO26ZU8SRIAs9Q=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "4F8U59gzBLGhq58PEWQk2nch+R0Va7eTUoxMneReUIA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ihKagIW3uT1dm22ROr/g5QaCpxZVj2+Fs/YSdM2Noco=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "EJtUOOwjkrPUi9mavYAi+Gom9Y2DuFll7aDwo4mq0M0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dIkr8dbaVRQFskAVT6B286BbcBBt1pZPEOcTZqk4ZcI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "aYVAcZYkH/Tieoa1XOjE/zCy5AJcVTHjS0NG2QB7muA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "sBidL6y8TenseetpioIAAtn0lK/7C8MoW4JXpVYi3z8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "0Dd2klU/t4R86c2WJcJDAd57k/N7OjvYSO5Vf8KH8sw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "I3jZ92WEVmZmgaIkLbuWhBxl7EM6bEjiEttgBJunArA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "aGHoQMlgJoGvArjfIbc3nnkoc8SWBxcrN7hSmjMRzos=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "bpiWPnF/KVBQr5F6MEwc5ZZayzIRvQOLDAm4ntwOi8g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tI7QVKbE6avWgDD9h4QKyFlnTxFCwd2iLySKakxNR/I=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "XGsge0CnoaXgE3rcpKm8AEeku5QVfokS3kcI+JKV1lk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JQxlryW2Q5WOwfrjAnaZxDvC83Dg6sjRVP5zegf2WiM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YFuHKJOfoqp1iGVxoFjx7bLYgVdsN4GuUFxEgO9HJ5s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Z6vUdiCR18ylKomf08uxcQHeRtmyav7/Ecvzz4av3k4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SPGo1Ib5AiP/tSllL7Z5PAypvnKdwJLzt8imfIMSEJQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "m94Nh6PFFQFLIib9Cu5LAKavhXnagSHG6F5EF8lD96I=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pfEkQI98mB+gm1+JbmVurPAODMFPJ4E8DnqfVyUWbSo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "DNj3OVRLbr43s0vd+rgWghOL3FqeO/60npdojC8Ry/M=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kAYIQrjHVu49W8FTxyxJeiLVRWWjC9fPcBn+Hx1F+Ss=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "aCSO7UVOpoQvu/iridarxkxV1SVxU1i9HVSYXUAeXk4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Gh6hTP/yj1IKlXQ+Q69KTfMlGZjEcXoRLGbQHNFo/1s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "/gDgIFQ4tAlJk3GN48IS5Qa5IPmErwGk8CHxAbp6gs0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "PICyimwPjxpusyKxNssOOwUotAUbygpyEtORsVGXT8g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "4lu+cBHyAUvuxC6JUNyHLzHsCogGSWFFnUCkDwfQdgI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pSndkmoNUJwXjgkbkgOrT5f9nSvuoMEZOkwAN9ElRaE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tyW+D4i26QihNM5MuBM+wnt5AdWGSJaJ4X5ydc9iWTU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "9Syjr8RoxUgPKr+O5rsCu07AvcebA4P8IVKyS1NVLWc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "67tPfDYnK2tmrioI51fOBG0ygajcV0pLo5+Zm/rEW7U=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "y0EiPRxYTuS1eVTIaPQUQBBxwkyxNckbePvKgChwd0M=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "NWd+2veAaeXQgR3vCvzlI4R1WW67D5YsVLdoXfdb8qg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "PY5RQqKQsL2GqBBSPNOEVpojNFRX/NijCghIpxD6CZk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lcvwTyEjFlssCJtdjRpdN6oY+C7bxZY+WA+QAqzj9zg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CWE7XRNylvTwO/9Fv56dNqUaQWMmESNS/GNIwgBaEI0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ijwlrUeS8nRYqK1F8kiCYF0mNDolEZS+/lJO1Lg93C8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "8KzV+qYGYuIjoNj8eEpnTuHrMYuhzphl80rS6wrODuU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wDyTLjSEFF895hSQsHvmoEQVS6KIkZOtq1c9dVogm9I=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SGrtPuMYCjUrfKF0Pq/thdaQzmGBMUvlwN3ORIu9tHU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "KySHON3hIoUk4xWcwTqk6IL0kgjzjxgMBObVIkCGvk4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hBIdS9j0XJPeT4ot73ngELkpUoSixvRBvdOL9z48jY8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Tx6um0q9HjS5ZvlFhvukpI6ORnyrXMWVW1OoxvgqII0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zFKlyfX5H81+d4A4J3FKn4T5JfG+OWtR06ddyX4Mxas=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cGgCDuPV7MeMMYEDpgOupqyNP4BQ4H7rBnd2QygumgM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "IPaUoy98v11EoglTpJ4kBlEawoZ8y7BPwzjLYBpkvHQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Pfo4Am6tOWAyZNn8G9W5HWWGC3ZWmX0igI/RRB870Ro=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "fnTSjd7bC1Udoq6iM7UDnHAC/lsIXSHp/Gy332qw+/I=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "fApBgVRrTDyEumkeWs5p3ag9KB48SbU4Si0dl7Ns9rc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "QxudfBItgoCnUj5NXVnSmWH3HK76YtKkMmzn4lyyUYY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "sSOvwhKa29Wq94bZ5jGIiJQGbG1uBrKSBfOYBz/oZeI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FdaMgwwJ0NKsqmPZLC5oE+/0D74Dfpvig3LaI5yW5Fs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "sRWBy12IERN43BSZIrnBfC9+zFBUdvjTlkqIH81NGt4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "/4tIRpxKhoOwnXAiFn1Z7Xmric4USOIfKvTYQXk3QTc=",
+ "subType": "00"
+ }
+ }
+ ]
+ },
+ {
+ "_id": {
+ "$numberInt": "1"
+ },
+ "encryptedDecimal": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "DLCAJs+W2PL2DV5YChCL6dYrQNr+j4p3L7xhVaub4ic=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Mr/laWHUijZT5VT3x2a7crb7wgd/UXOGz8jr8BVqBpM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wXVD/HSbBljko0jJcaxJ1nrzs2+pchLQqYR3vywS8SU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "VDCpBYsJIxTfcI6Zgf7FTmKMxUffQv+Ys8zt5dlK76I=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zYDslUwOUVNwTYkETfjceH/PU3bac9X3UuQyYJ19qK0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rAOmHSz18Jx107xpbv9fYcPOmh/KPAqge0PAtuhIRnc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "BFOB1OGVUen7VsOuS0g8Ti7oDsTt2Yj/k/7ta8YAdGM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "2fckE5SPs0GU+akDkUEM6mm0EtcV3WDE/sQsnTtodlk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "mi9+aNjuwIvaMpSHENvKzKRAmX9cYguo2mXLvOoftHQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "K6TWn4VcWWkz/gkUkLmbtwkG7SNeABICmLDnoYJFlLU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Z+2/cEtGU0Fq7QJFNGA/0y4aWAsw0ncG6X0LYRqwS3c=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rrSIf+lgcNZFbbUkS9BmE045jRWBpcBJXHzfMVEFuzE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "KlHL3Kyje1/LMIfgbCqw1SolxffJvvgsYBV5y77wxuA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hzJ1YBoETmYeCh352dBmG8d8Wse/bUcqojTWpWQlgsc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lSdcllDXx8MA+s0GULjDA1lQkcV0L8/aHtZ6dM2pZ2c=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "HGr7JLTTA7ksAnlmjSIwwdBVvgr3fv46/FTdiCPYpos=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "mMr25v1VwOEVZ8xaNUTHJCcsYqV+kwK6RzGYilxPtJ4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "129hJbziPJzNo0IoTU3bECdge0FtaPW8dm4dyNVNwYU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "doiLJ96qoo+v7NqIAZLq6BI5axV8Id8gT5vyJ1ZZ0PM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cW/Lcul3xYmfyvI/0x/+ybN78aQmBK1XIGs1EEU09N8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "1aVIwzu9N5EJV9yEES+/g6hOTH7cA2NTcLIc59cu0wU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kw5tyl7Ew0r1wFyrN1mB9FiVW2hK2BxxxUuJDNWjyjQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ADAY2YBrm6RJBDY/eLLcfNxmSJku+mefz74gH66oyco=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "8gkqB1LojzPrstpFG7RHYmWxXpIlPDTqWnNsXH7XDRU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "TESfVQMDQjfTZmHmUeYUE2XrokJ6CcrsKx/GmypGjOw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "qFM+HFVQ539S0Ouynd1fBHoemFxtU9PRxE5+Dq7Ljy4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "jPiFgUZteSmOg4wf3bsEKCZzcnxmMoILsgp/GaZD+dM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YaWUgJhYgPNN7TkFK16H8SsQS226JguaVhOIQxZwQNQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "x90/Qk3AgyaFsvWf2KUCu5XF3j76WFSjt/GrnG01060=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ZGWybWL/xlEdMYRFCZDUoz10sywTf7U/7wufsb78lH0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "8l4ganN66jIcdxfHAdYLaym/mdzUUQ8TViw3MDRySPc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "c8p5XEGTqxqvRGVlR+nkxw9uUdoqDqTB0jlYQ361qMA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "1ZGFLlpQBcU3zIUg8MmgWwFKVz/SaA7eSYFrfe3Hb70=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "34529174M77rHr3Ftn9r8jU4a5ztYtyVhMn1wryZSkU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YkQ4pxFWzc49MS0vZM6S8mNo4wAwo21rePBeF3C+9mI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "MhOf4mYY00KKVhptOcXf0bXB7WfuuM801MRJg4vXPgc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "7pbbD8ihNIYIBJ3tAUPGzHpFPpIeCTAk5L88qCB0/9w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "C9Q5PoNJTQo6pmNzXEEXUEqH22//UUWY1gqILcIywec=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "AqGVk1QjDNDLYWGRBX/nv9QdGR2SEgXZEhF0EWBAiSE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "/sGI3VCbJUKATULJmhTayPOeVW+5MjWSvVCqS77sRbU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yOtbL0ih7gsuoxVtRrACMz+4N5uo7jIR7zzmtih2Beo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "uA6dkb2Iyg9Su8UNDvZzkPx33kPZtWr/CCuEY+XgzUM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "1DoSFPdHIplqZk+DyWAmEPckWwXw/GdB25NLmzeEZhk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "OfDVS0T3ZuIXI/LNbTp6C9UbPIWLKiMy6Wx+9tqNl+g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "3PZjHXbmG6GtPz+iapKtQ3yY4PoFFgjIy+fV2xQv1YU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kaoLN0BoBWsmqE7kKkJQejATmLShd8qffcAmlhsxsGY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "vpiw9KgQdegGmp7IJnSGX2miujRLU0xzs0ITTqbPW7c=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "NuXFf7xGUefYjIUTuMxNUTCfVHrF8oL0AT7dPv5Plk4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "8Tz53LxtfEBJ9eR+d2690kwNsqPV6XyKo2PlqZCbUrc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "e6zsOmHSyV8tyQtSX6BSwui6wK9v1xG3giY/IILJQ2w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "2fedFMCxa2DzmIpfbDKGXhQg0PPwbUv6vIWdwwlvhms=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yEJKMFnWXTC8tJUfzCInzQRByNEPjHxpw4L4m8No91Q=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YbFuWwOiFuQyOzIJXDbOkCWC2DyrG+248TBuVCa1pXU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "w7IkwGdrguwDrar5+w0Z3va5wXyZ4VXJkDMISyRjPGo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YmJUoILTRJPhyIyWyXJTsQ6KSZHHbEpwPVup6Ldm/Ko=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FvMjcwVZJmfh6FP/yBg2wgskK+KHD8YVUY6WtrE8xbg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "h4HCtD4HyYz0nci49IVAa10Z4NJD/FHnRMV4sRX6qro=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "nC7BpXCmym+a0Is2kReM9cYN2M1Eh5rVo8fjms14Oiw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "1qtVWaeVo649ZZZtN8gXbwLgMWGLhz8beODbvru0I7Q=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Ej+mC0QFyMNIiSjR939S+iGBm7dm+1xObu5IcF/OpbU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "UQ8LbUG3cMegbr9yKfKanAPQE1EfPkFciVDrNqZ5GHY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "4iI3mXIDjnX+ralk1HhJY43mZx2uTJM7hsv9MQzTX7E=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "0WQCcs3rvsasgohERHHCaBM4Iy6yomS4qJ5To3/yYiw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "qDCTVPoue1/DOAGNAlUstdA9Sid8MgEY4e5EzHcVHRk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "9F9Mus0UnlzHb8E8ImxgXtz6SU98YXD0JqswOKw/Bzs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pctHpHKVBBcsahQ6TNh6/1V1ZrqOtKSAPtATV6BJqh0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "vfR3C/4cPkVdxtNaqtF/v635ONbhTf5WbwJM6s4EXNE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ejP43xUBIex6szDcqExAFpx1IE/Ksi5ywJ84GKDFRrs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "jbP4AWYd3S2f3ejmMG7dS5IbrFol48UUoT+ve3JLN6U=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CiDifI7958sUjNqJUBQULeyF7x0Up3loPWvYKw9uAuw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "e2dQFsiHqd2BFHNhlSxocjd+cPs4wkcUW/CnCz4KNuM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "PJFckVmzBipqaEqsuP2mkjhJE4qhw36NhfQ9DcOHyEU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "S3MeuJhET/B8VcfZYDR9fvX0nscDj416jdDekhmK11s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CGVHZRXpuNtQviDB2Kj03Q8uvs4w3RwTgV847R7GwPw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yUGgmgyLrxbEpDVy89XN3c2cmFpZXWWmuJ/35zVZ+Jw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "inb6Q97mL1a9onfNTT8v9wsoi/fz7KXKq3p8j90AU9c=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CCyYx/4npq9xGO1lsCo8ZJhFO9/tN7DB+/DTE778rYg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "LNnYw4fwbiAZu0kBdAHPEm/OFnreS+oArdB5O/l/I98=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "P006SxmUS/RjiQJVYPdMFnNo3827GIEmSzagggkg05Q=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "oyvwY+WsnYV6UHuPki1o0ILJ2jN4uyXf9yaUNtZJyBA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "36Lk3RHWh1wmtCWC/Yj6jNIo17U5y6SofAgQjzjVxD8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "vOOo8FqeHnuO9mqOYjIb4vgwIwVyXZ5Y+bY5d9tGFUM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "bJiDJjwQRNxqxlGjRm5lLziFhcfTDCnQ/qU1V85qcRg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "2Qgrm1n0wUELAQnpkEiIHB856yv76q8jLbpiucetcm0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "5ciPOYxTK0WDwwYyfs7yiVymwtYQXDELLxmM4JLl4/o=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "31dC2WUSIOKQc4jwT6PikfeYTwi80mTlh7P31T5KNQU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YluTV2Mu53EGCKLcWfHZb0BM/IPW2xJdG3vYlDMEsM4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dh/8lGo2Ek6KukSwutH6Q35iy8TgV0FN0SJqe0ZVHN8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "EVw6HpIs3BKen2qY2gz4y5dw1JpXilfh07msZfQqJpc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FYolLla9L8EZMROEdWetozroU40Dnmwwx2jIMrr7c1A=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "8M6k4QIutSIj6CM41vvkQtuFsaGrjoR9SZJVSLbfGKQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "9LM0VoddDNHway442MqY+Z7vohB2UHau/cddshhzf40=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "66i8Ytco4Yq/FMl6pIRZazz3CZlu8fO2OI6Pne0pvHU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "2a/HgX+MjZxjXtSvHgF1yEpHMJBkl8Caee8XrJtn0WM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "frhBM662c4ZVG7mWP8K/HhRjd01lydW/cPcHnDjifqc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6k1T7Q1t668PBqv6fwpVnT1HWh7Am5LtbKvwPJKcpGU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "UlJ5Edfusp8S/Pyhw6KTglIejmbr1HO0zUeHn/qFETA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "jsxsB+1ECB3assUdoC333do9tYH+LglHmVSJHy4N8Hg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "2nzIQxGYF7j3bGsIesECEOqhObKs/9ywknPHeJ3yges=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xJYKtuWrX90JrJVoYtnwP7Ce59XQGFYoalxpNfBXEH0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "NLI5lriBTleGCELcHBtNnmnvwSRkHHaLOX4cKboMgTw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hUOQV0RmE5aJdJww1AR9rirJG4zOYPo+6cCkgn/BGvQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "h4G2Of76AgxcUziBwCyH+ayMOpdBWzg4yFrTfehSC2c=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "VuamM75RzGfQpj2/Y1jSVuQLrhy6OAwlZxjuQLB/9Ss=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kn9+hLq7hvw02xr9vrplOCDXKBTuFhfbX7d5v/l85Pg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "fAiGqKyLZpGngBYFbtYUYt8LUrJ49vYafiboifTDjxs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "BxRILymgfVJCczqjUIWXcfrfSgrrYkxTM5VTg0HkZLY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CrFY/PzfPU2zsFkGLu/dI6mEeizZzCR+uYgjZBAHro0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "AEbrIuwvXLTtYgMjOqnGQ8y8axUn5Ukrn7UZRSyfQVw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ouWeVH3PEFg+dKWlXc6BmqirJOaVWjJbMzZbCsce4dA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+hd6xFB+EG+kVP7WH4uMd1CLaWMnt5xJRaY/Guuga9Q=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zmpGalfAOL3gmcUMJYcLYIRT/2VDO/1Dw4KdYZoNcng=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "2PbHAoM/46J2UIZ/vyksKzmVVfxA7YUyIxWeL/N/vBk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "7fD9x+zk5MVFesb59Klqiwwmve7P5ON/5COURXj5smE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tlrNQ4jaq051iaWonuv1sSrYhKkL1LtNZuHsvATha3s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "fBodm28iClNpvlRyVq0dOdXQ08S7/N3aDwid+PdWvRo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "O+/nnRqT3Zv7yMMGug8GhKHaWy6u7BfRGtZoj0sdN1c=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "5AZZ/RTMY4Photnm/cpXZr/HnFRi3eljacMsipkJLHA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "oFVyo/kgoMxBIk2VE52ySSimeyU+Gr0EfCwapXnTpKA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Z8v59DfcnviA0mzvnUk+URVO0UuqAWvtarEgJva/n1c=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "P64GOntZ+zBJEHkigoh9FSxSO+rJTqR20z5aiGQ9an4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xMbSuDPfWuO/Dm7wuVl06GnzG9uzTlJJX9vFy7boGlY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kXPB19mRClxdH2UsHwlttS6lLU2uHvzuZgZz7kC45jU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "NDVjVYXAw4k0w4tFzvs7QDq39aaU3HQor4I2XMKKnCk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "uKw/+ErVfpTO1dGUfd3T/eWfZW3nUxXCdBGdjvHtZ88=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "av0uxEzWkizYWm0QUM/MN1hLibnxPvCWJKwjOV4yVQY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ERwUC47dvgOBzIsEESMIioLYbFOxOe8PtJTnmDkKuHM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "2gseKlG5Le12fS/vj4eaED4lturF16kAgJ1TpW3HxEE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "7Cvg0Y3j/5i2F1TeXxlMmU7xwif5dCmwkZAOrVC5K2Y=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ ]
+}
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-Decimal-Update.yml b/specifications/client-side-encryption/tests/legacy/fle2-Range-Decimal-Update.yml
new file mode 100644
index 00000000000..99ed254d945
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-Decimal-Update.yml
@@ -0,0 +1,1705 @@
+# Requires libmongocrypt 1.7.0.
+runOn:
+ - minServerVersion: "6.2.0"
+ # FLE 2 Encrypted collections are not supported on standalone.
+ # Tests for Decimal (without precision) must only run against a replica set. Decimal (without precision) queries are expected to take a long time and may exceed the default mongos timeout.
+ topology: [ "replicaset" ]
+database_name: &database_name "default"
+collection_name: &collection_name "default"
+data: []
+encrypted_fields: &encrypted_fields {'escCollection': 'enxcol_.default.esc', 'eccCollection': 'enxcol_.default.ecc', 'ecocCollection': 'enxcol_.default.ecoc', 'fields': [{'keyId': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'path': 'encryptedDecimal', 'bsonType': 'decimal', 'queries': {'queryType': 'rangePreview', 'contention': {'$numberLong': '0'}, 'sparsity': {'$numberLong': '1'}}}]}
+key_vault_data: [ {'_id': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'keyMaterial': {'$binary': {'base64': 'sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==', 'subType': '00'}}, 'creationDate': {'$date': {'$numberLong': '1648914851981'}}, 'updateDate': {'$date': {'$numberLong': '1648914851981'}}, 'status': {'$numberInt': '0'}, 'masterKey': {'provider': 'local'}} ]
+tests:
+ - description: "FLE2 Range Decimal. Update."
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments:
+ document: &doc0 { _id: 0, encryptedDecimal: { $numberDecimal: "0" } }
+ - name: insertOne
+ arguments:
+ document: &doc1 { _id: 1, encryptedDecimal: { $numberDecimal: "1" } }
+ - name: updateOne
+ arguments:
+ filter: { encryptedDecimal: { $gt: { $numberDecimal: "0" } } }
+ update: { "$set": { "encryptedDecimal": { $numberDecimal: "2" } }}
+ result:
+ matchedCount: 1
+ modifiedCount: 1
+ upsertedCount: 0
+ expectations:
+ - command_started_event:
+ command:
+ listCollections: 1
+ filter:
+ name: *collection_name
+ command_name: listCollections
+ - command_started_event:
+ command:
+ find: datakeys
+ filter: {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ }
+ $db: keyvault
+ readConcern: { level: "majority" }
+ command_name: find
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc0_encrypted { "_id": 0, "encryptedDecimal": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc1_encrypted { "_id": 1, "encryptedDecimal": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command_name: update
+ command:
+ {
+ "update": "default",
+ "ordered": true,
+ "updates": [
+ {
+ "q": {
+ "encryptedDecimal": {
+ "$gt": {
+ "$binary": {
+ "base64": "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",
+ "subType": "06"
+ }
+ }
+ }
+ },
+ "u": {
+ "$set": {
+ "encryptedDecimal": { $$type: "binData" }
+ }
+ }
+ }
+ ],
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": *encrypted_fields
+ },
+ "deleteTokens": {
+ "default.default": {
+ "encryptedDecimal": {
+ "e": {
+ "$binary": {
+ "base64": "65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+w=",
+ "subType": "00"
+ }
+ },
+ "o": {
+ "$binary": {
+ "base64": "noN+05JsuO1oDg59yypIGj45i+eFH6HOTXOPpeZ//Mk=",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "$db": "default"
+ }
+
+ outcome:
+ collection:
+ # Outcome is checked using a separate MongoClient without auto encryption.
+ data:
+ -
+ {
+ "_id": {
+ "$numberInt": "0"
+ },
+ "encryptedDecimal": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rbf3AeBEv4wWFAKknqDxRW5cLNkFvbIs6iJjc6LShQY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "n+XAuFnP8Dov9TnhGFxNx0K/MnVM9WbJ7RouEu0ndO0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yRXojuVdn5GQtD97qYlaCL6cOLmZ7Cvcb3wFjkLUIdM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "DuIkdRPITRs55I4SZmgomAHCIsDQmXRhW8+MOznkzSk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SsBk+Et1lTbU+QRPx+xyJ/jMkmfG+QCvQEpip2YYrzA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "crCIzOd8KhHvvUlX7M1v9bhvU4pLdTc+X2SuqoKU5Ek=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YOWdCw4UrqnxkAaVjqmC4sKQDMVMHEpFGnlxpxdaU6E=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "M3SShp81Ff8tQ632qKbv9MUcN6wjDaBReI0VXNu6Xh4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "gzHlSPxpM0hT75kQvWFzGlOxKvDoiKQZOr19V6l2zXI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "s3JnppOGYw9SL2Q1kMAZs948v2F5PrpXjGei/HioDWs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cG6+3Gk/zEH68P/uuuwiAUVCuyJwa1LeV+t29FlPPAo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dupdvR3AyJtM+g9NDKiaLVOtGca387JQp8w+V03m7Ig=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JqEQc5svj2jTvZ6LLA5ivE+kTb/0aRemSEmxk4G7Zrg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "szcXXXKnob+p3SoM4yED2R920LeJ7cVsclPMFTe4CeI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "o1QoGVXmuBdHwHm7aCtGMlMVKrjFdYvJXpoq6uhIAZ0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Jfm5wPlqqLCJRGQIqRq2NGmpn7s0Vrih2H3YAOoI2YU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zMHLb8ARbsYo8Ld05bqnGFf1Usha6EGb8QKwdSAyps0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yQdtq9lh5pugL7/i0Bj/PuZUUBUIzf+7wj1rl5y736w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wGWVZdO7qIuyDg/BqDgqjgoQ02h5YYgwXQB1oCin2NE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "by9HMLj6NTEpgztZ5HSN6GxImkXPcaFINYDzgZY33X8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tWo0vbasi7bXmn/MsOx13VC1IsWtpx/nYp0uj4iMzdA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tQQpndUYd5O87lOtrGjH3wl9VsOK0ray7RMasL90sBM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cQjXEDCMsOpKLLf+vlTgIHA+cbSJdzqhbSX9Wvh95aA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "7yMpU48IxK9SzP2cx3VnTownGEwFmeFofuuFT97SuuY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kSOx1kz0CmBgzKQHZlo65ZUY1DIv9A99JRm+Us2y6Ew=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ubQpdPBe6/xvtr+AcXdfYLSvYCR4ot0tivehkCsupb4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xal+iCJ6FTefRQToyoNksc9NCZShyn04NDGi4IYrcoM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "d7jU4iOK50xHxlkSifcxlZFCM46TSgQzoYivxG3HNLY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tJvl2nsBLBVzL3pp6sKWCL4UXeh3q/roYBJjSb74ve0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "OIUCaKRvIx9t1w6Hxlz1IcQTdPNCfdRNwnnTm10W+X0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "A9tvzsiElotOUVIB4CqfQp9mAwqvTM35YkmAR170aHA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lI8gpK7hpb7c9x4RQugsxMnQay5LZJmwslZdvMx/dcE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dNCzh40U0XvdKnSDi3HRQOWQftEsDVqc4uUvsVFGoq8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "IP+iwEBWBwVVZIdpaMu8k5+soFCz+TZkYn3drKZ9grE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pnqyh6e0y5svHkJDShlN9CHV0WvMBE4QbtJpQw5ZCXc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "elEl42tbVDoRTLjAhZUFEtXiut4b3PVhg/1ZLZSQdtE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "vHuu2FxwclMHqyE6JBYbTYgbEkB0dqb/JuaxsvfwsmY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xTf7NCe3Gf8QpE78HR5OknlLTKfs9J+RN9UZpH6fnso=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "XiWSasRnJAulGR6+LCVD3mwRObXylqYWR9jvpywq12c=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "MZMxEQ5ikx0PG1YFIExv0UnTZogsvgeOEZTpzvBDn4w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yZMyMZBDrWbAhvnic7vvIYhmO9m5H2iuv0c8KNZrBzY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xxM14hTPY5j0vvcK2C7YAEjzdsfUTFHozHC0hEo1bxI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+01rqR1xVwkpGXcstbk1ItJqFVjH6Q8MGxEN3Cm9Y1A=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xOpLV0Z2VTRJ3iWtnWZcsyjXubTIkYWo31cO+HV1o1k=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "BWUOLqgLBqc5NwxVlSV5H3KFQPXbCp7mdo+jF+8cJqY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "fuQb1S6xZDGlrEbK+kI23aL53PP1PVNwqICnZNt9Yzg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SfscnoibFttahLdPVC4Ee+47ewGFKpDSU7M6HX19bKE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rpSW2awybNVeKtat91VFxqbINoTfNhPfQAu+d73Xtf8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "9M/CP9ccOIIj2LLFmE0GFDO0Ban2wsNalEXfM6+h+1s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "WrEMG49l1ye4MhXs5ZS9tz8P6h+hDvthIg/2wW9ne1Q=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ImNhbfeyfH8qIEeA5ic0s3dAQBdzzTBS+CPsNih9vZ0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dWP33YDSn04UKJN2ogh2Rui0iW/0q2y18OCDRVcfyoo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lYv0isAtfGh6H9tdp3cp2eHU7q2J+uk7QrgcxtK3w7Y=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "VGMoamB/+7zTOYcY/pqJc96xlv2PdW4hwsIAEIslTDQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yNeBWMF7BnD9wVwz2PgJsvWr77QiVvvWUvJF0+fqBug=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SfpvObJ+tJBXSvqeN7vlOfmhYign635lciYAJIjUtY8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dsen4NqjzVGjpjufiTMs3+gqeD09EbnuogPgxrJECwg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pxCWVM3sn19NsFEpgHbgLa+PmYlhN3mMiP0Wk8kJhYw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q11KNvJszjYIB9n9HcC+N4uz11a3eRj1L3BH9scKMDQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "A1PmkgcEToWh1JiVWE6mI5jUu7poxWWuCUt/cgRUUDc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "qJo3Hu4PJeanL7XEaWXO/n3YsodhZyd+MJOOmB9Kpd8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "BkBKLO8URFscfRY9Bav/1+L9mLohDgNr/MkZtGiraIs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rZq5WA3Hx3xthOyHAJXK//f8pE2qbz7YKu3TIMp9GFY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "X07a/Lm80p5xd4RFs1dNmw+90tmPDPdGiAKVZkxd4zY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6YrBn2ofIw1b5ooakrLOwF41BWrps8OO0H9WH4/rtlE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "0l86Ag5OszXpa78SlOUV3K9nff5iC1p0mRXtLg9M1s4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Hn6yuxFHodeyu7ISlhYrbSf9pTiH4TDEvbYLWjTwFO0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zdf4y2etKBuIpkEU1zMwoCkCsdisfXZCh8QPamm+drY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rOQ9oMdiK5xxGH+jPzOvwVqdGGnF3+HkJXxn81s6hp4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "61aKKsE3+BJHHWYvs3xSIBvlRmKswmaOo5rygQJguUg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "KuDb/GIzqDM8wv7m7m8AECiWJbae5EKKtJRugZx7kR0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Q+t8t2TmNUiCIorVr9F3AlVnX+Mpt2ZYvN+s8UGict8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tJRZIpKxUgHyL83kW8cvfjkxN3z6WoNnUg+SQw+LK+k=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pnUsYjip8SvW0+m9mR5WWTkpK+p6uwJ6yBUAlBnFKMk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "PArHlz+yPRYDycAP/PgnI/AkP8Wgmfg++Vf4UG1Bf0E=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wnIh53Q3jeK8jEBe1n8kJLa89/H0BxO26ZU8SRIAs9Q=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "4F8U59gzBLGhq58PEWQk2nch+R0Va7eTUoxMneReUIA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ihKagIW3uT1dm22ROr/g5QaCpxZVj2+Fs/YSdM2Noco=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "EJtUOOwjkrPUi9mavYAi+Gom9Y2DuFll7aDwo4mq0M0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dIkr8dbaVRQFskAVT6B286BbcBBt1pZPEOcTZqk4ZcI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "aYVAcZYkH/Tieoa1XOjE/zCy5AJcVTHjS0NG2QB7muA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "sBidL6y8TenseetpioIAAtn0lK/7C8MoW4JXpVYi3z8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "0Dd2klU/t4R86c2WJcJDAd57k/N7OjvYSO5Vf8KH8sw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "I3jZ92WEVmZmgaIkLbuWhBxl7EM6bEjiEttgBJunArA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "aGHoQMlgJoGvArjfIbc3nnkoc8SWBxcrN7hSmjMRzos=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "bpiWPnF/KVBQr5F6MEwc5ZZayzIRvQOLDAm4ntwOi8g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tI7QVKbE6avWgDD9h4QKyFlnTxFCwd2iLySKakxNR/I=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "XGsge0CnoaXgE3rcpKm8AEeku5QVfokS3kcI+JKV1lk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JQxlryW2Q5WOwfrjAnaZxDvC83Dg6sjRVP5zegf2WiM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YFuHKJOfoqp1iGVxoFjx7bLYgVdsN4GuUFxEgO9HJ5s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Z6vUdiCR18ylKomf08uxcQHeRtmyav7/Ecvzz4av3k4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SPGo1Ib5AiP/tSllL7Z5PAypvnKdwJLzt8imfIMSEJQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "m94Nh6PFFQFLIib9Cu5LAKavhXnagSHG6F5EF8lD96I=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pfEkQI98mB+gm1+JbmVurPAODMFPJ4E8DnqfVyUWbSo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "DNj3OVRLbr43s0vd+rgWghOL3FqeO/60npdojC8Ry/M=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kAYIQrjHVu49W8FTxyxJeiLVRWWjC9fPcBn+Hx1F+Ss=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "aCSO7UVOpoQvu/iridarxkxV1SVxU1i9HVSYXUAeXk4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Gh6hTP/yj1IKlXQ+Q69KTfMlGZjEcXoRLGbQHNFo/1s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "/gDgIFQ4tAlJk3GN48IS5Qa5IPmErwGk8CHxAbp6gs0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "PICyimwPjxpusyKxNssOOwUotAUbygpyEtORsVGXT8g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "4lu+cBHyAUvuxC6JUNyHLzHsCogGSWFFnUCkDwfQdgI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pSndkmoNUJwXjgkbkgOrT5f9nSvuoMEZOkwAN9ElRaE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tyW+D4i26QihNM5MuBM+wnt5AdWGSJaJ4X5ydc9iWTU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "9Syjr8RoxUgPKr+O5rsCu07AvcebA4P8IVKyS1NVLWc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "67tPfDYnK2tmrioI51fOBG0ygajcV0pLo5+Zm/rEW7U=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "y0EiPRxYTuS1eVTIaPQUQBBxwkyxNckbePvKgChwd0M=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "NWd+2veAaeXQgR3vCvzlI4R1WW67D5YsVLdoXfdb8qg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "PY5RQqKQsL2GqBBSPNOEVpojNFRX/NijCghIpxD6CZk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lcvwTyEjFlssCJtdjRpdN6oY+C7bxZY+WA+QAqzj9zg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CWE7XRNylvTwO/9Fv56dNqUaQWMmESNS/GNIwgBaEI0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ijwlrUeS8nRYqK1F8kiCYF0mNDolEZS+/lJO1Lg93C8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "8KzV+qYGYuIjoNj8eEpnTuHrMYuhzphl80rS6wrODuU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wDyTLjSEFF895hSQsHvmoEQVS6KIkZOtq1c9dVogm9I=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SGrtPuMYCjUrfKF0Pq/thdaQzmGBMUvlwN3ORIu9tHU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "KySHON3hIoUk4xWcwTqk6IL0kgjzjxgMBObVIkCGvk4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hBIdS9j0XJPeT4ot73ngELkpUoSixvRBvdOL9z48jY8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Tx6um0q9HjS5ZvlFhvukpI6ORnyrXMWVW1OoxvgqII0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zFKlyfX5H81+d4A4J3FKn4T5JfG+OWtR06ddyX4Mxas=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cGgCDuPV7MeMMYEDpgOupqyNP4BQ4H7rBnd2QygumgM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "IPaUoy98v11EoglTpJ4kBlEawoZ8y7BPwzjLYBpkvHQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Pfo4Am6tOWAyZNn8G9W5HWWGC3ZWmX0igI/RRB870Ro=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "fnTSjd7bC1Udoq6iM7UDnHAC/lsIXSHp/Gy332qw+/I=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "fApBgVRrTDyEumkeWs5p3ag9KB48SbU4Si0dl7Ns9rc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "QxudfBItgoCnUj5NXVnSmWH3HK76YtKkMmzn4lyyUYY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "sSOvwhKa29Wq94bZ5jGIiJQGbG1uBrKSBfOYBz/oZeI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FdaMgwwJ0NKsqmPZLC5oE+/0D74Dfpvig3LaI5yW5Fs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "sRWBy12IERN43BSZIrnBfC9+zFBUdvjTlkqIH81NGt4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "/4tIRpxKhoOwnXAiFn1Z7Xmric4USOIfKvTYQXk3QTc=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ -
+ {
+ "_id": {
+ "$numberInt": "1"
+ },
+ "encryptedDecimal": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "DLCAJs+W2PL2DV5YChCL6dYrQNr+j4p3L7xhVaub4ic=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Mr/laWHUijZT5VT3x2a7crb7wgd/UXOGz8jr8BVqBpM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wXVD/HSbBljko0jJcaxJ1nrzs2+pchLQqYR3vywS8SU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "VDCpBYsJIxTfcI6Zgf7FTmKMxUffQv+Ys8zt5dlK76I=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zYDslUwOUVNwTYkETfjceH/PU3bac9X3UuQyYJ19qK0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rAOmHSz18Jx107xpbv9fYcPOmh/KPAqge0PAtuhIRnc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "BFOB1OGVUen7VsOuS0g8Ti7oDsTt2Yj/k/7ta8YAdGM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "2fckE5SPs0GU+akDkUEM6mm0EtcV3WDE/sQsnTtodlk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "mi9+aNjuwIvaMpSHENvKzKRAmX9cYguo2mXLvOoftHQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "K6TWn4VcWWkz/gkUkLmbtwkG7SNeABICmLDnoYJFlLU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Z+2/cEtGU0Fq7QJFNGA/0y4aWAsw0ncG6X0LYRqwS3c=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rrSIf+lgcNZFbbUkS9BmE045jRWBpcBJXHzfMVEFuzE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "KlHL3Kyje1/LMIfgbCqw1SolxffJvvgsYBV5y77wxuA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hzJ1YBoETmYeCh352dBmG8d8Wse/bUcqojTWpWQlgsc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lSdcllDXx8MA+s0GULjDA1lQkcV0L8/aHtZ6dM2pZ2c=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "HGr7JLTTA7ksAnlmjSIwwdBVvgr3fv46/FTdiCPYpos=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "mMr25v1VwOEVZ8xaNUTHJCcsYqV+kwK6RzGYilxPtJ4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "129hJbziPJzNo0IoTU3bECdge0FtaPW8dm4dyNVNwYU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "doiLJ96qoo+v7NqIAZLq6BI5axV8Id8gT5vyJ1ZZ0PM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cW/Lcul3xYmfyvI/0x/+ybN78aQmBK1XIGs1EEU09N8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "1aVIwzu9N5EJV9yEES+/g6hOTH7cA2NTcLIc59cu0wU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kw5tyl7Ew0r1wFyrN1mB9FiVW2hK2BxxxUuJDNWjyjQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ADAY2YBrm6RJBDY/eLLcfNxmSJku+mefz74gH66oyco=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "8gkqB1LojzPrstpFG7RHYmWxXpIlPDTqWnNsXH7XDRU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "TESfVQMDQjfTZmHmUeYUE2XrokJ6CcrsKx/GmypGjOw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "qFM+HFVQ539S0Ouynd1fBHoemFxtU9PRxE5+Dq7Ljy4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "jPiFgUZteSmOg4wf3bsEKCZzcnxmMoILsgp/GaZD+dM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YaWUgJhYgPNN7TkFK16H8SsQS226JguaVhOIQxZwQNQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "x90/Qk3AgyaFsvWf2KUCu5XF3j76WFSjt/GrnG01060=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ZGWybWL/xlEdMYRFCZDUoz10sywTf7U/7wufsb78lH0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "8l4ganN66jIcdxfHAdYLaym/mdzUUQ8TViw3MDRySPc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "c8p5XEGTqxqvRGVlR+nkxw9uUdoqDqTB0jlYQ361qMA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "1ZGFLlpQBcU3zIUg8MmgWwFKVz/SaA7eSYFrfe3Hb70=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "34529174M77rHr3Ftn9r8jU4a5ztYtyVhMn1wryZSkU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YkQ4pxFWzc49MS0vZM6S8mNo4wAwo21rePBeF3C+9mI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "MhOf4mYY00KKVhptOcXf0bXB7WfuuM801MRJg4vXPgc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "7pbbD8ihNIYIBJ3tAUPGzHpFPpIeCTAk5L88qCB0/9w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "C9Q5PoNJTQo6pmNzXEEXUEqH22//UUWY1gqILcIywec=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "AqGVk1QjDNDLYWGRBX/nv9QdGR2SEgXZEhF0EWBAiSE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "/sGI3VCbJUKATULJmhTayPOeVW+5MjWSvVCqS77sRbU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yOtbL0ih7gsuoxVtRrACMz+4N5uo7jIR7zzmtih2Beo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "uA6dkb2Iyg9Su8UNDvZzkPx33kPZtWr/CCuEY+XgzUM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "1DoSFPdHIplqZk+DyWAmEPckWwXw/GdB25NLmzeEZhk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "OfDVS0T3ZuIXI/LNbTp6C9UbPIWLKiMy6Wx+9tqNl+g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "3PZjHXbmG6GtPz+iapKtQ3yY4PoFFgjIy+fV2xQv1YU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kaoLN0BoBWsmqE7kKkJQejATmLShd8qffcAmlhsxsGY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "vpiw9KgQdegGmp7IJnSGX2miujRLU0xzs0ITTqbPW7c=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "NuXFf7xGUefYjIUTuMxNUTCfVHrF8oL0AT7dPv5Plk4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "8Tz53LxtfEBJ9eR+d2690kwNsqPV6XyKo2PlqZCbUrc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "e6zsOmHSyV8tyQtSX6BSwui6wK9v1xG3giY/IILJQ2w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "2fedFMCxa2DzmIpfbDKGXhQg0PPwbUv6vIWdwwlvhms=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yEJKMFnWXTC8tJUfzCInzQRByNEPjHxpw4L4m8No91Q=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YbFuWwOiFuQyOzIJXDbOkCWC2DyrG+248TBuVCa1pXU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "w7IkwGdrguwDrar5+w0Z3va5wXyZ4VXJkDMISyRjPGo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YmJUoILTRJPhyIyWyXJTsQ6KSZHHbEpwPVup6Ldm/Ko=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FvMjcwVZJmfh6FP/yBg2wgskK+KHD8YVUY6WtrE8xbg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "h4HCtD4HyYz0nci49IVAa10Z4NJD/FHnRMV4sRX6qro=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "nC7BpXCmym+a0Is2kReM9cYN2M1Eh5rVo8fjms14Oiw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "1qtVWaeVo649ZZZtN8gXbwLgMWGLhz8beODbvru0I7Q=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Ej+mC0QFyMNIiSjR939S+iGBm7dm+1xObu5IcF/OpbU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "UQ8LbUG3cMegbr9yKfKanAPQE1EfPkFciVDrNqZ5GHY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "4iI3mXIDjnX+ralk1HhJY43mZx2uTJM7hsv9MQzTX7E=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "0WQCcs3rvsasgohERHHCaBM4Iy6yomS4qJ5To3/yYiw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "qDCTVPoue1/DOAGNAlUstdA9Sid8MgEY4e5EzHcVHRk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "9F9Mus0UnlzHb8E8ImxgXtz6SU98YXD0JqswOKw/Bzs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pctHpHKVBBcsahQ6TNh6/1V1ZrqOtKSAPtATV6BJqh0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "vfR3C/4cPkVdxtNaqtF/v635ONbhTf5WbwJM6s4EXNE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ejP43xUBIex6szDcqExAFpx1IE/Ksi5ywJ84GKDFRrs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "jbP4AWYd3S2f3ejmMG7dS5IbrFol48UUoT+ve3JLN6U=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CiDifI7958sUjNqJUBQULeyF7x0Up3loPWvYKw9uAuw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "e2dQFsiHqd2BFHNhlSxocjd+cPs4wkcUW/CnCz4KNuM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "PJFckVmzBipqaEqsuP2mkjhJE4qhw36NhfQ9DcOHyEU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "S3MeuJhET/B8VcfZYDR9fvX0nscDj416jdDekhmK11s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CGVHZRXpuNtQviDB2Kj03Q8uvs4w3RwTgV847R7GwPw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yUGgmgyLrxbEpDVy89XN3c2cmFpZXWWmuJ/35zVZ+Jw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "inb6Q97mL1a9onfNTT8v9wsoi/fz7KXKq3p8j90AU9c=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CCyYx/4npq9xGO1lsCo8ZJhFO9/tN7DB+/DTE778rYg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "LNnYw4fwbiAZu0kBdAHPEm/OFnreS+oArdB5O/l/I98=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "P006SxmUS/RjiQJVYPdMFnNo3827GIEmSzagggkg05Q=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "oyvwY+WsnYV6UHuPki1o0ILJ2jN4uyXf9yaUNtZJyBA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "36Lk3RHWh1wmtCWC/Yj6jNIo17U5y6SofAgQjzjVxD8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "vOOo8FqeHnuO9mqOYjIb4vgwIwVyXZ5Y+bY5d9tGFUM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "bJiDJjwQRNxqxlGjRm5lLziFhcfTDCnQ/qU1V85qcRg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "2Qgrm1n0wUELAQnpkEiIHB856yv76q8jLbpiucetcm0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "5ciPOYxTK0WDwwYyfs7yiVymwtYQXDELLxmM4JLl4/o=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "31dC2WUSIOKQc4jwT6PikfeYTwi80mTlh7P31T5KNQU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YluTV2Mu53EGCKLcWfHZb0BM/IPW2xJdG3vYlDMEsM4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dh/8lGo2Ek6KukSwutH6Q35iy8TgV0FN0SJqe0ZVHN8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "EVw6HpIs3BKen2qY2gz4y5dw1JpXilfh07msZfQqJpc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FYolLla9L8EZMROEdWetozroU40Dnmwwx2jIMrr7c1A=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "8M6k4QIutSIj6CM41vvkQtuFsaGrjoR9SZJVSLbfGKQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "9LM0VoddDNHway442MqY+Z7vohB2UHau/cddshhzf40=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "66i8Ytco4Yq/FMl6pIRZazz3CZlu8fO2OI6Pne0pvHU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "2a/HgX+MjZxjXtSvHgF1yEpHMJBkl8Caee8XrJtn0WM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "frhBM662c4ZVG7mWP8K/HhRjd01lydW/cPcHnDjifqc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6k1T7Q1t668PBqv6fwpVnT1HWh7Am5LtbKvwPJKcpGU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "UlJ5Edfusp8S/Pyhw6KTglIejmbr1HO0zUeHn/qFETA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "jsxsB+1ECB3assUdoC333do9tYH+LglHmVSJHy4N8Hg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "2nzIQxGYF7j3bGsIesECEOqhObKs/9ywknPHeJ3yges=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xJYKtuWrX90JrJVoYtnwP7Ce59XQGFYoalxpNfBXEH0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "NLI5lriBTleGCELcHBtNnmnvwSRkHHaLOX4cKboMgTw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hUOQV0RmE5aJdJww1AR9rirJG4zOYPo+6cCkgn/BGvQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "h4G2Of76AgxcUziBwCyH+ayMOpdBWzg4yFrTfehSC2c=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "VuamM75RzGfQpj2/Y1jSVuQLrhy6OAwlZxjuQLB/9Ss=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kn9+hLq7hvw02xr9vrplOCDXKBTuFhfbX7d5v/l85Pg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "fAiGqKyLZpGngBYFbtYUYt8LUrJ49vYafiboifTDjxs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "BxRILymgfVJCczqjUIWXcfrfSgrrYkxTM5VTg0HkZLY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CrFY/PzfPU2zsFkGLu/dI6mEeizZzCR+uYgjZBAHro0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "AEbrIuwvXLTtYgMjOqnGQ8y8axUn5Ukrn7UZRSyfQVw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ouWeVH3PEFg+dKWlXc6BmqirJOaVWjJbMzZbCsce4dA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+hd6xFB+EG+kVP7WH4uMd1CLaWMnt5xJRaY/Guuga9Q=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zmpGalfAOL3gmcUMJYcLYIRT/2VDO/1Dw4KdYZoNcng=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "2PbHAoM/46J2UIZ/vyksKzmVVfxA7YUyIxWeL/N/vBk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "7fD9x+zk5MVFesb59Klqiwwmve7P5ON/5COURXj5smE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tlrNQ4jaq051iaWonuv1sSrYhKkL1LtNZuHsvATha3s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "fBodm28iClNpvlRyVq0dOdXQ08S7/N3aDwid+PdWvRo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "O+/nnRqT3Zv7yMMGug8GhKHaWy6u7BfRGtZoj0sdN1c=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "5AZZ/RTMY4Photnm/cpXZr/HnFRi3eljacMsipkJLHA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "oFVyo/kgoMxBIk2VE52ySSimeyU+Gr0EfCwapXnTpKA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Z8v59DfcnviA0mzvnUk+URVO0UuqAWvtarEgJva/n1c=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "P64GOntZ+zBJEHkigoh9FSxSO+rJTqR20z5aiGQ9an4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xMbSuDPfWuO/Dm7wuVl06GnzG9uzTlJJX9vFy7boGlY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kXPB19mRClxdH2UsHwlttS6lLU2uHvzuZgZz7kC45jU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "NDVjVYXAw4k0w4tFzvs7QDq39aaU3HQor4I2XMKKnCk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "uKw/+ErVfpTO1dGUfd3T/eWfZW3nUxXCdBGdjvHtZ88=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "av0uxEzWkizYWm0QUM/MN1hLibnxPvCWJKwjOV4yVQY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ERwUC47dvgOBzIsEESMIioLYbFOxOe8PtJTnmDkKuHM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "2gseKlG5Le12fS/vj4eaED4lturF16kAgJ1TpW3HxEE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "7Cvg0Y3j/5i2F1TeXxlMmU7xwif5dCmwkZAOrVC5K2Y=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
\ No newline at end of file
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-DecimalPrecision-Aggregate.json b/specifications/client-side-encryption/tests/legacy/fle2-Range-DecimalPrecision-Aggregate.json
new file mode 100644
index 00000000000..a3e605d1bbb
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-DecimalPrecision-Aggregate.json
@@ -0,0 +1,590 @@
+{
+ "runOn": [
+ {
+ "minServerVersion": "6.2.0",
+ "topology": [
+ "replicaset",
+ "sharded",
+ "load-balanced"
+ ]
+ }
+ ],
+ "database_name": "default",
+ "collection_name": "default",
+ "data": [],
+ "encrypted_fields": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDecimalPrecision",
+ "bsonType": "decimal",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberDecimal": "0.0"
+ },
+ "max": {
+ "$numberDecimal": "200.0"
+ },
+ "precision": {
+ "$numberInt": "2"
+ }
+ }
+ }
+ ]
+ },
+ "key_vault_data": [
+ {
+ "_id": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "keyMaterial": {
+ "$binary": {
+ "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==",
+ "subType": "00"
+ }
+ },
+ "creationDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "updateDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "status": {
+ "$numberInt": "0"
+ },
+ "masterKey": {
+ "provider": "local"
+ }
+ }
+ ],
+ "tests": [
+ {
+ "description": "FLE2 Range DecimalPrecision. Aggregate.",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedDecimalPrecision": {
+ "$gt": {
+ "$numberDecimal": "0"
+ }
+ }
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 1,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "1"
+ }
+ }
+ ]
+ }
+ ],
+ "expectations": [
+ {
+ "command_started_event": {
+ "command": {
+ "listCollections": 1,
+ "filter": {
+ "name": "default"
+ }
+ },
+ "command_name": "listCollections"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "find": "datakeys",
+ "filter": {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ },
+ "$db": "keyvault",
+ "readConcern": {
+ "level": "majority"
+ }
+ },
+ "command_name": "find"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 0,
+ "encryptedDecimalPrecision": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDecimalPrecision",
+ "bsonType": "decimal",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberDecimal": "0.0"
+ },
+ "max": {
+ "$numberDecimal": "200.0"
+ },
+ "precision": {
+ "$numberInt": "2"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 1,
+ "encryptedDecimalPrecision": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDecimalPrecision",
+ "bsonType": "decimal",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberDecimal": "0.0"
+ },
+ "max": {
+ "$numberDecimal": "200.0"
+ },
+ "precision": {
+ "$numberInt": "2"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "aggregate": "default",
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedDecimalPrecision": {
+ "$gt": {
+ "$binary": {
+ "base64": "CvoJAAADcGF5bG9hZADKCQAABGcAjgkAAAMwAH0AAAAFZAAgAAAAAHdJ2Vnb4MMzqVYVssjSdDy8XU4GVzMTfGifGETgQ2mYBXMAIAAAAAD7cFfKJGIXo6PjyeX2ria02CckW7dWFDoY/3FyBdm1NQVjACAAAAAAqZO+/+gRWlPaMOvuiXizSmBe7lp1VWg1vJ4UmW8o3bQAAzEAfQAAAAVkACAAAAAAlmvfDrZoydUet4eCVMq7z6a58Ea+1HLJOWxN5lNcrWEFcwAgAAAAAEBo5AWZyC41b9ayjWNQSL4iYEAIwR/JG+ssN8bdoK9RBWMAIAAAAAD4FTKJ6CTzKBAyAwZCLUoDEfnZTRZmhF1q/2hnDzmG9gADMgB9AAAABWQAIAAAAABbiLaoxAA6rinMJw1hC8ZUiq6UU1AQaPFn/py/Y06WuQVzACAAAAAAhtDasFkvYE7SCNu1je/hxdE9TJtAvvH3NtdEbKzNbCUFYwAgAAAAAHHy019aPatHTST+0wGsmukUcsQNQj6KpoS9b7iGeThAAAMzAH0AAAAFZAAgAAAAALORWwSr+tYNxcil2KIGSbNhTHvcPbdj+rLVQNx21S/KBXMAIAAAAAD6diZBkPEJ1cQy06LAxdbNK8Nlxbb44fH4Wk3Y3260nQVjACAAAAAAvUc1q7pyhjU0ilgmwiKkHIY3V4/LxO+Y2uT7eSpBOs8AAzQAfQAAAAVkACAAAAAAG5XMK96PjClNlUvg82j4pMY1YxsznZfj4uNweD394FoFcwAgAAAAAKHgQLdGJHkrfFg9nB93Ac+3VgBw6aU44MTkKIQ91dZoBWMAIAAAAACtbNc1DCoUUyzlkrYmJi4NlwOqLYmb6au4pDc8clXVXwADNQB9AAAABWQAIAAAAAA6M++b9I0YFemmWBAWAE3glu2Ah3Ta1FBxAQEIWS0toAVzACAAAAAANXYTqPf1Y6X3Ns6YQIX0C3FKCyWUo+Kk+fNcQvc0WSoFYwAgAAAAAAaqju6Dv8wqXxcsIbP67V1QGaD5kNTFofZ9Zuf1LGnKAAM2AH0AAAAFZAAgAAAAAKl8bV1riH/uyJ+X0HHd3+18k2cJl2dQFXCdoagutFcaBXMAIAAAAABm8F2Ew9f0VOABdcF+lP0Bi+zWvEUPniWgrxPq/Sx3uwVjACAAAAAAQd2pWVqlmmLg8m8xbs7yLewmR0Z6UQgXofbCsMHaGSoAAzcAfQAAAAVkACAAAAAAsYZD8JEP6kYsPncFnNZwJxhu4YtUTKPNcjHtv67H+rYFcwAgAAAAAI4LqZcRkvbs/2F62Flu0pixNcor4WmBD0DHGaf039wLBWMAIAAAAAAqzpfyBpr4Ano+nFWJyyTuIJelJgiRDnMHQqdeqV8JaAADOAB9AAAABWQAIAAAAAC0vdAi+dmoIXvZ5LqUqvyKV9/tHqSI2SWiSJO5pTnA2wVzACAAAAAAS2qvf9fvfVUH5WtsVxjxmskpGjYTQV34LwvQQw1y9wIFYwAgAAAAAFhNY4qwNntyA+GIoNHZsTkIUbPgy4TBlvNnTPjp4bMFAAM5AH0AAAAFZAAgAAAAAH31lb/srBcrOXkzddCwAnclsR5/3QijEVgECs2JjOWBBXMAIAAAAABg7+prDT73YcCvLE5QbuIrqGcjLc5pQD2Miq0d29yrxgVjACAAAAAAFKqAqXG/ktejFQ7fM2aobO2VmEvZLXnRaJH97Jy/sJYAAzEwAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVjACAAAAAAfsofSP7nQHv8ic8ZW0aNlWxplS46Z+mywPR4rQk+wcgAAzExAH0AAAAFZAAgAAAAAFdthRhe2Q8CvxGIhjTJZv0Lk97GkHciTPxZ/mckLoNaBXMAIAAAAAAqOxsAr23LOVB0DIHbPf9UDJJRFXY2YoKbjhRqw5psbQVjACAAAAAA7ty+Nif6KjS3v1zWKaHX9n4Zj3XC4ajuCduKNIYr3l8AAzEyAH0AAAAFZAAgAAAAAMWymwwbvIeMqmnKWWifUqoCxOsdpnonM2qdLPyjqJO/BXMAIAAAAAB6IDmmpUhBD2zpRj8/y/kmOSXcjuIU14sNh6GKSsg2uwVjACAAAAAABSWO0Ii+NGcsHZQ9MR5EjPXVKeXlI4FQ1pcxeKDiuooAAzEzAH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVjACAAAAAAD51NYesiO4Fo7w7iWBfqAFxEqkaDVctpvzZ28nT4SE8AAzE0AH0AAAAFZAAgAAAAAJaRYmo8zqI2BEUzdSwp4tVRpPmVWsfydkYN3UHh6TMuBXMAIAAAAAAeD6mDnQeLlbC9i0sVgE8+RH6y+e94OJQ0tJ0PvblVSgVjACAAAAAAKUhYSt4nvvUfbNgPJ2E79SciVZ0ZzbzoZ2nKr4ewNLsAAzE1AH0AAAAFZAAgAAAAAAZZ538coNPwyRjhEwr5P8Xw32oWOJF+R+nfCGgy2qO3BXMAIAAAAACOPLnJlKwGNPDBReRKnHfteq0wFb3ezhrc7BVXs8RUHwVjACAAAAAAzCICkPZAkfTiD0MUt155dIPgLJ4/e0qFTM2FR0U261YAAzE2AH0AAAAFZAAgAAAAAFH9l9GGA1I52atJV5jNUf1lx8jBjoEoVoME97v5GFJiBXMAIAAAAAC1qH3Kd78Dr9NGbw7y9D/XYBwv5h1LLO8la5OU7g8UkQVjACAAAAAAn27H0Mpwatgc1R/4nXSRjsG2PzB0ol5YR9f3mCb2y/0AAzE3AH0AAAAFZAAgAAAAADtbVEI2tdkrowEMdkacD2w0Y3T3Ofi7PH6HmA6sP0c/BXMAIAAAAADuBSROnZHA+NgUPH8d0LnWFiDsM2bY8bzjC1+elSsIygVjACAAAAAAMinHEu4wkbeOpdZbXQ94q5o5pIEubqXUDrTRYOGmJC0AAzE4AH0AAAAFZAAgAAAAAAh3WpeMVlikPFYj9hLj+fmIqVt6omCSF75W3TPExyWpBXMAIAAAAAAsQkRmwqeVj2gGE03orb6PtrIzDt6dDU3hgSQi8E2wKgVjACAAAAAAvlZo8Qj3eAdxzZxN5sHKhxi+a9Npj7cZC5+pE6qrOawAAAVlACAAAAAA65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+wSY20AAAAAAAAAAAAAEHBheWxvYWRJZAAAAAAAEGZpcnN0T3BlcmF0b3IAAQAAAAA=",
+ "subType": "06"
+ }
+ }
+ }
+ }
+ }
+ ],
+ "cursor": {},
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDecimalPrecision",
+ "bsonType": "decimal",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberDecimal": "0.0"
+ },
+ "max": {
+ "$numberDecimal": "200.0"
+ },
+ "precision": {
+ "$numberInt": "2"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "aggregate"
+ }
+ }
+ ],
+ "outcome": {
+ "collection": {
+ "data": [
+ {
+ "_id": {
+ "$numberInt": "0"
+ },
+ "encryptedDecimalPrecision": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Dri0CXmL78L2DOgk9w0DwxHOMGMzih7m6l59vgy+WWo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "b7d8mRzD1kI1tdc7uNL+YAUonJ6pODLsRLkArfEKSkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Xg8C1/A0KJaXOw4i+26Rv03/CydaaunOzXh0CIT+gn8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "UoKUDw2wJYToUCcFaIs03YQSTksYR0MIOTJllwODqKc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "c/5cwAT0C5jber2xlJnWD3a5tVDy0nRtr5HG02hoFOY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wSUrRXavAGaajNeqC5mEUH1K67oYl5Wy9RNIzKjwLAM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6vrp4wWDtHEgHWR99I70WVDzevg1Fk/Pw5U8gUDa0OU=",
+ "subType": "00"
+ }
+ }
+ ]
+ },
+ {
+ "_id": {
+ "$numberInt": "1"
+ },
+ "encryptedDecimalPrecision": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "bE1vqWj3KNyM7cCYUv/cnYm8BPaUL3eMp5syTHq6NF4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "mVZb+Ra0EYjQ4Zrh9X//E2T8MRj7NMqm5GUJXhRrBEI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FA74j21GUEJb1DJBOpR9nVnjaDZnd8yAQNuaW9Qi26g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kJv//KVkbrobIBf+QeWC5jxn20mx/P0R1N6aCSMgKM8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zB+Whi9IUUGxfLEe+lGuIzLX4LFbIhaIAm5lRk65QTc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ybO1QU3CgvhO8JgRXH+HxKszWcpl5aGDYYVa75fHa1g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "X3Y3eSAbbMg//JgiHHiFpYOpV61t8kkDexI+CQyitH4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SlNHXyqVFGDPrX/2ppwog6l4pwj3PKda2TkZbqgfSfA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "McjV8xwTF3xI7863DYOBdyvIv6UpzThl6v9vBRk05bI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "MgwakFvPyBlwqFTbhWUF79URJQWFoJTGotlEVSPPUsQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "DyBERpMSD5lEM5Nhpcn4WGgxgn/mkUVJp+PYSLX5jsE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "I43iazc0xj1WVbYB/V+uTL/tughN1bBlxh1iypBnNsA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wjOBa/ATMuOywFmuPgC0GF/oeLqu0Z7eK5udzkTPbis=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "gRQVwiR+m+0Vg8ZDXqrQQcVnTyobwCXNaA4BCJVXtMc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "WUZ6huwx0ZbLb0R00uiC9FOJzsUocUN8qE5+YRenkvQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "7s79aKEuPgQcS/YPOOVcYNZvHIo7FFsWtFCrnDKXefA=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ ]
+}
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-DecimalPrecision-Aggregate.yml b/specifications/client-side-encryption/tests/legacy/fle2-Range-DecimalPrecision-Aggregate.yml
new file mode 100644
index 00000000000..26f79947537
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-DecimalPrecision-Aggregate.yml
@@ -0,0 +1,315 @@
+# Requires libmongocrypt 1.7.0.
+runOn:
+ - minServerVersion: "6.2.0"
+ # FLE 2 Encrypted collections are not supported on standalone.
+ topology: [ "replicaset", "sharded", "load-balanced" ]
+database_name: &database_name "default"
+collection_name: &collection_name "default"
+data: []
+encrypted_fields: &encrypted_fields {'escCollection': 'enxcol_.default.esc', 'eccCollection': 'enxcol_.default.ecc', 'ecocCollection': 'enxcol_.default.ecoc', 'fields': [{'keyId': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'path': 'encryptedDecimalPrecision', 'bsonType': 'decimal', 'queries': {'queryType': 'rangePreview', 'contention': {'$numberLong': '0'}, 'sparsity': {'$numberLong': '1'}, 'min': {'$numberDecimal': '0.0'}, 'max': {'$numberDecimal': '200.0'}, 'precision': {'$numberInt': '2'}}}]}
+key_vault_data: [ {'_id': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'keyMaterial': {'$binary': {'base64': 'sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==', 'subType': '00'}}, 'creationDate': {'$date': {'$numberLong': '1648914851981'}}, 'updateDate': {'$date': {'$numberLong': '1648914851981'}}, 'status': {'$numberInt': '0'}, 'masterKey': {'provider': 'local'}} ]
+tests:
+ - description: "FLE2 Range DecimalPrecision. Aggregate."
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments:
+ document: &doc0 { _id: 0, encryptedDecimalPrecision: { $numberDecimal: "0" } }
+ - name: insertOne
+ arguments:
+ document: &doc1 { _id: 1, encryptedDecimalPrecision: { $numberDecimal: "1" } }
+ - name: aggregate
+ arguments:
+ pipeline: [{ $match: { "encryptedDecimalPrecision": { $gt: {$numberDecimal: "0" }} } }]
+ result: [*doc1]
+ expectations:
+ - command_started_event:
+ command:
+ listCollections: 1
+ filter:
+ name: *collection_name
+ command_name: listCollections
+ - command_started_event:
+ command:
+ find: datakeys
+ filter: {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ }
+ $db: keyvault
+ readConcern: { level: "majority" }
+ command_name: find
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc0_encrypted { "_id": 0, "encryptedDecimalPrecision": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc1_encrypted { "_id": 1, "encryptedDecimalPrecision": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ aggregate: *collection_name
+ pipeline: [
+ {
+ "$match": {
+ "encryptedDecimalPrecision": {
+ "$gt": {
+ "$binary": {
+ "base64": "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",
+ "subType": "06"
+ }
+ }
+ }
+ }
+ }
+ ]
+ cursor: {}
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: aggregate
+ outcome:
+ collection:
+ # Outcome is checked using a separate MongoClient without auto encryption.
+ data:
+ -
+ {
+ "_id": {
+ "$numberInt": "0"
+ },
+ "encryptedDecimalPrecision": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Dri0CXmL78L2DOgk9w0DwxHOMGMzih7m6l59vgy+WWo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "b7d8mRzD1kI1tdc7uNL+YAUonJ6pODLsRLkArfEKSkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Xg8C1/A0KJaXOw4i+26Rv03/CydaaunOzXh0CIT+gn8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "UoKUDw2wJYToUCcFaIs03YQSTksYR0MIOTJllwODqKc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "c/5cwAT0C5jber2xlJnWD3a5tVDy0nRtr5HG02hoFOY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wSUrRXavAGaajNeqC5mEUH1K67oYl5Wy9RNIzKjwLAM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6vrp4wWDtHEgHWR99I70WVDzevg1Fk/Pw5U8gUDa0OU=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ -
+ {
+ "_id": {
+ "$numberInt": "1"
+ },
+ "encryptedDecimalPrecision": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "bE1vqWj3KNyM7cCYUv/cnYm8BPaUL3eMp5syTHq6NF4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "mVZb+Ra0EYjQ4Zrh9X//E2T8MRj7NMqm5GUJXhRrBEI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FA74j21GUEJb1DJBOpR9nVnjaDZnd8yAQNuaW9Qi26g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kJv//KVkbrobIBf+QeWC5jxn20mx/P0R1N6aCSMgKM8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zB+Whi9IUUGxfLEe+lGuIzLX4LFbIhaIAm5lRk65QTc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ybO1QU3CgvhO8JgRXH+HxKszWcpl5aGDYYVa75fHa1g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "X3Y3eSAbbMg//JgiHHiFpYOpV61t8kkDexI+CQyitH4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SlNHXyqVFGDPrX/2ppwog6l4pwj3PKda2TkZbqgfSfA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "McjV8xwTF3xI7863DYOBdyvIv6UpzThl6v9vBRk05bI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "MgwakFvPyBlwqFTbhWUF79URJQWFoJTGotlEVSPPUsQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "DyBERpMSD5lEM5Nhpcn4WGgxgn/mkUVJp+PYSLX5jsE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "I43iazc0xj1WVbYB/V+uTL/tughN1bBlxh1iypBnNsA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wjOBa/ATMuOywFmuPgC0GF/oeLqu0Z7eK5udzkTPbis=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "gRQVwiR+m+0Vg8ZDXqrQQcVnTyobwCXNaA4BCJVXtMc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "WUZ6huwx0ZbLb0R00uiC9FOJzsUocUN8qE5+YRenkvQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "7s79aKEuPgQcS/YPOOVcYNZvHIo7FFsWtFCrnDKXefA=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
\ No newline at end of file
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-DecimalPrecision-Correctness.json b/specifications/client-side-encryption/tests/legacy/fle2-Range-DecimalPrecision-Correctness.json
new file mode 100644
index 00000000000..9fafc243d66
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-DecimalPrecision-Correctness.json
@@ -0,0 +1,1650 @@
+{
+ "runOn": [
+ {
+ "minServerVersion": "6.2.0",
+ "topology": [
+ "replicaset",
+ "sharded",
+ "load-balanced"
+ ]
+ }
+ ],
+ "database_name": "default",
+ "collection_name": "default",
+ "data": [],
+ "encrypted_fields": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDecimalPrecision",
+ "bsonType": "decimal",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberDecimal": "0.0"
+ },
+ "max": {
+ "$numberDecimal": "200.0"
+ },
+ "precision": {
+ "$numberInt": "2"
+ }
+ }
+ }
+ ]
+ },
+ "key_vault_data": [
+ {
+ "_id": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "keyMaterial": {
+ "$binary": {
+ "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==",
+ "subType": "00"
+ }
+ },
+ "creationDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "updateDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "status": {
+ "$numberInt": "0"
+ },
+ "masterKey": {
+ "provider": "local"
+ }
+ }
+ ],
+ "tests": [
+ {
+ "description": "Find with $gt",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDecimalPrecision": {
+ "$gt": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ }
+ },
+ "result": [
+ {
+ "_id": 1,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Find with $gte",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDecimalPrecision": {
+ "$gte": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ },
+ "sort": {
+ "_id": 1
+ }
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "0.0"
+ }
+ },
+ {
+ "_id": 1,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Find with $gt with no results",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDecimalPrecision": {
+ "$gt": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ }
+ },
+ "result": []
+ }
+ ]
+ },
+ {
+ "description": "Find with $lt",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDecimalPrecision": {
+ "$lt": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ }
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Find with $lte",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDecimalPrecision": {
+ "$lte": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ },
+ "sort": {
+ "_id": 1
+ }
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "0.0"
+ }
+ },
+ {
+ "_id": 1,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Find with $lt below min",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDecimalPrecision": {
+ "$lt": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ }
+ },
+ "result": {
+ "errorContains": "must be greater than the range minimum"
+ }
+ }
+ ]
+ },
+ {
+ "description": "Find with $gt above max",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDecimalPrecision": {
+ "$gt": {
+ "$numberDecimal": "200.0"
+ }
+ }
+ }
+ },
+ "result": {
+ "errorContains": "must be less than the range max"
+ }
+ }
+ ]
+ },
+ {
+ "description": "Find with $gt and $lt",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDecimalPrecision": {
+ "$gt": {
+ "$numberDecimal": "0.0"
+ },
+ "$lt": {
+ "$numberDecimal": "2.0"
+ }
+ }
+ }
+ },
+ "result": [
+ {
+ "_id": 1,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Find with equality",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ ]
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ },
+ "result": [
+ {
+ "_id": 1,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Find with full range",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDecimalPrecision": {
+ "$gte": {
+ "$numberDecimal": "0.0"
+ },
+ "$lte": {
+ "$numberDecimal": "200.0"
+ }
+ }
+ },
+ "sort": {
+ "_id": 1
+ }
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "0.0"
+ }
+ },
+ {
+ "_id": 1,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Find with $in",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDecimalPrecision": {
+ "$in": [
+ {
+ "$numberDecimal": "0.0"
+ }
+ ]
+ }
+ }
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Insert out of range",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "-1"
+ }
+ }
+ },
+ "result": {
+ "errorContains": "value must be greater than or equal to the minimum value"
+ }
+ }
+ ]
+ },
+ {
+ "description": "Insert min and max",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 200,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "200.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {},
+ "sort": {
+ "_id": 1
+ }
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "0.0"
+ }
+ },
+ {
+ "_id": 200,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "200.0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with $gte",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedDecimalPrecision": {
+ "$gte": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "$sort": {
+ "_id": 1
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "0.0"
+ }
+ },
+ {
+ "_id": 1,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with $gt with no results",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedDecimalPrecision": {
+ "$gt": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ }
+ }
+ ]
+ },
+ "result": []
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with $lt",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedDecimalPrecision": {
+ "$lt": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with $lte",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedDecimalPrecision": {
+ "$lte": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "$sort": {
+ "_id": 1
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "0.0"
+ }
+ },
+ {
+ "_id": 1,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with $lt below min",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedDecimalPrecision": {
+ "$lt": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ }
+ }
+ ]
+ },
+ "result": {
+ "errorContains": "must be greater than the range minimum"
+ }
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with $gt above max",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedDecimalPrecision": {
+ "$gt": {
+ "$numberDecimal": "200.0"
+ }
+ }
+ }
+ }
+ ]
+ },
+ "result": {
+ "errorContains": "must be less than the range max"
+ }
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with $gt and $lt",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedDecimalPrecision": {
+ "$gt": {
+ "$numberDecimal": "0.0"
+ },
+ "$lt": {
+ "$numberDecimal": "2.0"
+ }
+ }
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 1,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with equality",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ ]
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 1,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with full range",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedDecimalPrecision": {
+ "$gte": {
+ "$numberDecimal": "0.0"
+ },
+ "$lte": {
+ "$numberDecimal": "200.0"
+ }
+ }
+ }
+ },
+ {
+ "$sort": {
+ "_id": 1
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "0.0"
+ }
+ },
+ {
+ "_id": 1,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with $in",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedDecimalPrecision": {
+ "$in": [
+ {
+ "$numberDecimal": "0.0"
+ }
+ ]
+ }
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "0.0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Wrong type: Insert Int",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDecimalPrecision": {
+ "$numberInt": "0"
+ }
+ }
+ },
+ "result": {
+ "errorContains": "cannot encrypt element"
+ }
+ }
+ ]
+ },
+ {
+ "description": "Wrong type: Find Int",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDecimalPrecision": {
+ "$gte": {
+ "$numberInt": "0"
+ }
+ }
+ },
+ "sort": {
+ "_id": 1
+ }
+ },
+ "result": {
+ "errorContains": "field type is not supported"
+ }
+ }
+ ]
+ }
+ ]
+}
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-DecimalPrecision-Correctness.yml b/specifications/client-side-encryption/tests/legacy/fle2-Range-DecimalPrecision-Correctness.yml
new file mode 100644
index 00000000000..9e2ee80aedf
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-DecimalPrecision-Correctness.yml
@@ -0,0 +1,422 @@
+# Test correctness results.
+# Does not include command monitoring expectations or outcome assertions to make tests more readable.
+# Requires libmongocrypt 1.7.0.
+runOn:
+ - minServerVersion: "6.2.0"
+ # FLE 2 Encrypted collections are not supported on standalone.
+ topology: [ "replicaset", "sharded", "load-balanced" ]
+database_name: &database_name "default"
+collection_name: &collection_name "default"
+data: []
+encrypted_fields: &encrypted_fields {'escCollection': 'enxcol_.default.esc', 'eccCollection': 'enxcol_.default.ecc', 'ecocCollection': 'enxcol_.default.ecoc', 'fields': [{'keyId': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'path': 'encryptedDecimalPrecision', 'bsonType': 'decimal', 'queries': {'queryType': 'rangePreview', 'contention': {'$numberLong': '0'}, 'sparsity': {'$numberLong': '1'}, 'min': {'$numberDecimal': '0.0'}, 'max': {'$numberDecimal': '200.0'}, 'precision': {'$numberInt': '2'}}}]}
+key_vault_data: [ {'_id': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'keyMaterial': {'$binary': {'base64': 'sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==', 'subType': '00'}}, 'creationDate': {'$date': {'$numberLong': '1648914851981'}}, 'updateDate': {'$date': {'$numberLong': '1648914851981'}}, 'status': {'$numberInt': '0'}, 'masterKey': {'provider': 'local'}} ]
+tests:
+ - description: "Find with $gt"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments:
+ document: &doc0 { _id: 0, encryptedDecimalPrecision: { $numberDecimal: "0.0" } }
+ - name: insertOne
+ arguments:
+ document: &doc1 { _id: 1, encryptedDecimalPrecision: { $numberDecimal: "1.0" } }
+ - name: find
+ arguments:
+ filter: { encryptedDecimalPrecision: { $gt: { $numberDecimal: "0.0" } }}
+ result: [*doc1]
+
+ - description: "Find with $gte"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedDecimalPrecision: { $gte: { $numberDecimal: "0.0" } }}
+ # sort so results from range queries are ordered.
+ sort: { _id: 1 }
+ result: [*doc0, *doc1]
+
+ - description: "Find with $gt with no results"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedDecimalPrecision: { $gt: { $numberDecimal: "1.0" } }}
+ result: []
+
+ - description: "Find with $lt"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedDecimalPrecision: { $lt: { $numberDecimal: "1.0" } }}
+ result: [*doc0]
+
+ - description: "Find with $lte"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedDecimalPrecision: { $lte: { $numberDecimal: "1.0" } }}
+ # sort so results from range queries are ordered.
+ sort: { _id: 1 }
+ result: [*doc0, *doc1]
+
+ - description: "Find with $lt below min"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedDecimalPrecision: { $lt: { $numberDecimal: "0.0" } }}
+ result:
+ errorContains: must be greater than the range minimum
+
+ - description: "Find with $gt above max"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedDecimalPrecision: { $gt: { $numberDecimal: "200.0" } }}
+ result:
+ errorContains: must be less than the range max
+
+ - description: "Find with $gt and $lt"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedDecimalPrecision: { $gt: { $numberDecimal: "0.0" }, $lt: { $numberDecimal: "2.0"} }}
+ result: [*doc1]
+
+ - description: "Find with equality"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedDecimalPrecision: { $numberDecimal: "0.0" } }
+ result: [*doc0]
+ - name: find
+ arguments:
+ filter: { encryptedDecimalPrecision: { $numberDecimal: "1.0" } }
+ result: [*doc1]
+
+ - description: "Find with full range"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedDecimalPrecision: { $gte: {$numberDecimal: "0.0"}, $lte: {$numberDecimal: "200.0"} } }
+ # sort so results from range queries are ordered.
+ sort: { _id: 1 }
+ result: [*doc0, *doc1]
+
+ - description: "Find with $in"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedDecimalPrecision: { $in: [ {$numberDecimal: "0.0"} ] } }
+ result: [*doc0]
+
+ - description: "Insert out of range"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments:
+ document: { _id: 0, encryptedDecimalPrecision: { $numberDecimal: "-1" }}
+ result:
+ errorContains: value must be greater than or equal to the minimum value
+
+ - description: "Insert min and max"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments:
+ document: *doc0
+ - name: insertOne
+ arguments:
+ document: &doc200 { _id: 200, encryptedDecimalPrecision: { $numberDecimal: "200.0" }}
+ - name: find
+ arguments:
+ filter: {}
+ # sort so results from range queries are ordered.
+ sort: { _id: 1 }
+ result: [*doc0, *doc200]
+
+ - description: "Aggregate with $gte"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedDecimalPrecision: { $gte: { $numberDecimal: "0.0" } }} }
+ # sort so results from range queries are ordered.
+ - { $sort: { _id: 1 }}
+ result: [*doc0, *doc1]
+
+ - description: "Aggregate with $gt with no results"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedDecimalPrecision: { $gt: { $numberDecimal: "1.0" } }} }
+ result: []
+
+ - description: "Aggregate with $lt"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedDecimalPrecision: { $lt: { $numberDecimal: "1.0" } }} }
+ result: [*doc0]
+
+ - description: "Aggregate with $lte"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedDecimalPrecision: { $lte: { $numberDecimal: "1.0" } }} }
+ # sort so results from range queries are ordered.
+ - { $sort: { _id: 1 }}
+ result: [*doc0, *doc1]
+
+ - description: "Aggregate with $lt below min"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedDecimalPrecision: { $lt: { $numberDecimal: "0.0" } }} }
+ result:
+ errorContains: must be greater than the range minimum
+
+ - description: "Aggregate with $gt above max"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedDecimalPrecision: { $gt: { $numberDecimal: "200.0" } }} }
+ result:
+ errorContains: must be less than the range max
+
+ - description: "Aggregate with $gt and $lt"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedDecimalPrecision: { $gt: { $numberDecimal: "0.0" }, $lt: { $numberDecimal: "2.0"} }} }
+ result: [*doc1]
+
+ - description: "Aggregate with equality"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedDecimalPrecision: { $numberDecimal: "0.0" } } }
+ result: [*doc0]
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedDecimalPrecision: { $numberDecimal: "1.0" } } }
+ result: [*doc1]
+
+ - description: "Aggregate with full range"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedDecimalPrecision: { $gte: {$numberDecimal: "0.0"}, $lte: {$numberDecimal: "200.0"} } } }
+ # sort so results from range queries are ordered.
+ - { $sort: { _id: 1 }}
+ result: [*doc0, *doc1]
+
+ - description: "Aggregate with $in"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedDecimalPrecision: { $in: [ {$numberDecimal: "0.0"} ] } } }
+ result: [*doc0]
+
+ - description: "Wrong type: Insert Int"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: { _id: 0, encryptedDecimalPrecision: { $numberInt: "0" }} }
+ result:
+ # Expect an error from mongocryptd.
+ errorContains: "cannot encrypt element"
+
+ - description: "Wrong type: Find Int"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: find
+ arguments:
+ filter: { encryptedDecimalPrecision: { $gte: { $numberInt: "0" } }}
+ # sort so results from range queries are ordered.
+ sort: { _id: 1 }
+ result:
+ # expect an error from libmongocrypt.
+ errorContains: "field type is not supported"
\ No newline at end of file
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-DecimalPrecision-Delete.json b/specifications/client-side-encryption/tests/legacy/fle2-Range-DecimalPrecision-Delete.json
new file mode 100644
index 00000000000..3d7d359af6b
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-DecimalPrecision-Delete.json
@@ -0,0 +1,493 @@
+{
+ "runOn": [
+ {
+ "minServerVersion": "6.2.0",
+ "topology": [
+ "replicaset",
+ "sharded",
+ "load-balanced"
+ ]
+ }
+ ],
+ "database_name": "default",
+ "collection_name": "default",
+ "data": [],
+ "encrypted_fields": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDecimalPrecision",
+ "bsonType": "decimal",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberDecimal": "0.0"
+ },
+ "max": {
+ "$numberDecimal": "200.0"
+ },
+ "precision": {
+ "$numberInt": "2"
+ }
+ }
+ }
+ ]
+ },
+ "key_vault_data": [
+ {
+ "_id": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "keyMaterial": {
+ "$binary": {
+ "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==",
+ "subType": "00"
+ }
+ },
+ "creationDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "updateDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "status": {
+ "$numberInt": "0"
+ },
+ "masterKey": {
+ "provider": "local"
+ }
+ }
+ ],
+ "tests": [
+ {
+ "description": "FLE2 Range DecimalPrecision. Delete.",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "deleteOne",
+ "arguments": {
+ "filter": {
+ "encryptedDecimalPrecision": {
+ "$gt": {
+ "$numberDecimal": "0"
+ }
+ }
+ }
+ },
+ "result": {
+ "deletedCount": 1
+ }
+ }
+ ],
+ "expectations": [
+ {
+ "command_started_event": {
+ "command": {
+ "listCollections": 1,
+ "filter": {
+ "name": "default"
+ }
+ },
+ "command_name": "listCollections"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "find": "datakeys",
+ "filter": {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ },
+ "$db": "keyvault",
+ "readConcern": {
+ "level": "majority"
+ }
+ },
+ "command_name": "find"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 0,
+ "encryptedDecimalPrecision": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDecimalPrecision",
+ "bsonType": "decimal",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberDecimal": "0.0"
+ },
+ "max": {
+ "$numberDecimal": "200.0"
+ },
+ "precision": {
+ "$numberInt": "2"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 1,
+ "encryptedDecimalPrecision": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDecimalPrecision",
+ "bsonType": "decimal",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberDecimal": "0.0"
+ },
+ "max": {
+ "$numberDecimal": "200.0"
+ },
+ "precision": {
+ "$numberInt": "2"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "delete": "default",
+ "deletes": [
+ {
+ "q": {
+ "encryptedDecimalPrecision": {
+ "$gt": {
+ "$binary": {
+ "base64": "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",
+ "subType": "06"
+ }
+ }
+ }
+ },
+ "limit": 1
+ }
+ ],
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDecimalPrecision",
+ "bsonType": "decimal",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberDecimal": "0.0"
+ },
+ "max": {
+ "$numberDecimal": "200.0"
+ },
+ "precision": {
+ "$numberInt": "2"
+ }
+ }
+ }
+ ]
+ }
+ },
+ "deleteTokens": {
+ "default.default": {
+ "encryptedDecimalPrecision": {
+ "e": {
+ "$binary": {
+ "base64": "65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+w=",
+ "subType": "00"
+ }
+ },
+ "o": {
+ "$binary": {
+ "base64": "noN+05JsuO1oDg59yypIGj45i+eFH6HOTXOPpeZ//Mk=",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "command_name": "delete"
+ }
+ }
+ ],
+ "outcome": {
+ "collection": {
+ "data": [
+ {
+ "_id": {
+ "$numberInt": "0"
+ },
+ "encryptedDecimalPrecision": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Dri0CXmL78L2DOgk9w0DwxHOMGMzih7m6l59vgy+WWo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "b7d8mRzD1kI1tdc7uNL+YAUonJ6pODLsRLkArfEKSkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Xg8C1/A0KJaXOw4i+26Rv03/CydaaunOzXh0CIT+gn8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "UoKUDw2wJYToUCcFaIs03YQSTksYR0MIOTJllwODqKc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "c/5cwAT0C5jber2xlJnWD3a5tVDy0nRtr5HG02hoFOY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wSUrRXavAGaajNeqC5mEUH1K67oYl5Wy9RNIzKjwLAM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6vrp4wWDtHEgHWR99I70WVDzevg1Fk/Pw5U8gUDa0OU=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ ]
+}
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-DecimalPrecision-Delete.yml b/specifications/client-side-encryption/tests/legacy/fle2-Range-DecimalPrecision-Delete.yml
new file mode 100644
index 00000000000..5603f6d34cd
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-DecimalPrecision-Delete.yml
@@ -0,0 +1,229 @@
+# Requires libmongocrypt 1.7.0.
+runOn:
+ - minServerVersion: "6.2.0"
+ # FLE 2 Encrypted collections are not supported on standalone.
+ topology: [ "replicaset", "sharded", "load-balanced" ]
+database_name: &database_name "default"
+collection_name: &collection_name "default"
+data: []
+encrypted_fields: &encrypted_fields {'escCollection': 'enxcol_.default.esc', 'eccCollection': 'enxcol_.default.ecc', 'ecocCollection': 'enxcol_.default.ecoc', 'fields': [{'keyId': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'path': 'encryptedDecimalPrecision', 'bsonType': 'decimal', 'queries': {'queryType': 'rangePreview', 'contention': {'$numberLong': '0'}, 'sparsity': {'$numberLong': '1'}, 'min': {'$numberDecimal': '0.0'}, 'max': {'$numberDecimal': '200.0'}, 'precision': {'$numberInt': '2'}}}]}
+key_vault_data: [ {'_id': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'keyMaterial': {'$binary': {'base64': 'sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==', 'subType': '00'}}, 'creationDate': {'$date': {'$numberLong': '1648914851981'}}, 'updateDate': {'$date': {'$numberLong': '1648914851981'}}, 'status': {'$numberInt': '0'}, 'masterKey': {'provider': 'local'}} ]
+tests:
+ - description: "FLE2 Range DecimalPrecision. Delete."
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments:
+ document: &doc0 { _id: 0, encryptedDecimalPrecision: { $numberDecimal: "0" } }
+ - name: insertOne
+ arguments:
+ document: &doc1 { _id: 1, encryptedDecimalPrecision: { $numberDecimal: "1" } }
+ - name: deleteOne
+ arguments:
+ filter: { "encryptedDecimalPrecision": { $gt: {$numberDecimal: "0" }} }
+ result:
+ deletedCount: 1
+ expectations:
+ - command_started_event:
+ command:
+ listCollections: 1
+ filter:
+ name: *collection_name
+ command_name: listCollections
+ - command_started_event:
+ command:
+ find: datakeys
+ filter: {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ }
+ $db: keyvault
+ readConcern: { level: "majority" }
+ command_name: find
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc0_encrypted { "_id": 0, "encryptedDecimalPrecision": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc1_encrypted { "_id": 1, "encryptedDecimalPrecision": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ delete: *collection_name
+ deletes: [
+ {
+ "q": {
+ "encryptedDecimalPrecision": {
+ "$gt": {
+ "$binary": {
+ "base64": "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",
+ "subType": "06"
+ }
+ }
+ }
+ },
+ "limit": 1
+ }
+ ]
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ "deleteTokens": {
+ "default.default": {
+ "encryptedDecimalPrecision": {
+ "e": {
+ "$binary": {
+ "base64": "65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+w=",
+ "subType": "00"
+ }
+ },
+ "o": {
+ "$binary": {
+ "base64": "noN+05JsuO1oDg59yypIGj45i+eFH6HOTXOPpeZ//Mk=",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ command_name: delete
+ outcome:
+ collection:
+ # Outcome is checked using a separate MongoClient without auto encryption.
+ data:
+ -
+ {
+ "_id": {
+ "$numberInt": "0"
+ },
+ "encryptedDecimalPrecision": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Dri0CXmL78L2DOgk9w0DwxHOMGMzih7m6l59vgy+WWo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "b7d8mRzD1kI1tdc7uNL+YAUonJ6pODLsRLkArfEKSkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Xg8C1/A0KJaXOw4i+26Rv03/CydaaunOzXh0CIT+gn8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "UoKUDw2wJYToUCcFaIs03YQSTksYR0MIOTJllwODqKc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "c/5cwAT0C5jber2xlJnWD3a5tVDy0nRtr5HG02hoFOY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wSUrRXavAGaajNeqC5mEUH1K67oYl5Wy9RNIzKjwLAM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6vrp4wWDtHEgHWR99I70WVDzevg1Fk/Pw5U8gUDa0OU=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
\ No newline at end of file
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-DecimalPrecision-FindOneAndUpdate.json b/specifications/client-side-encryption/tests/legacy/fle2-Range-DecimalPrecision-FindOneAndUpdate.json
new file mode 100644
index 00000000000..b1442c3a3c5
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-DecimalPrecision-FindOneAndUpdate.json
@@ -0,0 +1,612 @@
+{
+ "runOn": [
+ {
+ "minServerVersion": "6.2.0",
+ "topology": [
+ "replicaset",
+ "sharded",
+ "load-balanced"
+ ]
+ }
+ ],
+ "database_name": "default",
+ "collection_name": "default",
+ "data": [],
+ "encrypted_fields": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDecimalPrecision",
+ "bsonType": "decimal",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberDecimal": "0.0"
+ },
+ "max": {
+ "$numberDecimal": "200.0"
+ },
+ "precision": {
+ "$numberInt": "2"
+ }
+ }
+ }
+ ]
+ },
+ "key_vault_data": [
+ {
+ "_id": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "keyMaterial": {
+ "$binary": {
+ "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==",
+ "subType": "00"
+ }
+ },
+ "creationDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "updateDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "status": {
+ "$numberInt": "0"
+ },
+ "masterKey": {
+ "provider": "local"
+ }
+ }
+ ],
+ "tests": [
+ {
+ "description": "FLE2 Range DecimalPrecision. FindOneAndUpdate.",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "findOneAndUpdate",
+ "arguments": {
+ "filter": {
+ "encryptedDecimalPrecision": {
+ "$gt": {
+ "$numberDecimal": "0"
+ }
+ }
+ },
+ "update": {
+ "$set": {
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "2"
+ }
+ }
+ },
+ "returnDocument": "Before"
+ },
+ "result": {
+ "_id": 1,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "1"
+ }
+ }
+ }
+ ],
+ "expectations": [
+ {
+ "command_started_event": {
+ "command": {
+ "listCollections": 1,
+ "filter": {
+ "name": "default"
+ }
+ },
+ "command_name": "listCollections"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "find": "datakeys",
+ "filter": {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ },
+ "$db": "keyvault",
+ "readConcern": {
+ "level": "majority"
+ }
+ },
+ "command_name": "find"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 0,
+ "encryptedDecimalPrecision": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDecimalPrecision",
+ "bsonType": "decimal",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberDecimal": "0.0"
+ },
+ "max": {
+ "$numberDecimal": "200.0"
+ },
+ "precision": {
+ "$numberInt": "2"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 1,
+ "encryptedDecimalPrecision": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDecimalPrecision",
+ "bsonType": "decimal",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberDecimal": "0.0"
+ },
+ "max": {
+ "$numberDecimal": "200.0"
+ },
+ "precision": {
+ "$numberInt": "2"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "findAndModify": "default",
+ "query": {
+ "encryptedDecimalPrecision": {
+ "$gt": {
+ "$binary": {
+ "base64": "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",
+ "subType": "06"
+ }
+ }
+ }
+ },
+ "update": {
+ "$set": {
+ "encryptedDecimalPrecision": {
+ "$$type": "binData"
+ }
+ }
+ },
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDecimalPrecision",
+ "bsonType": "decimal",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberDecimal": "0.0"
+ },
+ "max": {
+ "$numberDecimal": "200.0"
+ },
+ "precision": {
+ "$numberInt": "2"
+ }
+ }
+ }
+ ]
+ }
+ },
+ "deleteTokens": {
+ "default.default": {
+ "encryptedDecimalPrecision": {
+ "e": {
+ "$binary": {
+ "base64": "65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+w=",
+ "subType": "00"
+ }
+ },
+ "o": {
+ "$binary": {
+ "base64": "noN+05JsuO1oDg59yypIGj45i+eFH6HOTXOPpeZ//Mk=",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "command_name": "findAndModify"
+ }
+ }
+ ],
+ "outcome": {
+ "collection": {
+ "data": [
+ {
+ "_id": {
+ "$numberInt": "0"
+ },
+ "encryptedDecimalPrecision": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Dri0CXmL78L2DOgk9w0DwxHOMGMzih7m6l59vgy+WWo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "b7d8mRzD1kI1tdc7uNL+YAUonJ6pODLsRLkArfEKSkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Xg8C1/A0KJaXOw4i+26Rv03/CydaaunOzXh0CIT+gn8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "UoKUDw2wJYToUCcFaIs03YQSTksYR0MIOTJllwODqKc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "c/5cwAT0C5jber2xlJnWD3a5tVDy0nRtr5HG02hoFOY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wSUrRXavAGaajNeqC5mEUH1K67oYl5Wy9RNIzKjwLAM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6vrp4wWDtHEgHWR99I70WVDzevg1Fk/Pw5U8gUDa0OU=",
+ "subType": "00"
+ }
+ }
+ ]
+ },
+ {
+ "_id": {
+ "$numberInt": "1"
+ },
+ "encryptedDecimalPrecision": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "DLCAJs+W2PL2DV5YChCL6dYrQNr+j4p3L7xhVaub4ic=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "V6knyt7Zq2CG3++l75UtBx2m32iGAPjHiAe439Bf02w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "F08nMDWDZc+DbWM7XCEJNNCEYyinRmrvGP7EWhmp4is=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cXH4688amcDc8kZOJq4UP8cE3R58Zl7e+Qo/1jyspps=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "uURBxvTp3FBCVkd+LPqyuY7d6rMW6SGIJQEPY/wtkZI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "jG3hax1L3RBp9t38vUt53FsBxgr/+Si/vVISpAylYpE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kwtIW8MhH9Ky5xNjBx8gFA/SHh2YVphie7g5FGBzals=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FHflwFuEMu4xX0ZApHi+pdlBH+oevAtXckCUb5Wv0xU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "0OKSXELxPP85SBVwDGf3LtMEQCJ8TTkFUl/+6jlkdb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "25j9sQXZCihCmHKvTHgaBsAVZFcGPn7JjHdrCGlwyyw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "uEw0lpQtBppR3vqV9j9+NQRSBF1BzZukb8c9IhyWvxc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zVhZ7Q59O087ji49oMJvBIgeir2oqvUpnh4p53GcTow=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dowrzKs+qJhRMZyKDbhjXbuX43FbmUKOaw9I8YlOZDw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ep5B6cska6THLIF7Mn3tn3RvV9EiwLSt0eZM/CLRUDc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "URNp/YmmDh5wIZUfAzzgPyJeMNiVx9PMsz52DZRujGY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wlM4IAQhhKQEzoVqS8b1Ddd50GB95OFb9LnzOwyjCP4=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ ]
+}
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-DecimalPrecision-FindOneAndUpdate.yml b/specifications/client-side-encryption/tests/legacy/fle2-Range-DecimalPrecision-FindOneAndUpdate.yml
new file mode 100644
index 00000000000..c79f5b9b7f3
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-DecimalPrecision-FindOneAndUpdate.yml
@@ -0,0 +1,331 @@
+# Requires libmongocrypt 1.7.0.
+runOn:
+ - minServerVersion: "6.2.0"
+ # FLE 2 Encrypted collections are not supported on standalone.
+ topology: [ "replicaset", "sharded", "load-balanced" ]
+database_name: &database_name "default"
+collection_name: &collection_name "default"
+data: []
+encrypted_fields: &encrypted_fields {'escCollection': 'enxcol_.default.esc', 'eccCollection': 'enxcol_.default.ecc', 'ecocCollection': 'enxcol_.default.ecoc', 'fields': [{'keyId': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'path': 'encryptedDecimalPrecision', 'bsonType': 'decimal', 'queries': {'queryType': 'rangePreview', 'contention': {'$numberLong': '0'}, 'sparsity': {'$numberLong': '1'}, 'min': {'$numberDecimal': '0.0'}, 'max': {'$numberDecimal': '200.0'}, 'precision': {'$numberInt': '2'}}}]}
+key_vault_data: [ {'_id': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'keyMaterial': {'$binary': {'base64': 'sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==', 'subType': '00'}}, 'creationDate': {'$date': {'$numberLong': '1648914851981'}}, 'updateDate': {'$date': {'$numberLong': '1648914851981'}}, 'status': {'$numberInt': '0'}, 'masterKey': {'provider': 'local'}} ]
+tests:
+ - description: "FLE2 Range DecimalPrecision. FindOneAndUpdate."
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments:
+ document: &doc0 { _id: 0, encryptedDecimalPrecision: { $numberDecimal: "0" } }
+ - name: insertOne
+ arguments:
+ document: &doc1 { _id: 1, encryptedDecimalPrecision: { $numberDecimal: "1" } }
+ - name: findOneAndUpdate
+ arguments:
+ filter: { encryptedDecimalPrecision: { $gt: {$numberDecimal: "0"}} }
+ update: { "$set": { "encryptedDecimalPrecision": {$numberDecimal: "2"}}}
+ returnDocument: Before
+ result: *doc1
+ expectations:
+ - command_started_event:
+ command:
+ listCollections: 1
+ filter:
+ name: *collection_name
+ command_name: listCollections
+ - command_started_event:
+ command:
+ find: datakeys
+ filter: {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ }
+ $db: keyvault
+ readConcern: { level: "majority" }
+ command_name: find
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc0_encrypted { "_id": 0, "encryptedDecimalPrecision": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc1_encrypted { "_id": 1, "encryptedDecimalPrecision": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ findAndModify: *collection_name
+ query: {
+ "encryptedDecimalPrecision": {
+ "$gt": {
+ "$binary": {
+ "base64": "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",
+ "subType": "06"
+ }
+ }
+ }
+ }
+ update: { "$set": {"encryptedDecimalPrecision": { $$type: "binData" }} }
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ "deleteTokens": {
+ "default.default": {
+ "encryptedDecimalPrecision": {
+ "e": {
+ "$binary": {
+ "base64": "65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+w=",
+ "subType": "00"
+ }
+ },
+ "o": {
+ "$binary": {
+ "base64": "noN+05JsuO1oDg59yypIGj45i+eFH6HOTXOPpeZ//Mk=",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ command_name: findAndModify
+ outcome:
+ collection:
+ # Outcome is checked using a separate MongoClient without auto encryption.
+ data:
+ -
+ {
+ "_id": {
+ "$numberInt": "0"
+ },
+ "encryptedDecimalPrecision": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Dri0CXmL78L2DOgk9w0DwxHOMGMzih7m6l59vgy+WWo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "b7d8mRzD1kI1tdc7uNL+YAUonJ6pODLsRLkArfEKSkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Xg8C1/A0KJaXOw4i+26Rv03/CydaaunOzXh0CIT+gn8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "UoKUDw2wJYToUCcFaIs03YQSTksYR0MIOTJllwODqKc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "c/5cwAT0C5jber2xlJnWD3a5tVDy0nRtr5HG02hoFOY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wSUrRXavAGaajNeqC5mEUH1K67oYl5Wy9RNIzKjwLAM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6vrp4wWDtHEgHWR99I70WVDzevg1Fk/Pw5U8gUDa0OU=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ -
+ {
+ "_id": {
+ "$numberInt": "1"
+ },
+ "encryptedDecimalPrecision": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "DLCAJs+W2PL2DV5YChCL6dYrQNr+j4p3L7xhVaub4ic=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "V6knyt7Zq2CG3++l75UtBx2m32iGAPjHiAe439Bf02w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "F08nMDWDZc+DbWM7XCEJNNCEYyinRmrvGP7EWhmp4is=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cXH4688amcDc8kZOJq4UP8cE3R58Zl7e+Qo/1jyspps=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "uURBxvTp3FBCVkd+LPqyuY7d6rMW6SGIJQEPY/wtkZI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "jG3hax1L3RBp9t38vUt53FsBxgr/+Si/vVISpAylYpE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kwtIW8MhH9Ky5xNjBx8gFA/SHh2YVphie7g5FGBzals=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FHflwFuEMu4xX0ZApHi+pdlBH+oevAtXckCUb5Wv0xU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "0OKSXELxPP85SBVwDGf3LtMEQCJ8TTkFUl/+6jlkdb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "25j9sQXZCihCmHKvTHgaBsAVZFcGPn7JjHdrCGlwyyw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "uEw0lpQtBppR3vqV9j9+NQRSBF1BzZukb8c9IhyWvxc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zVhZ7Q59O087ji49oMJvBIgeir2oqvUpnh4p53GcTow=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dowrzKs+qJhRMZyKDbhjXbuX43FbmUKOaw9I8YlOZDw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ep5B6cska6THLIF7Mn3tn3RvV9EiwLSt0eZM/CLRUDc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "URNp/YmmDh5wIZUfAzzgPyJeMNiVx9PMsz52DZRujGY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wlM4IAQhhKQEzoVqS8b1Ddd50GB95OFb9LnzOwyjCP4=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-DecimalPrecision-InsertFind.json b/specifications/client-side-encryption/tests/legacy/fle2-Range-DecimalPrecision-InsertFind.json
new file mode 100644
index 00000000000..3b8202ff87f
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-DecimalPrecision-InsertFind.json
@@ -0,0 +1,577 @@
+{
+ "runOn": [
+ {
+ "minServerVersion": "6.2.0",
+ "topology": [
+ "replicaset",
+ "sharded",
+ "load-balanced"
+ ]
+ }
+ ],
+ "database_name": "default",
+ "collection_name": "default",
+ "data": [],
+ "encrypted_fields": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDecimalPrecision",
+ "bsonType": "decimal",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberDecimal": "0.0"
+ },
+ "max": {
+ "$numberDecimal": "200.0"
+ },
+ "precision": {
+ "$numberInt": "2"
+ }
+ }
+ }
+ ]
+ },
+ "key_vault_data": [
+ {
+ "_id": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "keyMaterial": {
+ "$binary": {
+ "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==",
+ "subType": "00"
+ }
+ },
+ "creationDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "updateDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "status": {
+ "$numberInt": "0"
+ },
+ "masterKey": {
+ "provider": "local"
+ }
+ }
+ ],
+ "tests": [
+ {
+ "description": "FLE2 Range DecimalPrecision. Insert and Find.",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDecimalPrecision": {
+ "$gt": {
+ "$numberDecimal": "0"
+ }
+ }
+ }
+ },
+ "result": [
+ {
+ "_id": 1,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "1"
+ }
+ }
+ ]
+ }
+ ],
+ "expectations": [
+ {
+ "command_started_event": {
+ "command": {
+ "listCollections": 1,
+ "filter": {
+ "name": "default"
+ }
+ },
+ "command_name": "listCollections"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "find": "datakeys",
+ "filter": {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ },
+ "$db": "keyvault",
+ "readConcern": {
+ "level": "majority"
+ }
+ },
+ "command_name": "find"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 0,
+ "encryptedDecimalPrecision": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDecimalPrecision",
+ "bsonType": "decimal",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberDecimal": "0.0"
+ },
+ "max": {
+ "$numberDecimal": "200.0"
+ },
+ "precision": {
+ "$numberInt": "2"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 1,
+ "encryptedDecimalPrecision": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDecimalPrecision",
+ "bsonType": "decimal",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberDecimal": "0.0"
+ },
+ "max": {
+ "$numberDecimal": "200.0"
+ },
+ "precision": {
+ "$numberInt": "2"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "find": "default",
+ "filter": {
+ "encryptedDecimalPrecision": {
+ "$gt": {
+ "$binary": {
+ "base64": "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",
+ "subType": "06"
+ }
+ }
+ }
+ },
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDecimalPrecision",
+ "bsonType": "decimal",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberDecimal": "0.0"
+ },
+ "max": {
+ "$numberDecimal": "200.0"
+ },
+ "precision": {
+ "$numberInt": "2"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "find"
+ }
+ }
+ ],
+ "outcome": {
+ "collection": {
+ "data": [
+ {
+ "_id": 0,
+ "encryptedDecimalPrecision": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Dri0CXmL78L2DOgk9w0DwxHOMGMzih7m6l59vgy+WWo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "b7d8mRzD1kI1tdc7uNL+YAUonJ6pODLsRLkArfEKSkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Xg8C1/A0KJaXOw4i+26Rv03/CydaaunOzXh0CIT+gn8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "UoKUDw2wJYToUCcFaIs03YQSTksYR0MIOTJllwODqKc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "c/5cwAT0C5jber2xlJnWD3a5tVDy0nRtr5HG02hoFOY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wSUrRXavAGaajNeqC5mEUH1K67oYl5Wy9RNIzKjwLAM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6vrp4wWDtHEgHWR99I70WVDzevg1Fk/Pw5U8gUDa0OU=",
+ "subType": "00"
+ }
+ }
+ ]
+ },
+ {
+ "_id": 1,
+ "encryptedDecimalPrecision": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "bE1vqWj3KNyM7cCYUv/cnYm8BPaUL3eMp5syTHq6NF4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "mVZb+Ra0EYjQ4Zrh9X//E2T8MRj7NMqm5GUJXhRrBEI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FA74j21GUEJb1DJBOpR9nVnjaDZnd8yAQNuaW9Qi26g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kJv//KVkbrobIBf+QeWC5jxn20mx/P0R1N6aCSMgKM8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zB+Whi9IUUGxfLEe+lGuIzLX4LFbIhaIAm5lRk65QTc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ybO1QU3CgvhO8JgRXH+HxKszWcpl5aGDYYVa75fHa1g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "X3Y3eSAbbMg//JgiHHiFpYOpV61t8kkDexI+CQyitH4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SlNHXyqVFGDPrX/2ppwog6l4pwj3PKda2TkZbqgfSfA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "McjV8xwTF3xI7863DYOBdyvIv6UpzThl6v9vBRk05bI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "MgwakFvPyBlwqFTbhWUF79URJQWFoJTGotlEVSPPUsQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "DyBERpMSD5lEM5Nhpcn4WGgxgn/mkUVJp+PYSLX5jsE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "I43iazc0xj1WVbYB/V+uTL/tughN1bBlxh1iypBnNsA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wjOBa/ATMuOywFmuPgC0GF/oeLqu0Z7eK5udzkTPbis=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "gRQVwiR+m+0Vg8ZDXqrQQcVnTyobwCXNaA4BCJVXtMc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "WUZ6huwx0ZbLb0R00uiC9FOJzsUocUN8qE5+YRenkvQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "7s79aKEuPgQcS/YPOOVcYNZvHIo7FFsWtFCrnDKXefA=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ ]
+}
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-DecimalPrecision-InsertFind.yml b/specifications/client-side-encryption/tests/legacy/fle2-Range-DecimalPrecision-InsertFind.yml
new file mode 100644
index 00000000000..2bdd29cdb3e
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-DecimalPrecision-InsertFind.yml
@@ -0,0 +1,305 @@
+# Requires libmongocrypt 1.7.0.
+runOn:
+ - minServerVersion: "6.2.0"
+ # FLE 2 Encrypted collections are not supported on standalone.
+ topology: [ "replicaset", "sharded", "load-balanced" ]
+database_name: &database_name "default"
+collection_name: &collection_name "default"
+data: []
+encrypted_fields: &encrypted_fields {'escCollection': 'enxcol_.default.esc', 'eccCollection': 'enxcol_.default.ecc', 'ecocCollection': 'enxcol_.default.ecoc', 'fields': [{'keyId': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'path': 'encryptedDecimalPrecision', 'bsonType': 'decimal', 'queries': {'queryType': 'rangePreview', 'contention': {'$numberLong': '0'}, 'sparsity': {'$numberLong': '1'}, 'min': {'$numberDecimal': '0.0'}, 'max': {'$numberDecimal': '200.0'}, 'precision': {'$numberInt': '2'}}}]}
+key_vault_data: [ {'_id': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'keyMaterial': {'$binary': {'base64': 'sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==', 'subType': '00'}}, 'creationDate': {'$date': {'$numberLong': '1648914851981'}}, 'updateDate': {'$date': {'$numberLong': '1648914851981'}}, 'status': {'$numberInt': '0'}, 'masterKey': {'provider': 'local'}} ]
+tests:
+ - description: "FLE2 Range DecimalPrecision. Insert and Find."
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments:
+ document: &doc0 { _id: 0, encryptedDecimalPrecision: { $numberDecimal: "0" } }
+ - name: insertOne
+ arguments:
+ document: &doc1 { _id: 1, encryptedDecimalPrecision: { $numberDecimal: "1" } }
+ - name: find
+ arguments:
+ filter: { encryptedDecimalPrecision: { $gt: { $numberDecimal: "0" } } }
+ result: [*doc1]
+ expectations:
+ - command_started_event:
+ command:
+ listCollections: 1
+ filter:
+ name: *collection_name
+ command_name: listCollections
+ - command_started_event:
+ command:
+ find: datakeys
+ filter: {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ }
+ $db: keyvault
+ readConcern: { level: "majority" }
+ command_name: find
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc0_encrypted { "_id": 0, "encryptedDecimalPrecision": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc1_encrypted { "_id": 1, "encryptedDecimalPrecision": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ find: *collection_name
+ filter:
+ "encryptedDecimalPrecision": {
+ "$gt": {
+ "$binary": {
+ "base64": "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",
+ "subType": "06"
+ }
+ }
+ }
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: find
+ outcome:
+ collection:
+ # Outcome is checked using a separate MongoClient without auto encryption.
+ data:
+ -
+ {
+ "_id": 0,
+ "encryptedDecimalPrecision": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Dri0CXmL78L2DOgk9w0DwxHOMGMzih7m6l59vgy+WWo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "b7d8mRzD1kI1tdc7uNL+YAUonJ6pODLsRLkArfEKSkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Xg8C1/A0KJaXOw4i+26Rv03/CydaaunOzXh0CIT+gn8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "UoKUDw2wJYToUCcFaIs03YQSTksYR0MIOTJllwODqKc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "c/5cwAT0C5jber2xlJnWD3a5tVDy0nRtr5HG02hoFOY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wSUrRXavAGaajNeqC5mEUH1K67oYl5Wy9RNIzKjwLAM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6vrp4wWDtHEgHWR99I70WVDzevg1Fk/Pw5U8gUDa0OU=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ -
+ {
+ "_id": 1,
+ "encryptedDecimalPrecision": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "bE1vqWj3KNyM7cCYUv/cnYm8BPaUL3eMp5syTHq6NF4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "mVZb+Ra0EYjQ4Zrh9X//E2T8MRj7NMqm5GUJXhRrBEI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FA74j21GUEJb1DJBOpR9nVnjaDZnd8yAQNuaW9Qi26g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kJv//KVkbrobIBf+QeWC5jxn20mx/P0R1N6aCSMgKM8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zB+Whi9IUUGxfLEe+lGuIzLX4LFbIhaIAm5lRk65QTc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ybO1QU3CgvhO8JgRXH+HxKszWcpl5aGDYYVa75fHa1g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "X3Y3eSAbbMg//JgiHHiFpYOpV61t8kkDexI+CQyitH4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SlNHXyqVFGDPrX/2ppwog6l4pwj3PKda2TkZbqgfSfA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "McjV8xwTF3xI7863DYOBdyvIv6UpzThl6v9vBRk05bI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "MgwakFvPyBlwqFTbhWUF79URJQWFoJTGotlEVSPPUsQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "DyBERpMSD5lEM5Nhpcn4WGgxgn/mkUVJp+PYSLX5jsE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "I43iazc0xj1WVbYB/V+uTL/tughN1bBlxh1iypBnNsA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wjOBa/ATMuOywFmuPgC0GF/oeLqu0Z7eK5udzkTPbis=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "gRQVwiR+m+0Vg8ZDXqrQQcVnTyobwCXNaA4BCJVXtMc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "WUZ6huwx0ZbLb0R00uiC9FOJzsUocUN8qE5+YRenkvQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "7s79aKEuPgQcS/YPOOVcYNZvHIo7FFsWtFCrnDKXefA=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
\ No newline at end of file
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-DecimalPrecision-Update.json b/specifications/client-side-encryption/tests/legacy/fle2-Range-DecimalPrecision-Update.json
new file mode 100644
index 00000000000..3dc6631c617
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-DecimalPrecision-Update.json
@@ -0,0 +1,612 @@
+{
+ "runOn": [
+ {
+ "minServerVersion": "6.2.0",
+ "topology": [
+ "replicaset",
+ "sharded",
+ "load-balanced"
+ ]
+ }
+ ],
+ "database_name": "default",
+ "collection_name": "default",
+ "data": [],
+ "encrypted_fields": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDecimalPrecision",
+ "bsonType": "decimal",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberDecimal": "0.0"
+ },
+ "max": {
+ "$numberDecimal": "200.0"
+ },
+ "precision": {
+ "$numberInt": "2"
+ }
+ }
+ }
+ ]
+ },
+ "key_vault_data": [
+ {
+ "_id": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "keyMaterial": {
+ "$binary": {
+ "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==",
+ "subType": "00"
+ }
+ },
+ "creationDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "updateDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "status": {
+ "$numberInt": "0"
+ },
+ "masterKey": {
+ "provider": "local"
+ }
+ }
+ ],
+ "tests": [
+ {
+ "description": "FLE2 Range DecimalPrecision. Update.",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "updateOne",
+ "arguments": {
+ "filter": {
+ "encryptedDecimalPrecision": {
+ "$gt": {
+ "$numberDecimal": "0"
+ }
+ }
+ },
+ "update": {
+ "$set": {
+ "encryptedDecimalPrecision": {
+ "$numberDecimal": "2"
+ }
+ }
+ }
+ },
+ "result": {
+ "matchedCount": 1,
+ "modifiedCount": 1,
+ "upsertedCount": 0
+ }
+ }
+ ],
+ "expectations": [
+ {
+ "command_started_event": {
+ "command": {
+ "listCollections": 1,
+ "filter": {
+ "name": "default"
+ }
+ },
+ "command_name": "listCollections"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "find": "datakeys",
+ "filter": {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ },
+ "$db": "keyvault",
+ "readConcern": {
+ "level": "majority"
+ }
+ },
+ "command_name": "find"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 0,
+ "encryptedDecimalPrecision": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDecimalPrecision",
+ "bsonType": "decimal",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberDecimal": "0.0"
+ },
+ "max": {
+ "$numberDecimal": "200.0"
+ },
+ "precision": {
+ "$numberInt": "2"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 1,
+ "encryptedDecimalPrecision": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDecimalPrecision",
+ "bsonType": "decimal",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberDecimal": "0.0"
+ },
+ "max": {
+ "$numberDecimal": "200.0"
+ },
+ "precision": {
+ "$numberInt": "2"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command_name": "update",
+ "command": {
+ "update": "default",
+ "ordered": true,
+ "updates": [
+ {
+ "q": {
+ "encryptedDecimalPrecision": {
+ "$gt": {
+ "$binary": {
+ "base64": "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",
+ "subType": "06"
+ }
+ }
+ }
+ },
+ "u": {
+ "$set": {
+ "encryptedDecimalPrecision": {
+ "$$type": "binData"
+ }
+ }
+ }
+ }
+ ],
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDecimalPrecision",
+ "bsonType": "decimal",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberDecimal": "0.0"
+ },
+ "max": {
+ "$numberDecimal": "200.0"
+ },
+ "precision": {
+ "$numberInt": "2"
+ }
+ }
+ }
+ ]
+ }
+ },
+ "deleteTokens": {
+ "default.default": {
+ "encryptedDecimalPrecision": {
+ "e": {
+ "$binary": {
+ "base64": "65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+w=",
+ "subType": "00"
+ }
+ },
+ "o": {
+ "$binary": {
+ "base64": "noN+05JsuO1oDg59yypIGj45i+eFH6HOTXOPpeZ//Mk=",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "$db": "default"
+ }
+ }
+ }
+ ],
+ "outcome": {
+ "collection": {
+ "data": [
+ {
+ "_id": 0,
+ "encryptedDecimalPrecision": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Dri0CXmL78L2DOgk9w0DwxHOMGMzih7m6l59vgy+WWo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "b7d8mRzD1kI1tdc7uNL+YAUonJ6pODLsRLkArfEKSkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Xg8C1/A0KJaXOw4i+26Rv03/CydaaunOzXh0CIT+gn8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "UoKUDw2wJYToUCcFaIs03YQSTksYR0MIOTJllwODqKc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "c/5cwAT0C5jber2xlJnWD3a5tVDy0nRtr5HG02hoFOY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wSUrRXavAGaajNeqC5mEUH1K67oYl5Wy9RNIzKjwLAM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6vrp4wWDtHEgHWR99I70WVDzevg1Fk/Pw5U8gUDa0OU=",
+ "subType": "00"
+ }
+ }
+ ]
+ },
+ {
+ "_id": 1,
+ "encryptedDecimalPrecision": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "DLCAJs+W2PL2DV5YChCL6dYrQNr+j4p3L7xhVaub4ic=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "V6knyt7Zq2CG3++l75UtBx2m32iGAPjHiAe439Bf02w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "F08nMDWDZc+DbWM7XCEJNNCEYyinRmrvGP7EWhmp4is=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cXH4688amcDc8kZOJq4UP8cE3R58Zl7e+Qo/1jyspps=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "uURBxvTp3FBCVkd+LPqyuY7d6rMW6SGIJQEPY/wtkZI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "jG3hax1L3RBp9t38vUt53FsBxgr/+Si/vVISpAylYpE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kwtIW8MhH9Ky5xNjBx8gFA/SHh2YVphie7g5FGBzals=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FHflwFuEMu4xX0ZApHi+pdlBH+oevAtXckCUb5Wv0xU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "0OKSXELxPP85SBVwDGf3LtMEQCJ8TTkFUl/+6jlkdb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "25j9sQXZCihCmHKvTHgaBsAVZFcGPn7JjHdrCGlwyyw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "uEw0lpQtBppR3vqV9j9+NQRSBF1BzZukb8c9IhyWvxc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zVhZ7Q59O087ji49oMJvBIgeir2oqvUpnh4p53GcTow=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dowrzKs+qJhRMZyKDbhjXbuX43FbmUKOaw9I8YlOZDw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ep5B6cska6THLIF7Mn3tn3RvV9EiwLSt0eZM/CLRUDc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "URNp/YmmDh5wIZUfAzzgPyJeMNiVx9PMsz52DZRujGY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wlM4IAQhhKQEzoVqS8b1Ddd50GB95OFb9LnzOwyjCP4=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ ]
+}
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-DecimalPrecision-Update.yml b/specifications/client-side-encryption/tests/legacy/fle2-Range-DecimalPrecision-Update.yml
new file mode 100644
index 00000000000..e852a30c61c
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-DecimalPrecision-Update.yml
@@ -0,0 +1,344 @@
+# Requires libmongocrypt 1.7.0.
+runOn:
+ - minServerVersion: "6.2.0"
+ # FLE 2 Encrypted collections are not supported on standalone.
+ topology: [ "replicaset", "sharded", "load-balanced" ]
+database_name: &database_name "default"
+collection_name: &collection_name "default"
+data: []
+encrypted_fields: &encrypted_fields {'escCollection': 'enxcol_.default.esc', 'eccCollection': 'enxcol_.default.ecc', 'ecocCollection': 'enxcol_.default.ecoc', 'fields': [{'keyId': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'path': 'encryptedDecimalPrecision', 'bsonType': 'decimal', 'queries': {'queryType': 'rangePreview', 'contention': {'$numberLong': '0'}, 'sparsity': {'$numberLong': '1'}, 'min': {'$numberDecimal': '0.0'}, 'max': {'$numberDecimal': '200.0'}, 'precision': {'$numberInt': '2'}}}]}
+key_vault_data: [ {'_id': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'keyMaterial': {'$binary': {'base64': 'sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==', 'subType': '00'}}, 'creationDate': {'$date': {'$numberLong': '1648914851981'}}, 'updateDate': {'$date': {'$numberLong': '1648914851981'}}, 'status': {'$numberInt': '0'}, 'masterKey': {'provider': 'local'}} ]
+tests:
+ - description: "FLE2 Range DecimalPrecision. Update."
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments:
+ document: &doc0 { _id: 0, encryptedDecimalPrecision: { $numberDecimal: "0" } }
+ - name: insertOne
+ arguments:
+ document: &doc1 { _id: 1, encryptedDecimalPrecision: { $numberDecimal: "1" } }
+ - name: updateOne
+ arguments:
+ filter: { encryptedDecimalPrecision: { $gt: { $numberDecimal: "0" } } }
+ update: { "$set": { "encryptedDecimalPrecision": { $numberDecimal: "2" } }}
+ result:
+ matchedCount: 1
+ modifiedCount: 1
+ upsertedCount: 0
+ expectations:
+ - command_started_event:
+ command:
+ listCollections: 1
+ filter:
+ name: *collection_name
+ command_name: listCollections
+ - command_started_event:
+ command:
+ find: datakeys
+ filter: {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ }
+ $db: keyvault
+ readConcern: { level: "majority" }
+ command_name: find
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc0_encrypted { "_id": 0, "encryptedDecimalPrecision": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc1_encrypted { "_id": 1, "encryptedDecimalPrecision": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command_name: update
+ command:
+ {
+ "update": "default",
+ "ordered": true,
+ "updates": [
+ {
+ "q": {
+ "encryptedDecimalPrecision": {
+ "$gt": {
+ "$binary": {
+ "base64": "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",
+ "subType": "06"
+ }
+ }
+ }
+ },
+ "u": {
+ "$set": {
+ "encryptedDecimalPrecision": { $$type: "binData" }
+ }
+ }
+ }
+ ],
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": *encrypted_fields
+ },
+ "deleteTokens": {
+ "default.default": {
+ "encryptedDecimalPrecision": {
+ "e": {
+ "$binary": {
+ "base64": "65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+w=",
+ "subType": "00"
+ }
+ },
+ "o": {
+ "$binary": {
+ "base64": "noN+05JsuO1oDg59yypIGj45i+eFH6HOTXOPpeZ//Mk=",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "$db": "default"
+ }
+
+ outcome:
+ collection:
+ # Outcome is checked using a separate MongoClient without auto encryption.
+ data:
+ -
+ {
+ "_id": 0,
+ "encryptedDecimalPrecision": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Dri0CXmL78L2DOgk9w0DwxHOMGMzih7m6l59vgy+WWo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "b7d8mRzD1kI1tdc7uNL+YAUonJ6pODLsRLkArfEKSkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Xg8C1/A0KJaXOw4i+26Rv03/CydaaunOzXh0CIT+gn8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "UoKUDw2wJYToUCcFaIs03YQSTksYR0MIOTJllwODqKc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "c/5cwAT0C5jber2xlJnWD3a5tVDy0nRtr5HG02hoFOY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wSUrRXavAGaajNeqC5mEUH1K67oYl5Wy9RNIzKjwLAM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6vrp4wWDtHEgHWR99I70WVDzevg1Fk/Pw5U8gUDa0OU=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ -
+ {
+ "_id": 1,
+ "encryptedDecimalPrecision": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "DLCAJs+W2PL2DV5YChCL6dYrQNr+j4p3L7xhVaub4ic=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "V6knyt7Zq2CG3++l75UtBx2m32iGAPjHiAe439Bf02w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "F08nMDWDZc+DbWM7XCEJNNCEYyinRmrvGP7EWhmp4is=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cXH4688amcDc8kZOJq4UP8cE3R58Zl7e+Qo/1jyspps=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "uURBxvTp3FBCVkd+LPqyuY7d6rMW6SGIJQEPY/wtkZI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "jG3hax1L3RBp9t38vUt53FsBxgr/+Si/vVISpAylYpE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kwtIW8MhH9Ky5xNjBx8gFA/SHh2YVphie7g5FGBzals=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FHflwFuEMu4xX0ZApHi+pdlBH+oevAtXckCUb5Wv0xU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "0OKSXELxPP85SBVwDGf3LtMEQCJ8TTkFUl/+6jlkdb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "25j9sQXZCihCmHKvTHgaBsAVZFcGPn7JjHdrCGlwyyw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "uEw0lpQtBppR3vqV9j9+NQRSBF1BzZukb8c9IhyWvxc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zVhZ7Q59O087ji49oMJvBIgeir2oqvUpnh4p53GcTow=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dowrzKs+qJhRMZyKDbhjXbuX43FbmUKOaw9I8YlOZDw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ep5B6cska6THLIF7Mn3tn3RvV9EiwLSt0eZM/CLRUDc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "URNp/YmmDh5wIZUfAzzgPyJeMNiVx9PMsz52DZRujGY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wlM4IAQhhKQEzoVqS8b1Ddd50GB95OFb9LnzOwyjCP4=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
\ No newline at end of file
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-Double-Aggregate.json b/specifications/client-side-encryption/tests/legacy/fle2-Range-Double-Aggregate.json
new file mode 100644
index 00000000000..3d54be3d188
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-Double-Aggregate.json
@@ -0,0 +1,1138 @@
+{
+ "runOn": [
+ {
+ "minServerVersion": "6.2.0",
+ "topology": [
+ "replicaset",
+ "sharded",
+ "load-balanced"
+ ]
+ }
+ ],
+ "database_name": "default",
+ "collection_name": "default",
+ "data": [],
+ "encrypted_fields": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDouble",
+ "bsonType": "double",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ ]
+ },
+ "key_vault_data": [
+ {
+ "_id": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "keyMaterial": {
+ "$binary": {
+ "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==",
+ "subType": "00"
+ }
+ },
+ "creationDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "updateDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "status": {
+ "$numberInt": "0"
+ },
+ "masterKey": {
+ "provider": "local"
+ }
+ }
+ ],
+ "tests": [
+ {
+ "description": "FLE2 Range Double. Aggregate.",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDouble": {
+ "$numberDouble": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDouble": {
+ "$numberDouble": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedDouble": {
+ "$gt": {
+ "$numberDouble": "0"
+ }
+ }
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 1,
+ "encryptedDouble": {
+ "$numberDouble": "1"
+ }
+ }
+ ]
+ }
+ ],
+ "expectations": [
+ {
+ "command_started_event": {
+ "command": {
+ "listCollections": 1,
+ "filter": {
+ "name": "default"
+ }
+ },
+ "command_name": "listCollections"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "find": "datakeys",
+ "filter": {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ },
+ "$db": "keyvault",
+ "readConcern": {
+ "level": "majority"
+ }
+ },
+ "command_name": "find"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 0,
+ "encryptedDouble": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDouble",
+ "bsonType": "double",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 1,
+ "encryptedDouble": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDouble",
+ "bsonType": "double",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "aggregate": "default",
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedDouble": {
+ "$gt": {
+ "$binary": {
+ "base64": "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",
+ "subType": "06"
+ }
+ }
+ }
+ }
+ }
+ ],
+ "cursor": {},
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDouble",
+ "bsonType": "double",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "aggregate"
+ }
+ }
+ ],
+ "outcome": {
+ "collection": {
+ "data": [
+ {
+ "_id": 0,
+ "encryptedDouble": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6YrBn2ofIw1b5ooakrLOwF41BWrps8OO0H9WH4/rtlE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "n+XAuFnP8Dov9TnhGFxNx0K/MnVM9WbJ7RouEu0ndO0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yRXojuVdn5GQtD97qYlaCL6cOLmZ7Cvcb3wFjkLUIdM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "DuIkdRPITRs55I4SZmgomAHCIsDQmXRhW8+MOznkzSk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SsBk+Et1lTbU+QRPx+xyJ/jMkmfG+QCvQEpip2YYrzA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "crCIzOd8KhHvvUlX7M1v9bhvU4pLdTc+X2SuqoKU5Ek=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YOWdCw4UrqnxkAaVjqmC4sKQDMVMHEpFGnlxpxdaU6E=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "M3SShp81Ff8tQ632qKbv9MUcN6wjDaBReI0VXNu6Xh4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "gzHlSPxpM0hT75kQvWFzGlOxKvDoiKQZOr19V6l2zXI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "s3JnppOGYw9SL2Q1kMAZs948v2F5PrpXjGei/HioDWs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cG6+3Gk/zEH68P/uuuwiAUVCuyJwa1LeV+t29FlPPAo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dupdvR3AyJtM+g9NDKiaLVOtGca387JQp8w+V03m7Ig=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JqEQc5svj2jTvZ6LLA5ivE+kTb/0aRemSEmxk4G7Zrg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "szcXXXKnob+p3SoM4yED2R920LeJ7cVsclPMFTe4CeI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "o1QoGVXmuBdHwHm7aCtGMlMVKrjFdYvJXpoq6uhIAZ0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Jfm5wPlqqLCJRGQIqRq2NGmpn7s0Vrih2H3YAOoI2YU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zMHLb8ARbsYo8Ld05bqnGFf1Usha6EGb8QKwdSAyps0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yQdtq9lh5pugL7/i0Bj/PuZUUBUIzf+7wj1rl5y736w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wGWVZdO7qIuyDg/BqDgqjgoQ02h5YYgwXQB1oCin2NE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "by9HMLj6NTEpgztZ5HSN6GxImkXPcaFINYDzgZY33X8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tWo0vbasi7bXmn/MsOx13VC1IsWtpx/nYp0uj4iMzdA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tQQpndUYd5O87lOtrGjH3wl9VsOK0ray7RMasL90sBM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cQjXEDCMsOpKLLf+vlTgIHA+cbSJdzqhbSX9Wvh95aA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "7yMpU48IxK9SzP2cx3VnTownGEwFmeFofuuFT97SuuY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kSOx1kz0CmBgzKQHZlo65ZUY1DIv9A99JRm+Us2y6Ew=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ubQpdPBe6/xvtr+AcXdfYLSvYCR4ot0tivehkCsupb4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xal+iCJ6FTefRQToyoNksc9NCZShyn04NDGi4IYrcoM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "d7jU4iOK50xHxlkSifcxlZFCM46TSgQzoYivxG3HNLY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tJvl2nsBLBVzL3pp6sKWCL4UXeh3q/roYBJjSb74ve0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "OIUCaKRvIx9t1w6Hxlz1IcQTdPNCfdRNwnnTm10W+X0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "A9tvzsiElotOUVIB4CqfQp9mAwqvTM35YkmAR170aHA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lI8gpK7hpb7c9x4RQugsxMnQay5LZJmwslZdvMx/dcE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dNCzh40U0XvdKnSDi3HRQOWQftEsDVqc4uUvsVFGoq8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "IP+iwEBWBwVVZIdpaMu8k5+soFCz+TZkYn3drKZ9grE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pnqyh6e0y5svHkJDShlN9CHV0WvMBE4QbtJpQw5ZCXc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "elEl42tbVDoRTLjAhZUFEtXiut4b3PVhg/1ZLZSQdtE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "vHuu2FxwclMHqyE6JBYbTYgbEkB0dqb/JuaxsvfwsmY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xTf7NCe3Gf8QpE78HR5OknlLTKfs9J+RN9UZpH6fnso=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "XiWSasRnJAulGR6+LCVD3mwRObXylqYWR9jvpywq12c=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "MZMxEQ5ikx0PG1YFIExv0UnTZogsvgeOEZTpzvBDn4w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yZMyMZBDrWbAhvnic7vvIYhmO9m5H2iuv0c8KNZrBzY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xxM14hTPY5j0vvcK2C7YAEjzdsfUTFHozHC0hEo1bxI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+01rqR1xVwkpGXcstbk1ItJqFVjH6Q8MGxEN3Cm9Y1A=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xOpLV0Z2VTRJ3iWtnWZcsyjXubTIkYWo31cO+HV1o1k=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "BWUOLqgLBqc5NwxVlSV5H3KFQPXbCp7mdo+jF+8cJqY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "fuQb1S6xZDGlrEbK+kI23aL53PP1PVNwqICnZNt9Yzg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SfscnoibFttahLdPVC4Ee+47ewGFKpDSU7M6HX19bKE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rpSW2awybNVeKtat91VFxqbINoTfNhPfQAu+d73Xtf8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "9M/CP9ccOIIj2LLFmE0GFDO0Ban2wsNalEXfM6+h+1s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "WrEMG49l1ye4MhXs5ZS9tz8P6h+hDvthIg/2wW9ne1Q=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ImNhbfeyfH8qIEeA5ic0s3dAQBdzzTBS+CPsNih9vZ0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dWP33YDSn04UKJN2ogh2Rui0iW/0q2y18OCDRVcfyoo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lYv0isAtfGh6H9tdp3cp2eHU7q2J+uk7QrgcxtK3w7Y=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "VGMoamB/+7zTOYcY/pqJc96xlv2PdW4hwsIAEIslTDQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yNeBWMF7BnD9wVwz2PgJsvWr77QiVvvWUvJF0+fqBug=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SfpvObJ+tJBXSvqeN7vlOfmhYign635lciYAJIjUtY8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dsen4NqjzVGjpjufiTMs3+gqeD09EbnuogPgxrJECwg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pxCWVM3sn19NsFEpgHbgLa+PmYlhN3mMiP0Wk8kJhYw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q11KNvJszjYIB9n9HcC+N4uz11a3eRj1L3BH9scKMDQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "A1PmkgcEToWh1JiVWE6mI5jUu7poxWWuCUt/cgRUUDc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "qJo3Hu4PJeanL7XEaWXO/n3YsodhZyd+MJOOmB9Kpd8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "BkBKLO8URFscfRY9Bav/1+L9mLohDgNr/MkZtGiraIs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rZq5WA3Hx3xthOyHAJXK//f8pE2qbz7YKu3TIMp9GFY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "X07a/Lm80p5xd4RFs1dNmw+90tmPDPdGiAKVZkxd4zY=",
+ "subType": "00"
+ }
+ }
+ ]
+ },
+ {
+ "_id": 1,
+ "encryptedDouble": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "bE1vqWj3KNyM7cCYUv/cnYm8BPaUL3eMp5syTHq6NF4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "2FIZh/9N+NeJEQwxYIX5ikQT85xJzulBNReXk8PnG/s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "I93Md7QNPGmEEGYU1+VVCqBPBEvXdqHPtTJtMOn06Yk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "GecBFQ1PemlECWZWCl7f74vmsL6eB6mzQ9n6tK6FYfs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "QpjhZl+O1ORifgtCZuWAdcP6OKL7IZ2cA46v8FJcV28=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FWXI/yZ1M+2fIboeMCDMlp+I2NwPQDtoM/wWselOPYw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "uk26nvN/LdRLaBphiBgIZzT0sSpoO1z0RdDWRm/xrSA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hiiYSH1KZovAULc7rlmEU74wCjzDR+mm6ZnsgvFQjMw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hRzvMvWPX0sJme+wck67lwbKDFaWOa+Eyef+JSdc1s4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "PSx5D+zqC9c295dguX4+EobT4IEzfffdfjzC8DWpB5Q=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "QzfXQCVTjPQv2h21v95HYPq8uCsVJ2tPnjv79gAaM9M=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "XcGDO/dlTcEMLqwcm55UmOqK+KpBmbzZO1LIzX7GPaQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Lf+o4E7YB5ynzUPC6KTyW0lj6Cg9oLIu1Sdd1ODHctA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wAuVn02LAVo5Y+TUocvkoenFYWzpu38k0NmGZOsAjS4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yJGDtveLbbo/0HtCtiTSsvVI/0agg/U1bFaQ0yhK12o=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "KsEy0zgYcmkM+O/fWF9z3aJGIk22XCk+Aw96HB6JU68=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "p+AnMI5ZxdJMSIEJmXXya+FeH5yubmOdViwUO89j0Rc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "/jLix56jzeywBtNuGw55lCXyebQoSIhbful0hOKxKDY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "fvDvSPomtJsl1S3+8/tzFCE8scHIdJY5hB9CdTEsoFo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "oV5hOJzPXxfTuRdKIlF4uYEoMDuqH+G7/3qgndDr0PM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "3ALwcvLj3VOfgD6OqXAO13h1ZkOv46R6+Oy6SUKh53I=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "gxaB9FJj0IM+InhvAjwWaex3UIZ9SAnDiUd5WHSY/l0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "66NPvDygJzKJqddfNuDuNOpvGajjFRtvhkwfUkiYmXw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "1dWcQIocRAcO9XnXYqbhl83jc0RgjQpsrWd8dC27trg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "npos0Uf1DT3ztSCjPVY9EImlRnTHB1KLrvmVSqBQ/8E=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "TEI9qBx/tK1l1H0v1scMG8Srmtwo5VxWHADPBSlWrXk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "3wUN2ypQKoj+5ASkeIK9ycxhahVxyTmGopigoUAlyYs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "o/oksSnUS+nIq6ozWTbB5bJh+NoaPj8deAA23uxiWCk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "KExYPruhA31e8xuSwvfUfDcyY/H2Va6taUd0k4yFgLc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "/x+dNfxdd/lkx8Z8VZVfoYl7LPoaZ/iKEzZXBrAtIJc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "DE4cmjFLPqZlmRomO0qQiruUBtzoCe8ZdNRcfNH92pU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "M6EKNcLPw/iojAChgYUSieaBYWcbsjKtB94SaHOr8vk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+qP49lDPeyhaduTvXJgtJEqHNEYANVu9Bg3Bxz7Td9w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ruMrC2VIS+VKbJwCFb3bfkaLTju9nE+yPONV9s0M0Vo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "EbjDlSB5JKnDKff4d8hOmaOwJ7B9Q6NQFisLj+DPC+0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "C/yYOTB94edyqAbiQNu8/H7FoG3yRRjHDkMykz4+Mv0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CBxqrejG+qQQq2YTd6iP/06kiu2CxxzBFaZK3Ofb1CM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "2ZOQ/fpho+AbDENWBZaln7wRoepIRdhyT648dr8O5cU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "EghIgEPz01+myPgj8oid+PgncvobvC7vjvG3THEEQ0M=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "92CysZYNF8riwAMhdrIPKxfODw9p07cKQy/Snn8XmVY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "VO0LeTBQmsEf7sCHzTnZwUPNTqRZ49R8V5E9XnZ/5N4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "exs8BQMJq7U6ZXYgIizT7XN+X/hOmmn4YEuzev9zgSI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "qHpS4k1I+gPniNp4CA8TY8lLN36vBYmgbKMFpbYMEqg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+7lWKCKAWFw6gPZdHE6E8KIfI14/fSvtWUmllb5WLi0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YiH/US0q6679hWblFDDKNqUjCgggoU8sUCssTIF1QbU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YgwkKElEubNfvXL9hJxzqQUQtHiXN/OCGxNL1MUZZlM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hZFST4INZTTuhvJlGJeMwlUAK270UCOTCDeBAnN4a7g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "24I1Zw35AuGnK3CqJhbCwYb0IPuu5sCRrM5iyeITOLc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "vgD12JB4Q1S/kGPSQ1KOgp386KnG1GbM/5+60oRGcGw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+wNE+OL+CB9d4AUJdVxd56jUJCAXmmk9fapuB2TAc4g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "uhQh1B2Pe4RkNw/kPEcgaLenuikKoRf1iyfZhpXdodc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "eu8gjAUIp8ybO204AgeOq5v1neI1yljqy5v3I6lo1lM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "7QG6oVbASBAjrnCPxzzUNnuFSFNlKhbuBafkF8pr7Is=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "PUS1xb2oHSDTdYltutoSSxBiJ1NjxH3l2kA4P1CZLEs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "XPMh/JDC/O93gJJCwwgJDb8ssWZvRvezNmKmyn3nIfk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "jWz+KGwMk/GOvFAK2rOxF3OjxeZAWfmUQ1HGJ7icw4A=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "o7XbW68pc6flYigf3LW4WAGUWxpeqxaQLkHUhUR9RZ8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "nqR+g60+5U0okbqJadSqGgnC+j1JcP8rwMcfzOs2ACI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Hz43qVK95tSfbYFtaE/8fE97XMk1RiO8XpWjwZHB80o=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "noZUWlZ8M6KXU5rkifyo8/duw5IL7/fXbJvT7bNmW9k=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "WONVHCuPSanXDRQQ/3tmyJ0Vq+Lu/4hRaMUf0g0kSuw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "UEaj6vQRoIghE8Movd8AGXhtwIOXlP4cBsECIUvE5Y8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "D3n2YcO8+PB4C8brDo7kxKjF9Y844rVkdRMLTgsQkrw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "C+YA0G9KjxZVaWwOMuh/dcnHnHAlYnbFrRl0IEpmsY0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rUnmbmQanxrbFPYYrwyQ53x66OSt27yAvF+s48ezKDc=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ ]
+}
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-Double-Aggregate.yml b/specifications/client-side-encryption/tests/legacy/fle2-Range-Double-Aggregate.yml
new file mode 100644
index 00000000000..67598094c1e
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-Double-Aggregate.yml
@@ -0,0 +1,899 @@
+# Requires libmongocrypt 1.7.0.
+runOn:
+ - minServerVersion: "6.2.0"
+ # FLE 2 Encrypted collections are not supported on standalone.
+ topology: [ "replicaset", "sharded", "load-balanced" ]
+database_name: &database_name "default"
+collection_name: &collection_name "default"
+data: []
+encrypted_fields: &encrypted_fields {'escCollection': 'enxcol_.default.esc', 'eccCollection': 'enxcol_.default.ecc', 'ecocCollection': 'enxcol_.default.ecoc', 'fields': [{'keyId': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'path': 'encryptedDouble', 'bsonType': 'double', 'queries': {'queryType': 'rangePreview', 'contention': {'$numberLong': '0'}, 'sparsity': {'$numberLong': '1'}}}]}
+key_vault_data: [ {'_id': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'keyMaterial': {'$binary': {'base64': 'sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==', 'subType': '00'}}, 'creationDate': {'$date': {'$numberLong': '1648914851981'}}, 'updateDate': {'$date': {'$numberLong': '1648914851981'}}, 'status': {'$numberInt': '0'}, 'masterKey': {'provider': 'local'}} ]
+tests:
+ - description: "FLE2 Range Double. Aggregate."
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments:
+ document: &doc0 { _id: 0, encryptedDouble: { $numberDouble: "0" } }
+ - name: insertOne
+ arguments:
+ document: &doc1 { _id: 1, encryptedDouble: { $numberDouble: "1" } }
+ - name: aggregate
+ arguments:
+ pipeline: [{ $match: { "encryptedDouble": { $gt: {$numberDouble: "0" }} } }]
+ result: [*doc1]
+ expectations:
+ - command_started_event:
+ command:
+ listCollections: 1
+ filter:
+ name: *collection_name
+ command_name: listCollections
+ - command_started_event:
+ command:
+ find: datakeys
+ filter: {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ }
+ $db: keyvault
+ readConcern: { level: "majority" }
+ command_name: find
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc0_encrypted { "_id": 0, "encryptedDouble": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc1_encrypted { "_id": 1, "encryptedDouble": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ aggregate: *collection_name
+ pipeline: [
+ {
+ "$match": {
+ "encryptedDouble": {
+ "$gt": {
+ "$binary": {
+ "base64": "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",
+ "subType": "06"
+ }
+ }
+ }
+ }
+ }
+ ]
+ cursor: {}
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: aggregate
+ outcome:
+ collection:
+ # Outcome is checked using a separate MongoClient without auto encryption.
+ data:
+ -
+ {
+ "_id": 0,
+ "encryptedDouble": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6YrBn2ofIw1b5ooakrLOwF41BWrps8OO0H9WH4/rtlE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "n+XAuFnP8Dov9TnhGFxNx0K/MnVM9WbJ7RouEu0ndO0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yRXojuVdn5GQtD97qYlaCL6cOLmZ7Cvcb3wFjkLUIdM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "DuIkdRPITRs55I4SZmgomAHCIsDQmXRhW8+MOznkzSk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SsBk+Et1lTbU+QRPx+xyJ/jMkmfG+QCvQEpip2YYrzA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "crCIzOd8KhHvvUlX7M1v9bhvU4pLdTc+X2SuqoKU5Ek=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YOWdCw4UrqnxkAaVjqmC4sKQDMVMHEpFGnlxpxdaU6E=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "M3SShp81Ff8tQ632qKbv9MUcN6wjDaBReI0VXNu6Xh4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "gzHlSPxpM0hT75kQvWFzGlOxKvDoiKQZOr19V6l2zXI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "s3JnppOGYw9SL2Q1kMAZs948v2F5PrpXjGei/HioDWs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cG6+3Gk/zEH68P/uuuwiAUVCuyJwa1LeV+t29FlPPAo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dupdvR3AyJtM+g9NDKiaLVOtGca387JQp8w+V03m7Ig=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JqEQc5svj2jTvZ6LLA5ivE+kTb/0aRemSEmxk4G7Zrg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "szcXXXKnob+p3SoM4yED2R920LeJ7cVsclPMFTe4CeI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "o1QoGVXmuBdHwHm7aCtGMlMVKrjFdYvJXpoq6uhIAZ0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Jfm5wPlqqLCJRGQIqRq2NGmpn7s0Vrih2H3YAOoI2YU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zMHLb8ARbsYo8Ld05bqnGFf1Usha6EGb8QKwdSAyps0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yQdtq9lh5pugL7/i0Bj/PuZUUBUIzf+7wj1rl5y736w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wGWVZdO7qIuyDg/BqDgqjgoQ02h5YYgwXQB1oCin2NE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "by9HMLj6NTEpgztZ5HSN6GxImkXPcaFINYDzgZY33X8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tWo0vbasi7bXmn/MsOx13VC1IsWtpx/nYp0uj4iMzdA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tQQpndUYd5O87lOtrGjH3wl9VsOK0ray7RMasL90sBM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cQjXEDCMsOpKLLf+vlTgIHA+cbSJdzqhbSX9Wvh95aA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "7yMpU48IxK9SzP2cx3VnTownGEwFmeFofuuFT97SuuY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kSOx1kz0CmBgzKQHZlo65ZUY1DIv9A99JRm+Us2y6Ew=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ubQpdPBe6/xvtr+AcXdfYLSvYCR4ot0tivehkCsupb4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xal+iCJ6FTefRQToyoNksc9NCZShyn04NDGi4IYrcoM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "d7jU4iOK50xHxlkSifcxlZFCM46TSgQzoYivxG3HNLY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tJvl2nsBLBVzL3pp6sKWCL4UXeh3q/roYBJjSb74ve0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "OIUCaKRvIx9t1w6Hxlz1IcQTdPNCfdRNwnnTm10W+X0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "A9tvzsiElotOUVIB4CqfQp9mAwqvTM35YkmAR170aHA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lI8gpK7hpb7c9x4RQugsxMnQay5LZJmwslZdvMx/dcE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dNCzh40U0XvdKnSDi3HRQOWQftEsDVqc4uUvsVFGoq8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "IP+iwEBWBwVVZIdpaMu8k5+soFCz+TZkYn3drKZ9grE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pnqyh6e0y5svHkJDShlN9CHV0WvMBE4QbtJpQw5ZCXc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "elEl42tbVDoRTLjAhZUFEtXiut4b3PVhg/1ZLZSQdtE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "vHuu2FxwclMHqyE6JBYbTYgbEkB0dqb/JuaxsvfwsmY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xTf7NCe3Gf8QpE78HR5OknlLTKfs9J+RN9UZpH6fnso=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "XiWSasRnJAulGR6+LCVD3mwRObXylqYWR9jvpywq12c=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "MZMxEQ5ikx0PG1YFIExv0UnTZogsvgeOEZTpzvBDn4w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yZMyMZBDrWbAhvnic7vvIYhmO9m5H2iuv0c8KNZrBzY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xxM14hTPY5j0vvcK2C7YAEjzdsfUTFHozHC0hEo1bxI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+01rqR1xVwkpGXcstbk1ItJqFVjH6Q8MGxEN3Cm9Y1A=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xOpLV0Z2VTRJ3iWtnWZcsyjXubTIkYWo31cO+HV1o1k=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "BWUOLqgLBqc5NwxVlSV5H3KFQPXbCp7mdo+jF+8cJqY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "fuQb1S6xZDGlrEbK+kI23aL53PP1PVNwqICnZNt9Yzg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SfscnoibFttahLdPVC4Ee+47ewGFKpDSU7M6HX19bKE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rpSW2awybNVeKtat91VFxqbINoTfNhPfQAu+d73Xtf8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "9M/CP9ccOIIj2LLFmE0GFDO0Ban2wsNalEXfM6+h+1s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "WrEMG49l1ye4MhXs5ZS9tz8P6h+hDvthIg/2wW9ne1Q=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ImNhbfeyfH8qIEeA5ic0s3dAQBdzzTBS+CPsNih9vZ0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dWP33YDSn04UKJN2ogh2Rui0iW/0q2y18OCDRVcfyoo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lYv0isAtfGh6H9tdp3cp2eHU7q2J+uk7QrgcxtK3w7Y=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "VGMoamB/+7zTOYcY/pqJc96xlv2PdW4hwsIAEIslTDQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yNeBWMF7BnD9wVwz2PgJsvWr77QiVvvWUvJF0+fqBug=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SfpvObJ+tJBXSvqeN7vlOfmhYign635lciYAJIjUtY8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dsen4NqjzVGjpjufiTMs3+gqeD09EbnuogPgxrJECwg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pxCWVM3sn19NsFEpgHbgLa+PmYlhN3mMiP0Wk8kJhYw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q11KNvJszjYIB9n9HcC+N4uz11a3eRj1L3BH9scKMDQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "A1PmkgcEToWh1JiVWE6mI5jUu7poxWWuCUt/cgRUUDc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "qJo3Hu4PJeanL7XEaWXO/n3YsodhZyd+MJOOmB9Kpd8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "BkBKLO8URFscfRY9Bav/1+L9mLohDgNr/MkZtGiraIs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rZq5WA3Hx3xthOyHAJXK//f8pE2qbz7YKu3TIMp9GFY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "X07a/Lm80p5xd4RFs1dNmw+90tmPDPdGiAKVZkxd4zY=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ -
+ {
+ "_id": 1,
+ "encryptedDouble": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "bE1vqWj3KNyM7cCYUv/cnYm8BPaUL3eMp5syTHq6NF4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "2FIZh/9N+NeJEQwxYIX5ikQT85xJzulBNReXk8PnG/s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "I93Md7QNPGmEEGYU1+VVCqBPBEvXdqHPtTJtMOn06Yk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "GecBFQ1PemlECWZWCl7f74vmsL6eB6mzQ9n6tK6FYfs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "QpjhZl+O1ORifgtCZuWAdcP6OKL7IZ2cA46v8FJcV28=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FWXI/yZ1M+2fIboeMCDMlp+I2NwPQDtoM/wWselOPYw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "uk26nvN/LdRLaBphiBgIZzT0sSpoO1z0RdDWRm/xrSA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hiiYSH1KZovAULc7rlmEU74wCjzDR+mm6ZnsgvFQjMw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hRzvMvWPX0sJme+wck67lwbKDFaWOa+Eyef+JSdc1s4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "PSx5D+zqC9c295dguX4+EobT4IEzfffdfjzC8DWpB5Q=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "QzfXQCVTjPQv2h21v95HYPq8uCsVJ2tPnjv79gAaM9M=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "XcGDO/dlTcEMLqwcm55UmOqK+KpBmbzZO1LIzX7GPaQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Lf+o4E7YB5ynzUPC6KTyW0lj6Cg9oLIu1Sdd1ODHctA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wAuVn02LAVo5Y+TUocvkoenFYWzpu38k0NmGZOsAjS4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yJGDtveLbbo/0HtCtiTSsvVI/0agg/U1bFaQ0yhK12o=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "KsEy0zgYcmkM+O/fWF9z3aJGIk22XCk+Aw96HB6JU68=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "p+AnMI5ZxdJMSIEJmXXya+FeH5yubmOdViwUO89j0Rc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "/jLix56jzeywBtNuGw55lCXyebQoSIhbful0hOKxKDY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "fvDvSPomtJsl1S3+8/tzFCE8scHIdJY5hB9CdTEsoFo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "oV5hOJzPXxfTuRdKIlF4uYEoMDuqH+G7/3qgndDr0PM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "3ALwcvLj3VOfgD6OqXAO13h1ZkOv46R6+Oy6SUKh53I=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "gxaB9FJj0IM+InhvAjwWaex3UIZ9SAnDiUd5WHSY/l0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "66NPvDygJzKJqddfNuDuNOpvGajjFRtvhkwfUkiYmXw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "1dWcQIocRAcO9XnXYqbhl83jc0RgjQpsrWd8dC27trg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "npos0Uf1DT3ztSCjPVY9EImlRnTHB1KLrvmVSqBQ/8E=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "TEI9qBx/tK1l1H0v1scMG8Srmtwo5VxWHADPBSlWrXk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "3wUN2ypQKoj+5ASkeIK9ycxhahVxyTmGopigoUAlyYs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "o/oksSnUS+nIq6ozWTbB5bJh+NoaPj8deAA23uxiWCk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "KExYPruhA31e8xuSwvfUfDcyY/H2Va6taUd0k4yFgLc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "/x+dNfxdd/lkx8Z8VZVfoYl7LPoaZ/iKEzZXBrAtIJc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "DE4cmjFLPqZlmRomO0qQiruUBtzoCe8ZdNRcfNH92pU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "M6EKNcLPw/iojAChgYUSieaBYWcbsjKtB94SaHOr8vk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+qP49lDPeyhaduTvXJgtJEqHNEYANVu9Bg3Bxz7Td9w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ruMrC2VIS+VKbJwCFb3bfkaLTju9nE+yPONV9s0M0Vo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "EbjDlSB5JKnDKff4d8hOmaOwJ7B9Q6NQFisLj+DPC+0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "C/yYOTB94edyqAbiQNu8/H7FoG3yRRjHDkMykz4+Mv0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CBxqrejG+qQQq2YTd6iP/06kiu2CxxzBFaZK3Ofb1CM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "2ZOQ/fpho+AbDENWBZaln7wRoepIRdhyT648dr8O5cU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "EghIgEPz01+myPgj8oid+PgncvobvC7vjvG3THEEQ0M=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "92CysZYNF8riwAMhdrIPKxfODw9p07cKQy/Snn8XmVY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "VO0LeTBQmsEf7sCHzTnZwUPNTqRZ49R8V5E9XnZ/5N4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "exs8BQMJq7U6ZXYgIizT7XN+X/hOmmn4YEuzev9zgSI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "qHpS4k1I+gPniNp4CA8TY8lLN36vBYmgbKMFpbYMEqg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+7lWKCKAWFw6gPZdHE6E8KIfI14/fSvtWUmllb5WLi0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YiH/US0q6679hWblFDDKNqUjCgggoU8sUCssTIF1QbU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YgwkKElEubNfvXL9hJxzqQUQtHiXN/OCGxNL1MUZZlM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hZFST4INZTTuhvJlGJeMwlUAK270UCOTCDeBAnN4a7g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "24I1Zw35AuGnK3CqJhbCwYb0IPuu5sCRrM5iyeITOLc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "vgD12JB4Q1S/kGPSQ1KOgp386KnG1GbM/5+60oRGcGw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+wNE+OL+CB9d4AUJdVxd56jUJCAXmmk9fapuB2TAc4g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "uhQh1B2Pe4RkNw/kPEcgaLenuikKoRf1iyfZhpXdodc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "eu8gjAUIp8ybO204AgeOq5v1neI1yljqy5v3I6lo1lM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "7QG6oVbASBAjrnCPxzzUNnuFSFNlKhbuBafkF8pr7Is=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "PUS1xb2oHSDTdYltutoSSxBiJ1NjxH3l2kA4P1CZLEs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "XPMh/JDC/O93gJJCwwgJDb8ssWZvRvezNmKmyn3nIfk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "jWz+KGwMk/GOvFAK2rOxF3OjxeZAWfmUQ1HGJ7icw4A=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "o7XbW68pc6flYigf3LW4WAGUWxpeqxaQLkHUhUR9RZ8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "nqR+g60+5U0okbqJadSqGgnC+j1JcP8rwMcfzOs2ACI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Hz43qVK95tSfbYFtaE/8fE97XMk1RiO8XpWjwZHB80o=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "noZUWlZ8M6KXU5rkifyo8/duw5IL7/fXbJvT7bNmW9k=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "WONVHCuPSanXDRQQ/3tmyJ0Vq+Lu/4hRaMUf0g0kSuw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "UEaj6vQRoIghE8Movd8AGXhtwIOXlP4cBsECIUvE5Y8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "D3n2YcO8+PB4C8brDo7kxKjF9Y844rVkdRMLTgsQkrw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "C+YA0G9KjxZVaWwOMuh/dcnHnHAlYnbFrRl0IEpmsY0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rUnmbmQanxrbFPYYrwyQ53x66OSt27yAvF+s48ezKDc=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
\ No newline at end of file
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-Double-Correctness.json b/specifications/client-side-encryption/tests/legacy/fle2-Range-Double-Correctness.json
new file mode 100644
index 00000000000..b09e966324e
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-Double-Correctness.json
@@ -0,0 +1,1160 @@
+{
+ "runOn": [
+ {
+ "minServerVersion": "6.2.0",
+ "topology": [
+ "replicaset",
+ "sharded",
+ "load-balanced"
+ ]
+ }
+ ],
+ "database_name": "default",
+ "collection_name": "default",
+ "data": [],
+ "encrypted_fields": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDouble",
+ "bsonType": "double",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ ]
+ },
+ "key_vault_data": [
+ {
+ "_id": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "keyMaterial": {
+ "$binary": {
+ "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==",
+ "subType": "00"
+ }
+ },
+ "creationDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "updateDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "status": {
+ "$numberInt": "0"
+ },
+ "masterKey": {
+ "provider": "local"
+ }
+ }
+ ],
+ "tests": [
+ {
+ "description": "Find with $gt",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDouble": {
+ "$numberDouble": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDouble": {
+ "$numberDouble": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDouble": {
+ "$gt": {
+ "$numberDouble": "0.0"
+ }
+ }
+ }
+ },
+ "result": [
+ {
+ "_id": 1,
+ "encryptedDouble": {
+ "$numberDouble": "1.0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Find with $gte",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDouble": {
+ "$numberDouble": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDouble": {
+ "$numberDouble": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDouble": {
+ "$gte": {
+ "$numberDouble": "0.0"
+ }
+ }
+ },
+ "sort": {
+ "_id": 1
+ }
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedDouble": {
+ "$numberDouble": "0.0"
+ }
+ },
+ {
+ "_id": 1,
+ "encryptedDouble": {
+ "$numberDouble": "1.0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Find with $gt with no results",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDouble": {
+ "$numberDouble": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDouble": {
+ "$numberDouble": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDouble": {
+ "$gt": {
+ "$numberDouble": "1.0"
+ }
+ }
+ }
+ },
+ "result": []
+ }
+ ]
+ },
+ {
+ "description": "Find with $lt",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDouble": {
+ "$numberDouble": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDouble": {
+ "$numberDouble": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDouble": {
+ "$lt": {
+ "$numberDouble": "1.0"
+ }
+ }
+ }
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedDouble": {
+ "$numberDouble": "0.0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Find with $lte",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDouble": {
+ "$numberDouble": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDouble": {
+ "$numberDouble": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDouble": {
+ "$lte": {
+ "$numberDouble": "1.0"
+ }
+ }
+ },
+ "sort": {
+ "_id": 1
+ }
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedDouble": {
+ "$numberDouble": "0.0"
+ }
+ },
+ {
+ "_id": 1,
+ "encryptedDouble": {
+ "$numberDouble": "1.0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Find with $gt and $lt",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDouble": {
+ "$numberDouble": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDouble": {
+ "$numberDouble": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDouble": {
+ "$gt": {
+ "$numberDouble": "0.0"
+ },
+ "$lt": {
+ "$numberDouble": "2.0"
+ }
+ }
+ }
+ },
+ "result": [
+ {
+ "_id": 1,
+ "encryptedDouble": {
+ "$numberDouble": "1.0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Find with equality",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDouble": {
+ "$numberDouble": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDouble": {
+ "$numberDouble": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDouble": {
+ "$numberDouble": "0.0"
+ }
+ }
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedDouble": {
+ "$numberDouble": "0.0"
+ }
+ }
+ ]
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDouble": {
+ "$numberDouble": "1.0"
+ }
+ }
+ },
+ "result": [
+ {
+ "_id": 1,
+ "encryptedDouble": {
+ "$numberDouble": "1.0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Find with $in",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDouble": {
+ "$numberDouble": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDouble": {
+ "$numberDouble": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDouble": {
+ "$in": [
+ {
+ "$numberDouble": "0.0"
+ }
+ ]
+ }
+ }
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedDouble": {
+ "$numberDouble": "0.0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with $gte",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDouble": {
+ "$numberDouble": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDouble": {
+ "$numberDouble": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedDouble": {
+ "$gte": {
+ "$numberDouble": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "$sort": {
+ "_id": 1
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedDouble": {
+ "$numberDouble": "0.0"
+ }
+ },
+ {
+ "_id": 1,
+ "encryptedDouble": {
+ "$numberDouble": "1.0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with $gt with no results",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDouble": {
+ "$numberDouble": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDouble": {
+ "$numberDouble": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedDouble": {
+ "$gt": {
+ "$numberDouble": "1.0"
+ }
+ }
+ }
+ }
+ ]
+ },
+ "result": []
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with $lt",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDouble": {
+ "$numberDouble": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDouble": {
+ "$numberDouble": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedDouble": {
+ "$lt": {
+ "$numberDouble": "1.0"
+ }
+ }
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedDouble": {
+ "$numberDouble": "0.0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with $lte",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDouble": {
+ "$numberDouble": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDouble": {
+ "$numberDouble": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedDouble": {
+ "$lte": {
+ "$numberDouble": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "$sort": {
+ "_id": 1
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedDouble": {
+ "$numberDouble": "0.0"
+ }
+ },
+ {
+ "_id": 1,
+ "encryptedDouble": {
+ "$numberDouble": "1.0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with $gt and $lt",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDouble": {
+ "$numberDouble": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDouble": {
+ "$numberDouble": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedDouble": {
+ "$gt": {
+ "$numberDouble": "0.0"
+ },
+ "$lt": {
+ "$numberDouble": "2.0"
+ }
+ }
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 1,
+ "encryptedDouble": {
+ "$numberDouble": "1.0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with equality",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDouble": {
+ "$numberDouble": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDouble": {
+ "$numberDouble": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedDouble": {
+ "$numberDouble": "0.0"
+ }
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedDouble": {
+ "$numberDouble": "0.0"
+ }
+ }
+ ]
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedDouble": {
+ "$numberDouble": "1.0"
+ }
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 1,
+ "encryptedDouble": {
+ "$numberDouble": "1.0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with $in",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDouble": {
+ "$numberDouble": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDouble": {
+ "$numberDouble": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedDouble": {
+ "$in": [
+ {
+ "$numberDouble": "0.0"
+ }
+ ]
+ }
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedDouble": {
+ "$numberDouble": "0.0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Wrong type: Insert Int",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDouble": {
+ "$numberInt": "0"
+ }
+ }
+ },
+ "result": {
+ "errorContains": "cannot encrypt element"
+ }
+ }
+ ]
+ },
+ {
+ "description": "Wrong type: Find Int",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDouble": {
+ "$gte": {
+ "$numberInt": "0"
+ }
+ }
+ },
+ "sort": {
+ "_id": 1
+ }
+ },
+ "result": {
+ "errorContains": "field type is not supported"
+ }
+ }
+ ]
+ }
+ ]
+}
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-Double-Correctness.yml b/specifications/client-side-encryption/tests/legacy/fle2-Range-Double-Correctness.yml
new file mode 100644
index 00000000000..bca46f2c66d
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-Double-Correctness.yml
@@ -0,0 +1,290 @@
+# Test correctness results.
+# Does not include command monitoring expectations or outcome assertions to make tests more readable.
+# Requires libmongocrypt 1.7.0.
+runOn:
+ - minServerVersion: "6.2.0"
+ # FLE 2 Encrypted collections are not supported on standalone.
+ topology: [ "replicaset", "sharded", "load-balanced" ]
+database_name: &database_name "default"
+collection_name: &collection_name "default"
+data: []
+encrypted_fields: &encrypted_fields {'escCollection': 'enxcol_.default.esc', 'eccCollection': 'enxcol_.default.ecc', 'ecocCollection': 'enxcol_.default.ecoc', 'fields': [{'keyId': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'path': 'encryptedDouble', 'bsonType': 'double', 'queries': {'queryType': 'rangePreview', 'contention': {'$numberLong': '0'}, 'sparsity': {'$numberLong': '1'}}}]}
+key_vault_data: [ {'_id': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'keyMaterial': {'$binary': {'base64': 'sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==', 'subType': '00'}}, 'creationDate': {'$date': {'$numberLong': '1648914851981'}}, 'updateDate': {'$date': {'$numberLong': '1648914851981'}}, 'status': {'$numberInt': '0'}, 'masterKey': {'provider': 'local'}} ]
+tests:
+ - description: "Find with $gt"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments:
+ document: &doc0 { _id: 0, encryptedDouble: { $numberDouble: "0.0" } }
+ - name: insertOne
+ arguments:
+ document: &doc1 { _id: 1, encryptedDouble: { $numberDouble: "1.0" } }
+ - name: find
+ arguments:
+ filter: { encryptedDouble: { $gt: { $numberDouble: "0.0" } }}
+ result: [*doc1]
+
+ - description: "Find with $gte"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedDouble: { $gte: { $numberDouble: "0.0" } }}
+ # sort so results from range queries are ordered.
+ sort: { _id: 1 }
+ result: [*doc0, *doc1]
+
+ - description: "Find with $gt with no results"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedDouble: { $gt: { $numberDouble: "1.0" } }}
+ result: []
+
+ - description: "Find with $lt"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedDouble: { $lt: { $numberDouble: "1.0" } }}
+ result: [*doc0]
+
+ - description: "Find with $lte"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedDouble: { $lte: { $numberDouble: "1.0" } }}
+ # sort so results from range queries are ordered.
+ sort: { _id: 1 }
+ result: [*doc0, *doc1]
+
+ - description: "Find with $gt and $lt"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedDouble: { $gt: { $numberDouble: "0.0" }, $lt: { $numberDouble: "2.0"} }}
+ result: [*doc1]
+
+ - description: "Find with equality"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedDouble: { $numberDouble: "0.0" } }
+ result: [*doc0]
+ - name: find
+ arguments:
+ filter: { encryptedDouble: { $numberDouble: "1.0" } }
+ result: [*doc1]
+
+ - description: "Find with $in"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedDouble: { $in: [ {$numberDouble: "0.0"} ] } }
+ result: [*doc0]
+
+ - description: "Aggregate with $gte"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedDouble: { $gte: { $numberDouble: "0.0" } }} }
+ # sort so results from range queries are ordered.
+ - { $sort: { _id: 1 }}
+ result: [*doc0, *doc1]
+
+ - description: "Aggregate with $gt with no results"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedDouble: { $gt: { $numberDouble: "1.0" } }} }
+ result: []
+
+ - description: "Aggregate with $lt"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedDouble: { $lt: { $numberDouble: "1.0" } }} }
+ result: [*doc0]
+
+ - description: "Aggregate with $lte"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedDouble: { $lte: { $numberDouble: "1.0" } }} }
+ # sort so results from range queries are ordered.
+ - { $sort: { _id: 1 }}
+ result: [*doc0, *doc1]
+
+ - description: "Aggregate with $gt and $lt"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedDouble: { $gt: { $numberDouble: "0.0" }, $lt: { $numberDouble: "2.0"} }} }
+ result: [*doc1]
+
+ - description: "Aggregate with equality"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedDouble: { $numberDouble: "0.0" } } }
+ result: [*doc0]
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedDouble: { $numberDouble: "1.0" } } }
+ result: [*doc1]
+
+ - description: "Aggregate with $in"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedDouble: { $in: [ {$numberDouble: "0.0"} ] } } }
+ result: [*doc0]
+
+ - description: "Wrong type: Insert Int"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: { _id: 0, encryptedDouble: { $numberInt: "0" }} }
+ result:
+ # Expect an error from mongocryptd.
+ errorContains: "cannot encrypt element"
+
+ - description: "Wrong type: Find Int"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: find
+ arguments:
+ filter: { encryptedDouble: { $gte: { $numberInt: "0" } }}
+ # sort so results from range queries are ordered.
+ sort: { _id: 1 }
+ result:
+ # expect an error from libmongocrypt.
+ errorContains: "field type is not supported"
\ No newline at end of file
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-Double-Delete.json b/specifications/client-side-encryption/tests/legacy/fle2-Range-Double-Delete.json
new file mode 100644
index 00000000000..fa09cb87df6
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-Double-Delete.json
@@ -0,0 +1,749 @@
+{
+ "runOn": [
+ {
+ "minServerVersion": "6.2.0",
+ "topology": [
+ "replicaset",
+ "sharded",
+ "load-balanced"
+ ]
+ }
+ ],
+ "database_name": "default",
+ "collection_name": "default",
+ "data": [],
+ "encrypted_fields": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDouble",
+ "bsonType": "double",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ ]
+ },
+ "key_vault_data": [
+ {
+ "_id": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "keyMaterial": {
+ "$binary": {
+ "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==",
+ "subType": "00"
+ }
+ },
+ "creationDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "updateDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "status": {
+ "$numberInt": "0"
+ },
+ "masterKey": {
+ "provider": "local"
+ }
+ }
+ ],
+ "tests": [
+ {
+ "description": "FLE2 Range Double. Delete.",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDouble": {
+ "$numberDouble": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDouble": {
+ "$numberDouble": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "deleteOne",
+ "arguments": {
+ "filter": {
+ "encryptedDouble": {
+ "$gt": {
+ "$numberDouble": "0"
+ }
+ }
+ }
+ },
+ "result": {
+ "deletedCount": 1
+ }
+ }
+ ],
+ "expectations": [
+ {
+ "command_started_event": {
+ "command": {
+ "listCollections": 1,
+ "filter": {
+ "name": "default"
+ }
+ },
+ "command_name": "listCollections"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "find": "datakeys",
+ "filter": {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ },
+ "$db": "keyvault",
+ "readConcern": {
+ "level": "majority"
+ }
+ },
+ "command_name": "find"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 0,
+ "encryptedDouble": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDouble",
+ "bsonType": "double",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 1,
+ "encryptedDouble": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDouble",
+ "bsonType": "double",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "delete": "default",
+ "deletes": [
+ {
+ "q": {
+ "encryptedDouble": {
+ "$gt": {
+ "$binary": {
+ "base64": "Cq8kAAADcGF5bG9hZAB/JAAABGcAQyQAAAMwAH0AAAAFZAAgAAAAAHgYoMGjEE6fAlAhICv0+doHcVX8CmMVxyq7+jlyGrvmBXMAIAAAAAC/5MQZgTHuIr/O5Z3mXPvqrom5JTQ8IeSpQGhO9sB+8gVjACAAAAAAPMgD8Rqnd94atKnMyPjlTwthUQ710MKJVqgtwNXLFWwAAzEAfQAAAAVkACAAAAAA2kiWNvEc4zunJ1jzvuClFC9hjZMYruKCqAaxq+oY8EAFcwAgAAAAACofIS72Cm6s866UCk+evTH3CvKBj/uZd72sAL608rzTBWMAIAAAAAB7NkTFgsBuPIyxW5KtYZD4uxdgRynoAUwA2RDj3qZNdwADMgB9AAAABWQAIAAAAABkfoBGmU3hjYBvQbjNW19kfXneBQsQQPRfUL3UAwI2cAVzACAAAAAAUpK2BUOqX/DGdX5YJniEZMWkofxHqeAbXceEGJxhp8AFYwAgAAAAAENNdd+fMV7VQzshj6RdvsxqDHYkPDxggdUHw3JbmFBeAAMzAH0AAAAFZAAgAAAAAFNprhQ3ZwIcYbuzLolAT5n/vc14P9kUUQComDu6eFyKBXMAIAAAAAAcx9z9pk32YbPV/sfPZl9ALIEVsqoLXgqWLVK/tP+heAVjACAAAAAA3eqduo9CWE5BePqBq7KCh5++QqXnyjCwybB15Zoeiu4AAzQAfQAAAAVkACAAAAAAODI+pB2pCuB+YmNEUAgtMfNdt3DmSkrJ96gRzLphgb8FcwAgAAAAAAT7dewFDxUDECQ3zVq75/cUN4IP+zsqhkP5+czUwlJIBWMAIAAAAABYcCJA2jocGQiF/vZ9VDEktoK015OqfY64yZhmNPs9GQADNQB9AAAABWQAIAAAAACNAk+yTZ4Ewk1EnotQK8O3h1gg9I7pr9q2+4po1iJVgAVzACAAAAAAUj/LesmtEsgqYVzMJ67umVA11hJTdDXwbxDoQ71vWyUFYwAgAAAAAG32XaKjEO9YTSLMnDR5eiaUpgBQz0n4M3VpBqhWTaEnAAM2AH0AAAAFZAAgAAAAAD/FIrGYFDjyYmVb7oTMVwweWP7A6F9LnyIuNO4MjBnXBXMAIAAAAACIZgJCQRZu7NhuNMyOqCn1tf+DfU1qm10TPCfj5JYV3wVjACAAAAAAZCaO06/DjOBjNrTxB8jdxM7X4XvNu9QTa2Y00kZJwgEAAzcAfQAAAAVkACAAAAAAciRW40ORJLVwchOEpz87Svb+5toAFM6LxDWv928ECwQFcwAgAAAAAN0dipyESIkszfjRzdDi8kAGaa2Hf4wrPAtiWwboZLuxBWMAIAAAAADhvKHhF7zfNRnG8QfiIlKycV6L6iGxbGNKkHligA9rAgADOAB9AAAABWQAIAAAAACZqAyCzYQupJ95mrBJX54yIz9VY7I0WrxpNYElCI4dTQVzACAAAAAA/eyJb6d1xfE+jJlVXMTD3HS/NEYENPVKAuj56Dr2dSEFYwAgAAAAAMfcJKj77c6y/RBQ5hb5LSNdvbYvCAHR59KLnbmxj1gAAAM5AH0AAAAFZAAgAAAAAI5bm3YO0Xgf0VT+qjVTTfvckecM3Cwqj7DTKZXf8/NXBXMAIAAAAAD/m+h8fBhWaHm6Ykuz0WX1xL4Eme3ErLObyEVJf8NCywVjACAAAAAAiGdTXD22l1zDxHeF4NXUTiBnNTsdpzJRwM6riTPuOogAAzEwAH0AAAAFZAAgAAAAANqo4+p6qdtCzcB4BX1wQ6llU7eFBnuu4MtZwp4B6mDlBXMAIAAAAAAGiz+VaukMZ+6IH4jtn4KWWdKK4/W+O+gRioQDrfzpMgVjACAAAAAAl/wlBjSJW/hKkll8HSBCGw4Ce1pJ5rZuhVE09hKq4jQAAzExAH0AAAAFZAAgAAAAAPrFXmHP2Y4YAm7b/aqsdn/DPoDkv7B8egWkfe23XsM1BXMAIAAAAAAGhwpKAr7skeqHm3oseSbO7qKNhmYsuUrECBxJ5k+D2AVjACAAAAAAKSsxERy2OBhb5MiH9/H2BET2oeU6yVihiAoWi/16FroAAzEyAH0AAAAFZAAgAAAAABzjYxwAjXxXc0Uxv18rH8I3my0Aguow0kTwKyxbrm+cBXMAIAAAAADVbqJVr6IdokuhXkEtXF0C2gINLiAjMVN20lE20Vmp2QVjACAAAAAACJ+VAwl9X88mjC76yzkWeL4K6AamNYjbNkpS9B6fQE4AAzEzAH0AAAAFZAAgAAAAAFMm2feF2fFCm/UC6AfIyepX/xJDSmnnolQIBnHcPmb5BXMAIAAAAABLI11kFrQoaNVZFmq/38aRNImPOjdJh0Lo6irI8M/AaAVjACAAAAAAZFgYh4nV8YN+/AAqe/QhKDkNBPg8KraCG7y3bOzhPV4AAzE0AH0AAAAFZAAgAAAAAJvXB3KyNiNtQko4SSzo/9b2qmM2zU9CQTTDfLSBWMgRBXMAIAAAAAAvjuVP7KsLRDeqVqRziTKpBrjVyqKiIbO9Gw8Wl2wFTAVjACAAAAAARuBn3JdQ8so7Gy0XVH0CtlvtRoJWhSrJP6eRIqbyWh8AAzE1AH0AAAAFZAAgAAAAAPGdcxDiid8z8XYnfdDivNMYVPgBKdGOUw6UStU+48CdBXMAIAAAAAARj6g1Ap0eEfuCZ4X2TsEw+Djrhto3fA5nLwPaY0vCTgVjACAAAAAATxLY6SkcLPaoOBJpQsggEqoxgJgiY9seP3fBQM05PckAAzE2AH0AAAAFZAAgAAAAAP5rGPrYGt3aKob5f/ldP0qrW7bmWvqnKY4QwdDWz400BXMAIAAAAADTQkW2ymaaf/bhteOOGmSrIR97bAnJx+yN3yMj1bTeewVjACAAAAAA6O+wIMt3xMITuCxVrqOCNBPX5F122G+/Is+EYkzUvVYAAzE3AH0AAAAFZAAgAAAAAAlz6wJze5UkIxKpJOZFGCOf3v2KByWyI6NB6JM9wNcBBXMAIAAAAABUC7P/neUIHHoZtq0jFVBHY75tSFYr1Y5S16YN5XxC1QVjACAAAAAANv97jMd9JmZ7lMeCzK7jaZHZYsZJNl6N9g9WXzd2om0AAzE4AH0AAAAFZAAgAAAAAFJ8AtHcjia/9Y5pLEc3qVgH5xKiXw12G9Kn2A1EY8McBXMAIAAAAAAxe7Bdw7eUSBk/oAawa7uicTEDgXLymRNhBy1LAxhDvwVjACAAAAAAtOUZ2NeUWwESpq95O92dhqYBt8RtFnjT43E7k9mQF3oAAzE5AH0AAAAFZAAgAAAAAO8uwQUaKFb6vqR3Sv3Wn4QAonC2exOC9lGG1juqP5DtBXMAIAAAAABZf1KyJgQg8/Rf5c02DgDK2aQu0rNCOvaL60ohDHyY+gVjACAAAAAA5nAWj1Ek8p0MLYZEB3yoVFDfBYZ+/ZpIo71u+W9hprcAAzIwAH0AAAAFZAAgAAAAAE8YtqyRsGCeiR6hhiyisR/hccmK4nZqIMzO4lUBmEFzBXMAIAAAAAC1UYOSKqAeG1UJiKjWFVskRhuFKpj9Ezy+lICZvFlN5AVjACAAAAAA37oP30mTzVftI2FL9Uwyls/jqLqbmRDQk7p7nlx44uYAAzIxAH0AAAAFZAAgAAAAAPhCrMausDx1QUIEqp9rUdRKyM6a9AAx7jQ3ILIu8wNIBXMAIAAAAACmH8lotGCiF2q9VQxhsS+7LAZv79VUAsOUALaGxE/EpAVjACAAAAAAhVIkl8p19VZ0gpg32s++Jda3qsVSVB5tV4CKrtjhE3IAAzIyAH0AAAAFZAAgAAAAAOBi/GAYFcstMSJPgp3VkMiuuUUCrZytvqYaU8dwm8v2BXMAIAAAAACEZSZVyD3pKzGlbdwlYmWQhHHTV5SnNLknl2Gw8IaUTQVjACAAAAAAriBex2kK//RPhyVpCYJDBng4l5w8jD3m8BF7dVAP0p8AAzIzAH0AAAAFZAAgAAAAAIQuup+YGfH3mflzWopN8J1X8o8a0d9CSGIvrA5HOzraBXMAIAAAAADYvNLURXsC2ITMqK14LABQBI+hZZ5wNf24JMcKLW+84AVjACAAAAAAGeUzdG2kQrx5XypXJezZmPVzMYuqYZw7Bhbl4EPT0SMAAzI0AH0AAAAFZAAgAAAAAKsh0ADyOnVocFrOrf6MpTrNvAj8iaiE923DPryu124gBXMAIAAAAADg24a8NVE1GyScc6tmnTbmu5ulzO+896fE92lN08MeswVjACAAAAAAbO+DEBY3STVMQN7CbxmHDUBYrDR+80e797u/VmiK4vcAAzI1AH0AAAAFZAAgAAAAAKkVC2Y6HtRmv72tDnPUSjJBvse7SxLqnr09/Uuj9sVVBXMAIAAAAABYNFUkH7ylPMN+Bc3HWX1e0flGYNbtJNCY9SltJCW/UAVjACAAAAAAHlE3RLKcXpXto7Mr8nRgzEsmhjfGh4vcgPxashCSMg4AAzI2AH0AAAAFZAAgAAAAADDggcwcb/Yn1Kk39sOHsv7BO/MfP3m/AJzjGH506Wf9BXMAIAAAAAAYZIsdjICS0+BDyRUPnrSAZfPrwtuMaEDEn0/ijLNQmAVjACAAAAAA1c/sy3255NofBQrnBNSmVkSzMgsGPaaOUJShddVrnuQAAzI3AH0AAAAFZAAgAAAAAEWY7dEUOJBgjOoWVht1wLehsWAzB3rSOBtLgTuM2HC8BXMAIAAAAAAAoswiHRROurjwUW8u8D5EUT+67yvrgpB/j6PzBDAfVwVjACAAAAAALBvQumG8m7/bzJjGWN2cHSAncdN8jMtOSmEhEhGom24AAzI4AH0AAAAFZAAgAAAAAPZaapeAUUFPA7JTCMOWHJa9lnPFh0/gXfAPjA1ezm4ZBXMAIAAAAACmJvLY2nivw7/b3DOKH/X7bBXjJwoowqb1GtEFO3OYgAVjACAAAAAAGCDHuUJusGHKQ+r9nrFChmUUsRcqZKPGsRiLSk5gbFcAAzI5AH0AAAAFZAAgAAAAAK00u6jadxCZAiA+fTsPVDsnW5p5LCr4+kZZZOTDuZlfBXMAIAAAAAAote4zTEYMDgaaQbAdN8Dzv93ljPLdGjJzvnRn3KXgtQVjACAAAAAApZ6l+OrocOqgFek7WOqOP9JruTWZ+iW+5zdL3DZwzhkAAzMwAH0AAAAFZAAgAAAAAFbgabdyymiEVYYwtJSWa7lfl/oYuj/SukzJeDOR6wPVBXMAIAAAAADAFGFjS1vPbN6mQEhkDYTD6V2V23Ys9gUEUMGNvMPkaAVjACAAAAAAeICKly5Xtwmfd4JFD+5e1UWpu4V3KoRim7jeBICDs+UAAzMxAH0AAAAFZAAgAAAAABNMR6UBv2E627CqLtQ/eDYx7OEwQ7JrR4mSHFa1N8tLBXMAIAAAAAAxH4gucI4UmNVB7625C6hFSVCuIpJO3lusJlPuL8H5EQVjACAAAAAA0/uh1hrAlGGna/njCVaCqBwubxkifzF0zjCDQrIJOtUAAzMyAH0AAAAFZAAgAAAAAG8cd6WBneNunlqrQ2EmNf35W7OGObGq9WL4ePX+LUDmBXMAIAAAAAAjJ2+sX87NSis9hBsgb1QprVRnO7Bf+GObCGoUqyPE4wVjACAAAAAAAoJ4Ufdq45T9Aun5FupHlaBCIUsmUn6dXgV9KorpFikAAzMzAH0AAAAFZAAgAAAAAFWOUGkUpy8yf6gB3dio/aOfRKh7XuhvsUj48iESFJrGBXMAIAAAAAAY7sCDMcrUXvNuL6dO0m11WyijzXZvPIcOKob6IpC4PQVjACAAAAAAO/QFjczoznH95Iu0YEVMsU1GA1yxSGL8bcwSweNzAtkAAzM0AH0AAAAFZAAgAAAAAGUrIdKxOihwNmo6B+aG+Ag1qa0+iqdksHOjQj+Oy9bZBXMAIAAAAABwa5dbI2KmzBDNBTQBEkjZv4sPaeRkRNejcjdVymRFKQVjACAAAAAAUtdJucZoQvvPJiy65RonQrxBCcvtfHslpbgLbtWirCYAAzM1AH0AAAAFZAAgAAAAAOx89xV/hRk64/CkM9N2EMK6aldII0c8smdcsZ46NbP8BXMAIAAAAADBF6tfQ+7q9kTuLyuyrSnDgmrdmrXkdhl980i1KHuGHgVjACAAAAAAVc5njbLX1afpsuG662U/OBo4LanEk06lKbQtd95fswgAAzM2AH0AAAAFZAAgAAAAAMkN0L1oQWXhjwn9rAdudcYeN8/5VdCKU8cmDt7BokjsBXMAIAAAAAAT62pGXoRwExe9uvgYOI0hg5tOxilrWfoEmT0SMglWJwVjACAAAAAAhNc5ovIaxgtS856ZBfG+cAcHAz+3ewzB9C6zZoaggj4AAzM3AH0AAAAFZAAgAAAAANxfa4xCoaaB7k1C1RoH1LBhsCbN2yEq15BT9b+iqEC4BXMAIAAAAACAX9LV8Pemfw7NF0iB1/85NzM1Ef+1mUfyehacUVgobQVjACAAAAAAc0bIRNzuyc1Y0hkEmm7xV6Xp/LBlAgMq/ISCHr0Tq44AAzM4AH0AAAAFZAAgAAAAAOYIYoWkX7dGuyKfi3XssUlc7u/gWzqrR9KMkikKVdmSBXMAIAAAAABVF2OYjRTGi9Tw8XCAwZWLpX35Yl271TlNWp6N/nROhAVjACAAAAAAyGLbmHhe8eTQC8L2eDRcezUWULLZ9E8DPic7Mfp8/+4AAzM5AH0AAAAFZAAgAAAAAIy0+bXZi10QC+q7oSOLXK5Fee7VEk/qHSXukfeVIfgzBXMAIAAAAAAQ3IIV/JQCHW95AEbH5zGIHtJqyuPjWPMIZ+VmQHlxEwVjACAAAAAAD3azcNDdohU6tHO6ypT7F0rtydAYIMmLIsX6y7cXVkMAAzQwAH0AAAAFZAAgAAAAAL5SOJQ3LOhgdXJ5v086NNeAl1qonQnchObdpZJ1kHeEBXMAIAAAAAA+tEqTXODtik+ydJZSnUqXF9f18bPeze9eWtR7ExZJgQVjACAAAAAAUd8v2RN1WagYan1LbV+G81vcJKQ6HsX2GSBtnzMH7XEAAzQxAH0AAAAFZAAgAAAAAKl8zcHJRDjSjJeV/WvMxulW1zrTFtaeBy/aKKhadc6UBXMAIAAAAADBdWQl5SBIvtZZLIHszePwkO14W1mQ0izUk2Ov21cPNAVjACAAAAAAHvQLJ2X4ncjVv1BsOd/jbVouRPwf4222WlGSzPyAfnsAAzQyAH0AAAAFZAAgAAAAAFvotcNaoKnVt5CBCOPwjexFO0WGWuaIGL6H/6KSau+6BXMAIAAAAAD2y2mBN5xPu5PJoY2zcr0GnQDtHRBogA5+xzIxccE9fwVjACAAAAAA1OntPAxq1NJ4sfca+ysHcg68mj7QHwdEZQVxHMlV6x0AAzQzAH0AAAAFZAAgAAAAAPezU0/vNT4Q4YKbTbaeHqcwNLT+IjW/Y9QFpIooihjPBXMAIAAAAACj2x4O4rHter8ZnTws5LAP9jJ/6kk9C/V3vL50LoFZHAVjACAAAAAAlZd3bPMUXRhTwLWflrQuKIwtauTswenUiaDi2ibHYYYAAzQ0AH0AAAAFZAAgAAAAAMqpayM2XotEFmm0gwQd9rIzApy0X+7HfOhNk6VU7F5lBXMAIAAAAACJR9+q5T9qFHXFNgGbZnPubG8rkO6cwWhzITQTmd6VgwVjACAAAAAAEEOCUo+ihRGl1kuHlabWBWUFyJPAXSXzpQB4od57cMEAAzQ1AH0AAAAFZAAgAAAAANCeyW+3oebaQk+aqxNVhAcT/BZ5nhsTVdKS3tMrLSvWBXMAIAAAAADxRFMDhkyuEc++WnndMfoUMLNL7T7rWoeblcrpSI6soQVjACAAAAAA1KYQISxmBcGmgDMAjBpTcfQr/oci60Kf4QtEYEXPKSQAAzQ2AH0AAAAFZAAgAAAAAIbo5YBTxXM7HQhl7UP9NNgpPGFkBx871r1B65G47+K8BXMAIAAAAAC21dJSxnEhnxO5gzN5/34BL4von45e1meW92qowzb8fQVjACAAAAAAisxsskU/9ykphpSjB6bMMY+6Tbt6wpjhE2dg1IULAgYAAzQ3AH0AAAAFZAAgAAAAABm/6pF96j26Jm7z5KkY1y33zcAEXLx2n0DwC03bs/ixBXMAIAAAAAD01OMvTZI/mqMgxIhA5nLs068mW+GKl3OW3ilf2D8+LgVjACAAAAAAnPa8PTfcaSSAdzNAC54IMTicbShbtt/cSnFHz7u7g8wAAzQ4AH0AAAAFZAAgAAAAAJ/D3+17gaQdkBqkL2wMwccdmCaVOtxzIkM8VyI4xI5zBXMAIAAAAAAggLVmkc5u+YzBR+oNE+XgLVp64fC6MzUb/Ilu/Jsw0AVjACAAAAAAp5qCK8p0eTvAAUQ8fIOGyb2YM1YflQ8H6ggiWZ9vNI4AAzQ5AH0AAAAFZAAgAAAAAJMRyUW50oaTzspS6A3TUoXyC3gNYQoShUGPakMmeVZrBXMAIAAAAACona2Pqwt4U2PmFrtmu37jB9kQ/12okyAVtYa8TQkDiQVjACAAAAAAx/LOuDwvpaPFJeKLowZW/4q7SUsLtdldB27zc4//alEAAzUwAH0AAAAFZAAgAAAAAByuYl8dBvfaZ0LO/81JW4hYypeNmvLMaxsIdvqMPrWoBXMAIAAAAABNddwobOUJzm9HOUD8BMZJqkNCUCqstHZkC76FIdNg9AVjACAAAAAA4SEPY+qEZ2dCu/9485IEVybiM3Z7szXYM+izxklNm14AAzUxAH0AAAAFZAAgAAAAAHEzLtfmF/sBcYPPdj8867VmmQyU1xK9I/3Y0478azvABXMAIAAAAAAcmyFajZPnBTbO+oLInNwlApBocUekKkxz2hYFeSlQ+gVjACAAAAAA15ibZoBP1/pP27BDIfizDYNRDIpOmj8Ie34FvrtqjhMAAzUyAH0AAAAFZAAgAAAAAJam7JYsZe2cN20ZYm2W3v1pisNt5PLiniMzymBLWyMtBXMAIAAAAABxCsKVMZMTn3n+R2L7pVz5nW804r8HcK0mCBw3jUXKXAVjACAAAAAAElCgoMRrtlONqnyosjIpiz4mQTLq3+b/JUCVEq4QFiAAAzUzAH0AAAAFZAAgAAAAAMXrXx0saZ+5gORmwM2FLuZG6iuO2YS+1IGPoAtDKoKBBXMAIAAAAADIQsxCr8CfFKaBcx8kIeSywnGh7JHjKRJ9vJd9x79y7wVjACAAAAAAPzOTJ088k9QdGUpZ1ubUdkw3pTGkNF8bui4a9wqeo08AAzU0AH0AAAAFZAAgAAAAACbzcUD3INSnCRspOKF7ubne74OK9L0FTZvi9Ay0JVDYBXMAIAAAAADPebVQH8Btk9rhBIoUOdSAdpPvz7qIY4UC2i6IGisSAQVjACAAAAAAe4zSAgMQPjtz2t1DgxW1XOlV+fnNMXt6iQ7iV7DgQz4AAzU1AH0AAAAFZAAgAAAAACUc2CtD1MK/UTxtv+8iA9FoHEyTwdl43HKeSwDw2Lp5BXMAIAAAAACCIduIdw65bQMzRYRfjBJj62bc69T4QqH4QoWanwlvowVjACAAAAAA+i6aTnkoixxSOxDgQM/aWTylOy1m0ViCDU5asOM5ieYAAzU2AH0AAAAFZAAgAAAAAHSaHWs/dnmI9sc7nB50VB2Bzs0kHapMHCQdyVEYY30TBXMAIAAAAACkV22lhEjWv/9/DubfHBAcwJggKI5mIbSK5L2nyqloqQVjACAAAAAA1I5pLbnlFf/EfJlhE0RFIioDjzKrWNh4TO8H/ksrbMcAAzU3AH0AAAAFZAAgAAAAAAL8jhNBG0KXXZhmZ0bPXtfgapJCB/AI+BEHB0eZ3C75BXMAIAAAAADHx/fPa639EBmGV5quLi8IQT600ifiKSOhTDOK19DnzwVjACAAAAAANfWpWWy9iu7pgMEy2aVCggGEtJtXKQG1+3zCf8D6iEkAAzU4AH0AAAAFZAAgAAAAAAxgeclNl09H7HvzD1oLwb2YpFca5eaX90uStYXHilqKBXMAIAAAAACMU5pSxzIzWlQxHyW170Xs9EhD1hURASQk+qkx7K5Y6AVjACAAAAAA/kYlJPSFn2g1l7cy6djV/7wgnlPWphZ0IKSY8uenUF0AAzU5AH0AAAAFZAAgAAAAABmO7QD9vxWMmFjIHz13lyOeV6vHT6mYCsWxF7hb/yOjBXMAIAAAAACT9lmgkiqzuWG24afuzYiCeK9gmJqacmxAruIukd0xEAVjACAAAAAAyiZxtuOZQNSit4wFMJS3jnqLbDzyJ0OtDTKs6r0EO0cAAzYwAH0AAAAFZAAgAAAAAB89SjLtDJkqEghRGyj6aQ/2qvWLNuMROoXmzbYbCMKMBXMAIAAAAAC8sywgND+CjhVTF6HnRQeay8y9/HnVzDI42dEPah28LQVjACAAAAAAzBj8q9Ig4uhIc6rhNDVX1lII9lzfhJ0+ig8viBhdrtQAAzYxAH0AAAAFZAAgAAAAABN2alGq9Aats1mwERNGwL/fIwZSvVCe9/8XMHTFlpUpBXMAIAAAAACuDPjJgvvbBYhbLpjMiWUCsVppiYrhvR+yMysNPN8cZAVjACAAAAAAqcsLIvb3Pe/QKYB9wQ86Ye2OFSAJEIY4ve7LMM3SwGMAAzYyAH0AAAAFZAAgAAAAAL8YB6VAqGBiWD4CBv16IBscg5J7VQCTZu87n6pj+86KBXMAIAAAAAAmxm8e68geeyAdUjSMWBHzUjneVB0pG9TBXIoE6467hAVjACAAAAAA9Kd65vKIUckNPvxl/HHNPJVnFHXyErp4qibmD7BloukAAzYzAH0AAAAFZAAgAAAAAL4yLkCTV5Dmxa5toBu4JT8ge/cITAaURIOuFuOtFUkeBXMAIAAAAAAXoFNQOMGkAj7qEJP0wQafmFSXgWGeorDVbwyOxWLIsgVjACAAAAAAaFrBx0xXIryTe7V/kX+jfPHd0057x7k7MxzDAzi0RpcAAzY0AH0AAAAFZAAgAAAAAEU8DoUp46YtYjNFS9kNXwdYxQ9IW27vCTb+VcqqfnKNBXMAIAAAAADe7vBOgYReE8X78k5ARuUnv4GmzPZzg6SbConf4L2G3wVjACAAAAAAOl/tartywd/fJj5DNRsVH/ml9tJ8KkkCbKObsFe8lHcAAzY1AH0AAAAFZAAgAAAAAPa4yKTtkUtySuWo1ZQsp2QXtPb5SYqzA5vYDnS1P6c0BXMAIAAAAADKnF58R1sXlHlsHIvCBR3YWW/qk54z9CTDhZydkD1cOQVjACAAAAAAfn/jP8K3QUILngCNkydHARyBvBHIFdaJjzV0EXsFruMAAzY2AH0AAAAFZAAgAAAAAN5WJnMBmfgpuQPyonmY5X6OdRvuHw4nhsnGRnFAQ95VBXMAIAAAAACwftzu7KVV1rmGKwXtJjs3cJ1gE3apr8+N0SAg1F2cHwVjACAAAAAAf0XyQQLd/HIYaf9EeAV0o2h12K1AV5piLCpZihznBXoAAzY3AH0AAAAFZAAgAAAAACHvDsaPhoSb6DeGnKQ1QOpGYAgK82qpnqwcmzSeWaJHBXMAIAAAAABRq3C5+dOfnkAHM5Mg5hPB3O4jhwQlBgQWLA7Ph5bhgwVjACAAAAAAm2Ukk5kkQp+PDpBCCefQOqFKKZie4hINim3yvtypsEAAAzY4AH0AAAAFZAAgAAAAAOBePJvccPMJmy515KB1AkXF5Pi8NOG4V8psWy0SPRP+BXMAIAAAAAB3dOJG9xIDtEKCRzeNnPS3bFZepMj8UKBobKpSoCPqpgVjACAAAAAAnu33SngYPOtRgdJ3aBBuxWn80ti3OO6nZJcI6eh0VfQAAzY5AH0AAAAFZAAgAAAAABUvRrDQKEXLMdhnzXRdhiL6AGNs2TojPky+YVLXs+JnBXMAIAAAAAD1kYicbEEcPzD4QtuSYQQWDPq8fuUWGddpWayKn3dT9QVjACAAAAAAUc5dxcbNYY3qMO8+Xm2xis+pH9NjPLrHqHenwDEImAEAAzcwAH0AAAAFZAAgAAAAAOvSnpujeKNen4pqc2HR63C5s5oJ1Vf4CsbKoYQvkwl5BXMAIAAAAACw2+vAMdibzd2YVVNfk81yXkFZP0WLJ82JBxJmXnYE+QVjACAAAAAAnmej008JFQAgdImjk26PYvqdATjRYRufLi+vEVVwtucAAzcxAH0AAAAFZAAgAAAAAAo0xfGG7tJ3GWhgPVhW5Zn239nTD3PadShCNRc9TwdNBXMAIAAAAADZh243oOhenu0s/P/5KZLBDh9ADqKHtSWcXpO9D2sIjgVjACAAAAAAhpNHI4+aRdWHCvZfEjlgpRBz36g05wN9p/hj3NEwc7EAAAVlACAAAAAA65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+wSY20AAAAAAAAAAAAAEHBheWxvYWRJZAAAAAAAEGZpcnN0T3BlcmF0b3IAAQAAAAA=",
+ "subType": "06"
+ }
+ }
+ }
+ },
+ "limit": 1
+ }
+ ],
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDouble",
+ "bsonType": "double",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ ]
+ }
+ },
+ "deleteTokens": {
+ "default.default": {
+ "encryptedDouble": {
+ "e": {
+ "$binary": {
+ "base64": "65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+w=",
+ "subType": "00"
+ }
+ },
+ "o": {
+ "$binary": {
+ "base64": "noN+05JsuO1oDg59yypIGj45i+eFH6HOTXOPpeZ//Mk=",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "command_name": "delete"
+ }
+ }
+ ],
+ "outcome": {
+ "collection": {
+ "data": [
+ {
+ "_id": 0,
+ "encryptedDouble": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6YrBn2ofIw1b5ooakrLOwF41BWrps8OO0H9WH4/rtlE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "n+XAuFnP8Dov9TnhGFxNx0K/MnVM9WbJ7RouEu0ndO0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yRXojuVdn5GQtD97qYlaCL6cOLmZ7Cvcb3wFjkLUIdM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "DuIkdRPITRs55I4SZmgomAHCIsDQmXRhW8+MOznkzSk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SsBk+Et1lTbU+QRPx+xyJ/jMkmfG+QCvQEpip2YYrzA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "crCIzOd8KhHvvUlX7M1v9bhvU4pLdTc+X2SuqoKU5Ek=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YOWdCw4UrqnxkAaVjqmC4sKQDMVMHEpFGnlxpxdaU6E=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "M3SShp81Ff8tQ632qKbv9MUcN6wjDaBReI0VXNu6Xh4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "gzHlSPxpM0hT75kQvWFzGlOxKvDoiKQZOr19V6l2zXI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "s3JnppOGYw9SL2Q1kMAZs948v2F5PrpXjGei/HioDWs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cG6+3Gk/zEH68P/uuuwiAUVCuyJwa1LeV+t29FlPPAo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dupdvR3AyJtM+g9NDKiaLVOtGca387JQp8w+V03m7Ig=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JqEQc5svj2jTvZ6LLA5ivE+kTb/0aRemSEmxk4G7Zrg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "szcXXXKnob+p3SoM4yED2R920LeJ7cVsclPMFTe4CeI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "o1QoGVXmuBdHwHm7aCtGMlMVKrjFdYvJXpoq6uhIAZ0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Jfm5wPlqqLCJRGQIqRq2NGmpn7s0Vrih2H3YAOoI2YU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zMHLb8ARbsYo8Ld05bqnGFf1Usha6EGb8QKwdSAyps0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yQdtq9lh5pugL7/i0Bj/PuZUUBUIzf+7wj1rl5y736w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wGWVZdO7qIuyDg/BqDgqjgoQ02h5YYgwXQB1oCin2NE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "by9HMLj6NTEpgztZ5HSN6GxImkXPcaFINYDzgZY33X8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tWo0vbasi7bXmn/MsOx13VC1IsWtpx/nYp0uj4iMzdA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tQQpndUYd5O87lOtrGjH3wl9VsOK0ray7RMasL90sBM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cQjXEDCMsOpKLLf+vlTgIHA+cbSJdzqhbSX9Wvh95aA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "7yMpU48IxK9SzP2cx3VnTownGEwFmeFofuuFT97SuuY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kSOx1kz0CmBgzKQHZlo65ZUY1DIv9A99JRm+Us2y6Ew=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ubQpdPBe6/xvtr+AcXdfYLSvYCR4ot0tivehkCsupb4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xal+iCJ6FTefRQToyoNksc9NCZShyn04NDGi4IYrcoM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "d7jU4iOK50xHxlkSifcxlZFCM46TSgQzoYivxG3HNLY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tJvl2nsBLBVzL3pp6sKWCL4UXeh3q/roYBJjSb74ve0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "OIUCaKRvIx9t1w6Hxlz1IcQTdPNCfdRNwnnTm10W+X0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "A9tvzsiElotOUVIB4CqfQp9mAwqvTM35YkmAR170aHA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lI8gpK7hpb7c9x4RQugsxMnQay5LZJmwslZdvMx/dcE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dNCzh40U0XvdKnSDi3HRQOWQftEsDVqc4uUvsVFGoq8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "IP+iwEBWBwVVZIdpaMu8k5+soFCz+TZkYn3drKZ9grE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pnqyh6e0y5svHkJDShlN9CHV0WvMBE4QbtJpQw5ZCXc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "elEl42tbVDoRTLjAhZUFEtXiut4b3PVhg/1ZLZSQdtE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "vHuu2FxwclMHqyE6JBYbTYgbEkB0dqb/JuaxsvfwsmY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xTf7NCe3Gf8QpE78HR5OknlLTKfs9J+RN9UZpH6fnso=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "XiWSasRnJAulGR6+LCVD3mwRObXylqYWR9jvpywq12c=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "MZMxEQ5ikx0PG1YFIExv0UnTZogsvgeOEZTpzvBDn4w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yZMyMZBDrWbAhvnic7vvIYhmO9m5H2iuv0c8KNZrBzY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xxM14hTPY5j0vvcK2C7YAEjzdsfUTFHozHC0hEo1bxI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+01rqR1xVwkpGXcstbk1ItJqFVjH6Q8MGxEN3Cm9Y1A=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xOpLV0Z2VTRJ3iWtnWZcsyjXubTIkYWo31cO+HV1o1k=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "BWUOLqgLBqc5NwxVlSV5H3KFQPXbCp7mdo+jF+8cJqY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "fuQb1S6xZDGlrEbK+kI23aL53PP1PVNwqICnZNt9Yzg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SfscnoibFttahLdPVC4Ee+47ewGFKpDSU7M6HX19bKE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rpSW2awybNVeKtat91VFxqbINoTfNhPfQAu+d73Xtf8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "9M/CP9ccOIIj2LLFmE0GFDO0Ban2wsNalEXfM6+h+1s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "WrEMG49l1ye4MhXs5ZS9tz8P6h+hDvthIg/2wW9ne1Q=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ImNhbfeyfH8qIEeA5ic0s3dAQBdzzTBS+CPsNih9vZ0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dWP33YDSn04UKJN2ogh2Rui0iW/0q2y18OCDRVcfyoo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lYv0isAtfGh6H9tdp3cp2eHU7q2J+uk7QrgcxtK3w7Y=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "VGMoamB/+7zTOYcY/pqJc96xlv2PdW4hwsIAEIslTDQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yNeBWMF7BnD9wVwz2PgJsvWr77QiVvvWUvJF0+fqBug=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SfpvObJ+tJBXSvqeN7vlOfmhYign635lciYAJIjUtY8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dsen4NqjzVGjpjufiTMs3+gqeD09EbnuogPgxrJECwg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pxCWVM3sn19NsFEpgHbgLa+PmYlhN3mMiP0Wk8kJhYw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q11KNvJszjYIB9n9HcC+N4uz11a3eRj1L3BH9scKMDQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "A1PmkgcEToWh1JiVWE6mI5jUu7poxWWuCUt/cgRUUDc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "qJo3Hu4PJeanL7XEaWXO/n3YsodhZyd+MJOOmB9Kpd8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "BkBKLO8URFscfRY9Bav/1+L9mLohDgNr/MkZtGiraIs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rZq5WA3Hx3xthOyHAJXK//f8pE2qbz7YKu3TIMp9GFY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "X07a/Lm80p5xd4RFs1dNmw+90tmPDPdGiAKVZkxd4zY=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ ]
+}
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-Double-Delete.yml b/specifications/client-side-encryption/tests/legacy/fle2-Range-Double-Delete.yml
new file mode 100644
index 00000000000..5fc9680ae07
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-Double-Delete.yml
@@ -0,0 +1,521 @@
+# Requires libmongocrypt 1.7.0.
+runOn:
+ - minServerVersion: "6.2.0"
+ # FLE 2 Encrypted collections are not supported on standalone.
+ topology: [ "replicaset", "sharded", "load-balanced" ]
+database_name: &database_name "default"
+collection_name: &collection_name "default"
+data: []
+encrypted_fields: &encrypted_fields {'escCollection': 'enxcol_.default.esc', 'eccCollection': 'enxcol_.default.ecc', 'ecocCollection': 'enxcol_.default.ecoc', 'fields': [{'keyId': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'path': 'encryptedDouble', 'bsonType': 'double', 'queries': {'queryType': 'rangePreview', 'contention': {'$numberLong': '0'}, 'sparsity': {'$numberLong': '1'}}}]}
+key_vault_data: [ {'_id': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'keyMaterial': {'$binary': {'base64': 'sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==', 'subType': '00'}}, 'creationDate': {'$date': {'$numberLong': '1648914851981'}}, 'updateDate': {'$date': {'$numberLong': '1648914851981'}}, 'status': {'$numberInt': '0'}, 'masterKey': {'provider': 'local'}} ]
+tests:
+ - description: "FLE2 Range Double. Delete."
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments:
+ document: &doc0 { _id: 0, encryptedDouble: { $numberDouble: "0" } }
+ - name: insertOne
+ arguments:
+ document: &doc1 { _id: 1, encryptedDouble: { $numberDouble: "1" } }
+ - name: deleteOne
+ arguments:
+ filter: { "encryptedDouble": { $gt: {$numberDouble: "0" }} }
+ result:
+ deletedCount: 1
+ expectations:
+ - command_started_event:
+ command:
+ listCollections: 1
+ filter:
+ name: *collection_name
+ command_name: listCollections
+ - command_started_event:
+ command:
+ find: datakeys
+ filter: {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ }
+ $db: keyvault
+ readConcern: { level: "majority" }
+ command_name: find
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc0_encrypted { "_id": 0, "encryptedDouble": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc1_encrypted { "_id": 1, "encryptedDouble": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ delete: *collection_name
+ deletes: [
+ {
+ "q": {
+ "encryptedDouble": {
+ "$gt": {
+ "$binary": {
+ "base64": "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",
+ "subType": "06"
+ }
+ }
+ }
+ },
+ "limit": 1
+ }
+ ]
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ "deleteTokens": {
+ "default.default": {
+ "encryptedDouble": {
+ "e": {
+ "$binary": {
+ "base64": "65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+w=",
+ "subType": "00"
+ }
+ },
+ "o": {
+ "$binary": {
+ "base64": "noN+05JsuO1oDg59yypIGj45i+eFH6HOTXOPpeZ//Mk=",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ command_name: delete
+ outcome:
+ collection:
+ # Outcome is checked using a separate MongoClient without auto encryption.
+ data:
+ -
+ {
+ "_id": 0,
+ "encryptedDouble": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6YrBn2ofIw1b5ooakrLOwF41BWrps8OO0H9WH4/rtlE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "n+XAuFnP8Dov9TnhGFxNx0K/MnVM9WbJ7RouEu0ndO0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yRXojuVdn5GQtD97qYlaCL6cOLmZ7Cvcb3wFjkLUIdM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "DuIkdRPITRs55I4SZmgomAHCIsDQmXRhW8+MOznkzSk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SsBk+Et1lTbU+QRPx+xyJ/jMkmfG+QCvQEpip2YYrzA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "crCIzOd8KhHvvUlX7M1v9bhvU4pLdTc+X2SuqoKU5Ek=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YOWdCw4UrqnxkAaVjqmC4sKQDMVMHEpFGnlxpxdaU6E=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "M3SShp81Ff8tQ632qKbv9MUcN6wjDaBReI0VXNu6Xh4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "gzHlSPxpM0hT75kQvWFzGlOxKvDoiKQZOr19V6l2zXI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "s3JnppOGYw9SL2Q1kMAZs948v2F5PrpXjGei/HioDWs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cG6+3Gk/zEH68P/uuuwiAUVCuyJwa1LeV+t29FlPPAo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dupdvR3AyJtM+g9NDKiaLVOtGca387JQp8w+V03m7Ig=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JqEQc5svj2jTvZ6LLA5ivE+kTb/0aRemSEmxk4G7Zrg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "szcXXXKnob+p3SoM4yED2R920LeJ7cVsclPMFTe4CeI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "o1QoGVXmuBdHwHm7aCtGMlMVKrjFdYvJXpoq6uhIAZ0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Jfm5wPlqqLCJRGQIqRq2NGmpn7s0Vrih2H3YAOoI2YU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zMHLb8ARbsYo8Ld05bqnGFf1Usha6EGb8QKwdSAyps0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yQdtq9lh5pugL7/i0Bj/PuZUUBUIzf+7wj1rl5y736w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wGWVZdO7qIuyDg/BqDgqjgoQ02h5YYgwXQB1oCin2NE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "by9HMLj6NTEpgztZ5HSN6GxImkXPcaFINYDzgZY33X8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tWo0vbasi7bXmn/MsOx13VC1IsWtpx/nYp0uj4iMzdA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tQQpndUYd5O87lOtrGjH3wl9VsOK0ray7RMasL90sBM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cQjXEDCMsOpKLLf+vlTgIHA+cbSJdzqhbSX9Wvh95aA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "7yMpU48IxK9SzP2cx3VnTownGEwFmeFofuuFT97SuuY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kSOx1kz0CmBgzKQHZlo65ZUY1DIv9A99JRm+Us2y6Ew=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ubQpdPBe6/xvtr+AcXdfYLSvYCR4ot0tivehkCsupb4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xal+iCJ6FTefRQToyoNksc9NCZShyn04NDGi4IYrcoM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "d7jU4iOK50xHxlkSifcxlZFCM46TSgQzoYivxG3HNLY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tJvl2nsBLBVzL3pp6sKWCL4UXeh3q/roYBJjSb74ve0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "OIUCaKRvIx9t1w6Hxlz1IcQTdPNCfdRNwnnTm10W+X0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "A9tvzsiElotOUVIB4CqfQp9mAwqvTM35YkmAR170aHA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lI8gpK7hpb7c9x4RQugsxMnQay5LZJmwslZdvMx/dcE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dNCzh40U0XvdKnSDi3HRQOWQftEsDVqc4uUvsVFGoq8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "IP+iwEBWBwVVZIdpaMu8k5+soFCz+TZkYn3drKZ9grE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pnqyh6e0y5svHkJDShlN9CHV0WvMBE4QbtJpQw5ZCXc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "elEl42tbVDoRTLjAhZUFEtXiut4b3PVhg/1ZLZSQdtE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "vHuu2FxwclMHqyE6JBYbTYgbEkB0dqb/JuaxsvfwsmY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xTf7NCe3Gf8QpE78HR5OknlLTKfs9J+RN9UZpH6fnso=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "XiWSasRnJAulGR6+LCVD3mwRObXylqYWR9jvpywq12c=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "MZMxEQ5ikx0PG1YFIExv0UnTZogsvgeOEZTpzvBDn4w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yZMyMZBDrWbAhvnic7vvIYhmO9m5H2iuv0c8KNZrBzY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xxM14hTPY5j0vvcK2C7YAEjzdsfUTFHozHC0hEo1bxI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+01rqR1xVwkpGXcstbk1ItJqFVjH6Q8MGxEN3Cm9Y1A=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xOpLV0Z2VTRJ3iWtnWZcsyjXubTIkYWo31cO+HV1o1k=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "BWUOLqgLBqc5NwxVlSV5H3KFQPXbCp7mdo+jF+8cJqY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "fuQb1S6xZDGlrEbK+kI23aL53PP1PVNwqICnZNt9Yzg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SfscnoibFttahLdPVC4Ee+47ewGFKpDSU7M6HX19bKE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rpSW2awybNVeKtat91VFxqbINoTfNhPfQAu+d73Xtf8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "9M/CP9ccOIIj2LLFmE0GFDO0Ban2wsNalEXfM6+h+1s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "WrEMG49l1ye4MhXs5ZS9tz8P6h+hDvthIg/2wW9ne1Q=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ImNhbfeyfH8qIEeA5ic0s3dAQBdzzTBS+CPsNih9vZ0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dWP33YDSn04UKJN2ogh2Rui0iW/0q2y18OCDRVcfyoo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lYv0isAtfGh6H9tdp3cp2eHU7q2J+uk7QrgcxtK3w7Y=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "VGMoamB/+7zTOYcY/pqJc96xlv2PdW4hwsIAEIslTDQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yNeBWMF7BnD9wVwz2PgJsvWr77QiVvvWUvJF0+fqBug=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SfpvObJ+tJBXSvqeN7vlOfmhYign635lciYAJIjUtY8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dsen4NqjzVGjpjufiTMs3+gqeD09EbnuogPgxrJECwg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pxCWVM3sn19NsFEpgHbgLa+PmYlhN3mMiP0Wk8kJhYw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q11KNvJszjYIB9n9HcC+N4uz11a3eRj1L3BH9scKMDQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "A1PmkgcEToWh1JiVWE6mI5jUu7poxWWuCUt/cgRUUDc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "qJo3Hu4PJeanL7XEaWXO/n3YsodhZyd+MJOOmB9Kpd8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "BkBKLO8URFscfRY9Bav/1+L9mLohDgNr/MkZtGiraIs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rZq5WA3Hx3xthOyHAJXK//f8pE2qbz7YKu3TIMp9GFY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "X07a/Lm80p5xd4RFs1dNmw+90tmPDPdGiAKVZkxd4zY=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
\ No newline at end of file
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-Double-FindOneAndUpdate.json b/specifications/client-side-encryption/tests/legacy/fle2-Range-Double-FindOneAndUpdate.json
new file mode 100644
index 00000000000..59a304166bd
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-Double-FindOneAndUpdate.json
@@ -0,0 +1,1160 @@
+{
+ "runOn": [
+ {
+ "minServerVersion": "6.2.0",
+ "topology": [
+ "replicaset",
+ "sharded",
+ "load-balanced"
+ ]
+ }
+ ],
+ "database_name": "default",
+ "collection_name": "default",
+ "data": [],
+ "encrypted_fields": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDouble",
+ "bsonType": "double",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ ]
+ },
+ "key_vault_data": [
+ {
+ "_id": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "keyMaterial": {
+ "$binary": {
+ "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==",
+ "subType": "00"
+ }
+ },
+ "creationDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "updateDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "status": {
+ "$numberInt": "0"
+ },
+ "masterKey": {
+ "provider": "local"
+ }
+ }
+ ],
+ "tests": [
+ {
+ "description": "FLE2 Range Double. FindOneAndUpdate.",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDouble": {
+ "$numberDouble": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDouble": {
+ "$numberDouble": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "findOneAndUpdate",
+ "arguments": {
+ "filter": {
+ "encryptedDouble": {
+ "$gt": {
+ "$numberDouble": "0"
+ }
+ }
+ },
+ "update": {
+ "$set": {
+ "encryptedDouble": {
+ "$numberDouble": "2"
+ }
+ }
+ },
+ "returnDocument": "Before"
+ },
+ "result": {
+ "_id": 1,
+ "encryptedDouble": {
+ "$numberDouble": "1"
+ }
+ }
+ }
+ ],
+ "expectations": [
+ {
+ "command_started_event": {
+ "command": {
+ "listCollections": 1,
+ "filter": {
+ "name": "default"
+ }
+ },
+ "command_name": "listCollections"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "find": "datakeys",
+ "filter": {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ },
+ "$db": "keyvault",
+ "readConcern": {
+ "level": "majority"
+ }
+ },
+ "command_name": "find"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 0,
+ "encryptedDouble": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDouble",
+ "bsonType": "double",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 1,
+ "encryptedDouble": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDouble",
+ "bsonType": "double",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "findAndModify": "default",
+ "query": {
+ "encryptedDouble": {
+ "$gt": {
+ "$binary": {
+ "base64": "Cq8kAAADcGF5bG9hZAB/JAAABGcAQyQAAAMwAH0AAAAFZAAgAAAAAHgYoMGjEE6fAlAhICv0+doHcVX8CmMVxyq7+jlyGrvmBXMAIAAAAAC/5MQZgTHuIr/O5Z3mXPvqrom5JTQ8IeSpQGhO9sB+8gVjACAAAAAAPMgD8Rqnd94atKnMyPjlTwthUQ710MKJVqgtwNXLFWwAAzEAfQAAAAVkACAAAAAA2kiWNvEc4zunJ1jzvuClFC9hjZMYruKCqAaxq+oY8EAFcwAgAAAAACofIS72Cm6s866UCk+evTH3CvKBj/uZd72sAL608rzTBWMAIAAAAAB7NkTFgsBuPIyxW5KtYZD4uxdgRynoAUwA2RDj3qZNdwADMgB9AAAABWQAIAAAAABkfoBGmU3hjYBvQbjNW19kfXneBQsQQPRfUL3UAwI2cAVzACAAAAAAUpK2BUOqX/DGdX5YJniEZMWkofxHqeAbXceEGJxhp8AFYwAgAAAAAENNdd+fMV7VQzshj6RdvsxqDHYkPDxggdUHw3JbmFBeAAMzAH0AAAAFZAAgAAAAAFNprhQ3ZwIcYbuzLolAT5n/vc14P9kUUQComDu6eFyKBXMAIAAAAAAcx9z9pk32YbPV/sfPZl9ALIEVsqoLXgqWLVK/tP+heAVjACAAAAAA3eqduo9CWE5BePqBq7KCh5++QqXnyjCwybB15Zoeiu4AAzQAfQAAAAVkACAAAAAAODI+pB2pCuB+YmNEUAgtMfNdt3DmSkrJ96gRzLphgb8FcwAgAAAAAAT7dewFDxUDECQ3zVq75/cUN4IP+zsqhkP5+czUwlJIBWMAIAAAAABYcCJA2jocGQiF/vZ9VDEktoK015OqfY64yZhmNPs9GQADNQB9AAAABWQAIAAAAACNAk+yTZ4Ewk1EnotQK8O3h1gg9I7pr9q2+4po1iJVgAVzACAAAAAAUj/LesmtEsgqYVzMJ67umVA11hJTdDXwbxDoQ71vWyUFYwAgAAAAAG32XaKjEO9YTSLMnDR5eiaUpgBQz0n4M3VpBqhWTaEnAAM2AH0AAAAFZAAgAAAAAD/FIrGYFDjyYmVb7oTMVwweWP7A6F9LnyIuNO4MjBnXBXMAIAAAAACIZgJCQRZu7NhuNMyOqCn1tf+DfU1qm10TPCfj5JYV3wVjACAAAAAAZCaO06/DjOBjNrTxB8jdxM7X4XvNu9QTa2Y00kZJwgEAAzcAfQAAAAVkACAAAAAAciRW40ORJLVwchOEpz87Svb+5toAFM6LxDWv928ECwQFcwAgAAAAAN0dipyESIkszfjRzdDi8kAGaa2Hf4wrPAtiWwboZLuxBWMAIAAAAADhvKHhF7zfNRnG8QfiIlKycV6L6iGxbGNKkHligA9rAgADOAB9AAAABWQAIAAAAACZqAyCzYQupJ95mrBJX54yIz9VY7I0WrxpNYElCI4dTQVzACAAAAAA/eyJb6d1xfE+jJlVXMTD3HS/NEYENPVKAuj56Dr2dSEFYwAgAAAAAMfcJKj77c6y/RBQ5hb5LSNdvbYvCAHR59KLnbmxj1gAAAM5AH0AAAAFZAAgAAAAAI5bm3YO0Xgf0VT+qjVTTfvckecM3Cwqj7DTKZXf8/NXBXMAIAAAAAD/m+h8fBhWaHm6Ykuz0WX1xL4Eme3ErLObyEVJf8NCywVjACAAAAAAiGdTXD22l1zDxHeF4NXUTiBnNTsdpzJRwM6riTPuOogAAzEwAH0AAAAFZAAgAAAAANqo4+p6qdtCzcB4BX1wQ6llU7eFBnuu4MtZwp4B6mDlBXMAIAAAAAAGiz+VaukMZ+6IH4jtn4KWWdKK4/W+O+gRioQDrfzpMgVjACAAAAAAl/wlBjSJW/hKkll8HSBCGw4Ce1pJ5rZuhVE09hKq4jQAAzExAH0AAAAFZAAgAAAAAPrFXmHP2Y4YAm7b/aqsdn/DPoDkv7B8egWkfe23XsM1BXMAIAAAAAAGhwpKAr7skeqHm3oseSbO7qKNhmYsuUrECBxJ5k+D2AVjACAAAAAAKSsxERy2OBhb5MiH9/H2BET2oeU6yVihiAoWi/16FroAAzEyAH0AAAAFZAAgAAAAABzjYxwAjXxXc0Uxv18rH8I3my0Aguow0kTwKyxbrm+cBXMAIAAAAADVbqJVr6IdokuhXkEtXF0C2gINLiAjMVN20lE20Vmp2QVjACAAAAAACJ+VAwl9X88mjC76yzkWeL4K6AamNYjbNkpS9B6fQE4AAzEzAH0AAAAFZAAgAAAAAFMm2feF2fFCm/UC6AfIyepX/xJDSmnnolQIBnHcPmb5BXMAIAAAAABLI11kFrQoaNVZFmq/38aRNImPOjdJh0Lo6irI8M/AaAVjACAAAAAAZFgYh4nV8YN+/AAqe/QhKDkNBPg8KraCG7y3bOzhPV4AAzE0AH0AAAAFZAAgAAAAAJvXB3KyNiNtQko4SSzo/9b2qmM2zU9CQTTDfLSBWMgRBXMAIAAAAAAvjuVP7KsLRDeqVqRziTKpBrjVyqKiIbO9Gw8Wl2wFTAVjACAAAAAARuBn3JdQ8so7Gy0XVH0CtlvtRoJWhSrJP6eRIqbyWh8AAzE1AH0AAAAFZAAgAAAAAPGdcxDiid8z8XYnfdDivNMYVPgBKdGOUw6UStU+48CdBXMAIAAAAAARj6g1Ap0eEfuCZ4X2TsEw+Djrhto3fA5nLwPaY0vCTgVjACAAAAAATxLY6SkcLPaoOBJpQsggEqoxgJgiY9seP3fBQM05PckAAzE2AH0AAAAFZAAgAAAAAP5rGPrYGt3aKob5f/ldP0qrW7bmWvqnKY4QwdDWz400BXMAIAAAAADTQkW2ymaaf/bhteOOGmSrIR97bAnJx+yN3yMj1bTeewVjACAAAAAA6O+wIMt3xMITuCxVrqOCNBPX5F122G+/Is+EYkzUvVYAAzE3AH0AAAAFZAAgAAAAAAlz6wJze5UkIxKpJOZFGCOf3v2KByWyI6NB6JM9wNcBBXMAIAAAAABUC7P/neUIHHoZtq0jFVBHY75tSFYr1Y5S16YN5XxC1QVjACAAAAAANv97jMd9JmZ7lMeCzK7jaZHZYsZJNl6N9g9WXzd2om0AAzE4AH0AAAAFZAAgAAAAAFJ8AtHcjia/9Y5pLEc3qVgH5xKiXw12G9Kn2A1EY8McBXMAIAAAAAAxe7Bdw7eUSBk/oAawa7uicTEDgXLymRNhBy1LAxhDvwVjACAAAAAAtOUZ2NeUWwESpq95O92dhqYBt8RtFnjT43E7k9mQF3oAAzE5AH0AAAAFZAAgAAAAAO8uwQUaKFb6vqR3Sv3Wn4QAonC2exOC9lGG1juqP5DtBXMAIAAAAABZf1KyJgQg8/Rf5c02DgDK2aQu0rNCOvaL60ohDHyY+gVjACAAAAAA5nAWj1Ek8p0MLYZEB3yoVFDfBYZ+/ZpIo71u+W9hprcAAzIwAH0AAAAFZAAgAAAAAE8YtqyRsGCeiR6hhiyisR/hccmK4nZqIMzO4lUBmEFzBXMAIAAAAAC1UYOSKqAeG1UJiKjWFVskRhuFKpj9Ezy+lICZvFlN5AVjACAAAAAA37oP30mTzVftI2FL9Uwyls/jqLqbmRDQk7p7nlx44uYAAzIxAH0AAAAFZAAgAAAAAPhCrMausDx1QUIEqp9rUdRKyM6a9AAx7jQ3ILIu8wNIBXMAIAAAAACmH8lotGCiF2q9VQxhsS+7LAZv79VUAsOUALaGxE/EpAVjACAAAAAAhVIkl8p19VZ0gpg32s++Jda3qsVSVB5tV4CKrtjhE3IAAzIyAH0AAAAFZAAgAAAAAOBi/GAYFcstMSJPgp3VkMiuuUUCrZytvqYaU8dwm8v2BXMAIAAAAACEZSZVyD3pKzGlbdwlYmWQhHHTV5SnNLknl2Gw8IaUTQVjACAAAAAAriBex2kK//RPhyVpCYJDBng4l5w8jD3m8BF7dVAP0p8AAzIzAH0AAAAFZAAgAAAAAIQuup+YGfH3mflzWopN8J1X8o8a0d9CSGIvrA5HOzraBXMAIAAAAADYvNLURXsC2ITMqK14LABQBI+hZZ5wNf24JMcKLW+84AVjACAAAAAAGeUzdG2kQrx5XypXJezZmPVzMYuqYZw7Bhbl4EPT0SMAAzI0AH0AAAAFZAAgAAAAAKsh0ADyOnVocFrOrf6MpTrNvAj8iaiE923DPryu124gBXMAIAAAAADg24a8NVE1GyScc6tmnTbmu5ulzO+896fE92lN08MeswVjACAAAAAAbO+DEBY3STVMQN7CbxmHDUBYrDR+80e797u/VmiK4vcAAzI1AH0AAAAFZAAgAAAAAKkVC2Y6HtRmv72tDnPUSjJBvse7SxLqnr09/Uuj9sVVBXMAIAAAAABYNFUkH7ylPMN+Bc3HWX1e0flGYNbtJNCY9SltJCW/UAVjACAAAAAAHlE3RLKcXpXto7Mr8nRgzEsmhjfGh4vcgPxashCSMg4AAzI2AH0AAAAFZAAgAAAAADDggcwcb/Yn1Kk39sOHsv7BO/MfP3m/AJzjGH506Wf9BXMAIAAAAAAYZIsdjICS0+BDyRUPnrSAZfPrwtuMaEDEn0/ijLNQmAVjACAAAAAA1c/sy3255NofBQrnBNSmVkSzMgsGPaaOUJShddVrnuQAAzI3AH0AAAAFZAAgAAAAAEWY7dEUOJBgjOoWVht1wLehsWAzB3rSOBtLgTuM2HC8BXMAIAAAAAAAoswiHRROurjwUW8u8D5EUT+67yvrgpB/j6PzBDAfVwVjACAAAAAALBvQumG8m7/bzJjGWN2cHSAncdN8jMtOSmEhEhGom24AAzI4AH0AAAAFZAAgAAAAAPZaapeAUUFPA7JTCMOWHJa9lnPFh0/gXfAPjA1ezm4ZBXMAIAAAAACmJvLY2nivw7/b3DOKH/X7bBXjJwoowqb1GtEFO3OYgAVjACAAAAAAGCDHuUJusGHKQ+r9nrFChmUUsRcqZKPGsRiLSk5gbFcAAzI5AH0AAAAFZAAgAAAAAK00u6jadxCZAiA+fTsPVDsnW5p5LCr4+kZZZOTDuZlfBXMAIAAAAAAote4zTEYMDgaaQbAdN8Dzv93ljPLdGjJzvnRn3KXgtQVjACAAAAAApZ6l+OrocOqgFek7WOqOP9JruTWZ+iW+5zdL3DZwzhkAAzMwAH0AAAAFZAAgAAAAAFbgabdyymiEVYYwtJSWa7lfl/oYuj/SukzJeDOR6wPVBXMAIAAAAADAFGFjS1vPbN6mQEhkDYTD6V2V23Ys9gUEUMGNvMPkaAVjACAAAAAAeICKly5Xtwmfd4JFD+5e1UWpu4V3KoRim7jeBICDs+UAAzMxAH0AAAAFZAAgAAAAABNMR6UBv2E627CqLtQ/eDYx7OEwQ7JrR4mSHFa1N8tLBXMAIAAAAAAxH4gucI4UmNVB7625C6hFSVCuIpJO3lusJlPuL8H5EQVjACAAAAAA0/uh1hrAlGGna/njCVaCqBwubxkifzF0zjCDQrIJOtUAAzMyAH0AAAAFZAAgAAAAAG8cd6WBneNunlqrQ2EmNf35W7OGObGq9WL4ePX+LUDmBXMAIAAAAAAjJ2+sX87NSis9hBsgb1QprVRnO7Bf+GObCGoUqyPE4wVjACAAAAAAAoJ4Ufdq45T9Aun5FupHlaBCIUsmUn6dXgV9KorpFikAAzMzAH0AAAAFZAAgAAAAAFWOUGkUpy8yf6gB3dio/aOfRKh7XuhvsUj48iESFJrGBXMAIAAAAAAY7sCDMcrUXvNuL6dO0m11WyijzXZvPIcOKob6IpC4PQVjACAAAAAAO/QFjczoznH95Iu0YEVMsU1GA1yxSGL8bcwSweNzAtkAAzM0AH0AAAAFZAAgAAAAAGUrIdKxOihwNmo6B+aG+Ag1qa0+iqdksHOjQj+Oy9bZBXMAIAAAAABwa5dbI2KmzBDNBTQBEkjZv4sPaeRkRNejcjdVymRFKQVjACAAAAAAUtdJucZoQvvPJiy65RonQrxBCcvtfHslpbgLbtWirCYAAzM1AH0AAAAFZAAgAAAAAOx89xV/hRk64/CkM9N2EMK6aldII0c8smdcsZ46NbP8BXMAIAAAAADBF6tfQ+7q9kTuLyuyrSnDgmrdmrXkdhl980i1KHuGHgVjACAAAAAAVc5njbLX1afpsuG662U/OBo4LanEk06lKbQtd95fswgAAzM2AH0AAAAFZAAgAAAAAMkN0L1oQWXhjwn9rAdudcYeN8/5VdCKU8cmDt7BokjsBXMAIAAAAAAT62pGXoRwExe9uvgYOI0hg5tOxilrWfoEmT0SMglWJwVjACAAAAAAhNc5ovIaxgtS856ZBfG+cAcHAz+3ewzB9C6zZoaggj4AAzM3AH0AAAAFZAAgAAAAANxfa4xCoaaB7k1C1RoH1LBhsCbN2yEq15BT9b+iqEC4BXMAIAAAAACAX9LV8Pemfw7NF0iB1/85NzM1Ef+1mUfyehacUVgobQVjACAAAAAAc0bIRNzuyc1Y0hkEmm7xV6Xp/LBlAgMq/ISCHr0Tq44AAzM4AH0AAAAFZAAgAAAAAOYIYoWkX7dGuyKfi3XssUlc7u/gWzqrR9KMkikKVdmSBXMAIAAAAABVF2OYjRTGi9Tw8XCAwZWLpX35Yl271TlNWp6N/nROhAVjACAAAAAAyGLbmHhe8eTQC8L2eDRcezUWULLZ9E8DPic7Mfp8/+4AAzM5AH0AAAAFZAAgAAAAAIy0+bXZi10QC+q7oSOLXK5Fee7VEk/qHSXukfeVIfgzBXMAIAAAAAAQ3IIV/JQCHW95AEbH5zGIHtJqyuPjWPMIZ+VmQHlxEwVjACAAAAAAD3azcNDdohU6tHO6ypT7F0rtydAYIMmLIsX6y7cXVkMAAzQwAH0AAAAFZAAgAAAAAL5SOJQ3LOhgdXJ5v086NNeAl1qonQnchObdpZJ1kHeEBXMAIAAAAAA+tEqTXODtik+ydJZSnUqXF9f18bPeze9eWtR7ExZJgQVjACAAAAAAUd8v2RN1WagYan1LbV+G81vcJKQ6HsX2GSBtnzMH7XEAAzQxAH0AAAAFZAAgAAAAAKl8zcHJRDjSjJeV/WvMxulW1zrTFtaeBy/aKKhadc6UBXMAIAAAAADBdWQl5SBIvtZZLIHszePwkO14W1mQ0izUk2Ov21cPNAVjACAAAAAAHvQLJ2X4ncjVv1BsOd/jbVouRPwf4222WlGSzPyAfnsAAzQyAH0AAAAFZAAgAAAAAFvotcNaoKnVt5CBCOPwjexFO0WGWuaIGL6H/6KSau+6BXMAIAAAAAD2y2mBN5xPu5PJoY2zcr0GnQDtHRBogA5+xzIxccE9fwVjACAAAAAA1OntPAxq1NJ4sfca+ysHcg68mj7QHwdEZQVxHMlV6x0AAzQzAH0AAAAFZAAgAAAAAPezU0/vNT4Q4YKbTbaeHqcwNLT+IjW/Y9QFpIooihjPBXMAIAAAAACj2x4O4rHter8ZnTws5LAP9jJ/6kk9C/V3vL50LoFZHAVjACAAAAAAlZd3bPMUXRhTwLWflrQuKIwtauTswenUiaDi2ibHYYYAAzQ0AH0AAAAFZAAgAAAAAMqpayM2XotEFmm0gwQd9rIzApy0X+7HfOhNk6VU7F5lBXMAIAAAAACJR9+q5T9qFHXFNgGbZnPubG8rkO6cwWhzITQTmd6VgwVjACAAAAAAEEOCUo+ihRGl1kuHlabWBWUFyJPAXSXzpQB4od57cMEAAzQ1AH0AAAAFZAAgAAAAANCeyW+3oebaQk+aqxNVhAcT/BZ5nhsTVdKS3tMrLSvWBXMAIAAAAADxRFMDhkyuEc++WnndMfoUMLNL7T7rWoeblcrpSI6soQVjACAAAAAA1KYQISxmBcGmgDMAjBpTcfQr/oci60Kf4QtEYEXPKSQAAzQ2AH0AAAAFZAAgAAAAAIbo5YBTxXM7HQhl7UP9NNgpPGFkBx871r1B65G47+K8BXMAIAAAAAC21dJSxnEhnxO5gzN5/34BL4von45e1meW92qowzb8fQVjACAAAAAAisxsskU/9ykphpSjB6bMMY+6Tbt6wpjhE2dg1IULAgYAAzQ3AH0AAAAFZAAgAAAAABm/6pF96j26Jm7z5KkY1y33zcAEXLx2n0DwC03bs/ixBXMAIAAAAAD01OMvTZI/mqMgxIhA5nLs068mW+GKl3OW3ilf2D8+LgVjACAAAAAAnPa8PTfcaSSAdzNAC54IMTicbShbtt/cSnFHz7u7g8wAAzQ4AH0AAAAFZAAgAAAAAJ/D3+17gaQdkBqkL2wMwccdmCaVOtxzIkM8VyI4xI5zBXMAIAAAAAAggLVmkc5u+YzBR+oNE+XgLVp64fC6MzUb/Ilu/Jsw0AVjACAAAAAAp5qCK8p0eTvAAUQ8fIOGyb2YM1YflQ8H6ggiWZ9vNI4AAzQ5AH0AAAAFZAAgAAAAAJMRyUW50oaTzspS6A3TUoXyC3gNYQoShUGPakMmeVZrBXMAIAAAAACona2Pqwt4U2PmFrtmu37jB9kQ/12okyAVtYa8TQkDiQVjACAAAAAAx/LOuDwvpaPFJeKLowZW/4q7SUsLtdldB27zc4//alEAAzUwAH0AAAAFZAAgAAAAAByuYl8dBvfaZ0LO/81JW4hYypeNmvLMaxsIdvqMPrWoBXMAIAAAAABNddwobOUJzm9HOUD8BMZJqkNCUCqstHZkC76FIdNg9AVjACAAAAAA4SEPY+qEZ2dCu/9485IEVybiM3Z7szXYM+izxklNm14AAzUxAH0AAAAFZAAgAAAAAHEzLtfmF/sBcYPPdj8867VmmQyU1xK9I/3Y0478azvABXMAIAAAAAAcmyFajZPnBTbO+oLInNwlApBocUekKkxz2hYFeSlQ+gVjACAAAAAA15ibZoBP1/pP27BDIfizDYNRDIpOmj8Ie34FvrtqjhMAAzUyAH0AAAAFZAAgAAAAAJam7JYsZe2cN20ZYm2W3v1pisNt5PLiniMzymBLWyMtBXMAIAAAAABxCsKVMZMTn3n+R2L7pVz5nW804r8HcK0mCBw3jUXKXAVjACAAAAAAElCgoMRrtlONqnyosjIpiz4mQTLq3+b/JUCVEq4QFiAAAzUzAH0AAAAFZAAgAAAAAMXrXx0saZ+5gORmwM2FLuZG6iuO2YS+1IGPoAtDKoKBBXMAIAAAAADIQsxCr8CfFKaBcx8kIeSywnGh7JHjKRJ9vJd9x79y7wVjACAAAAAAPzOTJ088k9QdGUpZ1ubUdkw3pTGkNF8bui4a9wqeo08AAzU0AH0AAAAFZAAgAAAAACbzcUD3INSnCRspOKF7ubne74OK9L0FTZvi9Ay0JVDYBXMAIAAAAADPebVQH8Btk9rhBIoUOdSAdpPvz7qIY4UC2i6IGisSAQVjACAAAAAAe4zSAgMQPjtz2t1DgxW1XOlV+fnNMXt6iQ7iV7DgQz4AAzU1AH0AAAAFZAAgAAAAACUc2CtD1MK/UTxtv+8iA9FoHEyTwdl43HKeSwDw2Lp5BXMAIAAAAACCIduIdw65bQMzRYRfjBJj62bc69T4QqH4QoWanwlvowVjACAAAAAA+i6aTnkoixxSOxDgQM/aWTylOy1m0ViCDU5asOM5ieYAAzU2AH0AAAAFZAAgAAAAAHSaHWs/dnmI9sc7nB50VB2Bzs0kHapMHCQdyVEYY30TBXMAIAAAAACkV22lhEjWv/9/DubfHBAcwJggKI5mIbSK5L2nyqloqQVjACAAAAAA1I5pLbnlFf/EfJlhE0RFIioDjzKrWNh4TO8H/ksrbMcAAzU3AH0AAAAFZAAgAAAAAAL8jhNBG0KXXZhmZ0bPXtfgapJCB/AI+BEHB0eZ3C75BXMAIAAAAADHx/fPa639EBmGV5quLi8IQT600ifiKSOhTDOK19DnzwVjACAAAAAANfWpWWy9iu7pgMEy2aVCggGEtJtXKQG1+3zCf8D6iEkAAzU4AH0AAAAFZAAgAAAAAAxgeclNl09H7HvzD1oLwb2YpFca5eaX90uStYXHilqKBXMAIAAAAACMU5pSxzIzWlQxHyW170Xs9EhD1hURASQk+qkx7K5Y6AVjACAAAAAA/kYlJPSFn2g1l7cy6djV/7wgnlPWphZ0IKSY8uenUF0AAzU5AH0AAAAFZAAgAAAAABmO7QD9vxWMmFjIHz13lyOeV6vHT6mYCsWxF7hb/yOjBXMAIAAAAACT9lmgkiqzuWG24afuzYiCeK9gmJqacmxAruIukd0xEAVjACAAAAAAyiZxtuOZQNSit4wFMJS3jnqLbDzyJ0OtDTKs6r0EO0cAAzYwAH0AAAAFZAAgAAAAAB89SjLtDJkqEghRGyj6aQ/2qvWLNuMROoXmzbYbCMKMBXMAIAAAAAC8sywgND+CjhVTF6HnRQeay8y9/HnVzDI42dEPah28LQVjACAAAAAAzBj8q9Ig4uhIc6rhNDVX1lII9lzfhJ0+ig8viBhdrtQAAzYxAH0AAAAFZAAgAAAAABN2alGq9Aats1mwERNGwL/fIwZSvVCe9/8XMHTFlpUpBXMAIAAAAACuDPjJgvvbBYhbLpjMiWUCsVppiYrhvR+yMysNPN8cZAVjACAAAAAAqcsLIvb3Pe/QKYB9wQ86Ye2OFSAJEIY4ve7LMM3SwGMAAzYyAH0AAAAFZAAgAAAAAL8YB6VAqGBiWD4CBv16IBscg5J7VQCTZu87n6pj+86KBXMAIAAAAAAmxm8e68geeyAdUjSMWBHzUjneVB0pG9TBXIoE6467hAVjACAAAAAA9Kd65vKIUckNPvxl/HHNPJVnFHXyErp4qibmD7BloukAAzYzAH0AAAAFZAAgAAAAAL4yLkCTV5Dmxa5toBu4JT8ge/cITAaURIOuFuOtFUkeBXMAIAAAAAAXoFNQOMGkAj7qEJP0wQafmFSXgWGeorDVbwyOxWLIsgVjACAAAAAAaFrBx0xXIryTe7V/kX+jfPHd0057x7k7MxzDAzi0RpcAAzY0AH0AAAAFZAAgAAAAAEU8DoUp46YtYjNFS9kNXwdYxQ9IW27vCTb+VcqqfnKNBXMAIAAAAADe7vBOgYReE8X78k5ARuUnv4GmzPZzg6SbConf4L2G3wVjACAAAAAAOl/tartywd/fJj5DNRsVH/ml9tJ8KkkCbKObsFe8lHcAAzY1AH0AAAAFZAAgAAAAAPa4yKTtkUtySuWo1ZQsp2QXtPb5SYqzA5vYDnS1P6c0BXMAIAAAAADKnF58R1sXlHlsHIvCBR3YWW/qk54z9CTDhZydkD1cOQVjACAAAAAAfn/jP8K3QUILngCNkydHARyBvBHIFdaJjzV0EXsFruMAAzY2AH0AAAAFZAAgAAAAAN5WJnMBmfgpuQPyonmY5X6OdRvuHw4nhsnGRnFAQ95VBXMAIAAAAACwftzu7KVV1rmGKwXtJjs3cJ1gE3apr8+N0SAg1F2cHwVjACAAAAAAf0XyQQLd/HIYaf9EeAV0o2h12K1AV5piLCpZihznBXoAAzY3AH0AAAAFZAAgAAAAACHvDsaPhoSb6DeGnKQ1QOpGYAgK82qpnqwcmzSeWaJHBXMAIAAAAABRq3C5+dOfnkAHM5Mg5hPB3O4jhwQlBgQWLA7Ph5bhgwVjACAAAAAAm2Ukk5kkQp+PDpBCCefQOqFKKZie4hINim3yvtypsEAAAzY4AH0AAAAFZAAgAAAAAOBePJvccPMJmy515KB1AkXF5Pi8NOG4V8psWy0SPRP+BXMAIAAAAAB3dOJG9xIDtEKCRzeNnPS3bFZepMj8UKBobKpSoCPqpgVjACAAAAAAnu33SngYPOtRgdJ3aBBuxWn80ti3OO6nZJcI6eh0VfQAAzY5AH0AAAAFZAAgAAAAABUvRrDQKEXLMdhnzXRdhiL6AGNs2TojPky+YVLXs+JnBXMAIAAAAAD1kYicbEEcPzD4QtuSYQQWDPq8fuUWGddpWayKn3dT9QVjACAAAAAAUc5dxcbNYY3qMO8+Xm2xis+pH9NjPLrHqHenwDEImAEAAzcwAH0AAAAFZAAgAAAAAOvSnpujeKNen4pqc2HR63C5s5oJ1Vf4CsbKoYQvkwl5BXMAIAAAAACw2+vAMdibzd2YVVNfk81yXkFZP0WLJ82JBxJmXnYE+QVjACAAAAAAnmej008JFQAgdImjk26PYvqdATjRYRufLi+vEVVwtucAAzcxAH0AAAAFZAAgAAAAAAo0xfGG7tJ3GWhgPVhW5Zn239nTD3PadShCNRc9TwdNBXMAIAAAAADZh243oOhenu0s/P/5KZLBDh9ADqKHtSWcXpO9D2sIjgVjACAAAAAAhpNHI4+aRdWHCvZfEjlgpRBz36g05wN9p/hj3NEwc7EAAAVlACAAAAAA65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+wSY20AAAAAAAAAAAAAEHBheWxvYWRJZAAAAAAAEGZpcnN0T3BlcmF0b3IAAQAAAAA=",
+ "subType": "06"
+ }
+ }
+ }
+ },
+ "update": {
+ "$set": {
+ "encryptedDouble": {
+ "$$type": "binData"
+ }
+ }
+ },
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDouble",
+ "bsonType": "double",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ ]
+ }
+ },
+ "deleteTokens": {
+ "default.default": {
+ "encryptedDouble": {
+ "e": {
+ "$binary": {
+ "base64": "65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+w=",
+ "subType": "00"
+ }
+ },
+ "o": {
+ "$binary": {
+ "base64": "noN+05JsuO1oDg59yypIGj45i+eFH6HOTXOPpeZ//Mk=",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "command_name": "findAndModify"
+ }
+ }
+ ],
+ "outcome": {
+ "collection": {
+ "data": [
+ {
+ "_id": 0,
+ "encryptedDouble": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6YrBn2ofIw1b5ooakrLOwF41BWrps8OO0H9WH4/rtlE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "n+XAuFnP8Dov9TnhGFxNx0K/MnVM9WbJ7RouEu0ndO0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yRXojuVdn5GQtD97qYlaCL6cOLmZ7Cvcb3wFjkLUIdM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "DuIkdRPITRs55I4SZmgomAHCIsDQmXRhW8+MOznkzSk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SsBk+Et1lTbU+QRPx+xyJ/jMkmfG+QCvQEpip2YYrzA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "crCIzOd8KhHvvUlX7M1v9bhvU4pLdTc+X2SuqoKU5Ek=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YOWdCw4UrqnxkAaVjqmC4sKQDMVMHEpFGnlxpxdaU6E=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "M3SShp81Ff8tQ632qKbv9MUcN6wjDaBReI0VXNu6Xh4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "gzHlSPxpM0hT75kQvWFzGlOxKvDoiKQZOr19V6l2zXI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "s3JnppOGYw9SL2Q1kMAZs948v2F5PrpXjGei/HioDWs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cG6+3Gk/zEH68P/uuuwiAUVCuyJwa1LeV+t29FlPPAo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dupdvR3AyJtM+g9NDKiaLVOtGca387JQp8w+V03m7Ig=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JqEQc5svj2jTvZ6LLA5ivE+kTb/0aRemSEmxk4G7Zrg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "szcXXXKnob+p3SoM4yED2R920LeJ7cVsclPMFTe4CeI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "o1QoGVXmuBdHwHm7aCtGMlMVKrjFdYvJXpoq6uhIAZ0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Jfm5wPlqqLCJRGQIqRq2NGmpn7s0Vrih2H3YAOoI2YU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zMHLb8ARbsYo8Ld05bqnGFf1Usha6EGb8QKwdSAyps0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yQdtq9lh5pugL7/i0Bj/PuZUUBUIzf+7wj1rl5y736w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wGWVZdO7qIuyDg/BqDgqjgoQ02h5YYgwXQB1oCin2NE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "by9HMLj6NTEpgztZ5HSN6GxImkXPcaFINYDzgZY33X8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tWo0vbasi7bXmn/MsOx13VC1IsWtpx/nYp0uj4iMzdA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tQQpndUYd5O87lOtrGjH3wl9VsOK0ray7RMasL90sBM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cQjXEDCMsOpKLLf+vlTgIHA+cbSJdzqhbSX9Wvh95aA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "7yMpU48IxK9SzP2cx3VnTownGEwFmeFofuuFT97SuuY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kSOx1kz0CmBgzKQHZlo65ZUY1DIv9A99JRm+Us2y6Ew=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ubQpdPBe6/xvtr+AcXdfYLSvYCR4ot0tivehkCsupb4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xal+iCJ6FTefRQToyoNksc9NCZShyn04NDGi4IYrcoM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "d7jU4iOK50xHxlkSifcxlZFCM46TSgQzoYivxG3HNLY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tJvl2nsBLBVzL3pp6sKWCL4UXeh3q/roYBJjSb74ve0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "OIUCaKRvIx9t1w6Hxlz1IcQTdPNCfdRNwnnTm10W+X0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "A9tvzsiElotOUVIB4CqfQp9mAwqvTM35YkmAR170aHA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lI8gpK7hpb7c9x4RQugsxMnQay5LZJmwslZdvMx/dcE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dNCzh40U0XvdKnSDi3HRQOWQftEsDVqc4uUvsVFGoq8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "IP+iwEBWBwVVZIdpaMu8k5+soFCz+TZkYn3drKZ9grE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pnqyh6e0y5svHkJDShlN9CHV0WvMBE4QbtJpQw5ZCXc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "elEl42tbVDoRTLjAhZUFEtXiut4b3PVhg/1ZLZSQdtE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "vHuu2FxwclMHqyE6JBYbTYgbEkB0dqb/JuaxsvfwsmY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xTf7NCe3Gf8QpE78HR5OknlLTKfs9J+RN9UZpH6fnso=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "XiWSasRnJAulGR6+LCVD3mwRObXylqYWR9jvpywq12c=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "MZMxEQ5ikx0PG1YFIExv0UnTZogsvgeOEZTpzvBDn4w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yZMyMZBDrWbAhvnic7vvIYhmO9m5H2iuv0c8KNZrBzY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xxM14hTPY5j0vvcK2C7YAEjzdsfUTFHozHC0hEo1bxI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+01rqR1xVwkpGXcstbk1ItJqFVjH6Q8MGxEN3Cm9Y1A=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xOpLV0Z2VTRJ3iWtnWZcsyjXubTIkYWo31cO+HV1o1k=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "BWUOLqgLBqc5NwxVlSV5H3KFQPXbCp7mdo+jF+8cJqY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "fuQb1S6xZDGlrEbK+kI23aL53PP1PVNwqICnZNt9Yzg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SfscnoibFttahLdPVC4Ee+47ewGFKpDSU7M6HX19bKE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rpSW2awybNVeKtat91VFxqbINoTfNhPfQAu+d73Xtf8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "9M/CP9ccOIIj2LLFmE0GFDO0Ban2wsNalEXfM6+h+1s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "WrEMG49l1ye4MhXs5ZS9tz8P6h+hDvthIg/2wW9ne1Q=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ImNhbfeyfH8qIEeA5ic0s3dAQBdzzTBS+CPsNih9vZ0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dWP33YDSn04UKJN2ogh2Rui0iW/0q2y18OCDRVcfyoo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lYv0isAtfGh6H9tdp3cp2eHU7q2J+uk7QrgcxtK3w7Y=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "VGMoamB/+7zTOYcY/pqJc96xlv2PdW4hwsIAEIslTDQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yNeBWMF7BnD9wVwz2PgJsvWr77QiVvvWUvJF0+fqBug=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SfpvObJ+tJBXSvqeN7vlOfmhYign635lciYAJIjUtY8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dsen4NqjzVGjpjufiTMs3+gqeD09EbnuogPgxrJECwg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pxCWVM3sn19NsFEpgHbgLa+PmYlhN3mMiP0Wk8kJhYw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q11KNvJszjYIB9n9HcC+N4uz11a3eRj1L3BH9scKMDQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "A1PmkgcEToWh1JiVWE6mI5jUu7poxWWuCUt/cgRUUDc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "qJo3Hu4PJeanL7XEaWXO/n3YsodhZyd+MJOOmB9Kpd8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "BkBKLO8URFscfRY9Bav/1+L9mLohDgNr/MkZtGiraIs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rZq5WA3Hx3xthOyHAJXK//f8pE2qbz7YKu3TIMp9GFY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "X07a/Lm80p5xd4RFs1dNmw+90tmPDPdGiAKVZkxd4zY=",
+ "subType": "00"
+ }
+ }
+ ]
+ },
+ {
+ "_id": 1,
+ "encryptedDouble": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "DLCAJs+W2PL2DV5YChCL6dYrQNr+j4p3L7xhVaub4ic=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "HI88j1zrIsFoijIXKybr9mYubNV5uVeODyLHFH4Ueco=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wXVD/HSbBljko0jJcaxJ1nrzs2+pchLQqYR3vywS8SU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "KhscCh+tt/pp8lxtKZQSPPUU94RvJYPKG/sjtzIa4Ws=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RISnuNrTTVNW5HnwCgQJ301pFw8DOcYrAMQIwVwjOkI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Ra5zukLh2boua0Bh74qA+mtIoixGXlsNsxiJqHtqdTI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "eqr0v+NNWXWszi9ni8qH58Q6gw5x737tJvH3lPaNHO4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "d42QupriWIwGrFAquXNFi0ehEuidIbHLFZtg1Sm2nN8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "2azRVxaaTIJKcgY2FU012gcyP8Y05cRDpfUaMnCBaQU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "3nlgkM4K/AAcHesRYYdEu24UGetHodVnVfHzw4yxZBM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hqy91FNmAAac2zUaPO6eWFkx0/37rOWGrwXN+fzL0tU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "akX+fmscSDSF9pB5MPj56iaJPtohr0hfXNk/OPWsGv8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "1ZvUb10Q7cN4cNLktd5yNjqgtawsYnkbeVBZV6WuY/I=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "otCwtuKiY4hCyXvYzXvo10OcnzZppebo38KsAlq49QM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Mty8EscckeT/dhMfrPFyDbLnmMOcYRUQ3mLK4KTu6V8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tnvgLLkJINO7csREYu4dEVe1ICrBeu7OP+HdfoX3M2E=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kOefsHgEVhkJ17UuP7Dxogy6sAQbzf1SFPKCj6XRlrQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "F+JQ79xavpaHdJzdhvwyHbzdZJLNHAymc/+67La3gao=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "NCZ9zp5rDRceENuSgAfTLEyKg0YgmXAhK0B8WSj7+Pw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wL1CJ7cYR5slx8mHq++uMdjDfkt9037lQTUztEMF56M=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "txefkzTMITZE+XvvRFZ7QcgwDT/7m8jNmxRk4QBaoZI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "jFunW3v1tSYMyZtQQD28eEy9qqDp4Kqo7gMN29N4bfQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "QMO915KUiS3X3R1bU1YoafVM2s0NeHo3EjgTA9PnGwY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "nwdKJEXdilzvb7494vbuDJ+y6SrfJahza1dYIsHIWVI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "vpWMX+T/VXXajFo0UbuYjtp0AEzBU0Y+lP+ih2EQ7mg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "1lmzG0J1DhKDRhhq5y5Buygu4G8eV2X0t7kUY90EohM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SiKqpXqO0trwhFvBWK274hMklpCgMhNs/JY84yyn/NE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "7cPGPYCKPTay+ZR9Gx6oOueduOgaFrSuAXmNDpDHXdI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "4THEYvAkjs2Fh7FIe5LC45P4i4N0L7ob67UOVbhp6Nk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "B+UGsChLLZR7iqnt8yq91OgmTgwiUKTJhFxY4NT0O6c=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "X1uYwBCsCg1H+PnKdwtBqXlt0zKEURi8bOM940GcPfk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xYOgT5l7shlNXCwHlguovmDkcEnF8dXyYlTyYrgZ8GE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "vFMTZqV8bh1+gcKzTkXweMddJlgdUnwX0DWzUUaMok4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "4HI0y9FrtleZxZ7M6INdNhLelrQ2Rv/+ykWCBl+tMC8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "jpJ0bBE474OUkn1vUiLWumIBtYmwc7J5+LQU/nyeLQc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "jQTPeXZvdxY/DjtPfYfKUArIDsf0E9MVFy2O26sv1ec=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "QLLto0ExR2ZYMGqlyaMZc/hXFFTlwmgtKbiVq/xJIeI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yBJNviU1nchbGbhx6InXCVRXa90sEepz1EwbYuKXu2U=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "jpEf0vHxrPu9gTJutNXSi2g/2Mc4WXFEN7yHonZEb7A=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "E09kLFckMYwNuhggMxmPtwndyvIAx+Vl+b2CV6FP75s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "N+ue6/cLPb5NssmJCCeo18LlbKPz6r2z20AsnTKRvOo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yVQNZP8hhsvNGyDph2QP2qTNdXZTiIEVineKg+Qf33o=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cSC9uI+9c5S8X+0G7amVyug1p0ZlgBsbEDYYyezBevQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "1NpZGjoQzuQtekj80Rifxe9HbE08W07dfwxaFHaVn84=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "5Ghuq/8l11Ug9Uf/RTwf9On3OxOwIXUcb9soiy4J7/w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "0LWKaEty6ywxLFhDaAqulqfMnYc+tgPfH4apyEeKg80=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "OwSthmCBtt6NIAoAh7aCbj82Yr/+9t8U7WuBQhFT3AQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "iYiyg6/1isqbMdvFPIGucu3cNM4NAZNtJhHpGZ4eM+c=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "waBgs8jWuGJPIF5zCRh6OmIyfK5GCBQgTMfmKSR2wyY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "1Jdtbe2BKJXPU2G9ywOrlODZ/cNYEQlKzAW3aMe1Hy4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xaLEnNUS/2ySerBpb9dN/D31t+wYcKekwTfkwtni0Mc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "bIVBrOhOvr6cL55Tr24+B+CC9MiG7U6K54aAr2IXXuw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6Cdq5wroGu2TEFnekuT7LhOpd/K/+PcipIljcHU9QL4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "K5l64vI4S/pLviLW6Pl0U3iQkI3ge0xg4RAHcEsyKJo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "bzhuvZ0Ls22yIOX+Hz51eAHlSuDbWR/e0u4EhfdpHbc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Qv+fr6uD4o0bZRp69QJCFL6zvn3G82c7L+N1IFzj7H0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "XAmISMbD3aEyQT+BQEphCKFNa0F0GDKFuhM9cGceKoQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "4VLCokntMfm1AogpUnYGvhV7nllWSo3mS3hVESMy+hA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xiXNLj/CipEH63Vb5cidi8q9X47EF4f3HtJSOH7mfM8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "4XlCYfYBjI9XA5zOSgTiEBYcZsdwyXL+f5XtH2xUIOc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "k6DfQy7ZYJIkEly2B5hjOZznL4NcgMkllZjJLb7yq7w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ZzM6gwWesa3lxbZVZthpPFs2s3GV0RZREE2zOMhBRBo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "US+jeMeeOd7J0wR0efJtq2/18lcO8YFvhT4O3DeaonQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "b6iSxiI1FM9SzxuG1bHqGA1i4+3GOi0/SPW00XB4L7o=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kn3LsxAVkzIZKK9I6fi0Cctr0yjXOYgaQWMCoj4hLpM=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ ]
+}
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-Double-FindOneAndUpdate.yml b/specifications/client-side-encryption/tests/legacy/fle2-Range-Double-FindOneAndUpdate.yml
new file mode 100644
index 00000000000..0b3d39dffa0
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-Double-FindOneAndUpdate.yml
@@ -0,0 +1,915 @@
+# Requires libmongocrypt 1.7.0.
+runOn:
+ - minServerVersion: "6.2.0"
+ # FLE 2 Encrypted collections are not supported on standalone.
+ topology: [ "replicaset", "sharded", "load-balanced" ]
+database_name: &database_name "default"
+collection_name: &collection_name "default"
+data: []
+encrypted_fields: &encrypted_fields {'escCollection': 'enxcol_.default.esc', 'eccCollection': 'enxcol_.default.ecc', 'ecocCollection': 'enxcol_.default.ecoc', 'fields': [{'keyId': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'path': 'encryptedDouble', 'bsonType': 'double', 'queries': {'queryType': 'rangePreview', 'contention': {'$numberLong': '0'}, 'sparsity': {'$numberLong': '1'}}}]}
+key_vault_data: [ {'_id': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'keyMaterial': {'$binary': {'base64': 'sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==', 'subType': '00'}}, 'creationDate': {'$date': {'$numberLong': '1648914851981'}}, 'updateDate': {'$date': {'$numberLong': '1648914851981'}}, 'status': {'$numberInt': '0'}, 'masterKey': {'provider': 'local'}} ]
+tests:
+ - description: "FLE2 Range Double. FindOneAndUpdate."
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments:
+ document: &doc0 { _id: 0, encryptedDouble: { $numberDouble: "0" } }
+ - name: insertOne
+ arguments:
+ document: &doc1 { _id: 1, encryptedDouble: { $numberDouble: "1" } }
+ - name: findOneAndUpdate
+ arguments:
+ filter: { encryptedDouble: { $gt: {$numberDouble: "0"}} }
+ update: { "$set": { "encryptedDouble": {$numberDouble: "2"}}}
+ returnDocument: Before
+ result: *doc1
+ expectations:
+ - command_started_event:
+ command:
+ listCollections: 1
+ filter:
+ name: *collection_name
+ command_name: listCollections
+ - command_started_event:
+ command:
+ find: datakeys
+ filter: {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ }
+ $db: keyvault
+ readConcern: { level: "majority" }
+ command_name: find
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc0_encrypted { "_id": 0, "encryptedDouble": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc1_encrypted { "_id": 1, "encryptedDouble": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ findAndModify: *collection_name
+ query: {
+ "encryptedDouble": {
+ "$gt": {
+ "$binary": {
+ "base64": "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",
+ "subType": "06"
+ }
+ }
+ }
+ }
+ update: { "$set": {"encryptedDouble": { $$type: "binData" }} }
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ "deleteTokens": {
+ "default.default": {
+ "encryptedDouble": {
+ "e": {
+ "$binary": {
+ "base64": "65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+w=",
+ "subType": "00"
+ }
+ },
+ "o": {
+ "$binary": {
+ "base64": "noN+05JsuO1oDg59yypIGj45i+eFH6HOTXOPpeZ//Mk=",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ command_name: findAndModify
+ outcome:
+ collection:
+ # Outcome is checked using a separate MongoClient without auto encryption.
+ data:
+ -
+ {
+ "_id": 0,
+ "encryptedDouble": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6YrBn2ofIw1b5ooakrLOwF41BWrps8OO0H9WH4/rtlE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "n+XAuFnP8Dov9TnhGFxNx0K/MnVM9WbJ7RouEu0ndO0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yRXojuVdn5GQtD97qYlaCL6cOLmZ7Cvcb3wFjkLUIdM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "DuIkdRPITRs55I4SZmgomAHCIsDQmXRhW8+MOznkzSk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SsBk+Et1lTbU+QRPx+xyJ/jMkmfG+QCvQEpip2YYrzA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "crCIzOd8KhHvvUlX7M1v9bhvU4pLdTc+X2SuqoKU5Ek=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YOWdCw4UrqnxkAaVjqmC4sKQDMVMHEpFGnlxpxdaU6E=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "M3SShp81Ff8tQ632qKbv9MUcN6wjDaBReI0VXNu6Xh4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "gzHlSPxpM0hT75kQvWFzGlOxKvDoiKQZOr19V6l2zXI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "s3JnppOGYw9SL2Q1kMAZs948v2F5PrpXjGei/HioDWs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cG6+3Gk/zEH68P/uuuwiAUVCuyJwa1LeV+t29FlPPAo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dupdvR3AyJtM+g9NDKiaLVOtGca387JQp8w+V03m7Ig=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JqEQc5svj2jTvZ6LLA5ivE+kTb/0aRemSEmxk4G7Zrg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "szcXXXKnob+p3SoM4yED2R920LeJ7cVsclPMFTe4CeI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "o1QoGVXmuBdHwHm7aCtGMlMVKrjFdYvJXpoq6uhIAZ0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Jfm5wPlqqLCJRGQIqRq2NGmpn7s0Vrih2H3YAOoI2YU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zMHLb8ARbsYo8Ld05bqnGFf1Usha6EGb8QKwdSAyps0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yQdtq9lh5pugL7/i0Bj/PuZUUBUIzf+7wj1rl5y736w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wGWVZdO7qIuyDg/BqDgqjgoQ02h5YYgwXQB1oCin2NE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "by9HMLj6NTEpgztZ5HSN6GxImkXPcaFINYDzgZY33X8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tWo0vbasi7bXmn/MsOx13VC1IsWtpx/nYp0uj4iMzdA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tQQpndUYd5O87lOtrGjH3wl9VsOK0ray7RMasL90sBM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cQjXEDCMsOpKLLf+vlTgIHA+cbSJdzqhbSX9Wvh95aA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "7yMpU48IxK9SzP2cx3VnTownGEwFmeFofuuFT97SuuY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kSOx1kz0CmBgzKQHZlo65ZUY1DIv9A99JRm+Us2y6Ew=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ubQpdPBe6/xvtr+AcXdfYLSvYCR4ot0tivehkCsupb4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xal+iCJ6FTefRQToyoNksc9NCZShyn04NDGi4IYrcoM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "d7jU4iOK50xHxlkSifcxlZFCM46TSgQzoYivxG3HNLY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tJvl2nsBLBVzL3pp6sKWCL4UXeh3q/roYBJjSb74ve0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "OIUCaKRvIx9t1w6Hxlz1IcQTdPNCfdRNwnnTm10W+X0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "A9tvzsiElotOUVIB4CqfQp9mAwqvTM35YkmAR170aHA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lI8gpK7hpb7c9x4RQugsxMnQay5LZJmwslZdvMx/dcE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dNCzh40U0XvdKnSDi3HRQOWQftEsDVqc4uUvsVFGoq8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "IP+iwEBWBwVVZIdpaMu8k5+soFCz+TZkYn3drKZ9grE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pnqyh6e0y5svHkJDShlN9CHV0WvMBE4QbtJpQw5ZCXc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "elEl42tbVDoRTLjAhZUFEtXiut4b3PVhg/1ZLZSQdtE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "vHuu2FxwclMHqyE6JBYbTYgbEkB0dqb/JuaxsvfwsmY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xTf7NCe3Gf8QpE78HR5OknlLTKfs9J+RN9UZpH6fnso=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "XiWSasRnJAulGR6+LCVD3mwRObXylqYWR9jvpywq12c=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "MZMxEQ5ikx0PG1YFIExv0UnTZogsvgeOEZTpzvBDn4w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yZMyMZBDrWbAhvnic7vvIYhmO9m5H2iuv0c8KNZrBzY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xxM14hTPY5j0vvcK2C7YAEjzdsfUTFHozHC0hEo1bxI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+01rqR1xVwkpGXcstbk1ItJqFVjH6Q8MGxEN3Cm9Y1A=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xOpLV0Z2VTRJ3iWtnWZcsyjXubTIkYWo31cO+HV1o1k=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "BWUOLqgLBqc5NwxVlSV5H3KFQPXbCp7mdo+jF+8cJqY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "fuQb1S6xZDGlrEbK+kI23aL53PP1PVNwqICnZNt9Yzg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SfscnoibFttahLdPVC4Ee+47ewGFKpDSU7M6HX19bKE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rpSW2awybNVeKtat91VFxqbINoTfNhPfQAu+d73Xtf8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "9M/CP9ccOIIj2LLFmE0GFDO0Ban2wsNalEXfM6+h+1s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "WrEMG49l1ye4MhXs5ZS9tz8P6h+hDvthIg/2wW9ne1Q=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ImNhbfeyfH8qIEeA5ic0s3dAQBdzzTBS+CPsNih9vZ0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dWP33YDSn04UKJN2ogh2Rui0iW/0q2y18OCDRVcfyoo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lYv0isAtfGh6H9tdp3cp2eHU7q2J+uk7QrgcxtK3w7Y=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "VGMoamB/+7zTOYcY/pqJc96xlv2PdW4hwsIAEIslTDQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yNeBWMF7BnD9wVwz2PgJsvWr77QiVvvWUvJF0+fqBug=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SfpvObJ+tJBXSvqeN7vlOfmhYign635lciYAJIjUtY8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dsen4NqjzVGjpjufiTMs3+gqeD09EbnuogPgxrJECwg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pxCWVM3sn19NsFEpgHbgLa+PmYlhN3mMiP0Wk8kJhYw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q11KNvJszjYIB9n9HcC+N4uz11a3eRj1L3BH9scKMDQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "A1PmkgcEToWh1JiVWE6mI5jUu7poxWWuCUt/cgRUUDc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "qJo3Hu4PJeanL7XEaWXO/n3YsodhZyd+MJOOmB9Kpd8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "BkBKLO8URFscfRY9Bav/1+L9mLohDgNr/MkZtGiraIs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rZq5WA3Hx3xthOyHAJXK//f8pE2qbz7YKu3TIMp9GFY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "X07a/Lm80p5xd4RFs1dNmw+90tmPDPdGiAKVZkxd4zY=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ -
+ {
+ "_id": 1,
+ "encryptedDouble": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "DLCAJs+W2PL2DV5YChCL6dYrQNr+j4p3L7xhVaub4ic=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "HI88j1zrIsFoijIXKybr9mYubNV5uVeODyLHFH4Ueco=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wXVD/HSbBljko0jJcaxJ1nrzs2+pchLQqYR3vywS8SU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "KhscCh+tt/pp8lxtKZQSPPUU94RvJYPKG/sjtzIa4Ws=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RISnuNrTTVNW5HnwCgQJ301pFw8DOcYrAMQIwVwjOkI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Ra5zukLh2boua0Bh74qA+mtIoixGXlsNsxiJqHtqdTI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "eqr0v+NNWXWszi9ni8qH58Q6gw5x737tJvH3lPaNHO4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "d42QupriWIwGrFAquXNFi0ehEuidIbHLFZtg1Sm2nN8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "2azRVxaaTIJKcgY2FU012gcyP8Y05cRDpfUaMnCBaQU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "3nlgkM4K/AAcHesRYYdEu24UGetHodVnVfHzw4yxZBM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hqy91FNmAAac2zUaPO6eWFkx0/37rOWGrwXN+fzL0tU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "akX+fmscSDSF9pB5MPj56iaJPtohr0hfXNk/OPWsGv8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "1ZvUb10Q7cN4cNLktd5yNjqgtawsYnkbeVBZV6WuY/I=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "otCwtuKiY4hCyXvYzXvo10OcnzZppebo38KsAlq49QM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Mty8EscckeT/dhMfrPFyDbLnmMOcYRUQ3mLK4KTu6V8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tnvgLLkJINO7csREYu4dEVe1ICrBeu7OP+HdfoX3M2E=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kOefsHgEVhkJ17UuP7Dxogy6sAQbzf1SFPKCj6XRlrQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "F+JQ79xavpaHdJzdhvwyHbzdZJLNHAymc/+67La3gao=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "NCZ9zp5rDRceENuSgAfTLEyKg0YgmXAhK0B8WSj7+Pw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wL1CJ7cYR5slx8mHq++uMdjDfkt9037lQTUztEMF56M=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "txefkzTMITZE+XvvRFZ7QcgwDT/7m8jNmxRk4QBaoZI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "jFunW3v1tSYMyZtQQD28eEy9qqDp4Kqo7gMN29N4bfQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "QMO915KUiS3X3R1bU1YoafVM2s0NeHo3EjgTA9PnGwY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "nwdKJEXdilzvb7494vbuDJ+y6SrfJahza1dYIsHIWVI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "vpWMX+T/VXXajFo0UbuYjtp0AEzBU0Y+lP+ih2EQ7mg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "1lmzG0J1DhKDRhhq5y5Buygu4G8eV2X0t7kUY90EohM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SiKqpXqO0trwhFvBWK274hMklpCgMhNs/JY84yyn/NE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "7cPGPYCKPTay+ZR9Gx6oOueduOgaFrSuAXmNDpDHXdI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "4THEYvAkjs2Fh7FIe5LC45P4i4N0L7ob67UOVbhp6Nk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "B+UGsChLLZR7iqnt8yq91OgmTgwiUKTJhFxY4NT0O6c=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "X1uYwBCsCg1H+PnKdwtBqXlt0zKEURi8bOM940GcPfk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xYOgT5l7shlNXCwHlguovmDkcEnF8dXyYlTyYrgZ8GE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "vFMTZqV8bh1+gcKzTkXweMddJlgdUnwX0DWzUUaMok4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "4HI0y9FrtleZxZ7M6INdNhLelrQ2Rv/+ykWCBl+tMC8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "jpJ0bBE474OUkn1vUiLWumIBtYmwc7J5+LQU/nyeLQc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "jQTPeXZvdxY/DjtPfYfKUArIDsf0E9MVFy2O26sv1ec=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "QLLto0ExR2ZYMGqlyaMZc/hXFFTlwmgtKbiVq/xJIeI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yBJNviU1nchbGbhx6InXCVRXa90sEepz1EwbYuKXu2U=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "jpEf0vHxrPu9gTJutNXSi2g/2Mc4WXFEN7yHonZEb7A=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "E09kLFckMYwNuhggMxmPtwndyvIAx+Vl+b2CV6FP75s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "N+ue6/cLPb5NssmJCCeo18LlbKPz6r2z20AsnTKRvOo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yVQNZP8hhsvNGyDph2QP2qTNdXZTiIEVineKg+Qf33o=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cSC9uI+9c5S8X+0G7amVyug1p0ZlgBsbEDYYyezBevQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "1NpZGjoQzuQtekj80Rifxe9HbE08W07dfwxaFHaVn84=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "5Ghuq/8l11Ug9Uf/RTwf9On3OxOwIXUcb9soiy4J7/w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "0LWKaEty6ywxLFhDaAqulqfMnYc+tgPfH4apyEeKg80=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "OwSthmCBtt6NIAoAh7aCbj82Yr/+9t8U7WuBQhFT3AQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "iYiyg6/1isqbMdvFPIGucu3cNM4NAZNtJhHpGZ4eM+c=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "waBgs8jWuGJPIF5zCRh6OmIyfK5GCBQgTMfmKSR2wyY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "1Jdtbe2BKJXPU2G9ywOrlODZ/cNYEQlKzAW3aMe1Hy4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xaLEnNUS/2ySerBpb9dN/D31t+wYcKekwTfkwtni0Mc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "bIVBrOhOvr6cL55Tr24+B+CC9MiG7U6K54aAr2IXXuw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6Cdq5wroGu2TEFnekuT7LhOpd/K/+PcipIljcHU9QL4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "K5l64vI4S/pLviLW6Pl0U3iQkI3ge0xg4RAHcEsyKJo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "bzhuvZ0Ls22yIOX+Hz51eAHlSuDbWR/e0u4EhfdpHbc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Qv+fr6uD4o0bZRp69QJCFL6zvn3G82c7L+N1IFzj7H0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "XAmISMbD3aEyQT+BQEphCKFNa0F0GDKFuhM9cGceKoQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "4VLCokntMfm1AogpUnYGvhV7nllWSo3mS3hVESMy+hA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xiXNLj/CipEH63Vb5cidi8q9X47EF4f3HtJSOH7mfM8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "4XlCYfYBjI9XA5zOSgTiEBYcZsdwyXL+f5XtH2xUIOc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "k6DfQy7ZYJIkEly2B5hjOZznL4NcgMkllZjJLb7yq7w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ZzM6gwWesa3lxbZVZthpPFs2s3GV0RZREE2zOMhBRBo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "US+jeMeeOd7J0wR0efJtq2/18lcO8YFvhT4O3DeaonQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "b6iSxiI1FM9SzxuG1bHqGA1i4+3GOi0/SPW00XB4L7o=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kn3LsxAVkzIZKK9I6fi0Cctr0yjXOYgaQWMCoj4hLpM=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
\ No newline at end of file
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-Double-InsertFind.json b/specifications/client-side-encryption/tests/legacy/fle2-Range-Double-InsertFind.json
new file mode 100644
index 00000000000..634230eacad
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-Double-InsertFind.json
@@ -0,0 +1,1129 @@
+{
+ "runOn": [
+ {
+ "minServerVersion": "6.2.0",
+ "topology": [
+ "replicaset",
+ "sharded",
+ "load-balanced"
+ ]
+ }
+ ],
+ "database_name": "default",
+ "collection_name": "default",
+ "data": [],
+ "encrypted_fields": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDouble",
+ "bsonType": "double",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ ]
+ },
+ "key_vault_data": [
+ {
+ "_id": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "keyMaterial": {
+ "$binary": {
+ "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==",
+ "subType": "00"
+ }
+ },
+ "creationDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "updateDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "status": {
+ "$numberInt": "0"
+ },
+ "masterKey": {
+ "provider": "local"
+ }
+ }
+ ],
+ "tests": [
+ {
+ "description": "FLE2 Range Double. Insert and Find.",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDouble": {
+ "$numberDouble": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDouble": {
+ "$numberDouble": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDouble": {
+ "$gt": {
+ "$numberDouble": "0"
+ }
+ }
+ }
+ },
+ "result": [
+ {
+ "_id": 1,
+ "encryptedDouble": {
+ "$numberDouble": "1"
+ }
+ }
+ ]
+ }
+ ],
+ "expectations": [
+ {
+ "command_started_event": {
+ "command": {
+ "listCollections": 1,
+ "filter": {
+ "name": "default"
+ }
+ },
+ "command_name": "listCollections"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "find": "datakeys",
+ "filter": {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ },
+ "$db": "keyvault",
+ "readConcern": {
+ "level": "majority"
+ }
+ },
+ "command_name": "find"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 0,
+ "encryptedDouble": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDouble",
+ "bsonType": "double",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 1,
+ "encryptedDouble": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDouble",
+ "bsonType": "double",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "find": "default",
+ "filter": {
+ "encryptedDouble": {
+ "$gt": {
+ "$binary": {
+ "base64": "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",
+ "subType": "06"
+ }
+ }
+ }
+ },
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDouble",
+ "bsonType": "double",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "find"
+ }
+ }
+ ],
+ "outcome": {
+ "collection": {
+ "data": [
+ {
+ "_id": 0,
+ "encryptedDouble": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6YrBn2ofIw1b5ooakrLOwF41BWrps8OO0H9WH4/rtlE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "n+XAuFnP8Dov9TnhGFxNx0K/MnVM9WbJ7RouEu0ndO0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yRXojuVdn5GQtD97qYlaCL6cOLmZ7Cvcb3wFjkLUIdM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "DuIkdRPITRs55I4SZmgomAHCIsDQmXRhW8+MOznkzSk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SsBk+Et1lTbU+QRPx+xyJ/jMkmfG+QCvQEpip2YYrzA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "crCIzOd8KhHvvUlX7M1v9bhvU4pLdTc+X2SuqoKU5Ek=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YOWdCw4UrqnxkAaVjqmC4sKQDMVMHEpFGnlxpxdaU6E=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "M3SShp81Ff8tQ632qKbv9MUcN6wjDaBReI0VXNu6Xh4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "gzHlSPxpM0hT75kQvWFzGlOxKvDoiKQZOr19V6l2zXI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "s3JnppOGYw9SL2Q1kMAZs948v2F5PrpXjGei/HioDWs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cG6+3Gk/zEH68P/uuuwiAUVCuyJwa1LeV+t29FlPPAo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dupdvR3AyJtM+g9NDKiaLVOtGca387JQp8w+V03m7Ig=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JqEQc5svj2jTvZ6LLA5ivE+kTb/0aRemSEmxk4G7Zrg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "szcXXXKnob+p3SoM4yED2R920LeJ7cVsclPMFTe4CeI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "o1QoGVXmuBdHwHm7aCtGMlMVKrjFdYvJXpoq6uhIAZ0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Jfm5wPlqqLCJRGQIqRq2NGmpn7s0Vrih2H3YAOoI2YU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zMHLb8ARbsYo8Ld05bqnGFf1Usha6EGb8QKwdSAyps0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yQdtq9lh5pugL7/i0Bj/PuZUUBUIzf+7wj1rl5y736w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wGWVZdO7qIuyDg/BqDgqjgoQ02h5YYgwXQB1oCin2NE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "by9HMLj6NTEpgztZ5HSN6GxImkXPcaFINYDzgZY33X8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tWo0vbasi7bXmn/MsOx13VC1IsWtpx/nYp0uj4iMzdA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tQQpndUYd5O87lOtrGjH3wl9VsOK0ray7RMasL90sBM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cQjXEDCMsOpKLLf+vlTgIHA+cbSJdzqhbSX9Wvh95aA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "7yMpU48IxK9SzP2cx3VnTownGEwFmeFofuuFT97SuuY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kSOx1kz0CmBgzKQHZlo65ZUY1DIv9A99JRm+Us2y6Ew=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ubQpdPBe6/xvtr+AcXdfYLSvYCR4ot0tivehkCsupb4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xal+iCJ6FTefRQToyoNksc9NCZShyn04NDGi4IYrcoM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "d7jU4iOK50xHxlkSifcxlZFCM46TSgQzoYivxG3HNLY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tJvl2nsBLBVzL3pp6sKWCL4UXeh3q/roYBJjSb74ve0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "OIUCaKRvIx9t1w6Hxlz1IcQTdPNCfdRNwnnTm10W+X0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "A9tvzsiElotOUVIB4CqfQp9mAwqvTM35YkmAR170aHA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lI8gpK7hpb7c9x4RQugsxMnQay5LZJmwslZdvMx/dcE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dNCzh40U0XvdKnSDi3HRQOWQftEsDVqc4uUvsVFGoq8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "IP+iwEBWBwVVZIdpaMu8k5+soFCz+TZkYn3drKZ9grE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pnqyh6e0y5svHkJDShlN9CHV0WvMBE4QbtJpQw5ZCXc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "elEl42tbVDoRTLjAhZUFEtXiut4b3PVhg/1ZLZSQdtE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "vHuu2FxwclMHqyE6JBYbTYgbEkB0dqb/JuaxsvfwsmY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xTf7NCe3Gf8QpE78HR5OknlLTKfs9J+RN9UZpH6fnso=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "XiWSasRnJAulGR6+LCVD3mwRObXylqYWR9jvpywq12c=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "MZMxEQ5ikx0PG1YFIExv0UnTZogsvgeOEZTpzvBDn4w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yZMyMZBDrWbAhvnic7vvIYhmO9m5H2iuv0c8KNZrBzY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xxM14hTPY5j0vvcK2C7YAEjzdsfUTFHozHC0hEo1bxI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+01rqR1xVwkpGXcstbk1ItJqFVjH6Q8MGxEN3Cm9Y1A=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xOpLV0Z2VTRJ3iWtnWZcsyjXubTIkYWo31cO+HV1o1k=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "BWUOLqgLBqc5NwxVlSV5H3KFQPXbCp7mdo+jF+8cJqY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "fuQb1S6xZDGlrEbK+kI23aL53PP1PVNwqICnZNt9Yzg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SfscnoibFttahLdPVC4Ee+47ewGFKpDSU7M6HX19bKE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rpSW2awybNVeKtat91VFxqbINoTfNhPfQAu+d73Xtf8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "9M/CP9ccOIIj2LLFmE0GFDO0Ban2wsNalEXfM6+h+1s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "WrEMG49l1ye4MhXs5ZS9tz8P6h+hDvthIg/2wW9ne1Q=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ImNhbfeyfH8qIEeA5ic0s3dAQBdzzTBS+CPsNih9vZ0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dWP33YDSn04UKJN2ogh2Rui0iW/0q2y18OCDRVcfyoo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lYv0isAtfGh6H9tdp3cp2eHU7q2J+uk7QrgcxtK3w7Y=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "VGMoamB/+7zTOYcY/pqJc96xlv2PdW4hwsIAEIslTDQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yNeBWMF7BnD9wVwz2PgJsvWr77QiVvvWUvJF0+fqBug=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SfpvObJ+tJBXSvqeN7vlOfmhYign635lciYAJIjUtY8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dsen4NqjzVGjpjufiTMs3+gqeD09EbnuogPgxrJECwg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pxCWVM3sn19NsFEpgHbgLa+PmYlhN3mMiP0Wk8kJhYw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q11KNvJszjYIB9n9HcC+N4uz11a3eRj1L3BH9scKMDQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "A1PmkgcEToWh1JiVWE6mI5jUu7poxWWuCUt/cgRUUDc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "qJo3Hu4PJeanL7XEaWXO/n3YsodhZyd+MJOOmB9Kpd8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "BkBKLO8URFscfRY9Bav/1+L9mLohDgNr/MkZtGiraIs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rZq5WA3Hx3xthOyHAJXK//f8pE2qbz7YKu3TIMp9GFY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "X07a/Lm80p5xd4RFs1dNmw+90tmPDPdGiAKVZkxd4zY=",
+ "subType": "00"
+ }
+ }
+ ]
+ },
+ {
+ "_id": 1,
+ "encryptedDouble": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "bE1vqWj3KNyM7cCYUv/cnYm8BPaUL3eMp5syTHq6NF4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "2FIZh/9N+NeJEQwxYIX5ikQT85xJzulBNReXk8PnG/s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "I93Md7QNPGmEEGYU1+VVCqBPBEvXdqHPtTJtMOn06Yk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "GecBFQ1PemlECWZWCl7f74vmsL6eB6mzQ9n6tK6FYfs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "QpjhZl+O1ORifgtCZuWAdcP6OKL7IZ2cA46v8FJcV28=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FWXI/yZ1M+2fIboeMCDMlp+I2NwPQDtoM/wWselOPYw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "uk26nvN/LdRLaBphiBgIZzT0sSpoO1z0RdDWRm/xrSA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hiiYSH1KZovAULc7rlmEU74wCjzDR+mm6ZnsgvFQjMw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hRzvMvWPX0sJme+wck67lwbKDFaWOa+Eyef+JSdc1s4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "PSx5D+zqC9c295dguX4+EobT4IEzfffdfjzC8DWpB5Q=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "QzfXQCVTjPQv2h21v95HYPq8uCsVJ2tPnjv79gAaM9M=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "XcGDO/dlTcEMLqwcm55UmOqK+KpBmbzZO1LIzX7GPaQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Lf+o4E7YB5ynzUPC6KTyW0lj6Cg9oLIu1Sdd1ODHctA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wAuVn02LAVo5Y+TUocvkoenFYWzpu38k0NmGZOsAjS4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yJGDtveLbbo/0HtCtiTSsvVI/0agg/U1bFaQ0yhK12o=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "KsEy0zgYcmkM+O/fWF9z3aJGIk22XCk+Aw96HB6JU68=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "p+AnMI5ZxdJMSIEJmXXya+FeH5yubmOdViwUO89j0Rc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "/jLix56jzeywBtNuGw55lCXyebQoSIhbful0hOKxKDY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "fvDvSPomtJsl1S3+8/tzFCE8scHIdJY5hB9CdTEsoFo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "oV5hOJzPXxfTuRdKIlF4uYEoMDuqH+G7/3qgndDr0PM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "3ALwcvLj3VOfgD6OqXAO13h1ZkOv46R6+Oy6SUKh53I=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "gxaB9FJj0IM+InhvAjwWaex3UIZ9SAnDiUd5WHSY/l0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "66NPvDygJzKJqddfNuDuNOpvGajjFRtvhkwfUkiYmXw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "1dWcQIocRAcO9XnXYqbhl83jc0RgjQpsrWd8dC27trg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "npos0Uf1DT3ztSCjPVY9EImlRnTHB1KLrvmVSqBQ/8E=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "TEI9qBx/tK1l1H0v1scMG8Srmtwo5VxWHADPBSlWrXk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "3wUN2ypQKoj+5ASkeIK9ycxhahVxyTmGopigoUAlyYs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "o/oksSnUS+nIq6ozWTbB5bJh+NoaPj8deAA23uxiWCk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "KExYPruhA31e8xuSwvfUfDcyY/H2Va6taUd0k4yFgLc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "/x+dNfxdd/lkx8Z8VZVfoYl7LPoaZ/iKEzZXBrAtIJc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "DE4cmjFLPqZlmRomO0qQiruUBtzoCe8ZdNRcfNH92pU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "M6EKNcLPw/iojAChgYUSieaBYWcbsjKtB94SaHOr8vk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+qP49lDPeyhaduTvXJgtJEqHNEYANVu9Bg3Bxz7Td9w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ruMrC2VIS+VKbJwCFb3bfkaLTju9nE+yPONV9s0M0Vo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "EbjDlSB5JKnDKff4d8hOmaOwJ7B9Q6NQFisLj+DPC+0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "C/yYOTB94edyqAbiQNu8/H7FoG3yRRjHDkMykz4+Mv0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CBxqrejG+qQQq2YTd6iP/06kiu2CxxzBFaZK3Ofb1CM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "2ZOQ/fpho+AbDENWBZaln7wRoepIRdhyT648dr8O5cU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "EghIgEPz01+myPgj8oid+PgncvobvC7vjvG3THEEQ0M=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "92CysZYNF8riwAMhdrIPKxfODw9p07cKQy/Snn8XmVY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "VO0LeTBQmsEf7sCHzTnZwUPNTqRZ49R8V5E9XnZ/5N4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "exs8BQMJq7U6ZXYgIizT7XN+X/hOmmn4YEuzev9zgSI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "qHpS4k1I+gPniNp4CA8TY8lLN36vBYmgbKMFpbYMEqg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+7lWKCKAWFw6gPZdHE6E8KIfI14/fSvtWUmllb5WLi0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YiH/US0q6679hWblFDDKNqUjCgggoU8sUCssTIF1QbU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YgwkKElEubNfvXL9hJxzqQUQtHiXN/OCGxNL1MUZZlM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hZFST4INZTTuhvJlGJeMwlUAK270UCOTCDeBAnN4a7g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "24I1Zw35AuGnK3CqJhbCwYb0IPuu5sCRrM5iyeITOLc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "vgD12JB4Q1S/kGPSQ1KOgp386KnG1GbM/5+60oRGcGw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+wNE+OL+CB9d4AUJdVxd56jUJCAXmmk9fapuB2TAc4g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "uhQh1B2Pe4RkNw/kPEcgaLenuikKoRf1iyfZhpXdodc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "eu8gjAUIp8ybO204AgeOq5v1neI1yljqy5v3I6lo1lM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "7QG6oVbASBAjrnCPxzzUNnuFSFNlKhbuBafkF8pr7Is=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "PUS1xb2oHSDTdYltutoSSxBiJ1NjxH3l2kA4P1CZLEs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "XPMh/JDC/O93gJJCwwgJDb8ssWZvRvezNmKmyn3nIfk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "jWz+KGwMk/GOvFAK2rOxF3OjxeZAWfmUQ1HGJ7icw4A=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "o7XbW68pc6flYigf3LW4WAGUWxpeqxaQLkHUhUR9RZ8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "nqR+g60+5U0okbqJadSqGgnC+j1JcP8rwMcfzOs2ACI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Hz43qVK95tSfbYFtaE/8fE97XMk1RiO8XpWjwZHB80o=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "noZUWlZ8M6KXU5rkifyo8/duw5IL7/fXbJvT7bNmW9k=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "WONVHCuPSanXDRQQ/3tmyJ0Vq+Lu/4hRaMUf0g0kSuw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "UEaj6vQRoIghE8Movd8AGXhtwIOXlP4cBsECIUvE5Y8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "D3n2YcO8+PB4C8brDo7kxKjF9Y844rVkdRMLTgsQkrw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "C+YA0G9KjxZVaWwOMuh/dcnHnHAlYnbFrRl0IEpmsY0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rUnmbmQanxrbFPYYrwyQ53x66OSt27yAvF+s48ezKDc=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ ]
+}
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-Double-InsertFind.yml b/specifications/client-side-encryption/tests/legacy/fle2-Range-Double-InsertFind.yml
new file mode 100644
index 00000000000..87f3f05d0b0
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-Double-InsertFind.yml
@@ -0,0 +1,893 @@
+# Requires libmongocrypt 1.7.0.
+runOn:
+ - minServerVersion: "6.2.0"
+ # FLE 2 Encrypted collections are not supported on standalone.
+ topology: [ "replicaset", "sharded", "load-balanced" ]
+database_name: &database_name "default"
+collection_name: &collection_name "default"
+data: []
+encrypted_fields: &encrypted_fields {'escCollection': 'enxcol_.default.esc', 'eccCollection': 'enxcol_.default.ecc', 'ecocCollection': 'enxcol_.default.ecoc', 'fields': [{'keyId': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'path': 'encryptedDouble', 'bsonType': 'double', 'queries': {'queryType': 'rangePreview', 'contention': {'$numberLong': '0'}, 'sparsity': {'$numberLong': '1'}}}]}
+key_vault_data: [ {'_id': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'keyMaterial': {'$binary': {'base64': 'sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==', 'subType': '00'}}, 'creationDate': {'$date': {'$numberLong': '1648914851981'}}, 'updateDate': {'$date': {'$numberLong': '1648914851981'}}, 'status': {'$numberInt': '0'}, 'masterKey': {'provider': 'local'}} ]
+tests:
+ - description: "FLE2 Range Double. Insert and Find."
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments:
+ document: &doc0 { _id: 0, encryptedDouble: { $numberDouble: "0" } }
+ - name: insertOne
+ arguments:
+ document: &doc1 { _id: 1, encryptedDouble: { $numberDouble: "1" } }
+ - name: find
+ arguments:
+ filter: { encryptedDouble: { $gt: { $numberDouble: "0" } } }
+ result: [*doc1]
+ expectations:
+ - command_started_event:
+ command:
+ listCollections: 1
+ filter:
+ name: *collection_name
+ command_name: listCollections
+ - command_started_event:
+ command:
+ find: datakeys
+ filter: {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ }
+ $db: keyvault
+ readConcern: { level: "majority" }
+ command_name: find
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc0_encrypted { "_id": 0, "encryptedDouble": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc1_encrypted { "_id": 1, "encryptedDouble": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ find: *collection_name
+ filter:
+ "encryptedDouble": {
+ "$gt": {
+ "$binary": {
+ "base64": "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",
+ "subType": "06"
+ }
+ }
+ }
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: find
+ outcome:
+ collection:
+ # Outcome is checked using a separate MongoClient without auto encryption.
+ data:
+ -
+ {
+ "_id": 0,
+ "encryptedDouble": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6YrBn2ofIw1b5ooakrLOwF41BWrps8OO0H9WH4/rtlE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "n+XAuFnP8Dov9TnhGFxNx0K/MnVM9WbJ7RouEu0ndO0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yRXojuVdn5GQtD97qYlaCL6cOLmZ7Cvcb3wFjkLUIdM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "DuIkdRPITRs55I4SZmgomAHCIsDQmXRhW8+MOznkzSk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SsBk+Et1lTbU+QRPx+xyJ/jMkmfG+QCvQEpip2YYrzA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "crCIzOd8KhHvvUlX7M1v9bhvU4pLdTc+X2SuqoKU5Ek=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YOWdCw4UrqnxkAaVjqmC4sKQDMVMHEpFGnlxpxdaU6E=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "M3SShp81Ff8tQ632qKbv9MUcN6wjDaBReI0VXNu6Xh4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "gzHlSPxpM0hT75kQvWFzGlOxKvDoiKQZOr19V6l2zXI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "s3JnppOGYw9SL2Q1kMAZs948v2F5PrpXjGei/HioDWs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cG6+3Gk/zEH68P/uuuwiAUVCuyJwa1LeV+t29FlPPAo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dupdvR3AyJtM+g9NDKiaLVOtGca387JQp8w+V03m7Ig=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JqEQc5svj2jTvZ6LLA5ivE+kTb/0aRemSEmxk4G7Zrg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "szcXXXKnob+p3SoM4yED2R920LeJ7cVsclPMFTe4CeI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "o1QoGVXmuBdHwHm7aCtGMlMVKrjFdYvJXpoq6uhIAZ0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Jfm5wPlqqLCJRGQIqRq2NGmpn7s0Vrih2H3YAOoI2YU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zMHLb8ARbsYo8Ld05bqnGFf1Usha6EGb8QKwdSAyps0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yQdtq9lh5pugL7/i0Bj/PuZUUBUIzf+7wj1rl5y736w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wGWVZdO7qIuyDg/BqDgqjgoQ02h5YYgwXQB1oCin2NE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "by9HMLj6NTEpgztZ5HSN6GxImkXPcaFINYDzgZY33X8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tWo0vbasi7bXmn/MsOx13VC1IsWtpx/nYp0uj4iMzdA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tQQpndUYd5O87lOtrGjH3wl9VsOK0ray7RMasL90sBM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cQjXEDCMsOpKLLf+vlTgIHA+cbSJdzqhbSX9Wvh95aA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "7yMpU48IxK9SzP2cx3VnTownGEwFmeFofuuFT97SuuY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kSOx1kz0CmBgzKQHZlo65ZUY1DIv9A99JRm+Us2y6Ew=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ubQpdPBe6/xvtr+AcXdfYLSvYCR4ot0tivehkCsupb4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xal+iCJ6FTefRQToyoNksc9NCZShyn04NDGi4IYrcoM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "d7jU4iOK50xHxlkSifcxlZFCM46TSgQzoYivxG3HNLY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tJvl2nsBLBVzL3pp6sKWCL4UXeh3q/roYBJjSb74ve0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "OIUCaKRvIx9t1w6Hxlz1IcQTdPNCfdRNwnnTm10W+X0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "A9tvzsiElotOUVIB4CqfQp9mAwqvTM35YkmAR170aHA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lI8gpK7hpb7c9x4RQugsxMnQay5LZJmwslZdvMx/dcE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dNCzh40U0XvdKnSDi3HRQOWQftEsDVqc4uUvsVFGoq8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "IP+iwEBWBwVVZIdpaMu8k5+soFCz+TZkYn3drKZ9grE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pnqyh6e0y5svHkJDShlN9CHV0WvMBE4QbtJpQw5ZCXc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "elEl42tbVDoRTLjAhZUFEtXiut4b3PVhg/1ZLZSQdtE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "vHuu2FxwclMHqyE6JBYbTYgbEkB0dqb/JuaxsvfwsmY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xTf7NCe3Gf8QpE78HR5OknlLTKfs9J+RN9UZpH6fnso=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "XiWSasRnJAulGR6+LCVD3mwRObXylqYWR9jvpywq12c=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "MZMxEQ5ikx0PG1YFIExv0UnTZogsvgeOEZTpzvBDn4w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yZMyMZBDrWbAhvnic7vvIYhmO9m5H2iuv0c8KNZrBzY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xxM14hTPY5j0vvcK2C7YAEjzdsfUTFHozHC0hEo1bxI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+01rqR1xVwkpGXcstbk1ItJqFVjH6Q8MGxEN3Cm9Y1A=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xOpLV0Z2VTRJ3iWtnWZcsyjXubTIkYWo31cO+HV1o1k=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "BWUOLqgLBqc5NwxVlSV5H3KFQPXbCp7mdo+jF+8cJqY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "fuQb1S6xZDGlrEbK+kI23aL53PP1PVNwqICnZNt9Yzg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SfscnoibFttahLdPVC4Ee+47ewGFKpDSU7M6HX19bKE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rpSW2awybNVeKtat91VFxqbINoTfNhPfQAu+d73Xtf8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "9M/CP9ccOIIj2LLFmE0GFDO0Ban2wsNalEXfM6+h+1s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "WrEMG49l1ye4MhXs5ZS9tz8P6h+hDvthIg/2wW9ne1Q=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ImNhbfeyfH8qIEeA5ic0s3dAQBdzzTBS+CPsNih9vZ0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dWP33YDSn04UKJN2ogh2Rui0iW/0q2y18OCDRVcfyoo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lYv0isAtfGh6H9tdp3cp2eHU7q2J+uk7QrgcxtK3w7Y=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "VGMoamB/+7zTOYcY/pqJc96xlv2PdW4hwsIAEIslTDQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yNeBWMF7BnD9wVwz2PgJsvWr77QiVvvWUvJF0+fqBug=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SfpvObJ+tJBXSvqeN7vlOfmhYign635lciYAJIjUtY8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dsen4NqjzVGjpjufiTMs3+gqeD09EbnuogPgxrJECwg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pxCWVM3sn19NsFEpgHbgLa+PmYlhN3mMiP0Wk8kJhYw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q11KNvJszjYIB9n9HcC+N4uz11a3eRj1L3BH9scKMDQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "A1PmkgcEToWh1JiVWE6mI5jUu7poxWWuCUt/cgRUUDc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "qJo3Hu4PJeanL7XEaWXO/n3YsodhZyd+MJOOmB9Kpd8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "BkBKLO8URFscfRY9Bav/1+L9mLohDgNr/MkZtGiraIs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rZq5WA3Hx3xthOyHAJXK//f8pE2qbz7YKu3TIMp9GFY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "X07a/Lm80p5xd4RFs1dNmw+90tmPDPdGiAKVZkxd4zY=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ -
+ {
+ "_id": 1,
+ "encryptedDouble": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "bE1vqWj3KNyM7cCYUv/cnYm8BPaUL3eMp5syTHq6NF4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "2FIZh/9N+NeJEQwxYIX5ikQT85xJzulBNReXk8PnG/s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "I93Md7QNPGmEEGYU1+VVCqBPBEvXdqHPtTJtMOn06Yk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "GecBFQ1PemlECWZWCl7f74vmsL6eB6mzQ9n6tK6FYfs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "QpjhZl+O1ORifgtCZuWAdcP6OKL7IZ2cA46v8FJcV28=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FWXI/yZ1M+2fIboeMCDMlp+I2NwPQDtoM/wWselOPYw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "uk26nvN/LdRLaBphiBgIZzT0sSpoO1z0RdDWRm/xrSA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hiiYSH1KZovAULc7rlmEU74wCjzDR+mm6ZnsgvFQjMw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hRzvMvWPX0sJme+wck67lwbKDFaWOa+Eyef+JSdc1s4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "PSx5D+zqC9c295dguX4+EobT4IEzfffdfjzC8DWpB5Q=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "QzfXQCVTjPQv2h21v95HYPq8uCsVJ2tPnjv79gAaM9M=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "XcGDO/dlTcEMLqwcm55UmOqK+KpBmbzZO1LIzX7GPaQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Lf+o4E7YB5ynzUPC6KTyW0lj6Cg9oLIu1Sdd1ODHctA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wAuVn02LAVo5Y+TUocvkoenFYWzpu38k0NmGZOsAjS4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yJGDtveLbbo/0HtCtiTSsvVI/0agg/U1bFaQ0yhK12o=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "KsEy0zgYcmkM+O/fWF9z3aJGIk22XCk+Aw96HB6JU68=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "p+AnMI5ZxdJMSIEJmXXya+FeH5yubmOdViwUO89j0Rc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "/jLix56jzeywBtNuGw55lCXyebQoSIhbful0hOKxKDY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "fvDvSPomtJsl1S3+8/tzFCE8scHIdJY5hB9CdTEsoFo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "oV5hOJzPXxfTuRdKIlF4uYEoMDuqH+G7/3qgndDr0PM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "3ALwcvLj3VOfgD6OqXAO13h1ZkOv46R6+Oy6SUKh53I=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "gxaB9FJj0IM+InhvAjwWaex3UIZ9SAnDiUd5WHSY/l0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "66NPvDygJzKJqddfNuDuNOpvGajjFRtvhkwfUkiYmXw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "1dWcQIocRAcO9XnXYqbhl83jc0RgjQpsrWd8dC27trg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "npos0Uf1DT3ztSCjPVY9EImlRnTHB1KLrvmVSqBQ/8E=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "TEI9qBx/tK1l1H0v1scMG8Srmtwo5VxWHADPBSlWrXk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "3wUN2ypQKoj+5ASkeIK9ycxhahVxyTmGopigoUAlyYs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "o/oksSnUS+nIq6ozWTbB5bJh+NoaPj8deAA23uxiWCk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "KExYPruhA31e8xuSwvfUfDcyY/H2Va6taUd0k4yFgLc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "/x+dNfxdd/lkx8Z8VZVfoYl7LPoaZ/iKEzZXBrAtIJc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "DE4cmjFLPqZlmRomO0qQiruUBtzoCe8ZdNRcfNH92pU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "M6EKNcLPw/iojAChgYUSieaBYWcbsjKtB94SaHOr8vk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+qP49lDPeyhaduTvXJgtJEqHNEYANVu9Bg3Bxz7Td9w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ruMrC2VIS+VKbJwCFb3bfkaLTju9nE+yPONV9s0M0Vo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "EbjDlSB5JKnDKff4d8hOmaOwJ7B9Q6NQFisLj+DPC+0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "C/yYOTB94edyqAbiQNu8/H7FoG3yRRjHDkMykz4+Mv0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CBxqrejG+qQQq2YTd6iP/06kiu2CxxzBFaZK3Ofb1CM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "2ZOQ/fpho+AbDENWBZaln7wRoepIRdhyT648dr8O5cU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "EghIgEPz01+myPgj8oid+PgncvobvC7vjvG3THEEQ0M=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "92CysZYNF8riwAMhdrIPKxfODw9p07cKQy/Snn8XmVY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "VO0LeTBQmsEf7sCHzTnZwUPNTqRZ49R8V5E9XnZ/5N4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "exs8BQMJq7U6ZXYgIizT7XN+X/hOmmn4YEuzev9zgSI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "qHpS4k1I+gPniNp4CA8TY8lLN36vBYmgbKMFpbYMEqg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+7lWKCKAWFw6gPZdHE6E8KIfI14/fSvtWUmllb5WLi0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YiH/US0q6679hWblFDDKNqUjCgggoU8sUCssTIF1QbU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YgwkKElEubNfvXL9hJxzqQUQtHiXN/OCGxNL1MUZZlM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hZFST4INZTTuhvJlGJeMwlUAK270UCOTCDeBAnN4a7g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "24I1Zw35AuGnK3CqJhbCwYb0IPuu5sCRrM5iyeITOLc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "vgD12JB4Q1S/kGPSQ1KOgp386KnG1GbM/5+60oRGcGw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+wNE+OL+CB9d4AUJdVxd56jUJCAXmmk9fapuB2TAc4g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "uhQh1B2Pe4RkNw/kPEcgaLenuikKoRf1iyfZhpXdodc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "eu8gjAUIp8ybO204AgeOq5v1neI1yljqy5v3I6lo1lM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "7QG6oVbASBAjrnCPxzzUNnuFSFNlKhbuBafkF8pr7Is=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "PUS1xb2oHSDTdYltutoSSxBiJ1NjxH3l2kA4P1CZLEs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "XPMh/JDC/O93gJJCwwgJDb8ssWZvRvezNmKmyn3nIfk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "jWz+KGwMk/GOvFAK2rOxF3OjxeZAWfmUQ1HGJ7icw4A=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "o7XbW68pc6flYigf3LW4WAGUWxpeqxaQLkHUhUR9RZ8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "nqR+g60+5U0okbqJadSqGgnC+j1JcP8rwMcfzOs2ACI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Hz43qVK95tSfbYFtaE/8fE97XMk1RiO8XpWjwZHB80o=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "noZUWlZ8M6KXU5rkifyo8/duw5IL7/fXbJvT7bNmW9k=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "WONVHCuPSanXDRQQ/3tmyJ0Vq+Lu/4hRaMUf0g0kSuw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "UEaj6vQRoIghE8Movd8AGXhtwIOXlP4cBsECIUvE5Y8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "D3n2YcO8+PB4C8brDo7kxKjF9Y844rVkdRMLTgsQkrw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "C+YA0G9KjxZVaWwOMuh/dcnHnHAlYnbFrRl0IEpmsY0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rUnmbmQanxrbFPYYrwyQ53x66OSt27yAvF+s48ezKDc=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
\ No newline at end of file
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-Double-Update.json b/specifications/client-side-encryption/tests/legacy/fle2-Range-Double-Update.json
new file mode 100644
index 00000000000..cdc9f28e76e
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-Double-Update.json
@@ -0,0 +1,1164 @@
+{
+ "runOn": [
+ {
+ "minServerVersion": "6.2.0",
+ "topology": [
+ "replicaset",
+ "sharded",
+ "load-balanced"
+ ]
+ }
+ ],
+ "database_name": "default",
+ "collection_name": "default",
+ "data": [],
+ "encrypted_fields": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDouble",
+ "bsonType": "double",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ ]
+ },
+ "key_vault_data": [
+ {
+ "_id": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "keyMaterial": {
+ "$binary": {
+ "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==",
+ "subType": "00"
+ }
+ },
+ "creationDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "updateDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "status": {
+ "$numberInt": "0"
+ },
+ "masterKey": {
+ "provider": "local"
+ }
+ }
+ ],
+ "tests": [
+ {
+ "description": "FLE2 Range Double. Update.",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDouble": {
+ "$numberDouble": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDouble": {
+ "$numberDouble": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "updateOne",
+ "arguments": {
+ "filter": {
+ "encryptedDouble": {
+ "$gt": {
+ "$numberDouble": "0"
+ }
+ }
+ },
+ "update": {
+ "$set": {
+ "encryptedDouble": {
+ "$numberDouble": "2"
+ }
+ }
+ }
+ },
+ "result": {
+ "matchedCount": 1,
+ "modifiedCount": 1,
+ "upsertedCount": 0
+ }
+ }
+ ],
+ "expectations": [
+ {
+ "command_started_event": {
+ "command": {
+ "listCollections": 1,
+ "filter": {
+ "name": "default"
+ }
+ },
+ "command_name": "listCollections"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "find": "datakeys",
+ "filter": {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ },
+ "$db": "keyvault",
+ "readConcern": {
+ "level": "majority"
+ }
+ },
+ "command_name": "find"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 0,
+ "encryptedDouble": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDouble",
+ "bsonType": "double",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 1,
+ "encryptedDouble": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDouble",
+ "bsonType": "double",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command_name": "update",
+ "command": {
+ "update": "default",
+ "ordered": true,
+ "updates": [
+ {
+ "q": {
+ "encryptedDouble": {
+ "$gt": {
+ "$binary": {
+ "base64": "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",
+ "subType": "06"
+ }
+ }
+ }
+ },
+ "u": {
+ "$set": {
+ "encryptedDouble": {
+ "$$type": "binData"
+ }
+ }
+ }
+ }
+ ],
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDouble",
+ "bsonType": "double",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ ]
+ }
+ },
+ "deleteTokens": {
+ "default.default": {
+ "encryptedDouble": {
+ "e": {
+ "$binary": {
+ "base64": "65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+w=",
+ "subType": "00"
+ }
+ },
+ "o": {
+ "$binary": {
+ "base64": "noN+05JsuO1oDg59yypIGj45i+eFH6HOTXOPpeZ//Mk=",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "$db": "default"
+ }
+ }
+ }
+ ],
+ "outcome": {
+ "collection": {
+ "data": [
+ {
+ "_id": 0,
+ "encryptedDouble": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6YrBn2ofIw1b5ooakrLOwF41BWrps8OO0H9WH4/rtlE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "n+XAuFnP8Dov9TnhGFxNx0K/MnVM9WbJ7RouEu0ndO0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yRXojuVdn5GQtD97qYlaCL6cOLmZ7Cvcb3wFjkLUIdM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "DuIkdRPITRs55I4SZmgomAHCIsDQmXRhW8+MOznkzSk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SsBk+Et1lTbU+QRPx+xyJ/jMkmfG+QCvQEpip2YYrzA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "crCIzOd8KhHvvUlX7M1v9bhvU4pLdTc+X2SuqoKU5Ek=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YOWdCw4UrqnxkAaVjqmC4sKQDMVMHEpFGnlxpxdaU6E=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "M3SShp81Ff8tQ632qKbv9MUcN6wjDaBReI0VXNu6Xh4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "gzHlSPxpM0hT75kQvWFzGlOxKvDoiKQZOr19V6l2zXI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "s3JnppOGYw9SL2Q1kMAZs948v2F5PrpXjGei/HioDWs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cG6+3Gk/zEH68P/uuuwiAUVCuyJwa1LeV+t29FlPPAo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dupdvR3AyJtM+g9NDKiaLVOtGca387JQp8w+V03m7Ig=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JqEQc5svj2jTvZ6LLA5ivE+kTb/0aRemSEmxk4G7Zrg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "szcXXXKnob+p3SoM4yED2R920LeJ7cVsclPMFTe4CeI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "o1QoGVXmuBdHwHm7aCtGMlMVKrjFdYvJXpoq6uhIAZ0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Jfm5wPlqqLCJRGQIqRq2NGmpn7s0Vrih2H3YAOoI2YU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zMHLb8ARbsYo8Ld05bqnGFf1Usha6EGb8QKwdSAyps0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yQdtq9lh5pugL7/i0Bj/PuZUUBUIzf+7wj1rl5y736w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wGWVZdO7qIuyDg/BqDgqjgoQ02h5YYgwXQB1oCin2NE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "by9HMLj6NTEpgztZ5HSN6GxImkXPcaFINYDzgZY33X8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tWo0vbasi7bXmn/MsOx13VC1IsWtpx/nYp0uj4iMzdA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tQQpndUYd5O87lOtrGjH3wl9VsOK0ray7RMasL90sBM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cQjXEDCMsOpKLLf+vlTgIHA+cbSJdzqhbSX9Wvh95aA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "7yMpU48IxK9SzP2cx3VnTownGEwFmeFofuuFT97SuuY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kSOx1kz0CmBgzKQHZlo65ZUY1DIv9A99JRm+Us2y6Ew=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ubQpdPBe6/xvtr+AcXdfYLSvYCR4ot0tivehkCsupb4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xal+iCJ6FTefRQToyoNksc9NCZShyn04NDGi4IYrcoM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "d7jU4iOK50xHxlkSifcxlZFCM46TSgQzoYivxG3HNLY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tJvl2nsBLBVzL3pp6sKWCL4UXeh3q/roYBJjSb74ve0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "OIUCaKRvIx9t1w6Hxlz1IcQTdPNCfdRNwnnTm10W+X0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "A9tvzsiElotOUVIB4CqfQp9mAwqvTM35YkmAR170aHA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lI8gpK7hpb7c9x4RQugsxMnQay5LZJmwslZdvMx/dcE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dNCzh40U0XvdKnSDi3HRQOWQftEsDVqc4uUvsVFGoq8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "IP+iwEBWBwVVZIdpaMu8k5+soFCz+TZkYn3drKZ9grE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pnqyh6e0y5svHkJDShlN9CHV0WvMBE4QbtJpQw5ZCXc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "elEl42tbVDoRTLjAhZUFEtXiut4b3PVhg/1ZLZSQdtE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "vHuu2FxwclMHqyE6JBYbTYgbEkB0dqb/JuaxsvfwsmY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xTf7NCe3Gf8QpE78HR5OknlLTKfs9J+RN9UZpH6fnso=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "XiWSasRnJAulGR6+LCVD3mwRObXylqYWR9jvpywq12c=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "MZMxEQ5ikx0PG1YFIExv0UnTZogsvgeOEZTpzvBDn4w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yZMyMZBDrWbAhvnic7vvIYhmO9m5H2iuv0c8KNZrBzY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xxM14hTPY5j0vvcK2C7YAEjzdsfUTFHozHC0hEo1bxI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+01rqR1xVwkpGXcstbk1ItJqFVjH6Q8MGxEN3Cm9Y1A=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xOpLV0Z2VTRJ3iWtnWZcsyjXubTIkYWo31cO+HV1o1k=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "BWUOLqgLBqc5NwxVlSV5H3KFQPXbCp7mdo+jF+8cJqY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "fuQb1S6xZDGlrEbK+kI23aL53PP1PVNwqICnZNt9Yzg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SfscnoibFttahLdPVC4Ee+47ewGFKpDSU7M6HX19bKE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rpSW2awybNVeKtat91VFxqbINoTfNhPfQAu+d73Xtf8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "9M/CP9ccOIIj2LLFmE0GFDO0Ban2wsNalEXfM6+h+1s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "WrEMG49l1ye4MhXs5ZS9tz8P6h+hDvthIg/2wW9ne1Q=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ImNhbfeyfH8qIEeA5ic0s3dAQBdzzTBS+CPsNih9vZ0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dWP33YDSn04UKJN2ogh2Rui0iW/0q2y18OCDRVcfyoo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lYv0isAtfGh6H9tdp3cp2eHU7q2J+uk7QrgcxtK3w7Y=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "VGMoamB/+7zTOYcY/pqJc96xlv2PdW4hwsIAEIslTDQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yNeBWMF7BnD9wVwz2PgJsvWr77QiVvvWUvJF0+fqBug=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SfpvObJ+tJBXSvqeN7vlOfmhYign635lciYAJIjUtY8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dsen4NqjzVGjpjufiTMs3+gqeD09EbnuogPgxrJECwg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pxCWVM3sn19NsFEpgHbgLa+PmYlhN3mMiP0Wk8kJhYw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q11KNvJszjYIB9n9HcC+N4uz11a3eRj1L3BH9scKMDQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "A1PmkgcEToWh1JiVWE6mI5jUu7poxWWuCUt/cgRUUDc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "qJo3Hu4PJeanL7XEaWXO/n3YsodhZyd+MJOOmB9Kpd8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "BkBKLO8URFscfRY9Bav/1+L9mLohDgNr/MkZtGiraIs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rZq5WA3Hx3xthOyHAJXK//f8pE2qbz7YKu3TIMp9GFY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "X07a/Lm80p5xd4RFs1dNmw+90tmPDPdGiAKVZkxd4zY=",
+ "subType": "00"
+ }
+ }
+ ]
+ },
+ {
+ "_id": 1,
+ "encryptedDouble": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "DLCAJs+W2PL2DV5YChCL6dYrQNr+j4p3L7xhVaub4ic=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "HI88j1zrIsFoijIXKybr9mYubNV5uVeODyLHFH4Ueco=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wXVD/HSbBljko0jJcaxJ1nrzs2+pchLQqYR3vywS8SU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "KhscCh+tt/pp8lxtKZQSPPUU94RvJYPKG/sjtzIa4Ws=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RISnuNrTTVNW5HnwCgQJ301pFw8DOcYrAMQIwVwjOkI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Ra5zukLh2boua0Bh74qA+mtIoixGXlsNsxiJqHtqdTI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "eqr0v+NNWXWszi9ni8qH58Q6gw5x737tJvH3lPaNHO4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "d42QupriWIwGrFAquXNFi0ehEuidIbHLFZtg1Sm2nN8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "2azRVxaaTIJKcgY2FU012gcyP8Y05cRDpfUaMnCBaQU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "3nlgkM4K/AAcHesRYYdEu24UGetHodVnVfHzw4yxZBM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hqy91FNmAAac2zUaPO6eWFkx0/37rOWGrwXN+fzL0tU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "akX+fmscSDSF9pB5MPj56iaJPtohr0hfXNk/OPWsGv8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "1ZvUb10Q7cN4cNLktd5yNjqgtawsYnkbeVBZV6WuY/I=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "otCwtuKiY4hCyXvYzXvo10OcnzZppebo38KsAlq49QM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Mty8EscckeT/dhMfrPFyDbLnmMOcYRUQ3mLK4KTu6V8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tnvgLLkJINO7csREYu4dEVe1ICrBeu7OP+HdfoX3M2E=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kOefsHgEVhkJ17UuP7Dxogy6sAQbzf1SFPKCj6XRlrQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "F+JQ79xavpaHdJzdhvwyHbzdZJLNHAymc/+67La3gao=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "NCZ9zp5rDRceENuSgAfTLEyKg0YgmXAhK0B8WSj7+Pw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wL1CJ7cYR5slx8mHq++uMdjDfkt9037lQTUztEMF56M=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "txefkzTMITZE+XvvRFZ7QcgwDT/7m8jNmxRk4QBaoZI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "jFunW3v1tSYMyZtQQD28eEy9qqDp4Kqo7gMN29N4bfQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "QMO915KUiS3X3R1bU1YoafVM2s0NeHo3EjgTA9PnGwY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "nwdKJEXdilzvb7494vbuDJ+y6SrfJahza1dYIsHIWVI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "vpWMX+T/VXXajFo0UbuYjtp0AEzBU0Y+lP+ih2EQ7mg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "1lmzG0J1DhKDRhhq5y5Buygu4G8eV2X0t7kUY90EohM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SiKqpXqO0trwhFvBWK274hMklpCgMhNs/JY84yyn/NE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "7cPGPYCKPTay+ZR9Gx6oOueduOgaFrSuAXmNDpDHXdI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "4THEYvAkjs2Fh7FIe5LC45P4i4N0L7ob67UOVbhp6Nk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "B+UGsChLLZR7iqnt8yq91OgmTgwiUKTJhFxY4NT0O6c=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "X1uYwBCsCg1H+PnKdwtBqXlt0zKEURi8bOM940GcPfk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xYOgT5l7shlNXCwHlguovmDkcEnF8dXyYlTyYrgZ8GE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "vFMTZqV8bh1+gcKzTkXweMddJlgdUnwX0DWzUUaMok4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "4HI0y9FrtleZxZ7M6INdNhLelrQ2Rv/+ykWCBl+tMC8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "jpJ0bBE474OUkn1vUiLWumIBtYmwc7J5+LQU/nyeLQc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "jQTPeXZvdxY/DjtPfYfKUArIDsf0E9MVFy2O26sv1ec=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "QLLto0ExR2ZYMGqlyaMZc/hXFFTlwmgtKbiVq/xJIeI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yBJNviU1nchbGbhx6InXCVRXa90sEepz1EwbYuKXu2U=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "jpEf0vHxrPu9gTJutNXSi2g/2Mc4WXFEN7yHonZEb7A=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "E09kLFckMYwNuhggMxmPtwndyvIAx+Vl+b2CV6FP75s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "N+ue6/cLPb5NssmJCCeo18LlbKPz6r2z20AsnTKRvOo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yVQNZP8hhsvNGyDph2QP2qTNdXZTiIEVineKg+Qf33o=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cSC9uI+9c5S8X+0G7amVyug1p0ZlgBsbEDYYyezBevQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "1NpZGjoQzuQtekj80Rifxe9HbE08W07dfwxaFHaVn84=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "5Ghuq/8l11Ug9Uf/RTwf9On3OxOwIXUcb9soiy4J7/w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "0LWKaEty6ywxLFhDaAqulqfMnYc+tgPfH4apyEeKg80=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "OwSthmCBtt6NIAoAh7aCbj82Yr/+9t8U7WuBQhFT3AQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "iYiyg6/1isqbMdvFPIGucu3cNM4NAZNtJhHpGZ4eM+c=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "waBgs8jWuGJPIF5zCRh6OmIyfK5GCBQgTMfmKSR2wyY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "1Jdtbe2BKJXPU2G9ywOrlODZ/cNYEQlKzAW3aMe1Hy4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xaLEnNUS/2ySerBpb9dN/D31t+wYcKekwTfkwtni0Mc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "bIVBrOhOvr6cL55Tr24+B+CC9MiG7U6K54aAr2IXXuw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6Cdq5wroGu2TEFnekuT7LhOpd/K/+PcipIljcHU9QL4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "K5l64vI4S/pLviLW6Pl0U3iQkI3ge0xg4RAHcEsyKJo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "bzhuvZ0Ls22yIOX+Hz51eAHlSuDbWR/e0u4EhfdpHbc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Qv+fr6uD4o0bZRp69QJCFL6zvn3G82c7L+N1IFzj7H0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "XAmISMbD3aEyQT+BQEphCKFNa0F0GDKFuhM9cGceKoQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "4VLCokntMfm1AogpUnYGvhV7nllWSo3mS3hVESMy+hA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xiXNLj/CipEH63Vb5cidi8q9X47EF4f3HtJSOH7mfM8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "4XlCYfYBjI9XA5zOSgTiEBYcZsdwyXL+f5XtH2xUIOc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "k6DfQy7ZYJIkEly2B5hjOZznL4NcgMkllZjJLb7yq7w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ZzM6gwWesa3lxbZVZthpPFs2s3GV0RZREE2zOMhBRBo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "US+jeMeeOd7J0wR0efJtq2/18lcO8YFvhT4O3DeaonQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "b6iSxiI1FM9SzxuG1bHqGA1i4+3GOi0/SPW00XB4L7o=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kn3LsxAVkzIZKK9I6fi0Cctr0yjXOYgaQWMCoj4hLpM=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ ]
+}
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-Double-Update.yml b/specifications/client-side-encryption/tests/legacy/fle2-Range-Double-Update.yml
new file mode 100644
index 00000000000..5f8423b8fec
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-Double-Update.yml
@@ -0,0 +1,932 @@
+# Requires libmongocrypt 1.7.0.
+runOn:
+ - minServerVersion: "6.2.0"
+ # FLE 2 Encrypted collections are not supported on standalone.
+ topology: [ "replicaset", "sharded", "load-balanced" ]
+database_name: &database_name "default"
+collection_name: &collection_name "default"
+data: []
+encrypted_fields: &encrypted_fields {'escCollection': 'enxcol_.default.esc', 'eccCollection': 'enxcol_.default.ecc', 'ecocCollection': 'enxcol_.default.ecoc', 'fields': [{'keyId': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'path': 'encryptedDouble', 'bsonType': 'double', 'queries': {'queryType': 'rangePreview', 'contention': {'$numberLong': '0'}, 'sparsity': {'$numberLong': '1'}}}]}
+key_vault_data: [ {'_id': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'keyMaterial': {'$binary': {'base64': 'sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==', 'subType': '00'}}, 'creationDate': {'$date': {'$numberLong': '1648914851981'}}, 'updateDate': {'$date': {'$numberLong': '1648914851981'}}, 'status': {'$numberInt': '0'}, 'masterKey': {'provider': 'local'}} ]
+tests:
+ - description: "FLE2 Range Double. Update."
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments:
+ document: &doc0 { _id: 0, encryptedDouble: { $numberDouble: "0" } }
+ - name: insertOne
+ arguments:
+ document: &doc1 { _id: 1, encryptedDouble: { $numberDouble: "1" } }
+ - name: updateOne
+ arguments:
+ filter: { encryptedDouble: { $gt: { $numberDouble: "0" } } }
+ update: { "$set": { "encryptedDouble": { $numberDouble: "2" } }}
+ result:
+ matchedCount: 1
+ modifiedCount: 1
+ upsertedCount: 0
+ expectations:
+ - command_started_event:
+ command:
+ listCollections: 1
+ filter:
+ name: *collection_name
+ command_name: listCollections
+ - command_started_event:
+ command:
+ find: datakeys
+ filter: {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ }
+ $db: keyvault
+ readConcern: { level: "majority" }
+ command_name: find
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc0_encrypted { "_id": 0, "encryptedDouble": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc1_encrypted { "_id": 1, "encryptedDouble": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command_name: update
+ command:
+ {
+ "update": "default",
+ "ordered": true,
+ "updates": [
+ {
+ "q": {
+ "encryptedDouble": {
+ "$gt": {
+ "$binary": {
+ "base64": "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",
+ "subType": "06"
+ }
+ }
+ }
+ },
+ "u": {
+ "$set": {
+ "encryptedDouble": { $$type: "binData" }
+ }
+ }
+ }
+ ],
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": *encrypted_fields
+ },
+ "deleteTokens": {
+ "default.default": {
+ "encryptedDouble": {
+ "e": {
+ "$binary": {
+ "base64": "65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+w=",
+ "subType": "00"
+ }
+ },
+ "o": {
+ "$binary": {
+ "base64": "noN+05JsuO1oDg59yypIGj45i+eFH6HOTXOPpeZ//Mk=",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "$db": "default"
+ }
+
+ outcome:
+ collection:
+ # Outcome is checked using a separate MongoClient without auto encryption.
+ data:
+ -
+ {
+ "_id": 0,
+ "encryptedDouble": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6YrBn2ofIw1b5ooakrLOwF41BWrps8OO0H9WH4/rtlE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "n+XAuFnP8Dov9TnhGFxNx0K/MnVM9WbJ7RouEu0ndO0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yRXojuVdn5GQtD97qYlaCL6cOLmZ7Cvcb3wFjkLUIdM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "DuIkdRPITRs55I4SZmgomAHCIsDQmXRhW8+MOznkzSk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SsBk+Et1lTbU+QRPx+xyJ/jMkmfG+QCvQEpip2YYrzA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "crCIzOd8KhHvvUlX7M1v9bhvU4pLdTc+X2SuqoKU5Ek=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "YOWdCw4UrqnxkAaVjqmC4sKQDMVMHEpFGnlxpxdaU6E=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "M3SShp81Ff8tQ632qKbv9MUcN6wjDaBReI0VXNu6Xh4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "gzHlSPxpM0hT75kQvWFzGlOxKvDoiKQZOr19V6l2zXI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "s3JnppOGYw9SL2Q1kMAZs948v2F5PrpXjGei/HioDWs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cG6+3Gk/zEH68P/uuuwiAUVCuyJwa1LeV+t29FlPPAo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dupdvR3AyJtM+g9NDKiaLVOtGca387JQp8w+V03m7Ig=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JqEQc5svj2jTvZ6LLA5ivE+kTb/0aRemSEmxk4G7Zrg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "szcXXXKnob+p3SoM4yED2R920LeJ7cVsclPMFTe4CeI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "o1QoGVXmuBdHwHm7aCtGMlMVKrjFdYvJXpoq6uhIAZ0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Jfm5wPlqqLCJRGQIqRq2NGmpn7s0Vrih2H3YAOoI2YU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zMHLb8ARbsYo8Ld05bqnGFf1Usha6EGb8QKwdSAyps0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yQdtq9lh5pugL7/i0Bj/PuZUUBUIzf+7wj1rl5y736w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wGWVZdO7qIuyDg/BqDgqjgoQ02h5YYgwXQB1oCin2NE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "by9HMLj6NTEpgztZ5HSN6GxImkXPcaFINYDzgZY33X8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tWo0vbasi7bXmn/MsOx13VC1IsWtpx/nYp0uj4iMzdA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tQQpndUYd5O87lOtrGjH3wl9VsOK0ray7RMasL90sBM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cQjXEDCMsOpKLLf+vlTgIHA+cbSJdzqhbSX9Wvh95aA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "7yMpU48IxK9SzP2cx3VnTownGEwFmeFofuuFT97SuuY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kSOx1kz0CmBgzKQHZlo65ZUY1DIv9A99JRm+Us2y6Ew=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ubQpdPBe6/xvtr+AcXdfYLSvYCR4ot0tivehkCsupb4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xal+iCJ6FTefRQToyoNksc9NCZShyn04NDGi4IYrcoM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "d7jU4iOK50xHxlkSifcxlZFCM46TSgQzoYivxG3HNLY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tJvl2nsBLBVzL3pp6sKWCL4UXeh3q/roYBJjSb74ve0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "OIUCaKRvIx9t1w6Hxlz1IcQTdPNCfdRNwnnTm10W+X0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "A9tvzsiElotOUVIB4CqfQp9mAwqvTM35YkmAR170aHA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lI8gpK7hpb7c9x4RQugsxMnQay5LZJmwslZdvMx/dcE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dNCzh40U0XvdKnSDi3HRQOWQftEsDVqc4uUvsVFGoq8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "IP+iwEBWBwVVZIdpaMu8k5+soFCz+TZkYn3drKZ9grE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pnqyh6e0y5svHkJDShlN9CHV0WvMBE4QbtJpQw5ZCXc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "elEl42tbVDoRTLjAhZUFEtXiut4b3PVhg/1ZLZSQdtE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "vHuu2FxwclMHqyE6JBYbTYgbEkB0dqb/JuaxsvfwsmY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xTf7NCe3Gf8QpE78HR5OknlLTKfs9J+RN9UZpH6fnso=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "XiWSasRnJAulGR6+LCVD3mwRObXylqYWR9jvpywq12c=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "MZMxEQ5ikx0PG1YFIExv0UnTZogsvgeOEZTpzvBDn4w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yZMyMZBDrWbAhvnic7vvIYhmO9m5H2iuv0c8KNZrBzY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xxM14hTPY5j0vvcK2C7YAEjzdsfUTFHozHC0hEo1bxI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+01rqR1xVwkpGXcstbk1ItJqFVjH6Q8MGxEN3Cm9Y1A=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xOpLV0Z2VTRJ3iWtnWZcsyjXubTIkYWo31cO+HV1o1k=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "BWUOLqgLBqc5NwxVlSV5H3KFQPXbCp7mdo+jF+8cJqY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "fuQb1S6xZDGlrEbK+kI23aL53PP1PVNwqICnZNt9Yzg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SfscnoibFttahLdPVC4Ee+47ewGFKpDSU7M6HX19bKE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rpSW2awybNVeKtat91VFxqbINoTfNhPfQAu+d73Xtf8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "9M/CP9ccOIIj2LLFmE0GFDO0Ban2wsNalEXfM6+h+1s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "WrEMG49l1ye4MhXs5ZS9tz8P6h+hDvthIg/2wW9ne1Q=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ImNhbfeyfH8qIEeA5ic0s3dAQBdzzTBS+CPsNih9vZ0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dWP33YDSn04UKJN2ogh2Rui0iW/0q2y18OCDRVcfyoo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "lYv0isAtfGh6H9tdp3cp2eHU7q2J+uk7QrgcxtK3w7Y=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "VGMoamB/+7zTOYcY/pqJc96xlv2PdW4hwsIAEIslTDQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yNeBWMF7BnD9wVwz2PgJsvWr77QiVvvWUvJF0+fqBug=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SfpvObJ+tJBXSvqeN7vlOfmhYign635lciYAJIjUtY8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dsen4NqjzVGjpjufiTMs3+gqeD09EbnuogPgxrJECwg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "pxCWVM3sn19NsFEpgHbgLa+PmYlhN3mMiP0Wk8kJhYw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q11KNvJszjYIB9n9HcC+N4uz11a3eRj1L3BH9scKMDQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "A1PmkgcEToWh1JiVWE6mI5jUu7poxWWuCUt/cgRUUDc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "qJo3Hu4PJeanL7XEaWXO/n3YsodhZyd+MJOOmB9Kpd8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "BkBKLO8URFscfRY9Bav/1+L9mLohDgNr/MkZtGiraIs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "rZq5WA3Hx3xthOyHAJXK//f8pE2qbz7YKu3TIMp9GFY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "X07a/Lm80p5xd4RFs1dNmw+90tmPDPdGiAKVZkxd4zY=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ -
+ {
+ "_id": 1,
+ "encryptedDouble": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "DLCAJs+W2PL2DV5YChCL6dYrQNr+j4p3L7xhVaub4ic=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "HI88j1zrIsFoijIXKybr9mYubNV5uVeODyLHFH4Ueco=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wXVD/HSbBljko0jJcaxJ1nrzs2+pchLQqYR3vywS8SU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "KhscCh+tt/pp8lxtKZQSPPUU94RvJYPKG/sjtzIa4Ws=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RISnuNrTTVNW5HnwCgQJ301pFw8DOcYrAMQIwVwjOkI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Ra5zukLh2boua0Bh74qA+mtIoixGXlsNsxiJqHtqdTI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "eqr0v+NNWXWszi9ni8qH58Q6gw5x737tJvH3lPaNHO4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "d42QupriWIwGrFAquXNFi0ehEuidIbHLFZtg1Sm2nN8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "2azRVxaaTIJKcgY2FU012gcyP8Y05cRDpfUaMnCBaQU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "3nlgkM4K/AAcHesRYYdEu24UGetHodVnVfHzw4yxZBM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hqy91FNmAAac2zUaPO6eWFkx0/37rOWGrwXN+fzL0tU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "akX+fmscSDSF9pB5MPj56iaJPtohr0hfXNk/OPWsGv8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "1ZvUb10Q7cN4cNLktd5yNjqgtawsYnkbeVBZV6WuY/I=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "otCwtuKiY4hCyXvYzXvo10OcnzZppebo38KsAlq49QM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Mty8EscckeT/dhMfrPFyDbLnmMOcYRUQ3mLK4KTu6V8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "tnvgLLkJINO7csREYu4dEVe1ICrBeu7OP+HdfoX3M2E=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kOefsHgEVhkJ17UuP7Dxogy6sAQbzf1SFPKCj6XRlrQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "F+JQ79xavpaHdJzdhvwyHbzdZJLNHAymc/+67La3gao=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "NCZ9zp5rDRceENuSgAfTLEyKg0YgmXAhK0B8WSj7+Pw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wL1CJ7cYR5slx8mHq++uMdjDfkt9037lQTUztEMF56M=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "txefkzTMITZE+XvvRFZ7QcgwDT/7m8jNmxRk4QBaoZI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "jFunW3v1tSYMyZtQQD28eEy9qqDp4Kqo7gMN29N4bfQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "QMO915KUiS3X3R1bU1YoafVM2s0NeHo3EjgTA9PnGwY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "nwdKJEXdilzvb7494vbuDJ+y6SrfJahza1dYIsHIWVI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "vpWMX+T/VXXajFo0UbuYjtp0AEzBU0Y+lP+ih2EQ7mg=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "1lmzG0J1DhKDRhhq5y5Buygu4G8eV2X0t7kUY90EohM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SiKqpXqO0trwhFvBWK274hMklpCgMhNs/JY84yyn/NE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "7cPGPYCKPTay+ZR9Gx6oOueduOgaFrSuAXmNDpDHXdI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "4THEYvAkjs2Fh7FIe5LC45P4i4N0L7ob67UOVbhp6Nk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "B+UGsChLLZR7iqnt8yq91OgmTgwiUKTJhFxY4NT0O6c=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "X1uYwBCsCg1H+PnKdwtBqXlt0zKEURi8bOM940GcPfk=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xYOgT5l7shlNXCwHlguovmDkcEnF8dXyYlTyYrgZ8GE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "vFMTZqV8bh1+gcKzTkXweMddJlgdUnwX0DWzUUaMok4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "4HI0y9FrtleZxZ7M6INdNhLelrQ2Rv/+ykWCBl+tMC8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "jpJ0bBE474OUkn1vUiLWumIBtYmwc7J5+LQU/nyeLQc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "jQTPeXZvdxY/DjtPfYfKUArIDsf0E9MVFy2O26sv1ec=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "QLLto0ExR2ZYMGqlyaMZc/hXFFTlwmgtKbiVq/xJIeI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yBJNviU1nchbGbhx6InXCVRXa90sEepz1EwbYuKXu2U=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "jpEf0vHxrPu9gTJutNXSi2g/2Mc4WXFEN7yHonZEb7A=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "E09kLFckMYwNuhggMxmPtwndyvIAx+Vl+b2CV6FP75s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "N+ue6/cLPb5NssmJCCeo18LlbKPz6r2z20AsnTKRvOo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "yVQNZP8hhsvNGyDph2QP2qTNdXZTiIEVineKg+Qf33o=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cSC9uI+9c5S8X+0G7amVyug1p0ZlgBsbEDYYyezBevQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "1NpZGjoQzuQtekj80Rifxe9HbE08W07dfwxaFHaVn84=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "5Ghuq/8l11Ug9Uf/RTwf9On3OxOwIXUcb9soiy4J7/w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "0LWKaEty6ywxLFhDaAqulqfMnYc+tgPfH4apyEeKg80=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "OwSthmCBtt6NIAoAh7aCbj82Yr/+9t8U7WuBQhFT3AQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "iYiyg6/1isqbMdvFPIGucu3cNM4NAZNtJhHpGZ4eM+c=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "waBgs8jWuGJPIF5zCRh6OmIyfK5GCBQgTMfmKSR2wyY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "1Jdtbe2BKJXPU2G9ywOrlODZ/cNYEQlKzAW3aMe1Hy4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xaLEnNUS/2ySerBpb9dN/D31t+wYcKekwTfkwtni0Mc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "bIVBrOhOvr6cL55Tr24+B+CC9MiG7U6K54aAr2IXXuw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6Cdq5wroGu2TEFnekuT7LhOpd/K/+PcipIljcHU9QL4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "K5l64vI4S/pLviLW6Pl0U3iQkI3ge0xg4RAHcEsyKJo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "bzhuvZ0Ls22yIOX+Hz51eAHlSuDbWR/e0u4EhfdpHbc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Qv+fr6uD4o0bZRp69QJCFL6zvn3G82c7L+N1IFzj7H0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "XAmISMbD3aEyQT+BQEphCKFNa0F0GDKFuhM9cGceKoQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "4VLCokntMfm1AogpUnYGvhV7nllWSo3mS3hVESMy+hA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "xiXNLj/CipEH63Vb5cidi8q9X47EF4f3HtJSOH7mfM8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "4XlCYfYBjI9XA5zOSgTiEBYcZsdwyXL+f5XtH2xUIOc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "k6DfQy7ZYJIkEly2B5hjOZznL4NcgMkllZjJLb7yq7w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ZzM6gwWesa3lxbZVZthpPFs2s3GV0RZREE2zOMhBRBo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "US+jeMeeOd7J0wR0efJtq2/18lcO8YFvhT4O3DeaonQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "b6iSxiI1FM9SzxuG1bHqGA1i4+3GOi0/SPW00XB4L7o=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kn3LsxAVkzIZKK9I6fi0Cctr0yjXOYgaQWMCoj4hLpM=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
\ No newline at end of file
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-DoublePrecision-Aggregate.json b/specifications/client-side-encryption/tests/legacy/fle2-Range-DoublePrecision-Aggregate.json
new file mode 100644
index 00000000000..f2ea49ad75e
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-DoublePrecision-Aggregate.json
@@ -0,0 +1,586 @@
+{
+ "runOn": [
+ {
+ "minServerVersion": "6.2.0",
+ "topology": [
+ "replicaset",
+ "sharded",
+ "load-balanced"
+ ]
+ }
+ ],
+ "database_name": "default",
+ "collection_name": "default",
+ "data": [],
+ "encrypted_fields": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDoublePrecision",
+ "bsonType": "double",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberDouble": "0.0"
+ },
+ "max": {
+ "$numberDouble": "200.0"
+ },
+ "precision": {
+ "$numberInt": "2"
+ }
+ }
+ }
+ ]
+ },
+ "key_vault_data": [
+ {
+ "_id": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "keyMaterial": {
+ "$binary": {
+ "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==",
+ "subType": "00"
+ }
+ },
+ "creationDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "updateDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "status": {
+ "$numberInt": "0"
+ },
+ "masterKey": {
+ "provider": "local"
+ }
+ }
+ ],
+ "tests": [
+ {
+ "description": "FLE2 Range DoublePrecision. Aggregate.",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedDoublePrecision": {
+ "$gt": {
+ "$numberDouble": "0"
+ }
+ }
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 1,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "1"
+ }
+ }
+ ]
+ }
+ ],
+ "expectations": [
+ {
+ "command_started_event": {
+ "command": {
+ "listCollections": 1,
+ "filter": {
+ "name": "default"
+ }
+ },
+ "command_name": "listCollections"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "find": "datakeys",
+ "filter": {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ },
+ "$db": "keyvault",
+ "readConcern": {
+ "level": "majority"
+ }
+ },
+ "command_name": "find"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 0,
+ "encryptedDoublePrecision": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDoublePrecision",
+ "bsonType": "double",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberDouble": "0.0"
+ },
+ "max": {
+ "$numberDouble": "200.0"
+ },
+ "precision": {
+ "$numberInt": "2"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 1,
+ "encryptedDoublePrecision": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDoublePrecision",
+ "bsonType": "double",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberDouble": "0.0"
+ },
+ "max": {
+ "$numberDouble": "200.0"
+ },
+ "precision": {
+ "$numberInt": "2"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "aggregate": "default",
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedDoublePrecision": {
+ "$gt": {
+ "$binary": {
+ "base64": "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",
+ "subType": "06"
+ }
+ }
+ }
+ }
+ }
+ ],
+ "cursor": {},
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDoublePrecision",
+ "bsonType": "double",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberDouble": "0.0"
+ },
+ "max": {
+ "$numberDouble": "200.0"
+ },
+ "precision": {
+ "$numberInt": "2"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "aggregate"
+ }
+ }
+ ],
+ "outcome": {
+ "collection": {
+ "data": [
+ {
+ "_id": 0,
+ "encryptedDoublePrecision": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Dri0CXmL78L2DOgk9w0DwxHOMGMzih7m6l59vgy+WWo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "b7d8mRzD1kI1tdc7uNL+YAUonJ6pODLsRLkArfEKSkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Xg8C1/A0KJaXOw4i+26Rv03/CydaaunOzXh0CIT+gn8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "UoKUDw2wJYToUCcFaIs03YQSTksYR0MIOTJllwODqKc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "c/5cwAT0C5jber2xlJnWD3a5tVDy0nRtr5HG02hoFOY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wSUrRXavAGaajNeqC5mEUH1K67oYl5Wy9RNIzKjwLAM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6vrp4wWDtHEgHWR99I70WVDzevg1Fk/Pw5U8gUDa0OU=",
+ "subType": "00"
+ }
+ }
+ ]
+ },
+ {
+ "_id": 1,
+ "encryptedDoublePrecision": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "bE1vqWj3KNyM7cCYUv/cnYm8BPaUL3eMp5syTHq6NF4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "mVZb+Ra0EYjQ4Zrh9X//E2T8MRj7NMqm5GUJXhRrBEI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FA74j21GUEJb1DJBOpR9nVnjaDZnd8yAQNuaW9Qi26g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kJv//KVkbrobIBf+QeWC5jxn20mx/P0R1N6aCSMgKM8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zB+Whi9IUUGxfLEe+lGuIzLX4LFbIhaIAm5lRk65QTc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ybO1QU3CgvhO8JgRXH+HxKszWcpl5aGDYYVa75fHa1g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "X3Y3eSAbbMg//JgiHHiFpYOpV61t8kkDexI+CQyitH4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SlNHXyqVFGDPrX/2ppwog6l4pwj3PKda2TkZbqgfSfA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "McjV8xwTF3xI7863DYOBdyvIv6UpzThl6v9vBRk05bI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "MgwakFvPyBlwqFTbhWUF79URJQWFoJTGotlEVSPPUsQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "DyBERpMSD5lEM5Nhpcn4WGgxgn/mkUVJp+PYSLX5jsE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "I43iazc0xj1WVbYB/V+uTL/tughN1bBlxh1iypBnNsA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wjOBa/ATMuOywFmuPgC0GF/oeLqu0Z7eK5udzkTPbis=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "gRQVwiR+m+0Vg8ZDXqrQQcVnTyobwCXNaA4BCJVXtMc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "WUZ6huwx0ZbLb0R00uiC9FOJzsUocUN8qE5+YRenkvQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "7s79aKEuPgQcS/YPOOVcYNZvHIo7FFsWtFCrnDKXefA=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ ]
+}
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-DoublePrecision-Aggregate.yml b/specifications/client-side-encryption/tests/legacy/fle2-Range-DoublePrecision-Aggregate.yml
new file mode 100644
index 00000000000..47ac5d44448
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-DoublePrecision-Aggregate.yml
@@ -0,0 +1,311 @@
+# Requires libmongocrypt 1.7.0.
+runOn:
+ - minServerVersion: "6.2.0"
+ # FLE 2 Encrypted collections are not supported on standalone.
+ topology: [ "replicaset", "sharded", "load-balanced" ]
+database_name: &database_name "default"
+collection_name: &collection_name "default"
+data: []
+encrypted_fields: &encrypted_fields {'escCollection': 'enxcol_.default.esc', 'eccCollection': 'enxcol_.default.ecc', 'ecocCollection': 'enxcol_.default.ecoc', 'fields': [{'keyId': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'path': 'encryptedDoublePrecision', 'bsonType': 'double', 'queries': {'queryType': 'rangePreview', 'contention': {'$numberLong': '0'}, 'sparsity': {'$numberLong': '1'}, 'min': {'$numberDouble': '0.0'}, 'max': {'$numberDouble': '200.0'}, 'precision': {'$numberInt': '2'}}}]}
+key_vault_data: [ {'_id': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'keyMaterial': {'$binary': {'base64': 'sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==', 'subType': '00'}}, 'creationDate': {'$date': {'$numberLong': '1648914851981'}}, 'updateDate': {'$date': {'$numberLong': '1648914851981'}}, 'status': {'$numberInt': '0'}, 'masterKey': {'provider': 'local'}} ]
+tests:
+ - description: "FLE2 Range DoublePrecision. Aggregate."
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments:
+ document: &doc0 { _id: 0, encryptedDoublePrecision: { $numberDouble: "0" } }
+ - name: insertOne
+ arguments:
+ document: &doc1 { _id: 1, encryptedDoublePrecision: { $numberDouble: "1" } }
+ - name: aggregate
+ arguments:
+ pipeline: [{ $match: { "encryptedDoublePrecision": { $gt: {$numberDouble: "0" }} } }]
+ result: [*doc1]
+ expectations:
+ - command_started_event:
+ command:
+ listCollections: 1
+ filter:
+ name: *collection_name
+ command_name: listCollections
+ - command_started_event:
+ command:
+ find: datakeys
+ filter: {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ }
+ $db: keyvault
+ readConcern: { level: "majority" }
+ command_name: find
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc0_encrypted { "_id": 0, "encryptedDoublePrecision": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc1_encrypted { "_id": 1, "encryptedDoublePrecision": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ aggregate: *collection_name
+ pipeline: [
+ {
+ "$match": {
+ "encryptedDoublePrecision": {
+ "$gt": {
+ "$binary": {
+ "base64": "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",
+ "subType": "06"
+ }
+ }
+ }
+ }
+ }
+ ]
+ cursor: {}
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: aggregate
+ outcome:
+ collection:
+ # Outcome is checked using a separate MongoClient without auto encryption.
+ data:
+ -
+ {
+ "_id": 0,
+ "encryptedDoublePrecision": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Dri0CXmL78L2DOgk9w0DwxHOMGMzih7m6l59vgy+WWo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "b7d8mRzD1kI1tdc7uNL+YAUonJ6pODLsRLkArfEKSkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Xg8C1/A0KJaXOw4i+26Rv03/CydaaunOzXh0CIT+gn8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "UoKUDw2wJYToUCcFaIs03YQSTksYR0MIOTJllwODqKc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "c/5cwAT0C5jber2xlJnWD3a5tVDy0nRtr5HG02hoFOY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wSUrRXavAGaajNeqC5mEUH1K67oYl5Wy9RNIzKjwLAM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6vrp4wWDtHEgHWR99I70WVDzevg1Fk/Pw5U8gUDa0OU=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ -
+ {
+ "_id": 1,
+ "encryptedDoublePrecision": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "bE1vqWj3KNyM7cCYUv/cnYm8BPaUL3eMp5syTHq6NF4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "mVZb+Ra0EYjQ4Zrh9X//E2T8MRj7NMqm5GUJXhRrBEI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FA74j21GUEJb1DJBOpR9nVnjaDZnd8yAQNuaW9Qi26g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kJv//KVkbrobIBf+QeWC5jxn20mx/P0R1N6aCSMgKM8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zB+Whi9IUUGxfLEe+lGuIzLX4LFbIhaIAm5lRk65QTc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ybO1QU3CgvhO8JgRXH+HxKszWcpl5aGDYYVa75fHa1g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "X3Y3eSAbbMg//JgiHHiFpYOpV61t8kkDexI+CQyitH4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SlNHXyqVFGDPrX/2ppwog6l4pwj3PKda2TkZbqgfSfA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "McjV8xwTF3xI7863DYOBdyvIv6UpzThl6v9vBRk05bI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "MgwakFvPyBlwqFTbhWUF79URJQWFoJTGotlEVSPPUsQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "DyBERpMSD5lEM5Nhpcn4WGgxgn/mkUVJp+PYSLX5jsE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "I43iazc0xj1WVbYB/V+uTL/tughN1bBlxh1iypBnNsA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wjOBa/ATMuOywFmuPgC0GF/oeLqu0Z7eK5udzkTPbis=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "gRQVwiR+m+0Vg8ZDXqrQQcVnTyobwCXNaA4BCJVXtMc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "WUZ6huwx0ZbLb0R00uiC9FOJzsUocUN8qE5+YRenkvQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "7s79aKEuPgQcS/YPOOVcYNZvHIo7FFsWtFCrnDKXefA=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
\ No newline at end of file
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-DoublePrecision-Correctness.json b/specifications/client-side-encryption/tests/legacy/fle2-Range-DoublePrecision-Correctness.json
new file mode 100644
index 00000000000..e69d9126941
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-DoublePrecision-Correctness.json
@@ -0,0 +1,1650 @@
+{
+ "runOn": [
+ {
+ "minServerVersion": "6.2.0",
+ "topology": [
+ "replicaset",
+ "sharded",
+ "load-balanced"
+ ]
+ }
+ ],
+ "database_name": "default",
+ "collection_name": "default",
+ "data": [],
+ "encrypted_fields": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDoublePrecision",
+ "bsonType": "double",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberDouble": "0.0"
+ },
+ "max": {
+ "$numberDouble": "200.0"
+ },
+ "precision": {
+ "$numberInt": "2"
+ }
+ }
+ }
+ ]
+ },
+ "key_vault_data": [
+ {
+ "_id": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "keyMaterial": {
+ "$binary": {
+ "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==",
+ "subType": "00"
+ }
+ },
+ "creationDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "updateDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "status": {
+ "$numberInt": "0"
+ },
+ "masterKey": {
+ "provider": "local"
+ }
+ }
+ ],
+ "tests": [
+ {
+ "description": "Find with $gt",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDoublePrecision": {
+ "$gt": {
+ "$numberDouble": "0.0"
+ }
+ }
+ }
+ },
+ "result": [
+ {
+ "_id": 1,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "1.0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Find with $gte",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDoublePrecision": {
+ "$gte": {
+ "$numberDouble": "0.0"
+ }
+ }
+ },
+ "sort": {
+ "_id": 1
+ }
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "0.0"
+ }
+ },
+ {
+ "_id": 1,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "1.0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Find with $gt with no results",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDoublePrecision": {
+ "$gt": {
+ "$numberDouble": "1.0"
+ }
+ }
+ }
+ },
+ "result": []
+ }
+ ]
+ },
+ {
+ "description": "Find with $lt",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDoublePrecision": {
+ "$lt": {
+ "$numberDouble": "1.0"
+ }
+ }
+ }
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "0.0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Find with $lte",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDoublePrecision": {
+ "$lte": {
+ "$numberDouble": "1.0"
+ }
+ }
+ },
+ "sort": {
+ "_id": 1
+ }
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "0.0"
+ }
+ },
+ {
+ "_id": 1,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "1.0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Find with $lt below min",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDoublePrecision": {
+ "$lt": {
+ "$numberDouble": "0.0"
+ }
+ }
+ }
+ },
+ "result": {
+ "errorContains": "must be greater than the range minimum"
+ }
+ }
+ ]
+ },
+ {
+ "description": "Find with $gt above max",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDoublePrecision": {
+ "$gt": {
+ "$numberDouble": "200.0"
+ }
+ }
+ }
+ },
+ "result": {
+ "errorContains": "must be less than the range max"
+ }
+ }
+ ]
+ },
+ {
+ "description": "Find with $gt and $lt",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDoublePrecision": {
+ "$gt": {
+ "$numberDouble": "0.0"
+ },
+ "$lt": {
+ "$numberDouble": "2.0"
+ }
+ }
+ }
+ },
+ "result": [
+ {
+ "_id": 1,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "1.0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Find with equality",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDoublePrecision": {
+ "$numberDouble": "0.0"
+ }
+ }
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "0.0"
+ }
+ }
+ ]
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDoublePrecision": {
+ "$numberDouble": "1.0"
+ }
+ }
+ },
+ "result": [
+ {
+ "_id": 1,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "1.0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Find with full range",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDoublePrecision": {
+ "$gte": {
+ "$numberDouble": "0.0"
+ },
+ "$lte": {
+ "$numberDouble": "200.0"
+ }
+ }
+ },
+ "sort": {
+ "_id": 1
+ }
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "0.0"
+ }
+ },
+ {
+ "_id": 1,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "1.0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Find with $in",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDoublePrecision": {
+ "$in": [
+ {
+ "$numberDouble": "0.0"
+ }
+ ]
+ }
+ }
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "0.0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Insert out of range",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "-1"
+ }
+ }
+ },
+ "result": {
+ "errorContains": "value must be greater than or equal to the minimum value"
+ }
+ }
+ ]
+ },
+ {
+ "description": "Insert min and max",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 200,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "200.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {},
+ "sort": {
+ "_id": 1
+ }
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "0.0"
+ }
+ },
+ {
+ "_id": 200,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "200.0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with $gte",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedDoublePrecision": {
+ "$gte": {
+ "$numberDouble": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "$sort": {
+ "_id": 1
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "0.0"
+ }
+ },
+ {
+ "_id": 1,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "1.0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with $gt with no results",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedDoublePrecision": {
+ "$gt": {
+ "$numberDouble": "1.0"
+ }
+ }
+ }
+ }
+ ]
+ },
+ "result": []
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with $lt",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedDoublePrecision": {
+ "$lt": {
+ "$numberDouble": "1.0"
+ }
+ }
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "0.0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with $lte",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedDoublePrecision": {
+ "$lte": {
+ "$numberDouble": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "$sort": {
+ "_id": 1
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "0.0"
+ }
+ },
+ {
+ "_id": 1,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "1.0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with $lt below min",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedDoublePrecision": {
+ "$lt": {
+ "$numberDouble": "0.0"
+ }
+ }
+ }
+ }
+ ]
+ },
+ "result": {
+ "errorContains": "must be greater than the range minimum"
+ }
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with $gt above max",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedDoublePrecision": {
+ "$gt": {
+ "$numberDouble": "200.0"
+ }
+ }
+ }
+ }
+ ]
+ },
+ "result": {
+ "errorContains": "must be less than the range max"
+ }
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with $gt and $lt",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedDoublePrecision": {
+ "$gt": {
+ "$numberDouble": "0.0"
+ },
+ "$lt": {
+ "$numberDouble": "2.0"
+ }
+ }
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 1,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "1.0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with equality",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedDoublePrecision": {
+ "$numberDouble": "0.0"
+ }
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "0.0"
+ }
+ }
+ ]
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedDoublePrecision": {
+ "$numberDouble": "1.0"
+ }
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 1,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "1.0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with full range",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedDoublePrecision": {
+ "$gte": {
+ "$numberDouble": "0.0"
+ },
+ "$lte": {
+ "$numberDouble": "200.0"
+ }
+ }
+ }
+ },
+ {
+ "$sort": {
+ "_id": 1
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "0.0"
+ }
+ },
+ {
+ "_id": 1,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "1.0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with $in",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "0.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "1.0"
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedDoublePrecision": {
+ "$in": [
+ {
+ "$numberDouble": "0.0"
+ }
+ ]
+ }
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "0.0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Wrong type: Insert Int",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDoublePrecision": {
+ "$numberInt": "0"
+ }
+ }
+ },
+ "result": {
+ "errorContains": "cannot encrypt element"
+ }
+ }
+ ]
+ },
+ {
+ "description": "Wrong type: Find Int",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDoublePrecision": {
+ "$gte": {
+ "$numberInt": "0"
+ }
+ }
+ },
+ "sort": {
+ "_id": 1
+ }
+ },
+ "result": {
+ "errorContains": "field type is not supported"
+ }
+ }
+ ]
+ }
+ ]
+}
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-DoublePrecision-Correctness.yml b/specifications/client-side-encryption/tests/legacy/fle2-Range-DoublePrecision-Correctness.yml
new file mode 100644
index 00000000000..291ffa58ab8
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-DoublePrecision-Correctness.yml
@@ -0,0 +1,422 @@
+# Test correctness results.
+# Does not include command monitoring expectations or outcome assertions to make tests more readable.
+# Requires libmongocrypt 1.7.0.
+runOn:
+ - minServerVersion: "6.2.0"
+ # FLE 2 Encrypted collections are not supported on standalone.
+ topology: [ "replicaset", "sharded", "load-balanced" ]
+database_name: &database_name "default"
+collection_name: &collection_name "default"
+data: []
+encrypted_fields: &encrypted_fields {'escCollection': 'enxcol_.default.esc', 'eccCollection': 'enxcol_.default.ecc', 'ecocCollection': 'enxcol_.default.ecoc', 'fields': [{'keyId': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'path': 'encryptedDoublePrecision', 'bsonType': 'double', 'queries': {'queryType': 'rangePreview', 'contention': {'$numberLong': '0'}, 'sparsity': {'$numberLong': '1'}, 'min': {'$numberDouble': '0.0'}, 'max': {'$numberDouble': '200.0'}, 'precision': {'$numberInt': '2'}}}]}
+key_vault_data: [ {'_id': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'keyMaterial': {'$binary': {'base64': 'sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==', 'subType': '00'}}, 'creationDate': {'$date': {'$numberLong': '1648914851981'}}, 'updateDate': {'$date': {'$numberLong': '1648914851981'}}, 'status': {'$numberInt': '0'}, 'masterKey': {'provider': 'local'}} ]
+tests:
+ - description: "Find with $gt"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments:
+ document: &doc0 { _id: 0, encryptedDoublePrecision: { $numberDouble: "0.0" } }
+ - name: insertOne
+ arguments:
+ document: &doc1 { _id: 1, encryptedDoublePrecision: { $numberDouble: "1.0" } }
+ - name: find
+ arguments:
+ filter: { encryptedDoublePrecision: { $gt: { $numberDouble: "0.0" } }}
+ result: [*doc1]
+
+ - description: "Find with $gte"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedDoublePrecision: { $gte: { $numberDouble: "0.0" } }}
+ # sort so results from range queries are ordered.
+ sort: { _id: 1 }
+ result: [*doc0, *doc1]
+
+ - description: "Find with $gt with no results"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedDoublePrecision: { $gt: { $numberDouble: "1.0" } }}
+ result: []
+
+ - description: "Find with $lt"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedDoublePrecision: { $lt: { $numberDouble: "1.0" } }}
+ result: [*doc0]
+
+ - description: "Find with $lte"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedDoublePrecision: { $lte: { $numberDouble: "1.0" } }}
+ # sort so results from range queries are ordered.
+ sort: { _id: 1 }
+ result: [*doc0, *doc1]
+
+ - description: "Find with $lt below min"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedDoublePrecision: { $lt: { $numberDouble: "0.0" } }}
+ result:
+ errorContains: must be greater than the range minimum
+
+ - description: "Find with $gt above max"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedDoublePrecision: { $gt: { $numberDouble: "200.0" } }}
+ result:
+ errorContains: must be less than the range max
+
+ - description: "Find with $gt and $lt"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedDoublePrecision: { $gt: { $numberDouble: "0.0" }, $lt: { $numberDouble: "2.0"} }}
+ result: [*doc1]
+
+ - description: "Find with equality"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedDoublePrecision: { $numberDouble: "0.0" } }
+ result: [*doc0]
+ - name: find
+ arguments:
+ filter: { encryptedDoublePrecision: { $numberDouble: "1.0" } }
+ result: [*doc1]
+
+ - description: "Find with full range"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedDoublePrecision: { $gte: {$numberDouble: "0.0"}, $lte: {$numberDouble: "200.0"} } }
+ # sort so results from range queries are ordered.
+ sort: { _id: 1 }
+ result: [*doc0, *doc1]
+
+ - description: "Find with $in"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedDoublePrecision: { $in: [ {$numberDouble: "0.0"} ] } }
+ result: [*doc0]
+
+ - description: "Insert out of range"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments:
+ document: { _id: 0, encryptedDoublePrecision: { $numberDouble: "-1" }}
+ result:
+ errorContains: value must be greater than or equal to the minimum value
+
+ - description: "Insert min and max"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments:
+ document: *doc0
+ - name: insertOne
+ arguments:
+ document: &doc200 { _id: 200, encryptedDoublePrecision: { $numberDouble: "200.0" }}
+ - name: find
+ arguments:
+ filter: {}
+ # sort so results from range queries are ordered.
+ sort: { _id: 1 }
+ result: [*doc0, *doc200]
+
+ - description: "Aggregate with $gte"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedDoublePrecision: { $gte: { $numberDouble: "0.0" } }} }
+ # sort so results from range queries are ordered.
+ - { $sort: { _id: 1 }}
+ result: [*doc0, *doc1]
+
+ - description: "Aggregate with $gt with no results"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedDoublePrecision: { $gt: { $numberDouble: "1.0" } }} }
+ result: []
+
+ - description: "Aggregate with $lt"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedDoublePrecision: { $lt: { $numberDouble: "1.0" } }} }
+ result: [*doc0]
+
+ - description: "Aggregate with $lte"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedDoublePrecision: { $lte: { $numberDouble: "1.0" } }} }
+ # sort so results from range queries are ordered.
+ - { $sort: { _id: 1 }}
+ result: [*doc0, *doc1]
+
+ - description: "Aggregate with $lt below min"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedDoublePrecision: { $lt: { $numberDouble: "0.0" } }} }
+ result:
+ errorContains: must be greater than the range minimum
+
+ - description: "Aggregate with $gt above max"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedDoublePrecision: { $gt: { $numberDouble: "200.0" } }} }
+ result:
+ errorContains: must be less than the range max
+
+ - description: "Aggregate with $gt and $lt"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedDoublePrecision: { $gt: { $numberDouble: "0.0" }, $lt: { $numberDouble: "2.0"} }} }
+ result: [*doc1]
+
+ - description: "Aggregate with equality"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedDoublePrecision: { $numberDouble: "0.0" } } }
+ result: [*doc0]
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedDoublePrecision: { $numberDouble: "1.0" } } }
+ result: [*doc1]
+
+ - description: "Aggregate with full range"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedDoublePrecision: { $gte: {$numberDouble: "0.0"}, $lte: {$numberDouble: "200.0"} } } }
+ # sort so results from range queries are ordered.
+ - { $sort: { _id: 1 }}
+ result: [*doc0, *doc1]
+
+ - description: "Aggregate with $in"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedDoublePrecision: { $in: [ {$numberDouble: "0.0"} ] } } }
+ result: [*doc0]
+
+ - description: "Wrong type: Insert Int"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: { _id: 0, encryptedDoublePrecision: { $numberInt: "0" }} }
+ result:
+ # Expect an error from mongocryptd.
+ errorContains: "cannot encrypt element"
+
+ - description: "Wrong type: Find Int"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: find
+ arguments:
+ filter: { encryptedDoublePrecision: { $gte: { $numberInt: "0" } }}
+ # sort so results from range queries are ordered.
+ sort: { _id: 1 }
+ result:
+ # expect an error from libmongocrypt.
+ errorContains: "field type is not supported"
\ No newline at end of file
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-DoublePrecision-Delete.json b/specifications/client-side-encryption/tests/legacy/fle2-Range-DoublePrecision-Delete.json
new file mode 100644
index 00000000000..d6a9c4b7e7a
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-DoublePrecision-Delete.json
@@ -0,0 +1,491 @@
+{
+ "runOn": [
+ {
+ "minServerVersion": "6.2.0",
+ "topology": [
+ "replicaset",
+ "sharded",
+ "load-balanced"
+ ]
+ }
+ ],
+ "database_name": "default",
+ "collection_name": "default",
+ "data": [],
+ "encrypted_fields": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDoublePrecision",
+ "bsonType": "double",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberDouble": "0.0"
+ },
+ "max": {
+ "$numberDouble": "200.0"
+ },
+ "precision": {
+ "$numberInt": "2"
+ }
+ }
+ }
+ ]
+ },
+ "key_vault_data": [
+ {
+ "_id": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "keyMaterial": {
+ "$binary": {
+ "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==",
+ "subType": "00"
+ }
+ },
+ "creationDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "updateDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "status": {
+ "$numberInt": "0"
+ },
+ "masterKey": {
+ "provider": "local"
+ }
+ }
+ ],
+ "tests": [
+ {
+ "description": "FLE2 Range DoublePrecision. Delete.",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "deleteOne",
+ "arguments": {
+ "filter": {
+ "encryptedDoublePrecision": {
+ "$gt": {
+ "$numberDouble": "0"
+ }
+ }
+ }
+ },
+ "result": {
+ "deletedCount": 1
+ }
+ }
+ ],
+ "expectations": [
+ {
+ "command_started_event": {
+ "command": {
+ "listCollections": 1,
+ "filter": {
+ "name": "default"
+ }
+ },
+ "command_name": "listCollections"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "find": "datakeys",
+ "filter": {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ },
+ "$db": "keyvault",
+ "readConcern": {
+ "level": "majority"
+ }
+ },
+ "command_name": "find"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 0,
+ "encryptedDoublePrecision": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDoublePrecision",
+ "bsonType": "double",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberDouble": "0.0"
+ },
+ "max": {
+ "$numberDouble": "200.0"
+ },
+ "precision": {
+ "$numberInt": "2"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 1,
+ "encryptedDoublePrecision": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDoublePrecision",
+ "bsonType": "double",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberDouble": "0.0"
+ },
+ "max": {
+ "$numberDouble": "200.0"
+ },
+ "precision": {
+ "$numberInt": "2"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "delete": "default",
+ "deletes": [
+ {
+ "q": {
+ "encryptedDoublePrecision": {
+ "$gt": {
+ "$binary": {
+ "base64": "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",
+ "subType": "06"
+ }
+ }
+ }
+ },
+ "limit": 1
+ }
+ ],
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDoublePrecision",
+ "bsonType": "double",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberDouble": "0.0"
+ },
+ "max": {
+ "$numberDouble": "200.0"
+ },
+ "precision": {
+ "$numberInt": "2"
+ }
+ }
+ }
+ ]
+ }
+ },
+ "deleteTokens": {
+ "default.default": {
+ "encryptedDoublePrecision": {
+ "e": {
+ "$binary": {
+ "base64": "65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+w=",
+ "subType": "00"
+ }
+ },
+ "o": {
+ "$binary": {
+ "base64": "noN+05JsuO1oDg59yypIGj45i+eFH6HOTXOPpeZ//Mk=",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "command_name": "delete"
+ }
+ }
+ ],
+ "outcome": {
+ "collection": {
+ "data": [
+ {
+ "_id": 0,
+ "encryptedDoublePrecision": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Dri0CXmL78L2DOgk9w0DwxHOMGMzih7m6l59vgy+WWo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "b7d8mRzD1kI1tdc7uNL+YAUonJ6pODLsRLkArfEKSkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Xg8C1/A0KJaXOw4i+26Rv03/CydaaunOzXh0CIT+gn8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "UoKUDw2wJYToUCcFaIs03YQSTksYR0MIOTJllwODqKc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "c/5cwAT0C5jber2xlJnWD3a5tVDy0nRtr5HG02hoFOY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wSUrRXavAGaajNeqC5mEUH1K67oYl5Wy9RNIzKjwLAM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6vrp4wWDtHEgHWR99I70WVDzevg1Fk/Pw5U8gUDa0OU=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ ]
+}
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-DoublePrecision-Delete.yml b/specifications/client-side-encryption/tests/legacy/fle2-Range-DoublePrecision-Delete.yml
new file mode 100644
index 00000000000..dd8b8624712
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-DoublePrecision-Delete.yml
@@ -0,0 +1,227 @@
+# Requires libmongocrypt 1.7.0.
+runOn:
+ - minServerVersion: "6.2.0"
+ # FLE 2 Encrypted collections are not supported on standalone.
+ topology: [ "replicaset", "sharded", "load-balanced" ]
+database_name: &database_name "default"
+collection_name: &collection_name "default"
+data: []
+encrypted_fields: &encrypted_fields {'escCollection': 'enxcol_.default.esc', 'eccCollection': 'enxcol_.default.ecc', 'ecocCollection': 'enxcol_.default.ecoc', 'fields': [{'keyId': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'path': 'encryptedDoublePrecision', 'bsonType': 'double', 'queries': {'queryType': 'rangePreview', 'contention': {'$numberLong': '0'}, 'sparsity': {'$numberLong': '1'}, 'min': {'$numberDouble': '0.0'}, 'max': {'$numberDouble': '200.0'}, 'precision': {'$numberInt': '2'}}}]}
+key_vault_data: [ {'_id': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'keyMaterial': {'$binary': {'base64': 'sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==', 'subType': '00'}}, 'creationDate': {'$date': {'$numberLong': '1648914851981'}}, 'updateDate': {'$date': {'$numberLong': '1648914851981'}}, 'status': {'$numberInt': '0'}, 'masterKey': {'provider': 'local'}} ]
+tests:
+ - description: "FLE2 Range DoublePrecision. Delete."
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments:
+ document: &doc0 { _id: 0, encryptedDoublePrecision: { $numberDouble: "0" } }
+ - name: insertOne
+ arguments:
+ document: &doc1 { _id: 1, encryptedDoublePrecision: { $numberDouble: "1" } }
+ - name: deleteOne
+ arguments:
+ filter: { "encryptedDoublePrecision": { $gt: {$numberDouble: "0" }} }
+ result:
+ deletedCount: 1
+ expectations:
+ - command_started_event:
+ command:
+ listCollections: 1
+ filter:
+ name: *collection_name
+ command_name: listCollections
+ - command_started_event:
+ command:
+ find: datakeys
+ filter: {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ }
+ $db: keyvault
+ readConcern: { level: "majority" }
+ command_name: find
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc0_encrypted { "_id": 0, "encryptedDoublePrecision": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc1_encrypted { "_id": 1, "encryptedDoublePrecision": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ delete: *collection_name
+ deletes: [
+ {
+ "q": {
+ "encryptedDoublePrecision": {
+ "$gt": {
+ "$binary": {
+ "base64": "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",
+ "subType": "06"
+ }
+ }
+ }
+ },
+ "limit": 1
+ }
+ ]
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ "deleteTokens": {
+ "default.default": {
+ "encryptedDoublePrecision": {
+ "e": {
+ "$binary": {
+ "base64": "65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+w=",
+ "subType": "00"
+ }
+ },
+ "o": {
+ "$binary": {
+ "base64": "noN+05JsuO1oDg59yypIGj45i+eFH6HOTXOPpeZ//Mk=",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ command_name: delete
+ outcome:
+ collection:
+ # Outcome is checked using a separate MongoClient without auto encryption.
+ data:
+ -
+ {
+ "_id": 0,
+ "encryptedDoublePrecision": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Dri0CXmL78L2DOgk9w0DwxHOMGMzih7m6l59vgy+WWo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "b7d8mRzD1kI1tdc7uNL+YAUonJ6pODLsRLkArfEKSkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Xg8C1/A0KJaXOw4i+26Rv03/CydaaunOzXh0CIT+gn8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "UoKUDw2wJYToUCcFaIs03YQSTksYR0MIOTJllwODqKc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "c/5cwAT0C5jber2xlJnWD3a5tVDy0nRtr5HG02hoFOY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wSUrRXavAGaajNeqC5mEUH1K67oYl5Wy9RNIzKjwLAM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6vrp4wWDtHEgHWR99I70WVDzevg1Fk/Pw5U8gUDa0OU=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
\ No newline at end of file
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-DoublePrecision-FindOneAndUpdate.json b/specifications/client-side-encryption/tests/legacy/fle2-Range-DoublePrecision-FindOneAndUpdate.json
new file mode 100644
index 00000000000..0511c2e37ec
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-DoublePrecision-FindOneAndUpdate.json
@@ -0,0 +1,608 @@
+{
+ "runOn": [
+ {
+ "minServerVersion": "6.2.0",
+ "topology": [
+ "replicaset",
+ "sharded",
+ "load-balanced"
+ ]
+ }
+ ],
+ "database_name": "default",
+ "collection_name": "default",
+ "data": [],
+ "encrypted_fields": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDoublePrecision",
+ "bsonType": "double",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberDouble": "0.0"
+ },
+ "max": {
+ "$numberDouble": "200.0"
+ },
+ "precision": {
+ "$numberInt": "2"
+ }
+ }
+ }
+ ]
+ },
+ "key_vault_data": [
+ {
+ "_id": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "keyMaterial": {
+ "$binary": {
+ "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==",
+ "subType": "00"
+ }
+ },
+ "creationDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "updateDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "status": {
+ "$numberInt": "0"
+ },
+ "masterKey": {
+ "provider": "local"
+ }
+ }
+ ],
+ "tests": [
+ {
+ "description": "FLE2 Range DoublePrecision. FindOneAndUpdate.",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "findOneAndUpdate",
+ "arguments": {
+ "filter": {
+ "encryptedDoublePrecision": {
+ "$gt": {
+ "$numberDouble": "0"
+ }
+ }
+ },
+ "update": {
+ "$set": {
+ "encryptedDoublePrecision": {
+ "$numberDouble": "2"
+ }
+ }
+ },
+ "returnDocument": "Before"
+ },
+ "result": {
+ "_id": 1,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "1"
+ }
+ }
+ }
+ ],
+ "expectations": [
+ {
+ "command_started_event": {
+ "command": {
+ "listCollections": 1,
+ "filter": {
+ "name": "default"
+ }
+ },
+ "command_name": "listCollections"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "find": "datakeys",
+ "filter": {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ },
+ "$db": "keyvault",
+ "readConcern": {
+ "level": "majority"
+ }
+ },
+ "command_name": "find"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 0,
+ "encryptedDoublePrecision": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDoublePrecision",
+ "bsonType": "double",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberDouble": "0.0"
+ },
+ "max": {
+ "$numberDouble": "200.0"
+ },
+ "precision": {
+ "$numberInt": "2"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 1,
+ "encryptedDoublePrecision": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDoublePrecision",
+ "bsonType": "double",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberDouble": "0.0"
+ },
+ "max": {
+ "$numberDouble": "200.0"
+ },
+ "precision": {
+ "$numberInt": "2"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "findAndModify": "default",
+ "query": {
+ "encryptedDoublePrecision": {
+ "$gt": {
+ "$binary": {
+ "base64": "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",
+ "subType": "06"
+ }
+ }
+ }
+ },
+ "update": {
+ "$set": {
+ "encryptedDoublePrecision": {
+ "$$type": "binData"
+ }
+ }
+ },
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDoublePrecision",
+ "bsonType": "double",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberDouble": "0.0"
+ },
+ "max": {
+ "$numberDouble": "200.0"
+ },
+ "precision": {
+ "$numberInt": "2"
+ }
+ }
+ }
+ ]
+ }
+ },
+ "deleteTokens": {
+ "default.default": {
+ "encryptedDoublePrecision": {
+ "e": {
+ "$binary": {
+ "base64": "65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+w=",
+ "subType": "00"
+ }
+ },
+ "o": {
+ "$binary": {
+ "base64": "noN+05JsuO1oDg59yypIGj45i+eFH6HOTXOPpeZ//Mk=",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "command_name": "findAndModify"
+ }
+ }
+ ],
+ "outcome": {
+ "collection": {
+ "data": [
+ {
+ "_id": 0,
+ "encryptedDoublePrecision": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Dri0CXmL78L2DOgk9w0DwxHOMGMzih7m6l59vgy+WWo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "b7d8mRzD1kI1tdc7uNL+YAUonJ6pODLsRLkArfEKSkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Xg8C1/A0KJaXOw4i+26Rv03/CydaaunOzXh0CIT+gn8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "UoKUDw2wJYToUCcFaIs03YQSTksYR0MIOTJllwODqKc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "c/5cwAT0C5jber2xlJnWD3a5tVDy0nRtr5HG02hoFOY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wSUrRXavAGaajNeqC5mEUH1K67oYl5Wy9RNIzKjwLAM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6vrp4wWDtHEgHWR99I70WVDzevg1Fk/Pw5U8gUDa0OU=",
+ "subType": "00"
+ }
+ }
+ ]
+ },
+ {
+ "_id": 1,
+ "encryptedDoublePrecision": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "DLCAJs+W2PL2DV5YChCL6dYrQNr+j4p3L7xhVaub4ic=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "V6knyt7Zq2CG3++l75UtBx2m32iGAPjHiAe439Bf02w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "F08nMDWDZc+DbWM7XCEJNNCEYyinRmrvGP7EWhmp4is=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cXH4688amcDc8kZOJq4UP8cE3R58Zl7e+Qo/1jyspps=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "uURBxvTp3FBCVkd+LPqyuY7d6rMW6SGIJQEPY/wtkZI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "jG3hax1L3RBp9t38vUt53FsBxgr/+Si/vVISpAylYpE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kwtIW8MhH9Ky5xNjBx8gFA/SHh2YVphie7g5FGBzals=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FHflwFuEMu4xX0ZApHi+pdlBH+oevAtXckCUb5Wv0xU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "0OKSXELxPP85SBVwDGf3LtMEQCJ8TTkFUl/+6jlkdb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "25j9sQXZCihCmHKvTHgaBsAVZFcGPn7JjHdrCGlwyyw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "uEw0lpQtBppR3vqV9j9+NQRSBF1BzZukb8c9IhyWvxc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zVhZ7Q59O087ji49oMJvBIgeir2oqvUpnh4p53GcTow=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dowrzKs+qJhRMZyKDbhjXbuX43FbmUKOaw9I8YlOZDw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ep5B6cska6THLIF7Mn3tn3RvV9EiwLSt0eZM/CLRUDc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "URNp/YmmDh5wIZUfAzzgPyJeMNiVx9PMsz52DZRujGY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wlM4IAQhhKQEzoVqS8b1Ddd50GB95OFb9LnzOwyjCP4=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ ]
+}
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-DoublePrecision-FindOneAndUpdate.yml b/specifications/client-side-encryption/tests/legacy/fle2-Range-DoublePrecision-FindOneAndUpdate.yml
new file mode 100644
index 00000000000..a13f878e307
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-DoublePrecision-FindOneAndUpdate.yml
@@ -0,0 +1,327 @@
+# Requires libmongocrypt 1.7.0.
+runOn:
+ - minServerVersion: "6.2.0"
+ # FLE 2 Encrypted collections are not supported on standalone.
+ topology: [ "replicaset", "sharded", "load-balanced" ]
+database_name: &database_name "default"
+collection_name: &collection_name "default"
+data: []
+encrypted_fields: &encrypted_fields {'escCollection': 'enxcol_.default.esc', 'eccCollection': 'enxcol_.default.ecc', 'ecocCollection': 'enxcol_.default.ecoc', 'fields': [{'keyId': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'path': 'encryptedDoublePrecision', 'bsonType': 'double', 'queries': {'queryType': 'rangePreview', 'contention': {'$numberLong': '0'}, 'sparsity': {'$numberLong': '1'}, 'min': {'$numberDouble': '0.0'}, 'max': {'$numberDouble': '200.0'}, 'precision': {'$numberInt': '2'}}}]}
+key_vault_data: [ {'_id': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'keyMaterial': {'$binary': {'base64': 'sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==', 'subType': '00'}}, 'creationDate': {'$date': {'$numberLong': '1648914851981'}}, 'updateDate': {'$date': {'$numberLong': '1648914851981'}}, 'status': {'$numberInt': '0'}, 'masterKey': {'provider': 'local'}} ]
+tests:
+ - description: "FLE2 Range DoublePrecision. FindOneAndUpdate."
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments:
+ document: &doc0 { _id: 0, encryptedDoublePrecision: { $numberDouble: "0" } }
+ - name: insertOne
+ arguments:
+ document: &doc1 { _id: 1, encryptedDoublePrecision: { $numberDouble: "1" } }
+ - name: findOneAndUpdate
+ arguments:
+ filter: { encryptedDoublePrecision: { $gt: {$numberDouble: "0"}} }
+ update: { "$set": { "encryptedDoublePrecision": {$numberDouble: "2"}}}
+ returnDocument: Before
+ result: *doc1
+ expectations:
+ - command_started_event:
+ command:
+ listCollections: 1
+ filter:
+ name: *collection_name
+ command_name: listCollections
+ - command_started_event:
+ command:
+ find: datakeys
+ filter: {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ }
+ $db: keyvault
+ readConcern: { level: "majority" }
+ command_name: find
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc0_encrypted { "_id": 0, "encryptedDoublePrecision": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc1_encrypted { "_id": 1, "encryptedDoublePrecision": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ findAndModify: *collection_name
+ query: {
+ "encryptedDoublePrecision": {
+ "$gt": {
+ "$binary": {
+ "base64": "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",
+ "subType": "06"
+ }
+ }
+ }
+ }
+ update: { "$set": {"encryptedDoublePrecision": { $$type: "binData" }} }
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ "deleteTokens": {
+ "default.default": {
+ "encryptedDoublePrecision": {
+ "e": {
+ "$binary": {
+ "base64": "65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+w=",
+ "subType": "00"
+ }
+ },
+ "o": {
+ "$binary": {
+ "base64": "noN+05JsuO1oDg59yypIGj45i+eFH6HOTXOPpeZ//Mk=",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ command_name: findAndModify
+ outcome:
+ collection:
+ # Outcome is checked using a separate MongoClient without auto encryption.
+ data:
+ -
+ {
+ "_id": 0,
+ "encryptedDoublePrecision": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Dri0CXmL78L2DOgk9w0DwxHOMGMzih7m6l59vgy+WWo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "b7d8mRzD1kI1tdc7uNL+YAUonJ6pODLsRLkArfEKSkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Xg8C1/A0KJaXOw4i+26Rv03/CydaaunOzXh0CIT+gn8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "UoKUDw2wJYToUCcFaIs03YQSTksYR0MIOTJllwODqKc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "c/5cwAT0C5jber2xlJnWD3a5tVDy0nRtr5HG02hoFOY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wSUrRXavAGaajNeqC5mEUH1K67oYl5Wy9RNIzKjwLAM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6vrp4wWDtHEgHWR99I70WVDzevg1Fk/Pw5U8gUDa0OU=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ -
+ {
+ "_id": 1,
+ "encryptedDoublePrecision": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "DLCAJs+W2PL2DV5YChCL6dYrQNr+j4p3L7xhVaub4ic=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "V6knyt7Zq2CG3++l75UtBx2m32iGAPjHiAe439Bf02w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "F08nMDWDZc+DbWM7XCEJNNCEYyinRmrvGP7EWhmp4is=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cXH4688amcDc8kZOJq4UP8cE3R58Zl7e+Qo/1jyspps=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "uURBxvTp3FBCVkd+LPqyuY7d6rMW6SGIJQEPY/wtkZI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "jG3hax1L3RBp9t38vUt53FsBxgr/+Si/vVISpAylYpE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kwtIW8MhH9Ky5xNjBx8gFA/SHh2YVphie7g5FGBzals=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FHflwFuEMu4xX0ZApHi+pdlBH+oevAtXckCUb5Wv0xU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "0OKSXELxPP85SBVwDGf3LtMEQCJ8TTkFUl/+6jlkdb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "25j9sQXZCihCmHKvTHgaBsAVZFcGPn7JjHdrCGlwyyw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "uEw0lpQtBppR3vqV9j9+NQRSBF1BzZukb8c9IhyWvxc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zVhZ7Q59O087ji49oMJvBIgeir2oqvUpnh4p53GcTow=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dowrzKs+qJhRMZyKDbhjXbuX43FbmUKOaw9I8YlOZDw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ep5B6cska6THLIF7Mn3tn3RvV9EiwLSt0eZM/CLRUDc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "URNp/YmmDh5wIZUfAzzgPyJeMNiVx9PMsz52DZRujGY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wlM4IAQhhKQEzoVqS8b1Ddd50GB95OFb9LnzOwyjCP4=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
\ No newline at end of file
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-DoublePrecision-InsertFind.json b/specifications/client-side-encryption/tests/legacy/fle2-Range-DoublePrecision-InsertFind.json
new file mode 100644
index 00000000000..616101b4d44
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-DoublePrecision-InsertFind.json
@@ -0,0 +1,577 @@
+{
+ "runOn": [
+ {
+ "minServerVersion": "6.2.0",
+ "topology": [
+ "replicaset",
+ "sharded",
+ "load-balanced"
+ ]
+ }
+ ],
+ "database_name": "default",
+ "collection_name": "default",
+ "data": [],
+ "encrypted_fields": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDoublePrecision",
+ "bsonType": "double",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberDouble": "0.0"
+ },
+ "max": {
+ "$numberDouble": "200.0"
+ },
+ "precision": {
+ "$numberInt": "2"
+ }
+ }
+ }
+ ]
+ },
+ "key_vault_data": [
+ {
+ "_id": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "keyMaterial": {
+ "$binary": {
+ "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==",
+ "subType": "00"
+ }
+ },
+ "creationDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "updateDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "status": {
+ "$numberInt": "0"
+ },
+ "masterKey": {
+ "provider": "local"
+ }
+ }
+ ],
+ "tests": [
+ {
+ "description": "FLE2 Range DoublePrecision. Insert and Find.",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedDoublePrecision": {
+ "$gt": {
+ "$numberDouble": "0"
+ }
+ }
+ }
+ },
+ "result": [
+ {
+ "_id": 1,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "1"
+ }
+ }
+ ]
+ }
+ ],
+ "expectations": [
+ {
+ "command_started_event": {
+ "command": {
+ "listCollections": 1,
+ "filter": {
+ "name": "default"
+ }
+ },
+ "command_name": "listCollections"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "find": "datakeys",
+ "filter": {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ },
+ "$db": "keyvault",
+ "readConcern": {
+ "level": "majority"
+ }
+ },
+ "command_name": "find"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 0,
+ "encryptedDoublePrecision": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDoublePrecision",
+ "bsonType": "double",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberDouble": "0.0"
+ },
+ "max": {
+ "$numberDouble": "200.0"
+ },
+ "precision": {
+ "$numberInt": "2"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 1,
+ "encryptedDoublePrecision": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDoublePrecision",
+ "bsonType": "double",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberDouble": "0.0"
+ },
+ "max": {
+ "$numberDouble": "200.0"
+ },
+ "precision": {
+ "$numberInt": "2"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "find": "default",
+ "filter": {
+ "encryptedDoublePrecision": {
+ "$gt": {
+ "$binary": {
+ "base64": "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",
+ "subType": "06"
+ }
+ }
+ }
+ },
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDoublePrecision",
+ "bsonType": "double",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberDouble": "0.0"
+ },
+ "max": {
+ "$numberDouble": "200.0"
+ },
+ "precision": {
+ "$numberInt": "2"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "find"
+ }
+ }
+ ],
+ "outcome": {
+ "collection": {
+ "data": [
+ {
+ "_id": 0,
+ "encryptedDoublePrecision": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Dri0CXmL78L2DOgk9w0DwxHOMGMzih7m6l59vgy+WWo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "b7d8mRzD1kI1tdc7uNL+YAUonJ6pODLsRLkArfEKSkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Xg8C1/A0KJaXOw4i+26Rv03/CydaaunOzXh0CIT+gn8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "UoKUDw2wJYToUCcFaIs03YQSTksYR0MIOTJllwODqKc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "c/5cwAT0C5jber2xlJnWD3a5tVDy0nRtr5HG02hoFOY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wSUrRXavAGaajNeqC5mEUH1K67oYl5Wy9RNIzKjwLAM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6vrp4wWDtHEgHWR99I70WVDzevg1Fk/Pw5U8gUDa0OU=",
+ "subType": "00"
+ }
+ }
+ ]
+ },
+ {
+ "_id": 1,
+ "encryptedDoublePrecision": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "bE1vqWj3KNyM7cCYUv/cnYm8BPaUL3eMp5syTHq6NF4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "mVZb+Ra0EYjQ4Zrh9X//E2T8MRj7NMqm5GUJXhRrBEI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FA74j21GUEJb1DJBOpR9nVnjaDZnd8yAQNuaW9Qi26g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kJv//KVkbrobIBf+QeWC5jxn20mx/P0R1N6aCSMgKM8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zB+Whi9IUUGxfLEe+lGuIzLX4LFbIhaIAm5lRk65QTc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ybO1QU3CgvhO8JgRXH+HxKszWcpl5aGDYYVa75fHa1g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "X3Y3eSAbbMg//JgiHHiFpYOpV61t8kkDexI+CQyitH4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SlNHXyqVFGDPrX/2ppwog6l4pwj3PKda2TkZbqgfSfA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "McjV8xwTF3xI7863DYOBdyvIv6UpzThl6v9vBRk05bI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "MgwakFvPyBlwqFTbhWUF79URJQWFoJTGotlEVSPPUsQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "DyBERpMSD5lEM5Nhpcn4WGgxgn/mkUVJp+PYSLX5jsE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "I43iazc0xj1WVbYB/V+uTL/tughN1bBlxh1iypBnNsA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wjOBa/ATMuOywFmuPgC0GF/oeLqu0Z7eK5udzkTPbis=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "gRQVwiR+m+0Vg8ZDXqrQQcVnTyobwCXNaA4BCJVXtMc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "WUZ6huwx0ZbLb0R00uiC9FOJzsUocUN8qE5+YRenkvQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "7s79aKEuPgQcS/YPOOVcYNZvHIo7FFsWtFCrnDKXefA=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ ]
+}
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-DoublePrecision-InsertFind.yml b/specifications/client-side-encryption/tests/legacy/fle2-Range-DoublePrecision-InsertFind.yml
new file mode 100644
index 00000000000..1cc9969c011
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-DoublePrecision-InsertFind.yml
@@ -0,0 +1,305 @@
+# Requires libmongocrypt 1.7.0.
+runOn:
+ - minServerVersion: "6.2.0"
+ # FLE 2 Encrypted collections are not supported on standalone.
+ topology: [ "replicaset", "sharded", "load-balanced" ]
+database_name: &database_name "default"
+collection_name: &collection_name "default"
+data: []
+encrypted_fields: &encrypted_fields {'escCollection': 'enxcol_.default.esc', 'eccCollection': 'enxcol_.default.ecc', 'ecocCollection': 'enxcol_.default.ecoc', 'fields': [{'keyId': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'path': 'encryptedDoublePrecision', 'bsonType': 'double', 'queries': {'queryType': 'rangePreview', 'contention': {'$numberLong': '0'}, 'sparsity': {'$numberLong': '1'}, 'min': {'$numberDouble': '0.0'}, 'max': {'$numberDouble': '200.0'}, 'precision': {'$numberInt': '2'}}}]}
+key_vault_data: [ {'_id': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'keyMaterial': {'$binary': {'base64': 'sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==', 'subType': '00'}}, 'creationDate': {'$date': {'$numberLong': '1648914851981'}}, 'updateDate': {'$date': {'$numberLong': '1648914851981'}}, 'status': {'$numberInt': '0'}, 'masterKey': {'provider': 'local'}} ]
+tests:
+ - description: "FLE2 Range DoublePrecision. Insert and Find."
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments:
+ document: &doc0 { _id: 0, encryptedDoublePrecision: { $numberDouble: "0" } }
+ - name: insertOne
+ arguments:
+ document: &doc1 { _id: 1, encryptedDoublePrecision: { $numberDouble: "1" } }
+ - name: find
+ arguments:
+ filter: { encryptedDoublePrecision: { $gt: { $numberDouble: "0" } } }
+ result: [*doc1]
+ expectations:
+ - command_started_event:
+ command:
+ listCollections: 1
+ filter:
+ name: *collection_name
+ command_name: listCollections
+ - command_started_event:
+ command:
+ find: datakeys
+ filter: {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ }
+ $db: keyvault
+ readConcern: { level: "majority" }
+ command_name: find
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc0_encrypted { "_id": 0, "encryptedDoublePrecision": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc1_encrypted { "_id": 1, "encryptedDoublePrecision": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ find: *collection_name
+ filter:
+ "encryptedDoublePrecision": {
+ "$gt": {
+ "$binary": {
+ "base64": "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",
+ "subType": "06"
+ }
+ }
+ }
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: find
+ outcome:
+ collection:
+ # Outcome is checked using a separate MongoClient without auto encryption.
+ data:
+ -
+ {
+ "_id": 0,
+ "encryptedDoublePrecision": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Dri0CXmL78L2DOgk9w0DwxHOMGMzih7m6l59vgy+WWo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "b7d8mRzD1kI1tdc7uNL+YAUonJ6pODLsRLkArfEKSkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Xg8C1/A0KJaXOw4i+26Rv03/CydaaunOzXh0CIT+gn8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "UoKUDw2wJYToUCcFaIs03YQSTksYR0MIOTJllwODqKc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "c/5cwAT0C5jber2xlJnWD3a5tVDy0nRtr5HG02hoFOY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wSUrRXavAGaajNeqC5mEUH1K67oYl5Wy9RNIzKjwLAM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6vrp4wWDtHEgHWR99I70WVDzevg1Fk/Pw5U8gUDa0OU=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ -
+ {
+ "_id": 1,
+ "encryptedDoublePrecision": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "bE1vqWj3KNyM7cCYUv/cnYm8BPaUL3eMp5syTHq6NF4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "mVZb+Ra0EYjQ4Zrh9X//E2T8MRj7NMqm5GUJXhRrBEI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FA74j21GUEJb1DJBOpR9nVnjaDZnd8yAQNuaW9Qi26g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kJv//KVkbrobIBf+QeWC5jxn20mx/P0R1N6aCSMgKM8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zB+Whi9IUUGxfLEe+lGuIzLX4LFbIhaIAm5lRk65QTc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ybO1QU3CgvhO8JgRXH+HxKszWcpl5aGDYYVa75fHa1g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "X3Y3eSAbbMg//JgiHHiFpYOpV61t8kkDexI+CQyitH4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SlNHXyqVFGDPrX/2ppwog6l4pwj3PKda2TkZbqgfSfA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "McjV8xwTF3xI7863DYOBdyvIv6UpzThl6v9vBRk05bI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "MgwakFvPyBlwqFTbhWUF79URJQWFoJTGotlEVSPPUsQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "DyBERpMSD5lEM5Nhpcn4WGgxgn/mkUVJp+PYSLX5jsE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "I43iazc0xj1WVbYB/V+uTL/tughN1bBlxh1iypBnNsA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wjOBa/ATMuOywFmuPgC0GF/oeLqu0Z7eK5udzkTPbis=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "gRQVwiR+m+0Vg8ZDXqrQQcVnTyobwCXNaA4BCJVXtMc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "WUZ6huwx0ZbLb0R00uiC9FOJzsUocUN8qE5+YRenkvQ=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "7s79aKEuPgQcS/YPOOVcYNZvHIo7FFsWtFCrnDKXefA=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
\ No newline at end of file
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-DoublePrecision-Update.json b/specifications/client-side-encryption/tests/legacy/fle2-Range-DoublePrecision-Update.json
new file mode 100644
index 00000000000..300202e2274
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-DoublePrecision-Update.json
@@ -0,0 +1,612 @@
+{
+ "runOn": [
+ {
+ "minServerVersion": "6.2.0",
+ "topology": [
+ "replicaset",
+ "sharded",
+ "load-balanced"
+ ]
+ }
+ ],
+ "database_name": "default",
+ "collection_name": "default",
+ "data": [],
+ "encrypted_fields": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDoublePrecision",
+ "bsonType": "double",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberDouble": "0.0"
+ },
+ "max": {
+ "$numberDouble": "200.0"
+ },
+ "precision": {
+ "$numberInt": "2"
+ }
+ }
+ }
+ ]
+ },
+ "key_vault_data": [
+ {
+ "_id": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "keyMaterial": {
+ "$binary": {
+ "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==",
+ "subType": "00"
+ }
+ },
+ "creationDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "updateDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "status": {
+ "$numberInt": "0"
+ },
+ "masterKey": {
+ "provider": "local"
+ }
+ }
+ ],
+ "tests": [
+ {
+ "description": "FLE2 Range DoublePrecision. Update.",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedDoublePrecision": {
+ "$numberDouble": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "updateOne",
+ "arguments": {
+ "filter": {
+ "encryptedDoublePrecision": {
+ "$gt": {
+ "$numberDouble": "0"
+ }
+ }
+ },
+ "update": {
+ "$set": {
+ "encryptedDoublePrecision": {
+ "$numberDouble": "2"
+ }
+ }
+ }
+ },
+ "result": {
+ "matchedCount": 1,
+ "modifiedCount": 1,
+ "upsertedCount": 0
+ }
+ }
+ ],
+ "expectations": [
+ {
+ "command_started_event": {
+ "command": {
+ "listCollections": 1,
+ "filter": {
+ "name": "default"
+ }
+ },
+ "command_name": "listCollections"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "find": "datakeys",
+ "filter": {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ },
+ "$db": "keyvault",
+ "readConcern": {
+ "level": "majority"
+ }
+ },
+ "command_name": "find"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 0,
+ "encryptedDoublePrecision": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDoublePrecision",
+ "bsonType": "double",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberDouble": "0.0"
+ },
+ "max": {
+ "$numberDouble": "200.0"
+ },
+ "precision": {
+ "$numberInt": "2"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 1,
+ "encryptedDoublePrecision": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDoublePrecision",
+ "bsonType": "double",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberDouble": "0.0"
+ },
+ "max": {
+ "$numberDouble": "200.0"
+ },
+ "precision": {
+ "$numberInt": "2"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command_name": "update",
+ "command": {
+ "update": "default",
+ "ordered": true,
+ "updates": [
+ {
+ "q": {
+ "encryptedDoublePrecision": {
+ "$gt": {
+ "$binary": {
+ "base64": "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",
+ "subType": "06"
+ }
+ }
+ }
+ },
+ "u": {
+ "$set": {
+ "encryptedDoublePrecision": {
+ "$$type": "binData"
+ }
+ }
+ }
+ }
+ ],
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedDoublePrecision",
+ "bsonType": "double",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberDouble": "0.0"
+ },
+ "max": {
+ "$numberDouble": "200.0"
+ },
+ "precision": {
+ "$numberInt": "2"
+ }
+ }
+ }
+ ]
+ }
+ },
+ "deleteTokens": {
+ "default.default": {
+ "encryptedDoublePrecision": {
+ "e": {
+ "$binary": {
+ "base64": "65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+w=",
+ "subType": "00"
+ }
+ },
+ "o": {
+ "$binary": {
+ "base64": "noN+05JsuO1oDg59yypIGj45i+eFH6HOTXOPpeZ//Mk=",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "$db": "default"
+ }
+ }
+ }
+ ],
+ "outcome": {
+ "collection": {
+ "data": [
+ {
+ "_id": 0,
+ "encryptedDoublePrecision": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Dri0CXmL78L2DOgk9w0DwxHOMGMzih7m6l59vgy+WWo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "b7d8mRzD1kI1tdc7uNL+YAUonJ6pODLsRLkArfEKSkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Xg8C1/A0KJaXOw4i+26Rv03/CydaaunOzXh0CIT+gn8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "UoKUDw2wJYToUCcFaIs03YQSTksYR0MIOTJllwODqKc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "c/5cwAT0C5jber2xlJnWD3a5tVDy0nRtr5HG02hoFOY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wSUrRXavAGaajNeqC5mEUH1K67oYl5Wy9RNIzKjwLAM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6vrp4wWDtHEgHWR99I70WVDzevg1Fk/Pw5U8gUDa0OU=",
+ "subType": "00"
+ }
+ }
+ ]
+ },
+ {
+ "_id": 1,
+ "encryptedDoublePrecision": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "DLCAJs+W2PL2DV5YChCL6dYrQNr+j4p3L7xhVaub4ic=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "V6knyt7Zq2CG3++l75UtBx2m32iGAPjHiAe439Bf02w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "F08nMDWDZc+DbWM7XCEJNNCEYyinRmrvGP7EWhmp4is=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cXH4688amcDc8kZOJq4UP8cE3R58Zl7e+Qo/1jyspps=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "uURBxvTp3FBCVkd+LPqyuY7d6rMW6SGIJQEPY/wtkZI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "jG3hax1L3RBp9t38vUt53FsBxgr/+Si/vVISpAylYpE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kwtIW8MhH9Ky5xNjBx8gFA/SHh2YVphie7g5FGBzals=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FHflwFuEMu4xX0ZApHi+pdlBH+oevAtXckCUb5Wv0xU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "0OKSXELxPP85SBVwDGf3LtMEQCJ8TTkFUl/+6jlkdb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "25j9sQXZCihCmHKvTHgaBsAVZFcGPn7JjHdrCGlwyyw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "uEw0lpQtBppR3vqV9j9+NQRSBF1BzZukb8c9IhyWvxc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zVhZ7Q59O087ji49oMJvBIgeir2oqvUpnh4p53GcTow=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dowrzKs+qJhRMZyKDbhjXbuX43FbmUKOaw9I8YlOZDw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ep5B6cska6THLIF7Mn3tn3RvV9EiwLSt0eZM/CLRUDc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "URNp/YmmDh5wIZUfAzzgPyJeMNiVx9PMsz52DZRujGY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wlM4IAQhhKQEzoVqS8b1Ddd50GB95OFb9LnzOwyjCP4=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ ]
+}
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-DoublePrecision-Update.yml b/specifications/client-side-encryption/tests/legacy/fle2-Range-DoublePrecision-Update.yml
new file mode 100644
index 00000000000..116b623ac0d
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-DoublePrecision-Update.yml
@@ -0,0 +1,344 @@
+# Requires libmongocrypt 1.7.0.
+runOn:
+ - minServerVersion: "6.2.0"
+ # FLE 2 Encrypted collections are not supported on standalone.
+ topology: [ "replicaset", "sharded", "load-balanced" ]
+database_name: &database_name "default"
+collection_name: &collection_name "default"
+data: []
+encrypted_fields: &encrypted_fields {'escCollection': 'enxcol_.default.esc', 'eccCollection': 'enxcol_.default.ecc', 'ecocCollection': 'enxcol_.default.ecoc', 'fields': [{'keyId': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'path': 'encryptedDoublePrecision', 'bsonType': 'double', 'queries': {'queryType': 'rangePreview', 'contention': {'$numberLong': '0'}, 'sparsity': {'$numberLong': '1'}, 'min': {'$numberDouble': '0.0'}, 'max': {'$numberDouble': '200.0'}, 'precision': {'$numberInt': '2'}}}]}
+key_vault_data: [ {'_id': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'keyMaterial': {'$binary': {'base64': 'sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==', 'subType': '00'}}, 'creationDate': {'$date': {'$numberLong': '1648914851981'}}, 'updateDate': {'$date': {'$numberLong': '1648914851981'}}, 'status': {'$numberInt': '0'}, 'masterKey': {'provider': 'local'}} ]
+tests:
+ - description: "FLE2 Range DoublePrecision. Update."
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments:
+ document: &doc0 { _id: 0, encryptedDoublePrecision: { $numberDouble: "0" } }
+ - name: insertOne
+ arguments:
+ document: &doc1 { _id: 1, encryptedDoublePrecision: { $numberDouble: "1" } }
+ - name: updateOne
+ arguments:
+ filter: { encryptedDoublePrecision: { $gt: { $numberDouble: "0" } } }
+ update: { "$set": { "encryptedDoublePrecision": { $numberDouble: "2" } }}
+ result:
+ matchedCount: 1
+ modifiedCount: 1
+ upsertedCount: 0
+ expectations:
+ - command_started_event:
+ command:
+ listCollections: 1
+ filter:
+ name: *collection_name
+ command_name: listCollections
+ - command_started_event:
+ command:
+ find: datakeys
+ filter: {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ }
+ $db: keyvault
+ readConcern: { level: "majority" }
+ command_name: find
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc0_encrypted { "_id": 0, "encryptedDoublePrecision": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc1_encrypted { "_id": 1, "encryptedDoublePrecision": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command_name: update
+ command:
+ {
+ "update": "default",
+ "ordered": true,
+ "updates": [
+ {
+ "q": {
+ "encryptedDoublePrecision": {
+ "$gt": {
+ "$binary": {
+ "base64": "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",
+ "subType": "06"
+ }
+ }
+ }
+ },
+ "u": {
+ "$set": {
+ "encryptedDoublePrecision": { $$type: "binData" }
+ }
+ }
+ }
+ ],
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": *encrypted_fields
+ },
+ "deleteTokens": {
+ "default.default": {
+ "encryptedDoublePrecision": {
+ "e": {
+ "$binary": {
+ "base64": "65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+w=",
+ "subType": "00"
+ }
+ },
+ "o": {
+ "$binary": {
+ "base64": "noN+05JsuO1oDg59yypIGj45i+eFH6HOTXOPpeZ//Mk=",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "$db": "default"
+ }
+
+ outcome:
+ collection:
+ # Outcome is checked using a separate MongoClient without auto encryption.
+ data:
+ -
+ {
+ "_id": 0,
+ "encryptedDoublePrecision": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Dri0CXmL78L2DOgk9w0DwxHOMGMzih7m6l59vgy+WWo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "b7d8mRzD1kI1tdc7uNL+YAUonJ6pODLsRLkArfEKSkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "Xg8C1/A0KJaXOw4i+26Rv03/CydaaunOzXh0CIT+gn8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "UoKUDw2wJYToUCcFaIs03YQSTksYR0MIOTJllwODqKc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "c/5cwAT0C5jber2xlJnWD3a5tVDy0nRtr5HG02hoFOY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wSUrRXavAGaajNeqC5mEUH1K67oYl5Wy9RNIzKjwLAM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6vrp4wWDtHEgHWR99I70WVDzevg1Fk/Pw5U8gUDa0OU=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ -
+ {
+ "_id": 1,
+ "encryptedDoublePrecision": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "DLCAJs+W2PL2DV5YChCL6dYrQNr+j4p3L7xhVaub4ic=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "V6knyt7Zq2CG3++l75UtBx2m32iGAPjHiAe439Bf02w=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "F08nMDWDZc+DbWM7XCEJNNCEYyinRmrvGP7EWhmp4is=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cXH4688amcDc8kZOJq4UP8cE3R58Zl7e+Qo/1jyspps=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "uURBxvTp3FBCVkd+LPqyuY7d6rMW6SGIJQEPY/wtkZI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "jG3hax1L3RBp9t38vUt53FsBxgr/+Si/vVISpAylYpE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kwtIW8MhH9Ky5xNjBx8gFA/SHh2YVphie7g5FGBzals=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FHflwFuEMu4xX0ZApHi+pdlBH+oevAtXckCUb5Wv0xU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "0OKSXELxPP85SBVwDGf3LtMEQCJ8TTkFUl/+6jlkdb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "25j9sQXZCihCmHKvTHgaBsAVZFcGPn7JjHdrCGlwyyw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "uEw0lpQtBppR3vqV9j9+NQRSBF1BzZukb8c9IhyWvxc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zVhZ7Q59O087ji49oMJvBIgeir2oqvUpnh4p53GcTow=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "dowrzKs+qJhRMZyKDbhjXbuX43FbmUKOaw9I8YlOZDw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ep5B6cska6THLIF7Mn3tn3RvV9EiwLSt0eZM/CLRUDc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "URNp/YmmDh5wIZUfAzzgPyJeMNiVx9PMsz52DZRujGY=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "wlM4IAQhhKQEzoVqS8b1Ddd50GB95OFb9LnzOwyjCP4=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
\ No newline at end of file
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-Int-Aggregate.json b/specifications/client-side-encryption/tests/legacy/fle2-Range-Int-Aggregate.json
new file mode 100644
index 00000000000..536415f3feb
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-Int-Aggregate.json
@@ -0,0 +1,490 @@
+{
+ "runOn": [
+ {
+ "minServerVersion": "6.2.0",
+ "topology": [
+ "replicaset",
+ "sharded",
+ "load-balanced"
+ ]
+ }
+ ],
+ "database_name": "default",
+ "collection_name": "default",
+ "data": [],
+ "encrypted_fields": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedInt",
+ "bsonType": "int",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberInt": "0"
+ },
+ "max": {
+ "$numberInt": "200"
+ }
+ }
+ }
+ ]
+ },
+ "key_vault_data": [
+ {
+ "_id": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "keyMaterial": {
+ "$binary": {
+ "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==",
+ "subType": "00"
+ }
+ },
+ "creationDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "updateDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "status": {
+ "$numberInt": "0"
+ },
+ "masterKey": {
+ "provider": "local"
+ }
+ }
+ ],
+ "tests": [
+ {
+ "description": "FLE2 Range Int. Aggregate.",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedInt": {
+ "$numberInt": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedInt": {
+ "$numberInt": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedInt": {
+ "$gt": {
+ "$numberInt": "0"
+ }
+ }
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 1,
+ "encryptedInt": {
+ "$numberInt": "1"
+ }
+ }
+ ]
+ }
+ ],
+ "expectations": [
+ {
+ "command_started_event": {
+ "command": {
+ "listCollections": 1,
+ "filter": {
+ "name": "default"
+ }
+ },
+ "command_name": "listCollections"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "find": "datakeys",
+ "filter": {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ },
+ "$db": "keyvault",
+ "readConcern": {
+ "level": "majority"
+ }
+ },
+ "command_name": "find"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 0,
+ "encryptedInt": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedInt",
+ "bsonType": "int",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberInt": "0"
+ },
+ "max": {
+ "$numberInt": "200"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 1,
+ "encryptedInt": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedInt",
+ "bsonType": "int",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberInt": "0"
+ },
+ "max": {
+ "$numberInt": "200"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "aggregate": "default",
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedInt": {
+ "$gt": {
+ "$binary": {
+ "base64": "CnEFAAADcGF5bG9hZABBBQAABGcABQUAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVjACAAAAAAKs6X8gaa+AJ6PpxVicsk7iCXpSYIkQ5zB0KnXqlfCWgAAzEAfQAAAAVkACAAAAAAtL3QIvnZqCF72eS6lKr8ilff7R6kiNklokiTuaU5wNsFcwAgAAAAAEtqr3/X731VB+VrbFcY8ZrJKRo2E0Fd+C8L0EMNcvcCBWMAIAAAAABYTWOKsDZ7cgPhiKDR2bE5CFGz4MuEwZbzZ0z46eGzBQADMgB9AAAABWQAIAAAAAB99ZW/7KwXKzl5M3XQsAJ3JbEef90IoxFYBArNiYzlgQVzACAAAAAAYO/qaw0+92HAryxOUG7iK6hnIy3OaUA9jIqtHdvcq8YFYwAgAAAAABSqgKlxv5LXoxUO3zNmqGztlZhL2S150WiR/eycv7CWAAMzAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVjACAAAAAAfsofSP7nQHv8ic8ZW0aNlWxplS46Z+mywPR4rQk+wcgAAzQAfQAAAAVkACAAAAAAV22FGF7ZDwK/EYiGNMlm/QuT3saQdyJM/Fn+ZyQug1oFcwAgAAAAACo7GwCvbcs5UHQMgds9/1QMklEVdjZigpuOFGrDmmxtBWMAIAAAAADu3L42J/oqNLe/XNYpodf2fhmPdcLhqO4J24o0hiveXwADNQB9AAAABWQAIAAAAADFspsMG7yHjKppyllon1KqAsTrHaZ6JzNqnSz8o6iTvwVzACAAAAAAeiA5pqVIQQ9s6UY/P8v5Jjkl3I7iFNeLDYehikrINrsFYwAgAAAAAAUljtCIvjRnLB2UPTEeRIz11Snl5SOBUNaXMXig4rqKAAM2AH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVjACAAAAAAD51NYesiO4Fo7w7iWBfqAFxEqkaDVctpvzZ28nT4SE8AAzcAfQAAAAVkACAAAAAAYfLwnoxK6XAGQrJFy8+TIJoq38ldBaO75h4zA4ZX5tQFcwAgAAAAAC2wk8UcJH5X5XGnDBYmel6srpBkzBhHtt3Jw1u5TSJ1BWMAIAAAAABJDtFhJ2tPbowp1UUmOCN/rqSqHRL1dtMu0c47vIlK4wADOAB9AAAABWQAIAAAAADGvyrtKkIcaV17ynZA7b2k5Pz6OhvxdWNkDvDWJIja8wVzACAAAAAAOLypVKNxf/wR1G8OZjUUsTQzDYeNNhhITxGMSp7euS4FYwAgAAAAAE6kvmXPqTnYIH4EJmNhy8OLVJZFOmdiBXLMorhELjKWAAM5AH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVjACAAAAAA85AiE+bNFAYQTXQAFexgeczdVhf8FUnf16WzJlI/kmsAAAVlACAAAAAA65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+wSY20AAAAAAAAAAAAAEHBheWxvYWRJZAAAAAAAEGZpcnN0T3BlcmF0b3IAAQAAAAA=",
+ "subType": "06"
+ }
+ }
+ }
+ }
+ }
+ ],
+ "cursor": {},
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedInt",
+ "bsonType": "int",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberInt": "0"
+ },
+ "max": {
+ "$numberInt": "200"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "aggregate"
+ }
+ }
+ ],
+ "outcome": {
+ "collection": {
+ "data": [
+ {
+ "_id": 0,
+ "encryptedInt": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=",
+ "subType": "00"
+ }
+ }
+ ]
+ },
+ {
+ "_id": 1,
+ "encryptedInt": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "bE1vqWj3KNyM7cCYUv/cnYm8BPaUL3eMp5syTHq6NF4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "25j9sQXZCihCmHKvTHgaBsAVZFcGPn7JjHdrCGlwyyw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FA74j21GUEJb1DJBOpR9nVnjaDZnd8yAQNuaW9Qi26g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kJv//KVkbrobIBf+QeWC5jxn20mx/P0R1N6aCSMgKM8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zB+Whi9IUUGxfLEe+lGuIzLX4LFbIhaIAm5lRk65QTc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ybO1QU3CgvhO8JgRXH+HxKszWcpl5aGDYYVa75fHa1g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "X3Y3eSAbbMg//JgiHHiFpYOpV61t8kkDexI+CQyitH4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SlNHXyqVFGDPrX/2ppwog6l4pwj3PKda2TkZbqgfSfA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "McjV8xwTF3xI7863DYOBdyvIv6UpzThl6v9vBRk05bI=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ ]
+}
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-Int-Aggregate.yml b/specifications/client-side-encryption/tests/legacy/fle2-Range-Int-Aggregate.yml
new file mode 100644
index 00000000000..163ff4f750f
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-Int-Aggregate.yml
@@ -0,0 +1,227 @@
+# Requires libmongocrypt 1.7.0.
+runOn:
+ - minServerVersion: "6.2.0"
+ # FLE 2 Encrypted collections are not supported on standalone.
+ topology: [ "replicaset", "sharded", "load-balanced" ]
+database_name: &database_name "default"
+collection_name: &collection_name "default"
+data: []
+encrypted_fields: &encrypted_fields {'escCollection': 'enxcol_.default.esc', 'eccCollection': 'enxcol_.default.ecc', 'ecocCollection': 'enxcol_.default.ecoc', 'fields': [{'keyId': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'path': 'encryptedInt', 'bsonType': 'int', 'queries': {'queryType': 'rangePreview', 'contention': {'$numberLong': '0'}, 'sparsity': {'$numberLong': '1'}, 'min': {'$numberInt': '0'}, 'max': {'$numberInt': '200'}}}]}
+key_vault_data: [ {'_id': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'keyMaterial': {'$binary': {'base64': 'sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==', 'subType': '00'}}, 'creationDate': {'$date': {'$numberLong': '1648914851981'}}, 'updateDate': {'$date': {'$numberLong': '1648914851981'}}, 'status': {'$numberInt': '0'}, 'masterKey': {'provider': 'local'}} ]
+tests:
+ - description: "FLE2 Range Int. Aggregate."
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments:
+ document: &doc0 { _id: 0, encryptedInt: { $numberInt: "0" } }
+ - name: insertOne
+ arguments:
+ document: &doc1 { _id: 1, encryptedInt: { $numberInt: "1" } }
+ - name: aggregate
+ arguments:
+ pipeline: [{ $match: { "encryptedInt": { $gt: {$numberInt: "0" }} } }]
+ result: [*doc1]
+ expectations:
+ - command_started_event:
+ command:
+ listCollections: 1
+ filter:
+ name: *collection_name
+ command_name: listCollections
+ - command_started_event:
+ command:
+ find: datakeys
+ filter: {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ }
+ $db: keyvault
+ readConcern: { level: "majority" }
+ command_name: find
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc0_encrypted { "_id": 0, "encryptedInt": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc1_encrypted { "_id": 1, "encryptedInt": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ aggregate: *collection_name
+ pipeline: [
+ {
+ "$match": {
+ "encryptedInt": {
+ "$gt": {
+ "$binary": {
+ "base64": "CnEFAAADcGF5bG9hZABBBQAABGcABQUAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVjACAAAAAAKs6X8gaa+AJ6PpxVicsk7iCXpSYIkQ5zB0KnXqlfCWgAAzEAfQAAAAVkACAAAAAAtL3QIvnZqCF72eS6lKr8ilff7R6kiNklokiTuaU5wNsFcwAgAAAAAEtqr3/X731VB+VrbFcY8ZrJKRo2E0Fd+C8L0EMNcvcCBWMAIAAAAABYTWOKsDZ7cgPhiKDR2bE5CFGz4MuEwZbzZ0z46eGzBQADMgB9AAAABWQAIAAAAAB99ZW/7KwXKzl5M3XQsAJ3JbEef90IoxFYBArNiYzlgQVzACAAAAAAYO/qaw0+92HAryxOUG7iK6hnIy3OaUA9jIqtHdvcq8YFYwAgAAAAABSqgKlxv5LXoxUO3zNmqGztlZhL2S150WiR/eycv7CWAAMzAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVjACAAAAAAfsofSP7nQHv8ic8ZW0aNlWxplS46Z+mywPR4rQk+wcgAAzQAfQAAAAVkACAAAAAAV22FGF7ZDwK/EYiGNMlm/QuT3saQdyJM/Fn+ZyQug1oFcwAgAAAAACo7GwCvbcs5UHQMgds9/1QMklEVdjZigpuOFGrDmmxtBWMAIAAAAADu3L42J/oqNLe/XNYpodf2fhmPdcLhqO4J24o0hiveXwADNQB9AAAABWQAIAAAAADFspsMG7yHjKppyllon1KqAsTrHaZ6JzNqnSz8o6iTvwVzACAAAAAAeiA5pqVIQQ9s6UY/P8v5Jjkl3I7iFNeLDYehikrINrsFYwAgAAAAAAUljtCIvjRnLB2UPTEeRIz11Snl5SOBUNaXMXig4rqKAAM2AH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVjACAAAAAAD51NYesiO4Fo7w7iWBfqAFxEqkaDVctpvzZ28nT4SE8AAzcAfQAAAAVkACAAAAAAYfLwnoxK6XAGQrJFy8+TIJoq38ldBaO75h4zA4ZX5tQFcwAgAAAAAC2wk8UcJH5X5XGnDBYmel6srpBkzBhHtt3Jw1u5TSJ1BWMAIAAAAABJDtFhJ2tPbowp1UUmOCN/rqSqHRL1dtMu0c47vIlK4wADOAB9AAAABWQAIAAAAADGvyrtKkIcaV17ynZA7b2k5Pz6OhvxdWNkDvDWJIja8wVzACAAAAAAOLypVKNxf/wR1G8OZjUUsTQzDYeNNhhITxGMSp7euS4FYwAgAAAAAE6kvmXPqTnYIH4EJmNhy8OLVJZFOmdiBXLMorhELjKWAAM5AH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVjACAAAAAA85AiE+bNFAYQTXQAFexgeczdVhf8FUnf16WzJlI/kmsAAAVlACAAAAAA65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+wSY20AAAAAAAAAAAAAEHBheWxvYWRJZAAAAAAAEGZpcnN0T3BlcmF0b3IAAQAAAAA=",
+ "subType": "06"
+ }
+ }
+ }
+ }
+ }
+ ]
+ cursor: {}
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: aggregate
+ outcome:
+ collection:
+ # Outcome is checked using a separate MongoClient without auto encryption.
+ data:
+ -
+ {
+ "_id": 0,
+ "encryptedInt": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ -
+ {
+ "_id": 1,
+ "encryptedInt": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "bE1vqWj3KNyM7cCYUv/cnYm8BPaUL3eMp5syTHq6NF4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "25j9sQXZCihCmHKvTHgaBsAVZFcGPn7JjHdrCGlwyyw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FA74j21GUEJb1DJBOpR9nVnjaDZnd8yAQNuaW9Qi26g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kJv//KVkbrobIBf+QeWC5jxn20mx/P0R1N6aCSMgKM8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zB+Whi9IUUGxfLEe+lGuIzLX4LFbIhaIAm5lRk65QTc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ybO1QU3CgvhO8JgRXH+HxKszWcpl5aGDYYVa75fHa1g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "X3Y3eSAbbMg//JgiHHiFpYOpV61t8kkDexI+CQyitH4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SlNHXyqVFGDPrX/2ppwog6l4pwj3PKda2TkZbqgfSfA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "McjV8xwTF3xI7863DYOBdyvIv6UpzThl6v9vBRk05bI=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
\ No newline at end of file
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-Int-Correctness.json b/specifications/client-side-encryption/tests/legacy/fle2-Range-Int-Correctness.json
new file mode 100644
index 00000000000..6abd773da89
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-Int-Correctness.json
@@ -0,0 +1,1644 @@
+{
+ "runOn": [
+ {
+ "minServerVersion": "6.2.0",
+ "topology": [
+ "replicaset",
+ "sharded",
+ "load-balanced"
+ ]
+ }
+ ],
+ "database_name": "default",
+ "collection_name": "default",
+ "data": [],
+ "encrypted_fields": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedInt",
+ "bsonType": "int",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberInt": "0"
+ },
+ "max": {
+ "$numberInt": "200"
+ }
+ }
+ }
+ ]
+ },
+ "key_vault_data": [
+ {
+ "_id": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "keyMaterial": {
+ "$binary": {
+ "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==",
+ "subType": "00"
+ }
+ },
+ "creationDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "updateDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "status": {
+ "$numberInt": "0"
+ },
+ "masterKey": {
+ "provider": "local"
+ }
+ }
+ ],
+ "tests": [
+ {
+ "description": "Find with $gt",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedInt": {
+ "$numberInt": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedInt": {
+ "$numberInt": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedInt": {
+ "$gt": {
+ "$numberInt": "0"
+ }
+ }
+ }
+ },
+ "result": [
+ {
+ "_id": 1,
+ "encryptedInt": {
+ "$numberInt": "1"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Find with $gte",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedInt": {
+ "$numberInt": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedInt": {
+ "$numberInt": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedInt": {
+ "$gte": {
+ "$numberInt": "0"
+ }
+ }
+ },
+ "sort": {
+ "_id": 1
+ }
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedInt": {
+ "$numberInt": "0"
+ }
+ },
+ {
+ "_id": 1,
+ "encryptedInt": {
+ "$numberInt": "1"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Find with $gt with no results",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedInt": {
+ "$numberInt": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedInt": {
+ "$numberInt": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedInt": {
+ "$gt": {
+ "$numberInt": "1"
+ }
+ }
+ }
+ },
+ "result": []
+ }
+ ]
+ },
+ {
+ "description": "Find with $lt",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedInt": {
+ "$numberInt": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedInt": {
+ "$numberInt": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedInt": {
+ "$lt": {
+ "$numberInt": "1"
+ }
+ }
+ }
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedInt": {
+ "$numberInt": "0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Find with $lte",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedInt": {
+ "$numberInt": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedInt": {
+ "$numberInt": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedInt": {
+ "$lte": {
+ "$numberInt": "1"
+ }
+ }
+ },
+ "sort": {
+ "_id": 1
+ }
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedInt": {
+ "$numberInt": "0"
+ }
+ },
+ {
+ "_id": 1,
+ "encryptedInt": {
+ "$numberInt": "1"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Find with $lt below min",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedInt": {
+ "$numberInt": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedInt": {
+ "$numberInt": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedInt": {
+ "$lt": {
+ "$numberInt": "0"
+ }
+ }
+ }
+ },
+ "result": {
+ "errorContains": "must be greater than the range minimum"
+ }
+ }
+ ]
+ },
+ {
+ "description": "Find with $gt above max",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedInt": {
+ "$numberInt": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedInt": {
+ "$numberInt": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedInt": {
+ "$gt": {
+ "$numberInt": "200"
+ }
+ }
+ }
+ },
+ "result": {
+ "errorContains": "must be less than the range maximum"
+ }
+ }
+ ]
+ },
+ {
+ "description": "Find with $gt and $lt",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedInt": {
+ "$numberInt": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedInt": {
+ "$numberInt": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedInt": {
+ "$gt": {
+ "$numberInt": "0"
+ },
+ "$lt": {
+ "$numberInt": "2"
+ }
+ }
+ }
+ },
+ "result": [
+ {
+ "_id": 1,
+ "encryptedInt": {
+ "$numberInt": "1"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Find with equality",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedInt": {
+ "$numberInt": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedInt": {
+ "$numberInt": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedInt": {
+ "$numberInt": "0"
+ }
+ }
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedInt": {
+ "$numberInt": "0"
+ }
+ }
+ ]
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedInt": {
+ "$numberInt": "1"
+ }
+ }
+ },
+ "result": [
+ {
+ "_id": 1,
+ "encryptedInt": {
+ "$numberInt": "1"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Find with full range",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedInt": {
+ "$numberInt": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedInt": {
+ "$numberInt": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedInt": {
+ "$gte": {
+ "$numberInt": "0"
+ },
+ "$lte": {
+ "$numberInt": "200"
+ }
+ }
+ },
+ "sort": {
+ "_id": 1
+ }
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedInt": {
+ "$numberInt": "0"
+ }
+ },
+ {
+ "_id": 1,
+ "encryptedInt": {
+ "$numberInt": "1"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Find with $in",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedInt": {
+ "$numberInt": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedInt": {
+ "$numberInt": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedInt": {
+ "$in": [
+ {
+ "$numberInt": "0"
+ }
+ ]
+ }
+ }
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedInt": {
+ "$numberInt": "0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Insert out of range",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedInt": {
+ "$numberInt": "-1"
+ }
+ }
+ },
+ "result": {
+ "errorContains": "value must be greater than or equal to the minimum value"
+ }
+ }
+ ]
+ },
+ {
+ "description": "Insert min and max",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedInt": {
+ "$numberInt": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 200,
+ "encryptedInt": {
+ "$numberInt": "200"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {},
+ "sort": {
+ "_id": 1
+ }
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedInt": {
+ "$numberInt": "0"
+ }
+ },
+ {
+ "_id": 200,
+ "encryptedInt": {
+ "$numberInt": "200"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with $gte",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedInt": {
+ "$numberInt": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedInt": {
+ "$numberInt": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedInt": {
+ "$gte": {
+ "$numberInt": "0"
+ }
+ }
+ }
+ },
+ {
+ "$sort": {
+ "_id": 1
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedInt": {
+ "$numberInt": "0"
+ }
+ },
+ {
+ "_id": 1,
+ "encryptedInt": {
+ "$numberInt": "1"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with $gt with no results",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedInt": {
+ "$numberInt": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedInt": {
+ "$numberInt": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedInt": {
+ "$gt": {
+ "$numberInt": "1"
+ }
+ }
+ }
+ }
+ ]
+ },
+ "result": []
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with $lt",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedInt": {
+ "$numberInt": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedInt": {
+ "$numberInt": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedInt": {
+ "$lt": {
+ "$numberInt": "1"
+ }
+ }
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedInt": {
+ "$numberInt": "0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with $lte",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedInt": {
+ "$numberInt": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedInt": {
+ "$numberInt": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedInt": {
+ "$lte": {
+ "$numberInt": "1"
+ }
+ }
+ }
+ },
+ {
+ "$sort": {
+ "_id": 1
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedInt": {
+ "$numberInt": "0"
+ }
+ },
+ {
+ "_id": 1,
+ "encryptedInt": {
+ "$numberInt": "1"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with $lt below min",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedInt": {
+ "$numberInt": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedInt": {
+ "$numberInt": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedInt": {
+ "$lt": {
+ "$numberInt": "0"
+ }
+ }
+ }
+ }
+ ]
+ },
+ "result": {
+ "errorContains": "must be greater than the range minimum"
+ }
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with $gt above max",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedInt": {
+ "$numberInt": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedInt": {
+ "$numberInt": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedInt": {
+ "$gt": {
+ "$numberInt": "200"
+ }
+ }
+ }
+ }
+ ]
+ },
+ "result": {
+ "errorContains": "must be less than the range maximum"
+ }
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with $gt and $lt",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedInt": {
+ "$numberInt": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedInt": {
+ "$numberInt": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedInt": {
+ "$gt": {
+ "$numberInt": "0"
+ },
+ "$lt": {
+ "$numberInt": "2"
+ }
+ }
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 1,
+ "encryptedInt": {
+ "$numberInt": "1"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with equality",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedInt": {
+ "$numberInt": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedInt": {
+ "$numberInt": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedInt": {
+ "$numberInt": "0"
+ }
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedInt": {
+ "$numberInt": "0"
+ }
+ }
+ ]
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedInt": {
+ "$numberInt": "1"
+ }
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 1,
+ "encryptedInt": {
+ "$numberInt": "1"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with full range",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedInt": {
+ "$numberInt": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedInt": {
+ "$numberInt": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedInt": {
+ "$gte": {
+ "$numberInt": "0"
+ },
+ "$lte": {
+ "$numberInt": "200"
+ }
+ }
+ }
+ },
+ {
+ "$sort": {
+ "_id": 1
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedInt": {
+ "$numberInt": "0"
+ }
+ },
+ {
+ "_id": 1,
+ "encryptedInt": {
+ "$numberInt": "1"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with $in",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedInt": {
+ "$numberInt": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedInt": {
+ "$numberInt": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedInt": {
+ "$in": [
+ {
+ "$numberInt": "0"
+ }
+ ]
+ }
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedInt": {
+ "$numberInt": "0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Wrong type: Insert Double",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedInt": {
+ "$numberDouble": "0"
+ }
+ }
+ },
+ "result": {
+ "errorContains": "cannot encrypt element"
+ }
+ }
+ ]
+ },
+ {
+ "description": "Wrong type: Find Double",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedInt": {
+ "$gte": {
+ "$numberDouble": "0"
+ }
+ }
+ }
+ },
+ "result": {
+ "errorContains": "field type is not supported"
+ }
+ }
+ ]
+ }
+ ]
+}
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-Int-Correctness.yml b/specifications/client-side-encryption/tests/legacy/fle2-Range-Int-Correctness.yml
new file mode 100644
index 00000000000..db2a1e46a8f
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-Int-Correctness.yml
@@ -0,0 +1,421 @@
+# Test correctness results.
+# Does not include command monitoring expectations or outcome assertions to make tests more readable.
+# Requires libmongocrypt 1.7.0.
+runOn:
+ - minServerVersion: "6.2.0"
+ # FLE 2 Encrypted collections are not supported on standalone.
+ topology: [ "replicaset", "sharded", "load-balanced" ]
+database_name: &database_name "default"
+collection_name: &collection_name "default"
+data: []
+encrypted_fields: &encrypted_fields {'escCollection': 'enxcol_.default.esc', 'eccCollection': 'enxcol_.default.ecc', 'ecocCollection': 'enxcol_.default.ecoc', 'fields': [{'keyId': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'path': 'encryptedInt', 'bsonType': 'int', 'queries': {'queryType': 'rangePreview', 'contention': {'$numberLong': '0'}, 'sparsity': {'$numberLong': '1'}, 'min': {'$numberInt': '0'}, 'max': {'$numberInt': '200'}}}]}
+key_vault_data: [ {'_id': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'keyMaterial': {'$binary': {'base64': 'sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==', 'subType': '00'}}, 'creationDate': {'$date': {'$numberLong': '1648914851981'}}, 'updateDate': {'$date': {'$numberLong': '1648914851981'}}, 'status': {'$numberInt': '0'}, 'masterKey': {'provider': 'local'}} ]
+tests:
+ - description: "Find with $gt"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments:
+ document: &doc0 { _id: 0, encryptedInt: { $numberInt: "0" } }
+ - name: insertOne
+ arguments:
+ document: &doc1 { _id: 1, encryptedInt: { $numberInt: "1" } }
+ - name: find
+ arguments:
+ filter: { encryptedInt: { $gt: { $numberInt: "0" } }}
+ result: [*doc1]
+
+ - description: "Find with $gte"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedInt: { $gte: { $numberInt: "0" } }}
+ # sort so results from range queries are ordered.
+ sort: { _id: 1 }
+ result: [*doc0, *doc1]
+
+ - description: "Find with $gt with no results"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedInt: { $gt: { $numberInt: "1" } }}
+ result: []
+
+ - description: "Find with $lt"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedInt: { $lt: { $numberInt: "1" } }}
+ result: [*doc0]
+
+ - description: "Find with $lte"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedInt: { $lte: { $numberInt: "1" } }}
+ # sort so results from range queries are ordered.
+ sort: { _id: 1 }
+ result: [*doc0, *doc1]
+
+ - description: "Find with $lt below min"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedInt: { $lt: { $numberInt: "0" } }}
+ result:
+ errorContains: must be greater than the range minimum
+
+ - description: "Find with $gt above max"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedInt: { $gt: { $numberInt: "200" } }}
+ result:
+ errorContains: must be less than the range maximum
+
+ - description: "Find with $gt and $lt"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedInt: { $gt: { $numberInt: "0" }, $lt: { $numberInt: "2"} }}
+ result: [*doc1]
+
+ - description: "Find with equality"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedInt: { $numberInt: "0" } }
+ result: [*doc0]
+ - name: find
+ arguments:
+ filter: { encryptedInt: { $numberInt: "1" } }
+ result: [*doc1]
+
+ - description: "Find with full range"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedInt: { $gte: {$numberInt: "0"}, $lte: {$numberInt: "200"} } }
+ # sort so results from range queries are ordered.
+ sort: { _id: 1 }
+ result: [*doc0, *doc1]
+
+ - description: "Find with $in"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedInt: { $in: [ {$numberInt: "0"} ] } }
+ result: [*doc0]
+
+ - description: "Insert out of range"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments:
+ document: { _id: 0, encryptedInt: { $numberInt: "-1" }}
+ result:
+ errorContains: value must be greater than or equal to the minimum value
+
+ - description: "Insert min and max"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments:
+ document: *doc0
+ - name: insertOne
+ arguments:
+ document: &doc200 { _id: 200, encryptedInt: { $numberInt: "200" }}
+ - name: find
+ arguments:
+ filter: {}
+ # sort so results from range queries are ordered.
+ sort: { _id: 1 }
+ result: [*doc0, *doc200]
+
+ - description: "Aggregate with $gte"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedInt: { $gte: { $numberInt: "0" } }} }
+ # sort so results from range queries are ordered.
+ - { $sort: { _id: 1 }}
+
+ result: [*doc0, *doc1]
+
+ - description: "Aggregate with $gt with no results"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedInt: { $gt: { $numberInt: "1" } }} }
+ result: []
+
+ - description: "Aggregate with $lt"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedInt: { $lt: { $numberInt: "1" } }} }
+ result: [*doc0]
+
+ - description: "Aggregate with $lte"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedInt: { $lte: { $numberInt: "1" } }} }
+ # sort so results from range queries are ordered.
+ - { $sort: { _id: 1 }}
+ result: [*doc0, *doc1]
+
+ - description: "Aggregate with $lt below min"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedInt: { $lt: { $numberInt: "0" } }} }
+ result:
+ errorContains: must be greater than the range minimum
+
+ - description: "Aggregate with $gt above max"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedInt: { $gt: { $numberInt: "200" } }} }
+ result:
+ errorContains: must be less than the range maximum
+
+ - description: "Aggregate with $gt and $lt"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedInt: { $gt: { $numberInt: "0" }, $lt: { $numberInt: "2"} }} }
+ result: [*doc1]
+
+ - description: "Aggregate with equality"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedInt: { $numberInt: "0" } } }
+ result: [*doc0]
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedInt: { $numberInt: "1" } } }
+ result: [*doc1]
+
+ - description: "Aggregate with full range"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedInt: { $gte: {$numberInt: "0"}, $lte: {$numberInt: "200"} } } }
+ # sort so results from range queries are ordered.
+ - { $sort: { _id: 1 }}
+ result: [*doc0, *doc1]
+
+ - description: "Aggregate with $in"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedInt: { $in: [ {$numberInt: "0"} ] } } }
+ result: [*doc0]
+
+ - description: "Wrong type: Insert Double"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: { _id: 0, encryptedInt: { $numberDouble: "0" }} }
+ result:
+ # Expect an error from mongocryptd.
+ errorContains: "cannot encrypt element"
+
+ - description: "Wrong type: Find Double"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: find
+ arguments:
+ filter: { encryptedInt: { $gte: { $numberDouble: "0" } }}
+ result:
+ # expect an error from libmongocrypt.
+ errorContains: "field type is not supported"
\ No newline at end of file
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-Int-Delete.json b/specifications/client-side-encryption/tests/legacy/fle2-Range-Int-Delete.json
new file mode 100644
index 00000000000..9d5bff1d19f
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-Int-Delete.json
@@ -0,0 +1,437 @@
+{
+ "runOn": [
+ {
+ "minServerVersion": "6.2.0",
+ "topology": [
+ "replicaset",
+ "sharded",
+ "load-balanced"
+ ]
+ }
+ ],
+ "database_name": "default",
+ "collection_name": "default",
+ "data": [],
+ "encrypted_fields": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedInt",
+ "bsonType": "int",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberInt": "0"
+ },
+ "max": {
+ "$numberInt": "200"
+ }
+ }
+ }
+ ]
+ },
+ "key_vault_data": [
+ {
+ "_id": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "keyMaterial": {
+ "$binary": {
+ "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==",
+ "subType": "00"
+ }
+ },
+ "creationDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "updateDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "status": {
+ "$numberInt": "0"
+ },
+ "masterKey": {
+ "provider": "local"
+ }
+ }
+ ],
+ "tests": [
+ {
+ "description": "FLE2 Range Int. Delete.",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedInt": {
+ "$numberInt": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedInt": {
+ "$numberInt": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "deleteOne",
+ "arguments": {
+ "filter": {
+ "encryptedInt": {
+ "$gt": {
+ "$numberInt": "0"
+ }
+ }
+ }
+ },
+ "result": {
+ "deletedCount": 1
+ }
+ }
+ ],
+ "expectations": [
+ {
+ "command_started_event": {
+ "command": {
+ "listCollections": 1,
+ "filter": {
+ "name": "default"
+ }
+ },
+ "command_name": "listCollections"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "find": "datakeys",
+ "filter": {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ },
+ "$db": "keyvault",
+ "readConcern": {
+ "level": "majority"
+ }
+ },
+ "command_name": "find"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 0,
+ "encryptedInt": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedInt",
+ "bsonType": "int",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberInt": "0"
+ },
+ "max": {
+ "$numberInt": "200"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 1,
+ "encryptedInt": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedInt",
+ "bsonType": "int",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberInt": "0"
+ },
+ "max": {
+ "$numberInt": "200"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "delete": "default",
+ "deletes": [
+ {
+ "q": {
+ "encryptedInt": {
+ "$gt": {
+ "$binary": {
+ "base64": "CnEFAAADcGF5bG9hZABBBQAABGcABQUAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVjACAAAAAAKs6X8gaa+AJ6PpxVicsk7iCXpSYIkQ5zB0KnXqlfCWgAAzEAfQAAAAVkACAAAAAAtL3QIvnZqCF72eS6lKr8ilff7R6kiNklokiTuaU5wNsFcwAgAAAAAEtqr3/X731VB+VrbFcY8ZrJKRo2E0Fd+C8L0EMNcvcCBWMAIAAAAABYTWOKsDZ7cgPhiKDR2bE5CFGz4MuEwZbzZ0z46eGzBQADMgB9AAAABWQAIAAAAAB99ZW/7KwXKzl5M3XQsAJ3JbEef90IoxFYBArNiYzlgQVzACAAAAAAYO/qaw0+92HAryxOUG7iK6hnIy3OaUA9jIqtHdvcq8YFYwAgAAAAABSqgKlxv5LXoxUO3zNmqGztlZhL2S150WiR/eycv7CWAAMzAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVjACAAAAAAfsofSP7nQHv8ic8ZW0aNlWxplS46Z+mywPR4rQk+wcgAAzQAfQAAAAVkACAAAAAAV22FGF7ZDwK/EYiGNMlm/QuT3saQdyJM/Fn+ZyQug1oFcwAgAAAAACo7GwCvbcs5UHQMgds9/1QMklEVdjZigpuOFGrDmmxtBWMAIAAAAADu3L42J/oqNLe/XNYpodf2fhmPdcLhqO4J24o0hiveXwADNQB9AAAABWQAIAAAAADFspsMG7yHjKppyllon1KqAsTrHaZ6JzNqnSz8o6iTvwVzACAAAAAAeiA5pqVIQQ9s6UY/P8v5Jjkl3I7iFNeLDYehikrINrsFYwAgAAAAAAUljtCIvjRnLB2UPTEeRIz11Snl5SOBUNaXMXig4rqKAAM2AH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVjACAAAAAAD51NYesiO4Fo7w7iWBfqAFxEqkaDVctpvzZ28nT4SE8AAzcAfQAAAAVkACAAAAAAYfLwnoxK6XAGQrJFy8+TIJoq38ldBaO75h4zA4ZX5tQFcwAgAAAAAC2wk8UcJH5X5XGnDBYmel6srpBkzBhHtt3Jw1u5TSJ1BWMAIAAAAABJDtFhJ2tPbowp1UUmOCN/rqSqHRL1dtMu0c47vIlK4wADOAB9AAAABWQAIAAAAADGvyrtKkIcaV17ynZA7b2k5Pz6OhvxdWNkDvDWJIja8wVzACAAAAAAOLypVKNxf/wR1G8OZjUUsTQzDYeNNhhITxGMSp7euS4FYwAgAAAAAE6kvmXPqTnYIH4EJmNhy8OLVJZFOmdiBXLMorhELjKWAAM5AH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVjACAAAAAA85AiE+bNFAYQTXQAFexgeczdVhf8FUnf16WzJlI/kmsAAAVlACAAAAAA65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+wSY20AAAAAAAAAAAAAEHBheWxvYWRJZAAAAAAAEGZpcnN0T3BlcmF0b3IAAQAAAAA=",
+ "subType": "06"
+ }
+ }
+ }
+ },
+ "limit": 1
+ }
+ ],
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedInt",
+ "bsonType": "int",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberInt": "0"
+ },
+ "max": {
+ "$numberInt": "200"
+ }
+ }
+ }
+ ]
+ }
+ },
+ "deleteTokens": {
+ "default.default": {
+ "encryptedInt": {
+ "e": {
+ "$binary": {
+ "base64": "65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+w=",
+ "subType": "00"
+ }
+ },
+ "o": {
+ "$binary": {
+ "base64": "noN+05JsuO1oDg59yypIGj45i+eFH6HOTXOPpeZ//Mk=",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "command_name": "delete"
+ }
+ }
+ ],
+ "outcome": {
+ "collection": {
+ "data": [
+ {
+ "_id": 0,
+ "encryptedInt": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ ]
+}
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-Int-Delete.yml b/specifications/client-side-encryption/tests/legacy/fle2-Range-Int-Delete.yml
new file mode 100644
index 00000000000..51a343493f1
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-Int-Delete.yml
@@ -0,0 +1,185 @@
+# Requires libmongocrypt 1.7.0.
+runOn:
+ - minServerVersion: "6.2.0"
+ # FLE 2 Encrypted collections are not supported on standalone.
+ topology: [ "replicaset", "sharded", "load-balanced" ]
+database_name: &database_name "default"
+collection_name: &collection_name "default"
+data: []
+encrypted_fields: &encrypted_fields {'escCollection': 'enxcol_.default.esc', 'eccCollection': 'enxcol_.default.ecc', 'ecocCollection': 'enxcol_.default.ecoc', 'fields': [{'keyId': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'path': 'encryptedInt', 'bsonType': 'int', 'queries': {'queryType': 'rangePreview', 'contention': {'$numberLong': '0'}, 'sparsity': {'$numberLong': '1'}, 'min': {'$numberInt': '0'}, 'max': {'$numberInt': '200'}}}]}
+key_vault_data: [ {'_id': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'keyMaterial': {'$binary': {'base64': 'sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==', 'subType': '00'}}, 'creationDate': {'$date': {'$numberLong': '1648914851981'}}, 'updateDate': {'$date': {'$numberLong': '1648914851981'}}, 'status': {'$numberInt': '0'}, 'masterKey': {'provider': 'local'}} ]
+tests:
+ - description: "FLE2 Range Int. Delete."
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments:
+ document: &doc0 { _id: 0, encryptedInt: { $numberInt: "0" } }
+ - name: insertOne
+ arguments:
+ document: &doc1 { _id: 1, encryptedInt: { $numberInt: "1" } }
+ - name: deleteOne
+ arguments:
+ filter: { "encryptedInt": { $gt: {$numberInt: "0" }} }
+ result:
+ deletedCount: 1
+ expectations:
+ - command_started_event:
+ command:
+ listCollections: 1
+ filter:
+ name: *collection_name
+ command_name: listCollections
+ - command_started_event:
+ command:
+ find: datakeys
+ filter: {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ }
+ $db: keyvault
+ readConcern: { level: "majority" }
+ command_name: find
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc0_encrypted { "_id": 0, "encryptedInt": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc1_encrypted { "_id": 1, "encryptedInt": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ delete: *collection_name
+ deletes: [
+ {
+ "q": {
+ "encryptedInt": {
+ "$gt": {
+ "$binary": {
+ "base64": "CnEFAAADcGF5bG9hZABBBQAABGcABQUAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVjACAAAAAAKs6X8gaa+AJ6PpxVicsk7iCXpSYIkQ5zB0KnXqlfCWgAAzEAfQAAAAVkACAAAAAAtL3QIvnZqCF72eS6lKr8ilff7R6kiNklokiTuaU5wNsFcwAgAAAAAEtqr3/X731VB+VrbFcY8ZrJKRo2E0Fd+C8L0EMNcvcCBWMAIAAAAABYTWOKsDZ7cgPhiKDR2bE5CFGz4MuEwZbzZ0z46eGzBQADMgB9AAAABWQAIAAAAAB99ZW/7KwXKzl5M3XQsAJ3JbEef90IoxFYBArNiYzlgQVzACAAAAAAYO/qaw0+92HAryxOUG7iK6hnIy3OaUA9jIqtHdvcq8YFYwAgAAAAABSqgKlxv5LXoxUO3zNmqGztlZhL2S150WiR/eycv7CWAAMzAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVjACAAAAAAfsofSP7nQHv8ic8ZW0aNlWxplS46Z+mywPR4rQk+wcgAAzQAfQAAAAVkACAAAAAAV22FGF7ZDwK/EYiGNMlm/QuT3saQdyJM/Fn+ZyQug1oFcwAgAAAAACo7GwCvbcs5UHQMgds9/1QMklEVdjZigpuOFGrDmmxtBWMAIAAAAADu3L42J/oqNLe/XNYpodf2fhmPdcLhqO4J24o0hiveXwADNQB9AAAABWQAIAAAAADFspsMG7yHjKppyllon1KqAsTrHaZ6JzNqnSz8o6iTvwVzACAAAAAAeiA5pqVIQQ9s6UY/P8v5Jjkl3I7iFNeLDYehikrINrsFYwAgAAAAAAUljtCIvjRnLB2UPTEeRIz11Snl5SOBUNaXMXig4rqKAAM2AH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVjACAAAAAAD51NYesiO4Fo7w7iWBfqAFxEqkaDVctpvzZ28nT4SE8AAzcAfQAAAAVkACAAAAAAYfLwnoxK6XAGQrJFy8+TIJoq38ldBaO75h4zA4ZX5tQFcwAgAAAAAC2wk8UcJH5X5XGnDBYmel6srpBkzBhHtt3Jw1u5TSJ1BWMAIAAAAABJDtFhJ2tPbowp1UUmOCN/rqSqHRL1dtMu0c47vIlK4wADOAB9AAAABWQAIAAAAADGvyrtKkIcaV17ynZA7b2k5Pz6OhvxdWNkDvDWJIja8wVzACAAAAAAOLypVKNxf/wR1G8OZjUUsTQzDYeNNhhITxGMSp7euS4FYwAgAAAAAE6kvmXPqTnYIH4EJmNhy8OLVJZFOmdiBXLMorhELjKWAAM5AH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVjACAAAAAA85AiE+bNFAYQTXQAFexgeczdVhf8FUnf16WzJlI/kmsAAAVlACAAAAAA65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+wSY20AAAAAAAAAAAAAEHBheWxvYWRJZAAAAAAAEGZpcnN0T3BlcmF0b3IAAQAAAAA=",
+ "subType": "06"
+ }
+ }
+ }
+ },
+ "limit": 1
+ }
+ ]
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ "deleteTokens": {
+ "default.default": {
+ "encryptedInt": {
+ "e": {
+ "$binary": {
+ "base64": "65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+w=",
+ "subType": "00"
+ }
+ },
+ "o": {
+ "$binary": {
+ "base64": "noN+05JsuO1oDg59yypIGj45i+eFH6HOTXOPpeZ//Mk=",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ command_name: delete
+ outcome:
+ collection:
+ # Outcome is checked using a separate MongoClient without auto encryption.
+ data:
+ -
+ {
+ "_id": 0,
+ "encryptedInt": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
\ No newline at end of file
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-Int-FindOneAndUpdate.json b/specifications/client-side-encryption/tests/legacy/fle2-Range-Int-FindOneAndUpdate.json
new file mode 100644
index 00000000000..4bf57700c94
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-Int-FindOneAndUpdate.json
@@ -0,0 +1,512 @@
+{
+ "runOn": [
+ {
+ "minServerVersion": "6.2.0",
+ "topology": [
+ "replicaset",
+ "sharded",
+ "load-balanced"
+ ]
+ }
+ ],
+ "database_name": "default",
+ "collection_name": "default",
+ "data": [],
+ "encrypted_fields": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedInt",
+ "bsonType": "int",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberInt": "0"
+ },
+ "max": {
+ "$numberInt": "200"
+ }
+ }
+ }
+ ]
+ },
+ "key_vault_data": [
+ {
+ "_id": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "keyMaterial": {
+ "$binary": {
+ "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==",
+ "subType": "00"
+ }
+ },
+ "creationDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "updateDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "status": {
+ "$numberInt": "0"
+ },
+ "masterKey": {
+ "provider": "local"
+ }
+ }
+ ],
+ "tests": [
+ {
+ "description": "FLE2 Range Int. FindOneAndUpdate.",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedInt": {
+ "$numberInt": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedInt": {
+ "$numberInt": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "findOneAndUpdate",
+ "arguments": {
+ "filter": {
+ "encryptedInt": {
+ "$gt": {
+ "$numberInt": "0"
+ }
+ }
+ },
+ "update": {
+ "$set": {
+ "encryptedInt": {
+ "$numberInt": "2"
+ }
+ }
+ },
+ "returnDocument": "Before"
+ },
+ "result": {
+ "_id": 1,
+ "encryptedInt": {
+ "$numberInt": "1"
+ }
+ }
+ }
+ ],
+ "expectations": [
+ {
+ "command_started_event": {
+ "command": {
+ "listCollections": 1,
+ "filter": {
+ "name": "default"
+ }
+ },
+ "command_name": "listCollections"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "find": "datakeys",
+ "filter": {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ },
+ "$db": "keyvault",
+ "readConcern": {
+ "level": "majority"
+ }
+ },
+ "command_name": "find"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 0,
+ "encryptedInt": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedInt",
+ "bsonType": "int",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberInt": "0"
+ },
+ "max": {
+ "$numberInt": "200"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 1,
+ "encryptedInt": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedInt",
+ "bsonType": "int",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberInt": "0"
+ },
+ "max": {
+ "$numberInt": "200"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "findAndModify": "default",
+ "query": {
+ "encryptedInt": {
+ "$gt": {
+ "$binary": {
+ "base64": "CnEFAAADcGF5bG9hZABBBQAABGcABQUAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVjACAAAAAAKs6X8gaa+AJ6PpxVicsk7iCXpSYIkQ5zB0KnXqlfCWgAAzEAfQAAAAVkACAAAAAAtL3QIvnZqCF72eS6lKr8ilff7R6kiNklokiTuaU5wNsFcwAgAAAAAEtqr3/X731VB+VrbFcY8ZrJKRo2E0Fd+C8L0EMNcvcCBWMAIAAAAABYTWOKsDZ7cgPhiKDR2bE5CFGz4MuEwZbzZ0z46eGzBQADMgB9AAAABWQAIAAAAAB99ZW/7KwXKzl5M3XQsAJ3JbEef90IoxFYBArNiYzlgQVzACAAAAAAYO/qaw0+92HAryxOUG7iK6hnIy3OaUA9jIqtHdvcq8YFYwAgAAAAABSqgKlxv5LXoxUO3zNmqGztlZhL2S150WiR/eycv7CWAAMzAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVjACAAAAAAfsofSP7nQHv8ic8ZW0aNlWxplS46Z+mywPR4rQk+wcgAAzQAfQAAAAVkACAAAAAAV22FGF7ZDwK/EYiGNMlm/QuT3saQdyJM/Fn+ZyQug1oFcwAgAAAAACo7GwCvbcs5UHQMgds9/1QMklEVdjZigpuOFGrDmmxtBWMAIAAAAADu3L42J/oqNLe/XNYpodf2fhmPdcLhqO4J24o0hiveXwADNQB9AAAABWQAIAAAAADFspsMG7yHjKppyllon1KqAsTrHaZ6JzNqnSz8o6iTvwVzACAAAAAAeiA5pqVIQQ9s6UY/P8v5Jjkl3I7iFNeLDYehikrINrsFYwAgAAAAAAUljtCIvjRnLB2UPTEeRIz11Snl5SOBUNaXMXig4rqKAAM2AH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVjACAAAAAAD51NYesiO4Fo7w7iWBfqAFxEqkaDVctpvzZ28nT4SE8AAzcAfQAAAAVkACAAAAAAYfLwnoxK6XAGQrJFy8+TIJoq38ldBaO75h4zA4ZX5tQFcwAgAAAAAC2wk8UcJH5X5XGnDBYmel6srpBkzBhHtt3Jw1u5TSJ1BWMAIAAAAABJDtFhJ2tPbowp1UUmOCN/rqSqHRL1dtMu0c47vIlK4wADOAB9AAAABWQAIAAAAADGvyrtKkIcaV17ynZA7b2k5Pz6OhvxdWNkDvDWJIja8wVzACAAAAAAOLypVKNxf/wR1G8OZjUUsTQzDYeNNhhITxGMSp7euS4FYwAgAAAAAE6kvmXPqTnYIH4EJmNhy8OLVJZFOmdiBXLMorhELjKWAAM5AH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVjACAAAAAA85AiE+bNFAYQTXQAFexgeczdVhf8FUnf16WzJlI/kmsAAAVlACAAAAAA65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+wSY20AAAAAAAAAAAAAEHBheWxvYWRJZAAAAAAAEGZpcnN0T3BlcmF0b3IAAQAAAAA=",
+ "subType": "06"
+ }
+ }
+ }
+ },
+ "update": {
+ "$set": {
+ "encryptedInt": {
+ "$$type": "binData"
+ }
+ }
+ },
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedInt",
+ "bsonType": "int",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberInt": "0"
+ },
+ "max": {
+ "$numberInt": "200"
+ }
+ }
+ }
+ ]
+ }
+ },
+ "deleteTokens": {
+ "default.default": {
+ "encryptedInt": {
+ "e": {
+ "$binary": {
+ "base64": "65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+w=",
+ "subType": "00"
+ }
+ },
+ "o": {
+ "$binary": {
+ "base64": "noN+05JsuO1oDg59yypIGj45i+eFH6HOTXOPpeZ//Mk=",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "command_name": "findAndModify"
+ }
+ }
+ ],
+ "outcome": {
+ "collection": {
+ "data": [
+ {
+ "_id": 0,
+ "encryptedInt": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=",
+ "subType": "00"
+ }
+ }
+ ]
+ },
+ {
+ "_id": 1,
+ "encryptedInt": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "DLCAJs+W2PL2DV5YChCL6dYrQNr+j4p3L7xhVaub4ic=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hyDcE6QQjPrYJaIS/n7evEZFYcm31Tj89CpEYGF45cI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "F08nMDWDZc+DbWM7XCEJNNCEYyinRmrvGP7EWhmp4is=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cXH4688amcDc8kZOJq4UP8cE3R58Zl7e+Qo/1jyspps=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "uURBxvTp3FBCVkd+LPqyuY7d6rMW6SGIJQEPY/wtkZI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "jG3hax1L3RBp9t38vUt53FsBxgr/+Si/vVISpAylYpE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kwtIW8MhH9Ky5xNjBx8gFA/SHh2YVphie7g5FGBzals=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FHflwFuEMu4xX0ZApHi+pdlBH+oevAtXckCUb5Wv0xU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ty4cnzJdAlbQKnh7px3GEYjBnvO+jIOaKjoTRDtmh3M=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ ]
+}
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-Int-FindOneAndUpdate.yml b/specifications/client-side-encryption/tests/legacy/fle2-Range-Int-FindOneAndUpdate.yml
new file mode 100644
index 00000000000..433be15d310
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-Int-FindOneAndUpdate.yml
@@ -0,0 +1,243 @@
+# Requires libmongocrypt 1.7.0.
+runOn:
+ - minServerVersion: "6.2.0"
+ # FLE 2 Encrypted collections are not supported on standalone.
+ topology: [ "replicaset", "sharded", "load-balanced" ]
+database_name: &database_name "default"
+collection_name: &collection_name "default"
+data: []
+encrypted_fields: &encrypted_fields {'escCollection': 'enxcol_.default.esc', 'eccCollection': 'enxcol_.default.ecc', 'ecocCollection': 'enxcol_.default.ecoc', 'fields': [{'keyId': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'path': 'encryptedInt', 'bsonType': 'int', 'queries': {'queryType': 'rangePreview', 'contention': {'$numberLong': '0'}, 'sparsity': {'$numberLong': '1'}, 'min': {'$numberInt': '0'}, 'max': {'$numberInt': '200'}}}]}
+key_vault_data: [ {'_id': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'keyMaterial': {'$binary': {'base64': 'sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==', 'subType': '00'}}, 'creationDate': {'$date': {'$numberLong': '1648914851981'}}, 'updateDate': {'$date': {'$numberLong': '1648914851981'}}, 'status': {'$numberInt': '0'}, 'masterKey': {'provider': 'local'}} ]
+tests:
+ - description: "FLE2 Range Int. FindOneAndUpdate."
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments:
+ document: &doc0 { _id: 0, encryptedInt: { $numberInt: "0" } }
+ - name: insertOne
+ arguments:
+ document: &doc1 { _id: 1, encryptedInt: { $numberInt: "1" } }
+ - name: findOneAndUpdate
+ arguments:
+ filter: { encryptedInt: { $gt: {$numberInt: "0"}} }
+ update: { "$set": { "encryptedInt": {$numberInt: "2"}}}
+ returnDocument: Before
+ result: *doc1
+ expectations:
+ - command_started_event:
+ command:
+ listCollections: 1
+ filter:
+ name: *collection_name
+ command_name: listCollections
+ - command_started_event:
+ command:
+ find: datakeys
+ filter: {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ }
+ $db: keyvault
+ readConcern: { level: "majority" }
+ command_name: find
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc0_encrypted { "_id": 0, "encryptedInt": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc1_encrypted { "_id": 1, "encryptedInt": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ findAndModify: *collection_name
+ query: {
+ "encryptedInt": {
+ "$gt": {
+ "$binary": {
+ "base64": "CnEFAAADcGF5bG9hZABBBQAABGcABQUAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVjACAAAAAAKs6X8gaa+AJ6PpxVicsk7iCXpSYIkQ5zB0KnXqlfCWgAAzEAfQAAAAVkACAAAAAAtL3QIvnZqCF72eS6lKr8ilff7R6kiNklokiTuaU5wNsFcwAgAAAAAEtqr3/X731VB+VrbFcY8ZrJKRo2E0Fd+C8L0EMNcvcCBWMAIAAAAABYTWOKsDZ7cgPhiKDR2bE5CFGz4MuEwZbzZ0z46eGzBQADMgB9AAAABWQAIAAAAAB99ZW/7KwXKzl5M3XQsAJ3JbEef90IoxFYBArNiYzlgQVzACAAAAAAYO/qaw0+92HAryxOUG7iK6hnIy3OaUA9jIqtHdvcq8YFYwAgAAAAABSqgKlxv5LXoxUO3zNmqGztlZhL2S150WiR/eycv7CWAAMzAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVjACAAAAAAfsofSP7nQHv8ic8ZW0aNlWxplS46Z+mywPR4rQk+wcgAAzQAfQAAAAVkACAAAAAAV22FGF7ZDwK/EYiGNMlm/QuT3saQdyJM/Fn+ZyQug1oFcwAgAAAAACo7GwCvbcs5UHQMgds9/1QMklEVdjZigpuOFGrDmmxtBWMAIAAAAADu3L42J/oqNLe/XNYpodf2fhmPdcLhqO4J24o0hiveXwADNQB9AAAABWQAIAAAAADFspsMG7yHjKppyllon1KqAsTrHaZ6JzNqnSz8o6iTvwVzACAAAAAAeiA5pqVIQQ9s6UY/P8v5Jjkl3I7iFNeLDYehikrINrsFYwAgAAAAAAUljtCIvjRnLB2UPTEeRIz11Snl5SOBUNaXMXig4rqKAAM2AH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVjACAAAAAAD51NYesiO4Fo7w7iWBfqAFxEqkaDVctpvzZ28nT4SE8AAzcAfQAAAAVkACAAAAAAYfLwnoxK6XAGQrJFy8+TIJoq38ldBaO75h4zA4ZX5tQFcwAgAAAAAC2wk8UcJH5X5XGnDBYmel6srpBkzBhHtt3Jw1u5TSJ1BWMAIAAAAABJDtFhJ2tPbowp1UUmOCN/rqSqHRL1dtMu0c47vIlK4wADOAB9AAAABWQAIAAAAADGvyrtKkIcaV17ynZA7b2k5Pz6OhvxdWNkDvDWJIja8wVzACAAAAAAOLypVKNxf/wR1G8OZjUUsTQzDYeNNhhITxGMSp7euS4FYwAgAAAAAE6kvmXPqTnYIH4EJmNhy8OLVJZFOmdiBXLMorhELjKWAAM5AH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVjACAAAAAA85AiE+bNFAYQTXQAFexgeczdVhf8FUnf16WzJlI/kmsAAAVlACAAAAAA65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+wSY20AAAAAAAAAAAAAEHBheWxvYWRJZAAAAAAAEGZpcnN0T3BlcmF0b3IAAQAAAAA=",
+ "subType": "06"
+ }
+ }
+ }
+ }
+ update: { "$set": {"encryptedInt": { $$type: "binData" }} }
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ "deleteTokens": {
+ "default.default": {
+ "encryptedInt": {
+ "e": {
+ "$binary": {
+ "base64": "65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+w=",
+ "subType": "00"
+ }
+ },
+ "o": {
+ "$binary": {
+ "base64": "noN+05JsuO1oDg59yypIGj45i+eFH6HOTXOPpeZ//Mk=",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ command_name: findAndModify
+ outcome:
+ collection:
+ # Outcome is checked using a separate MongoClient without auto encryption.
+ data:
+ -
+ {
+ "_id": 0,
+ "encryptedInt": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ -
+ {
+ "_id": 1,
+ "encryptedInt": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "DLCAJs+W2PL2DV5YChCL6dYrQNr+j4p3L7xhVaub4ic=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hyDcE6QQjPrYJaIS/n7evEZFYcm31Tj89CpEYGF45cI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "F08nMDWDZc+DbWM7XCEJNNCEYyinRmrvGP7EWhmp4is=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cXH4688amcDc8kZOJq4UP8cE3R58Zl7e+Qo/1jyspps=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "uURBxvTp3FBCVkd+LPqyuY7d6rMW6SGIJQEPY/wtkZI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "jG3hax1L3RBp9t38vUt53FsBxgr/+Si/vVISpAylYpE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kwtIW8MhH9Ky5xNjBx8gFA/SHh2YVphie7g5FGBzals=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FHflwFuEMu4xX0ZApHi+pdlBH+oevAtXckCUb5Wv0xU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ty4cnzJdAlbQKnh7px3GEYjBnvO+jIOaKjoTRDtmh3M=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
\ No newline at end of file
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-Int-InsertFind.json b/specifications/client-side-encryption/tests/legacy/fle2-Range-Int-InsertFind.json
new file mode 100644
index 00000000000..6f6022e7490
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-Int-InsertFind.json
@@ -0,0 +1,481 @@
+{
+ "runOn": [
+ {
+ "minServerVersion": "6.2.0",
+ "topology": [
+ "replicaset",
+ "sharded",
+ "load-balanced"
+ ]
+ }
+ ],
+ "database_name": "default",
+ "collection_name": "default",
+ "data": [],
+ "encrypted_fields": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedInt",
+ "bsonType": "int",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberInt": "0"
+ },
+ "max": {
+ "$numberInt": "200"
+ }
+ }
+ }
+ ]
+ },
+ "key_vault_data": [
+ {
+ "_id": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "keyMaterial": {
+ "$binary": {
+ "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==",
+ "subType": "00"
+ }
+ },
+ "creationDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "updateDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "status": {
+ "$numberInt": "0"
+ },
+ "masterKey": {
+ "provider": "local"
+ }
+ }
+ ],
+ "tests": [
+ {
+ "description": "FLE2 Range Int. Insert and Find.",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedInt": {
+ "$numberInt": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedInt": {
+ "$numberInt": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedInt": {
+ "$gt": {
+ "$numberInt": "0"
+ }
+ }
+ }
+ },
+ "result": [
+ {
+ "_id": 1,
+ "encryptedInt": {
+ "$numberInt": "1"
+ }
+ }
+ ]
+ }
+ ],
+ "expectations": [
+ {
+ "command_started_event": {
+ "command": {
+ "listCollections": 1,
+ "filter": {
+ "name": "default"
+ }
+ },
+ "command_name": "listCollections"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "find": "datakeys",
+ "filter": {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ },
+ "$db": "keyvault",
+ "readConcern": {
+ "level": "majority"
+ }
+ },
+ "command_name": "find"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 0,
+ "encryptedInt": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedInt",
+ "bsonType": "int",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberInt": "0"
+ },
+ "max": {
+ "$numberInt": "200"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 1,
+ "encryptedInt": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedInt",
+ "bsonType": "int",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberInt": "0"
+ },
+ "max": {
+ "$numberInt": "200"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "find": "default",
+ "filter": {
+ "encryptedInt": {
+ "$gt": {
+ "$binary": {
+ "base64": "CnEFAAADcGF5bG9hZABBBQAABGcABQUAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVjACAAAAAAKs6X8gaa+AJ6PpxVicsk7iCXpSYIkQ5zB0KnXqlfCWgAAzEAfQAAAAVkACAAAAAAtL3QIvnZqCF72eS6lKr8ilff7R6kiNklokiTuaU5wNsFcwAgAAAAAEtqr3/X731VB+VrbFcY8ZrJKRo2E0Fd+C8L0EMNcvcCBWMAIAAAAABYTWOKsDZ7cgPhiKDR2bE5CFGz4MuEwZbzZ0z46eGzBQADMgB9AAAABWQAIAAAAAB99ZW/7KwXKzl5M3XQsAJ3JbEef90IoxFYBArNiYzlgQVzACAAAAAAYO/qaw0+92HAryxOUG7iK6hnIy3OaUA9jIqtHdvcq8YFYwAgAAAAABSqgKlxv5LXoxUO3zNmqGztlZhL2S150WiR/eycv7CWAAMzAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVjACAAAAAAfsofSP7nQHv8ic8ZW0aNlWxplS46Z+mywPR4rQk+wcgAAzQAfQAAAAVkACAAAAAAV22FGF7ZDwK/EYiGNMlm/QuT3saQdyJM/Fn+ZyQug1oFcwAgAAAAACo7GwCvbcs5UHQMgds9/1QMklEVdjZigpuOFGrDmmxtBWMAIAAAAADu3L42J/oqNLe/XNYpodf2fhmPdcLhqO4J24o0hiveXwADNQB9AAAABWQAIAAAAADFspsMG7yHjKppyllon1KqAsTrHaZ6JzNqnSz8o6iTvwVzACAAAAAAeiA5pqVIQQ9s6UY/P8v5Jjkl3I7iFNeLDYehikrINrsFYwAgAAAAAAUljtCIvjRnLB2UPTEeRIz11Snl5SOBUNaXMXig4rqKAAM2AH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVjACAAAAAAD51NYesiO4Fo7w7iWBfqAFxEqkaDVctpvzZ28nT4SE8AAzcAfQAAAAVkACAAAAAAYfLwnoxK6XAGQrJFy8+TIJoq38ldBaO75h4zA4ZX5tQFcwAgAAAAAC2wk8UcJH5X5XGnDBYmel6srpBkzBhHtt3Jw1u5TSJ1BWMAIAAAAABJDtFhJ2tPbowp1UUmOCN/rqSqHRL1dtMu0c47vIlK4wADOAB9AAAABWQAIAAAAADGvyrtKkIcaV17ynZA7b2k5Pz6OhvxdWNkDvDWJIja8wVzACAAAAAAOLypVKNxf/wR1G8OZjUUsTQzDYeNNhhITxGMSp7euS4FYwAgAAAAAE6kvmXPqTnYIH4EJmNhy8OLVJZFOmdiBXLMorhELjKWAAM5AH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVjACAAAAAA85AiE+bNFAYQTXQAFexgeczdVhf8FUnf16WzJlI/kmsAAAVlACAAAAAA65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+wSY20AAAAAAAAAAAAAEHBheWxvYWRJZAAAAAAAEGZpcnN0T3BlcmF0b3IAAQAAAAA=",
+ "subType": "06"
+ }
+ }
+ }
+ },
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedInt",
+ "bsonType": "int",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberInt": "0"
+ },
+ "max": {
+ "$numberInt": "200"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "find"
+ }
+ }
+ ],
+ "outcome": {
+ "collection": {
+ "data": [
+ {
+ "_id": 0,
+ "encryptedInt": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=",
+ "subType": "00"
+ }
+ }
+ ]
+ },
+ {
+ "_id": 1,
+ "encryptedInt": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "bE1vqWj3KNyM7cCYUv/cnYm8BPaUL3eMp5syTHq6NF4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "25j9sQXZCihCmHKvTHgaBsAVZFcGPn7JjHdrCGlwyyw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FA74j21GUEJb1DJBOpR9nVnjaDZnd8yAQNuaW9Qi26g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kJv//KVkbrobIBf+QeWC5jxn20mx/P0R1N6aCSMgKM8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zB+Whi9IUUGxfLEe+lGuIzLX4LFbIhaIAm5lRk65QTc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ybO1QU3CgvhO8JgRXH+HxKszWcpl5aGDYYVa75fHa1g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "X3Y3eSAbbMg//JgiHHiFpYOpV61t8kkDexI+CQyitH4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SlNHXyqVFGDPrX/2ppwog6l4pwj3PKda2TkZbqgfSfA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "McjV8xwTF3xI7863DYOBdyvIv6UpzThl6v9vBRk05bI=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ ]
+}
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-Int-InsertFind.yml b/specifications/client-side-encryption/tests/legacy/fle2-Range-Int-InsertFind.yml
new file mode 100644
index 00000000000..dc5215eae64
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-Int-InsertFind.yml
@@ -0,0 +1,221 @@
+# Requires libmongocrypt 1.7.0.
+runOn:
+ - minServerVersion: "6.2.0"
+ # FLE 2 Encrypted collections are not supported on standalone.
+ topology: [ "replicaset", "sharded", "load-balanced" ]
+database_name: &database_name "default"
+collection_name: &collection_name "default"
+data: []
+encrypted_fields: &encrypted_fields {'escCollection': 'enxcol_.default.esc', 'eccCollection': 'enxcol_.default.ecc', 'ecocCollection': 'enxcol_.default.ecoc', 'fields': [{'keyId': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'path': 'encryptedInt', 'bsonType': 'int', 'queries': {'queryType': 'rangePreview', 'contention': {'$numberLong': '0'}, 'sparsity': {'$numberLong': '1'}, 'min': {'$numberInt': '0'}, 'max': {'$numberInt': '200'}}}]}
+key_vault_data: [ {'_id': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'keyMaterial': {'$binary': {'base64': 'sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==', 'subType': '00'}}, 'creationDate': {'$date': {'$numberLong': '1648914851981'}}, 'updateDate': {'$date': {'$numberLong': '1648914851981'}}, 'status': {'$numberInt': '0'}, 'masterKey': {'provider': 'local'}} ]
+tests:
+ - description: "FLE2 Range Int. Insert and Find."
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments:
+ document: &doc0 { _id: 0, encryptedInt: { $numberInt: "0" } }
+ - name: insertOne
+ arguments:
+ document: &doc1 { _id: 1, encryptedInt: { $numberInt: "1" } }
+ - name: find
+ arguments:
+ filter: { encryptedInt: { $gt: { $numberInt: "0" } } }
+ result: [*doc1]
+ expectations:
+ - command_started_event:
+ command:
+ listCollections: 1
+ filter:
+ name: *collection_name
+ command_name: listCollections
+ - command_started_event:
+ command:
+ find: datakeys
+ filter: {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ }
+ $db: keyvault
+ readConcern: { level: "majority" }
+ command_name: find
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc0_encrypted { "_id": 0, "encryptedInt": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc1_encrypted { "_id": 1, "encryptedInt": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ find: *collection_name
+ filter:
+ "encryptedInt": {
+ "$gt": {
+ "$binary": {
+ "base64": "CnEFAAADcGF5bG9hZABBBQAABGcABQUAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVjACAAAAAAKs6X8gaa+AJ6PpxVicsk7iCXpSYIkQ5zB0KnXqlfCWgAAzEAfQAAAAVkACAAAAAAtL3QIvnZqCF72eS6lKr8ilff7R6kiNklokiTuaU5wNsFcwAgAAAAAEtqr3/X731VB+VrbFcY8ZrJKRo2E0Fd+C8L0EMNcvcCBWMAIAAAAABYTWOKsDZ7cgPhiKDR2bE5CFGz4MuEwZbzZ0z46eGzBQADMgB9AAAABWQAIAAAAAB99ZW/7KwXKzl5M3XQsAJ3JbEef90IoxFYBArNiYzlgQVzACAAAAAAYO/qaw0+92HAryxOUG7iK6hnIy3OaUA9jIqtHdvcq8YFYwAgAAAAABSqgKlxv5LXoxUO3zNmqGztlZhL2S150WiR/eycv7CWAAMzAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVjACAAAAAAfsofSP7nQHv8ic8ZW0aNlWxplS46Z+mywPR4rQk+wcgAAzQAfQAAAAVkACAAAAAAV22FGF7ZDwK/EYiGNMlm/QuT3saQdyJM/Fn+ZyQug1oFcwAgAAAAACo7GwCvbcs5UHQMgds9/1QMklEVdjZigpuOFGrDmmxtBWMAIAAAAADu3L42J/oqNLe/XNYpodf2fhmPdcLhqO4J24o0hiveXwADNQB9AAAABWQAIAAAAADFspsMG7yHjKppyllon1KqAsTrHaZ6JzNqnSz8o6iTvwVzACAAAAAAeiA5pqVIQQ9s6UY/P8v5Jjkl3I7iFNeLDYehikrINrsFYwAgAAAAAAUljtCIvjRnLB2UPTEeRIz11Snl5SOBUNaXMXig4rqKAAM2AH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVjACAAAAAAD51NYesiO4Fo7w7iWBfqAFxEqkaDVctpvzZ28nT4SE8AAzcAfQAAAAVkACAAAAAAYfLwnoxK6XAGQrJFy8+TIJoq38ldBaO75h4zA4ZX5tQFcwAgAAAAAC2wk8UcJH5X5XGnDBYmel6srpBkzBhHtt3Jw1u5TSJ1BWMAIAAAAABJDtFhJ2tPbowp1UUmOCN/rqSqHRL1dtMu0c47vIlK4wADOAB9AAAABWQAIAAAAADGvyrtKkIcaV17ynZA7b2k5Pz6OhvxdWNkDvDWJIja8wVzACAAAAAAOLypVKNxf/wR1G8OZjUUsTQzDYeNNhhITxGMSp7euS4FYwAgAAAAAE6kvmXPqTnYIH4EJmNhy8OLVJZFOmdiBXLMorhELjKWAAM5AH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVjACAAAAAA85AiE+bNFAYQTXQAFexgeczdVhf8FUnf16WzJlI/kmsAAAVlACAAAAAA65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+wSY20AAAAAAAAAAAAAEHBheWxvYWRJZAAAAAAAEGZpcnN0T3BlcmF0b3IAAQAAAAA=",
+ "subType": "06"
+ }
+ }
+ }
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: find
+ outcome:
+ collection:
+ # Outcome is checked using a separate MongoClient without auto encryption.
+ data:
+ -
+ {
+ "_id": 0,
+ "encryptedInt": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ -
+ {
+ "_id": 1,
+ "encryptedInt": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "bE1vqWj3KNyM7cCYUv/cnYm8BPaUL3eMp5syTHq6NF4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "25j9sQXZCihCmHKvTHgaBsAVZFcGPn7JjHdrCGlwyyw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FA74j21GUEJb1DJBOpR9nVnjaDZnd8yAQNuaW9Qi26g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kJv//KVkbrobIBf+QeWC5jxn20mx/P0R1N6aCSMgKM8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zB+Whi9IUUGxfLEe+lGuIzLX4LFbIhaIAm5lRk65QTc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ybO1QU3CgvhO8JgRXH+HxKszWcpl5aGDYYVa75fHa1g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "X3Y3eSAbbMg//JgiHHiFpYOpV61t8kkDexI+CQyitH4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SlNHXyqVFGDPrX/2ppwog6l4pwj3PKda2TkZbqgfSfA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "McjV8xwTF3xI7863DYOBdyvIv6UpzThl6v9vBRk05bI=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
\ No newline at end of file
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-Int-Update.json b/specifications/client-side-encryption/tests/legacy/fle2-Range-Int-Update.json
new file mode 100644
index 00000000000..17d23b957f8
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-Int-Update.json
@@ -0,0 +1,516 @@
+{
+ "runOn": [
+ {
+ "minServerVersion": "6.2.0",
+ "topology": [
+ "replicaset",
+ "sharded",
+ "load-balanced"
+ ]
+ }
+ ],
+ "database_name": "default",
+ "collection_name": "default",
+ "data": [],
+ "encrypted_fields": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedInt",
+ "bsonType": "int",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberInt": "0"
+ },
+ "max": {
+ "$numberInt": "200"
+ }
+ }
+ }
+ ]
+ },
+ "key_vault_data": [
+ {
+ "_id": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "keyMaterial": {
+ "$binary": {
+ "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==",
+ "subType": "00"
+ }
+ },
+ "creationDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "updateDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "status": {
+ "$numberInt": "0"
+ },
+ "masterKey": {
+ "provider": "local"
+ }
+ }
+ ],
+ "tests": [
+ {
+ "description": "FLE2 Range Int. Update.",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedInt": {
+ "$numberInt": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedInt": {
+ "$numberInt": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "updateOne",
+ "arguments": {
+ "filter": {
+ "encryptedInt": {
+ "$gt": {
+ "$numberInt": "0"
+ }
+ }
+ },
+ "update": {
+ "$set": {
+ "encryptedInt": {
+ "$numberInt": "2"
+ }
+ }
+ }
+ },
+ "result": {
+ "matchedCount": 1,
+ "modifiedCount": 1,
+ "upsertedCount": 0
+ }
+ }
+ ],
+ "expectations": [
+ {
+ "command_started_event": {
+ "command": {
+ "listCollections": 1,
+ "filter": {
+ "name": "default"
+ }
+ },
+ "command_name": "listCollections"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "find": "datakeys",
+ "filter": {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ },
+ "$db": "keyvault",
+ "readConcern": {
+ "level": "majority"
+ }
+ },
+ "command_name": "find"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 0,
+ "encryptedInt": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedInt",
+ "bsonType": "int",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberInt": "0"
+ },
+ "max": {
+ "$numberInt": "200"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 1,
+ "encryptedInt": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedInt",
+ "bsonType": "int",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberInt": "0"
+ },
+ "max": {
+ "$numberInt": "200"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command_name": "update",
+ "command": {
+ "update": "default",
+ "ordered": true,
+ "updates": [
+ {
+ "q": {
+ "encryptedInt": {
+ "$gt": {
+ "$binary": {
+ "base64": "CnEFAAADcGF5bG9hZABBBQAABGcABQUAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVjACAAAAAAKs6X8gaa+AJ6PpxVicsk7iCXpSYIkQ5zB0KnXqlfCWgAAzEAfQAAAAVkACAAAAAAtL3QIvnZqCF72eS6lKr8ilff7R6kiNklokiTuaU5wNsFcwAgAAAAAEtqr3/X731VB+VrbFcY8ZrJKRo2E0Fd+C8L0EMNcvcCBWMAIAAAAABYTWOKsDZ7cgPhiKDR2bE5CFGz4MuEwZbzZ0z46eGzBQADMgB9AAAABWQAIAAAAAB99ZW/7KwXKzl5M3XQsAJ3JbEef90IoxFYBArNiYzlgQVzACAAAAAAYO/qaw0+92HAryxOUG7iK6hnIy3OaUA9jIqtHdvcq8YFYwAgAAAAABSqgKlxv5LXoxUO3zNmqGztlZhL2S150WiR/eycv7CWAAMzAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVjACAAAAAAfsofSP7nQHv8ic8ZW0aNlWxplS46Z+mywPR4rQk+wcgAAzQAfQAAAAVkACAAAAAAV22FGF7ZDwK/EYiGNMlm/QuT3saQdyJM/Fn+ZyQug1oFcwAgAAAAACo7GwCvbcs5UHQMgds9/1QMklEVdjZigpuOFGrDmmxtBWMAIAAAAADu3L42J/oqNLe/XNYpodf2fhmPdcLhqO4J24o0hiveXwADNQB9AAAABWQAIAAAAADFspsMG7yHjKppyllon1KqAsTrHaZ6JzNqnSz8o6iTvwVzACAAAAAAeiA5pqVIQQ9s6UY/P8v5Jjkl3I7iFNeLDYehikrINrsFYwAgAAAAAAUljtCIvjRnLB2UPTEeRIz11Snl5SOBUNaXMXig4rqKAAM2AH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVjACAAAAAAD51NYesiO4Fo7w7iWBfqAFxEqkaDVctpvzZ28nT4SE8AAzcAfQAAAAVkACAAAAAAYfLwnoxK6XAGQrJFy8+TIJoq38ldBaO75h4zA4ZX5tQFcwAgAAAAAC2wk8UcJH5X5XGnDBYmel6srpBkzBhHtt3Jw1u5TSJ1BWMAIAAAAABJDtFhJ2tPbowp1UUmOCN/rqSqHRL1dtMu0c47vIlK4wADOAB9AAAABWQAIAAAAADGvyrtKkIcaV17ynZA7b2k5Pz6OhvxdWNkDvDWJIja8wVzACAAAAAAOLypVKNxf/wR1G8OZjUUsTQzDYeNNhhITxGMSp7euS4FYwAgAAAAAE6kvmXPqTnYIH4EJmNhy8OLVJZFOmdiBXLMorhELjKWAAM5AH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVjACAAAAAA85AiE+bNFAYQTXQAFexgeczdVhf8FUnf16WzJlI/kmsAAAVlACAAAAAA65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+wSY20AAAAAAAAAAAAAEHBheWxvYWRJZAAAAAAAEGZpcnN0T3BlcmF0b3IAAQAAAAA=",
+ "subType": "06"
+ }
+ }
+ }
+ },
+ "u": {
+ "$set": {
+ "encryptedInt": {
+ "$$type": "binData"
+ }
+ }
+ }
+ }
+ ],
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedInt",
+ "bsonType": "int",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberInt": "0"
+ },
+ "max": {
+ "$numberInt": "200"
+ }
+ }
+ }
+ ]
+ }
+ },
+ "deleteTokens": {
+ "default.default": {
+ "encryptedInt": {
+ "e": {
+ "$binary": {
+ "base64": "65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+w=",
+ "subType": "00"
+ }
+ },
+ "o": {
+ "$binary": {
+ "base64": "noN+05JsuO1oDg59yypIGj45i+eFH6HOTXOPpeZ//Mk=",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "$db": "default"
+ }
+ }
+ }
+ ],
+ "outcome": {
+ "collection": {
+ "data": [
+ {
+ "_id": 0,
+ "encryptedInt": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=",
+ "subType": "00"
+ }
+ }
+ ]
+ },
+ {
+ "_id": 1,
+ "encryptedInt": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "DLCAJs+W2PL2DV5YChCL6dYrQNr+j4p3L7xhVaub4ic=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hyDcE6QQjPrYJaIS/n7evEZFYcm31Tj89CpEYGF45cI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "F08nMDWDZc+DbWM7XCEJNNCEYyinRmrvGP7EWhmp4is=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cXH4688amcDc8kZOJq4UP8cE3R58Zl7e+Qo/1jyspps=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "uURBxvTp3FBCVkd+LPqyuY7d6rMW6SGIJQEPY/wtkZI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "jG3hax1L3RBp9t38vUt53FsBxgr/+Si/vVISpAylYpE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kwtIW8MhH9Ky5xNjBx8gFA/SHh2YVphie7g5FGBzals=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FHflwFuEMu4xX0ZApHi+pdlBH+oevAtXckCUb5Wv0xU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ty4cnzJdAlbQKnh7px3GEYjBnvO+jIOaKjoTRDtmh3M=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ ]
+}
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-Int-Update.yml b/specifications/client-side-encryption/tests/legacy/fle2-Range-Int-Update.yml
new file mode 100644
index 00000000000..8e0bdcb8dc6
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-Int-Update.yml
@@ -0,0 +1,260 @@
+# Requires libmongocrypt 1.7.0.
+runOn:
+ - minServerVersion: "6.2.0"
+ # FLE 2 Encrypted collections are not supported on standalone.
+ topology: [ "replicaset", "sharded", "load-balanced" ]
+database_name: &database_name "default"
+collection_name: &collection_name "default"
+data: []
+encrypted_fields: &encrypted_fields {'escCollection': 'enxcol_.default.esc', 'eccCollection': 'enxcol_.default.ecc', 'ecocCollection': 'enxcol_.default.ecoc', 'fields': [{'keyId': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'path': 'encryptedInt', 'bsonType': 'int', 'queries': {'queryType': 'rangePreview', 'contention': {'$numberLong': '0'}, 'sparsity': {'$numberLong': '1'}, 'min': {'$numberInt': '0'}, 'max': {'$numberInt': '200'}}}]}
+key_vault_data: [ {'_id': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'keyMaterial': {'$binary': {'base64': 'sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==', 'subType': '00'}}, 'creationDate': {'$date': {'$numberLong': '1648914851981'}}, 'updateDate': {'$date': {'$numberLong': '1648914851981'}}, 'status': {'$numberInt': '0'}, 'masterKey': {'provider': 'local'}} ]
+tests:
+ - description: "FLE2 Range Int. Update."
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments:
+ document: &doc0 { _id: 0, encryptedInt: { $numberInt: "0" } }
+ - name: insertOne
+ arguments:
+ document: &doc1 { _id: 1, encryptedInt: { $numberInt: "1" } }
+ - name: updateOne
+ arguments:
+ filter: { encryptedInt: { $gt: { $numberInt: "0" } } }
+ update: { "$set": { "encryptedInt": { $numberInt: "2" } }}
+ result:
+ matchedCount: 1
+ modifiedCount: 1
+ upsertedCount: 0
+ expectations:
+ - command_started_event:
+ command:
+ listCollections: 1
+ filter:
+ name: *collection_name
+ command_name: listCollections
+ - command_started_event:
+ command:
+ find: datakeys
+ filter: {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ }
+ $db: keyvault
+ readConcern: { level: "majority" }
+ command_name: find
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc0_encrypted { "_id": 0, "encryptedInt": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc1_encrypted { "_id": 1, "encryptedInt": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command_name: update
+ command:
+ {
+ "update": "default",
+ "ordered": true,
+ "updates": [
+ {
+ "q": {
+ "encryptedInt": {
+ "$gt": {
+ "$binary": {
+ "base64": "CnEFAAADcGF5bG9hZABBBQAABGcABQUAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVjACAAAAAAKs6X8gaa+AJ6PpxVicsk7iCXpSYIkQ5zB0KnXqlfCWgAAzEAfQAAAAVkACAAAAAAtL3QIvnZqCF72eS6lKr8ilff7R6kiNklokiTuaU5wNsFcwAgAAAAAEtqr3/X731VB+VrbFcY8ZrJKRo2E0Fd+C8L0EMNcvcCBWMAIAAAAABYTWOKsDZ7cgPhiKDR2bE5CFGz4MuEwZbzZ0z46eGzBQADMgB9AAAABWQAIAAAAAB99ZW/7KwXKzl5M3XQsAJ3JbEef90IoxFYBArNiYzlgQVzACAAAAAAYO/qaw0+92HAryxOUG7iK6hnIy3OaUA9jIqtHdvcq8YFYwAgAAAAABSqgKlxv5LXoxUO3zNmqGztlZhL2S150WiR/eycv7CWAAMzAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVjACAAAAAAfsofSP7nQHv8ic8ZW0aNlWxplS46Z+mywPR4rQk+wcgAAzQAfQAAAAVkACAAAAAAV22FGF7ZDwK/EYiGNMlm/QuT3saQdyJM/Fn+ZyQug1oFcwAgAAAAACo7GwCvbcs5UHQMgds9/1QMklEVdjZigpuOFGrDmmxtBWMAIAAAAADu3L42J/oqNLe/XNYpodf2fhmPdcLhqO4J24o0hiveXwADNQB9AAAABWQAIAAAAADFspsMG7yHjKppyllon1KqAsTrHaZ6JzNqnSz8o6iTvwVzACAAAAAAeiA5pqVIQQ9s6UY/P8v5Jjkl3I7iFNeLDYehikrINrsFYwAgAAAAAAUljtCIvjRnLB2UPTEeRIz11Snl5SOBUNaXMXig4rqKAAM2AH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVjACAAAAAAD51NYesiO4Fo7w7iWBfqAFxEqkaDVctpvzZ28nT4SE8AAzcAfQAAAAVkACAAAAAAYfLwnoxK6XAGQrJFy8+TIJoq38ldBaO75h4zA4ZX5tQFcwAgAAAAAC2wk8UcJH5X5XGnDBYmel6srpBkzBhHtt3Jw1u5TSJ1BWMAIAAAAABJDtFhJ2tPbowp1UUmOCN/rqSqHRL1dtMu0c47vIlK4wADOAB9AAAABWQAIAAAAADGvyrtKkIcaV17ynZA7b2k5Pz6OhvxdWNkDvDWJIja8wVzACAAAAAAOLypVKNxf/wR1G8OZjUUsTQzDYeNNhhITxGMSp7euS4FYwAgAAAAAE6kvmXPqTnYIH4EJmNhy8OLVJZFOmdiBXLMorhELjKWAAM5AH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVjACAAAAAA85AiE+bNFAYQTXQAFexgeczdVhf8FUnf16WzJlI/kmsAAAVlACAAAAAA65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+wSY20AAAAAAAAAAAAAEHBheWxvYWRJZAAAAAAAEGZpcnN0T3BlcmF0b3IAAQAAAAA=",
+ "subType": "06"
+ }
+ }
+ }
+ },
+ "u": {
+ "$set": {
+ "encryptedInt": { $$type: "binData" }
+ }
+ }
+ }
+ ],
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": *encrypted_fields
+ },
+ "deleteTokens": {
+ "default.default": {
+ "encryptedInt": {
+ "e": {
+ "$binary": {
+ "base64": "65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+w=",
+ "subType": "00"
+ }
+ },
+ "o": {
+ "$binary": {
+ "base64": "noN+05JsuO1oDg59yypIGj45i+eFH6HOTXOPpeZ//Mk=",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "$db": "default"
+ }
+
+ outcome:
+ collection:
+ # Outcome is checked using a separate MongoClient without auto encryption.
+ data:
+ -
+ {
+ "_id": 0,
+ "encryptedInt": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ -
+ {
+ "_id": 1,
+ "encryptedInt": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "DLCAJs+W2PL2DV5YChCL6dYrQNr+j4p3L7xhVaub4ic=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hyDcE6QQjPrYJaIS/n7evEZFYcm31Tj89CpEYGF45cI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "F08nMDWDZc+DbWM7XCEJNNCEYyinRmrvGP7EWhmp4is=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cXH4688amcDc8kZOJq4UP8cE3R58Zl7e+Qo/1jyspps=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "uURBxvTp3FBCVkd+LPqyuY7d6rMW6SGIJQEPY/wtkZI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "jG3hax1L3RBp9t38vUt53FsBxgr/+Si/vVISpAylYpE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kwtIW8MhH9Ky5xNjBx8gFA/SHh2YVphie7g5FGBzals=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FHflwFuEMu4xX0ZApHi+pdlBH+oevAtXckCUb5Wv0xU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ty4cnzJdAlbQKnh7px3GEYjBnvO+jIOaKjoTRDtmh3M=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
\ No newline at end of file
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-Long-Aggregate.json b/specifications/client-side-encryption/tests/legacy/fle2-Range-Long-Aggregate.json
new file mode 100644
index 00000000000..3f1c723bd29
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-Long-Aggregate.json
@@ -0,0 +1,490 @@
+{
+ "runOn": [
+ {
+ "minServerVersion": "6.2.0",
+ "topology": [
+ "replicaset",
+ "sharded",
+ "load-balanced"
+ ]
+ }
+ ],
+ "database_name": "default",
+ "collection_name": "default",
+ "data": [],
+ "encrypted_fields": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedLong",
+ "bsonType": "long",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberLong": "0"
+ },
+ "max": {
+ "$numberLong": "200"
+ }
+ }
+ }
+ ]
+ },
+ "key_vault_data": [
+ {
+ "_id": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "keyMaterial": {
+ "$binary": {
+ "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==",
+ "subType": "00"
+ }
+ },
+ "creationDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "updateDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "status": {
+ "$numberInt": "0"
+ },
+ "masterKey": {
+ "provider": "local"
+ }
+ }
+ ],
+ "tests": [
+ {
+ "description": "FLE2 Range Long. Aggregate.",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedLong": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedLong": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedLong": {
+ "$gt": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 1,
+ "encryptedLong": {
+ "$numberLong": "1"
+ }
+ }
+ ]
+ }
+ ],
+ "expectations": [
+ {
+ "command_started_event": {
+ "command": {
+ "listCollections": 1,
+ "filter": {
+ "name": "default"
+ }
+ },
+ "command_name": "listCollections"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "find": "datakeys",
+ "filter": {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ },
+ "$db": "keyvault",
+ "readConcern": {
+ "level": "majority"
+ }
+ },
+ "command_name": "find"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 0,
+ "encryptedLong": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedLong",
+ "bsonType": "long",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberLong": "0"
+ },
+ "max": {
+ "$numberLong": "200"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 1,
+ "encryptedLong": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedLong",
+ "bsonType": "long",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberLong": "0"
+ },
+ "max": {
+ "$numberLong": "200"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "aggregate": "default",
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedLong": {
+ "$gt": {
+ "$binary": {
+ "base64": "CnEFAAADcGF5bG9hZABBBQAABGcABQUAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVjACAAAAAAKs6X8gaa+AJ6PpxVicsk7iCXpSYIkQ5zB0KnXqlfCWgAAzEAfQAAAAVkACAAAAAAtL3QIvnZqCF72eS6lKr8ilff7R6kiNklokiTuaU5wNsFcwAgAAAAAEtqr3/X731VB+VrbFcY8ZrJKRo2E0Fd+C8L0EMNcvcCBWMAIAAAAABYTWOKsDZ7cgPhiKDR2bE5CFGz4MuEwZbzZ0z46eGzBQADMgB9AAAABWQAIAAAAAB99ZW/7KwXKzl5M3XQsAJ3JbEef90IoxFYBArNiYzlgQVzACAAAAAAYO/qaw0+92HAryxOUG7iK6hnIy3OaUA9jIqtHdvcq8YFYwAgAAAAABSqgKlxv5LXoxUO3zNmqGztlZhL2S150WiR/eycv7CWAAMzAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVjACAAAAAAfsofSP7nQHv8ic8ZW0aNlWxplS46Z+mywPR4rQk+wcgAAzQAfQAAAAVkACAAAAAAV22FGF7ZDwK/EYiGNMlm/QuT3saQdyJM/Fn+ZyQug1oFcwAgAAAAACo7GwCvbcs5UHQMgds9/1QMklEVdjZigpuOFGrDmmxtBWMAIAAAAADu3L42J/oqNLe/XNYpodf2fhmPdcLhqO4J24o0hiveXwADNQB9AAAABWQAIAAAAADFspsMG7yHjKppyllon1KqAsTrHaZ6JzNqnSz8o6iTvwVzACAAAAAAeiA5pqVIQQ9s6UY/P8v5Jjkl3I7iFNeLDYehikrINrsFYwAgAAAAAAUljtCIvjRnLB2UPTEeRIz11Snl5SOBUNaXMXig4rqKAAM2AH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVjACAAAAAAD51NYesiO4Fo7w7iWBfqAFxEqkaDVctpvzZ28nT4SE8AAzcAfQAAAAVkACAAAAAAYfLwnoxK6XAGQrJFy8+TIJoq38ldBaO75h4zA4ZX5tQFcwAgAAAAAC2wk8UcJH5X5XGnDBYmel6srpBkzBhHtt3Jw1u5TSJ1BWMAIAAAAABJDtFhJ2tPbowp1UUmOCN/rqSqHRL1dtMu0c47vIlK4wADOAB9AAAABWQAIAAAAADGvyrtKkIcaV17ynZA7b2k5Pz6OhvxdWNkDvDWJIja8wVzACAAAAAAOLypVKNxf/wR1G8OZjUUsTQzDYeNNhhITxGMSp7euS4FYwAgAAAAAE6kvmXPqTnYIH4EJmNhy8OLVJZFOmdiBXLMorhELjKWAAM5AH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVjACAAAAAA85AiE+bNFAYQTXQAFexgeczdVhf8FUnf16WzJlI/kmsAAAVlACAAAAAA65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+wSY20AAAAAAAAAAAAAEHBheWxvYWRJZAAAAAAAEGZpcnN0T3BlcmF0b3IAAQAAAAA=",
+ "subType": "06"
+ }
+ }
+ }
+ }
+ }
+ ],
+ "cursor": {},
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedLong",
+ "bsonType": "long",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberLong": "0"
+ },
+ "max": {
+ "$numberLong": "200"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "aggregate"
+ }
+ }
+ ],
+ "outcome": {
+ "collection": {
+ "data": [
+ {
+ "_id": 0,
+ "encryptedLong": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=",
+ "subType": "00"
+ }
+ }
+ ]
+ },
+ {
+ "_id": 1,
+ "encryptedLong": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "bE1vqWj3KNyM7cCYUv/cnYm8BPaUL3eMp5syTHq6NF4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "25j9sQXZCihCmHKvTHgaBsAVZFcGPn7JjHdrCGlwyyw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FA74j21GUEJb1DJBOpR9nVnjaDZnd8yAQNuaW9Qi26g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kJv//KVkbrobIBf+QeWC5jxn20mx/P0R1N6aCSMgKM8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zB+Whi9IUUGxfLEe+lGuIzLX4LFbIhaIAm5lRk65QTc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ybO1QU3CgvhO8JgRXH+HxKszWcpl5aGDYYVa75fHa1g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "X3Y3eSAbbMg//JgiHHiFpYOpV61t8kkDexI+CQyitH4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SlNHXyqVFGDPrX/2ppwog6l4pwj3PKda2TkZbqgfSfA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "McjV8xwTF3xI7863DYOBdyvIv6UpzThl6v9vBRk05bI=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ ]
+}
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-Long-Aggregate.yml b/specifications/client-side-encryption/tests/legacy/fle2-Range-Long-Aggregate.yml
new file mode 100644
index 00000000000..8064fbeddd1
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-Long-Aggregate.yml
@@ -0,0 +1,227 @@
+# Requires libmongocrypt 1.7.0.
+runOn:
+ - minServerVersion: "6.2.0"
+ # FLE 2 Encrypted collections are not supported on standalone.
+ topology: [ "replicaset", "sharded", "load-balanced" ]
+database_name: &database_name "default"
+collection_name: &collection_name "default"
+data: []
+encrypted_fields: &encrypted_fields {'escCollection': 'enxcol_.default.esc', 'eccCollection': 'enxcol_.default.ecc', 'ecocCollection': 'enxcol_.default.ecoc', 'fields': [{'keyId': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'path': 'encryptedLong', 'bsonType': 'long', 'queries': {'queryType': 'rangePreview', 'contention': {'$numberLong': '0'}, 'sparsity': {'$numberLong': '1'}, 'min': {'$numberLong': '0'}, 'max': {'$numberLong': '200'}}}]}
+key_vault_data: [ {'_id': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'keyMaterial': {'$binary': {'base64': 'sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==', 'subType': '00'}}, 'creationDate': {'$date': {'$numberLong': '1648914851981'}}, 'updateDate': {'$date': {'$numberLong': '1648914851981'}}, 'status': {'$numberInt': '0'}, 'masterKey': {'provider': 'local'}} ]
+tests:
+ - description: "FLE2 Range Long. Aggregate."
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments:
+ document: &doc0 { _id: 0, encryptedLong: { $numberLong: "0" } }
+ - name: insertOne
+ arguments:
+ document: &doc1 { _id: 1, encryptedLong: { $numberLong: "1" } }
+ - name: aggregate
+ arguments:
+ pipeline: [{ $match: { "encryptedLong": { $gt: {$numberLong: "0" }} } }]
+ result: [*doc1]
+ expectations:
+ - command_started_event:
+ command:
+ listCollections: 1
+ filter:
+ name: *collection_name
+ command_name: listCollections
+ - command_started_event:
+ command:
+ find: datakeys
+ filter: {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ }
+ $db: keyvault
+ readConcern: { level: "majority" }
+ command_name: find
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc0_encrypted { "_id": 0, "encryptedLong": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc1_encrypted { "_id": 1, "encryptedLong": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ aggregate: *collection_name
+ pipeline: [
+ {
+ "$match": {
+ "encryptedLong": {
+ "$gt": {
+ "$binary": {
+ "base64": "CnEFAAADcGF5bG9hZABBBQAABGcABQUAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVjACAAAAAAKs6X8gaa+AJ6PpxVicsk7iCXpSYIkQ5zB0KnXqlfCWgAAzEAfQAAAAVkACAAAAAAtL3QIvnZqCF72eS6lKr8ilff7R6kiNklokiTuaU5wNsFcwAgAAAAAEtqr3/X731VB+VrbFcY8ZrJKRo2E0Fd+C8L0EMNcvcCBWMAIAAAAABYTWOKsDZ7cgPhiKDR2bE5CFGz4MuEwZbzZ0z46eGzBQADMgB9AAAABWQAIAAAAAB99ZW/7KwXKzl5M3XQsAJ3JbEef90IoxFYBArNiYzlgQVzACAAAAAAYO/qaw0+92HAryxOUG7iK6hnIy3OaUA9jIqtHdvcq8YFYwAgAAAAABSqgKlxv5LXoxUO3zNmqGztlZhL2S150WiR/eycv7CWAAMzAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVjACAAAAAAfsofSP7nQHv8ic8ZW0aNlWxplS46Z+mywPR4rQk+wcgAAzQAfQAAAAVkACAAAAAAV22FGF7ZDwK/EYiGNMlm/QuT3saQdyJM/Fn+ZyQug1oFcwAgAAAAACo7GwCvbcs5UHQMgds9/1QMklEVdjZigpuOFGrDmmxtBWMAIAAAAADu3L42J/oqNLe/XNYpodf2fhmPdcLhqO4J24o0hiveXwADNQB9AAAABWQAIAAAAADFspsMG7yHjKppyllon1KqAsTrHaZ6JzNqnSz8o6iTvwVzACAAAAAAeiA5pqVIQQ9s6UY/P8v5Jjkl3I7iFNeLDYehikrINrsFYwAgAAAAAAUljtCIvjRnLB2UPTEeRIz11Snl5SOBUNaXMXig4rqKAAM2AH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVjACAAAAAAD51NYesiO4Fo7w7iWBfqAFxEqkaDVctpvzZ28nT4SE8AAzcAfQAAAAVkACAAAAAAYfLwnoxK6XAGQrJFy8+TIJoq38ldBaO75h4zA4ZX5tQFcwAgAAAAAC2wk8UcJH5X5XGnDBYmel6srpBkzBhHtt3Jw1u5TSJ1BWMAIAAAAABJDtFhJ2tPbowp1UUmOCN/rqSqHRL1dtMu0c47vIlK4wADOAB9AAAABWQAIAAAAADGvyrtKkIcaV17ynZA7b2k5Pz6OhvxdWNkDvDWJIja8wVzACAAAAAAOLypVKNxf/wR1G8OZjUUsTQzDYeNNhhITxGMSp7euS4FYwAgAAAAAE6kvmXPqTnYIH4EJmNhy8OLVJZFOmdiBXLMorhELjKWAAM5AH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVjACAAAAAA85AiE+bNFAYQTXQAFexgeczdVhf8FUnf16WzJlI/kmsAAAVlACAAAAAA65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+wSY20AAAAAAAAAAAAAEHBheWxvYWRJZAAAAAAAEGZpcnN0T3BlcmF0b3IAAQAAAAA=",
+ "subType": "06"
+ }
+ }
+ }
+ }
+ }
+ ]
+ cursor: {}
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: aggregate
+ outcome:
+ collection:
+ # Outcome is checked using a separate MongoClient without auto encryption.
+ data:
+ -
+ {
+ "_id": 0,
+ "encryptedLong": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ -
+ {
+ "_id": 1,
+ "encryptedLong": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "bE1vqWj3KNyM7cCYUv/cnYm8BPaUL3eMp5syTHq6NF4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "25j9sQXZCihCmHKvTHgaBsAVZFcGPn7JjHdrCGlwyyw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FA74j21GUEJb1DJBOpR9nVnjaDZnd8yAQNuaW9Qi26g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kJv//KVkbrobIBf+QeWC5jxn20mx/P0R1N6aCSMgKM8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zB+Whi9IUUGxfLEe+lGuIzLX4LFbIhaIAm5lRk65QTc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ybO1QU3CgvhO8JgRXH+HxKszWcpl5aGDYYVa75fHa1g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "X3Y3eSAbbMg//JgiHHiFpYOpV61t8kkDexI+CQyitH4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SlNHXyqVFGDPrX/2ppwog6l4pwj3PKda2TkZbqgfSfA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "McjV8xwTF3xI7863DYOBdyvIv6UpzThl6v9vBRk05bI=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
\ No newline at end of file
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-Long-Correctness.json b/specifications/client-side-encryption/tests/legacy/fle2-Range-Long-Correctness.json
new file mode 100644
index 00000000000..972388c6c43
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-Long-Correctness.json
@@ -0,0 +1,1644 @@
+{
+ "runOn": [
+ {
+ "minServerVersion": "6.2.0",
+ "topology": [
+ "replicaset",
+ "sharded",
+ "load-balanced"
+ ]
+ }
+ ],
+ "database_name": "default",
+ "collection_name": "default",
+ "data": [],
+ "encrypted_fields": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedLong",
+ "bsonType": "long",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberLong": "0"
+ },
+ "max": {
+ "$numberLong": "200"
+ }
+ }
+ }
+ ]
+ },
+ "key_vault_data": [
+ {
+ "_id": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "keyMaterial": {
+ "$binary": {
+ "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==",
+ "subType": "00"
+ }
+ },
+ "creationDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "updateDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "status": {
+ "$numberInt": "0"
+ },
+ "masterKey": {
+ "provider": "local"
+ }
+ }
+ ],
+ "tests": [
+ {
+ "description": "Find with $gt",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedLong": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedLong": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedLong": {
+ "$gt": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ },
+ "result": [
+ {
+ "_id": 1,
+ "encryptedLong": {
+ "$numberLong": "1"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Find with $gte",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedLong": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedLong": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedLong": {
+ "$gte": {
+ "$numberLong": "0"
+ }
+ }
+ },
+ "sort": {
+ "_id": 1
+ }
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedLong": {
+ "$numberLong": "0"
+ }
+ },
+ {
+ "_id": 1,
+ "encryptedLong": {
+ "$numberLong": "1"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Find with $gt with no results",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedLong": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedLong": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedLong": {
+ "$gt": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ },
+ "result": []
+ }
+ ]
+ },
+ {
+ "description": "Find with $lt",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedLong": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedLong": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedLong": {
+ "$lt": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedLong": {
+ "$numberLong": "0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Find with $lte",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedLong": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedLong": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedLong": {
+ "$lte": {
+ "$numberLong": "1"
+ }
+ }
+ },
+ "sort": {
+ "_id": 1
+ }
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedLong": {
+ "$numberLong": "0"
+ }
+ },
+ {
+ "_id": 1,
+ "encryptedLong": {
+ "$numberLong": "1"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Find with $lt below min",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedLong": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedLong": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedLong": {
+ "$lt": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ },
+ "result": {
+ "errorContains": "must be greater than the range minimum"
+ }
+ }
+ ]
+ },
+ {
+ "description": "Find with $gt above max",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedLong": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedLong": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedLong": {
+ "$gt": {
+ "$numberLong": "200"
+ }
+ }
+ }
+ },
+ "result": {
+ "errorContains": "must be less than the range maximum"
+ }
+ }
+ ]
+ },
+ {
+ "description": "Find with $gt and $lt",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedLong": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedLong": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedLong": {
+ "$gt": {
+ "$numberLong": "0"
+ },
+ "$lt": {
+ "$numberLong": "2"
+ }
+ }
+ }
+ },
+ "result": [
+ {
+ "_id": 1,
+ "encryptedLong": {
+ "$numberLong": "1"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Find with equality",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedLong": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedLong": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedLong": {
+ "$numberLong": "0"
+ }
+ }
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedLong": {
+ "$numberLong": "0"
+ }
+ }
+ ]
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedLong": {
+ "$numberLong": "1"
+ }
+ }
+ },
+ "result": [
+ {
+ "_id": 1,
+ "encryptedLong": {
+ "$numberLong": "1"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Find with full range",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedLong": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedLong": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedLong": {
+ "$gte": {
+ "$numberLong": "0"
+ },
+ "$lte": {
+ "$numberLong": "200"
+ }
+ }
+ },
+ "sort": {
+ "_id": 1
+ }
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedLong": {
+ "$numberLong": "0"
+ }
+ },
+ {
+ "_id": 1,
+ "encryptedLong": {
+ "$numberLong": "1"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Find with $in",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedLong": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedLong": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedLong": {
+ "$in": [
+ {
+ "$numberLong": "0"
+ }
+ ]
+ }
+ }
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedLong": {
+ "$numberLong": "0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Insert out of range",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedLong": {
+ "$numberLong": "-1"
+ }
+ }
+ },
+ "result": {
+ "errorContains": "value must be greater than or equal to the minimum value"
+ }
+ }
+ ]
+ },
+ {
+ "description": "Insert min and max",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedLong": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 200,
+ "encryptedLong": {
+ "$numberLong": "200"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {},
+ "sort": {
+ "_id": 1
+ }
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedLong": {
+ "$numberLong": "0"
+ }
+ },
+ {
+ "_id": 200,
+ "encryptedLong": {
+ "$numberLong": "200"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with $gte",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedLong": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedLong": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedLong": {
+ "$gte": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ },
+ {
+ "$sort": {
+ "_id": 1
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedLong": {
+ "$numberLong": "0"
+ }
+ },
+ {
+ "_id": 1,
+ "encryptedLong": {
+ "$numberLong": "1"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with $gt with no results",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedLong": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedLong": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedLong": {
+ "$gt": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ }
+ ]
+ },
+ "result": []
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with $lt",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedLong": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedLong": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedLong": {
+ "$lt": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedLong": {
+ "$numberLong": "0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with $lte",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedLong": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedLong": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedLong": {
+ "$lte": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ },
+ {
+ "$sort": {
+ "_id": 1
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedLong": {
+ "$numberLong": "0"
+ }
+ },
+ {
+ "_id": 1,
+ "encryptedLong": {
+ "$numberLong": "1"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with $lt below min",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedLong": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedLong": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedLong": {
+ "$lt": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ }
+ ]
+ },
+ "result": {
+ "errorContains": "must be greater than the range minimum"
+ }
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with $gt above max",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedLong": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedLong": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedLong": {
+ "$gt": {
+ "$numberLong": "200"
+ }
+ }
+ }
+ }
+ ]
+ },
+ "result": {
+ "errorContains": "must be less than the range maximum"
+ }
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with $gt and $lt",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedLong": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedLong": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedLong": {
+ "$gt": {
+ "$numberLong": "0"
+ },
+ "$lt": {
+ "$numberLong": "2"
+ }
+ }
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 1,
+ "encryptedLong": {
+ "$numberLong": "1"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with equality",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedLong": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedLong": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedLong": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedLong": {
+ "$numberLong": "0"
+ }
+ }
+ ]
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedLong": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 1,
+ "encryptedLong": {
+ "$numberLong": "1"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with full range",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedLong": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedLong": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedLong": {
+ "$gte": {
+ "$numberLong": "0"
+ },
+ "$lte": {
+ "$numberLong": "200"
+ }
+ }
+ }
+ },
+ {
+ "$sort": {
+ "_id": 1
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedLong": {
+ "$numberLong": "0"
+ }
+ },
+ {
+ "_id": 1,
+ "encryptedLong": {
+ "$numberLong": "1"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Aggregate with $in",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedLong": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedLong": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "aggregate",
+ "arguments": {
+ "pipeline": [
+ {
+ "$match": {
+ "encryptedLong": {
+ "$in": [
+ {
+ "$numberLong": "0"
+ }
+ ]
+ }
+ }
+ }
+ ]
+ },
+ "result": [
+ {
+ "_id": 0,
+ "encryptedLong": {
+ "$numberLong": "0"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Wrong type: Insert Double",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedLong": {
+ "$numberDouble": "0"
+ }
+ }
+ },
+ "result": {
+ "errorContains": "cannot encrypt element"
+ }
+ }
+ ]
+ },
+ {
+ "description": "Wrong type: Find Double",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedLong": {
+ "$gte": {
+ "$numberDouble": "0"
+ }
+ }
+ }
+ },
+ "result": {
+ "errorContains": "field type is not supported"
+ }
+ }
+ ]
+ }
+ ]
+}
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-Long-Correctness.yml b/specifications/client-side-encryption/tests/legacy/fle2-Range-Long-Correctness.yml
new file mode 100644
index 00000000000..696a09fa10d
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-Long-Correctness.yml
@@ -0,0 +1,420 @@
+# Test correctness results.
+# Does not include command monitoring expectations or outcome assertions to make tests more readable.
+# Requires libmongocrypt 1.7.0.
+runOn:
+ - minServerVersion: "6.2.0"
+ # FLE 2 Encrypted collections are not supported on standalone.
+ topology: [ "replicaset", "sharded", "load-balanced" ]
+database_name: &database_name "default"
+collection_name: &collection_name "default"
+data: []
+encrypted_fields: &encrypted_fields {'escCollection': 'enxcol_.default.esc', 'eccCollection': 'enxcol_.default.ecc', 'ecocCollection': 'enxcol_.default.ecoc', 'fields': [{'keyId': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'path': 'encryptedLong', 'bsonType': 'long', 'queries': {'queryType': 'rangePreview', 'contention': {'$numberLong': '0'}, 'sparsity': {'$numberLong': '1'}, 'min': {'$numberLong': '0'}, 'max': {'$numberLong': '200'}}}]}
+key_vault_data: [ {'_id': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'keyMaterial': {'$binary': {'base64': 'sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==', 'subType': '00'}}, 'creationDate': {'$date': {'$numberLong': '1648914851981'}}, 'updateDate': {'$date': {'$numberLong': '1648914851981'}}, 'status': {'$numberInt': '0'}, 'masterKey': {'provider': 'local'}} ]
+tests:
+ - description: "Find with $gt"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments:
+ document: &doc0 { _id: 0, encryptedLong: { $numberLong: "0" } }
+ - name: insertOne
+ arguments:
+ document: &doc1 { _id: 1, encryptedLong: { $numberLong: "1" } }
+ - name: find
+ arguments:
+ filter: { encryptedLong: { $gt: { $numberLong: "0" } }}
+ result: [*doc1]
+
+ - description: "Find with $gte"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedLong: { $gte: { $numberLong: "0" } }}
+ # sort so results from range queries are ordered.
+ sort: { _id: 1 }
+ result: [*doc0, *doc1]
+
+ - description: "Find with $gt with no results"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedLong: { $gt: { $numberLong: "1" } }}
+ result: []
+
+ - description: "Find with $lt"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedLong: { $lt: { $numberLong: "1" } }}
+ result: [*doc0]
+
+ - description: "Find with $lte"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedLong: { $lte: { $numberLong: "1" } }}
+ # sort so results from range queries are ordered.
+ sort: { _id: 1 }
+ result: [*doc0, *doc1]
+
+ - description: "Find with $lt below min"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedLong: { $lt: { $numberLong: "0" } }}
+ result:
+ errorContains: must be greater than the range minimum
+
+ - description: "Find with $gt above max"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedLong: { $gt: { $numberLong: "200" } }}
+ result:
+ errorContains: must be less than the range maximum
+
+ - description: "Find with $gt and $lt"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedLong: { $gt: { $numberLong: "0" }, $lt: { $numberLong: "2"} }}
+ result: [*doc1]
+
+ - description: "Find with equality"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedLong: { $numberLong: "0" } }
+ result: [*doc0]
+ - name: find
+ arguments:
+ filter: { encryptedLong: { $numberLong: "1" } }
+ result: [*doc1]
+
+ - description: "Find with full range"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedLong: { $gte: {$numberLong: "0"}, $lte: {$numberLong: "200"} } }
+ # sort so results from range queries are ordered.
+ sort: { _id: 1 }
+ result: [*doc0, *doc1]
+
+ - description: "Find with $in"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: find
+ arguments:
+ filter: { encryptedLong: { $in: [ {$numberLong: "0"} ] } }
+ result: [*doc0]
+
+ - description: "Insert out of range"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments:
+ document: { _id: 0, encryptedLong: { $numberLong: "-1" }}
+ result:
+ errorContains: value must be greater than or equal to the minimum value
+
+ - description: "Insert min and max"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments:
+ document: *doc0
+ - name: insertOne
+ arguments:
+ document: &doc200 { _id: 200, encryptedLong: { $numberLong: "200" }}
+ - name: find
+ arguments:
+ filter: {}
+ # sort so results from range queries are ordered.
+ sort: { _id: 1 }
+ result: [*doc0, *doc200]
+
+ - description: "Aggregate with $gte"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedLong: { $gte: { $numberLong: "0" } }} }
+ # sort so results from range queries are ordered.
+ - { $sort: { _id: 1 }}
+ result: [*doc0, *doc1]
+
+ - description: "Aggregate with $gt with no results"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedLong: { $gt: { $numberLong: "1" } }} }
+ result: []
+
+ - description: "Aggregate with $lt"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedLong: { $lt: { $numberLong: "1" } }} }
+ result: [*doc0]
+
+ - description: "Aggregate with $lte"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedLong: { $lte: { $numberLong: "1" } }} }
+ # sort so results from range queries are ordered.
+ - { $sort: { _id: 1 }}
+ result: [*doc0, *doc1]
+
+ - description: "Aggregate with $lt below min"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedLong: { $lt: { $numberLong: "0" } }} }
+ result:
+ errorContains: must be greater than the range minimum
+
+ - description: "Aggregate with $gt above max"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedLong: { $gt: { $numberLong: "200" } }} }
+ result:
+ errorContains: must be less than the range maximum
+
+ - description: "Aggregate with $gt and $lt"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedLong: { $gt: { $numberLong: "0" }, $lt: { $numberLong: "2"} }} }
+ result: [*doc1]
+
+ - description: "Aggregate with equality"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedLong: { $numberLong: "0" } } }
+ result: [*doc0]
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedLong: { $numberLong: "1" } } }
+ result: [*doc1]
+
+ - description: "Aggregate with full range"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedLong: { $gte: {$numberLong: "0"}, $lte: {$numberLong: "200"} } } }
+ # sort so results from range queries are ordered.
+ - { $sort: { _id: 1 }}
+ result: [*doc0, *doc1]
+
+ - description: "Aggregate with $in"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: *doc0 }
+ - name: insertOne
+ arguments: { document: *doc1 }
+ - name: aggregate
+ arguments:
+ pipeline:
+ - { $match: { encryptedLong: { $in: [ {$numberLong: "0"} ] } } }
+ result: [*doc0]
+
+ - description: "Wrong type: Insert Double"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: { _id: 0, encryptedLong: { $numberDouble: "0" }} }
+ result:
+ # Expect an error from mongocryptd.
+ errorContains: "cannot encrypt element"
+
+ - description: "Wrong type: Find Double"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: find
+ arguments:
+ filter: { encryptedLong: { $gte: { $numberDouble: "0" } }}
+ result:
+ # expect an error from libmongocrypt.
+ errorContains: "field type is not supported"
\ No newline at end of file
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-Long-Delete.json b/specifications/client-side-encryption/tests/legacy/fle2-Range-Long-Delete.json
new file mode 100644
index 00000000000..89e18984065
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-Long-Delete.json
@@ -0,0 +1,437 @@
+{
+ "runOn": [
+ {
+ "minServerVersion": "6.2.0",
+ "topology": [
+ "replicaset",
+ "sharded",
+ "load-balanced"
+ ]
+ }
+ ],
+ "database_name": "default",
+ "collection_name": "default",
+ "data": [],
+ "encrypted_fields": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedLong",
+ "bsonType": "long",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberLong": "0"
+ },
+ "max": {
+ "$numberLong": "200"
+ }
+ }
+ }
+ ]
+ },
+ "key_vault_data": [
+ {
+ "_id": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "keyMaterial": {
+ "$binary": {
+ "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==",
+ "subType": "00"
+ }
+ },
+ "creationDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "updateDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "status": {
+ "$numberInt": "0"
+ },
+ "masterKey": {
+ "provider": "local"
+ }
+ }
+ ],
+ "tests": [
+ {
+ "description": "FLE2 Range Long. Delete.",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedLong": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedLong": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "deleteOne",
+ "arguments": {
+ "filter": {
+ "encryptedLong": {
+ "$gt": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ },
+ "result": {
+ "deletedCount": 1
+ }
+ }
+ ],
+ "expectations": [
+ {
+ "command_started_event": {
+ "command": {
+ "listCollections": 1,
+ "filter": {
+ "name": "default"
+ }
+ },
+ "command_name": "listCollections"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "find": "datakeys",
+ "filter": {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ },
+ "$db": "keyvault",
+ "readConcern": {
+ "level": "majority"
+ }
+ },
+ "command_name": "find"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 0,
+ "encryptedLong": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedLong",
+ "bsonType": "long",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberLong": "0"
+ },
+ "max": {
+ "$numberLong": "200"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 1,
+ "encryptedLong": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedLong",
+ "bsonType": "long",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberLong": "0"
+ },
+ "max": {
+ "$numberLong": "200"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "delete": "default",
+ "deletes": [
+ {
+ "q": {
+ "encryptedLong": {
+ "$gt": {
+ "$binary": {
+ "base64": "CnEFAAADcGF5bG9hZABBBQAABGcABQUAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVjACAAAAAAKs6X8gaa+AJ6PpxVicsk7iCXpSYIkQ5zB0KnXqlfCWgAAzEAfQAAAAVkACAAAAAAtL3QIvnZqCF72eS6lKr8ilff7R6kiNklokiTuaU5wNsFcwAgAAAAAEtqr3/X731VB+VrbFcY8ZrJKRo2E0Fd+C8L0EMNcvcCBWMAIAAAAABYTWOKsDZ7cgPhiKDR2bE5CFGz4MuEwZbzZ0z46eGzBQADMgB9AAAABWQAIAAAAAB99ZW/7KwXKzl5M3XQsAJ3JbEef90IoxFYBArNiYzlgQVzACAAAAAAYO/qaw0+92HAryxOUG7iK6hnIy3OaUA9jIqtHdvcq8YFYwAgAAAAABSqgKlxv5LXoxUO3zNmqGztlZhL2S150WiR/eycv7CWAAMzAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVjACAAAAAAfsofSP7nQHv8ic8ZW0aNlWxplS46Z+mywPR4rQk+wcgAAzQAfQAAAAVkACAAAAAAV22FGF7ZDwK/EYiGNMlm/QuT3saQdyJM/Fn+ZyQug1oFcwAgAAAAACo7GwCvbcs5UHQMgds9/1QMklEVdjZigpuOFGrDmmxtBWMAIAAAAADu3L42J/oqNLe/XNYpodf2fhmPdcLhqO4J24o0hiveXwADNQB9AAAABWQAIAAAAADFspsMG7yHjKppyllon1KqAsTrHaZ6JzNqnSz8o6iTvwVzACAAAAAAeiA5pqVIQQ9s6UY/P8v5Jjkl3I7iFNeLDYehikrINrsFYwAgAAAAAAUljtCIvjRnLB2UPTEeRIz11Snl5SOBUNaXMXig4rqKAAM2AH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVjACAAAAAAD51NYesiO4Fo7w7iWBfqAFxEqkaDVctpvzZ28nT4SE8AAzcAfQAAAAVkACAAAAAAYfLwnoxK6XAGQrJFy8+TIJoq38ldBaO75h4zA4ZX5tQFcwAgAAAAAC2wk8UcJH5X5XGnDBYmel6srpBkzBhHtt3Jw1u5TSJ1BWMAIAAAAABJDtFhJ2tPbowp1UUmOCN/rqSqHRL1dtMu0c47vIlK4wADOAB9AAAABWQAIAAAAADGvyrtKkIcaV17ynZA7b2k5Pz6OhvxdWNkDvDWJIja8wVzACAAAAAAOLypVKNxf/wR1G8OZjUUsTQzDYeNNhhITxGMSp7euS4FYwAgAAAAAE6kvmXPqTnYIH4EJmNhy8OLVJZFOmdiBXLMorhELjKWAAM5AH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVjACAAAAAA85AiE+bNFAYQTXQAFexgeczdVhf8FUnf16WzJlI/kmsAAAVlACAAAAAA65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+wSY20AAAAAAAAAAAAAEHBheWxvYWRJZAAAAAAAEGZpcnN0T3BlcmF0b3IAAQAAAAA=",
+ "subType": "06"
+ }
+ }
+ }
+ },
+ "limit": 1
+ }
+ ],
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedLong",
+ "bsonType": "long",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberLong": "0"
+ },
+ "max": {
+ "$numberLong": "200"
+ }
+ }
+ }
+ ]
+ }
+ },
+ "deleteTokens": {
+ "default.default": {
+ "encryptedLong": {
+ "e": {
+ "$binary": {
+ "base64": "65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+w=",
+ "subType": "00"
+ }
+ },
+ "o": {
+ "$binary": {
+ "base64": "noN+05JsuO1oDg59yypIGj45i+eFH6HOTXOPpeZ//Mk=",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "command_name": "delete"
+ }
+ }
+ ],
+ "outcome": {
+ "collection": {
+ "data": [
+ {
+ "_id": 0,
+ "encryptedLong": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ ]
+}
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-Long-Delete.yml b/specifications/client-side-encryption/tests/legacy/fle2-Range-Long-Delete.yml
new file mode 100644
index 00000000000..12080d60aef
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-Long-Delete.yml
@@ -0,0 +1,185 @@
+# Requires libmongocrypt 1.7.0.
+runOn:
+ - minServerVersion: "6.2.0"
+ # FLE 2 Encrypted collections are not supported on standalone.
+ topology: [ "replicaset", "sharded", "load-balanced" ]
+database_name: &database_name "default"
+collection_name: &collection_name "default"
+data: []
+encrypted_fields: &encrypted_fields {'escCollection': 'enxcol_.default.esc', 'eccCollection': 'enxcol_.default.ecc', 'ecocCollection': 'enxcol_.default.ecoc', 'fields': [{'keyId': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'path': 'encryptedLong', 'bsonType': 'long', 'queries': {'queryType': 'rangePreview', 'contention': {'$numberLong': '0'}, 'sparsity': {'$numberLong': '1'}, 'min': {'$numberLong': '0'}, 'max': {'$numberLong': '200'}}}]}
+key_vault_data: [ {'_id': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'keyMaterial': {'$binary': {'base64': 'sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==', 'subType': '00'}}, 'creationDate': {'$date': {'$numberLong': '1648914851981'}}, 'updateDate': {'$date': {'$numberLong': '1648914851981'}}, 'status': {'$numberInt': '0'}, 'masterKey': {'provider': 'local'}} ]
+tests:
+ - description: "FLE2 Range Long. Delete."
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments:
+ document: &doc0 { _id: 0, encryptedLong: { $numberLong: "0" } }
+ - name: insertOne
+ arguments:
+ document: &doc1 { _id: 1, encryptedLong: { $numberLong: "1" } }
+ - name: deleteOne
+ arguments:
+ filter: { "encryptedLong": { $gt: {$numberLong: "0" }} }
+ result:
+ deletedCount: 1
+ expectations:
+ - command_started_event:
+ command:
+ listCollections: 1
+ filter:
+ name: *collection_name
+ command_name: listCollections
+ - command_started_event:
+ command:
+ find: datakeys
+ filter: {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ }
+ $db: keyvault
+ readConcern: { level: "majority" }
+ command_name: find
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc0_encrypted { "_id": 0, "encryptedLong": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc1_encrypted { "_id": 1, "encryptedLong": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ delete: *collection_name
+ deletes: [
+ {
+ "q": {
+ "encryptedLong": {
+ "$gt": {
+ "$binary": {
+ "base64": "CnEFAAADcGF5bG9hZABBBQAABGcABQUAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVjACAAAAAAKs6X8gaa+AJ6PpxVicsk7iCXpSYIkQ5zB0KnXqlfCWgAAzEAfQAAAAVkACAAAAAAtL3QIvnZqCF72eS6lKr8ilff7R6kiNklokiTuaU5wNsFcwAgAAAAAEtqr3/X731VB+VrbFcY8ZrJKRo2E0Fd+C8L0EMNcvcCBWMAIAAAAABYTWOKsDZ7cgPhiKDR2bE5CFGz4MuEwZbzZ0z46eGzBQADMgB9AAAABWQAIAAAAAB99ZW/7KwXKzl5M3XQsAJ3JbEef90IoxFYBArNiYzlgQVzACAAAAAAYO/qaw0+92HAryxOUG7iK6hnIy3OaUA9jIqtHdvcq8YFYwAgAAAAABSqgKlxv5LXoxUO3zNmqGztlZhL2S150WiR/eycv7CWAAMzAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVjACAAAAAAfsofSP7nQHv8ic8ZW0aNlWxplS46Z+mywPR4rQk+wcgAAzQAfQAAAAVkACAAAAAAV22FGF7ZDwK/EYiGNMlm/QuT3saQdyJM/Fn+ZyQug1oFcwAgAAAAACo7GwCvbcs5UHQMgds9/1QMklEVdjZigpuOFGrDmmxtBWMAIAAAAADu3L42J/oqNLe/XNYpodf2fhmPdcLhqO4J24o0hiveXwADNQB9AAAABWQAIAAAAADFspsMG7yHjKppyllon1KqAsTrHaZ6JzNqnSz8o6iTvwVzACAAAAAAeiA5pqVIQQ9s6UY/P8v5Jjkl3I7iFNeLDYehikrINrsFYwAgAAAAAAUljtCIvjRnLB2UPTEeRIz11Snl5SOBUNaXMXig4rqKAAM2AH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVjACAAAAAAD51NYesiO4Fo7w7iWBfqAFxEqkaDVctpvzZ28nT4SE8AAzcAfQAAAAVkACAAAAAAYfLwnoxK6XAGQrJFy8+TIJoq38ldBaO75h4zA4ZX5tQFcwAgAAAAAC2wk8UcJH5X5XGnDBYmel6srpBkzBhHtt3Jw1u5TSJ1BWMAIAAAAABJDtFhJ2tPbowp1UUmOCN/rqSqHRL1dtMu0c47vIlK4wADOAB9AAAABWQAIAAAAADGvyrtKkIcaV17ynZA7b2k5Pz6OhvxdWNkDvDWJIja8wVzACAAAAAAOLypVKNxf/wR1G8OZjUUsTQzDYeNNhhITxGMSp7euS4FYwAgAAAAAE6kvmXPqTnYIH4EJmNhy8OLVJZFOmdiBXLMorhELjKWAAM5AH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVjACAAAAAA85AiE+bNFAYQTXQAFexgeczdVhf8FUnf16WzJlI/kmsAAAVlACAAAAAA65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+wSY20AAAAAAAAAAAAAEHBheWxvYWRJZAAAAAAAEGZpcnN0T3BlcmF0b3IAAQAAAAA=",
+ "subType": "06"
+ }
+ }
+ }
+ },
+ "limit": 1
+ }
+ ]
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ "deleteTokens": {
+ "default.default": {
+ "encryptedLong": {
+ "e": {
+ "$binary": {
+ "base64": "65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+w=",
+ "subType": "00"
+ }
+ },
+ "o": {
+ "$binary": {
+ "base64": "noN+05JsuO1oDg59yypIGj45i+eFH6HOTXOPpeZ//Mk=",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ command_name: delete
+ outcome:
+ collection:
+ # Outcome is checked using a separate MongoClient without auto encryption.
+ data:
+ -
+ {
+ "_id": 0,
+ "encryptedLong": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
\ No newline at end of file
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-Long-FindOneAndUpdate.json b/specifications/client-side-encryption/tests/legacy/fle2-Range-Long-FindOneAndUpdate.json
new file mode 100644
index 00000000000..59342a343ad
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-Long-FindOneAndUpdate.json
@@ -0,0 +1,512 @@
+{
+ "runOn": [
+ {
+ "minServerVersion": "6.2.0",
+ "topology": [
+ "replicaset",
+ "sharded",
+ "load-balanced"
+ ]
+ }
+ ],
+ "database_name": "default",
+ "collection_name": "default",
+ "data": [],
+ "encrypted_fields": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedLong",
+ "bsonType": "long",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberLong": "0"
+ },
+ "max": {
+ "$numberLong": "200"
+ }
+ }
+ }
+ ]
+ },
+ "key_vault_data": [
+ {
+ "_id": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "keyMaterial": {
+ "$binary": {
+ "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==",
+ "subType": "00"
+ }
+ },
+ "creationDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "updateDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "status": {
+ "$numberInt": "0"
+ },
+ "masterKey": {
+ "provider": "local"
+ }
+ }
+ ],
+ "tests": [
+ {
+ "description": "FLE2 Range Long. FindOneAndUpdate.",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedLong": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedLong": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "findOneAndUpdate",
+ "arguments": {
+ "filter": {
+ "encryptedLong": {
+ "$gt": {
+ "$numberLong": "0"
+ }
+ }
+ },
+ "update": {
+ "$set": {
+ "encryptedLong": {
+ "$numberLong": "2"
+ }
+ }
+ },
+ "returnDocument": "Before"
+ },
+ "result": {
+ "_id": 1,
+ "encryptedLong": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ ],
+ "expectations": [
+ {
+ "command_started_event": {
+ "command": {
+ "listCollections": 1,
+ "filter": {
+ "name": "default"
+ }
+ },
+ "command_name": "listCollections"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "find": "datakeys",
+ "filter": {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ },
+ "$db": "keyvault",
+ "readConcern": {
+ "level": "majority"
+ }
+ },
+ "command_name": "find"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 0,
+ "encryptedLong": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedLong",
+ "bsonType": "long",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberLong": "0"
+ },
+ "max": {
+ "$numberLong": "200"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 1,
+ "encryptedLong": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedLong",
+ "bsonType": "long",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberLong": "0"
+ },
+ "max": {
+ "$numberLong": "200"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "findAndModify": "default",
+ "query": {
+ "encryptedLong": {
+ "$gt": {
+ "$binary": {
+ "base64": "CnEFAAADcGF5bG9hZABBBQAABGcABQUAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVjACAAAAAAKs6X8gaa+AJ6PpxVicsk7iCXpSYIkQ5zB0KnXqlfCWgAAzEAfQAAAAVkACAAAAAAtL3QIvnZqCF72eS6lKr8ilff7R6kiNklokiTuaU5wNsFcwAgAAAAAEtqr3/X731VB+VrbFcY8ZrJKRo2E0Fd+C8L0EMNcvcCBWMAIAAAAABYTWOKsDZ7cgPhiKDR2bE5CFGz4MuEwZbzZ0z46eGzBQADMgB9AAAABWQAIAAAAAB99ZW/7KwXKzl5M3XQsAJ3JbEef90IoxFYBArNiYzlgQVzACAAAAAAYO/qaw0+92HAryxOUG7iK6hnIy3OaUA9jIqtHdvcq8YFYwAgAAAAABSqgKlxv5LXoxUO3zNmqGztlZhL2S150WiR/eycv7CWAAMzAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVjACAAAAAAfsofSP7nQHv8ic8ZW0aNlWxplS46Z+mywPR4rQk+wcgAAzQAfQAAAAVkACAAAAAAV22FGF7ZDwK/EYiGNMlm/QuT3saQdyJM/Fn+ZyQug1oFcwAgAAAAACo7GwCvbcs5UHQMgds9/1QMklEVdjZigpuOFGrDmmxtBWMAIAAAAADu3L42J/oqNLe/XNYpodf2fhmPdcLhqO4J24o0hiveXwADNQB9AAAABWQAIAAAAADFspsMG7yHjKppyllon1KqAsTrHaZ6JzNqnSz8o6iTvwVzACAAAAAAeiA5pqVIQQ9s6UY/P8v5Jjkl3I7iFNeLDYehikrINrsFYwAgAAAAAAUljtCIvjRnLB2UPTEeRIz11Snl5SOBUNaXMXig4rqKAAM2AH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVjACAAAAAAD51NYesiO4Fo7w7iWBfqAFxEqkaDVctpvzZ28nT4SE8AAzcAfQAAAAVkACAAAAAAYfLwnoxK6XAGQrJFy8+TIJoq38ldBaO75h4zA4ZX5tQFcwAgAAAAAC2wk8UcJH5X5XGnDBYmel6srpBkzBhHtt3Jw1u5TSJ1BWMAIAAAAABJDtFhJ2tPbowp1UUmOCN/rqSqHRL1dtMu0c47vIlK4wADOAB9AAAABWQAIAAAAADGvyrtKkIcaV17ynZA7b2k5Pz6OhvxdWNkDvDWJIja8wVzACAAAAAAOLypVKNxf/wR1G8OZjUUsTQzDYeNNhhITxGMSp7euS4FYwAgAAAAAE6kvmXPqTnYIH4EJmNhy8OLVJZFOmdiBXLMorhELjKWAAM5AH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVjACAAAAAA85AiE+bNFAYQTXQAFexgeczdVhf8FUnf16WzJlI/kmsAAAVlACAAAAAA65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+wSY20AAAAAAAAAAAAAEHBheWxvYWRJZAAAAAAAEGZpcnN0T3BlcmF0b3IAAQAAAAA=",
+ "subType": "06"
+ }
+ }
+ }
+ },
+ "update": {
+ "$set": {
+ "encryptedLong": {
+ "$$type": "binData"
+ }
+ }
+ },
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedLong",
+ "bsonType": "long",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberLong": "0"
+ },
+ "max": {
+ "$numberLong": "200"
+ }
+ }
+ }
+ ]
+ }
+ },
+ "deleteTokens": {
+ "default.default": {
+ "encryptedLong": {
+ "e": {
+ "$binary": {
+ "base64": "65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+w=",
+ "subType": "00"
+ }
+ },
+ "o": {
+ "$binary": {
+ "base64": "noN+05JsuO1oDg59yypIGj45i+eFH6HOTXOPpeZ//Mk=",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "command_name": "findAndModify"
+ }
+ }
+ ],
+ "outcome": {
+ "collection": {
+ "data": [
+ {
+ "_id": 0,
+ "encryptedLong": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=",
+ "subType": "00"
+ }
+ }
+ ]
+ },
+ {
+ "_id": 1,
+ "encryptedLong": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "DLCAJs+W2PL2DV5YChCL6dYrQNr+j4p3L7xhVaub4ic=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hyDcE6QQjPrYJaIS/n7evEZFYcm31Tj89CpEYGF45cI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "F08nMDWDZc+DbWM7XCEJNNCEYyinRmrvGP7EWhmp4is=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cXH4688amcDc8kZOJq4UP8cE3R58Zl7e+Qo/1jyspps=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "uURBxvTp3FBCVkd+LPqyuY7d6rMW6SGIJQEPY/wtkZI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "jG3hax1L3RBp9t38vUt53FsBxgr/+Si/vVISpAylYpE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kwtIW8MhH9Ky5xNjBx8gFA/SHh2YVphie7g5FGBzals=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FHflwFuEMu4xX0ZApHi+pdlBH+oevAtXckCUb5Wv0xU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ty4cnzJdAlbQKnh7px3GEYjBnvO+jIOaKjoTRDtmh3M=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ ]
+}
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-Long-FindOneAndUpdate.yml b/specifications/client-side-encryption/tests/legacy/fle2-Range-Long-FindOneAndUpdate.yml
new file mode 100644
index 00000000000..a90e09c47c4
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-Long-FindOneAndUpdate.yml
@@ -0,0 +1,243 @@
+# Requires libmongocrypt 1.7.0.
+runOn:
+ - minServerVersion: "6.2.0"
+ # FLE 2 Encrypted collections are not supported on standalone.
+ topology: [ "replicaset", "sharded", "load-balanced" ]
+database_name: &database_name "default"
+collection_name: &collection_name "default"
+data: []
+encrypted_fields: &encrypted_fields {'escCollection': 'enxcol_.default.esc', 'eccCollection': 'enxcol_.default.ecc', 'ecocCollection': 'enxcol_.default.ecoc', 'fields': [{'keyId': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'path': 'encryptedLong', 'bsonType': 'long', 'queries': {'queryType': 'rangePreview', 'contention': {'$numberLong': '0'}, 'sparsity': {'$numberLong': '1'}, 'min': {'$numberLong': '0'}, 'max': {'$numberLong': '200'}}}]}
+key_vault_data: [ {'_id': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'keyMaterial': {'$binary': {'base64': 'sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==', 'subType': '00'}}, 'creationDate': {'$date': {'$numberLong': '1648914851981'}}, 'updateDate': {'$date': {'$numberLong': '1648914851981'}}, 'status': {'$numberInt': '0'}, 'masterKey': {'provider': 'local'}} ]
+tests:
+ - description: "FLE2 Range Long. FindOneAndUpdate."
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments:
+ document: &doc0 { _id: 0, encryptedLong: { $numberLong: "0" } }
+ - name: insertOne
+ arguments:
+ document: &doc1 { _id: 1, encryptedLong: { $numberLong: "1" } }
+ - name: findOneAndUpdate
+ arguments:
+ filter: { encryptedLong: { $gt: {$numberLong: "0"}} }
+ update: { "$set": { "encryptedLong": {$numberLong: "2"}}}
+ returnDocument: Before
+ result: *doc1
+ expectations:
+ - command_started_event:
+ command:
+ listCollections: 1
+ filter:
+ name: *collection_name
+ command_name: listCollections
+ - command_started_event:
+ command:
+ find: datakeys
+ filter: {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ }
+ $db: keyvault
+ readConcern: { level: "majority" }
+ command_name: find
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc0_encrypted { "_id": 0, "encryptedLong": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc1_encrypted { "_id": 1, "encryptedLong": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ findAndModify: *collection_name
+ query: {
+ "encryptedLong": {
+ "$gt": {
+ "$binary": {
+ "base64": "CnEFAAADcGF5bG9hZABBBQAABGcABQUAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVjACAAAAAAKs6X8gaa+AJ6PpxVicsk7iCXpSYIkQ5zB0KnXqlfCWgAAzEAfQAAAAVkACAAAAAAtL3QIvnZqCF72eS6lKr8ilff7R6kiNklokiTuaU5wNsFcwAgAAAAAEtqr3/X731VB+VrbFcY8ZrJKRo2E0Fd+C8L0EMNcvcCBWMAIAAAAABYTWOKsDZ7cgPhiKDR2bE5CFGz4MuEwZbzZ0z46eGzBQADMgB9AAAABWQAIAAAAAB99ZW/7KwXKzl5M3XQsAJ3JbEef90IoxFYBArNiYzlgQVzACAAAAAAYO/qaw0+92HAryxOUG7iK6hnIy3OaUA9jIqtHdvcq8YFYwAgAAAAABSqgKlxv5LXoxUO3zNmqGztlZhL2S150WiR/eycv7CWAAMzAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVjACAAAAAAfsofSP7nQHv8ic8ZW0aNlWxplS46Z+mywPR4rQk+wcgAAzQAfQAAAAVkACAAAAAAV22FGF7ZDwK/EYiGNMlm/QuT3saQdyJM/Fn+ZyQug1oFcwAgAAAAACo7GwCvbcs5UHQMgds9/1QMklEVdjZigpuOFGrDmmxtBWMAIAAAAADu3L42J/oqNLe/XNYpodf2fhmPdcLhqO4J24o0hiveXwADNQB9AAAABWQAIAAAAADFspsMG7yHjKppyllon1KqAsTrHaZ6JzNqnSz8o6iTvwVzACAAAAAAeiA5pqVIQQ9s6UY/P8v5Jjkl3I7iFNeLDYehikrINrsFYwAgAAAAAAUljtCIvjRnLB2UPTEeRIz11Snl5SOBUNaXMXig4rqKAAM2AH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVjACAAAAAAD51NYesiO4Fo7w7iWBfqAFxEqkaDVctpvzZ28nT4SE8AAzcAfQAAAAVkACAAAAAAYfLwnoxK6XAGQrJFy8+TIJoq38ldBaO75h4zA4ZX5tQFcwAgAAAAAC2wk8UcJH5X5XGnDBYmel6srpBkzBhHtt3Jw1u5TSJ1BWMAIAAAAABJDtFhJ2tPbowp1UUmOCN/rqSqHRL1dtMu0c47vIlK4wADOAB9AAAABWQAIAAAAADGvyrtKkIcaV17ynZA7b2k5Pz6OhvxdWNkDvDWJIja8wVzACAAAAAAOLypVKNxf/wR1G8OZjUUsTQzDYeNNhhITxGMSp7euS4FYwAgAAAAAE6kvmXPqTnYIH4EJmNhy8OLVJZFOmdiBXLMorhELjKWAAM5AH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVjACAAAAAA85AiE+bNFAYQTXQAFexgeczdVhf8FUnf16WzJlI/kmsAAAVlACAAAAAA65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+wSY20AAAAAAAAAAAAAEHBheWxvYWRJZAAAAAAAEGZpcnN0T3BlcmF0b3IAAQAAAAA=",
+ "subType": "06"
+ }
+ }
+ }
+ }
+ update: { "$set": {"encryptedLong": { $$type: "binData" }} }
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ "deleteTokens": {
+ "default.default": {
+ "encryptedLong": {
+ "e": {
+ "$binary": {
+ "base64": "65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+w=",
+ "subType": "00"
+ }
+ },
+ "o": {
+ "$binary": {
+ "base64": "noN+05JsuO1oDg59yypIGj45i+eFH6HOTXOPpeZ//Mk=",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ command_name: findAndModify
+ outcome:
+ collection:
+ # Outcome is checked using a separate MongoClient without auto encryption.
+ data:
+ -
+ {
+ "_id": 0,
+ "encryptedLong": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ -
+ {
+ "_id": 1,
+ "encryptedLong": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "DLCAJs+W2PL2DV5YChCL6dYrQNr+j4p3L7xhVaub4ic=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hyDcE6QQjPrYJaIS/n7evEZFYcm31Tj89CpEYGF45cI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "F08nMDWDZc+DbWM7XCEJNNCEYyinRmrvGP7EWhmp4is=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cXH4688amcDc8kZOJq4UP8cE3R58Zl7e+Qo/1jyspps=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "uURBxvTp3FBCVkd+LPqyuY7d6rMW6SGIJQEPY/wtkZI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "jG3hax1L3RBp9t38vUt53FsBxgr/+Si/vVISpAylYpE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kwtIW8MhH9Ky5xNjBx8gFA/SHh2YVphie7g5FGBzals=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FHflwFuEMu4xX0ZApHi+pdlBH+oevAtXckCUb5Wv0xU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ty4cnzJdAlbQKnh7px3GEYjBnvO+jIOaKjoTRDtmh3M=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
\ No newline at end of file
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-Long-InsertFind.json b/specifications/client-side-encryption/tests/legacy/fle2-Range-Long-InsertFind.json
new file mode 100644
index 00000000000..882e52170d2
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-Long-InsertFind.json
@@ -0,0 +1,481 @@
+{
+ "runOn": [
+ {
+ "minServerVersion": "6.2.0",
+ "topology": [
+ "replicaset",
+ "sharded",
+ "load-balanced"
+ ]
+ }
+ ],
+ "database_name": "default",
+ "collection_name": "default",
+ "data": [],
+ "encrypted_fields": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedLong",
+ "bsonType": "long",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberLong": "0"
+ },
+ "max": {
+ "$numberLong": "200"
+ }
+ }
+ }
+ ]
+ },
+ "key_vault_data": [
+ {
+ "_id": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "keyMaterial": {
+ "$binary": {
+ "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==",
+ "subType": "00"
+ }
+ },
+ "creationDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "updateDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "status": {
+ "$numberInt": "0"
+ },
+ "masterKey": {
+ "provider": "local"
+ }
+ }
+ ],
+ "tests": [
+ {
+ "description": "FLE2 Range Long. Insert and Find.",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedLong": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedLong": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedLong": {
+ "$gt": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ },
+ "result": [
+ {
+ "_id": 1,
+ "encryptedLong": {
+ "$numberLong": "1"
+ }
+ }
+ ]
+ }
+ ],
+ "expectations": [
+ {
+ "command_started_event": {
+ "command": {
+ "listCollections": 1,
+ "filter": {
+ "name": "default"
+ }
+ },
+ "command_name": "listCollections"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "find": "datakeys",
+ "filter": {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ },
+ "$db": "keyvault",
+ "readConcern": {
+ "level": "majority"
+ }
+ },
+ "command_name": "find"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 0,
+ "encryptedLong": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedLong",
+ "bsonType": "long",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberLong": "0"
+ },
+ "max": {
+ "$numberLong": "200"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 1,
+ "encryptedLong": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedLong",
+ "bsonType": "long",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberLong": "0"
+ },
+ "max": {
+ "$numberLong": "200"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "find": "default",
+ "filter": {
+ "encryptedLong": {
+ "$gt": {
+ "$binary": {
+ "base64": "CnEFAAADcGF5bG9hZABBBQAABGcABQUAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVjACAAAAAAKs6X8gaa+AJ6PpxVicsk7iCXpSYIkQ5zB0KnXqlfCWgAAzEAfQAAAAVkACAAAAAAtL3QIvnZqCF72eS6lKr8ilff7R6kiNklokiTuaU5wNsFcwAgAAAAAEtqr3/X731VB+VrbFcY8ZrJKRo2E0Fd+C8L0EMNcvcCBWMAIAAAAABYTWOKsDZ7cgPhiKDR2bE5CFGz4MuEwZbzZ0z46eGzBQADMgB9AAAABWQAIAAAAAB99ZW/7KwXKzl5M3XQsAJ3JbEef90IoxFYBArNiYzlgQVzACAAAAAAYO/qaw0+92HAryxOUG7iK6hnIy3OaUA9jIqtHdvcq8YFYwAgAAAAABSqgKlxv5LXoxUO3zNmqGztlZhL2S150WiR/eycv7CWAAMzAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVjACAAAAAAfsofSP7nQHv8ic8ZW0aNlWxplS46Z+mywPR4rQk+wcgAAzQAfQAAAAVkACAAAAAAV22FGF7ZDwK/EYiGNMlm/QuT3saQdyJM/Fn+ZyQug1oFcwAgAAAAACo7GwCvbcs5UHQMgds9/1QMklEVdjZigpuOFGrDmmxtBWMAIAAAAADu3L42J/oqNLe/XNYpodf2fhmPdcLhqO4J24o0hiveXwADNQB9AAAABWQAIAAAAADFspsMG7yHjKppyllon1KqAsTrHaZ6JzNqnSz8o6iTvwVzACAAAAAAeiA5pqVIQQ9s6UY/P8v5Jjkl3I7iFNeLDYehikrINrsFYwAgAAAAAAUljtCIvjRnLB2UPTEeRIz11Snl5SOBUNaXMXig4rqKAAM2AH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVjACAAAAAAD51NYesiO4Fo7w7iWBfqAFxEqkaDVctpvzZ28nT4SE8AAzcAfQAAAAVkACAAAAAAYfLwnoxK6XAGQrJFy8+TIJoq38ldBaO75h4zA4ZX5tQFcwAgAAAAAC2wk8UcJH5X5XGnDBYmel6srpBkzBhHtt3Jw1u5TSJ1BWMAIAAAAABJDtFhJ2tPbowp1UUmOCN/rqSqHRL1dtMu0c47vIlK4wADOAB9AAAABWQAIAAAAADGvyrtKkIcaV17ynZA7b2k5Pz6OhvxdWNkDvDWJIja8wVzACAAAAAAOLypVKNxf/wR1G8OZjUUsTQzDYeNNhhITxGMSp7euS4FYwAgAAAAAE6kvmXPqTnYIH4EJmNhy8OLVJZFOmdiBXLMorhELjKWAAM5AH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVjACAAAAAA85AiE+bNFAYQTXQAFexgeczdVhf8FUnf16WzJlI/kmsAAAVlACAAAAAA65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+wSY20AAAAAAAAAAAAAEHBheWxvYWRJZAAAAAAAEGZpcnN0T3BlcmF0b3IAAQAAAAA=",
+ "subType": "06"
+ }
+ }
+ }
+ },
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedLong",
+ "bsonType": "long",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberLong": "0"
+ },
+ "max": {
+ "$numberLong": "200"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "find"
+ }
+ }
+ ],
+ "outcome": {
+ "collection": {
+ "data": [
+ {
+ "_id": 0,
+ "encryptedLong": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=",
+ "subType": "00"
+ }
+ }
+ ]
+ },
+ {
+ "_id": 1,
+ "encryptedLong": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "bE1vqWj3KNyM7cCYUv/cnYm8BPaUL3eMp5syTHq6NF4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "25j9sQXZCihCmHKvTHgaBsAVZFcGPn7JjHdrCGlwyyw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FA74j21GUEJb1DJBOpR9nVnjaDZnd8yAQNuaW9Qi26g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kJv//KVkbrobIBf+QeWC5jxn20mx/P0R1N6aCSMgKM8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zB+Whi9IUUGxfLEe+lGuIzLX4LFbIhaIAm5lRk65QTc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ybO1QU3CgvhO8JgRXH+HxKszWcpl5aGDYYVa75fHa1g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "X3Y3eSAbbMg//JgiHHiFpYOpV61t8kkDexI+CQyitH4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SlNHXyqVFGDPrX/2ppwog6l4pwj3PKda2TkZbqgfSfA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "McjV8xwTF3xI7863DYOBdyvIv6UpzThl6v9vBRk05bI=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ ]
+}
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-Long-InsertFind.yml b/specifications/client-side-encryption/tests/legacy/fle2-Range-Long-InsertFind.yml
new file mode 100644
index 00000000000..f0c79b21dc7
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-Long-InsertFind.yml
@@ -0,0 +1,221 @@
+# Requires libmongocrypt 1.7.0.
+runOn:
+ - minServerVersion: "6.2.0"
+ # FLE 2 Encrypted collections are not supported on standalone.
+ topology: [ "replicaset", "sharded", "load-balanced" ]
+database_name: &database_name "default"
+collection_name: &collection_name "default"
+data: []
+encrypted_fields: &encrypted_fields {'escCollection': 'enxcol_.default.esc', 'eccCollection': 'enxcol_.default.ecc', 'ecocCollection': 'enxcol_.default.ecoc', 'fields': [{'keyId': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'path': 'encryptedLong', 'bsonType': 'long', 'queries': {'queryType': 'rangePreview', 'contention': {'$numberLong': '0'}, 'sparsity': {'$numberLong': '1'}, 'min': {'$numberLong': '0'}, 'max': {'$numberLong': '200'}}}]}
+key_vault_data: [ {'_id': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'keyMaterial': {'$binary': {'base64': 'sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==', 'subType': '00'}}, 'creationDate': {'$date': {'$numberLong': '1648914851981'}}, 'updateDate': {'$date': {'$numberLong': '1648914851981'}}, 'status': {'$numberInt': '0'}, 'masterKey': {'provider': 'local'}} ]
+tests:
+ - description: "FLE2 Range Long. Insert and Find."
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments:
+ document: &doc0 { _id: 0, encryptedLong: { $numberLong: "0" } }
+ - name: insertOne
+ arguments:
+ document: &doc1 { _id: 1, encryptedLong: { $numberLong: "1" } }
+ - name: find
+ arguments:
+ filter: { encryptedLong: { $gt: { $numberLong: "0" } } }
+ result: [*doc1]
+ expectations:
+ - command_started_event:
+ command:
+ listCollections: 1
+ filter:
+ name: *collection_name
+ command_name: listCollections
+ - command_started_event:
+ command:
+ find: datakeys
+ filter: {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ }
+ $db: keyvault
+ readConcern: { level: "majority" }
+ command_name: find
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc0_encrypted { "_id": 0, "encryptedLong": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc1_encrypted { "_id": 1, "encryptedLong": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ find: *collection_name
+ filter:
+ "encryptedLong": {
+ "$gt": {
+ "$binary": {
+ "base64": "CnEFAAADcGF5bG9hZABBBQAABGcABQUAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVjACAAAAAAKs6X8gaa+AJ6PpxVicsk7iCXpSYIkQ5zB0KnXqlfCWgAAzEAfQAAAAVkACAAAAAAtL3QIvnZqCF72eS6lKr8ilff7R6kiNklokiTuaU5wNsFcwAgAAAAAEtqr3/X731VB+VrbFcY8ZrJKRo2E0Fd+C8L0EMNcvcCBWMAIAAAAABYTWOKsDZ7cgPhiKDR2bE5CFGz4MuEwZbzZ0z46eGzBQADMgB9AAAABWQAIAAAAAB99ZW/7KwXKzl5M3XQsAJ3JbEef90IoxFYBArNiYzlgQVzACAAAAAAYO/qaw0+92HAryxOUG7iK6hnIy3OaUA9jIqtHdvcq8YFYwAgAAAAABSqgKlxv5LXoxUO3zNmqGztlZhL2S150WiR/eycv7CWAAMzAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVjACAAAAAAfsofSP7nQHv8ic8ZW0aNlWxplS46Z+mywPR4rQk+wcgAAzQAfQAAAAVkACAAAAAAV22FGF7ZDwK/EYiGNMlm/QuT3saQdyJM/Fn+ZyQug1oFcwAgAAAAACo7GwCvbcs5UHQMgds9/1QMklEVdjZigpuOFGrDmmxtBWMAIAAAAADu3L42J/oqNLe/XNYpodf2fhmPdcLhqO4J24o0hiveXwADNQB9AAAABWQAIAAAAADFspsMG7yHjKppyllon1KqAsTrHaZ6JzNqnSz8o6iTvwVzACAAAAAAeiA5pqVIQQ9s6UY/P8v5Jjkl3I7iFNeLDYehikrINrsFYwAgAAAAAAUljtCIvjRnLB2UPTEeRIz11Snl5SOBUNaXMXig4rqKAAM2AH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVjACAAAAAAD51NYesiO4Fo7w7iWBfqAFxEqkaDVctpvzZ28nT4SE8AAzcAfQAAAAVkACAAAAAAYfLwnoxK6XAGQrJFy8+TIJoq38ldBaO75h4zA4ZX5tQFcwAgAAAAAC2wk8UcJH5X5XGnDBYmel6srpBkzBhHtt3Jw1u5TSJ1BWMAIAAAAABJDtFhJ2tPbowp1UUmOCN/rqSqHRL1dtMu0c47vIlK4wADOAB9AAAABWQAIAAAAADGvyrtKkIcaV17ynZA7b2k5Pz6OhvxdWNkDvDWJIja8wVzACAAAAAAOLypVKNxf/wR1G8OZjUUsTQzDYeNNhhITxGMSp7euS4FYwAgAAAAAE6kvmXPqTnYIH4EJmNhy8OLVJZFOmdiBXLMorhELjKWAAM5AH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVjACAAAAAA85AiE+bNFAYQTXQAFexgeczdVhf8FUnf16WzJlI/kmsAAAVlACAAAAAA65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+wSY20AAAAAAAAAAAAAEHBheWxvYWRJZAAAAAAAEGZpcnN0T3BlcmF0b3IAAQAAAAA=",
+ "subType": "06"
+ }
+ }
+ }
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: find
+ outcome:
+ collection:
+ # Outcome is checked using a separate MongoClient without auto encryption.
+ data:
+ -
+ {
+ "_id": 0,
+ "encryptedLong": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ -
+ {
+ "_id": 1,
+ "encryptedLong": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "bE1vqWj3KNyM7cCYUv/cnYm8BPaUL3eMp5syTHq6NF4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "25j9sQXZCihCmHKvTHgaBsAVZFcGPn7JjHdrCGlwyyw=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FA74j21GUEJb1DJBOpR9nVnjaDZnd8yAQNuaW9Qi26g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kJv//KVkbrobIBf+QeWC5jxn20mx/P0R1N6aCSMgKM8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "zB+Whi9IUUGxfLEe+lGuIzLX4LFbIhaIAm5lRk65QTc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ybO1QU3CgvhO8JgRXH+HxKszWcpl5aGDYYVa75fHa1g=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "X3Y3eSAbbMg//JgiHHiFpYOpV61t8kkDexI+CQyitH4=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "SlNHXyqVFGDPrX/2ppwog6l4pwj3PKda2TkZbqgfSfA=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "McjV8xwTF3xI7863DYOBdyvIv6UpzThl6v9vBRk05bI=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
\ No newline at end of file
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-Long-Update.json b/specifications/client-side-encryption/tests/legacy/fle2-Range-Long-Update.json
new file mode 100644
index 00000000000..92e3e390a5f
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-Long-Update.json
@@ -0,0 +1,516 @@
+{
+ "runOn": [
+ {
+ "minServerVersion": "6.2.0",
+ "topology": [
+ "replicaset",
+ "sharded",
+ "load-balanced"
+ ]
+ }
+ ],
+ "database_name": "default",
+ "collection_name": "default",
+ "data": [],
+ "encrypted_fields": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedLong",
+ "bsonType": "long",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberLong": "0"
+ },
+ "max": {
+ "$numberLong": "200"
+ }
+ }
+ }
+ ]
+ },
+ "key_vault_data": [
+ {
+ "_id": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "keyMaterial": {
+ "$binary": {
+ "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==",
+ "subType": "00"
+ }
+ },
+ "creationDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "updateDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "status": {
+ "$numberInt": "0"
+ },
+ "masterKey": {
+ "provider": "local"
+ }
+ }
+ ],
+ "tests": [
+ {
+ "description": "FLE2 Range Long. Update.",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedLong": {
+ "$numberLong": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 1,
+ "encryptedLong": {
+ "$numberLong": "1"
+ }
+ }
+ }
+ },
+ {
+ "name": "updateOne",
+ "arguments": {
+ "filter": {
+ "encryptedLong": {
+ "$gt": {
+ "$numberLong": "0"
+ }
+ }
+ },
+ "update": {
+ "$set": {
+ "encryptedLong": {
+ "$numberLong": "2"
+ }
+ }
+ }
+ },
+ "result": {
+ "matchedCount": 1,
+ "modifiedCount": 1,
+ "upsertedCount": 0
+ }
+ }
+ ],
+ "expectations": [
+ {
+ "command_started_event": {
+ "command": {
+ "listCollections": 1,
+ "filter": {
+ "name": "default"
+ }
+ },
+ "command_name": "listCollections"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "find": "datakeys",
+ "filter": {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ },
+ "$db": "keyvault",
+ "readConcern": {
+ "level": "majority"
+ }
+ },
+ "command_name": "find"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 0,
+ "encryptedLong": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedLong",
+ "bsonType": "long",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberLong": "0"
+ },
+ "max": {
+ "$numberLong": "200"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command": {
+ "insert": "default",
+ "documents": [
+ {
+ "_id": 1,
+ "encryptedLong": {
+ "$$type": "binData"
+ }
+ }
+ ],
+ "ordered": true,
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedLong",
+ "bsonType": "long",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberLong": "0"
+ },
+ "max": {
+ "$numberLong": "200"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+ },
+ "command_name": "insert"
+ }
+ },
+ {
+ "command_started_event": {
+ "command_name": "update",
+ "command": {
+ "update": "default",
+ "ordered": true,
+ "updates": [
+ {
+ "q": {
+ "encryptedLong": {
+ "$gt": {
+ "$binary": {
+ "base64": "CnEFAAADcGF5bG9hZABBBQAABGcABQUAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVjACAAAAAAKs6X8gaa+AJ6PpxVicsk7iCXpSYIkQ5zB0KnXqlfCWgAAzEAfQAAAAVkACAAAAAAtL3QIvnZqCF72eS6lKr8ilff7R6kiNklokiTuaU5wNsFcwAgAAAAAEtqr3/X731VB+VrbFcY8ZrJKRo2E0Fd+C8L0EMNcvcCBWMAIAAAAABYTWOKsDZ7cgPhiKDR2bE5CFGz4MuEwZbzZ0z46eGzBQADMgB9AAAABWQAIAAAAAB99ZW/7KwXKzl5M3XQsAJ3JbEef90IoxFYBArNiYzlgQVzACAAAAAAYO/qaw0+92HAryxOUG7iK6hnIy3OaUA9jIqtHdvcq8YFYwAgAAAAABSqgKlxv5LXoxUO3zNmqGztlZhL2S150WiR/eycv7CWAAMzAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVjACAAAAAAfsofSP7nQHv8ic8ZW0aNlWxplS46Z+mywPR4rQk+wcgAAzQAfQAAAAVkACAAAAAAV22FGF7ZDwK/EYiGNMlm/QuT3saQdyJM/Fn+ZyQug1oFcwAgAAAAACo7GwCvbcs5UHQMgds9/1QMklEVdjZigpuOFGrDmmxtBWMAIAAAAADu3L42J/oqNLe/XNYpodf2fhmPdcLhqO4J24o0hiveXwADNQB9AAAABWQAIAAAAADFspsMG7yHjKppyllon1KqAsTrHaZ6JzNqnSz8o6iTvwVzACAAAAAAeiA5pqVIQQ9s6UY/P8v5Jjkl3I7iFNeLDYehikrINrsFYwAgAAAAAAUljtCIvjRnLB2UPTEeRIz11Snl5SOBUNaXMXig4rqKAAM2AH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVjACAAAAAAD51NYesiO4Fo7w7iWBfqAFxEqkaDVctpvzZ28nT4SE8AAzcAfQAAAAVkACAAAAAAYfLwnoxK6XAGQrJFy8+TIJoq38ldBaO75h4zA4ZX5tQFcwAgAAAAAC2wk8UcJH5X5XGnDBYmel6srpBkzBhHtt3Jw1u5TSJ1BWMAIAAAAABJDtFhJ2tPbowp1UUmOCN/rqSqHRL1dtMu0c47vIlK4wADOAB9AAAABWQAIAAAAADGvyrtKkIcaV17ynZA7b2k5Pz6OhvxdWNkDvDWJIja8wVzACAAAAAAOLypVKNxf/wR1G8OZjUUsTQzDYeNNhhITxGMSp7euS4FYwAgAAAAAE6kvmXPqTnYIH4EJmNhy8OLVJZFOmdiBXLMorhELjKWAAM5AH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVjACAAAAAA85AiE+bNFAYQTXQAFexgeczdVhf8FUnf16WzJlI/kmsAAAVlACAAAAAA65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+wSY20AAAAAAAAAAAAAEHBheWxvYWRJZAAAAAAAEGZpcnN0T3BlcmF0b3IAAQAAAAA=",
+ "subType": "06"
+ }
+ }
+ }
+ },
+ "u": {
+ "$set": {
+ "encryptedLong": {
+ "$$type": "binData"
+ }
+ }
+ }
+ }
+ ],
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedLong",
+ "bsonType": "long",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberLong": "0"
+ },
+ "max": {
+ "$numberLong": "200"
+ }
+ }
+ }
+ ]
+ }
+ },
+ "deleteTokens": {
+ "default.default": {
+ "encryptedLong": {
+ "e": {
+ "$binary": {
+ "base64": "65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+w=",
+ "subType": "00"
+ }
+ },
+ "o": {
+ "$binary": {
+ "base64": "noN+05JsuO1oDg59yypIGj45i+eFH6HOTXOPpeZ//Mk=",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "$db": "default"
+ }
+ }
+ }
+ ],
+ "outcome": {
+ "collection": {
+ "data": [
+ {
+ "_id": 0,
+ "encryptedLong": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=",
+ "subType": "00"
+ }
+ }
+ ]
+ },
+ {
+ "_id": 1,
+ "encryptedLong": {
+ "$$type": "binData"
+ },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "DLCAJs+W2PL2DV5YChCL6dYrQNr+j4p3L7xhVaub4ic=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hyDcE6QQjPrYJaIS/n7evEZFYcm31Tj89CpEYGF45cI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "F08nMDWDZc+DbWM7XCEJNNCEYyinRmrvGP7EWhmp4is=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cXH4688amcDc8kZOJq4UP8cE3R58Zl7e+Qo/1jyspps=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "uURBxvTp3FBCVkd+LPqyuY7d6rMW6SGIJQEPY/wtkZI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "jG3hax1L3RBp9t38vUt53FsBxgr/+Si/vVISpAylYpE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kwtIW8MhH9Ky5xNjBx8gFA/SHh2YVphie7g5FGBzals=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FHflwFuEMu4xX0ZApHi+pdlBH+oevAtXckCUb5Wv0xU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ty4cnzJdAlbQKnh7px3GEYjBnvO+jIOaKjoTRDtmh3M=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ ]
+}
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-Long-Update.yml b/specifications/client-side-encryption/tests/legacy/fle2-Range-Long-Update.yml
new file mode 100644
index 00000000000..20783a7cdd2
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-Long-Update.yml
@@ -0,0 +1,260 @@
+# Requires libmongocrypt 1.7.0.
+runOn:
+ - minServerVersion: "6.2.0"
+ # FLE 2 Encrypted collections are not supported on standalone.
+ topology: [ "replicaset", "sharded", "load-balanced" ]
+database_name: &database_name "default"
+collection_name: &collection_name "default"
+data: []
+encrypted_fields: &encrypted_fields {'escCollection': 'enxcol_.default.esc', 'eccCollection': 'enxcol_.default.ecc', 'ecocCollection': 'enxcol_.default.ecoc', 'fields': [{'keyId': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'path': 'encryptedLong', 'bsonType': 'long', 'queries': {'queryType': 'rangePreview', 'contention': {'$numberLong': '0'}, 'sparsity': {'$numberLong': '1'}, 'min': {'$numberLong': '0'}, 'max': {'$numberLong': '200'}}}]}
+key_vault_data: [ {'_id': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'keyMaterial': {'$binary': {'base64': 'sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==', 'subType': '00'}}, 'creationDate': {'$date': {'$numberLong': '1648914851981'}}, 'updateDate': {'$date': {'$numberLong': '1648914851981'}}, 'status': {'$numberInt': '0'}, 'masterKey': {'provider': 'local'}} ]
+tests:
+ - description: "FLE2 Range Long. Update."
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments:
+ document: &doc0 { _id: 0, encryptedLong: { $numberLong: "0" } }
+ - name: insertOne
+ arguments:
+ document: &doc1 { _id: 1, encryptedLong: { $numberLong: "1" } }
+ - name: updateOne
+ arguments:
+ filter: { encryptedLong: { $gt: { $numberLong: "0" } } }
+ update: { "$set": { "encryptedLong": { $numberLong: "2" } }}
+ result:
+ matchedCount: 1
+ modifiedCount: 1
+ upsertedCount: 0
+ expectations:
+ - command_started_event:
+ command:
+ listCollections: 1
+ filter:
+ name: *collection_name
+ command_name: listCollections
+ - command_started_event:
+ command:
+ find: datakeys
+ filter: {
+ "$or": [
+ {
+ "_id": {
+ "$in": [
+ {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}
+ ]
+ }
+ },
+ {
+ "keyAltNames": {
+ "$in": []
+ }
+ }
+ ]
+ }
+ $db: keyvault
+ readConcern: { level: "majority" }
+ command_name: find
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc0_encrypted { "_id": 0, "encryptedLong": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command:
+ insert: *collection_name
+ documents:
+ - &doc1_encrypted { "_id": 1, "encryptedLong": { $$type: "binData" } }
+ ordered: true
+ encryptionInformation:
+ type: 1
+ schema:
+ default.default: *encrypted_fields
+ command_name: insert
+ - command_started_event:
+ command_name: update
+ command:
+ {
+ "update": "default",
+ "ordered": true,
+ "updates": [
+ {
+ "q": {
+ "encryptedLong": {
+ "$gt": {
+ "$binary": {
+ "base64": "CnEFAAADcGF5bG9hZABBBQAABGcABQUAAAMwAH0AAAAFZAAgAAAAALGGQ/CRD+pGLD53BZzWcCcYbuGLVEyjzXIx7b+ux/q2BXMAIAAAAACOC6mXEZL27P9hethZbtKYsTXKK+FpgQ9Axxmn9N/cCwVjACAAAAAAKs6X8gaa+AJ6PpxVicsk7iCXpSYIkQ5zB0KnXqlfCWgAAzEAfQAAAAVkACAAAAAAtL3QIvnZqCF72eS6lKr8ilff7R6kiNklokiTuaU5wNsFcwAgAAAAAEtqr3/X731VB+VrbFcY8ZrJKRo2E0Fd+C8L0EMNcvcCBWMAIAAAAABYTWOKsDZ7cgPhiKDR2bE5CFGz4MuEwZbzZ0z46eGzBQADMgB9AAAABWQAIAAAAAB99ZW/7KwXKzl5M3XQsAJ3JbEef90IoxFYBArNiYzlgQVzACAAAAAAYO/qaw0+92HAryxOUG7iK6hnIy3OaUA9jIqtHdvcq8YFYwAgAAAAABSqgKlxv5LXoxUO3zNmqGztlZhL2S150WiR/eycv7CWAAMzAH0AAAAFZAAgAAAAAOK8brUuc2onBNDRtfYMR736dHj4dQqXod8JG7tAMTsDBXMAIAAAAAAW6SrGAL6Bx0s7ZlsYULFfOAiYIGhEWu6md3r+Rk40awVjACAAAAAAfsofSP7nQHv8ic8ZW0aNlWxplS46Z+mywPR4rQk+wcgAAzQAfQAAAAVkACAAAAAAV22FGF7ZDwK/EYiGNMlm/QuT3saQdyJM/Fn+ZyQug1oFcwAgAAAAACo7GwCvbcs5UHQMgds9/1QMklEVdjZigpuOFGrDmmxtBWMAIAAAAADu3L42J/oqNLe/XNYpodf2fhmPdcLhqO4J24o0hiveXwADNQB9AAAABWQAIAAAAADFspsMG7yHjKppyllon1KqAsTrHaZ6JzNqnSz8o6iTvwVzACAAAAAAeiA5pqVIQQ9s6UY/P8v5Jjkl3I7iFNeLDYehikrINrsFYwAgAAAAAAUljtCIvjRnLB2UPTEeRIz11Snl5SOBUNaXMXig4rqKAAM2AH0AAAAFZAAgAAAAAPcLmtq+V1e+MRlZ7NHq1+mrRVBQje5zj685ZvdsfKvSBXMAIAAAAABdHz/3w2k5km97QN9m7oLFYJaVJneNlMboIlz5yUASQAVjACAAAAAAD51NYesiO4Fo7w7iWBfqAFxEqkaDVctpvzZ28nT4SE8AAzcAfQAAAAVkACAAAAAAYfLwnoxK6XAGQrJFy8+TIJoq38ldBaO75h4zA4ZX5tQFcwAgAAAAAC2wk8UcJH5X5XGnDBYmel6srpBkzBhHtt3Jw1u5TSJ1BWMAIAAAAABJDtFhJ2tPbowp1UUmOCN/rqSqHRL1dtMu0c47vIlK4wADOAB9AAAABWQAIAAAAADGvyrtKkIcaV17ynZA7b2k5Pz6OhvxdWNkDvDWJIja8wVzACAAAAAAOLypVKNxf/wR1G8OZjUUsTQzDYeNNhhITxGMSp7euS4FYwAgAAAAAE6kvmXPqTnYIH4EJmNhy8OLVJZFOmdiBXLMorhELjKWAAM5AH0AAAAFZAAgAAAAAEocREw1L0g+roFUchJI2Yd0M0ME2bnErNUYnpyJP1SqBXMAIAAAAAAcE2/JK/8MoSeOchIuAkKh1X3ImoA7p8ujAZIfvIDo6QVjACAAAAAA85AiE+bNFAYQTXQAFexgeczdVhf8FUnf16WzJlI/kmsAAAVlACAAAAAA65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+wSY20AAAAAAAAAAAAAEHBheWxvYWRJZAAAAAAAEGZpcnN0T3BlcmF0b3IAAQAAAAA=",
+ "subType": "06"
+ }
+ }
+ }
+ },
+ "u": {
+ "$set": {
+ "encryptedLong": { $$type: "binData" }
+ }
+ }
+ }
+ ],
+ "encryptionInformation": {
+ "type": 1,
+ "schema": {
+ "default.default": *encrypted_fields
+ },
+ "deleteTokens": {
+ "default.default": {
+ "encryptedLong": {
+ "e": {
+ "$binary": {
+ "base64": "65pz95EthqQpfoHS9nWvdCh05AV+OokP7GUaI+7j8+w=",
+ "subType": "00"
+ }
+ },
+ "o": {
+ "$binary": {
+ "base64": "noN+05JsuO1oDg59yypIGj45i+eFH6HOTXOPpeZ//Mk=",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "$db": "default"
+ }
+
+ outcome:
+ collection:
+ # Outcome is checked using a separate MongoClient without auto encryption.
+ data:
+ -
+ {
+ "_id": 0,
+ "encryptedLong": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "5nRutVIyq7URVOVtbE4vM01APSIajAVnsShMwjBlzkM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "RjBYT2h3ZAoHxhf8DU6/dFbDkEBZp0IxREcsRTu2MXs=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "x7GR49EN0t3WXQDihkrbonK7qNIBYC87tpL/XEUyIYc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "JfYUqWF+OoGjiYkRI4L5iPlF+T1Eleul7Fki22jp4Qc=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "q1RyGfIgsaQHoZFRw+DD28V26rN5hweApPLwExncvT8=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "L2PFeKGvLS6C+DLudR6fGlBq3ERPvjWvRyNRIA2HVb0=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "CWxaNqL3iP1yCixDkcmf9bmW3E5VeN8TJkg1jJe528s=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "+vC6araOEo+fpW7PSIP40/EnzBCj1d2N10Jr3rrXJJM=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "6SV63Mf51Z6A6p2X3rCnJKCu6ku3Oeb45mBYbz+IoAo=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
+ -
+ {
+ "_id": 1,
+ "encryptedLong": { $$type: "binData" },
+ "__safeContent__": [
+ {
+ "$binary": {
+ "base64": "DLCAJs+W2PL2DV5YChCL6dYrQNr+j4p3L7xhVaub4ic=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "hyDcE6QQjPrYJaIS/n7evEZFYcm31Tj89CpEYGF45cI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "F08nMDWDZc+DbWM7XCEJNNCEYyinRmrvGP7EWhmp4is=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "cXH4688amcDc8kZOJq4UP8cE3R58Zl7e+Qo/1jyspps=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "uURBxvTp3FBCVkd+LPqyuY7d6rMW6SGIJQEPY/wtkZI=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "jG3hax1L3RBp9t38vUt53FsBxgr/+Si/vVISpAylYpE=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "kwtIW8MhH9Ky5xNjBx8gFA/SHh2YVphie7g5FGBzals=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "FHflwFuEMu4xX0ZApHi+pdlBH+oevAtXckCUb5Wv0xU=",
+ "subType": "00"
+ }
+ },
+ {
+ "$binary": {
+ "base64": "ty4cnzJdAlbQKnh7px3GEYjBnvO+jIOaKjoTRDtmh3M=",
+ "subType": "00"
+ }
+ }
+ ]
+ }
\ No newline at end of file
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-WrongType.json b/specifications/client-side-encryption/tests/legacy/fle2-Range-WrongType.json
new file mode 100644
index 00000000000..9eddf1c99c1
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-WrongType.json
@@ -0,0 +1,162 @@
+{
+ "runOn": [
+ {
+ "minServerVersion": "6.2.0",
+ "topology": [
+ "replicaset",
+ "sharded",
+ "load-balanced"
+ ]
+ }
+ ],
+ "database_name": "default",
+ "collection_name": "default",
+ "data": [],
+ "encrypted_fields": {
+ "escCollection": "enxcol_.default.esc",
+ "eccCollection": "enxcol_.default.ecc",
+ "ecocCollection": "enxcol_.default.ecoc",
+ "fields": [
+ {
+ "keyId": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "path": "encryptedInt",
+ "bsonType": "int",
+ "queries": {
+ "queryType": "rangePreview",
+ "contention": {
+ "$numberLong": "0"
+ },
+ "sparsity": {
+ "$numberLong": "1"
+ },
+ "min": {
+ "$numberInt": "0"
+ },
+ "max": {
+ "$numberInt": "200"
+ }
+ }
+ }
+ ]
+ },
+ "key_vault_data": [
+ {
+ "_id": {
+ "$binary": {
+ "base64": "EjRWeBI0mHYSNBI0VniQEg==",
+ "subType": "04"
+ }
+ },
+ "keyMaterial": {
+ "$binary": {
+ "base64": "sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==",
+ "subType": "00"
+ }
+ },
+ "creationDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "updateDate": {
+ "$date": {
+ "$numberLong": "1648914851981"
+ }
+ },
+ "status": {
+ "$numberInt": "0"
+ },
+ "masterKey": {
+ "provider": "local"
+ }
+ }
+ ],
+ "tests": [
+ {
+ "description": "Wrong type: Insert Double",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedInt": {
+ "$numberDouble": "0"
+ }
+ }
+ },
+ "result": {
+ "errorContains": "cannot encrypt element"
+ }
+ }
+ ]
+ },
+ {
+ "description": "Wrong type: Find Double",
+ "clientOptions": {
+ "autoEncryptOpts": {
+ "kmsProviders": {
+ "local": {
+ "key": {
+ "$binary": {
+ "base64": "Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk",
+ "subType": "00"
+ }
+ }
+ }
+ }
+ }
+ },
+ "operations": [
+ {
+ "name": "insertOne",
+ "arguments": {
+ "document": {
+ "_id": 0,
+ "encryptedInt": {
+ "$numberInt": "0"
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "arguments": {
+ "filter": {
+ "encryptedInt": {
+ "$gte": {
+ "$numberDouble": "0"
+ }
+ }
+ },
+ "sort": {
+ "_id": 1
+ }
+ },
+ "result": {
+ "errorContains": "field type is not supported"
+ }
+ }
+ ]
+ }
+ ]
+}
diff --git a/specifications/client-side-encryption/tests/legacy/fle2-Range-WrongType.yml b/specifications/client-side-encryption/tests/legacy/fle2-Range-WrongType.yml
new file mode 100644
index 00000000000..9bc2c53dfdf
--- /dev/null
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Range-WrongType.yml
@@ -0,0 +1,41 @@
+# Test correctness results.
+# Does not include command monitoring expectations or outcome assertions to make tests more readable.
+# Requires libmongocrypt 1.7.0.
+runOn:
+ - minServerVersion: "6.2.0"
+ # FLE 2 Encrypted collections are not supported on standalone.
+ topology: [ "replicaset", "sharded", "load-balanced" ]
+database_name: &database_name "default"
+collection_name: &collection_name "default"
+data: []
+encrypted_fields: &encrypted_fields {'escCollection': 'enxcol_.default.esc', 'eccCollection': 'enxcol_.default.ecc', 'ecocCollection': 'enxcol_.default.ecoc', 'fields': [{'keyId': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'path': 'encryptedInt', 'bsonType': 'int', 'queries': {'queryType': 'rangePreview', 'contention': {'$numberLong': '0'}, 'sparsity': {'$numberLong': '1'}, 'min': {'$numberInt': '0'}, 'max': {'$numberInt': '200'}}}]}
+key_vault_data: [ {'_id': {'$binary': {'base64': 'EjRWeBI0mHYSNBI0VniQEg==', 'subType': '04'}}, 'keyMaterial': {'$binary': {'base64': 'sHe0kz57YW7v8g9VP9sf/+K1ex4JqKc5rf/URX3n3p8XdZ6+15uXPaSayC6adWbNxkFskuMCOifDoTT+rkqMtFkDclOy884RuGGtUysq3X7zkAWYTKi8QAfKkajvVbZl2y23UqgVasdQu3OVBQCrH/xY00nNAs/52e958nVjBuzQkSb1T8pKJAyjZsHJ60+FtnfafDZSTAIBJYn7UWBCwQ==', 'subType': '00'}}, 'creationDate': {'$date': {'$numberLong': '1648914851981'}}, 'updateDate': {'$date': {'$numberLong': '1648914851981'}}, 'status': {'$numberInt': '0'}, 'masterKey': {'provider': 'local'}} ]
+tests:
+ - description: "Wrong type: Insert Double"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: { _id: 0, encryptedInt: { $numberDouble: "0" }} }
+ result:
+ # Expect an error from mongocryptd.
+ errorContains: "cannot encrypt element"
+
+ - description: "Wrong type: Find Double"
+ clientOptions:
+ autoEncryptOpts:
+ kmsProviders:
+ local: {'key': {'$binary': {'base64': 'Mng0NCt4ZHVUYUJCa1kxNkVyNUR1QURhZ2h2UzR2d2RrZzh0cFBwM3R6NmdWMDFBMUN3YkQ5aXRRMkhGRGdQV09wOGVNYUMxT2k3NjZKelhaQmRCZGJkTXVyZG9uSjFk', 'subType': '00'}}}
+ operations:
+ - name: insertOne
+ arguments: { document: { _id: 0, encryptedInt: { $numberInt: "0" }} }
+ - name: find
+ arguments:
+ filter: { encryptedInt: { $gte: { $numberDouble: "0" } }}
+ # sort so results from range queries are ordered.
+ sort: { _id: 1 }
+ result:
+ # expect an error from libmongocrypt.
+ errorContains: "field type is not supported"
\ No newline at end of file
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-Update.json b/specifications/client-side-encryption/tests/legacy/fle2-Update.json
similarity index 99%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-Update.json
rename to specifications/client-side-encryption/tests/legacy/fle2-Update.json
index 87830af32dd..090f44f9acd 100644
--- a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-Update.json
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Update.json
@@ -4,7 +4,8 @@
"minServerVersion": "6.0.0",
"topology": [
"replicaset",
- "sharded"
+ "sharded",
+ "load-balanced"
]
}
],
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-Update.yml b/specifications/client-side-encryption/tests/legacy/fle2-Update.yml
similarity index 99%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-Update.yml
rename to specifications/client-side-encryption/tests/legacy/fle2-Update.yml
index 19bb549b23b..929f4a3a38a 100644
--- a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-Update.yml
+++ b/specifications/client-side-encryption/tests/legacy/fle2-Update.yml
@@ -1,7 +1,7 @@
runOn:
- minServerVersion: "6.0.0"
# FLE 2 Encrypted collections are not supported on standalone.
- topology: [ "replicaset", "sharded" ]
+ topology: [ "replicaset", "sharded", "load-balanced" ]
database_name: &database_name "default"
collection_name: &collection_name "default"
data: []
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-validatorAndPartialFieldExpression.json b/specifications/client-side-encryption/tests/legacy/fle2-validatorAndPartialFieldExpression.json
similarity index 99%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-validatorAndPartialFieldExpression.json
rename to specifications/client-side-encryption/tests/legacy/fle2-validatorAndPartialFieldExpression.json
index fab36f75a1e..e70ca7c72d5 100644
--- a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-validatorAndPartialFieldExpression.json
+++ b/specifications/client-side-encryption/tests/legacy/fle2-validatorAndPartialFieldExpression.json
@@ -4,7 +4,8 @@
"minServerVersion": "6.0.0",
"topology": [
"replicaset",
- "sharded"
+ "sharded",
+ "load-balanced"
]
}
],
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-validatorAndPartialFieldExpression.yml b/specifications/client-side-encryption/tests/legacy/fle2-validatorAndPartialFieldExpression.yml
similarity index 99%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-validatorAndPartialFieldExpression.yml
rename to specifications/client-side-encryption/tests/legacy/fle2-validatorAndPartialFieldExpression.yml
index b85a7c876d0..9463ddecad1 100644
--- a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/fle2-validatorAndPartialFieldExpression.yml
+++ b/specifications/client-side-encryption/tests/legacy/fle2-validatorAndPartialFieldExpression.yml
@@ -3,7 +3,7 @@ runOn:
# Require server version 6.0.0 to get behavior added in SERVER-64911.
- minServerVersion: "6.0.0"
# FLE 2 Encrypted collections are not supported on standalone.
- topology: [ "replicaset", "sharded" ]
+ topology: [ "replicaset", "sharded", "load-balanced" ]
database_name: &database_name "default"
collection_name: &collection_name "default"
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/gcpKMS.json b/specifications/client-side-encryption/tests/legacy/gcpKMS.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/gcpKMS.json
rename to specifications/client-side-encryption/tests/legacy/gcpKMS.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/gcpKMS.yml b/specifications/client-side-encryption/tests/legacy/gcpKMS.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/gcpKMS.yml
rename to specifications/client-side-encryption/tests/legacy/gcpKMS.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/getMore.json b/specifications/client-side-encryption/tests/legacy/getMore.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/getMore.json
rename to specifications/client-side-encryption/tests/legacy/getMore.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/getMore.yml b/specifications/client-side-encryption/tests/legacy/getMore.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/getMore.yml
rename to specifications/client-side-encryption/tests/legacy/getMore.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/insert.json b/specifications/client-side-encryption/tests/legacy/insert.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/insert.json
rename to specifications/client-side-encryption/tests/legacy/insert.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/insert.yml b/specifications/client-side-encryption/tests/legacy/insert.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/insert.yml
rename to specifications/client-side-encryption/tests/legacy/insert.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/keyAltName.json b/specifications/client-side-encryption/tests/legacy/keyAltName.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/keyAltName.json
rename to specifications/client-side-encryption/tests/legacy/keyAltName.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/keyAltName.yml b/specifications/client-side-encryption/tests/legacy/keyAltName.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/keyAltName.yml
rename to specifications/client-side-encryption/tests/legacy/keyAltName.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/kmipKMS.json b/specifications/client-side-encryption/tests/legacy/kmipKMS.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/kmipKMS.json
rename to specifications/client-side-encryption/tests/legacy/kmipKMS.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/kmipKMS.yml b/specifications/client-side-encryption/tests/legacy/kmipKMS.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/kmipKMS.yml
rename to specifications/client-side-encryption/tests/legacy/kmipKMS.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/localKMS.json b/specifications/client-side-encryption/tests/legacy/localKMS.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/localKMS.json
rename to specifications/client-side-encryption/tests/legacy/localKMS.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/localKMS.yml b/specifications/client-side-encryption/tests/legacy/localKMS.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/localKMS.yml
rename to specifications/client-side-encryption/tests/legacy/localKMS.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/localSchema.json b/specifications/client-side-encryption/tests/legacy/localSchema.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/localSchema.json
rename to specifications/client-side-encryption/tests/legacy/localSchema.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/localSchema.yml b/specifications/client-side-encryption/tests/legacy/localSchema.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/localSchema.yml
rename to specifications/client-side-encryption/tests/legacy/localSchema.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/malformedCiphertext.json b/specifications/client-side-encryption/tests/legacy/malformedCiphertext.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/malformedCiphertext.json
rename to specifications/client-side-encryption/tests/legacy/malformedCiphertext.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/malformedCiphertext.yml b/specifications/client-side-encryption/tests/legacy/malformedCiphertext.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/malformedCiphertext.yml
rename to specifications/client-side-encryption/tests/legacy/malformedCiphertext.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/maxWireVersion.json b/specifications/client-side-encryption/tests/legacy/maxWireVersion.json
similarity index 98%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/maxWireVersion.json
rename to specifications/client-side-encryption/tests/legacy/maxWireVersion.json
index c1088a0ecf4..f04f58dffde 100644
--- a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/maxWireVersion.json
+++ b/specifications/client-side-encryption/tests/legacy/maxWireVersion.json
@@ -1,7 +1,7 @@
{
"runOn": [
{
- "maxServerVersion": "4.0"
+ "maxServerVersion": "4.0.99"
}
],
"database_name": "default",
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/maxWireVersion.yml b/specifications/client-side-encryption/tests/legacy/maxWireVersion.yml
similarity index 97%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/maxWireVersion.yml
rename to specifications/client-side-encryption/tests/legacy/maxWireVersion.yml
index 8df590d809a..87c4c993f9b 100644
--- a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/maxWireVersion.yml
+++ b/specifications/client-side-encryption/tests/legacy/maxWireVersion.yml
@@ -1,5 +1,5 @@
runOn:
- - maxServerVersion: "4.0"
+ - maxServerVersion: "4.0.99"
database_name: &database_name "default"
collection_name: &collection_name "default"
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/missingKey.json b/specifications/client-side-encryption/tests/legacy/missingKey.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/missingKey.json
rename to specifications/client-side-encryption/tests/legacy/missingKey.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/missingKey.yml b/specifications/client-side-encryption/tests/legacy/missingKey.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/missingKey.yml
rename to specifications/client-side-encryption/tests/legacy/missingKey.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/noSchema.json b/specifications/client-side-encryption/tests/legacy/noSchema.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/noSchema.json
rename to specifications/client-side-encryption/tests/legacy/noSchema.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/noSchema.yml b/specifications/client-side-encryption/tests/legacy/noSchema.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/noSchema.yml
rename to specifications/client-side-encryption/tests/legacy/noSchema.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/replaceOne.json b/specifications/client-side-encryption/tests/legacy/replaceOne.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/replaceOne.json
rename to specifications/client-side-encryption/tests/legacy/replaceOne.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/replaceOne.yml b/specifications/client-side-encryption/tests/legacy/replaceOne.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/replaceOne.yml
rename to specifications/client-side-encryption/tests/legacy/replaceOne.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/types.json b/specifications/client-side-encryption/tests/legacy/types.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/types.json
rename to specifications/client-side-encryption/tests/legacy/types.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/types.yml b/specifications/client-side-encryption/tests/legacy/types.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/types.yml
rename to specifications/client-side-encryption/tests/legacy/types.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/unsupportedCommand.json b/specifications/client-side-encryption/tests/legacy/unsupportedCommand.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/unsupportedCommand.json
rename to specifications/client-side-encryption/tests/legacy/unsupportedCommand.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/unsupportedCommand.yml b/specifications/client-side-encryption/tests/legacy/unsupportedCommand.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/unsupportedCommand.yml
rename to specifications/client-side-encryption/tests/legacy/unsupportedCommand.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/updateMany.json b/specifications/client-side-encryption/tests/legacy/updateMany.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/updateMany.json
rename to specifications/client-side-encryption/tests/legacy/updateMany.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/updateMany.yml b/specifications/client-side-encryption/tests/legacy/updateMany.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/updateMany.yml
rename to specifications/client-side-encryption/tests/legacy/updateMany.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/updateOne.json b/specifications/client-side-encryption/tests/legacy/updateOne.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/updateOne.json
rename to specifications/client-side-encryption/tests/legacy/updateOne.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/updateOne.yml b/specifications/client-side-encryption/tests/legacy/updateOne.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/updateOne.yml
rename to specifications/client-side-encryption/tests/legacy/updateOne.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/validatorAndPartialFieldExpression.json b/specifications/client-side-encryption/tests/legacy/validatorAndPartialFieldExpression.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/validatorAndPartialFieldExpression.json
rename to specifications/client-side-encryption/tests/legacy/validatorAndPartialFieldExpression.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/validatorAndPartialFieldExpression.yml b/specifications/client-side-encryption/tests/legacy/validatorAndPartialFieldExpression.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/legacy/validatorAndPartialFieldExpression.yml
rename to specifications/client-side-encryption/tests/legacy/validatorAndPartialFieldExpression.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/unified/addKeyAltName.json b/specifications/client-side-encryption/tests/unified/addKeyAltName.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/unified/addKeyAltName.json
rename to specifications/client-side-encryption/tests/unified/addKeyAltName.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/unified/addKeyAltName.yml b/specifications/client-side-encryption/tests/unified/addKeyAltName.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/unified/addKeyAltName.yml
rename to specifications/client-side-encryption/tests/unified/addKeyAltName.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/unified/createDataKey-kms_providers-invalid.json b/specifications/client-side-encryption/tests/unified/createDataKey-kms_providers-invalid.json
similarity index 97%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/unified/createDataKey-kms_providers-invalid.json
rename to specifications/client-side-encryption/tests/unified/createDataKey-kms_providers-invalid.json
index 16cf6ca70dd..2344a61a95b 100644
--- a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/unified/createDataKey-kms_providers-invalid.json
+++ b/specifications/client-side-encryption/tests/unified/createDataKey-kms_providers-invalid.json
@@ -1,5 +1,5 @@
{
- "description": "createDataKey-provider-invalid",
+ "description": "createDataKey-kms_providers-invalid",
"schemaVersion": "1.8",
"runOnRequirements": [
{
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/unified/createDataKey-kms_providers-invalid.yml b/specifications/client-side-encryption/tests/unified/createDataKey-kms_providers-invalid.yml
similarity index 97%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/unified/createDataKey-kms_providers-invalid.yml
rename to specifications/client-side-encryption/tests/unified/createDataKey-kms_providers-invalid.yml
index 70e51acbdc7..f692a090752 100644
--- a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/unified/createDataKey-kms_providers-invalid.yml
+++ b/specifications/client-side-encryption/tests/unified/createDataKey-kms_providers-invalid.yml
@@ -1,4 +1,4 @@
-description: createDataKey-provider-invalid
+description: createDataKey-kms_providers-invalid
schemaVersion: "1.8"
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/unified/createDataKey.json b/specifications/client-side-encryption/tests/unified/createDataKey.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/unified/createDataKey.json
rename to specifications/client-side-encryption/tests/unified/createDataKey.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/unified/createDataKey.yml b/specifications/client-side-encryption/tests/unified/createDataKey.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/unified/createDataKey.yml
rename to specifications/client-side-encryption/tests/unified/createDataKey.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/unified/deleteKey.json b/specifications/client-side-encryption/tests/unified/deleteKey.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/unified/deleteKey.json
rename to specifications/client-side-encryption/tests/unified/deleteKey.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/unified/deleteKey.yml b/specifications/client-side-encryption/tests/unified/deleteKey.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/unified/deleteKey.yml
rename to specifications/client-side-encryption/tests/unified/deleteKey.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/unified/getKey.json b/specifications/client-side-encryption/tests/unified/getKey.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/unified/getKey.json
rename to specifications/client-side-encryption/tests/unified/getKey.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/unified/getKey.yml b/specifications/client-side-encryption/tests/unified/getKey.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/unified/getKey.yml
rename to specifications/client-side-encryption/tests/unified/getKey.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/unified/getKeyByAltName.json b/specifications/client-side-encryption/tests/unified/getKeyByAltName.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/unified/getKeyByAltName.json
rename to specifications/client-side-encryption/tests/unified/getKeyByAltName.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/unified/getKeyByAltName.yml b/specifications/client-side-encryption/tests/unified/getKeyByAltName.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/unified/getKeyByAltName.yml
rename to specifications/client-side-encryption/tests/unified/getKeyByAltName.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/unified/getKeys.json b/specifications/client-side-encryption/tests/unified/getKeys.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/unified/getKeys.json
rename to specifications/client-side-encryption/tests/unified/getKeys.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/unified/getKeys.yml b/specifications/client-side-encryption/tests/unified/getKeys.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/unified/getKeys.yml
rename to specifications/client-side-encryption/tests/unified/getKeys.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/unified/removeKeyAltName.json b/specifications/client-side-encryption/tests/unified/removeKeyAltName.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/unified/removeKeyAltName.json
rename to specifications/client-side-encryption/tests/unified/removeKeyAltName.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/unified/removeKeyAltName.yml b/specifications/client-side-encryption/tests/unified/removeKeyAltName.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/unified/removeKeyAltName.yml
rename to specifications/client-side-encryption/tests/unified/removeKeyAltName.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/unified/rewrapManyDataKey-decrypt_failure.json b/specifications/client-side-encryption/tests/unified/rewrapManyDataKey-decrypt_failure.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/unified/rewrapManyDataKey-decrypt_failure.json
rename to specifications/client-side-encryption/tests/unified/rewrapManyDataKey-decrypt_failure.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/unified/rewrapManyDataKey-decrypt_failure.yml b/specifications/client-side-encryption/tests/unified/rewrapManyDataKey-decrypt_failure.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/unified/rewrapManyDataKey-decrypt_failure.yml
rename to specifications/client-side-encryption/tests/unified/rewrapManyDataKey-decrypt_failure.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/unified/rewrapManyDataKey-encrypt_failure.json b/specifications/client-side-encryption/tests/unified/rewrapManyDataKey-encrypt_failure.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/unified/rewrapManyDataKey-encrypt_failure.json
rename to specifications/client-side-encryption/tests/unified/rewrapManyDataKey-encrypt_failure.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/unified/rewrapManyDataKey-encrypt_failure.yml b/specifications/client-side-encryption/tests/unified/rewrapManyDataKey-encrypt_failure.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/unified/rewrapManyDataKey-encrypt_failure.yml
rename to specifications/client-side-encryption/tests/unified/rewrapManyDataKey-encrypt_failure.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/unified/rewrapManyDataKey.json b/specifications/client-side-encryption/tests/unified/rewrapManyDataKey.json
similarity index 98%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/unified/rewrapManyDataKey.json
rename to specifications/client-side-encryption/tests/unified/rewrapManyDataKey.json
index 7e3abb12743..89860de0c07 100644
--- a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/unified/rewrapManyDataKey.json
+++ b/specifications/client-side-encryption/tests/unified/rewrapManyDataKey.json
@@ -1,5 +1,5 @@
{
- "description": "rewrapManyDataKey-kms_providers",
+ "description": "rewrapManyDataKey",
"schemaVersion": "1.8",
"runOnRequirements": [
{
@@ -128,7 +128,7 @@
],
"keyMaterial": {
"$binary": {
- "base64": "AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gEGkNTybTc7Eyif0f+qqE0lAAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDB2j78AeuIQxcRh8cQIBEIB7vj9buHEaT7XHFIsKBJiyzZRmNnjvqMK5LSdzonKdx97jlqauvPvTDXSsdQDcspUs5oLrGmAXpbFResscxmbwZoKgUtWiuIOpeAcYuszCiMKt15s1WIMLDXUhYtfCmhRhekvgHnRAaK4HJMlGE+lKJXYI84E0b86Cd/g+",
+ "base64": "pr01l7qDygUkFE/0peFwpnNlv3iIy8zrQK38Q9i12UCN2jwZHDmfyx8wokiIKMb9kAleeY+vnt3Cf1MKu9kcDmI+KxbNDd+V3ytAAGzOVLDJr77CiWjF9f8ntkXRHrAY9WwnVDANYkDwXlyU0Y2GQFTiW65jiQhUtYLYH63Tk48SsJuQvnWw1Q+PzY8ga+QeVec8wbcThwtm+r2IHsCFnc72Gv73qq7weISw+O4mN08z3wOp5FOS2ZM3MK7tBGmPdBcktW7F8ODGsOQ1FU53OrWUnyX2aTi2ftFFFMWVHqQo7EYuBZHru8RRODNKMyQk0BFfKovAeTAVRv9WH9QU7g==",
"subType": "00"
}
},
@@ -196,7 +196,7 @@
],
"keyMaterial": {
"$binary": {
- "base64": "VoI9J8HusQ3u2gT9i8Awgg/6W4/igvLwRzn3SRDGx0Dl/1ayDMubphOw0ONPVKfuvS6HL3e4gAoCJ/uEz2KLFTVsEqYCpMhfAhgXxm8Ena8vDcOkCzFX+euvN/N2ES3wpzAD18b3qIH0MbBwKJP82d5GQ4pVfGnPW8Ujp9aO1qC/s0EqNqYyzJ1SyzhV9lAjHHGIENYJx+bBrekg2EeZBA==",
+ "base64": "CklVctHzke4mcytd0TxGqvepkdkQN8NUF4+jV7aZQITAKdz6WjdDpq3lMt9nSzWGG2vAEfvRb3mFEVjV57qqGqxjq2751gmiMRHXz0btStbIK3mQ5xbY9kdye4tsixlCryEwQONr96gwlwKKI9Nubl9/8+uRF6tgYjje7Q7OjauEf1SrJwKcoQ3WwnjZmEqAug0kImCpJ/irhdqPzivRiA==",
"subType": "00"
}
},
diff --git a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/unified/rewrapManyDataKey.yml b/specifications/client-side-encryption/tests/unified/rewrapManyDataKey.yml
similarity index 96%
rename from tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/unified/rewrapManyDataKey.yml
rename to specifications/client-side-encryption/tests/unified/rewrapManyDataKey.yml
index 28009f54733..51415586838 100644
--- a/tests/MongoDB.Driver.Tests/Specifications/client-side-encryption/tests/unified/rewrapManyDataKey.yml
+++ b/specifications/client-side-encryption/tests/unified/rewrapManyDataKey.yml
@@ -2,7 +2,7 @@
# commands sort the resulting documents in ascending order by the single-element
# keyAltNames array to ensure alphabetic order by original KMS provider as
# defined in initialData.
-description: rewrapManyDataKey-kms_providers
+description: rewrapManyDataKey
schemaVersion: "1.8"
@@ -50,7 +50,7 @@ initialData:
region: us-east-1
- _id: &azure_key_id { $binary: { base64: YXp1cmVhenVyZWF6dXJlYQ==, subType: "04" } }
keyAltNames: ["azure_key"]
- keyMaterial: { $binary: { base64: AQICAHhQNmWG2CzOm1dq3kWLM+iDUZhEqnhJwH9wZVpuZ94A8gEGkNTybTc7Eyif0f+qqE0lAAAAwjCBvwYJKoZIhvcNAQcGoIGxMIGuAgEAMIGoBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDB2j78AeuIQxcRh8cQIBEIB7vj9buHEaT7XHFIsKBJiyzZRmNnjvqMK5LSdzonKdx97jlqauvPvTDXSsdQDcspUs5oLrGmAXpbFResscxmbwZoKgUtWiuIOpeAcYuszCiMKt15s1WIMLDXUhYtfCmhRhekvgHnRAaK4HJMlGE+lKJXYI84E0b86Cd/g+, subType: "00" } }
+ keyMaterial: { $binary: { base64: pr01l7qDygUkFE/0peFwpnNlv3iIy8zrQK38Q9i12UCN2jwZHDmfyx8wokiIKMb9kAleeY+vnt3Cf1MKu9kcDmI+KxbNDd+V3ytAAGzOVLDJr77CiWjF9f8ntkXRHrAY9WwnVDANYkDwXlyU0Y2GQFTiW65jiQhUtYLYH63Tk48SsJuQvnWw1Q+PzY8ga+QeVec8wbcThwtm+r2IHsCFnc72Gv73qq7weISw+O4mN08z3wOp5FOS2ZM3MK7tBGmPdBcktW7F8ODGsOQ1FU53OrWUnyX2aTi2ftFFFMWVHqQo7EYuBZHru8RRODNKMyQk0BFfKovAeTAVRv9WH9QU7g==, subType: "00" } }
creationDate: { $date: { $numberLong: "1641024000000" } }
updateDate: { $date: { $numberLong: "1641024000000" } }
status: 1
@@ -72,7 +72,7 @@ initialData:
keyName: key-name-csfle
- _id: &kmip_key_id { $binary: { base64: a21pcGttaXBrbWlwa21pcA==, subType: "04" } }
keyAltNames: ["kmip_key"]
- keyMaterial: { $binary: { base64: VoI9J8HusQ3u2gT9i8Awgg/6W4/igvLwRzn3SRDGx0Dl/1ayDMubphOw0ONPVKfuvS6HL3e4gAoCJ/uEz2KLFTVsEqYCpMhfAhgXxm8Ena8vDcOkCzFX+euvN/N2ES3wpzAD18b3qIH0MbBwKJP82d5GQ4pVfGnPW8Ujp9aO1qC/s0EqNqYyzJ1SyzhV9lAjHHGIENYJx+bBrekg2EeZBA==, subType: "00" } }
+ keyMaterial: { $binary: { base64: CklVctHzke4mcytd0TxGqvepkdkQN8NUF4+jV7aZQITAKdz6WjdDpq3lMt9nSzWGG2vAEfvRb3mFEVjV57qqGqxjq2751gmiMRHXz0btStbIK3mQ5xbY9kdye4tsixlCryEwQONr96gwlwKKI9Nubl9/8+uRF6tgYjje7Q7OjauEf1SrJwKcoQ3WwnjZmEqAug0kImCpJ/irhdqPzivRiA==, subType: "00" } }
creationDate: { $date: { $numberLong: "1641024000000" } }
updateDate: { $date: { $numberLong: "1641024000000" } }
status: 1
diff --git a/tests/MongoDB.Driver.Tests/Specifications/collection-management/tests/README.rst b/specifications/collection-management/tests/README.rst
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/collection-management/tests/README.rst
rename to specifications/collection-management/tests/README.rst
diff --git a/tests/MongoDB.Driver.Tests/Specifications/collection-management/tests/clustered-indexes.json b/specifications/collection-management/tests/clustered-indexes.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/collection-management/tests/clustered-indexes.json
rename to specifications/collection-management/tests/clustered-indexes.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/collection-management/tests/clustered-indexes.yml b/specifications/collection-management/tests/clustered-indexes.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/collection-management/tests/clustered-indexes.yml
rename to specifications/collection-management/tests/clustered-indexes.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/collection-management/tests/createCollection-pre_and_post_images.json b/specifications/collection-management/tests/createCollection-pre_and_post_images.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/collection-management/tests/createCollection-pre_and_post_images.json
rename to specifications/collection-management/tests/createCollection-pre_and_post_images.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/collection-management/tests/createCollection-pre_and_post_images.yml b/specifications/collection-management/tests/createCollection-pre_and_post_images.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/collection-management/tests/createCollection-pre_and_post_images.yml
rename to specifications/collection-management/tests/createCollection-pre_and_post_images.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/collection-management/tests/timeseries-collection.json b/specifications/collection-management/tests/timeseries-collection.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/collection-management/tests/timeseries-collection.json
rename to specifications/collection-management/tests/timeseries-collection.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/collection-management/tests/timeseries-collection.yml b/specifications/collection-management/tests/timeseries-collection.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/collection-management/tests/timeseries-collection.yml
rename to specifications/collection-management/tests/timeseries-collection.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/command-monitoring/tests/legacy/README.rst b/specifications/command-logging-and-monitoring/tests/legacy/README.rst
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/command-monitoring/tests/legacy/README.rst
rename to specifications/command-logging-and-monitoring/tests/legacy/README.rst
diff --git a/tests/MongoDB.Driver.Tests/Specifications/command-monitoring/tests/legacy/bulkWrite.json b/specifications/command-logging-and-monitoring/tests/legacy/bulkWrite.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/command-monitoring/tests/legacy/bulkWrite.json
rename to specifications/command-logging-and-monitoring/tests/legacy/bulkWrite.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/command-monitoring/tests/legacy/bulkWrite.yml b/specifications/command-logging-and-monitoring/tests/legacy/bulkWrite.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/command-monitoring/tests/legacy/bulkWrite.yml
rename to specifications/command-logging-and-monitoring/tests/legacy/bulkWrite.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/command-monitoring/tests/legacy/command.json b/specifications/command-logging-and-monitoring/tests/legacy/command.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/command-monitoring/tests/legacy/command.json
rename to specifications/command-logging-and-monitoring/tests/legacy/command.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/command-monitoring/tests/legacy/command.yml b/specifications/command-logging-and-monitoring/tests/legacy/command.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/command-monitoring/tests/legacy/command.yml
rename to specifications/command-logging-and-monitoring/tests/legacy/command.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/command-monitoring/tests/legacy/deleteMany.json b/specifications/command-logging-and-monitoring/tests/legacy/deleteMany.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/command-monitoring/tests/legacy/deleteMany.json
rename to specifications/command-logging-and-monitoring/tests/legacy/deleteMany.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/command-monitoring/tests/legacy/deleteMany.yml b/specifications/command-logging-and-monitoring/tests/legacy/deleteMany.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/command-monitoring/tests/legacy/deleteMany.yml
rename to specifications/command-logging-and-monitoring/tests/legacy/deleteMany.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/command-monitoring/tests/legacy/deleteOne.json b/specifications/command-logging-and-monitoring/tests/legacy/deleteOne.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/command-monitoring/tests/legacy/deleteOne.json
rename to specifications/command-logging-and-monitoring/tests/legacy/deleteOne.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/command-monitoring/tests/legacy/deleteOne.yml b/specifications/command-logging-and-monitoring/tests/legacy/deleteOne.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/command-monitoring/tests/legacy/deleteOne.yml
rename to specifications/command-logging-and-monitoring/tests/legacy/deleteOne.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/command-monitoring/tests/legacy/find.json b/specifications/command-logging-and-monitoring/tests/legacy/find.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/command-monitoring/tests/legacy/find.json
rename to specifications/command-logging-and-monitoring/tests/legacy/find.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/command-monitoring/tests/legacy/find.yml b/specifications/command-logging-and-monitoring/tests/legacy/find.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/command-monitoring/tests/legacy/find.yml
rename to specifications/command-logging-and-monitoring/tests/legacy/find.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/command-monitoring/tests/legacy/insertMany.json b/specifications/command-logging-and-monitoring/tests/legacy/insertMany.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/command-monitoring/tests/legacy/insertMany.json
rename to specifications/command-logging-and-monitoring/tests/legacy/insertMany.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/command-monitoring/tests/legacy/insertMany.yml b/specifications/command-logging-and-monitoring/tests/legacy/insertMany.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/command-monitoring/tests/legacy/insertMany.yml
rename to specifications/command-logging-and-monitoring/tests/legacy/insertMany.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/command-monitoring/tests/legacy/insertOne.json b/specifications/command-logging-and-monitoring/tests/legacy/insertOne.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/command-monitoring/tests/legacy/insertOne.json
rename to specifications/command-logging-and-monitoring/tests/legacy/insertOne.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/command-monitoring/tests/legacy/insertOne.yml b/specifications/command-logging-and-monitoring/tests/legacy/insertOne.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/command-monitoring/tests/legacy/insertOne.yml
rename to specifications/command-logging-and-monitoring/tests/legacy/insertOne.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/command-monitoring/tests/legacy/unacknowledgedBulkWrite.json b/specifications/command-logging-and-monitoring/tests/legacy/unacknowledgedBulkWrite.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/command-monitoring/tests/legacy/unacknowledgedBulkWrite.json
rename to specifications/command-logging-and-monitoring/tests/legacy/unacknowledgedBulkWrite.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/command-monitoring/tests/legacy/unacknowledgedBulkWrite.yml b/specifications/command-logging-and-monitoring/tests/legacy/unacknowledgedBulkWrite.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/command-monitoring/tests/legacy/unacknowledgedBulkWrite.yml
rename to specifications/command-logging-and-monitoring/tests/legacy/unacknowledgedBulkWrite.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/command-monitoring/tests/legacy/updateMany.json b/specifications/command-logging-and-monitoring/tests/legacy/updateMany.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/command-monitoring/tests/legacy/updateMany.json
rename to specifications/command-logging-and-monitoring/tests/legacy/updateMany.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/command-monitoring/tests/legacy/updateMany.yml b/specifications/command-logging-and-monitoring/tests/legacy/updateMany.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/command-monitoring/tests/legacy/updateMany.yml
rename to specifications/command-logging-and-monitoring/tests/legacy/updateMany.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/command-monitoring/tests/legacy/updateOne.json b/specifications/command-logging-and-monitoring/tests/legacy/updateOne.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/command-monitoring/tests/legacy/updateOne.json
rename to specifications/command-logging-and-monitoring/tests/legacy/updateOne.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/command-monitoring/tests/legacy/updateOne.yml b/specifications/command-logging-and-monitoring/tests/legacy/updateOne.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/command-monitoring/tests/legacy/updateOne.yml
rename to specifications/command-logging-and-monitoring/tests/legacy/updateOne.yml
diff --git a/specifications/command-logging-and-monitoring/tests/logging/command.json b/specifications/command-logging-and-monitoring/tests/logging/command.json
new file mode 100644
index 00000000000..3d5c2570be2
--- /dev/null
+++ b/specifications/command-logging-and-monitoring/tests/logging/command.json
@@ -0,0 +1,213 @@
+{
+ "description": "command-logging",
+ "schemaVersion": "1.13",
+ "createEntities": [
+ {
+ "client": {
+ "id": "client",
+ "observeLogMessages": {
+ "command": "debug"
+ }
+ }
+ },
+ {
+ "database": {
+ "id": "database",
+ "client": "client",
+ "databaseName": "logging-tests"
+ }
+ },
+ {
+ "collection": {
+ "id": "collection",
+ "database": "database",
+ "collectionName": "logging-tests-collection"
+ }
+ }
+ ],
+ "initialData": [
+ {
+ "collectionName": "logging-tests-collection",
+ "databaseName": "logging-tests",
+ "documents": [
+ {
+ "_id": 1,
+ "x": 11
+ }
+ ]
+ }
+ ],
+ "tests": [
+ {
+ "description": "A successful command",
+ "operations": [
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "command": {
+ "ping": 1
+ },
+ "commandName": "ping"
+ }
+ }
+ ],
+ "expectLogMessages": [
+ {
+ "client": "client",
+ "messages": [
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command started",
+ "databaseName": "logging-tests",
+ "commandName": "ping",
+ "command": {
+ "$$matchAsDocument": {
+ "$$matchAsRoot": {
+ "ping": 1,
+ "$db": "logging-tests"
+ }
+ }
+ },
+ "requestId": {
+ "$$type": [
+ "int",
+ "long"
+ ]
+ },
+ "serverHost": {
+ "$$type": "string"
+ },
+ "serverPort": {
+ "$$type": [
+ "int",
+ "long"
+ ]
+ }
+ }
+ },
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command succeeded",
+ "commandName": "ping",
+ "reply": {
+ "$$type": "string"
+ },
+ "requestId": {
+ "$$type": [
+ "int",
+ "long"
+ ]
+ },
+ "serverHost": {
+ "$$type": "string"
+ },
+ "serverPort": {
+ "$$type": [
+ "int",
+ "long"
+ ]
+ },
+ "durationMS": {
+ "$$type": [
+ "double",
+ "int",
+ "long"
+ ]
+ }
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "A failed command",
+ "operations": [
+ {
+ "name": "find",
+ "object": "collection",
+ "arguments": {
+ "filter": {
+ "$or": true
+ }
+ },
+ "expectError": {
+ "isClientError": false
+ }
+ }
+ ],
+ "expectLogMessages": [
+ {
+ "client": "client",
+ "messages": [
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command started",
+ "databaseName": "logging-tests",
+ "commandName": "find",
+ "command": {
+ "$$type": "string"
+ },
+ "requestId": {
+ "$$type": [
+ "int",
+ "long"
+ ]
+ },
+ "serverHost": {
+ "$$type": "string"
+ },
+ "serverPort": {
+ "$$type": [
+ "int",
+ "long"
+ ]
+ }
+ }
+ },
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command failed",
+ "commandName": "find",
+ "failure": {
+ "$$exists": true
+ },
+ "requestId": {
+ "$$type": [
+ "int",
+ "long"
+ ]
+ },
+ "serverHost": {
+ "$$type": "string"
+ },
+ "serverPort": {
+ "$$type": [
+ "int",
+ "long"
+ ]
+ },
+ "durationMS": {
+ "$$type": [
+ "double",
+ "int",
+ "long"
+ ]
+ }
+ }
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/specifications/command-logging-and-monitoring/tests/logging/command.yml b/specifications/command-logging-and-monitoring/tests/logging/command.yml
new file mode 100644
index 00000000000..b21a4c60905
--- /dev/null
+++ b/specifications/command-logging-and-monitoring/tests/logging/command.yml
@@ -0,0 +1,94 @@
+description: "command-logging"
+
+schemaVersion: "1.13"
+
+createEntities:
+ - client:
+ id: &client client
+ observeLogMessages:
+ command: debug
+ - database:
+ id: &database database
+ client: *client
+ databaseName: &databaseName logging-tests
+ - collection:
+ id: &collection collection
+ database: *database
+ collectionName: &collectionName logging-tests-collection
+
+initialData:
+ - collectionName: *collectionName
+ databaseName: *databaseName
+ documents:
+ - { _id: 1, x: 11 }
+
+tests:
+ - description: "A successful command"
+ operations:
+ - name: runCommand
+ object: *database
+ arguments:
+ command: { ping: 1 }
+ commandName: &commandName ping
+ expectLogMessages:
+ - client: *client
+ messages:
+ - level: debug
+ component: command
+ data:
+ message: "Command started"
+ databaseName: *databaseName
+ commandName: *commandName
+ command:
+ $$matchAsDocument:
+ $$matchAsRoot:
+ ping: 1
+ $db: *databaseName
+ requestId: { $$type: [int, long] }
+ serverHost: { $$type: string }
+ serverPort: { $$type: [int, long] }
+
+ - level: debug
+ component: command
+ data:
+ message: "Command succeeded"
+ commandName: *commandName
+ reply: { $$type: string }
+ requestId: { $$type: [int, long] }
+ serverHost: { $$type: string }
+ serverPort: { $$type: [int, long] }
+ durationMS: { $$type: [double, int, long] }
+
+ - description: "A failed command"
+ operations:
+ - name: &commandName find
+ object: *collection
+ arguments:
+ filter: { $or: true }
+ expectError:
+ isClientError: false
+ expectLogMessages:
+ - client: *client
+ messages:
+ - level: debug
+ component: command
+ data:
+ message: "Command started"
+ databaseName: *databaseName
+ commandName: *commandName
+ command: { $$type: string }
+ requestId: { $$type: [int, long] }
+ serverHost: { $$type: string }
+ serverPort: { $$type: [int, long] }
+
+ - level: debug
+ component: command
+ data:
+ message: "Command failed"
+ commandName: *commandName
+ failure: { $$exists: true }
+ requestId: { $$type: [int, long] }
+ serverHost: { $$type: string }
+ serverPort: { $$type: [int, long] }
+ durationMS: { $$type: [double, int, long] }
+
diff --git a/specifications/command-logging-and-monitoring/tests/logging/driver-connection-id.json b/specifications/command-logging-and-monitoring/tests/logging/driver-connection-id.json
new file mode 100644
index 00000000000..40db98d6fae
--- /dev/null
+++ b/specifications/command-logging-and-monitoring/tests/logging/driver-connection-id.json
@@ -0,0 +1,146 @@
+{
+ "description": "driver-connection-id",
+ "schemaVersion": "1.13",
+ "createEntities": [
+ {
+ "client": {
+ "id": "client",
+ "observeLogMessages": {
+ "command": "debug"
+ }
+ }
+ },
+ {
+ "database": {
+ "id": "database",
+ "client": "client",
+ "databaseName": "logging-tests"
+ }
+ },
+ {
+ "collection": {
+ "id": "collection",
+ "database": "database",
+ "collectionName": "logging-tests-collection"
+ }
+ }
+ ],
+ "initialData": [
+ {
+ "collectionName": "logging-tests-collection",
+ "databaseName": "logging-tests",
+ "documents": [
+ {
+ "_id": 1,
+ "x": 11
+ }
+ ]
+ }
+ ],
+ "tests": [
+ {
+ "description": "A successful command",
+ "operations": [
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "command": {
+ "ping": 1
+ },
+ "commandName": "ping"
+ }
+ }
+ ],
+ "expectLogMessages": [
+ {
+ "client": "client",
+ "messages": [
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command started",
+ "databaseName": "logging-tests",
+ "commandName": "ping",
+ "driverConnectionId": {
+ "$$type": [
+ "int",
+ "long"
+ ]
+ }
+ }
+ },
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command succeeded",
+ "commandName": "ping",
+ "driverConnectionId": {
+ "$$type": [
+ "int",
+ "long"
+ ]
+ }
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "A failed command",
+ "operations": [
+ {
+ "name": "find",
+ "object": "collection",
+ "arguments": {
+ "filter": {
+ "$or": true
+ }
+ },
+ "expectError": {
+ "isClientError": false
+ }
+ }
+ ],
+ "expectLogMessages": [
+ {
+ "client": "client",
+ "messages": [
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command started",
+ "databaseName": "logging-tests",
+ "commandName": "find",
+ "driverConnectionId": {
+ "$$type": [
+ "int",
+ "long"
+ ]
+ }
+ }
+ },
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command failed",
+ "commandName": "find",
+ "driverConnectionId": {
+ "$$type": [
+ "int",
+ "long"
+ ]
+ }
+ }
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/specifications/command-logging-and-monitoring/tests/logging/driver-connection-id.yml b/specifications/command-logging-and-monitoring/tests/logging/driver-connection-id.yml
new file mode 100644
index 00000000000..f299edabaf2
--- /dev/null
+++ b/specifications/command-logging-and-monitoring/tests/logging/driver-connection-id.yml
@@ -0,0 +1,76 @@
+# This is a separate test so that drivers that do not implement CMAP can easily skip it.
+description: "driver-connection-id"
+
+schemaVersion: "1.13"
+
+createEntities:
+ - client:
+ id: &client client
+ observeLogMessages:
+ command: debug
+ - database:
+ id: &database database
+ client: *client
+ databaseName: &databaseName logging-tests
+ - collection:
+ id: &collection collection
+ database: *database
+ collectionName: &collectionName logging-tests-collection
+
+initialData:
+ - collectionName: *collectionName
+ databaseName: *databaseName
+ documents:
+ - { _id: 1, x: 11 }
+
+tests:
+ - description: "A successful command"
+ operations:
+ - name: runCommand
+ object: *database
+ arguments:
+ command: { ping: 1 }
+ commandName: &commandName ping
+ expectLogMessages:
+ - client: *client
+ messages:
+ - level: debug
+ component: command
+ data:
+ message: "Command started"
+ databaseName: *databaseName
+ commandName: *commandName
+ driverConnectionId: { $$type: [int, long] }
+
+ - level: debug
+ component: command
+ data:
+ message: "Command succeeded"
+ commandName: *commandName
+ driverConnectionId: { $$type: [int, long] }
+
+ - description: "A failed command"
+ operations:
+ - name: &commandName find
+ object: *collection
+ arguments:
+ filter: { $or: true }
+ expectError:
+ isClientError: false
+ expectLogMessages:
+ - client: *client
+ messages:
+ - level: debug
+ component: command
+ data:
+ message: "Command started"
+ databaseName: *databaseName
+ commandName: *commandName
+ driverConnectionId: { $$type: [int, long] }
+
+ - level: debug
+ component: command
+ data:
+ message: "Command failed"
+ commandName: *commandName
+ driverConnectionId: { $$type: [int, long] }
diff --git a/specifications/command-logging-and-monitoring/tests/logging/no-handshake-messages.json b/specifications/command-logging-and-monitoring/tests/logging/no-handshake-messages.json
new file mode 100644
index 00000000000..a61e208798c
--- /dev/null
+++ b/specifications/command-logging-and-monitoring/tests/logging/no-handshake-messages.json
@@ -0,0 +1,94 @@
+{
+ "description": "no-handshake-command-logs",
+ "schemaVersion": "1.13",
+ "tests": [
+ {
+ "description": "Handshake commands should not generate log messages",
+ "operations": [
+ {
+ "name": "createEntities",
+ "object": "testRunner",
+ "arguments": {
+ "entities": [
+ {
+ "client": {
+ "id": "client",
+ "observeLogMessages": {
+ "command": "debug"
+ },
+ "observeEvents": [
+ "connectionCreatedEvent",
+ "connectionReadyEvent"
+ ]
+ }
+ },
+ {
+ "database": {
+ "id": "database",
+ "client": "client",
+ "databaseName": "logging-tests"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "command": {
+ "ping": 1
+ },
+ "commandName": "ping"
+ }
+ },
+ {
+ "name": "waitForEvent",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client",
+ "event": {
+ "connectionCreatedEvent": {}
+ },
+ "count": 1
+ }
+ },
+ {
+ "name": "waitForEvent",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client",
+ "event": {
+ "connectionReadyEvent": {}
+ },
+ "count": 1
+ }
+ }
+ ],
+ "expectLogMessages": [
+ {
+ "client": "client",
+ "messages": [
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command started",
+ "databaseName": "logging-tests",
+ "commandName": "ping"
+ }
+ },
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command succeeded",
+ "commandName": "ping"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/specifications/command-logging-and-monitoring/tests/logging/no-handshake-messages.yml b/specifications/command-logging-and-monitoring/tests/logging/no-handshake-messages.yml
new file mode 100644
index 00000000000..bb7dd18e09a
--- /dev/null
+++ b/specifications/command-logging-and-monitoring/tests/logging/no-handshake-messages.yml
@@ -0,0 +1,58 @@
+description: "no-handshake-command-logs"
+
+schemaVersion: "1.13"
+
+tests:
+ - description: "Handshake commands should not generate log messages"
+ operations:
+ - name: createEntities
+ object: testRunner
+ arguments:
+ entities:
+ - client:
+ id: &client client
+ observeLogMessages:
+ command: debug
+ observeEvents:
+ - connectionCreatedEvent
+ - connectionReadyEvent
+ - database:
+ id: &database database
+ client: *client
+ databaseName: &databaseName logging-tests
+ - name: runCommand
+ object: *database
+ arguments:
+ command: { ping: 1 }
+ commandName: &commandName ping
+ - name: waitForEvent
+ object: testRunner
+ arguments:
+ client: *client
+ event:
+ connectionCreatedEvent: {}
+ count: 1
+ - name: waitForEvent
+ object: testRunner
+ arguments:
+ client: *client
+ event:
+ connectionReadyEvent: {}
+ count: 1
+ expectLogMessages:
+ # since the ping happens after the handshake, seeing events for only the ping
+ # implies the driver did not emit any log messages for the handshake.
+ - client: *client
+ messages:
+ - level: debug
+ component: command
+ data:
+ message: "Command started"
+ databaseName: *databaseName
+ commandName: *commandName
+
+ - level: debug
+ component: command
+ data:
+ message: "Command succeeded"
+ commandName: *commandName
diff --git a/specifications/command-logging-and-monitoring/tests/logging/no-heartbeat-messages.json b/specifications/command-logging-and-monitoring/tests/logging/no-heartbeat-messages.json
new file mode 100644
index 00000000000..525be9171df
--- /dev/null
+++ b/specifications/command-logging-and-monitoring/tests/logging/no-heartbeat-messages.json
@@ -0,0 +1,91 @@
+{
+ "description": "no-heartbeat-command-logs",
+ "schemaVersion": "1.13",
+ "runOnRequirements": [
+ {
+ "topologies": [
+ "single",
+ "replicaset",
+ "sharded"
+ ]
+ }
+ ],
+ "tests": [
+ {
+ "description": "Heartbeat commands should not generate log messages",
+ "operations": [
+ {
+ "name": "createEntities",
+ "object": "testRunner",
+ "arguments": {
+ "entities": [
+ {
+ "client": {
+ "id": "client",
+ "observeLogMessages": {
+ "command": "debug"
+ },
+ "observeEvents": [
+ "serverDescriptionChangedEvent"
+ ]
+ }
+ },
+ {
+ "database": {
+ "id": "database",
+ "client": "client",
+ "databaseName": "logging-tests"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "name": "waitForEvent",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client",
+ "event": {
+ "serverDescriptionChangedEvent": {}
+ },
+ "count": 1
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "command": {
+ "ping": 1
+ },
+ "commandName": "ping"
+ }
+ }
+ ],
+ "expectLogMessages": [
+ {
+ "client": "client",
+ "messages": [
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command started",
+ "databaseName": "logging-tests",
+ "commandName": "ping"
+ }
+ },
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command succeeded",
+ "commandName": "ping"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/specifications/command-logging-and-monitoring/tests/logging/no-heartbeat-messages.yml b/specifications/command-logging-and-monitoring/tests/logging/no-heartbeat-messages.yml
new file mode 100644
index 00000000000..7d35fbe003a
--- /dev/null
+++ b/specifications/command-logging-and-monitoring/tests/logging/no-heartbeat-messages.yml
@@ -0,0 +1,58 @@
+description: "no-heartbeat-command-logs"
+
+schemaVersion: "1.13"
+
+# no heartbeats in load balanced mode.
+runOnRequirements:
+ - topologies:
+ - single
+ - replicaset
+ - sharded
+
+tests:
+ - description: "Heartbeat commands should not generate log messages"
+ operations:
+ - name: createEntities
+ object: testRunner
+ arguments:
+ entities:
+ - client:
+ id: &client client
+ observeLogMessages:
+ command: debug
+ observeEvents:
+ - serverDescriptionChangedEvent
+ - database:
+ id: &database database
+ client: *client
+ databaseName: &databaseName logging-tests
+ - name: waitForEvent
+ object: testRunner
+ arguments:
+ client: *client
+ event:
+ # a server description change implies that a heartbeat has happened.
+ serverDescriptionChangedEvent: {}
+ count: 1
+ - name: runCommand
+ object: *database
+ arguments:
+ command: { ping: 1 }
+ commandName: &commandName ping
+ expectLogMessages:
+ # since the ping happens after the heartbeat, seeing events for only the ping
+ # implies the driver did not emit a log message for the heartbeat.
+ - client: *client
+ messages:
+ - level: debug
+ component: command
+ data:
+ message: "Command started"
+ databaseName: *databaseName
+ commandName: *commandName
+
+ - level: debug
+ component: command
+ data:
+ message: "Command succeeded"
+ commandName: *commandName
diff --git a/specifications/command-logging-and-monitoring/tests/logging/operation-id.json b/specifications/command-logging-and-monitoring/tests/logging/operation-id.json
new file mode 100644
index 00000000000..b1a3cec3d91
--- /dev/null
+++ b/specifications/command-logging-and-monitoring/tests/logging/operation-id.json
@@ -0,0 +1,198 @@
+{
+ "description": "operation-id",
+ "schemaVersion": "1.13",
+ "createEntities": [
+ {
+ "client": {
+ "id": "client",
+ "observeLogMessages": {
+ "command": "debug"
+ }
+ }
+ },
+ {
+ "database": {
+ "id": "database",
+ "client": "client",
+ "databaseName": "logging-tests"
+ }
+ },
+ {
+ "collection": {
+ "id": "collection",
+ "database": "database",
+ "collectionName": "logging-tests-collection"
+ }
+ }
+ ],
+ "initialData": [
+ {
+ "collectionName": "logging-tests-collection",
+ "databaseName": "logging-tests",
+ "documents": [
+ {
+ "_id": 1,
+ "x": 11
+ }
+ ]
+ }
+ ],
+ "tests": [
+ {
+ "description": "Successful bulk write command log messages include operationIds",
+ "operations": [
+ {
+ "name": "bulkWrite",
+ "object": "collection",
+ "arguments": {
+ "requests": [
+ {
+ "insertOne": {
+ "document": {
+ "x": 1
+ }
+ }
+ },
+ {
+ "deleteOne": {
+ "filter": {
+ "x": 1
+ }
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "expectLogMessages": [
+ {
+ "client": "client",
+ "messages": [
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command started",
+ "databaseName": "logging-tests",
+ "commandName": "insert",
+ "operationId": {
+ "$$type": [
+ "int",
+ "long"
+ ]
+ }
+ }
+ },
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command succeeded",
+ "commandName": "insert",
+ "operationId": {
+ "$$type": [
+ "int",
+ "long"
+ ]
+ }
+ }
+ },
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command started",
+ "databaseName": "logging-tests",
+ "commandName": "delete",
+ "operationId": {
+ "$$type": [
+ "int",
+ "long"
+ ]
+ }
+ }
+ },
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command succeeded",
+ "commandName": "delete",
+ "operationId": {
+ "$$type": [
+ "int",
+ "long"
+ ]
+ }
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Failed bulk write command log message includes operationId",
+ "operations": [
+ {
+ "name": "bulkWrite",
+ "object": "collection",
+ "arguments": {
+ "requests": [
+ {
+ "updateOne": {
+ "filter": {
+ "x": 1
+ },
+ "update": [
+ {
+ "$invalidOperator": true
+ }
+ ]
+ }
+ }
+ ]
+ },
+ "expectError": {
+ "isClientError": false
+ }
+ }
+ ],
+ "expectLogMessages": [
+ {
+ "client": "client",
+ "messages": [
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command started",
+ "databaseName": "logging-tests",
+ "commandName": "update",
+ "operationId": {
+ "$$type": [
+ "int",
+ "long"
+ ]
+ }
+ }
+ },
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command failed",
+ "commandName": "update",
+ "operationId": {
+ "$$type": [
+ "int",
+ "long"
+ ]
+ }
+ }
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/specifications/command-logging-and-monitoring/tests/logging/operation-id.yml b/specifications/command-logging-and-monitoring/tests/logging/operation-id.yml
new file mode 100644
index 00000000000..f763e03b14e
--- /dev/null
+++ b/specifications/command-logging-and-monitoring/tests/logging/operation-id.yml
@@ -0,0 +1,99 @@
+# This test only applies to drivers that generate operationIds to enable users to link
+# together bulk writes.
+description: "operation-id"
+
+schemaVersion: "1.13"
+
+createEntities:
+ - client:
+ id: &client client
+ observeLogMessages:
+ command: debug
+ - database:
+ id: &database database
+ client: *client
+ databaseName: &databaseName logging-tests
+ - collection:
+ id: &collection collection
+ database: *database
+ collectionName: &collectionName logging-tests-collection
+
+initialData:
+ - collectionName: *collectionName
+ databaseName: *databaseName
+ documents:
+ - { _id: 1, x: 11 }
+
+tests:
+ - description: "Successful bulk write command log messages include operationIds"
+ operations:
+ - name: bulkWrite
+ object: *collection
+ arguments:
+ requests:
+ - insertOne:
+ document: { x: 1 }
+ - deleteOne:
+ filter: { x: 1 }
+
+ expectLogMessages:
+ - client: *client
+ messages:
+ - level: debug
+ component: command
+ data:
+ message: "Command started"
+ databaseName: *databaseName
+ commandName: insert
+ operationId: { $$type: [int, long] }
+
+ - level: debug
+ component: command
+ data:
+ message: "Command succeeded"
+ commandName: insert
+ operationId: { $$type: [int, long] }
+
+ - level: debug
+ component: command
+ data:
+ message: "Command started"
+ databaseName: *databaseName
+ commandName: delete
+ operationId: { $$type: [int, long] }
+
+ - level: debug
+ component: command
+ data:
+ message: "Command succeeded"
+ commandName: delete
+ operationId: { $$type: [int, long] }
+
+ - description: "Failed bulk write command log message includes operationId"
+ operations:
+ - name: bulkWrite
+ object: *collection
+ arguments:
+ requests:
+ - updateOne:
+ filter: { x: 1 }
+ update: [{ $invalidOperator: true }]
+ expectError:
+ isClientError: false
+
+ expectLogMessages:
+ - client: *client
+ messages:
+ - level: debug
+ component: command
+ data:
+ message: "Command started"
+ databaseName: *databaseName
+ commandName: update
+ operationId: { $$type: [int, long] }
+ - level: debug
+ component: command
+ data:
+ message: "Command failed"
+ commandName: update
+ operationId: { $$type: [int, long] }
diff --git a/specifications/command-logging-and-monitoring/tests/logging/pre-42-server-connection-id.json b/specifications/command-logging-and-monitoring/tests/logging/pre-42-server-connection-id.json
new file mode 100644
index 00000000000..d5ebd865906
--- /dev/null
+++ b/specifications/command-logging-and-monitoring/tests/logging/pre-42-server-connection-id.json
@@ -0,0 +1,119 @@
+{
+ "description": "pre-42-server-connection-id",
+ "schemaVersion": "1.13",
+ "runOnRequirements": [
+ {
+ "maxServerVersion": "4.0.99"
+ }
+ ],
+ "createEntities": [
+ {
+ "client": {
+ "id": "client",
+ "observeLogMessages": {
+ "command": "debug"
+ }
+ }
+ },
+ {
+ "database": {
+ "id": "database",
+ "client": "client",
+ "databaseName": "logging-server-connection-id-tests"
+ }
+ },
+ {
+ "collection": {
+ "id": "collection",
+ "database": "database",
+ "collectionName": "logging-tests-collection"
+ }
+ }
+ ],
+ "initialData": [
+ {
+ "databaseName": "logging-server-connection-id-tests",
+ "collectionName": "logging-tests-collection",
+ "documents": []
+ }
+ ],
+ "tests": [
+ {
+ "description": "command log messages do not include server connection id",
+ "operations": [
+ {
+ "name": "insertOne",
+ "object": "collection",
+ "arguments": {
+ "document": {
+ "x": 1
+ }
+ }
+ },
+ {
+ "name": "find",
+ "object": "collection",
+ "arguments": {
+ "filter": {
+ "$or": true
+ }
+ },
+ "expectError": {
+ "isError": true
+ }
+ }
+ ],
+ "expectLogMessages": [
+ {
+ "client": "client",
+ "messages": [
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command started",
+ "commandName": "insert",
+ "serverConnectionId": {
+ "$$exists": false
+ }
+ }
+ },
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command succeeded",
+ "commandName": "insert",
+ "serverConnectionId": {
+ "$$exists": false
+ }
+ }
+ },
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command started",
+ "commandName": "find",
+ "serverConnectionId": {
+ "$$exists": false
+ }
+ }
+ },
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command failed",
+ "commandName": "find",
+ "serverConnectionId": {
+ "$$exists": false
+ }
+ }
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/specifications/command-logging-and-monitoring/tests/logging/pre-42-server-connection-id.yml b/specifications/command-logging-and-monitoring/tests/logging/pre-42-server-connection-id.yml
new file mode 100644
index 00000000000..7dc80eea070
--- /dev/null
+++ b/specifications/command-logging-and-monitoring/tests/logging/pre-42-server-connection-id.yml
@@ -0,0 +1,66 @@
+description: "pre-42-server-connection-id"
+
+schemaVersion: "1.13"
+
+runOnRequirements:
+ - maxServerVersion: "4.0.99"
+
+createEntities:
+ - client:
+ id: &client client
+ observeLogMessages:
+ command: debug
+ - database:
+ id: &database database
+ client: *client
+ databaseName: &databaseName logging-server-connection-id-tests
+ - collection:
+ id: &collection collection
+ database: *database
+ collectionName: &collectionName logging-tests-collection
+
+initialData:
+ - databaseName: *databaseName
+ collectionName: *collectionName
+ documents: []
+
+tests:
+ - description: "command log messages do not include server connection id"
+ operations:
+ - name: insertOne
+ object: *collection
+ arguments:
+ document: { x: 1 }
+ - name: find
+ object: *collection
+ arguments:
+ filter: { $or: true }
+ expectError:
+ isError: true
+ expectLogMessages:
+ - client: *client
+ messages:
+ - level: debug
+ component: command
+ data:
+ message: "Command started"
+ commandName: insert
+ serverConnectionId: { $$exists: false }
+ - level: debug
+ component: command
+ data:
+ message: "Command succeeded"
+ commandName: insert
+ serverConnectionId: { $$exists: false }
+ - level: debug
+ component: command
+ data:
+ message: "Command started"
+ commandName: find
+ serverConnectionId: { $$exists: false }
+ - level: debug
+ component: command
+ data:
+ message: "Command failed"
+ commandName: find
+ serverConnectionId: { $$exists: false }
diff --git a/specifications/command-logging-and-monitoring/tests/logging/redacted-commands.json b/specifications/command-logging-and-monitoring/tests/logging/redacted-commands.json
new file mode 100644
index 00000000000..43b9ff74f29
--- /dev/null
+++ b/specifications/command-logging-and-monitoring/tests/logging/redacted-commands.json
@@ -0,0 +1,1438 @@
+{
+ "description": "redacted-commands",
+ "schemaVersion": "1.13",
+ "runOnRequirements": [
+ {
+ "minServerVersion": "5.0",
+ "auth": false
+ }
+ ],
+ "createEntities": [
+ {
+ "client": {
+ "id": "client",
+ "useMultipleMongoses": false,
+ "observeLogMessages": {
+ "command": "debug"
+ }
+ }
+ },
+ {
+ "client": {
+ "id": "failPointClient",
+ "useMultipleMongoses": false
+ }
+ },
+ {
+ "database": {
+ "id": "database",
+ "client": "client",
+ "databaseName": "logging-redaction-tests"
+ }
+ }
+ ],
+ "tests": [
+ {
+ "description": "authenticate command and resulting server-generated error are redacted",
+ "operations": [
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "authenticate",
+ "command": {
+ "authenticate": 1,
+ "mechanism": "MONGODB-X509",
+ "user": "CN=myName,OU=myOrgUnit,O=myOrg,L=myLocality,ST=myState,C=myCountry",
+ "db": "$external"
+ }
+ },
+ "expectError": {
+ "isClientError": false
+ }
+ }
+ ],
+ "expectLogMessages": [
+ {
+ "client": "client",
+ "messages": [
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command started",
+ "databaseName": "logging-redaction-tests",
+ "commandName": "authenticate",
+ "command": {
+ "$$matchAsDocument": {}
+ }
+ }
+ },
+ {
+ "level": "debug",
+ "component": "command",
+ "failureIsRedacted": true,
+ "data": {
+ "message": "Command failed",
+ "commandName": "authenticate",
+ "failure": {
+ "$$exists": true
+ }
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "network error in response to authenticate is not redacted",
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "failPointClient",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 1
+ },
+ "data": {
+ "failCommands": [
+ "authenticate"
+ ],
+ "closeConnection": true
+ }
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "authenticate",
+ "command": {
+ "authenticate": 1,
+ "mechanism": "MONGODB-X509",
+ "user": "CN=myName,OU=myOrgUnit,O=myOrg,L=myLocality,ST=myState,C=myCountry"
+ }
+ },
+ "expectError": {
+ "isClientError": true
+ }
+ }
+ ],
+ "expectLogMessages": [
+ {
+ "client": "client",
+ "messages": [
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command started",
+ "databaseName": "logging-redaction-tests",
+ "commandName": "authenticate",
+ "command": {
+ "$$matchAsDocument": {}
+ }
+ }
+ },
+ {
+ "level": "debug",
+ "component": "command",
+ "failureIsRedacted": false,
+ "data": {
+ "message": "Command failed",
+ "commandName": "authenticate",
+ "failure": {
+ "$$exists": true
+ }
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "saslStart command and resulting server-generated error are redacted",
+ "operations": [
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "saslStart",
+ "command": {
+ "saslStart": 1,
+ "payload": "definitely-invalid-payload",
+ "db": "admin"
+ }
+ },
+ "expectError": {
+ "isClientError": false
+ }
+ }
+ ],
+ "expectLogMessages": [
+ {
+ "client": "client",
+ "messages": [
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command started",
+ "databaseName": "logging-redaction-tests",
+ "commandName": "saslStart",
+ "command": {
+ "$$matchAsDocument": {}
+ }
+ }
+ },
+ {
+ "level": "debug",
+ "component": "command",
+ "failureIsRedacted": true,
+ "data": {
+ "message": "Command failed",
+ "commandName": "saslStart",
+ "failure": {
+ "$$exists": true
+ }
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "network error in response to saslStart is not redacted",
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "failPointClient",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 1
+ },
+ "data": {
+ "failCommands": [
+ "saslStart"
+ ],
+ "closeConnection": true
+ }
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "saslStart",
+ "command": {
+ "saslStart": 1,
+ "payload": "ZmFrZXNhc2xwYXlsb2Fk",
+ "mechanism": "MONGODB-X509"
+ }
+ },
+ "expectError": {
+ "isClientError": true
+ }
+ }
+ ],
+ "expectLogMessages": [
+ {
+ "client": "client",
+ "messages": [
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command started",
+ "databaseName": "logging-redaction-tests",
+ "commandName": "saslStart",
+ "command": {
+ "$$matchAsDocument": {}
+ }
+ }
+ },
+ {
+ "level": "debug",
+ "component": "command",
+ "failureIsRedacted": false,
+ "data": {
+ "message": "Command failed",
+ "commandName": "saslStart",
+ "failure": {
+ "$$exists": true
+ }
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "saslContinue command and resulting server-generated error are redacted",
+ "operations": [
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "saslContinue",
+ "command": {
+ "saslContinue": 1,
+ "conversationId": 0,
+ "payload": "definitely-invalid-payload"
+ }
+ },
+ "expectError": {
+ "isClientError": false
+ }
+ }
+ ],
+ "expectLogMessages": [
+ {
+ "client": "client",
+ "messages": [
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command started",
+ "databaseName": "logging-redaction-tests",
+ "commandName": "saslContinue",
+ "command": {
+ "$$matchAsDocument": {}
+ }
+ }
+ },
+ {
+ "level": "debug",
+ "component": "command",
+ "failureIsRedacted": true,
+ "data": {
+ "message": "Command failed",
+ "commandName": "saslContinue",
+ "failure": {
+ "$$exists": true
+ }
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "network error in response to saslContinue is not redacted",
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "failPointClient",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 1
+ },
+ "data": {
+ "failCommands": [
+ "saslContinue"
+ ],
+ "closeConnection": true
+ }
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "saslContinue",
+ "command": {
+ "saslContinue": 1,
+ "conversationId": 0,
+ "payload": "ZmFrZXNhc2xwYXlsb2Fk"
+ }
+ },
+ "expectError": {
+ "isClientError": true
+ }
+ }
+ ],
+ "expectLogMessages": [
+ {
+ "client": "client",
+ "messages": [
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command started",
+ "databaseName": "logging-redaction-tests",
+ "commandName": "saslContinue",
+ "command": {
+ "$$matchAsDocument": {}
+ }
+ }
+ },
+ {
+ "level": "debug",
+ "component": "command",
+ "failureIsRedacted": false,
+ "data": {
+ "message": "Command failed",
+ "commandName": "saslContinue",
+ "failure": {
+ "$$exists": true
+ }
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "getnonce command and server reply are redacted",
+ "runOnRequirements": [
+ {
+ "maxServerVersion": "6.1.99"
+ }
+ ],
+ "operations": [
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "getnonce",
+ "command": {
+ "getnonce": 1
+ }
+ }
+ }
+ ],
+ "expectLogMessages": [
+ {
+ "client": "client",
+ "messages": [
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command started",
+ "databaseName": "logging-redaction-tests",
+ "commandName": "getnonce",
+ "command": {
+ "$$matchAsDocument": {}
+ }
+ }
+ },
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command succeeded",
+ "commandName": "getnonce",
+ "reply": {
+ "$$matchAsDocument": {}
+ }
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "network error in response to getnonce is not redacted",
+ "runOnRequirements": [
+ {
+ "maxServerVersion": "6.1.99"
+ }
+ ],
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "failPointClient",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 1
+ },
+ "data": {
+ "failCommands": [
+ "getnonce"
+ ],
+ "closeConnection": true
+ }
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "getnonce",
+ "command": {
+ "getnonce": 1
+ }
+ },
+ "expectError": {
+ "isClientError": true
+ }
+ }
+ ],
+ "expectLogMessages": [
+ {
+ "client": "client",
+ "messages": [
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command started",
+ "databaseName": "logging-redaction-tests",
+ "commandName": "getnonce",
+ "command": {
+ "$$matchAsDocument": {}
+ }
+ }
+ },
+ {
+ "level": "debug",
+ "component": "command",
+ "failureIsRedacted": false,
+ "data": {
+ "message": "Command failed",
+ "commandName": "getnonce",
+ "failure": {
+ "$$exists": true
+ }
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "createUser command and resulting server-generated error are redacted",
+ "operations": [
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "createUser",
+ "command": {
+ "createUser": "private",
+ "pwd": {},
+ "roles": []
+ }
+ },
+ "expectError": {
+ "isClientError": false
+ }
+ }
+ ],
+ "expectLogMessages": [
+ {
+ "client": "client",
+ "messages": [
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command started",
+ "databaseName": "logging-redaction-tests",
+ "commandName": "createUser",
+ "command": {
+ "$$matchAsDocument": {}
+ }
+ }
+ },
+ {
+ "level": "debug",
+ "component": "command",
+ "failureIsRedacted": true,
+ "data": {
+ "message": "Command failed",
+ "commandName": "createUser",
+ "failure": {
+ "$$exists": true
+ }
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "network error in response to createUser is not redacted",
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "failPointClient",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 1
+ },
+ "data": {
+ "failCommands": [
+ "createUser"
+ ],
+ "closeConnection": true
+ }
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "createUser",
+ "command": {
+ "createUser": "private",
+ "pwd": "pwd",
+ "roles": []
+ }
+ },
+ "expectError": {
+ "isClientError": true
+ }
+ }
+ ],
+ "expectLogMessages": [
+ {
+ "client": "client",
+ "messages": [
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command started",
+ "databaseName": "logging-redaction-tests",
+ "commandName": "createUser",
+ "command": {
+ "$$matchAsDocument": {}
+ }
+ }
+ },
+ {
+ "level": "debug",
+ "component": "command",
+ "failureIsRedacted": false,
+ "data": {
+ "message": "Command failed",
+ "commandName": "createUser",
+ "failure": {
+ "$$exists": true
+ }
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "updateUser command and resulting server-generated error are redacted",
+ "operations": [
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "updateUser",
+ "command": {
+ "updateUser": "private",
+ "pwd": {},
+ "roles": []
+ }
+ },
+ "expectError": {
+ "isClientError": false
+ }
+ }
+ ],
+ "expectLogMessages": [
+ {
+ "client": "client",
+ "messages": [
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command started",
+ "databaseName": "logging-redaction-tests",
+ "commandName": "updateUser",
+ "command": {
+ "$$matchAsDocument": {}
+ }
+ }
+ },
+ {
+ "level": "debug",
+ "component": "command",
+ "failureIsRedacted": true,
+ "data": {
+ "message": "Command failed",
+ "commandName": "updateUser",
+ "failure": {
+ "$$exists": true
+ }
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "network error in response to updateUser is not redacted",
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "failPointClient",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 1
+ },
+ "data": {
+ "failCommands": [
+ "updateUser"
+ ],
+ "closeConnection": true
+ }
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "updateUser",
+ "command": {
+ "updateUser": "private",
+ "pwd": "pwd",
+ "roles": []
+ }
+ },
+ "expectError": {
+ "isClientError": true
+ }
+ }
+ ],
+ "expectLogMessages": [
+ {
+ "client": "client",
+ "messages": [
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command started",
+ "databaseName": "logging-redaction-tests",
+ "commandName": "updateUser",
+ "command": {
+ "$$matchAsDocument": {}
+ }
+ }
+ },
+ {
+ "level": "debug",
+ "component": "command",
+ "failureIsRedacted": false,
+ "data": {
+ "message": "Command failed",
+ "commandName": "updateUser",
+ "failure": {
+ "$$exists": true
+ }
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "copydbgetnonce command and resulting server-generated error are redacted",
+ "runOnRequirements": [
+ {
+ "maxServerVersion": "3.6.99"
+ }
+ ],
+ "operations": [
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "copydbgetnonce",
+ "command": {
+ "copydbgetnonce": "private"
+ }
+ },
+ "expectError": {
+ "isClientError": false
+ }
+ }
+ ],
+ "expectLogMessages": [
+ {
+ "client": "client",
+ "messages": [
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command started",
+ "databaseName": "logging-redaction-tests",
+ "commandName": "copydbgetnonce",
+ "command": {
+ "$$matchAsDocument": {}
+ }
+ }
+ },
+ {
+ "level": "debug",
+ "component": "command",
+ "failureIsRedacted": true,
+ "data": {
+ "message": "Command failed",
+ "commandName": "copydbgetnonce",
+ "failure": {
+ "$$exists": true
+ }
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "network error in response to copydbgetnonce is not redacted",
+ "runOnRequirements": [
+ {
+ "maxServerVersion": "3.6.99"
+ }
+ ],
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "failPointClient",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 1
+ },
+ "data": {
+ "failCommands": [
+ "copydbgetnonce"
+ ],
+ "closeConnection": true
+ }
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "copydbgetnonce",
+ "command": {
+ "copydbgetnonce": "private"
+ }
+ },
+ "expectError": {
+ "isClientError": true
+ }
+ }
+ ],
+ "expectLogMessages": [
+ {
+ "client": "client",
+ "messages": [
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command started",
+ "databaseName": "logging-redaction-tests",
+ "commandName": "copydbgetnonce",
+ "command": {
+ "$$matchAsDocument": {}
+ }
+ }
+ },
+ {
+ "level": "debug",
+ "component": "command",
+ "failureIsRedacted": false,
+ "data": {
+ "message": "Command failed",
+ "commandName": "copydbgetnonce",
+ "failure": {
+ "$$exists": true
+ }
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "copydbsaslstart command and resulting server-generated error are redacted",
+ "runOnRequirements": [
+ {
+ "maxServerVersion": "4.0.99"
+ }
+ ],
+ "operations": [
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "copydbsaslstart",
+ "command": {
+ "copydbsaslstart": "private"
+ }
+ },
+ "expectError": {
+ "isClientError": false
+ }
+ }
+ ],
+ "expectLogMessages": [
+ {
+ "client": "client",
+ "messages": [
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command started",
+ "databaseName": "logging-redaction-tests",
+ "commandName": "copydbsaslstart",
+ "command": {
+ "$$matchAsDocument": {}
+ }
+ }
+ },
+ {
+ "level": "debug",
+ "component": "command",
+ "failureIsRedacted": true,
+ "data": {
+ "message": "Command failed",
+ "commandName": "copydbsaslstart",
+ "failure": {
+ "$$exists": true
+ }
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "network error in response to copydbsaslstart is not redacted",
+ "runOnRequirements": [
+ {
+ "maxServerVersion": "4.0.99"
+ }
+ ],
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "failPointClient",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 1
+ },
+ "data": {
+ "failCommands": [
+ "copydbsaslstart"
+ ],
+ "closeConnection": true
+ }
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "copydbsaslstart",
+ "command": {
+ "copydbsaslstart": "private"
+ }
+ },
+ "expectError": {
+ "isClientError": true
+ }
+ }
+ ],
+ "expectLogMessages": [
+ {
+ "client": "client",
+ "messages": [
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command started",
+ "databaseName": "logging-redaction-tests",
+ "commandName": "copydbgetnonce",
+ "command": {
+ "$$matchAsDocument": {}
+ }
+ }
+ },
+ {
+ "level": "debug",
+ "component": "command",
+ "failureIsRedacted": false,
+ "data": {
+ "message": "Command failed",
+ "commandName": "copydbgetnonce",
+ "failure": {
+ "$$exists": true
+ }
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "copydb command and resulting server-generated error are redacted",
+ "runOnRequirements": [
+ {
+ "maxServerVersion": "4.0.99"
+ }
+ ],
+ "operations": [
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "copydb",
+ "command": {
+ "copydb": "private"
+ }
+ },
+ "expectError": {
+ "isClientError": false
+ }
+ }
+ ],
+ "expectLogMessages": [
+ {
+ "client": "client",
+ "messages": [
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command started",
+ "databaseName": "logging-redaction-tests",
+ "commandName": "copydb",
+ "command": {
+ "$$matchAsDocument": {}
+ }
+ }
+ },
+ {
+ "level": "debug",
+ "component": "command",
+ "failureIsRedacted": true,
+ "data": {
+ "message": "Command failed",
+ "commandName": "copydb",
+ "failure": {
+ "$$exists": true
+ }
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "network error in response to copydb is not redacted",
+ "runOnRequirements": [
+ {
+ "maxServerVersion": "4.0.99"
+ }
+ ],
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "failPointClient",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 1
+ },
+ "data": {
+ "failCommands": [
+ "copydb"
+ ],
+ "closeConnection": true
+ }
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "copydb",
+ "command": {
+ "copydb": "private"
+ }
+ },
+ "expectError": {
+ "isClientError": true
+ }
+ }
+ ],
+ "expectLogMessages": [
+ {
+ "client": "client",
+ "messages": [
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command started",
+ "databaseName": "logging-redaction-tests",
+ "commandName": "copydb",
+ "command": {
+ "$$matchAsDocument": {}
+ }
+ }
+ },
+ {
+ "level": "debug",
+ "component": "command",
+ "failureIsRedacted": false,
+ "data": {
+ "message": "Command failed",
+ "commandName": "copydb",
+ "failure": {
+ "$$exists": true
+ }
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "hello with speculative authenticate command and server reply are redacted",
+ "runOnRequirements": [
+ {
+ "minServerVersion": "4.9"
+ }
+ ],
+ "operations": [
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "hello",
+ "command": {
+ "hello": 1,
+ "speculativeAuthenticate": {
+ "saslStart": 1
+ }
+ }
+ }
+ }
+ ],
+ "expectLogMessages": [
+ {
+ "client": "client",
+ "messages": [
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command started",
+ "databaseName": "logging-redaction-tests",
+ "commandName": "hello",
+ "command": {
+ "$$matchAsDocument": {}
+ }
+ }
+ },
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command succeeded",
+ "commandName": "hello",
+ "reply": {
+ "$$matchAsDocument": {}
+ }
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "legacy hello with speculative authenticate command and server reply are redacted",
+ "operations": [
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "ismaster",
+ "command": {
+ "ismaster": 1,
+ "speculativeAuthenticate": {
+ "saslStart": 1
+ }
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "isMaster",
+ "command": {
+ "isMaster": 1,
+ "speculativeAuthenticate": {
+ "saslStart": 1
+ }
+ }
+ }
+ }
+ ],
+ "expectLogMessages": [
+ {
+ "client": "client",
+ "messages": [
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command started",
+ "databaseName": "logging-redaction-tests",
+ "commandName": "ismaster",
+ "command": {
+ "$$matchAsDocument": {}
+ }
+ }
+ },
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command succeeded",
+ "commandName": "ismaster",
+ "reply": {
+ "$$matchAsDocument": {}
+ }
+ }
+ },
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command started",
+ "databaseName": "logging-redaction-tests",
+ "commandName": "isMaster",
+ "command": {
+ "$$matchAsDocument": {}
+ }
+ }
+ },
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command succeeded",
+ "commandName": "isMaster",
+ "reply": {
+ "$$matchAsDocument": {}
+ }
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "hello without speculative authenticate command and server reply are not redacted",
+ "runOnRequirements": [
+ {
+ "minServerVersion": "4.9"
+ }
+ ],
+ "operations": [
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "hello",
+ "command": {
+ "hello": 1
+ }
+ }
+ }
+ ],
+ "expectLogMessages": [
+ {
+ "client": "client",
+ "messages": [
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command started",
+ "databaseName": "logging-redaction-tests",
+ "commandName": "hello",
+ "command": {
+ "$$matchAsDocument": {
+ "$$matchAsRoot": {
+ "hello": 1
+ }
+ }
+ }
+ }
+ },
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command succeeded",
+ "commandName": "hello",
+ "reply": {
+ "$$matchAsDocument": {
+ "$$matchAsRoot": {
+ "ok": 1,
+ "isWritablePrimary": true
+ }
+ }
+ }
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "legacy hello without speculative authenticate command and server reply are not redacted",
+ "operations": [
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "ismaster",
+ "command": {
+ "ismaster": 1
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "isMaster",
+ "command": {
+ "isMaster": 1
+ }
+ }
+ }
+ ],
+ "expectLogMessages": [
+ {
+ "client": "client",
+ "messages": [
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command started",
+ "databaseName": "logging-redaction-tests",
+ "commandName": "ismaster",
+ "command": {
+ "$$matchAsDocument": {
+ "$$matchAsRoot": {
+ "ismaster": 1
+ }
+ }
+ }
+ }
+ },
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command succeeded",
+ "commandName": "ismaster",
+ "reply": {
+ "$$matchAsDocument": {
+ "$$matchAsRoot": {
+ "ok": 1,
+ "ismaster": true
+ }
+ }
+ }
+ }
+ },
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command started",
+ "databaseName": "logging-redaction-tests",
+ "commandName": "isMaster",
+ "command": {
+ "$$matchAsDocument": {
+ "$$matchAsRoot": {
+ "isMaster": 1
+ }
+ }
+ }
+ }
+ },
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command succeeded",
+ "commandName": "isMaster",
+ "reply": {
+ "$$matchAsDocument": {
+ "$$matchAsRoot": {
+ "ok": 1,
+ "ismaster": true
+ }
+ }
+ }
+ }
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/specifications/command-logging-and-monitoring/tests/logging/redacted-commands.yml b/specifications/command-logging-and-monitoring/tests/logging/redacted-commands.yml
new file mode 100644
index 00000000000..05d61465e5a
--- /dev/null
+++ b/specifications/command-logging-and-monitoring/tests/logging/redacted-commands.yml
@@ -0,0 +1,850 @@
+description: "redacted-commands"
+
+schemaVersion: "1.13"
+
+runOnRequirements:
+ - minServerVersion: "5.0"
+ auth: false
+
+createEntities:
+ - client:
+ id: &client client
+ useMultipleMongoses: false
+ observeLogMessages:
+ command: debug
+ - client:
+ id: &failPointClient failPointClient
+ useMultipleMongoses: false
+ - database:
+ id: &database database
+ client: *client
+ databaseName: &databaseName logging-redaction-tests
+
+tests:
+ - description: "authenticate command and resulting server-generated error are redacted"
+ operations:
+ - name: runCommand
+ object: *database
+ arguments:
+ commandName: authenticate
+ command:
+ authenticate: 1
+ mechanism: "MONGODB-X509"
+ user: "CN=myName,OU=myOrgUnit,O=myOrg,L=myLocality,ST=myState,C=myCountry"
+ db: "$external"
+ # An authentication error is expected, but we want to check that the
+ # CommandStartedEvent is redacted
+ expectError:
+ isClientError: false
+ expectLogMessages:
+ - client: *client
+ messages:
+ - level: debug
+ component: command
+ data:
+ message: "Command started"
+ databaseName: *databaseName
+ commandName: authenticate
+ command:
+ $$matchAsDocument: {}
+ - level: debug
+ component: command
+ failureIsRedacted: true
+ data:
+ message: "Command failed"
+ commandName: authenticate
+ failure: { $$exists: true }
+
+ - description: "network error in response to authenticate is not redacted"
+ operations:
+ - name: failPoint
+ object: testRunner
+ arguments:
+ client: *failPointClient
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 1 }
+ data:
+ failCommands: ["authenticate"]
+ closeConnection: true
+ - name: runCommand
+ object: *database
+ arguments:
+ commandName: authenticate
+ command:
+ authenticate: 1
+ mechanism: "MONGODB-X509"
+ user: "CN=myName,OU=myOrgUnit,O=myOrg,L=myLocality,ST=myState,C=myCountry"
+ expectError:
+ isClientError: true
+ expectLogMessages:
+ - client: *client
+ messages:
+ - level: debug
+ component: command
+ data:
+ message: "Command started"
+ databaseName: *databaseName
+ commandName: authenticate
+ command:
+ $$matchAsDocument: {}
+ - level: debug
+ component: command
+ failureIsRedacted: false
+ data:
+ message: "Command failed"
+ commandName: authenticate
+ failure: { $$exists: true }
+
+ - description: "saslStart command and resulting server-generated error are redacted"
+ operations:
+ - name: runCommand
+ object: *database
+ arguments:
+ commandName: saslStart
+ command:
+ saslStart: 1
+ payload: "definitely-invalid-payload"
+ db: "admin"
+ expectError:
+ isClientError: false
+ expectLogMessages:
+ - client: *client
+ messages:
+ - level: debug
+ component: command
+ data:
+ message: "Command started"
+ databaseName: *databaseName
+ commandName: saslStart
+ command:
+ $$matchAsDocument: {}
+ - level: debug
+ component: command
+ failureIsRedacted: true
+ data:
+ message: "Command failed"
+ commandName: saslStart
+ failure: { $$exists: true }
+
+ - description: "network error in response to saslStart is not redacted"
+ operations:
+ - name: failPoint
+ object: testRunner
+ arguments:
+ client: *failPointClient
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 1 }
+ data:
+ failCommands: ["saslStart"]
+ closeConnection: true
+ - name: runCommand
+ object: *database
+ arguments:
+ commandName: saslStart
+ command:
+ saslStart: 1
+ payload: ZmFrZXNhc2xwYXlsb2Fk
+ mechanism: MONGODB-X509
+ expectError:
+ isClientError: true
+ expectLogMessages:
+ - client: *client
+ messages:
+ - level: debug
+ component: command
+ data:
+ message: "Command started"
+ databaseName: *databaseName
+ commandName: saslStart
+ command:
+ $$matchAsDocument: {}
+ - level: debug
+ component: command
+ failureIsRedacted: false
+ data:
+ message: "Command failed"
+ commandName: saslStart
+ failure: { $$exists: true }
+
+ - description: "saslContinue command and resulting server-generated error are redacted"
+ operations:
+ - name: runCommand
+ object: *database
+ arguments:
+ commandName: saslContinue
+ command:
+ saslContinue: 1
+ conversationId: 0
+ payload: "definitely-invalid-payload"
+ expectError:
+ isClientError: false
+ expectLogMessages:
+ - client: *client
+ messages:
+ - level: debug
+ component: command
+ data:
+ message: "Command started"
+ databaseName: *databaseName
+ commandName: saslContinue
+ command:
+ $$matchAsDocument: {}
+ - level: debug
+ component: command
+ failureIsRedacted: true
+ data:
+ message: "Command failed"
+ commandName: saslContinue
+ failure: { $$exists: true }
+
+ - description: "network error in response to saslContinue is not redacted"
+ operations:
+ - name: failPoint
+ object: testRunner
+ arguments:
+ client: *failPointClient
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 1 }
+ data:
+ failCommands: ["saslContinue"]
+ closeConnection: true
+ - name: runCommand
+ object: *database
+ arguments:
+ commandName: saslContinue
+ command:
+ saslContinue: 1
+ conversationId: 0
+ payload: ZmFrZXNhc2xwYXlsb2Fk
+ expectError:
+ isClientError: true
+ expectLogMessages:
+ - client: *client
+ messages:
+ - level: debug
+ component: command
+ data:
+ message: "Command started"
+ databaseName: *databaseName
+ commandName: saslContinue
+ command:
+ $$matchAsDocument: {}
+ - level: debug
+ component: command
+ failureIsRedacted: false
+ data:
+ message: "Command failed"
+ commandName: saslContinue
+ failure: { $$exists: true }
+
+ - description: "getnonce command and server reply are redacted"
+ runOnRequirements:
+ - maxServerVersion: 6.1.99 # getnonce removed as of 6.2 via SERVER-71007
+ operations:
+ - name: runCommand
+ object: *database
+ arguments:
+ commandName: getnonce
+ command:
+ getnonce: 1
+ expectLogMessages:
+ - client: *client
+ messages:
+ - level: debug
+ component: command
+ data:
+ message: "Command started"
+ databaseName: *databaseName
+ commandName: getnonce
+ command:
+ $$matchAsDocument: {}
+ - level: debug
+ component: command
+ data:
+ message: "Command succeeded"
+ commandName: getnonce
+ reply:
+ $$matchAsDocument: {}
+
+ - description: "network error in response to getnonce is not redacted"
+ runOnRequirements:
+ - maxServerVersion: 6.1.99 # getnonce removed as of 6.2 via SERVER-71007
+ operations:
+ - name: failPoint
+ object: testRunner
+ arguments:
+ client: *failPointClient
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 1 }
+ data:
+ failCommands: ["getnonce"]
+ closeConnection: true
+ - name: runCommand
+ object: *database
+ arguments:
+ commandName: getnonce
+ command:
+ getnonce: 1
+ expectError:
+ isClientError: true
+ expectLogMessages:
+ - client: *client
+ messages:
+ - level: debug
+ component: command
+ data:
+ message: "Command started"
+ databaseName: *databaseName
+ commandName: getnonce
+ command:
+ $$matchAsDocument: {}
+ - level: debug
+ component: command
+ failureIsRedacted: false
+ data:
+ message: "Command failed"
+ commandName: getnonce
+ failure: { $$exists: true }
+
+ - description: "createUser command and resulting server-generated error are redacted"
+ operations:
+ - name: runCommand
+ object: *database
+ arguments:
+ commandName: createUser
+ command:
+ createUser: "private"
+ # Passing an object is prohibited and we want to trigger a command
+ # failure
+ pwd: {}
+ roles: []
+ expectError:
+ isClientError: false
+ expectLogMessages:
+ - client: *client
+ messages:
+ - level: debug
+ component: command
+ data:
+ message: "Command started"
+ databaseName: *databaseName
+ commandName: createUser
+ command:
+ $$matchAsDocument: {}
+ - level: debug
+ component: command
+ failureIsRedacted: true
+ data:
+ message: "Command failed"
+ commandName: createUser
+ failure: { $$exists: true }
+
+ - description: "network error in response to createUser is not redacted"
+ operations:
+ - name: failPoint
+ object: testRunner
+ arguments:
+ client: *failPointClient
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 1 }
+ data:
+ failCommands: ["createUser"]
+ closeConnection: true
+ - name: runCommand
+ object: *database
+ arguments:
+ commandName: createUser
+ command:
+ createUser: "private"
+ pwd: "pwd"
+ roles: []
+ expectError:
+ isClientError: true
+ expectLogMessages:
+ - client: *client
+ messages:
+ - level: debug
+ component: command
+ data:
+ message: "Command started"
+ databaseName: *databaseName
+ commandName: createUser
+ command:
+ $$matchAsDocument: {}
+ - level: debug
+ component: command
+ failureIsRedacted: false
+ data:
+ message: "Command failed"
+ commandName: createUser
+ failure: { $$exists: true }
+
+ - description: "updateUser command and resulting server-generated error are redacted"
+ operations:
+ - name: runCommand
+ object: *database
+ arguments:
+ commandName: updateUser
+ command:
+ updateUser: "private"
+ pwd: {}
+ roles: []
+ expectError:
+ isClientError: false
+ expectLogMessages:
+ - client: *client
+ messages:
+ - level: debug
+ component: command
+ data:
+ message: "Command started"
+ databaseName: *databaseName
+ commandName: updateUser
+ command:
+ $$matchAsDocument: {}
+ - level: debug
+ component: command
+ failureIsRedacted: true
+ data:
+ message: "Command failed"
+ commandName: updateUser
+ failure: { $$exists: true }
+
+ - description: "network error in response to updateUser is not redacted"
+ operations:
+ - name: failPoint
+ object: testRunner
+ arguments:
+ client: *failPointClient
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 1 }
+ data:
+ failCommands: ["updateUser"]
+ closeConnection: true
+ - name: runCommand
+ object: *database
+ arguments:
+ commandName: updateUser
+ command:
+ updateUser: "private"
+ pwd: "pwd"
+ roles: []
+ expectError:
+ isClientError: true
+ expectLogMessages:
+ - client: *client
+ messages:
+ - level: debug
+ component: command
+ data:
+ message: "Command started"
+ databaseName: *databaseName
+ commandName: updateUser
+ command:
+ $$matchAsDocument: {}
+ - level: debug
+ component: command
+ failureIsRedacted: false
+ data:
+ message: "Command failed"
+ commandName: updateUser
+ failure: { $$exists: true }
+
+ - description: "copydbgetnonce command and resulting server-generated error are redacted"
+ runOnRequirements:
+ - maxServerVersion: 3.6.99 # copydbgetnonce was removed as of 4.0 via SERVER-32276
+ operations:
+ - name: runCommand
+ object: *database
+ arguments:
+ commandName: copydbgetnonce
+ command:
+ copydbgetnonce: "private"
+ expectError:
+ isClientError: false
+ expectLogMessages:
+ - client: *client
+ messages:
+ - level: debug
+ component: command
+ data:
+ message: "Command started"
+ databaseName: *databaseName
+ commandName: copydbgetnonce
+ command:
+ $$matchAsDocument: {}
+ - level: debug
+ component: command
+ failureIsRedacted: true
+ data:
+ message: "Command failed"
+ commandName: copydbgetnonce
+ failure: { $$exists: true }
+
+ - description: "network error in response to copydbgetnonce is not redacted"
+ runOnRequirements:
+ - maxServerVersion: 3.6.99 # copydbgetnonce was removed as of 4.0 via SERVER-32276
+ operations:
+ - name: failPoint
+ object: testRunner
+ arguments:
+ client: *failPointClient
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 1 }
+ data:
+ failCommands: ["copydbgetnonce"]
+ closeConnection: true
+ - name: runCommand
+ object: *database
+ arguments:
+ commandName: copydbgetnonce
+ command:
+ copydbgetnonce: "private"
+ expectError:
+ isClientError: true
+ expectLogMessages:
+ - client: *client
+ messages:
+ - level: debug
+ component: command
+ data:
+ message: "Command started"
+ databaseName: *databaseName
+ commandName: copydbgetnonce
+ command:
+ $$matchAsDocument: {}
+ - level: debug
+ component: command
+ failureIsRedacted: false
+ data:
+ message: "Command failed"
+ commandName: copydbgetnonce
+ failure: { $$exists: true }
+
+ - description: "copydbsaslstart command and resulting server-generated error are redacted"
+ runOnRequirements:
+ - maxServerVersion: 4.0.99 # copydbsaslstart was removed as of 4.2 via SERVER-36211
+ operations:
+ - name: runCommand
+ object: *database
+ arguments:
+ commandName: copydbsaslstart
+ command:
+ copydbsaslstart: "private"
+ expectError:
+ isClientError: false
+ expectLogMessages:
+ - client: *client
+ messages:
+ - level: debug
+ component: command
+ data:
+ message: "Command started"
+ databaseName: *databaseName
+ commandName: copydbsaslstart
+ command:
+ $$matchAsDocument: {}
+ - level: debug
+ component: command
+ failureIsRedacted: true
+ data:
+ message: "Command failed"
+ commandName: copydbsaslstart
+ failure: { $$exists: true }
+
+ - description: "network error in response to copydbsaslstart is not redacted"
+ runOnRequirements:
+ - maxServerVersion: 4.0.99 # copydbsaslstart was removed as of 4.2 via SERVER-36211
+ operations:
+ - name: failPoint
+ object: testRunner
+ arguments:
+ client: *failPointClient
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 1 }
+ data:
+ failCommands: ["copydbsaslstart"]
+ closeConnection: true
+ - name: runCommand
+ object: *database
+ arguments:
+ commandName: copydbsaslstart
+ command:
+ copydbsaslstart: "private"
+ expectError:
+ isClientError: true
+ expectLogMessages:
+ - client: *client
+ messages:
+ - level: debug
+ component: command
+ data:
+ message: "Command started"
+ databaseName: *databaseName
+ commandName: copydbgetnonce
+ command:
+ $$matchAsDocument: {}
+ - level: debug
+ component: command
+ failureIsRedacted: false
+ data:
+ message: "Command failed"
+ commandName: copydbgetnonce
+ failure: { $$exists: true }
+
+ - description: "copydb command and resulting server-generated error are redacted"
+ runOnRequirements:
+ - maxServerVersion: 4.0.99 # copydb was removed as of 4.2 via SERVER-36257
+ operations:
+ - name: runCommand
+ object: *database
+ arguments:
+ commandName: copydb
+ command:
+ copydb: "private"
+ expectError:
+ isClientError: false
+ expectLogMessages:
+ - client: *client
+ messages:
+ - level: debug
+ component: command
+ data:
+ message: "Command started"
+ databaseName: *databaseName
+ commandName: copydb
+ command:
+ $$matchAsDocument: {}
+ - level: debug
+ component: command
+ failureIsRedacted: true
+ data:
+ message: "Command failed"
+ commandName: copydb
+ failure: { $$exists: true }
+
+ - description: "network error in response to copydb is not redacted"
+ runOnRequirements:
+ - maxServerVersion: 4.0.99 # copydb was removed as of 4.2 via SERVER-36257
+ operations:
+ - name: failPoint
+ object: testRunner
+ arguments:
+ client: *failPointClient
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 1 }
+ data:
+ failCommands: ["copydb"]
+ closeConnection: true
+ - name: runCommand
+ object: *database
+ arguments:
+ commandName: copydb
+ command:
+ copydb: "private"
+ expectError:
+ isClientError: true
+ expectLogMessages:
+ - client: *client
+ messages:
+ - level: debug
+ component: command
+ data:
+ message: "Command started"
+ databaseName: *databaseName
+ commandName: copydb
+ command:
+ $$matchAsDocument: {}
+ - level: debug
+ component: command
+ failureIsRedacted: false
+ data:
+ message: "Command failed"
+ commandName: copydb
+ failure: { $$exists: true }
+
+ - description: "hello with speculative authenticate command and server reply are redacted"
+ runOnRequirements:
+ - minServerVersion: "4.9"
+ operations:
+ - name: runCommand
+ object: *database
+ arguments:
+ commandName: hello
+ command:
+ hello: 1
+ speculativeAuthenticate:
+ saslStart: 1
+ expectLogMessages:
+ - client: *client
+ messages:
+ - level: debug
+ component: command
+ data:
+ message: "Command started"
+ databaseName: *databaseName
+ commandName: hello
+ command:
+ $$matchAsDocument: {}
+ - level: debug
+ component: command
+ data:
+ message: "Command succeeded"
+ commandName: hello
+ reply:
+ $$matchAsDocument: {}
+
+
+ - description: "legacy hello with speculative authenticate command and server reply are redacted"
+ operations:
+ - name: runCommand
+ object: *database
+ arguments:
+ commandName: ismaster
+ command:
+ ismaster: 1
+ speculativeAuthenticate:
+ saslStart: 1
+ - name: runCommand
+ object: *database
+ arguments:
+ commandName: isMaster
+ command:
+ isMaster: 1
+ speculativeAuthenticate:
+ saslStart: 1
+ expectLogMessages:
+ - client: *client
+ messages:
+ - level: debug
+ component: command
+ data:
+ message: "Command started"
+ databaseName: *databaseName
+ commandName: ismaster
+ command:
+ $$matchAsDocument: {}
+ - level: debug
+ component: command
+ data:
+ message: "Command succeeded"
+ commandName: ismaster
+ reply:
+ $$matchAsDocument: {}
+ - level: debug
+ component: command
+ data:
+ message: "Command started"
+ databaseName: *databaseName
+ commandName: isMaster
+ command:
+ $$matchAsDocument: {}
+ - level: debug
+ component: command
+ data:
+ message: "Command succeeded"
+ commandName: isMaster
+ reply:
+ $$matchAsDocument: {}
+
+ - description: "hello without speculative authenticate command and server reply are not redacted"
+ runOnRequirements:
+ - minServerVersion: "4.9"
+ operations:
+ - name: runCommand
+ object: *database
+ arguments:
+ commandName: hello
+ command:
+ hello: 1
+
+ expectLogMessages:
+ - client: *client
+ messages:
+ - level: debug
+ component: command
+ data:
+ message: "Command started"
+ databaseName: *databaseName
+ commandName: hello
+ command:
+ $$matchAsDocument:
+ $$matchAsRoot:
+ hello: 1
+ - level: debug
+ component: command
+ data:
+ message: "Command succeeded"
+ commandName: hello
+ reply:
+ $$matchAsDocument:
+ $$matchAsRoot:
+ ok: 1
+ isWritablePrimary: true
+
+ - description: "legacy hello without speculative authenticate command and server reply are not redacted"
+ operations:
+ - name: runCommand
+ object: *database
+ arguments:
+ commandName: ismaster
+ command:
+ ismaster: 1
+ - name: runCommand
+ object: *database
+ arguments:
+ commandName: isMaster
+ command:
+ isMaster: 1
+ expectLogMessages:
+ - client: *client
+ messages:
+ - level: debug
+ component: command
+ data:
+ message: "Command started"
+ databaseName: *databaseName
+ commandName: ismaster
+ command:
+ $$matchAsDocument:
+ $$matchAsRoot:
+ ismaster: 1
+ - level: debug
+ component: command
+ data:
+ message: "Command succeeded"
+ commandName: ismaster
+ reply:
+ $$matchAsDocument:
+ $$matchAsRoot:
+ ok: 1
+ ismaster: true
+ - level: debug
+ component: command
+ data:
+ message: "Command started"
+ databaseName: *databaseName
+ commandName: isMaster
+ command:
+ $$matchAsDocument:
+ $$matchAsRoot:
+ isMaster: 1
+ - level: debug
+ component: command
+ data:
+ message: "Command succeeded"
+ commandName: isMaster
+ reply:
+ $$matchAsDocument:
+ $$matchAsRoot:
+ ok: 1
+ ismaster: true
diff --git a/specifications/command-logging-and-monitoring/tests/logging/server-connection-id.json b/specifications/command-logging-and-monitoring/tests/logging/server-connection-id.json
new file mode 100644
index 00000000000..abbbbc74421
--- /dev/null
+++ b/specifications/command-logging-and-monitoring/tests/logging/server-connection-id.json
@@ -0,0 +1,131 @@
+{
+ "description": "server-connection-id",
+ "schemaVersion": "1.13",
+ "runOnRequirements": [
+ {
+ "minServerVersion": "4.2"
+ }
+ ],
+ "createEntities": [
+ {
+ "client": {
+ "id": "client",
+ "observeLogMessages": {
+ "command": "debug"
+ }
+ }
+ },
+ {
+ "database": {
+ "id": "database",
+ "client": "client",
+ "databaseName": "logging-server-connection-id-tests"
+ }
+ },
+ {
+ "collection": {
+ "id": "collection",
+ "database": "database",
+ "collectionName": "logging-tests-collection"
+ }
+ }
+ ],
+ "initialData": [
+ {
+ "databaseName": "logging-server-connection-id-tests",
+ "collectionName": "logging-tests-collection",
+ "documents": []
+ }
+ ],
+ "tests": [
+ {
+ "description": "command log messages include server connection id",
+ "operations": [
+ {
+ "name": "insertOne",
+ "object": "collection",
+ "arguments": {
+ "document": {
+ "x": 1
+ }
+ }
+ },
+ {
+ "name": "find",
+ "object": "collection",
+ "arguments": {
+ "filter": {
+ "$or": true
+ }
+ },
+ "expectError": {
+ "isError": true
+ }
+ }
+ ],
+ "expectLogMessages": [
+ {
+ "client": "client",
+ "messages": [
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command started",
+ "commandName": "insert",
+ "serverConnectionId": {
+ "$$type": [
+ "int",
+ "long"
+ ]
+ }
+ }
+ },
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command succeeded",
+ "commandName": "insert",
+ "serverConnectionId": {
+ "$$type": [
+ "int",
+ "long"
+ ]
+ }
+ }
+ },
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command started",
+ "commandName": "find",
+ "serverConnectionId": {
+ "$$type": [
+ "int",
+ "long"
+ ]
+ }
+ }
+ },
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command failed",
+ "commandName": "find",
+ "serverConnectionId": {
+ "$$type": [
+ "int",
+ "long"
+ ]
+ }
+ }
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/specifications/command-logging-and-monitoring/tests/logging/server-connection-id.yml b/specifications/command-logging-and-monitoring/tests/logging/server-connection-id.yml
new file mode 100644
index 00000000000..4f54d1207e3
--- /dev/null
+++ b/specifications/command-logging-and-monitoring/tests/logging/server-connection-id.yml
@@ -0,0 +1,66 @@
+description: "server-connection-id"
+
+schemaVersion: "1.13"
+
+runOnRequirements:
+ - minServerVersion: "4.2"
+
+createEntities:
+ - client:
+ id: &client client
+ observeLogMessages:
+ command: debug
+ - database:
+ id: &database database
+ client: *client
+ databaseName: &databaseName logging-server-connection-id-tests
+ - collection:
+ id: &collection collection
+ database: *database
+ collectionName: &collectionName logging-tests-collection
+
+initialData:
+ - databaseName: *databaseName
+ collectionName: *collectionName
+ documents: []
+
+tests:
+ - description: "command log messages include server connection id"
+ operations:
+ - name: insertOne
+ object: *collection
+ arguments:
+ document: { x: 1 }
+ - name: find
+ object: *collection
+ arguments:
+ filter: { $or: true }
+ expectError:
+ isError: true
+ expectLogMessages:
+ - client: *client
+ messages:
+ - level: debug
+ component: command
+ data:
+ message: "Command started"
+ commandName: insert
+ serverConnectionId: { $$type: [int, long] }
+ - level: debug
+ component: command
+ data:
+ message: "Command succeeded"
+ commandName: insert
+ serverConnectionId: { $$type: [int, long] }
+ - level: debug
+ component: command
+ data:
+ message: "Command started"
+ commandName: find
+ serverConnectionId: { $$type: [int, long] }
+ - level: debug
+ component: command
+ data:
+ message: "Command failed"
+ commandName: find
+ serverConnectionId: { $$type: [int, long] }
diff --git a/specifications/command-logging-and-monitoring/tests/logging/service-id.json b/specifications/command-logging-and-monitoring/tests/logging/service-id.json
new file mode 100644
index 00000000000..ea39d612315
--- /dev/null
+++ b/specifications/command-logging-and-monitoring/tests/logging/service-id.json
@@ -0,0 +1,207 @@
+{
+ "description": "service-id",
+ "schemaVersion": "1.13",
+ "createEntities": [
+ {
+ "client": {
+ "id": "client",
+ "observeLogMessages": {
+ "command": "debug"
+ }
+ }
+ },
+ {
+ "database": {
+ "id": "database",
+ "client": "client",
+ "databaseName": "logging-server-connection-id-tests"
+ }
+ },
+ {
+ "collection": {
+ "id": "collection",
+ "database": "database",
+ "collectionName": "logging-tests-collection"
+ }
+ }
+ ],
+ "initialData": [
+ {
+ "databaseName": "logging-server-connection-id-tests",
+ "collectionName": "logging-tests-collection",
+ "documents": []
+ }
+ ],
+ "tests": [
+ {
+ "description": "command log messages include serviceId when in LB mode",
+ "runOnRequirements": [
+ {
+ "topologies": [
+ "load-balanced"
+ ]
+ }
+ ],
+ "operations": [
+ {
+ "name": "insertOne",
+ "object": "collection",
+ "arguments": {
+ "document": {
+ "x": 1
+ }
+ }
+ },
+ {
+ "name": "find",
+ "object": "collection",
+ "arguments": {
+ "filter": {
+ "$or": true
+ }
+ },
+ "expectError": {
+ "isError": true
+ }
+ }
+ ],
+ "expectLogMessages": [
+ {
+ "client": "client",
+ "messages": [
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command started",
+ "commandName": "insert",
+ "serviceId": {
+ "$$type": "string"
+ }
+ }
+ },
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command succeeded",
+ "commandName": "insert",
+ "serviceId": {
+ "$$type": "string"
+ }
+ }
+ },
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command started",
+ "commandName": "find",
+ "serviceId": {
+ "$$type": "string"
+ }
+ }
+ },
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command failed",
+ "commandName": "find",
+ "serviceId": {
+ "$$type": "string"
+ }
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "command log messages omit serviceId when not in LB mode",
+ "runOnRequirements": [
+ {
+ "topologies": [
+ "single",
+ "replicaset",
+ "sharded"
+ ]
+ }
+ ],
+ "operations": [
+ {
+ "name": "insertOne",
+ "object": "collection",
+ "arguments": {
+ "document": {
+ "x": 1
+ }
+ }
+ },
+ {
+ "name": "find",
+ "object": "collection",
+ "arguments": {
+ "filter": {
+ "$or": true
+ }
+ },
+ "expectError": {
+ "isError": true
+ }
+ }
+ ],
+ "expectLogMessages": [
+ {
+ "client": "client",
+ "messages": [
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command started",
+ "commandName": "insert",
+ "serviceId": {
+ "$$exists": false
+ }
+ }
+ },
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command succeeded",
+ "commandName": "insert",
+ "serviceId": {
+ "$$exists": false
+ }
+ }
+ },
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command started",
+ "commandName": "find",
+ "serviceId": {
+ "$$exists": false
+ }
+ }
+ },
+ {
+ "level": "debug",
+ "component": "command",
+ "data": {
+ "message": "Command failed",
+ "commandName": "find",
+ "serviceId": {
+ "$$exists": false
+ }
+ }
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/specifications/command-logging-and-monitoring/tests/logging/service-id.yml b/specifications/command-logging-and-monitoring/tests/logging/service-id.yml
new file mode 100644
index 00000000000..0c0f444e239
--- /dev/null
+++ b/specifications/command-logging-and-monitoring/tests/logging/service-id.yml
@@ -0,0 +1,111 @@
+description: "service-id"
+
+schemaVersion: "1.13"
+
+createEntities:
+ - client:
+ id: &client client
+ observeLogMessages:
+ command: debug
+ - database:
+ id: &database database
+ client: *client
+ databaseName: &databaseName logging-server-connection-id-tests
+ - collection:
+ id: &collection collection
+ database: *database
+ collectionName: &collectionName logging-tests-collection
+
+initialData:
+ - databaseName: *databaseName
+ collectionName: *collectionName
+ documents: []
+
+tests:
+ - description: "command log messages include serviceId when in LB mode"
+ runOnRequirements:
+ - topologies:
+ - load-balanced
+ operations:
+ - name: insertOne
+ object: *collection
+ arguments:
+ document: { x: 1 }
+ - name: find
+ object: *collection
+ arguments:
+ filter: { $or: true }
+ expectError:
+ isError: true
+ expectLogMessages:
+ - client: *client
+ messages:
+ - level: debug
+ component: command
+ data:
+ message: "Command started"
+ commandName: insert
+ serviceId: { $$type: string }
+ - level: debug
+ component: command
+ data:
+ message: "Command succeeded"
+ commandName: insert
+ serviceId: { $$type: string }
+ - level: debug
+ component: command
+ data:
+ message: "Command started"
+ commandName: find
+ serviceId: { $$type: string }
+ - level: debug
+ component: command
+ data:
+ message: "Command failed"
+ commandName: find
+ serviceId: { $$type: string }
+
+ - description: "command log messages omit serviceId when not in LB mode"
+ runOnRequirements:
+ - topologies:
+ - single
+ - replicaset
+ - sharded
+ operations:
+ - name: insertOne
+ object: *collection
+ arguments:
+ document: { x: 1 }
+ - name: find
+ object: *collection
+ arguments:
+ filter: { $or: true }
+ expectError:
+ isError: true
+ expectLogMessages:
+ - client: *client
+ messages:
+ - level: debug
+ component: command
+ data:
+ message: "Command started"
+ commandName: insert
+ serviceId: { $$exists: false }
+ - level: debug
+ component: command
+ data:
+ message: "Command succeeded"
+ commandName: insert
+ serviceId: { $$exists: false }
+ - level: debug
+ component: command
+ data:
+ message: "Command started"
+ commandName: find
+ serviceId: { $$exists: false }
+ - level: debug
+ component: command
+ data:
+ message: "Command failed"
+ commandName: find
+ serviceId: { $$exists: false }
diff --git a/tests/MongoDB.Driver.Tests/Specifications/command-monitoring/tests/unified/pre-42-server-connection-id.json b/specifications/command-logging-and-monitoring/tests/unified/pre-42-server-connection-id.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/command-monitoring/tests/unified/pre-42-server-connection-id.json
rename to specifications/command-logging-and-monitoring/tests/unified/pre-42-server-connection-id.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/command-monitoring/tests/unified/pre-42-server-connection-id.yml b/specifications/command-logging-and-monitoring/tests/unified/pre-42-server-connection-id.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/command-monitoring/tests/unified/pre-42-server-connection-id.yml
rename to specifications/command-logging-and-monitoring/tests/unified/pre-42-server-connection-id.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/command-monitoring/tests/unified/redacted-commands.json b/specifications/command-logging-and-monitoring/tests/unified/redacted-commands.json
similarity index 99%
rename from tests/MongoDB.Driver.Tests/Specifications/command-monitoring/tests/unified/redacted-commands.json
rename to specifications/command-logging-and-monitoring/tests/unified/redacted-commands.json
index 0f85dc3e94a..645348591a3 100644
--- a/tests/MongoDB.Driver.Tests/Specifications/command-monitoring/tests/unified/redacted-commands.json
+++ b/specifications/command-logging-and-monitoring/tests/unified/redacted-commands.json
@@ -162,6 +162,11 @@
},
{
"description": "getnonce",
+ "runOnRequirements": [
+ {
+ "maxServerVersion": "6.1.99"
+ }
+ ],
"operations": [
{
"name": "runCommand",
diff --git a/tests/MongoDB.Driver.Tests/Specifications/command-monitoring/tests/unified/redacted-commands.yml b/specifications/command-logging-and-monitoring/tests/unified/redacted-commands.yml
similarity index 99%
rename from tests/MongoDB.Driver.Tests/Specifications/command-monitoring/tests/unified/redacted-commands.yml
rename to specifications/command-logging-and-monitoring/tests/unified/redacted-commands.yml
index 570fb5a547e..f730785d733 100644
--- a/tests/MongoDB.Driver.Tests/Specifications/command-monitoring/tests/unified/redacted-commands.yml
+++ b/specifications/command-logging-and-monitoring/tests/unified/redacted-commands.yml
@@ -93,6 +93,8 @@ tests:
payload: { $$exists: false }
- description: "getnonce"
+ runOnRequirements:
+ - maxServerVersion: "6.1.99"
operations:
- name: runCommand
object: *database
diff --git a/tests/MongoDB.Driver.Tests/Specifications/command-monitoring/tests/unified/server-connection-id.json b/specifications/command-logging-and-monitoring/tests/unified/server-connection-id.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/command-monitoring/tests/unified/server-connection-id.json
rename to specifications/command-logging-and-monitoring/tests/unified/server-connection-id.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/command-monitoring/tests/unified/server-connection-id.yml b/specifications/command-logging-and-monitoring/tests/unified/server-connection-id.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/command-monitoring/tests/unified/server-connection-id.yml
rename to specifications/command-logging-and-monitoring/tests/unified/server-connection-id.yml
diff --git a/specifications/connection-monitoring-and-pooling/connection-monitoring-and-pooling.rst b/specifications/connection-monitoring-and-pooling/connection-monitoring-and-pooling.rst
new file mode 100644
index 00000000000..0fe3811ae7f
--- /dev/null
+++ b/specifications/connection-monitoring-and-pooling/connection-monitoring-and-pooling.rst
@@ -0,0 +1,1557 @@
+=================================
+Connection Monitoring and Pooling
+=================================
+
+:Status: Accepted
+:Minimum Server Version: N/A
+
+.. contents::
+
+Abstract
+========
+
+Drivers currently support a variety of options that allow users to configure connection pooling behavior. Users are confused by drivers supporting different subsets of these options. Additionally, drivers implement their connection pools differently, making it difficult to design cross-driver pool functionality. By unifying and codifying pooling options and behavior across all drivers, we will increase user comprehension and code base maintainability.
+
+META
+====
+
+The keywords “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, and “OPTIONAL” in this document are to be interpreted as described in `RFC 2119 `_.
+
+Definitions
+===========
+
+Connection
+~~~~~~~~~~~~~~
+
+A Connection (when linked) refers to the ``Connection`` type defined in the
+`Connection Pool Members`_ section of this specification. It does not refer to an actual TCP
+connection to an Endpoint. A ``Connection`` will attempt to create and wrap such
+a TCP connection over the course of its existence, but it is not equivalent to
+one nor does it wrap an active one at all times.
+
+For the purposes of testing, a mocked ``Connection`` type could be used with the
+pool that never actually creates a TCP connection or performs any I/O.
+
+Endpoint
+~~~~~~~~
+
+For convenience, an Endpoint refers to either a **mongod** or **mongos** instance.
+
+Thread
+~~~~~~
+
+For convenience, a Thread refers to:
+
+- A shared-address-space process (a.k.a. a thread) in multi-threaded drivers
+- An Execution Frame / Continuation in asynchronous drivers
+- A goroutine in Go
+
+Behavioral Description
+======================
+
+Which Drivers this applies to
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+This specification is solely concerned with drivers that implement a connection pool. A driver SHOULD implement a connection pool, but is not required to.
+
+Connection Pool Options
+~~~~~~~~~~~~~~~~~~~~~~~
+
+All drivers that implement a connection pool MUST implement and conform to the same MongoClient options. There can be slight deviation in naming to make the options idiomatic to the driver language.
+
+Connection Pool Behaviors
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+All driver connection pools MUST provide an API that allows the driver to check out a connection, check in a connection back to the pool, and clear all connections in the pool. This API is for internal use only, and SHOULD NOT be documented as a public API.
+
+Connection Pool Monitoring
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+All drivers that implement a connection pool MUST provide an API that allows users to subscribe to events emitted from the pool.
+
+Detailed Design
+===============
+
+.. _connection-pool-options-1:
+
+Connection Pool Options
+~~~~~~~~~~~~~~~~~~~~~~~
+
+Drivers that implement a Connection Pool MUST support the following ConnectionPoolOptions:
+
+.. code:: typescript
+
+ interface ConnectionPoolOptions {
+ /**
+ * The maximum number of Connections that may be associated
+ * with a pool at a given time. This includes in use and
+ * available connections.
+ * If specified, MUST be an integer >= 0.
+ * A value of 0 means there is no limit.
+ * Defaults to 100.
+ */
+ maxPoolSize?: number;
+
+ /**
+ * The minimum number of Connections that MUST exist at any moment
+ * in a single connection pool.
+ * If specified, MUST be an integer >= 0. If maxPoolSize is > 0
+ * then minPoolSize must be <= maxPoolSize
+ * Defaults to 0.
+ */
+ minPoolSize?: number;
+
+ /**
+ * The maximum amount of time a Connection should remain idle
+ * in the connection pool before being marked idle.
+ * If specified, MUST be a number >= 0.
+ * A value of 0 means there is no limit.
+ * Defaults to 0.
+ */
+ maxIdleTimeMS?: number;
+
+ /**
+ * The maximum number of Connections a Pool may be establishing concurrently.
+ * Establishment of a Connection is a part of its life cycle
+ * starting after a ConnectionCreatedEvent and ending before a ConnectionReadyEvent.
+ * If specified, MUST be a number > 0.
+ * Defaults to 2.
+ */
+ maxConnecting?: number;
+ }
+
+Additionally, Drivers that implement a Connection Pool MUST support the following ConnectionPoolOptions UNLESS that driver meets ALL of the following conditions:
+
+- The driver/language currently has an idiomatic timeout mechanism implemented
+- The timeout mechanism conforms to `the aggressive requirement of timing out a thread in the WaitQueue <#w1dcrm950sbn>`__
+
+.. code:: typescript
+
+ interface ConnectionPoolOptions {
+ /**
+ * NOTE: This option has been deprecated in favor of timeoutMS.
+ *
+ * The maximum amount of time a thread can wait for a connection
+ * to become available.
+ * If specified, MUST be a number >= 0.
+ * A value of 0 means there is no limit.
+ * Defaults to 0.
+ */
+ waitQueueTimeoutMS?: number;
+ }
+
+These options MUST be specified at the MongoClient level, and SHOULD be named in a manner idiomatic to the driver's language. All connection pools created by a MongoClient MUST use the same ConnectionPoolOptions.
+
+When parsing a mongodb connection string, a user MUST be able to specify these options using the default names specified above.
+
+Deprecated Options
+------------------
+
+The following ConnectionPoolOptions are considered deprecated. They MUST NOT be implemented if they do not already exist in a driver, and they SHOULD be deprecated and removed from drivers that implement them as early as possible:
+
+.. code:: typescript
+
+ interface ConnectionPoolOptions {
+ /**
+ * The maximum number of threads that can simultaneously wait
+ * for a Connection to become available.
+ */
+ waitQueueSize?: number;
+
+ /**
+ * An alternative way of setting waitQueueSize, it specifies
+ * the maximum number of threads that can wait per connection.
+ * waitQueueSize === waitQueueMultiple \* maxPoolSize
+ */
+ waitQueueMultiple?: number
+ }
+
+Connection Pool Members
+~~~~~~~~~~~~~~~~~~~~~~~
+
+Connection
+----------
+
+A driver-defined wrapper around a single TCP connection to an Endpoint. A `Connection`_ has the following properties:
+
+- **Single Endpoint:** A `Connection`_ MUST be associated with a single Endpoint. A `Connection`_ MUST NOT be associated with multiple Endpoints.
+- **Single Lifetime:** A `Connection`_ MUST NOT be used after it is closed.
+- **Single Owner:** A `Connection`_ MUST belong to exactly one Pool, and MUST NOT be shared across multiple pools
+- **Single Track:** A `Connection`_ MUST limit itself to one request / response at a time. A `Connection`_ MUST NOT multiplex/pipeline requests to an Endpoint.
+- **Monotonically Increasing ID:** A `Connection`_ MUST have an ID number associated with it. `Connection`_ IDs within a Pool MUST be assigned in order of creation, starting at 1 and increasing by 1 for each new Connection.
+- **Valid Connection:** A connection MUST NOT be checked out of the pool until it has successfully and fully completed a MongoDB Handshake and Authentication as specified in the `Handshake `__, `OP_COMPRESSED `__, and `Authentication `__ specifications.
+- **Perishable**: it is possible for a `Connection`_ to become **Perished**. A `Connection`_ is considered perished if any of the following are true:
+
+ - **Stale:** The `Connection`_ 's generation does not match the generation of the parent pool
+ - **Idle:** The `Connection`_ is currently "available" (as defined below) and has been for longer than **maxIdleTimeMS**.
+ - **Errored:** The `Connection`_ has experienced an error that indicates it is no longer recommended for use. Examples include, but are not limited to:
+
+ - Network Error
+ - Network Timeout
+ - Endpoint closing the connection
+ - Driver-Side Timeout
+ - Wire-Protocol Error
+
+.. code:: typescript
+
+ interface Connection {
+ /**
+ * An id number associated with the Connection
+ */
+ id: number;
+
+ /**
+ * The address of the pool that owns this Connection
+ */
+ address: string;
+
+ /**
+ * An integer representing the “generation” of the pool
+ * when this Connection was created.
+ */
+ generation: number;
+
+ /**
+ * The current state of the Connection.
+ *
+ * Possible values are the following:
+ * - "pending": The Connection has been created but has not yet been established. Contributes to
+ * totalConnectionCount and pendingConnectionCount.
+ *
+ * - "available": The Connection has been established and is waiting in the pool to be checked
+ * out. Contributes to both totalConnectionCount and availableConnectionCount.
+ *
+ * - "in use": The Connection has been established, checked out from the pool, and has yet
+ * to be checked back in. Contributes to totalConnectionCount.
+ *
+ * - "closed": The Connection has had its socket closed and cannot be used for any future
+ * operations. Does not contribute to any connection counts.
+ *
+ * Note: this field is mainly used for the purposes of describing state
+ * in this specification. It is not required that drivers
+ * actually include this field in their implementations of Connection.
+ */
+ state: "pending" | "available" | "in use" | "closed";
+ }
+
+WaitQueue
+---------
+
+A concept that represents pending requests for `Connections <#connection>`_. When a thread requests a `Connection <#connection>`_ from a Pool, the thread enters the Pool's WaitQueue. A thread stays in the WaitQueue until it either receives a `Connection <#connection>`_ or times out. A WaitQueue has the following traits:
+
+- **Thread-Safe**: When multiple threads attempt to enter or exit a WaitQueue, they do so in a thread-safe manner.
+- **Ordered/Fair**: When `Connections <#connection>`_ are made available, they are issued out to threads in the order that the threads entered the WaitQueue.
+- **Timeout aggressively:** Members of a WaitQueue MUST timeout if they are enqueued for longer than the computed timeout and MUST leave the WaitQueue immediately in this case.
+
+The implementation details of a WaitQueue are left to the driver.
+Example implementations include:
+
+- A fair Semaphore
+- A Queue of callbacks
+
+Connection Pool
+---------------
+
+A driver-defined entity that encapsulates all non-monitoring
+`Connections <#connection>`_ associated with a single Endpoint. The pool
+has the following properties:
+
+- **Thread Safe:** All Pool behaviors MUST be thread safe.
+- **Not Fork-Safe:** A Pool is explicitly not fork-safe. If a Pool detects that is it being used by a forked process, it MUST immediately clear itself and update its pid
+- **Single Owner:** A Pool MUST be associated with exactly one Endpoint, and MUST NOT be shared between Endpoints.
+- **Emit Events and Log Messages:** A Pool MUST emit pool events and log messages when dictated by this spec (see `Connection Pool Monitoring <#connection-pool-monitoring>`__). Users MUST be able to subscribe to emitted events and log messages in a manner idiomatic to their language and driver.
+- **Closeable:** A Pool MUST be able to be manually closed. When a Pool is closed, the following behaviors change:
+
+ - Checking in a `Connection <#connection>`_ to the Pool automatically closes the `Connection <#connection>`_
+ - Attempting to check out a `Connection <#connection>`_ from the Pool results in an Error
+
+- **Clearable:** A Pool MUST be able to be cleared. Clearing the pool marks all pooled and checked out `Connections <#connection>`_ as stale and lazily closes them as they are checkedIn or encountered in checkOut. Additionally, all requests are evicted from the WaitQueue and return errors that are considered non-timeout network errors.
+
+- **Pausable:** A Pool MUST be able to be paused and resumed. A Pool is paused automatically when it is cleared, and it can be resumed by being marked as "ready". While the Pool is paused, it exhibits the following behaviors:
+
+ - Attempting to check out a `Connection <#connection>`_ from the Pool results in a non-timeout network error
+ - Connections are not created in the background to satisfy minPoolSize
+
+- **Capped:** a pool is capped if **maxPoolSize** is set to a non-zero value. If a pool is capped, then its total number of `Connections <#connection>`_ (including available and in use) MUST NOT exceed **maxPoolSize**
+- **Rate-limited:** A Pool MUST limit the number of `Connections <#connection>`_ being `established <#establishing-a-connection-internal-implementation>`_ concurrently via the **maxConnecting** `pool option <#connection-pool-options-1>`_.
+
+
+.. code:: typescript
+
+ interface ConnectionPool {
+ /**
+ * The Queue of threads waiting for a Connection to be available
+ */
+ waitQueue: WaitQueue;
+
+ /**
+ * A generation number representing the SDAM generation of the pool.
+ */
+ generation: number;
+
+ /**
+ * A map representing the various generation numbers for various services
+ * when in load balancer mode.
+ */
+ serviceGenerations: Map;
+
+ /**
+ * The state of the pool.
+ *
+ * Possible values are the following:
+ * - "paused": The initial state of the pool. Connections may not be checked out nor can they
+ * be established in the background to satisfy minPoolSize. Clearing a pool
+ * transitions it to this state.
+ *
+ * - "ready": The healthy state of the pool. It can service checkOut requests and create
+ * connections in the background. The pool can be set to this state via the
+ * ready() method.
+ *
+ * - "closed": The pool is destroyed. No more Connections may ever be checked out nor any
+ * created in the background. The pool can be set to this sate via the close()
+ * method. The pool cannot transition to any other state after being closed.
+ */
+ state: "paused" | "ready" | "closed";
+
+ // Any of the following connection counts may be computed rather than
+ // actually stored on the pool.
+
+ /**
+ * An integer expressing how many total Connections
+ * ("pending" + "available" + "in use") the pool currently has
+ */
+ totalConnectionCount: number;
+
+ /**
+ * An integer expressing how many Connections are currently
+ * available in the pool.
+ */
+ availableConnectionCount: number;
+
+ /**
+ * An integer expressing how many Connections are currently
+ * being established.
+ */
+ pendingConnectionCount: number;
+
+ /**
+ * Returns a Connection for use
+ */
+ checkOut(): Connection;
+
+ /**
+ * Check in a Connection back to the Connection pool
+ */
+ checkIn(connection: Connection): void;
+
+ /**
+ * Mark all current Connections as stale, clear the WaitQueue, and mark the pool as "paused".
+ * No connections may be checked out or created in this pool until ready() is called again.
+ * interruptInUseConnections specifies whether the pool will force interrupt "in use" connections as part of the clear.
+ * Default false.
+ */
+ clear(interruptInUseConnections: Optional): void;
+
+ /**
+ * Mark the pool as "ready", allowing checkOuts to resume and connections to be created in the background.
+ * A pool can only transition from "paused" to "ready". A "closed" pool
+ * cannot be marked as "ready" via this method.
+ */
+ ready(): void;
+
+ /**
+ * Marks the pool as "closed", preventing the pool from creating and returning new Connections
+ */
+ close(): void;
+ }
+
+.. _connection-pool-behaviors-1:
+
+Connection Pool Behaviors
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Creating a Connection Pool
+--------------------------
+
+This specification does not define how a pool is to be created, leaving it
+up to the driver. Creation of a connection pool is generally an implementation
+detail of the driver, i.e., is not a part of the public API of the driver.
+The SDAM specification defines `when
+`_
+the driver should create connection pools.
+
+When a pool is created, its state MUST initially be set to "paused". Even if
+minPoolSize is set, the pool MUST NOT begin being `populated
+<#populating-the-pool-with-a-connection-internal-implementation>`_ with
+`Connections <#connection>`_ until it has been marked as "ready". SDAM will mark
+the pool as "ready" on each successful check. See `Connection Pool Management`_
+section in the SDAM specification for more information.
+
+.. code::
+
+ set generation to 0
+ set state to "paused"
+ emit PoolCreatedEvent and equivalent log message
+
+Closing a Connection Pool
+-------------------------
+
+When a pool is closed, it MUST first close all available `Connections <#connection>`_ in that pool. This results in the following behavior changes:
+
+- In use `Connections <#connection>`_ MUST be closed when they are checked in to the closed pool.
+- Attempting to check out a `Connection <#connection>`_ MUST result in an error.
+
+.. code::
+
+ mark pool as "closed"
+ for connection in availableConnections:
+ close connection
+ emit PoolClosedEvent and equivalent log message
+
+Marking a Connection Pool as Ready
+----------------------------------
+
+Connection Pools start off as "paused", and they are marked as "ready" by
+monitors after they perform successful server checks. Once a pool is "ready",
+it can start checking out `Connections <#connection>`_ and populating them in
+the background.
+
+If the pool is already "ready" when this method is invoked, then this
+method MUST immediately return and MUST NOT emit a PoolReadyEvent.
+
+.. code::
+
+ mark pool as "ready"
+ emit PoolReadyEvent and equivalent log message
+ allow background thread to create connections
+
+Note that the PoolReadyEvent MUST be emitted before the background thread is allowed to resume creating new connections,
+and it must be the case that no observer is able to observe actions of the background thread
+related to creating new connections before observing the PoolReadyEvent event.
+
+Creating a Connection (Internal Implementation)
+-----------------------------------------------
+
+When creating a `Connection <#connection>`_, the initial `Connection <#connection>`_ is in a
+“pending” state. This only creates a “virtual” `Connection <#connection>`_, and
+performs no I/O.
+
+.. code::
+
+ connection = new Connection()
+ increment totalConnectionCount
+ increment pendingConnectionCount
+ set connection state to "pending"
+ emit ConnectionCreatedEvent and equivalent log message
+ return connection
+
+Establishing a Connection (Internal Implementation)
+---------------------------------------------------
+
+Before a `Connection <#connection>`_ can be marked as either "available" or "in use", it
+must be established. This process involves performing the initial
+handshake, handling OP_COMPRESSED, and performing authentication.
+
+.. code::
+
+ try:
+ connect connection via TCP / TLS
+ perform connection handshake
+ handle OP_COMPRESSED
+ perform connection authentication
+ emit ConnectionReadyEvent and equivalent log message
+ return connection
+ except error:
+ close connection
+ throw error # Propagate error in manner idiomatic to language.
+
+
+Closing a Connection (Internal Implementation)
+----------------------------------------------
+
+When a `Connection <#connection>`_ is closed, it MUST first be marked as "closed",
+removing it from being counted as "available" or "in use". Once that is
+complete, the `Connection <#connection>`_ can perform whatever teardown is
+necessary to close its underlying socket. The Driver SHOULD perform this
+teardown in a non-blocking manner, such as via the use of a background
+thread or async I/O.
+
+.. code::
+
+ original state = connection state
+ set connection state to "closed"
+
+ if original state is "available":
+ decrement availableConnectionCount
+ else if original state is "pending":
+ decrement pendingConnectionCount
+
+ decrement totalConnectionCount
+ emit ConnectionClosedEvent and equivalent log message
+
+ # The following can happen at a later time (i.e. in background
+ # thread) or via non-blocking I/O.
+ connection.socket.close()
+
+Marking a Connection as Available (Internal Implementation)
+-----------------------------------------------------------
+
+A `Connection <#connection>`_ is "available" if it is able to be checked out. A
+`Connection <#connection>`_ MUST NOT be marked as "available" until it has been
+established. The pool MUST keep track of the number of currently
+available `Connections <#connection>`_.
+
+.. code::
+
+ increment availableConnectionCount
+ set connection state to "available"
+ add connection to availableConnections
+
+
+Populating the Pool with a Connection (Internal Implementation)
+---------------------------------------------------------------
+
+"Populating" the pool involves preemptively creating and establishing a
+`Connection <#connection>`_ which is marked as "available" for use in future
+operations.
+
+Populating the pool MUST NOT block any application threads. For example, it
+could be performed on a background thread or via the use of non-blocking/async
+I/O. Populating the pool MUST NOT be performed unless the pool is "ready".
+
+If an error is encountered while populating a connection, it MUST be handled via
+the SDAM machinery according to the `Application Errors`_ section in the SDAM
+specification.
+
+If minPoolSize is set, the `Connection <#connection>`_ Pool MUST be populated
+until it has at least minPoolSize total `Connections <#connection>`_. This MUST
+occur only while the pool is "ready". If the pool implements a background
+thread, it can be used for this. If the pool does not implement a background
+thread, the checkOut method is responsible for ensuring this requirement is met.
+
+When populating the Pool, pendingConnectionCount has to be decremented after
+establishing a `Connection`_ similarly to how it is done in
+`Checking Out a Connection <#checking-out-a-connection>`_ to signal that
+another `Connection`_ is allowed to be established. Such a signal MUST become
+observable to any `Thread`_ after the action that
+`marks the established Connection as "available" <#marking-a-connection-as-available-internal-implementation>`_
+becomes observable to the `Thread`_.
+Informally, this order guarantees that no `Thread`_ tries to start
+establishing a `Connection`_ when there is an "available" `Connection`_
+established as a result of populating the Pool.
+
+.. code::
+
+ wait until pendingConnectionCount < maxConnecting and pool is "ready"
+ create connection
+ try:
+ establish connection
+ mark connection as available
+ except error:
+ # Defer error handling to SDAM.
+ topology.handle_pre_handshake_error(error)
+
+Checking Out a Connection
+-------------------------
+
+A Pool MUST have a method that allows the driver to check out a `Connection`_.
+Checking out a `Connection`_ involves submitting a request to the WaitQueue and,
+once that request reaches the front of the queue, having the Pool find or create
+a `Connection`_ to fulfill that request. Requests MUST be subject to a timeout
+which is computed per the rules in
+`Client Side Operations Timeout: Server Selection
+<../client-side-operations-timeout/client-side-operations-timeout.rst#server-selection>`_.
+
+To service a request for a `Connection`_, the Pool MUST first iterate over the
+list of available `Connections <#connection>`_, searching for a non-perished one
+to be returned. If a perished `Connection`_ is encountered, such a `Connection`_
+MUST be closed (as described in `Closing a Connection
+<#closing-a-connection-internal-implementation>`_) and the iteration of
+available `Connections <#connection>`_ MUST continue until either a non-perished
+available `Connection`_ is found or the list of available `Connections
+<#connection>`_ is exhausted.
+
+If the list is exhausted, the total number of `Connections <#connection>`_ is
+less than maxPoolSize, and pendingConnectionCount < maxConnecting, the pool MUST
+create a `Connection`_, establish it, mark it as "in use" and return it. If
+totalConnectionCount == maxPoolSize or pendingConnectionCount == maxConnecting,
+then the pool MUST wait to service the request until neither of those two
+conditions are met or until a `Connection`_ becomes available, re-entering the
+checkOut loop in either case. This waiting MUST NOT prevent `Connections
+<#connection>`_ from being checked into the pool. Additionally, the Pool MUST
+NOT service any newer checkOut requests before fulfilling the original one which
+could not be fulfilled. For drivers that implement the WaitQueue via a fair
+semaphore, a condition variable may also be needed to to meet this
+requirement. Waiting on the condition variable SHOULD also be limited by the
+WaitQueueTimeout, if the driver supports one and it was specified by the user.
+
+If the pool is "closed" or "paused", any attempt to check out a `Connection
+<#connection>`_ MUST throw an Error. The error thrown as a result of the pool
+being "paused" MUST be considered a retryable error and MUST NOT be an error
+that marks the SDAM state unknown.
+
+If the pool does not implement a background thread, the checkOut method is
+responsible for ensuring that the pool is `populated
+<#populating-the-pool-with-a-connection-internal-implementation>`_ with at least minPoolSize
+`Connections <#connection>`_.
+
+A `Connection <#connection>`_ MUST NOT be checked out until it is
+established. In addition, the Pool MUST NOT prevent other threads from checking
+out `Connections <#connection>`_ while establishing a `Connection
+<#connection>`_.
+
+Before a given `Connection <#connection>`_ is returned from checkOut, it must be marked as
+"in use", and the pool's availableConnectionCount MUST be decremented.
+
+.. code::
+
+ connection = Null
+ emit ConnectionCheckOutStartedEvent and equivalent log message
+ try:
+ enter WaitQueue
+ wait until at top of wait queue
+ # Note that in a lock-based implementation of the wait queue would
+ # only allow one thread in the following block at a time
+ while connection is Null:
+ if a connection is available:
+ while connection is Null and a connection is available:
+ connection = next available connection
+ if connection is perished:
+ close connection
+ connection = Null
+ else if totalConnectionCount < maxPoolSize:
+ if pendingConnectionCount < maxConnecting:
+ connection = create connection
+ else:
+ # this waiting MUST NOT prevent other threads from checking Connections
+ # back in to the pool.
+ wait until pendingConnectionCount < maxConnecting or a connection is available
+ continue
+
+ except pool is "closed":
+ emit ConnectionCheckOutFailedEvent(reason="poolClosed") and equivalent log message
+ throw PoolClosedError
+ except pool is "paused":
+ emit ConnectionCheckOutFailedEvent(reason="connectionError") and equivalent log message
+ throw PoolClearedError
+ except timeout:
+ emit ConnectionCheckOutFailedEvent(reason="timeout") and equivalent log message
+ throw WaitQueueTimeoutError
+ finally:
+ # This must be done in all drivers
+ leave wait queue
+
+ # If there is no background thread, the pool MUST ensure that
+ # there are at least minPoolSize total connections.
+ # This MUST be done in a non-blocking manner
+ while totalConnectionCount < minPoolSize:
+ populate the pool with a connection
+
+ # If the Connection has not been established yet (TCP, TLS,
+ # handshake, compression, and auth), it must be established
+ # before it is returned.
+ # This MUST NOT block other threads from acquiring connections.
+ if connection state is "pending":
+ try:
+ establish connection
+ except connection establishment error:
+ emit ConnectionCheckOutFailedEvent(reason="connectionError") and equivalent log message
+ decrement totalConnectionCount
+ throw
+ finally:
+ decrement pendingConnectionCount
+ else:
+ decrement availableConnectionCount
+ set connection state to "in use"
+ emit ConnectionCheckedOutEvent and equivalent log message
+ return connection
+
+Checking In a Connection
+------------------------
+
+A Pool MUST have a method of allowing the driver to check in a
+`Connection <#connection>`_. The driver MUST NOT be allowed to check in a
+`Connection <#connection>`_ to a Pool that did not create that `Connection <#connection>`_, and
+MUST throw an Error if this is attempted.
+
+When the `Connection <#connection>`_ is checked in, it MUST be `closed
+<#closing-a-connection-internal-implementation>`_ if any of the following are
+true:
+
+- The `Connection <#connection>`_ is perished.
+- The pool has been closed.
+
+Otherwise, the `Connection <#connection>`_ is marked as available.
+
+.. code::
+
+ emit ConnectionCheckedInEvent and equivalent log message
+ if connection is perished OR pool is closed:
+ close connection
+ else:
+ mark connection as available
+
+Clearing a Connection Pool
+--------------------------
+
+Clearing the pool involves different steps depending on whether the pool is in
+load balanced mode or not. The traditional / non-load balanced clearing behavior
+MUST NOT be used by pools in load balanced mode, and the load balanced pool
+clearing behavior MUST NOT be used in non-load balanced pools.
+
+Clearing a non-load balanced pool
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+A Pool MUST have a method of clearing all `Connections <#connection>`_ when
+instructed. Rather than iterating through every `Connection <#connection>`_,
+this method should simply increment the generation of the Pool, implicitly
+marking all current `Connections <#connection>`_ as stale. It should also
+transition the pool's state to "paused" to halt the creation of new connections
+until it is marked as "ready" again. The checkOut and checkIn algorithms will
+handle clearing out stale `Connections <#connection>`_. If a user is subscribed
+to Connection Monitoring events and/or connection log messages, a PoolClearedEvent
+and log message MUST be emitted after incrementing the generation / marking the pool
+as "paused". If the pool is already "paused" when it is cleared, then the pool MUST
+NOT emit a PoolCleared event or log message.
+
+As part of clearing the pool, the WaitQueue MUST also be cleared, meaning all
+requests in the WaitQueue MUST fail with errors indicating that the pool was
+cleared while the checkOut was being performed. The error returned as a result
+of the pool being cleared MUST be considered a retryable error and MUST NOT be
+an error that marks the SDAM state unknown. Clearing the WaitQueue MUST happen
+eagerly so that any operations waiting on `Connections <#connection>`_ can retry
+as soon as possible. The pool MUST NOT rely on WaitQueueTimeoutMS to clear
+requests from the WaitQueue.
+
+The clearing method MUST provide the option to interrupt any in-use connections as part
+of the clearing (henceforth referred to as the interruptInUseConnections flag in this
+specification). "Interrupting a Connection" is defined as canceling whatever task the
+Connection is currently performing and marking the Connection as perished (e.g. by closing
+its underlying socket). The interrupting of these Connections MUST be performed as soon as possible
+but MUST NOT block the pool or prevent it from processing further requests. If the pool has a background
+thread, and it is responsible for interrupting in-use connections, its next run MUST be scheduled as soon as
+possible.
+
+The pool MUST only interrupt in-use Connections whose generation is less than or equal
+to the generation of the pool at the moment of the clear (before the increment)
+that used the interruptInUseConnections flag. Any operations that have their Connections
+interrupted in this way MUST fail with a retryable error. If possible, the error SHOULD
+be a PoolClearedError with the following message: "Connection to interrupted
+due to server monitor timeout".
+
+Clearing a load balanced pool
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+A Pool MUST also have a method of clearing all `Connections <#connection>`_ for
+a specific ``serviceId`` for use when in load balancer mode. This method
+increments the generation of the pool for that specific ``serviceId`` in the
+generation map. A PoolClearedEvent and log message MUST be emitted after incrementing the
+generation. Note that this method MUST NOT transition the pool to the "paused"
+state and MUST NOT clear the WaitQueue.
+
+Load Balancer Mode
+------------------
+
+For load-balanced deployments, pools MUST maintain a map from ``serviceId`` to a
+tuple of (generation, connection count) where the connection count refers to the
+total number of connections that exist for a specific ``serviceId``. The pool MUST
+remove the entry for a ``serviceId`` once the connection count reaches 0.
+Once the MongoDB handshake is done, the connection MUST get the
+generation number that applies to its ``serviceId`` from the map and update the
+map to increment the connection count for this ``serviceId``.
+
+See the `Load Balancer Specification <../load-balancers/load-balancers.rst#connection-pooling>`__ for details.
+
+
+Forking
+-------
+
+A `Connection <#connection>`_ is explicitly not fork-safe. The proper behavior in the case of a fork is to ResetAfterFork by:
+
+- clear all Connection Pools in the child process
+- closing all `Connections <#connection>`_ in the child-process.
+
+Drivers that support forking MUST document that `Connections <#connection>`_ to an Endpoint are not fork-safe, and document the proper way to ResetAfterFork in the driver.
+
+Drivers MAY aggressively ResetAfterFork if the driver detects it has been forked.
+
+Optional Behaviors
+------------------
+
+The following features of a Connection Pool SHOULD be implemented if they make sense in the driver and driver's language.
+
+Background Thread
+^^^^^^^^^^^^^^^^^
+
+A Pool SHOULD have a background Thread that is responsible for
+monitoring the state of all available `Connections <#connection>`_. This background
+thread SHOULD
+
+- Populate `Connections <#connection>`_ to ensure that the pool always satisfies minPoolSize.
+- Remove and close perished available `Connections <#connection>`_ including "in use" connections if `interruptInUseConnections` option was set to true in the most recent pool clear.
+- Apply timeouts to connection establishment per `Client Side Operations
+ Timeout: Background Connection Pooling
+ <../client-side-operations-timeout/client-side-operations-timeout.rst#background-connection-pooling>`__.
+
+A pool SHOULD allow immediate scheduling of the next background thread iteration after a clear is performed.
+
+Conceptually, the aforementioned activities are organized into sequential Background Thread Runs.
+A Run MUST do as much work as readily available and then end instead of waiting for more work.
+For example, instead of waiting for pendingConnectionCount to become less than maxConnecting when satisfying minPoolSize,
+a Run MUST either proceed with the rest of its duties, e.g., closing available perished connections, or end.
+
+The duration of intervals between the end of one Run and the beginning of the next Run is not specified,
+but the
+`Test Format and Runner Specification `__
+may restrict this duration, or introduce other restrictions to facilitate testing.
+
+withConnection
+^^^^^^^^^^^^^^
+
+A Pool SHOULD implement a scoped resource management mechanism idiomatic to their language to prevent `Connections <#connection>`_ from not being checked in. Examples include `Python's "with" statement `__ and `C#'s "using" statement `__. If implemented, drivers SHOULD use this method as the default method of checking out and checking in `Connections <#connection>`_.
+
+.. _connection-pool-monitoring-1:
+
+Connection Pool Monitoring
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+All drivers that implement a connection pool MUST provide an API that allows users to subscribe to events emitted from the pool. If a user subscribes to Connection Monitoring events, these events MUST be emitted when specified in “Connection Pool Behaviors”. Events SHOULD be created and subscribed to in a manner idiomatic to their language and driver.
+
+Events
+------
+
+See the `Load Balancer Specification <../load-balancers/load-balancers.rst#events>`__ for details on the ``serviceId`` field.
+
+.. code:: typescript
+
+ /**
+ * Emitted when a Connection Pool is created
+ */
+ interface PoolCreatedEvent {
+ /**
+ * The ServerAddress of the Endpoint the pool is attempting to connect to.
+ */
+ address: string;
+
+ /**
+ * Any non-default pool options that were set on this Connection Pool.
+ */
+ options: {...}
+ }
+
+ /**
+ * Emitted when a Connection Pool is marked as ready.
+ */
+ interface PoolReadyEvent {
+ /**
+ * The ServerAddress of the Endpoint the pool is attempting to connect to.
+ */
+ address: string;
+ }
+
+ /**
+ * Emitted when a Connection Pool is cleared
+ */
+ interface PoolClearedEvent {
+ /**
+ * The ServerAddress of the Endpoint the pool is attempting to connect to.
+ */
+ address: string;
+
+ /**
+ * The service id for which the pool was cleared for in load balancing mode.
+ * See load balancer specification for more information about this field.
+ */
+ serviceId: Optional;
+
+ /**
+ * A flag whether the pool forced interrupting "in use" connections as part of the clear.
+ */
+ interruptInUseConnections: Optional;
+ }
+
+ /**
+ * Emitted when a Connection Pool is closed
+ */
+ interface PoolClosedEvent {
+ /**
+ * The ServerAddress of the Endpoint the pool is attempting to connect to.
+ */
+ address: string;
+ }
+
+ /**
+ * Emitted when a Connection Pool creates a Connection object.
+ * NOTE: This does not mean that the Connection is ready for use.
+ */
+ interface ConnectionCreatedEvent {
+ /**
+ * The ServerAddress of the Endpoint the pool is attempting to connect to.
+ */
+ address: string;
+
+ /**
+ * The ID of the Connection
+ */
+ connectionId: number;
+ }
+
+ /**
+ * Emitted when a Connection has finished its setup, and is now ready to use
+ */
+ interface ConnectionReadyEvent {
+ /**
+ * The ServerAddress of the Endpoint the pool is attempting to connect to.
+ */
+ address: string;
+
+ /**
+ * The ID of the Connection
+ */
+ connectionId: number;
+ }
+
+ /**
+ * Emitted when a Connection Pool closes a Connection
+ */
+ interface ConnectionClosedEvent {
+ /**
+ * The ServerAddress of the Endpoint the pool is attempting to connect to.
+ */
+ address: string;
+
+ /**
+ * The ID of the Connection
+ */
+ connectionId: number;
+
+ /**
+ * A reason explaining why this Connection was closed.
+ * Can be implemented as a string or enum.
+ * Current valid values are:
+ * - "stale": The pool was cleared, making the Connection no longer valid
+ * - "idle": The Connection became stale by being available for too long
+ * - "error": The Connection experienced an error, making it no longer valid
+ * - "poolClosed": The pool was closed, making the Connection no longer valid
+ */
+ reason: string|Enum;
+ }
+
+ /**
+ * Emitted when the driver starts attempting to check out a Connection
+ */
+ interface ConnectionCheckOutStartedEvent {
+ /**
+ * The ServerAddress of the Endpoint the pool is attempting
+ * to connect to.
+ */
+ address: string;
+ }
+
+ /**
+ * Emitted when the driver's attempt to check out a Connection fails
+ */
+ interface ConnectionCheckOutFailedEvent {
+ /**
+ * The ServerAddress of the Endpoint the pool is attempting to connect to.
+ */
+ address: string;
+
+ /**
+ * A reason explaining why Connection check out failed.
+ * Can be implemented as a string or enum.
+ * Current valid values are:
+ * - "poolClosed": The pool was previously closed, and cannot provide new Connections
+ * - "timeout": The Connection check out attempt exceeded the specified timeout
+ * - "connectionError": The Connection check out attempt experienced an error while setting up a new Connection
+ */
+ reason: string|Enum;
+ }
+
+ /**
+ * Emitted when the driver successfully checks out a Connection
+ */
+ interface ConnectionCheckedOutEvent {
+ /**
+ * The ServerAddress of the Endpoint the pool is attempting to connect to.
+ */
+ address: string;
+
+ /**
+ * The ID of the Connection
+ */
+ connectionId: number;
+ }
+
+ /**
+ * Emitted when the driver checks in a Connection back to the Connection Pool
+ */
+ interface ConnectionCheckedInEvent {
+ /**
+ * The ServerAddress of the Endpoint the pool is attempting to connect to.
+ */
+ address: string;
+
+ /**
+ * The ID of the Connection
+ */
+ connectionId: number;
+ }
+
+Connection Pool Logging
+~~~~~~~~~~~~~~~~~~~~~~~
+Please refer to the `logging specification <../logging/logging.rst>`_ for details on logging implementations in general, including log levels, log
+components, handling of null values in log messages, and structured versus unstructured logging.
+
+Drivers MUST support logging of connection pool information via the following types of log messages. These messages MUST be logged at ``Debug`` level
+and use the ``connection`` log component. These messages MUST be emitted when specified in “Connection Pool Behaviors”.
+
+The log messages are intended to match the information contained in the events above. Drivers MAY implement connection logging support via an event
+subscriber if it is convenient to do so.
+
+The types used in the structured message definitions below are demonstrative, and drivers MAY use similar types instead so long as the information
+is present (e.g. a double instead of an integer, or a string instead of an integer if the structured logging framework does not support numeric types).
+
+Common Fields
+-------------
+All connection log messages MUST contain the following key-value pairs:
+
+.. list-table::
+ :header-rows: 1
+ :widths: 1 1 1
+
+ * - Key
+ - Suggested Type
+ - Value
+
+ * - serverHost
+ - String
+ - the hostname, IP address, or Unix domain socket path for the endpoint the pool is for.
+
+ * - serverPort
+ - Int
+ - The port for the endpoint the pool is for. Optional; not present for Unix domain sockets. When
+ the user does not specify a port and the default (27017) is used, the driver SHOULD include it here.
+
+Pool Created Message
+---------------------
+In addition to the common fields defined above, this message MUST contain the following key-value pairs:
+
+.. list-table::
+ :header-rows: 1
+ :widths: 1 1 1
+
+ * - Key
+ - Suggested Type
+ - Value
+
+ * - message
+ - String
+ - "Connection pool created"
+
+ * - maxIdleTimeMS
+ - Int
+ - The maxIdleTimeMS value for this pool. Optional; only required to include if the user specified a value.
+
+ * - minPoolSize
+ - Int
+ - The minPoolSize value for this pool. Optional; only required to include if the user specified a value.
+
+ * - maxPoolSize
+ - Int
+ - The maxPoolSize value for this pool. Optional; only required to include if the user specified a value.
+
+ * - maxConnecting
+ - Int
+ - The maxConnecting value for this pool. Optional; only required to include if the driver supports this option and the user
+ specified a value.
+
+ * - waitQueueTimeoutMS
+ - Int
+ - The waitQueueTimeoutMS value for this pool. Optional; only required to include if the driver supports this option and the
+ user specified a value.
+
+ * - waitQueueSize
+ - Int
+ - The waitQueueSize value for this pool. Optional; only required to include if the driver supports this option and the
+ user specified a value.
+
+ * - waitQueueMultiple
+ - Int
+ - The waitQueueMultiple value for this pool. Optional; only required to include if the driver supports this option and the
+ user specified a value.
+
+The unstructured form SHOULD be as follows, using the values defined in the structured format above to fill in placeholders as appropriate:
+
+ Connection pool created for {{serverHost}}:{{serverPort}} using options maxIdleTimeMS={{maxIdleTimeMS}},
+ minPoolSize={{minPoolSize}}, maxPoolSize={{maxPoolSize}}, maxConnecting={{maxConnecting}}, waitQueueTimeoutMS={{waitQueueTimeoutMS}},
+ waitQueueSize={{waitQueueSize}}, waitQueueMultiple={{waitQueueMultiple}}
+
+Pool Ready Message
+------------------
+In addition to the common fields defined above, this message MUST contain the following key-value pairs:
+
+.. list-table::
+ :header-rows: 1
+ :widths: 1 1 1
+
+ * - Key
+ - Suggested Type
+ - Value
+
+ * - message
+ - String
+ - "Connection pool ready"
+
+The unstructured form SHOULD be as follows, using the values defined in the structured format above to fill in placeholders as appropriate:
+
+ Connection pool ready for {{serverHost}}:{{serverPort}}
+
+Pool Cleared Message
+--------------------
+In addition to the common fields defined above, this message MUST contain the following key-value pairs:
+
+.. list-table::
+ :header-rows: 1
+ :widths: 1 1 1
+
+ * - Key
+ - Suggested Type
+ - Value
+
+ * - message
+ - String
+ - "Connection pool cleared"
+
+ * - serviceId
+ - String
+ - The hex string representation of the service ID which the pool was cleared for. Optional; only present in load balanced mode.
+
+The unstructured form SHOULD be as follows, using the values defined in the structured format above to fill in placeholders as appropriate:
+
+ Connection pool for {{serverHost}}:{{serverPort}} cleared for serviceId {{serviceId}}
+
+Pool Closed Message
+-------------------
+In addition to the common fields defined above, this message MUST contain the following key-value pairs:
+
+.. list-table::
+ :header-rows: 1
+ :widths: 1 1 1
+
+ * - Key
+ - Suggested Type
+ - Value
+
+ * - message
+ - String
+ - "Connection pool closed"
+
+The unstructured form SHOULD be as follows, using the values defined in the structured format above to fill in placeholders as appropriate:
+
+ Connection pool closed for {{serverHost}}:{{serverPort}}
+
+Connection Created Message
+--------------------------
+In addition to the common fields defined above, this message MUST contain the following key-value pairs:
+
+.. list-table::
+ :header-rows: 1
+ :widths: 1 1 1
+
+ * - Key
+ - Suggested Type
+ - Value
+
+ * - message
+ - String
+ - "Connection created"
+
+ * - driverConnectionId
+ - Int
+ - The driver-generated ID for the connection as defined in `Connection <#connection>`_.
+
+The unstructured form SHOULD be as follows, using the values defined in the structured format above to fill in placeholders as appropriate:
+
+ Connection created: address={{serverHost}}:{{serverPort}}, driver-generated ID={{driverConnectionId}}
+
+Connection Ready Message
+------------------------
+In addition to the common fields defined above, this message MUST contain the following key-value pairs:
+
+.. list-table::
+ :header-rows: 1
+ :widths: 1 1 1
+
+ * - Key
+ - Suggested Type
+ - Value
+
+ * - message
+ - String
+ - "Connection ready"
+
+ * - driverConnectionId
+ - Int
+ - The driver-generated ID for the connection as defined in `Connection <#connection>`_.
+
+The unstructured form SHOULD be as follows, using the values defined in the structured format above to fill in placeholders as appropriate:
+
+ Connection ready: address={{serverHost}}:{{serverPort}}, driver-generated ID={{driverConnectionId}}
+
+Connection Closed Message
+-------------------------
+In addition to the common fields defined above, this message MUST contain the following key-value pairs:
+
+.. list-table::
+ :header-rows: 1
+ :widths: 1 1 1
+
+ * - Key
+ - Suggested Type
+ - Value
+
+ * - message
+ - String
+ - "Connection closed"
+
+ * - driverConnectionId
+ - Int
+ - The driver-generated ID for the connection as defined in `Connection <#connection>`_.
+
+ * - reason
+ - String
+ - A string describing the reason the connection was closed. The following strings MUST be used for each possible reason
+ as defined in `Events <#events>`_ above:
+
+ - Stale: "Connection became stale because the pool was cleared"
+ - Idle: "Connection has been available but unused for longer than the configured max idle time"
+ - Error: "An error occurred while using the connection"
+ - Pool closed: "Connection pool was closed"
+
+ * - error
+ - Flexible
+ - If ``reason`` is ``Error``, the associated error. The type and format of this value is flexible; see the
+ `logging specification <../logging/logging.rst#representing-errors-in-log-messages>`_ for details on representing errors in log messages.
+
+The unstructured form SHOULD be as follows, using the values defined in the structured format above to fill in placeholders as appropriate:
+
+ Connection closed: address={{serverHost}}:{{serverPort}}, driver-generated ID={{driverConnectionId}}. Reason: {{reason}}. Error: {{error}}
+
+Connection Checkout Started Message
+-----------------------------------
+In addition to the common fields defined above, this message MUST contain the following key-value pairs:
+
+.. list-table::
+ :header-rows: 1
+ :widths: 1 1 1
+
+ * - Key
+ - Suggested Type
+ - Value
+
+ * - message
+ - String
+ - "Connection checkout started"
+
+The unstructured form SHOULD be as follows, using the values defined in the structured format above to fill in placeholders as appropriate:
+
+ Checkout started for connection to {{serverHost}}:{{serverPort}}
+
+Connection Checkout Failed Message
+-----------------------------------
+In addition to the common fields defined above, this message MUST contain the following key-value pairs:
+
+.. list-table::
+ :header-rows: 1
+ :widths: 1 1 1
+
+ * - Key
+ - Suggested Type
+ - Value
+
+ * - message
+ - String
+ - "Connection checkout failed"
+
+ * - reason
+ - String
+ - A string describing the reason checkout. The following strings MUST be used for each possible reason
+ as defined in `Events <#events>`_ above:
+
+ - Timeout: "Wait queue timeout elapsed without a connection becoming available"
+ - ConnectionError: "An error occurred while trying to establish a new connection"
+ - Pool closed: "Connection pool was closed"
+
+ * - error
+ - Flexible
+ - If ``reason`` is ``ConnectionError``, the associated error. The type and format of this value is flexible; see the
+ `logging specification <../logging/logging.rst#representing-errors-in-log-messages>`_ for details on representing errors in log messages.
+
+The unstructured form SHOULD be as follows, using the values defined in the structured format above to fill in placeholders as appropriate:
+
+ Checkout failed for connection to {{serverHost}}:{{serverPort}}. Reason: {{reason}}. Error: {{error}}
+
+Connection Checked Out
+-----------------------
+In addition to the common fields defined above, this message MUST contain the following key-value pairs:
+
+.. list-table::
+ :header-rows: 1
+ :widths: 1 1 1
+
+ * - Key
+ - Suggested Type
+ - Value
+
+ * - message
+ - String
+ - "Connection checked out"
+
+ * - driverConnectionId
+ - Int
+ - The driver-generated ID for the connection as defined in `Connection <#connection>`_.
+
+The unstructured form SHOULD be as follows, using the values defined in the structured format above to fill in placeholders as appropriate:
+
+ Connection checked out: address={serverHost}}:{{serverPort}}, driver-generated ID={{driverConnectionId}}
+
+Connection Checked In
+---------------------
+In addition to the common fields defined above, this message MUST contain the following key-value pairs:
+
+.. list-table::
+ :header-rows: 1
+ :widths: 1 1 1
+
+ * - Key
+ - Suggested Type
+ - Value
+
+ * - message
+ - String
+ - "Connection checked in"
+
+ * - driverConnectionId
+ - Int
+ - The driver-generated ID for the connection as defined in `Connection <#connection>`_.
+
+The unstructured form SHOULD be as follows, using the values defined in the structured format above to fill in placeholders as appropriate:
+
+ Connection checked in: address={{serverHost}}:{{serverPort}}, driver-generated ID={{driverConnectionId}}
+
+Connection Pool Errors
+~~~~~~~~~~~~~~~~~~~~~~
+
+A connection pool throws errors in specific circumstances. These Errors
+MUST be emitted by the pool. Errors SHOULD be created and dispatched in
+a manner idiomatic to the Driver and Language.
+
+.. code:: typescript
+
+ /**
+ * Thrown when the driver attempts to check out a
+ * Connection from a closed Connection Pool
+ */
+ interface PoolClosedError {
+ message: 'Attempted to check out a Connection from closed connection pool';
+ address: ;
+ }
+
+ /**
+ * Thrown when the driver attempts to check out a
+ * Connection from a paused Connection Pool
+ */
+ interface PoolClearedError extends RetryableError {
+ message: 'Connection pool for was cleared because another operation failed with: ';
+ address: ;
+ }
+
+ /**
+ * Thrown when a driver times out when attempting to check out
+ * a Connection from a Pool
+ */
+ interface WaitQueueTimeoutError {
+ message: 'Timed out while checking out a Connection from connection pool';
+ address: ;
+ }
+
+Test Plan
+=========
+
+See `tests/README.rst `_
+
+Design Rationale
+================
+
+Why do we set minPoolSize across all members of a replicaSet, when most traffic will be against a Primary?
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Currently, we are attempting to codify our current pooling behavior with minimal changes, and minPoolSize is currently uniform across all members of a replicaSet. This has the benefit of offsetting connection swarming during a Primary Step-Down, which will be further addressed in our `Advanced Pooling Behaviors <#advanced-pooling-behaviors>`__.
+
+Why do we have separate ConnectionCreated and ConnectionReady events, but only one ConnectionClosed event?
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ConnectionCreated and ConnectionReady each involve different state changes in the pool.
+
+- ConnectionCreated adds a new “pending” `Connection <#connection>`_, meaning
+ the totalConnectionCount and pendingConnectionCount increase by one
+- ConnectionReady establishes that the `Connection <#connection>`_ is ready for use, meaning the availableConnectionCount increases by one
+
+ConnectionClosed indicates that the `Connection <#connection>`_ is no longer a member of the pool, decrementing totalConnectionCount and potentially availableConnectionCount. After this point, the `Connection <#connection>`_ is no longer a part of the pool. Further hypothetical events would not indicate a change to the state of the pool, so they are not specified here.
+
+Why are waitQueueSize and waitQueueMultiple deprecated?
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+These options were originally only implemented in three drivers (Java, C#, and Python), and provided little value. While these fields would allow for faster diagnosis of issues in the connection pool, they would not actually prevent an error from occurring.
+
+Additionally, these options have the effect of prioritizing older requests over newer requests, which is not necessarily the behavior that users want. They can also result in cases where queue access oscillates back and forth between full and not full. If a driver has a full waitQueue, then all requests for `Connections <#connection>`_ will be rejected. If the client is continually spammed with requests, you could wind up with a scenario where as soon as the waitQueue is no longer full, it is immediately filled. It is not a favorable situation to be in, partially b/c it violates the fairness guarantee that the waitQueue normally provides.
+
+Because of these issues, it does not make sense to `go against driver mantras and provide an additional knob <../../README.rst#>`__. We may eventually pursue an alternative configurations to address wait queue size in `Advanced Pooling Behaviors <#advanced-pooling-behaviors>`__.
+
+Users that wish to have this functionality can achieve similar results by utilizing other methods to limit concurrency. Examples include implementing either a thread pool or an operation queue with a capped size in the user application. Drivers that need to deprecate ``waitQueueSize`` and/or ``waitQueueMultiple`` SHOULD refer users to these examples.
+
+Why is waitQueueTimeoutMS optional for some drivers?
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+We are anticipating eventually introducing a single client-side timeout mechanism, making us hesitant to introduce another granular timeout control. Therefore, if a driver/language already has an idiomatic way to implement their timeouts, they should leverage that mechanism over implementing waitQueueTimeoutMS.
+
+Why must populating the pool require the use of a background thread or async I/O?
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Without the use of a background thread, the pool is `populated
+<#populating-the-pool-with-a-connection-internal-implementation>`_ with enough
+connections to satisfy minPoolSize during checkOut. `Connections <#connection>`_
+are established as part of populating the pool though, so if `Connection
+<#connection>`_ establishment were done in a blocking fashion, the first
+operations after a clearing of the pool would experience unacceptably high
+latency, especially for larger values of minPoolSize. Thus, populating the pool
+must occur on a background thread (which is acceptable to block) or via the
+usage of non-blocking (async) I/O.
+
+Why should closing a connection be non-blocking?
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Because idle and perished `Connections <#connection>`_ are cleaned up as part of
+checkOut, performing blocking I/O while closing such `Connections <#connection>`_
+would block application threads, introducing unnecessary latency. Once
+a `Connection <#connection>`_ is marked as "closed", it will not be checked out
+again, so ensuring the socket is torn down does not need to happen
+immediately and can happen at a later time, either via async I/O or a
+background thread.
+
+Why can the pool be paused?
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The distinction between the "paused" state and the "ready" state allows the pool
+to determine whether or not the endpoint it is associated with is available or
+not. This enables the following behaviors:
+
+1. The pool can halt the creation of background connection establishments until
+ the endpoint becomes available again. Without the "paused" state, the pool
+ would have no way of determining when to begin establishing background
+ connections again, so it would just continually attempt, and often fail, to
+ create connections until minPoolSize was satisfied, even after repeated
+ failures. This could unnecessarily waste resources both server and driver side.
+
+2. The pool can evict requests that enter the WaitQueue after the pool was
+ cleared but before the server was in a known state again. Such requests can
+ occur when a server is selected at the same time as it becomes marked as
+ Unknown in highly concurrent workloads. Without the "paused" state, the pool
+ would attempt to service these requests, since it would assume they were
+ routed to the pool because its endpoint was available, not because of a race
+ between SDAM and Server Selection. These requests would then likely fail with
+ potentially high latency, again wasting resources both server and driver side.
+
+Why not emit PoolCleared events and log messages when clearing a paused pool?
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+If a pool is already paused when it is cleared, that means it was previously
+cleared and no new connections have been created since then. Thus, clearing the
+pool in this case is essentially a no-op, so there is no need to notify any
+listeners that it has occurred. The generation is still incremented, however, to
+ensure future errors that caused the duplicate clear will stop attempting to
+clear the pool again. This situation is possible if the pool is cleared by the
+background thread after it encounters an error establishing a connection, but
+the ServerDescription for the endpoint was not updated accordingly yet.
+
+Why does the pool need to support interrupting in use connections as part of its clear logic?
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+If a SDAM monitor has observed a network timeout, we assume that all connections
+including "in use" connections are no longer healthy. In some cases connections
+will fail to detect the network timeout fast enough. For example, a server request
+can hang at the OS level in TCP retry loop up for 17 minutes before failing. Therefore
+these connections MUST be proactively interrupted in the case of a server monitor network timeout.
+Requesting an immediate backround thread run will speed up this process.
+
+Why don't we configure TCP_USER_TIMEOUT?
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Ideally, a reasonable TCP_USER_TIMEOUT can help with detecting stale connections as an
+alternative to `interruptInUseConnections` in Clear.
+Unfortunately this approach is platform dependent and not each driver allows easily configuring it.
+For example, C# driver can configure this socket option on linux only with target frameworks
+higher or equal to .net 5.0. On macOS, there is no straight equavalent for this option,
+it's possible that we can find some equavalent configuration, but this configuration will also
+require target frameworks higher than or equal to .net 5.0. The advantage of using Background Thread to
+manage perished connections is that it will work regardless of environment setup.
+
+Backwards Compatibility
+=======================
+
+As mentioned in `Deprecated Options <#deprecated-options>`__, some drivers currently implement the options ``waitQueueSize`` and/or ``waitQueueMultiple``. These options will need to be deprecated and phased out of the drivers that have implemented them.
+
+
+Reference Implementations
+=========================
+
+- JAVA (JAVA-3079)
+- RUBY (RUBY-1560)
+
+Future Development
+==================
+
+SDAM
+~~~~
+
+This specification does not dictate how SDAM Monitoring connections are managed. SDAM specifies that “A monitor SHOULD NOT use the client's regular Connection pool”. Some possible solutions for this include:
+
+- Having each Endpoint representation in the driver create and manage a separate dedicated `Connection <#connection>`_ for monitoring purposes
+- Having each Endpoint representation in the driver maintain a separate pool of maxPoolSize 1 for monitoring purposes.
+- Having each Pool maintain a dedicated `Connection <#connection>`_ for monitoring purposes, with an API to expose that Connection.
+
+Advanced Pooling Behaviors
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+This spec does not address all advanced pooling behaviors like predictive pooling or aggressive `Connection <#connection>`_ creation. Future work may address this.
+
+Add support for OP_MSG exhaustAllowed
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Exhaust Cursors may require changes to how we close `Connections <#connection>`_ in the future, specifically to add a way to close and remove from its pool a `Connection <#connection>`_ which has unread exhaust messages.
+
+
+Changelog
+=========
+
+:2019-06-06: Add "connectionError" as a valid reason for ConnectionCheckOutFailedEvent
+:2020-09-03: Clarify Connection states and definition. Require the use of a
+ background thread and/or async I/O. Add tests to ensure
+ ConnectionReadyEvents are fired after ConnectionCreatedEvents.
+:2020-09-24: Introduce maxConnecting requirement
+:2020-12-17: Introduce "paused" and "ready" states. Clear WaitQueue on pool clear.
+:2021-01-12: Clarify "clear" method behavior in load balancer mode.
+:2021-01-19: Require that timeouts be applied per the client-side operations
+ timeout specification.
+:2021-04-12: Adding in behaviour for load balancer mode.
+:2021-06-02: Formalize the behavior of a `Background Thread <#background-thread>`__.
+:2021-11-08: Make maxConnecting configurable.
+:2022-04-05: Preemptively cancel in progress operations when SDAM heartbeats timeout.
+:2022-10-05: Remove spec front matter and reformat changelog.
+:2022-10-14: Add connection pool log messages and associated tests.
+
+----
+
+.. Section for links.
+
+.. _Application Errors: /source/server-discovery-and-monitoring/server-discovery-and-monitoring.rst#application-errors
+.. _Connection Pool Management: /source/server-discovery-and-monitoring/server-discovery-and-monitoring.rst#connection-pool-management
diff --git a/specifications/connection-monitoring-and-pooling/tests/README.rst b/specifications/connection-monitoring-and-pooling/tests/README.rst
new file mode 100644
index 00000000000..ae4af543f20
--- /dev/null
+++ b/specifications/connection-monitoring-and-pooling/tests/README.rst
@@ -0,0 +1,36 @@
+.. role:: javascript(code)
+ :language: javascript
+
+========================================
+Connection Monitoring and Pooling (CMAP)
+========================================
+
+.. contents::
+
+--------
+
+Introduction
+============
+Drivers MUST implement all of the following types of CMAP tests:
+
+* Pool unit and integration tests as described in `cmap-format/README.rst <./cmap-format/README.rst>`__
+* Pool prose tests as described below in `Prose Tests`_
+* Logging tests as described below in `Logging Tests`_
+
+Prose Tests
+===========
+
+The following tests have not yet been automated, but MUST still be tested:
+
+#. All ConnectionPoolOptions MUST be specified at the MongoClient level
+#. All ConnectionPoolOptions MUST be the same for all pools created by a MongoClient
+#. A user MUST be able to specify all ConnectionPoolOptions via a URI string
+#. A user MUST be able to subscribe to Connection Monitoring Events in a manner idiomatic to their language and driver
+#. When a check out attempt fails because connection set up throws an error,
+ assert that a ConnectionCheckOutFailedEvent with reason="connectionError" is emitted.
+
+Logging Tests
+=============
+
+Tests for connection pool logging can be found in the `/logging <./logging>`__ subdirectory and are written in the
+`Unified Test Format <../../unified-test-format/unified-test-format.rst>`__.
\ No newline at end of file
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/README.rst b/specifications/connection-monitoring-and-pooling/tests/cmap-format/README.rst
similarity index 89%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/README.rst
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/README.rst
index 85c6232955f..5bb72dd0fe6 100644
--- a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/README.rst
+++ b/specifications/connection-monitoring-and-pooling/tests/cmap-format/README.rst
@@ -1,9 +1,9 @@
.. role:: javascript(code)
:language: javascript
-========================================
-Connection Monitoring and Pooling (CMAP)
-========================================
+===================================================================
+Connection Monitoring and Pooling (CMAP) Unit and Integration Tests
+===================================================================
.. contents::
@@ -15,9 +15,6 @@ Introduction
The YAML and JSON files in this directory are platform-independent tests that
drivers can use to prove their conformance to the Connection Monitoring and Pooling (CMAP) Spec.
-Several prose tests, which are not easily expressed in YAML, are also presented
-in this file. Those tests will need to be manually implemented by each driver.
-
Common Test Format
==================
@@ -101,7 +98,7 @@ Valid Unit Test Operations are the following:
- ``pool.clear()``: call ``clear`` on Pool
- - ``closeInUseConnections``: Determines whether "in use" connections should be also closed
+ - ``interruptInUseConnections``: Determines whether "in use" connections should be also interrupted
- ``pool.close()``: call ``close`` on Pool
- ``pool.ready()``: call ``ready`` on Pool
@@ -216,16 +213,3 @@ unit tests with the following modifications:
configureFailPoint: ,
mode: "off"
});
-
-
-Prose Tests
-===========
-
-The following tests have not yet been automated, but MUST still be tested
-
-#. All ConnectionPoolOptions MUST be specified at the MongoClient level
-#. All ConnectionPoolOptions MUST be the same for all pools created by a MongoClient
-#. A user MUST be able to specify all ConnectionPoolOptions via a URI string
-#. A user MUST be able to subscribe to Connection Monitoring Events in a manner idiomatic to their language and driver
-#. When a check out attempt fails because connection set up throws an error,
- assert that a ConnectionCheckOutFailedEvent with reason="connectionError" is emitted.
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/connection-must-have-id.json b/specifications/connection-monitoring-and-pooling/tests/cmap-format/connection-must-have-id.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/connection-must-have-id.json
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/connection-must-have-id.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/connection-must-have-id.yml b/specifications/connection-monitoring-and-pooling/tests/cmap-format/connection-must-have-id.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/connection-must-have-id.yml
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/connection-must-have-id.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/connection-must-order-ids.json b/specifications/connection-monitoring-and-pooling/tests/cmap-format/connection-must-order-ids.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/connection-must-order-ids.json
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/connection-must-order-ids.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/connection-must-order-ids.yml b/specifications/connection-monitoring-and-pooling/tests/cmap-format/connection-must-order-ids.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/connection-must-order-ids.yml
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/connection-must-order-ids.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-checkin-destroy-closed.json b/specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-checkin-destroy-closed.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-checkin-destroy-closed.json
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-checkin-destroy-closed.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-checkin-destroy-closed.yml b/specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-checkin-destroy-closed.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-checkin-destroy-closed.yml
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-checkin-destroy-closed.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-checkin-destroy-stale.json b/specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-checkin-destroy-stale.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-checkin-destroy-stale.json
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-checkin-destroy-stale.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-checkin-destroy-stale.yml b/specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-checkin-destroy-stale.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-checkin-destroy-stale.yml
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-checkin-destroy-stale.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-checkin-make-available.json b/specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-checkin-make-available.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-checkin-make-available.json
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-checkin-make-available.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-checkin-make-available.yml b/specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-checkin-make-available.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-checkin-make-available.yml
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-checkin-make-available.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-checkin.json b/specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-checkin.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-checkin.json
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-checkin.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-checkin.yml b/specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-checkin.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-checkin.yml
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-checkin.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-checkout-connection.json b/specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-checkout-connection.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-checkout-connection.json
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-checkout-connection.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-checkout-connection.yml b/specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-checkout-connection.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-checkout-connection.yml
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-checkout-connection.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-checkout-custom-maxConnecting-is-enforced.json b/specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-checkout-custom-maxConnecting-is-enforced.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-checkout-custom-maxConnecting-is-enforced.json
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-checkout-custom-maxConnecting-is-enforced.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-checkout-custom-maxConnecting-is-enforced.yml b/specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-checkout-custom-maxConnecting-is-enforced.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-checkout-custom-maxConnecting-is-enforced.yml
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-checkout-custom-maxConnecting-is-enforced.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-checkout-error-closed.json b/specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-checkout-error-closed.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-checkout-error-closed.json
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-checkout-error-closed.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-checkout-error-closed.yml b/specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-checkout-error-closed.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-checkout-error-closed.yml
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-checkout-error-closed.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-checkout-maxConnecting-is-enforced.json b/specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-checkout-maxConnecting-is-enforced.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-checkout-maxConnecting-is-enforced.json
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-checkout-maxConnecting-is-enforced.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-checkout-maxConnecting-is-enforced.yml b/specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-checkout-maxConnecting-is-enforced.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-checkout-maxConnecting-is-enforced.yml
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-checkout-maxConnecting-is-enforced.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-checkout-maxConnecting-timeout.json b/specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-checkout-maxConnecting-timeout.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-checkout-maxConnecting-timeout.json
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-checkout-maxConnecting-timeout.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-checkout-maxConnecting-timeout.yml b/specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-checkout-maxConnecting-timeout.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-checkout-maxConnecting-timeout.yml
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-checkout-maxConnecting-timeout.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-checkout-multiple.json b/specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-checkout-multiple.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-checkout-multiple.json
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-checkout-multiple.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-checkout-multiple.yml b/specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-checkout-multiple.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-checkout-multiple.yml
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-checkout-multiple.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-checkout-no-idle.json b/specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-checkout-no-idle.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-checkout-no-idle.json
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-checkout-no-idle.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-checkout-no-idle.yml b/specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-checkout-no-idle.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-checkout-no-idle.yml
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-checkout-no-idle.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-checkout-no-stale.json b/specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-checkout-no-stale.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-checkout-no-stale.json
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-checkout-no-stale.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-checkout-no-stale.yml b/specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-checkout-no-stale.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-checkout-no-stale.yml
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-checkout-no-stale.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-checkout-returned-connection-maxConnecting.json b/specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-checkout-returned-connection-maxConnecting.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-checkout-returned-connection-maxConnecting.json
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-checkout-returned-connection-maxConnecting.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-checkout-returned-connection-maxConnecting.yml b/specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-checkout-returned-connection-maxConnecting.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-checkout-returned-connection-maxConnecting.yml
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-checkout-returned-connection-maxConnecting.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-clear-clears-waitqueue.json b/specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-clear-clears-waitqueue.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-clear-clears-waitqueue.json
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-clear-clears-waitqueue.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-clear-clears-waitqueue.yml b/specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-clear-clears-waitqueue.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-clear-clears-waitqueue.yml
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-clear-clears-waitqueue.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-clear-close-in-use.json b/specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-clear-close-in-use.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-clear-close-in-use.json
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-clear-close-in-use.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-clear-close-in-use.yml b/specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-clear-close-in-use.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-clear-close-in-use.yml
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-clear-close-in-use.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-clear-min-size.json b/specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-clear-min-size.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-clear-min-size.json
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-clear-min-size.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-clear-min-size.yml b/specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-clear-min-size.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-clear-min-size.yml
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-clear-min-size.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-clear-paused.json b/specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-clear-paused.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-clear-paused.json
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-clear-paused.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-clear-paused.yml b/specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-clear-paused.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-clear-paused.yml
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-clear-paused.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-clear-ready.json b/specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-clear-ready.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-clear-ready.json
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-clear-ready.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-clear-ready.yml b/specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-clear-ready.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-clear-ready.yml
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-clear-ready.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-clear-schedule-run-closeInUseConnections-false.json b/specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-clear-schedule-run-closeInUseConnections-false.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-clear-schedule-run-closeInUseConnections-false.json
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-clear-schedule-run-closeInUseConnections-false.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-clear-schedule-run-closeInUseConnections-false.yml b/specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-clear-schedule-run-closeInUseConnections-false.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-clear-schedule-run-closeInUseConnections-false.yml
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-clear-schedule-run-closeInUseConnections-false.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-clear-schedule-run.json b/specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-clear-schedule-run.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-clear-schedule-run.json
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-clear-schedule-run.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-clear-schedule-run.yml b/specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-clear-schedule-run.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-clear-schedule-run.yml
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-clear-schedule-run.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-close-destroy-conns.json b/specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-close-destroy-conns.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-close-destroy-conns.json
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-close-destroy-conns.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-close-destroy-conns.yml b/specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-close-destroy-conns.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-close-destroy-conns.yml
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-close-destroy-conns.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-close.json b/specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-close.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-close.json
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-close.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-close.yml b/specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-close.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-close.yml
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-close.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-create-max-size.json b/specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-create-max-size.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-create-max-size.json
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-create-max-size.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-create-max-size.yml b/specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-create-max-size.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-create-max-size.yml
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-create-max-size.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-create-min-size-error.json b/specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-create-min-size-error.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-create-min-size-error.json
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-create-min-size-error.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-create-min-size-error.yml b/specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-create-min-size-error.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-create-min-size-error.yml
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-create-min-size-error.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-create-min-size.json b/specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-create-min-size.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-create-min-size.json
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-create-min-size.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-create-min-size.yml b/specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-create-min-size.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-create-min-size.yml
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-create-min-size.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-create-with-options.json b/specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-create-with-options.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-create-with-options.json
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-create-with-options.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-create-with-options.yml b/specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-create-with-options.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-create-with-options.yml
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-create-with-options.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-create.json b/specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-create.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-create.json
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-create.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-create.yml b/specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-create.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-create.yml
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-create.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-ready-ready.json b/specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-ready-ready.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-ready-ready.json
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-ready-ready.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-ready-ready.yml b/specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-ready-ready.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-ready-ready.yml
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-ready-ready.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-ready.json b/specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-ready.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-ready.json
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-ready.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-ready.yml b/specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-ready.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/pool-ready.yml
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/pool-ready.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/wait-queue-fairness.json b/specifications/connection-monitoring-and-pooling/tests/cmap-format/wait-queue-fairness.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/wait-queue-fairness.json
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/wait-queue-fairness.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/wait-queue-fairness.yml b/specifications/connection-monitoring-and-pooling/tests/cmap-format/wait-queue-fairness.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/wait-queue-fairness.yml
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/wait-queue-fairness.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/wait-queue-timeout.json b/specifications/connection-monitoring-and-pooling/tests/cmap-format/wait-queue-timeout.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/wait-queue-timeout.json
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/wait-queue-timeout.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/wait-queue-timeout.yml b/specifications/connection-monitoring-and-pooling/tests/cmap-format/wait-queue-timeout.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-monitoring-and-pooling/tests/wait-queue-timeout.yml
rename to specifications/connection-monitoring-and-pooling/tests/cmap-format/wait-queue-timeout.yml
diff --git a/specifications/connection-monitoring-and-pooling/tests/logging/connection-logging.json b/specifications/connection-monitoring-and-pooling/tests/logging/connection-logging.json
new file mode 100644
index 00000000000..c1e25f92b3f
--- /dev/null
+++ b/specifications/connection-monitoring-and-pooling/tests/logging/connection-logging.json
@@ -0,0 +1,432 @@
+{
+ "description": "connection-logging",
+ "schemaVersion": "1.13",
+ "runOnRequirements": [
+ {
+ "topologies": [
+ "single"
+ ]
+ }
+ ],
+ "createEntities": [
+ {
+ "client": {
+ "id": "failPointClient"
+ }
+ }
+ ],
+ "tests": [
+ {
+ "description": "Create a client, run a command, and close the client",
+ "operations": [
+ {
+ "name": "createEntities",
+ "object": "testRunner",
+ "arguments": {
+ "entities": [
+ {
+ "client": {
+ "id": "client",
+ "observeLogMessages": {
+ "connection": "debug"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "name": "listDatabases",
+ "object": "client",
+ "arguments": {
+ "filter": {}
+ }
+ },
+ {
+ "name": "close",
+ "object": "client"
+ }
+ ],
+ "expectLogMessages": [
+ {
+ "client": "client",
+ "messages": [
+ {
+ "level": "debug",
+ "component": "connection",
+ "data": {
+ "message": "Connection pool created",
+ "serverHost": {
+ "$$type": "string"
+ },
+ "serverPort": {
+ "$$type": [
+ "int",
+ "long"
+ ]
+ }
+ }
+ },
+ {
+ "level": "debug",
+ "component": "connection",
+ "data": {
+ "message": "Connection pool ready",
+ "serverHost": {
+ "$$type": "string"
+ },
+ "serverPort": {
+ "$$type": [
+ "int",
+ "long"
+ ]
+ }
+ }
+ },
+ {
+ "level": "debug",
+ "component": "connection",
+ "data": {
+ "message": "Connection checkout started",
+ "serverHost": {
+ "$$type": "string"
+ },
+ "serverPort": {
+ "$$type": [
+ "int",
+ "long"
+ ]
+ }
+ }
+ },
+ {
+ "level": "debug",
+ "component": "connection",
+ "data": {
+ "message": "Connection created",
+ "driverConnectionId": {
+ "$$type": [
+ "int",
+ "long"
+ ]
+ },
+ "serverHost": {
+ "$$type": "string"
+ },
+ "serverPort": {
+ "$$type": [
+ "int",
+ "long"
+ ]
+ }
+ }
+ },
+ {
+ "level": "debug",
+ "component": "connection",
+ "data": {
+ "message": "Connection ready",
+ "driverConnectionId": {
+ "$$type": [
+ "int",
+ "long"
+ ]
+ },
+ "serverHost": {
+ "$$type": "string"
+ },
+ "serverPort": {
+ "$$type": [
+ "int",
+ "long"
+ ]
+ }
+ }
+ },
+ {
+ "level": "debug",
+ "component": "connection",
+ "data": {
+ "message": "Connection checked out",
+ "driverConnectionId": {
+ "$$type": [
+ "int",
+ "long"
+ ]
+ },
+ "serverHost": {
+ "$$type": "string"
+ },
+ "serverPort": {
+ "$$type": [
+ "int",
+ "long"
+ ]
+ }
+ }
+ },
+ {
+ "level": "debug",
+ "component": "connection",
+ "data": {
+ "message": "Connection checked in",
+ "driverConnectionId": {
+ "$$type": [
+ "int",
+ "long"
+ ]
+ },
+ "serverHost": {
+ "$$type": "string"
+ },
+ "serverPort": {
+ "$$type": [
+ "int",
+ "long"
+ ]
+ }
+ }
+ },
+ {
+ "level": "debug",
+ "component": "connection",
+ "data": {
+ "message": "Connection closed",
+ "driverConnectionId": {
+ "$$type": [
+ "int",
+ "long"
+ ]
+ },
+ "serverHost": {
+ "$$type": "string"
+ },
+ "serverPort": {
+ "$$type": [
+ "int",
+ "long"
+ ]
+ },
+ "reason": "Unknown"
+ }
+ },
+ {
+ "level": "debug",
+ "component": "connection",
+ "data": {
+ "message": "Connection pool closed",
+ "serverHost": {
+ "$$type": "string"
+ },
+ "serverPort": {
+ "$$type": [
+ "int",
+ "long"
+ ]
+ }
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "Connection checkout fails due to error establishing connection",
+ "runOnRequirements": [
+ {
+ "auth": true,
+ "minServerVersion": "4.0"
+ }
+ ],
+ "operations": [
+ {
+ "name": "createEntities",
+ "object": "testRunner",
+ "arguments": {
+ "entities": [
+ {
+ "client": {
+ "id": "client",
+ "uriOptions": {
+ "retryReads": false,
+ "appname": "clientAppName",
+ "heartbeatFrequencyMS": 10000
+ },
+ "observeLogMessages": {
+ "connection": "debug"
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "failPointClient",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 1
+ },
+ "data": {
+ "failCommands": [
+ "saslContinue"
+ ],
+ "closeConnection": true,
+ "appName": "clientAppName"
+ }
+ }
+ }
+ },
+ {
+ "name": "listDatabases",
+ "object": "client",
+ "arguments": {
+ "filter": {}
+ },
+ "expectError": {
+ "isClientError": true
+ }
+ }
+ ],
+ "expectLogMessages": [
+ {
+ "client": "client",
+ "messages": [
+ {
+ "level": "debug",
+ "component": "connection",
+ "data": {
+ "message": "Connection pool created",
+ "serverHost": {
+ "$$type": "string"
+ },
+ "serverPort": {
+ "$$type": [
+ "int",
+ "long"
+ ]
+ }
+ }
+ },
+ {
+ "level": "debug",
+ "component": "connection",
+ "data": {
+ "message": "Connection pool ready",
+ "serverHost": {
+ "$$type": "string"
+ },
+ "serverPort": {
+ "$$type": [
+ "int",
+ "long"
+ ]
+ }
+ }
+ },
+ {
+ "level": "debug",
+ "component": "connection",
+ "data": {
+ "message": "Connection checkout started",
+ "serverHost": {
+ "$$type": "string"
+ },
+ "serverPort": {
+ "$$type": [
+ "int",
+ "long"
+ ]
+ }
+ }
+ },
+ {
+ "level": "debug",
+ "component": "connection",
+ "data": {
+ "message": "Connection created",
+ "driverConnectionId": {
+ "$$type": [
+ "int",
+ "long"
+ ]
+ },
+ "serverHost": {
+ "$$type": "string"
+ },
+ "serverPort": {
+ "$$type": [
+ "int",
+ "long"
+ ]
+ }
+ }
+ },
+ {
+ "level": "debug",
+ "component": "connection",
+ "data": {
+ "message": "Connection pool cleared",
+ "serverHost": {
+ "$$type": "string"
+ },
+ "serverPort": {
+ "$$type": [
+ "int",
+ "long"
+ ]
+ }
+ }
+ },
+ {
+ "level": "debug",
+ "component": "connection",
+ "data": {
+ "message": "Connection closed",
+ "driverConnectionId": {
+ "$$type": [
+ "int",
+ "long"
+ ]
+ },
+ "serverHost": {
+ "$$type": "string"
+ },
+ "serverPort": {
+ "$$type": [
+ "int",
+ "long"
+ ]
+ },
+ "reason": "Unknown"
+ }
+ },
+ {
+ "level": "debug",
+ "component": "connection",
+ "data": {
+ "message": "Connection checkout failed",
+ "serverHost": {
+ "$$type": "string"
+ },
+ "serverPort": {
+ "$$type": [
+ "int",
+ "long"
+ ]
+ },
+ "reason": "An error occurred while trying to establish a new connection",
+ "error": {
+ "$$exists": true
+ }
+ }
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/specifications/connection-monitoring-and-pooling/tests/logging/connection-logging.yml b/specifications/connection-monitoring-and-pooling/tests/logging/connection-logging.yml
new file mode 100644
index 00000000000..58ac7ec3413
--- /dev/null
+++ b/specifications/connection-monitoring-and-pooling/tests/logging/connection-logging.yml
@@ -0,0 +1,196 @@
+description: "connection-logging"
+
+schemaVersion: "1.13"
+
+runOnRequirements:
+ - topologies:
+ - single # The number of log messages is different for each topology since there is a connection pool per host.
+
+createEntities:
+ - client:
+ id: &failPointClient failPointClient
+
+tests:
+ - description: "Create a client, run a command, and close the client"
+ operations:
+ - name: createEntities
+ object: testRunner
+ arguments:
+ entities:
+ - client:
+ id: &client client
+ observeLogMessages:
+ connection: debug
+ - name: listDatabases
+ object: *client
+ arguments:
+ filter: {}
+ - name: close
+ object: *client
+ expectLogMessages:
+ - client: *client
+ messages:
+ - level: debug
+ component: connection
+ data:
+ message: "Connection pool created"
+ serverHost: { $$type: string }
+ serverPort: { $$type: [int, long] }
+
+ - level: debug
+ component: connection
+ data:
+ message: "Connection pool ready"
+ serverHost: { $$type: string }
+ serverPort: { $$type: [int, long] }
+
+ - level: debug
+ component: connection
+ data:
+ message: "Connection checkout started"
+ serverHost: { $$type: string }
+ serverPort: { $$type: [int, long] }
+
+ - level: debug
+ component: connection
+ data:
+ message: "Connection created"
+ driverConnectionId: { $$type: [int, long] }
+ serverHost: { $$type: string }
+ serverPort: { $$type: [int, long] }
+
+ - level: debug
+ component: connection
+ data:
+ message: "Connection ready"
+ driverConnectionId: { $$type: [int, long] }
+ serverHost: { $$type: string }
+ serverPort: { $$type: [int, long] }
+
+ - level: debug
+ component: connection
+ data:
+ message: "Connection checked out"
+ driverConnectionId: { $$type: [int, long] }
+ serverHost: { $$type: string }
+ serverPort: { $$type: [int, long] }
+
+ - level: debug
+ component: connection
+ data:
+ message: "Connection checked in"
+ driverConnectionId: { $$type: [int, long] }
+ serverHost: { $$type: string }
+ serverPort: { $$type: [int, long] }
+
+ - level: debug
+ component: connection
+ data:
+ message: "Connection closed"
+ driverConnectionId: { $$type: [int, long] }
+ serverHost: { $$type: string }
+ serverPort: { $$type: [int, long] }
+ reason: "Connection pool was closed"
+
+ - level: debug
+ component: connection
+ data:
+ message: "Connection pool closed"
+ serverHost: { $$type: string }
+ serverPort: { $$type: [int, long] }
+
+ # This test exists to provide coverage of checkout failed and pool cleared events.
+ - description: "Connection checkout fails due to error establishing connection"
+ runOnRequirements:
+ - auth: true
+ minServerVersion: "4.0" # failCommand was added to mongod in 4.0
+ operations:
+ - name: createEntities
+ object: testRunner
+ arguments:
+ entities:
+ - client:
+ id: &client client
+ uriOptions:
+ retryReads: false
+ appname: &clientAppName clientAppName
+ # use a high heartbeatFrequencyMS to avoid a successful monitor check marking the pool as
+ # ready (and emitting another event) during the course of test execution.
+ heartbeatFrequencyMS: 10000
+ observeLogMessages:
+ connection: debug
+ - name: failPoint
+ object: testRunner
+ arguments:
+ client: *failPointClient
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 1 }
+ data:
+ failCommands: ["saslContinue"]
+ closeConnection: true
+ appName: *clientAppName
+ - name: listDatabases
+ object: *client
+ arguments:
+ filter: {}
+ expectError:
+ isClientError: true
+
+ expectLogMessages:
+ - client: *client
+ messages:
+ - level: debug
+ component: connection
+ data:
+ message: "Connection pool created"
+ serverHost: { $$type: string }
+ serverPort: { $$type: [int, long] }
+
+ - level: debug
+ component: connection
+ data:
+ message: "Connection pool ready"
+ serverHost: { $$type: string }
+ serverPort: { $$type: [int, long] }
+
+ - level: debug
+ component: connection
+ data:
+ message: "Connection checkout started"
+ serverHost: { $$type: string }
+ serverPort: { $$type: [int, long] }
+
+ - level: debug
+ component: connection
+ data:
+ message: "Connection created"
+ driverConnectionId: { $$type: [int, long] }
+ serverHost: { $$type: string }
+ serverPort: { $$type: [int, long] }
+
+ - level: debug
+ component: connection
+ data:
+ message: "Connection pool cleared"
+ serverHost: { $$type: string }
+ serverPort: { $$type: [int, long] }
+
+ - level: debug
+ component: connection
+ data:
+ message: "Connection closed"
+ driverConnectionId: { $$type: [int, long] }
+ serverHost: { $$type: string }
+ serverPort: { $$type: [int, long] }
+ reason: "An error occurred while using the connection"
+ error: { $$exists: true }
+
+ - level: debug
+ component: connection
+ data:
+ message: "Connection checkout failed"
+ serverHost: { $$type: string }
+ serverPort: { $$type: [int, long] }
+ reason: "An error occurred while trying to establish a new connection"
+ error: { $$exists: true }
diff --git a/specifications/connection-monitoring-and-pooling/tests/logging/connection-pool-options.json b/specifications/connection-monitoring-and-pooling/tests/logging/connection-pool-options.json
new file mode 100644
index 00000000000..e67804915c3
--- /dev/null
+++ b/specifications/connection-monitoring-and-pooling/tests/logging/connection-pool-options.json
@@ -0,0 +1,451 @@
+{
+ "description": "connection-logging",
+ "schemaVersion": "1.13",
+ "runOnRequirements": [
+ {
+ "topologies": [
+ "single"
+ ]
+ }
+ ],
+ "tests": [
+ {
+ "description": "Options should be included in connection pool created message when specified",
+ "operations": [
+ {
+ "name": "createEntities",
+ "object": "testRunner",
+ "arguments": {
+ "entities": [
+ {
+ "client": {
+ "id": "client",
+ "observeEvents": [
+ "connectionReadyEvent"
+ ],
+ "observeLogMessages": {
+ "connection": "debug"
+ },
+ "uriOptions": {
+ "minPoolSize": 1,
+ "maxPoolSize": 5,
+ "maxIdleTimeMS": 10000
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "name": "waitForEvent",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client",
+ "event": {
+ "connectionReadyEvent": {}
+ },
+ "count": 1
+ }
+ }
+ ],
+ "expectLogMessages": [
+ {
+ "client": "client",
+ "messages": [
+ {
+ "level": "debug",
+ "component": "connection",
+ "data": {
+ "message": "Connection pool created",
+ "serverHost": {
+ "$$type": "string"
+ },
+ "serverPort": {
+ "$$type": [
+ "int",
+ "long"
+ ]
+ },
+ "minPoolSize": 1,
+ "maxPoolSize": 5,
+ "maxIdleTimeMS": 10000
+ }
+ },
+ {
+ "level": "debug",
+ "component": "connection",
+ "data": {
+ "message": "Connection pool ready",
+ "serverHost": {
+ "$$type": "string"
+ },
+ "serverPort": {
+ "$$type": [
+ "int",
+ "long"
+ ]
+ }
+ }
+ },
+ {
+ "level": "debug",
+ "component": "connection",
+ "data": {
+ "message": "Connection created",
+ "driverConnectionId": {
+ "$$type": [
+ "int",
+ "long"
+ ]
+ },
+ "serverHost": {
+ "$$type": "string"
+ },
+ "serverPort": {
+ "$$type": [
+ "int",
+ "long"
+ ]
+ }
+ }
+ },
+ {
+ "level": "debug",
+ "component": "connection",
+ "data": {
+ "message": "Connection ready",
+ "driverConnectionId": {
+ "$$type": [
+ "int",
+ "long"
+ ]
+ },
+ "serverHost": {
+ "$$type": "string"
+ },
+ "serverPort": {
+ "$$type": [
+ "int",
+ "long"
+ ]
+ }
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "maxConnecting should be included in connection pool created message when specified",
+ "operations": [
+ {
+ "name": "createEntities",
+ "object": "testRunner",
+ "arguments": {
+ "entities": [
+ {
+ "client": {
+ "id": "client",
+ "observeEvents": [
+ "poolReadyEvent"
+ ],
+ "observeLogMessages": {
+ "connection": "debug"
+ },
+ "uriOptions": {
+ "maxConnecting": 5
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "name": "waitForEvent",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client",
+ "event": {
+ "poolReadyEvent": {}
+ },
+ "count": 1
+ }
+ }
+ ],
+ "expectLogMessages": [
+ {
+ "client": "client",
+ "messages": [
+ {
+ "level": "debug",
+ "component": "connection",
+ "data": {
+ "message": "Connection pool created",
+ "serverHost": {
+ "$$type": "string"
+ },
+ "serverPort": {
+ "$$type": [
+ "int",
+ "long"
+ ]
+ },
+ "maxConnecting": 5
+ }
+ },
+ {
+ "level": "debug",
+ "component": "connection",
+ "data": {
+ "message": "Connection pool ready",
+ "serverHost": {
+ "$$type": "string"
+ },
+ "serverPort": {
+ "$$type": [
+ "int",
+ "long"
+ ]
+ }
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "waitQueueTimeoutMS should be included in connection pool created message when specified",
+ "operations": [
+ {
+ "name": "createEntities",
+ "object": "testRunner",
+ "arguments": {
+ "entities": [
+ {
+ "client": {
+ "id": "client",
+ "observeEvents": [
+ "poolReadyEvent"
+ ],
+ "observeLogMessages": {
+ "connection": "debug"
+ },
+ "uriOptions": {
+ "waitQueueTimeoutMS": 10000
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "name": "waitForEvent",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client",
+ "event": {
+ "poolReadyEvent": {}
+ },
+ "count": 1
+ }
+ }
+ ],
+ "expectLogMessages": [
+ {
+ "client": "client",
+ "messages": [
+ {
+ "level": "debug",
+ "component": "connection",
+ "data": {
+ "message": "Connection pool created",
+ "serverHost": {
+ "$$type": "string"
+ },
+ "serverPort": {
+ "$$type": [
+ "int",
+ "long"
+ ]
+ },
+ "waitQueueTimeoutMS": 10000
+ }
+ },
+ {
+ "level": "debug",
+ "component": "connection",
+ "data": {
+ "message": "Connection pool ready",
+ "serverHost": {
+ "$$type": "string"
+ },
+ "serverPort": {
+ "$$type": [
+ "int",
+ "long"
+ ]
+ }
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "waitQueueSize should be included in connection pool created message when specified",
+ "operations": [
+ {
+ "name": "createEntities",
+ "object": "testRunner",
+ "arguments": {
+ "entities": [
+ {
+ "client": {
+ "id": "client",
+ "observeEvents": [
+ "poolReadyEvent"
+ ],
+ "observeLogMessages": {
+ "connection": "debug"
+ },
+ "uriOptions": {
+ "waitQueueSize": 100
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "name": "waitForEvent",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client",
+ "event": {
+ "poolReadyEvent": {}
+ },
+ "count": 1
+ }
+ }
+ ],
+ "expectLogMessages": [
+ {
+ "client": "client",
+ "messages": [
+ {
+ "level": "debug",
+ "component": "connection",
+ "data": {
+ "message": "Connection pool created",
+ "serverHost": {
+ "$$type": "string"
+ },
+ "serverPort": {
+ "$$type": [
+ "int",
+ "long"
+ ]
+ },
+ "waitQueueSize": 100
+ }
+ },
+ {
+ "level": "debug",
+ "component": "connection",
+ "data": {
+ "message": "Connection pool ready",
+ "serverHost": {
+ "$$type": "string"
+ },
+ "serverPort": {
+ "$$type": [
+ "int",
+ "long"
+ ]
+ }
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "waitQueueMultiple should be included in connection pool created message when specified",
+ "operations": [
+ {
+ "name": "createEntities",
+ "object": "testRunner",
+ "arguments": {
+ "entities": [
+ {
+ "client": {
+ "id": "client",
+ "observeEvents": [
+ "poolReadyEvent"
+ ],
+ "observeLogMessages": {
+ "connection": "debug"
+ },
+ "uriOptions": {
+ "waitQueueSize": 5
+ }
+ }
+ }
+ ]
+ }
+ },
+ {
+ "name": "waitForEvent",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client",
+ "event": {
+ "poolReadyEvent": {}
+ },
+ "count": 1
+ }
+ }
+ ],
+ "expectLogMessages": [
+ {
+ "client": "client",
+ "messages": [
+ {
+ "level": "debug",
+ "component": "connection",
+ "data": {
+ "message": "Connection pool created",
+ "serverHost": {
+ "$$type": "string"
+ },
+ "serverPort": {
+ "$$type": [
+ "int",
+ "long"
+ ]
+ },
+ "waitQueueMultiple": 5
+ }
+ },
+ {
+ "level": "debug",
+ "component": "connection",
+ "data": {
+ "message": "Connection pool ready",
+ "serverHost": {
+ "$$type": "string"
+ },
+ "serverPort": {
+ "$$type": [
+ "int",
+ "long"
+ ]
+ }
+ }
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/specifications/connection-monitoring-and-pooling/tests/logging/connection-pool-options.yml b/specifications/connection-monitoring-and-pooling/tests/logging/connection-pool-options.yml
new file mode 100644
index 00000000000..b22693a92b8
--- /dev/null
+++ b/specifications/connection-monitoring-and-pooling/tests/logging/connection-pool-options.yml
@@ -0,0 +1,253 @@
+description: "connection-logging"
+
+schemaVersion: "1.13"
+
+runOnRequirements:
+ - topologies:
+ - single # The number of log messages is different for each topology since there is a connection pool per host.
+
+tests:
+ - description: "Options should be included in connection pool created message when specified"
+ operations:
+ - name: createEntities
+ object: testRunner
+ arguments:
+ entities:
+ - client:
+ id: &client client
+ # Observe and wait on a connection ready event for the connection created in the background.
+ # This is to avoid raciness around whether the background thread has created the connection
+ # (and whether corresponding log messages have been generated) by the time log message assertions
+ # are made.
+ observeEvents:
+ - connectionReadyEvent
+ observeLogMessages:
+ connection: debug
+ uriOptions:
+ minPoolSize: 1
+ maxPoolSize: 5
+ maxIdleTimeMS: 10000
+
+ - name: waitForEvent
+ object: testRunner
+ arguments:
+ client: *client
+ event:
+ connectionReadyEvent: {}
+ count: 1
+
+ expectLogMessages:
+ - client: *client
+ messages:
+ - level: debug
+ component: connection
+ data:
+ message: "Connection pool created"
+ serverHost: { $$type: string }
+ serverPort: { $$type: [int, long] }
+ minPoolSize: 1
+ maxPoolSize: 5
+ maxIdleTimeMS: 10000
+
+ - level: debug
+ component: connection
+ data:
+ message: "Connection pool ready"
+ serverHost: { $$type: string }
+ serverPort: { $$type: [int, long] }
+
+ - level: debug
+ component: connection
+ data:
+ message: "Connection created"
+ driverConnectionId: { $$type: [int, long] }
+ serverHost: { $$type: string }
+ serverPort: { $$type: [int, long] }
+
+ - level: debug
+ component: connection
+ data:
+ message: "Connection ready"
+ driverConnectionId: { $$type: [int, long] }
+ serverHost: { $$type: string }
+ serverPort: { $$type: [int, long] }
+
+ # Drivers who have not done DRIVERS-1943 will need to skip this test.
+ - description: "maxConnecting should be included in connection pool created message when specified"
+ operations:
+ - name: createEntities
+ object: testRunner
+ arguments:
+ entities:
+ - client:
+ id: &client client
+ # Observe and wait for a poolReadyEvent so we can ensure the pool has been created and is
+ # ready by the time we assert on log messages, in order to avoid raciness around which messages
+ # are emitted.
+ observeEvents:
+ - poolReadyEvent
+ observeLogMessages:
+ connection: debug
+ uriOptions:
+ maxConnecting: 5
+
+ - name: waitForEvent
+ object: testRunner
+ arguments:
+ client: *client
+ event:
+ poolReadyEvent: {}
+ count: 1
+
+ expectLogMessages:
+ - client: *client
+ messages:
+ - level: debug
+ component: connection
+ data:
+ message: "Connection pool created"
+ serverHost: { $$type: string }
+ serverPort: { $$type: [int, long] }
+ maxConnecting: 5
+
+ - level: debug
+ component: connection
+ data:
+ message: "Connection pool ready"
+ serverHost: { $$type: string }
+ serverPort: { $$type: [int, long] }
+
+ # Drivers that do not support waitQueueTimeoutMS will need to skip this test.
+ - description: "waitQueueTimeoutMS should be included in connection pool created message when specified"
+ operations:
+ - name: createEntities
+ object: testRunner
+ arguments:
+ entities:
+ - client:
+ id: &client client
+ # Observe and wait for a poolReadyEvent so we can ensure the pool has been created and is
+ # ready by the time we assert on log messages, in order to avoid raciness around which messages
+ # are emitted.
+ observeEvents:
+ - poolReadyEvent
+ observeLogMessages:
+ connection: debug
+ uriOptions:
+ waitQueueTimeoutMS: 10000
+
+ - name: waitForEvent
+ object: testRunner
+ arguments:
+ client: *client
+ event:
+ poolReadyEvent: {}
+ count: 1
+
+ expectLogMessages:
+ - client: *client
+ messages:
+ - level: debug
+ component: connection
+ data:
+ message: "Connection pool created"
+ serverHost: { $$type: string }
+ serverPort: { $$type: [int, long] }
+ waitQueueTimeoutMS: 10000
+
+ - level: debug
+ component: connection
+ data:
+ message: "Connection pool ready"
+ serverHost: { $$type: string }
+ serverPort: { $$type: [int, long] }
+
+ # Drivers that do not support waitQueueSize will need to skip this test.
+ - description: "waitQueueSize should be included in connection pool created message when specified"
+ operations:
+ - name: createEntities
+ object: testRunner
+ arguments:
+ entities:
+ - client:
+ id: &client client
+ # Observe and wait for a poolReadyEvent so we can ensure the pool has been created and is
+ # ready by the time we assert on log messages, in order to avoid raciness around which messages
+ # are emitted.
+ observeEvents:
+ - poolReadyEvent
+ observeLogMessages:
+ connection: debug
+ uriOptions:
+ waitQueueSize: 100
+
+ - name: waitForEvent
+ object: testRunner
+ arguments:
+ client: *client
+ event:
+ poolReadyEvent: {}
+ count: 1
+
+ expectLogMessages:
+ - client: *client
+ messages:
+ - level: debug
+ component: connection
+ data:
+ message: "Connection pool created"
+ serverHost: { $$type: string }
+ serverPort: { $$type: [int, long] }
+ waitQueueSize: 100
+
+ - level: debug
+ component: connection
+ data:
+ message: "Connection pool ready"
+ serverHost: { $$type: string }
+ serverPort: { $$type: [int, long] }
+
+ # Drivers that do not support waitQueueMultiple will need to skip this test.
+ - description: "waitQueueMultiple should be included in connection pool created message when specified"
+ operations:
+ - name: createEntities
+ object: testRunner
+ arguments:
+ entities:
+ - client:
+ id: &client client
+ # Observe and wait for a poolReadyEvent so we can ensure the pool has been created and is
+ # ready by the time we assert on log messages, in order to avoid raciness around which messages
+ # are emitted.
+ observeEvents:
+ - poolReadyEvent
+ observeLogMessages:
+ connection: debug
+ uriOptions:
+ waitQueueSize: 5
+
+ - name: waitForEvent
+ object: testRunner
+ arguments:
+ client: *client
+ event:
+ poolReadyEvent: {}
+ count: 1
+
+ expectLogMessages:
+ - client: *client
+ messages:
+ - level: debug
+ component: connection
+ data:
+ message: "Connection pool created"
+ serverHost: { $$type: string }
+ serverPort: { $$type: [int, long] }
+ waitQueueMultiple: 5
+
+ - level: debug
+ component: connection
+ data:
+ message: "Connection pool ready"
+ serverHost: { $$type: string }
+ serverPort: { $$type: [int, long] }
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-string/tests/Makefile b/specifications/connection-string/tests/Makefile
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-string/tests/Makefile
rename to specifications/connection-string/tests/Makefile
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-string/tests/README.rst b/specifications/connection-string/tests/README.rst
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-string/tests/README.rst
rename to specifications/connection-string/tests/README.rst
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-string/tests/invalid-uris.json b/specifications/connection-string/tests/invalid-uris.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-string/tests/invalid-uris.json
rename to specifications/connection-string/tests/invalid-uris.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-string/tests/invalid-uris.yml b/specifications/connection-string/tests/invalid-uris.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-string/tests/invalid-uris.yml
rename to specifications/connection-string/tests/invalid-uris.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-string/tests/valid-auth.json b/specifications/connection-string/tests/valid-auth.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-string/tests/valid-auth.json
rename to specifications/connection-string/tests/valid-auth.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-string/tests/valid-auth.yml b/specifications/connection-string/tests/valid-auth.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-string/tests/valid-auth.yml
rename to specifications/connection-string/tests/valid-auth.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-string/tests/valid-db-with-dotted-name.json b/specifications/connection-string/tests/valid-db-with-dotted-name.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-string/tests/valid-db-with-dotted-name.json
rename to specifications/connection-string/tests/valid-db-with-dotted-name.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-string/tests/valid-db-with-dotted-name.yml b/specifications/connection-string/tests/valid-db-with-dotted-name.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-string/tests/valid-db-with-dotted-name.yml
rename to specifications/connection-string/tests/valid-db-with-dotted-name.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-string/tests/valid-host_identifiers.json b/specifications/connection-string/tests/valid-host_identifiers.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-string/tests/valid-host_identifiers.json
rename to specifications/connection-string/tests/valid-host_identifiers.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-string/tests/valid-host_identifiers.yml b/specifications/connection-string/tests/valid-host_identifiers.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-string/tests/valid-host_identifiers.yml
rename to specifications/connection-string/tests/valid-host_identifiers.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-string/tests/valid-options.json b/specifications/connection-string/tests/valid-options.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-string/tests/valid-options.json
rename to specifications/connection-string/tests/valid-options.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-string/tests/valid-options.yml b/specifications/connection-string/tests/valid-options.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-string/tests/valid-options.yml
rename to specifications/connection-string/tests/valid-options.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-string/tests/valid-unix_socket-absolute.json b/specifications/connection-string/tests/valid-unix_socket-absolute.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-string/tests/valid-unix_socket-absolute.json
rename to specifications/connection-string/tests/valid-unix_socket-absolute.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-string/tests/valid-unix_socket-absolute.yml b/specifications/connection-string/tests/valid-unix_socket-absolute.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-string/tests/valid-unix_socket-absolute.yml
rename to specifications/connection-string/tests/valid-unix_socket-absolute.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-string/tests/valid-unix_socket-relative.json b/specifications/connection-string/tests/valid-unix_socket-relative.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-string/tests/valid-unix_socket-relative.json
rename to specifications/connection-string/tests/valid-unix_socket-relative.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-string/tests/valid-unix_socket-relative.yml b/specifications/connection-string/tests/valid-unix_socket-relative.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-string/tests/valid-unix_socket-relative.yml
rename to specifications/connection-string/tests/valid-unix_socket-relative.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-string/tests/valid-warnings.json b/specifications/connection-string/tests/valid-warnings.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-string/tests/valid-warnings.json
rename to specifications/connection-string/tests/valid-warnings.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/connection-string/tests/valid-warnings.yml b/specifications/connection-string/tests/valid-warnings.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/connection-string/tests/valid-warnings.yml
rename to specifications/connection-string/tests/valid-warnings.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/README.rst b/specifications/crud/tests/README.rst
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/README.rst
rename to specifications/crud/tests/README.rst
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/aggregate-allowdiskuse.json b/specifications/crud/tests/unified/aggregate-allowdiskuse.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/aggregate-allowdiskuse.json
rename to specifications/crud/tests/unified/aggregate-allowdiskuse.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/aggregate-allowdiskuse.yml b/specifications/crud/tests/unified/aggregate-allowdiskuse.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/aggregate-allowdiskuse.yml
rename to specifications/crud/tests/unified/aggregate-allowdiskuse.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/aggregate-let.json b/specifications/crud/tests/unified/aggregate-let.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/aggregate-let.json
rename to specifications/crud/tests/unified/aggregate-let.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/aggregate-let.yml b/specifications/crud/tests/unified/aggregate-let.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/aggregate-let.yml
rename to specifications/crud/tests/unified/aggregate-let.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/aggregate-merge.json b/specifications/crud/tests/unified/aggregate-merge.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/aggregate-merge.json
rename to specifications/crud/tests/unified/aggregate-merge.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/aggregate-merge.yml b/specifications/crud/tests/unified/aggregate-merge.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/aggregate-merge.yml
rename to specifications/crud/tests/unified/aggregate-merge.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/aggregate-out-readConcern.json b/specifications/crud/tests/unified/aggregate-out-readConcern.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/aggregate-out-readConcern.json
rename to specifications/crud/tests/unified/aggregate-out-readConcern.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/aggregate-out-readConcern.yml b/specifications/crud/tests/unified/aggregate-out-readConcern.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/aggregate-out-readConcern.yml
rename to specifications/crud/tests/unified/aggregate-out-readConcern.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/aggregate-write-readPreference.json b/specifications/crud/tests/unified/aggregate-write-readPreference.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/aggregate-write-readPreference.json
rename to specifications/crud/tests/unified/aggregate-write-readPreference.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/aggregate-write-readPreference.yml b/specifications/crud/tests/unified/aggregate-write-readPreference.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/aggregate-write-readPreference.yml
rename to specifications/crud/tests/unified/aggregate-write-readPreference.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/aggregate.json b/specifications/crud/tests/unified/aggregate.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/aggregate.json
rename to specifications/crud/tests/unified/aggregate.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/aggregate.yml b/specifications/crud/tests/unified/aggregate.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/aggregate.yml
rename to specifications/crud/tests/unified/aggregate.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-arrayFilters-clientError.json b/specifications/crud/tests/unified/bulkWrite-arrayFilters-clientError.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-arrayFilters-clientError.json
rename to specifications/crud/tests/unified/bulkWrite-arrayFilters-clientError.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-arrayFilters-clientError.yml b/specifications/crud/tests/unified/bulkWrite-arrayFilters-clientError.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-arrayFilters-clientError.yml
rename to specifications/crud/tests/unified/bulkWrite-arrayFilters-clientError.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-arrayFilters.json b/specifications/crud/tests/unified/bulkWrite-arrayFilters.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-arrayFilters.json
rename to specifications/crud/tests/unified/bulkWrite-arrayFilters.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-arrayFilters.yml b/specifications/crud/tests/unified/bulkWrite-arrayFilters.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-arrayFilters.yml
rename to specifications/crud/tests/unified/bulkWrite-arrayFilters.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-comment.json b/specifications/crud/tests/unified/bulkWrite-comment.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-comment.json
rename to specifications/crud/tests/unified/bulkWrite-comment.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-comment.yml b/specifications/crud/tests/unified/bulkWrite-comment.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-comment.yml
rename to specifications/crud/tests/unified/bulkWrite-comment.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-delete-hint-clientError.json b/specifications/crud/tests/unified/bulkWrite-delete-hint-clientError.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-delete-hint-clientError.json
rename to specifications/crud/tests/unified/bulkWrite-delete-hint-clientError.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-delete-hint-clientError.yml b/specifications/crud/tests/unified/bulkWrite-delete-hint-clientError.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-delete-hint-clientError.yml
rename to specifications/crud/tests/unified/bulkWrite-delete-hint-clientError.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-delete-hint-serverError.json b/specifications/crud/tests/unified/bulkWrite-delete-hint-serverError.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-delete-hint-serverError.json
rename to specifications/crud/tests/unified/bulkWrite-delete-hint-serverError.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-delete-hint-serverError.yml b/specifications/crud/tests/unified/bulkWrite-delete-hint-serverError.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-delete-hint-serverError.yml
rename to specifications/crud/tests/unified/bulkWrite-delete-hint-serverError.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-delete-hint.json b/specifications/crud/tests/unified/bulkWrite-delete-hint.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-delete-hint.json
rename to specifications/crud/tests/unified/bulkWrite-delete-hint.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-delete-hint.yml b/specifications/crud/tests/unified/bulkWrite-delete-hint.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-delete-hint.yml
rename to specifications/crud/tests/unified/bulkWrite-delete-hint.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-deleteMany-let.json b/specifications/crud/tests/unified/bulkWrite-deleteMany-let.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-deleteMany-let.json
rename to specifications/crud/tests/unified/bulkWrite-deleteMany-let.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-deleteMany-let.yml b/specifications/crud/tests/unified/bulkWrite-deleteMany-let.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-deleteMany-let.yml
rename to specifications/crud/tests/unified/bulkWrite-deleteMany-let.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-deleteOne-let.json b/specifications/crud/tests/unified/bulkWrite-deleteOne-let.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-deleteOne-let.json
rename to specifications/crud/tests/unified/bulkWrite-deleteOne-let.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-deleteOne-let.yml b/specifications/crud/tests/unified/bulkWrite-deleteOne-let.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-deleteOne-let.yml
rename to specifications/crud/tests/unified/bulkWrite-deleteOne-let.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-insertOne-dots_and_dollars.json b/specifications/crud/tests/unified/bulkWrite-insertOne-dots_and_dollars.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-insertOne-dots_and_dollars.json
rename to specifications/crud/tests/unified/bulkWrite-insertOne-dots_and_dollars.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-insertOne-dots_and_dollars.yml b/specifications/crud/tests/unified/bulkWrite-insertOne-dots_and_dollars.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-insertOne-dots_and_dollars.yml
rename to specifications/crud/tests/unified/bulkWrite-insertOne-dots_and_dollars.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-replaceOne-dots_and_dollars.json b/specifications/crud/tests/unified/bulkWrite-replaceOne-dots_and_dollars.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-replaceOne-dots_and_dollars.json
rename to specifications/crud/tests/unified/bulkWrite-replaceOne-dots_and_dollars.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-replaceOne-dots_and_dollars.yml b/specifications/crud/tests/unified/bulkWrite-replaceOne-dots_and_dollars.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-replaceOne-dots_and_dollars.yml
rename to specifications/crud/tests/unified/bulkWrite-replaceOne-dots_and_dollars.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-replaceOne-let.json b/specifications/crud/tests/unified/bulkWrite-replaceOne-let.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-replaceOne-let.json
rename to specifications/crud/tests/unified/bulkWrite-replaceOne-let.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-replaceOne-let.yml b/specifications/crud/tests/unified/bulkWrite-replaceOne-let.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-replaceOne-let.yml
rename to specifications/crud/tests/unified/bulkWrite-replaceOne-let.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-update-hint-clientError.json b/specifications/crud/tests/unified/bulkWrite-update-hint-clientError.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-update-hint-clientError.json
rename to specifications/crud/tests/unified/bulkWrite-update-hint-clientError.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-update-hint-clientError.yml b/specifications/crud/tests/unified/bulkWrite-update-hint-clientError.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-update-hint-clientError.yml
rename to specifications/crud/tests/unified/bulkWrite-update-hint-clientError.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-update-hint-serverError.json b/specifications/crud/tests/unified/bulkWrite-update-hint-serverError.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-update-hint-serverError.json
rename to specifications/crud/tests/unified/bulkWrite-update-hint-serverError.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-update-hint-serverError.yml b/specifications/crud/tests/unified/bulkWrite-update-hint-serverError.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-update-hint-serverError.yml
rename to specifications/crud/tests/unified/bulkWrite-update-hint-serverError.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-update-hint.json b/specifications/crud/tests/unified/bulkWrite-update-hint.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-update-hint.json
rename to specifications/crud/tests/unified/bulkWrite-update-hint.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-update-hint.yml b/specifications/crud/tests/unified/bulkWrite-update-hint.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-update-hint.yml
rename to specifications/crud/tests/unified/bulkWrite-update-hint.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-update-validation.json b/specifications/crud/tests/unified/bulkWrite-update-validation.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-update-validation.json
rename to specifications/crud/tests/unified/bulkWrite-update-validation.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-update-validation.yml b/specifications/crud/tests/unified/bulkWrite-update-validation.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-update-validation.yml
rename to specifications/crud/tests/unified/bulkWrite-update-validation.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-updateMany-dots_and_dollars.json b/specifications/crud/tests/unified/bulkWrite-updateMany-dots_and_dollars.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-updateMany-dots_and_dollars.json
rename to specifications/crud/tests/unified/bulkWrite-updateMany-dots_and_dollars.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-updateMany-dots_and_dollars.yml b/specifications/crud/tests/unified/bulkWrite-updateMany-dots_and_dollars.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-updateMany-dots_and_dollars.yml
rename to specifications/crud/tests/unified/bulkWrite-updateMany-dots_and_dollars.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-updateMany-let.json b/specifications/crud/tests/unified/bulkWrite-updateMany-let.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-updateMany-let.json
rename to specifications/crud/tests/unified/bulkWrite-updateMany-let.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-updateMany-let.yml b/specifications/crud/tests/unified/bulkWrite-updateMany-let.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-updateMany-let.yml
rename to specifications/crud/tests/unified/bulkWrite-updateMany-let.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-updateOne-dots_and_dollars.json b/specifications/crud/tests/unified/bulkWrite-updateOne-dots_and_dollars.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-updateOne-dots_and_dollars.json
rename to specifications/crud/tests/unified/bulkWrite-updateOne-dots_and_dollars.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-updateOne-dots_and_dollars.yml b/specifications/crud/tests/unified/bulkWrite-updateOne-dots_and_dollars.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-updateOne-dots_and_dollars.yml
rename to specifications/crud/tests/unified/bulkWrite-updateOne-dots_and_dollars.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-updateOne-let.json b/specifications/crud/tests/unified/bulkWrite-updateOne-let.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-updateOne-let.json
rename to specifications/crud/tests/unified/bulkWrite-updateOne-let.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-updateOne-let.yml b/specifications/crud/tests/unified/bulkWrite-updateOne-let.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/bulkWrite-updateOne-let.yml
rename to specifications/crud/tests/unified/bulkWrite-updateOne-let.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/countDocuments-comment.json b/specifications/crud/tests/unified/countDocuments-comment.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/countDocuments-comment.json
rename to specifications/crud/tests/unified/countDocuments-comment.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/countDocuments-comment.yml b/specifications/crud/tests/unified/countDocuments-comment.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/countDocuments-comment.yml
rename to specifications/crud/tests/unified/countDocuments-comment.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/db-aggregate-write-readPreference.json b/specifications/crud/tests/unified/db-aggregate-write-readPreference.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/db-aggregate-write-readPreference.json
rename to specifications/crud/tests/unified/db-aggregate-write-readPreference.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/db-aggregate-write-readPreference.yml b/specifications/crud/tests/unified/db-aggregate-write-readPreference.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/db-aggregate-write-readPreference.yml
rename to specifications/crud/tests/unified/db-aggregate-write-readPreference.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/db-aggregate.json b/specifications/crud/tests/unified/db-aggregate.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/db-aggregate.json
rename to specifications/crud/tests/unified/db-aggregate.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/db-aggregate.yml b/specifications/crud/tests/unified/db-aggregate.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/db-aggregate.yml
rename to specifications/crud/tests/unified/db-aggregate.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/deleteMany-comment.json b/specifications/crud/tests/unified/deleteMany-comment.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/deleteMany-comment.json
rename to specifications/crud/tests/unified/deleteMany-comment.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/deleteMany-comment.yml b/specifications/crud/tests/unified/deleteMany-comment.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/deleteMany-comment.yml
rename to specifications/crud/tests/unified/deleteMany-comment.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/deleteMany-hint-clientError.json b/specifications/crud/tests/unified/deleteMany-hint-clientError.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/deleteMany-hint-clientError.json
rename to specifications/crud/tests/unified/deleteMany-hint-clientError.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/deleteMany-hint-clientError.yml b/specifications/crud/tests/unified/deleteMany-hint-clientError.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/deleteMany-hint-clientError.yml
rename to specifications/crud/tests/unified/deleteMany-hint-clientError.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/deleteMany-hint-serverError.json b/specifications/crud/tests/unified/deleteMany-hint-serverError.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/deleteMany-hint-serverError.json
rename to specifications/crud/tests/unified/deleteMany-hint-serverError.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/deleteMany-hint-serverError.yml b/specifications/crud/tests/unified/deleteMany-hint-serverError.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/deleteMany-hint-serverError.yml
rename to specifications/crud/tests/unified/deleteMany-hint-serverError.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/deleteMany-hint.json b/specifications/crud/tests/unified/deleteMany-hint.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/deleteMany-hint.json
rename to specifications/crud/tests/unified/deleteMany-hint.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/deleteMany-hint.yml b/specifications/crud/tests/unified/deleteMany-hint.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/deleteMany-hint.yml
rename to specifications/crud/tests/unified/deleteMany-hint.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/deleteMany-let.json b/specifications/crud/tests/unified/deleteMany-let.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/deleteMany-let.json
rename to specifications/crud/tests/unified/deleteMany-let.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/deleteMany-let.yml b/specifications/crud/tests/unified/deleteMany-let.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/deleteMany-let.yml
rename to specifications/crud/tests/unified/deleteMany-let.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/deleteOne-comment.json b/specifications/crud/tests/unified/deleteOne-comment.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/deleteOne-comment.json
rename to specifications/crud/tests/unified/deleteOne-comment.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/deleteOne-comment.yml b/specifications/crud/tests/unified/deleteOne-comment.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/deleteOne-comment.yml
rename to specifications/crud/tests/unified/deleteOne-comment.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/deleteOne-hint-clientError.json b/specifications/crud/tests/unified/deleteOne-hint-clientError.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/deleteOne-hint-clientError.json
rename to specifications/crud/tests/unified/deleteOne-hint-clientError.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/deleteOne-hint-clientError.yml b/specifications/crud/tests/unified/deleteOne-hint-clientError.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/deleteOne-hint-clientError.yml
rename to specifications/crud/tests/unified/deleteOne-hint-clientError.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/deleteOne-hint-serverError.json b/specifications/crud/tests/unified/deleteOne-hint-serverError.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/deleteOne-hint-serverError.json
rename to specifications/crud/tests/unified/deleteOne-hint-serverError.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/deleteOne-hint-serverError.yml b/specifications/crud/tests/unified/deleteOne-hint-serverError.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/deleteOne-hint-serverError.yml
rename to specifications/crud/tests/unified/deleteOne-hint-serverError.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/deleteOne-hint.json b/specifications/crud/tests/unified/deleteOne-hint.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/deleteOne-hint.json
rename to specifications/crud/tests/unified/deleteOne-hint.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/deleteOne-hint.yml b/specifications/crud/tests/unified/deleteOne-hint.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/deleteOne-hint.yml
rename to specifications/crud/tests/unified/deleteOne-hint.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/deleteOne-let.json b/specifications/crud/tests/unified/deleteOne-let.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/deleteOne-let.json
rename to specifications/crud/tests/unified/deleteOne-let.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/deleteOne-let.yml b/specifications/crud/tests/unified/deleteOne-let.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/deleteOne-let.yml
rename to specifications/crud/tests/unified/deleteOne-let.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/distinct-comment.json b/specifications/crud/tests/unified/distinct-comment.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/distinct-comment.json
rename to specifications/crud/tests/unified/distinct-comment.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/distinct-comment.yml b/specifications/crud/tests/unified/distinct-comment.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/distinct-comment.yml
rename to specifications/crud/tests/unified/distinct-comment.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/estimatedDocumentCount-comment.json b/specifications/crud/tests/unified/estimatedDocumentCount-comment.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/estimatedDocumentCount-comment.json
rename to specifications/crud/tests/unified/estimatedDocumentCount-comment.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/estimatedDocumentCount-comment.yml b/specifications/crud/tests/unified/estimatedDocumentCount-comment.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/estimatedDocumentCount-comment.yml
rename to specifications/crud/tests/unified/estimatedDocumentCount-comment.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/estimatedDocumentCount.json b/specifications/crud/tests/unified/estimatedDocumentCount.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/estimatedDocumentCount.json
rename to specifications/crud/tests/unified/estimatedDocumentCount.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/estimatedDocumentCount.yml b/specifications/crud/tests/unified/estimatedDocumentCount.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/estimatedDocumentCount.yml
rename to specifications/crud/tests/unified/estimatedDocumentCount.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/find-allowdiskuse-clientError.json b/specifications/crud/tests/unified/find-allowdiskuse-clientError.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/find-allowdiskuse-clientError.json
rename to specifications/crud/tests/unified/find-allowdiskuse-clientError.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/find-allowdiskuse-clientError.yml b/specifications/crud/tests/unified/find-allowdiskuse-clientError.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/find-allowdiskuse-clientError.yml
rename to specifications/crud/tests/unified/find-allowdiskuse-clientError.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/find-allowdiskuse-serverError.json b/specifications/crud/tests/unified/find-allowdiskuse-serverError.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/find-allowdiskuse-serverError.json
rename to specifications/crud/tests/unified/find-allowdiskuse-serverError.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/find-allowdiskuse-serverError.yml b/specifications/crud/tests/unified/find-allowdiskuse-serverError.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/find-allowdiskuse-serverError.yml
rename to specifications/crud/tests/unified/find-allowdiskuse-serverError.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/find-allowdiskuse.json b/specifications/crud/tests/unified/find-allowdiskuse.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/find-allowdiskuse.json
rename to specifications/crud/tests/unified/find-allowdiskuse.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/find-allowdiskuse.yml b/specifications/crud/tests/unified/find-allowdiskuse.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/find-allowdiskuse.yml
rename to specifications/crud/tests/unified/find-allowdiskuse.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/find-comment.json b/specifications/crud/tests/unified/find-comment.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/find-comment.json
rename to specifications/crud/tests/unified/find-comment.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/find-comment.yml b/specifications/crud/tests/unified/find-comment.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/find-comment.yml
rename to specifications/crud/tests/unified/find-comment.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/find-let.json b/specifications/crud/tests/unified/find-let.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/find-let.json
rename to specifications/crud/tests/unified/find-let.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/find-let.yml b/specifications/crud/tests/unified/find-let.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/find-let.yml
rename to specifications/crud/tests/unified/find-let.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/find.json b/specifications/crud/tests/unified/find.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/find.json
rename to specifications/crud/tests/unified/find.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/find.yml b/specifications/crud/tests/unified/find.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/find.yml
rename to specifications/crud/tests/unified/find.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndDelete-comment.json b/specifications/crud/tests/unified/findOneAndDelete-comment.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndDelete-comment.json
rename to specifications/crud/tests/unified/findOneAndDelete-comment.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndDelete-comment.yml b/specifications/crud/tests/unified/findOneAndDelete-comment.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndDelete-comment.yml
rename to specifications/crud/tests/unified/findOneAndDelete-comment.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndDelete-hint-clientError.json b/specifications/crud/tests/unified/findOneAndDelete-hint-clientError.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndDelete-hint-clientError.json
rename to specifications/crud/tests/unified/findOneAndDelete-hint-clientError.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndDelete-hint-clientError.yml b/specifications/crud/tests/unified/findOneAndDelete-hint-clientError.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndDelete-hint-clientError.yml
rename to specifications/crud/tests/unified/findOneAndDelete-hint-clientError.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndDelete-hint-serverError.json b/specifications/crud/tests/unified/findOneAndDelete-hint-serverError.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndDelete-hint-serverError.json
rename to specifications/crud/tests/unified/findOneAndDelete-hint-serverError.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndDelete-hint-serverError.yml b/specifications/crud/tests/unified/findOneAndDelete-hint-serverError.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndDelete-hint-serverError.yml
rename to specifications/crud/tests/unified/findOneAndDelete-hint-serverError.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndDelete-hint.json b/specifications/crud/tests/unified/findOneAndDelete-hint.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndDelete-hint.json
rename to specifications/crud/tests/unified/findOneAndDelete-hint.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndDelete-hint.yml b/specifications/crud/tests/unified/findOneAndDelete-hint.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndDelete-hint.yml
rename to specifications/crud/tests/unified/findOneAndDelete-hint.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndDelete-let.json b/specifications/crud/tests/unified/findOneAndDelete-let.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndDelete-let.json
rename to specifications/crud/tests/unified/findOneAndDelete-let.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndDelete-let.yml b/specifications/crud/tests/unified/findOneAndDelete-let.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndDelete-let.yml
rename to specifications/crud/tests/unified/findOneAndDelete-let.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndReplace-comment.json b/specifications/crud/tests/unified/findOneAndReplace-comment.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndReplace-comment.json
rename to specifications/crud/tests/unified/findOneAndReplace-comment.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndReplace-comment.yml b/specifications/crud/tests/unified/findOneAndReplace-comment.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndReplace-comment.yml
rename to specifications/crud/tests/unified/findOneAndReplace-comment.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndReplace-dots_and_dollars.json b/specifications/crud/tests/unified/findOneAndReplace-dots_and_dollars.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndReplace-dots_and_dollars.json
rename to specifications/crud/tests/unified/findOneAndReplace-dots_and_dollars.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndReplace-dots_and_dollars.yml b/specifications/crud/tests/unified/findOneAndReplace-dots_and_dollars.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndReplace-dots_and_dollars.yml
rename to specifications/crud/tests/unified/findOneAndReplace-dots_and_dollars.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndReplace-hint-clientError.json b/specifications/crud/tests/unified/findOneAndReplace-hint-clientError.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndReplace-hint-clientError.json
rename to specifications/crud/tests/unified/findOneAndReplace-hint-clientError.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndReplace-hint-clientError.yml b/specifications/crud/tests/unified/findOneAndReplace-hint-clientError.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndReplace-hint-clientError.yml
rename to specifications/crud/tests/unified/findOneAndReplace-hint-clientError.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndReplace-hint-serverError.json b/specifications/crud/tests/unified/findOneAndReplace-hint-serverError.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndReplace-hint-serverError.json
rename to specifications/crud/tests/unified/findOneAndReplace-hint-serverError.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndReplace-hint-serverError.yml b/specifications/crud/tests/unified/findOneAndReplace-hint-serverError.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndReplace-hint-serverError.yml
rename to specifications/crud/tests/unified/findOneAndReplace-hint-serverError.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndReplace-hint.json b/specifications/crud/tests/unified/findOneAndReplace-hint.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndReplace-hint.json
rename to specifications/crud/tests/unified/findOneAndReplace-hint.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndReplace-hint.yml b/specifications/crud/tests/unified/findOneAndReplace-hint.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndReplace-hint.yml
rename to specifications/crud/tests/unified/findOneAndReplace-hint.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndReplace-let.json b/specifications/crud/tests/unified/findOneAndReplace-let.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndReplace-let.json
rename to specifications/crud/tests/unified/findOneAndReplace-let.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndReplace-let.yml b/specifications/crud/tests/unified/findOneAndReplace-let.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndReplace-let.yml
rename to specifications/crud/tests/unified/findOneAndReplace-let.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndUpdate-comment.json b/specifications/crud/tests/unified/findOneAndUpdate-comment.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndUpdate-comment.json
rename to specifications/crud/tests/unified/findOneAndUpdate-comment.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndUpdate-comment.yml b/specifications/crud/tests/unified/findOneAndUpdate-comment.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndUpdate-comment.yml
rename to specifications/crud/tests/unified/findOneAndUpdate-comment.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndUpdate-dots_and_dollars.json b/specifications/crud/tests/unified/findOneAndUpdate-dots_and_dollars.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndUpdate-dots_and_dollars.json
rename to specifications/crud/tests/unified/findOneAndUpdate-dots_and_dollars.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndUpdate-dots_and_dollars.yml b/specifications/crud/tests/unified/findOneAndUpdate-dots_and_dollars.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndUpdate-dots_and_dollars.yml
rename to specifications/crud/tests/unified/findOneAndUpdate-dots_and_dollars.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndUpdate-hint-clientError.json b/specifications/crud/tests/unified/findOneAndUpdate-hint-clientError.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndUpdate-hint-clientError.json
rename to specifications/crud/tests/unified/findOneAndUpdate-hint-clientError.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndUpdate-hint-clientError.yml b/specifications/crud/tests/unified/findOneAndUpdate-hint-clientError.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndUpdate-hint-clientError.yml
rename to specifications/crud/tests/unified/findOneAndUpdate-hint-clientError.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndUpdate-hint-serverError.json b/specifications/crud/tests/unified/findOneAndUpdate-hint-serverError.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndUpdate-hint-serverError.json
rename to specifications/crud/tests/unified/findOneAndUpdate-hint-serverError.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndUpdate-hint-serverError.yml b/specifications/crud/tests/unified/findOneAndUpdate-hint-serverError.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndUpdate-hint-serverError.yml
rename to specifications/crud/tests/unified/findOneAndUpdate-hint-serverError.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndUpdate-hint.json b/specifications/crud/tests/unified/findOneAndUpdate-hint.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndUpdate-hint.json
rename to specifications/crud/tests/unified/findOneAndUpdate-hint.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndUpdate-hint.yml b/specifications/crud/tests/unified/findOneAndUpdate-hint.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndUpdate-hint.yml
rename to specifications/crud/tests/unified/findOneAndUpdate-hint.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndUpdate-let.json b/specifications/crud/tests/unified/findOneAndUpdate-let.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndUpdate-let.json
rename to specifications/crud/tests/unified/findOneAndUpdate-let.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndUpdate-let.yml b/specifications/crud/tests/unified/findOneAndUpdate-let.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/findOneAndUpdate-let.yml
rename to specifications/crud/tests/unified/findOneAndUpdate-let.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/insertMany-comment.json b/specifications/crud/tests/unified/insertMany-comment.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/insertMany-comment.json
rename to specifications/crud/tests/unified/insertMany-comment.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/insertMany-comment.yml b/specifications/crud/tests/unified/insertMany-comment.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/insertMany-comment.yml
rename to specifications/crud/tests/unified/insertMany-comment.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/insertMany-dots_and_dollars.json b/specifications/crud/tests/unified/insertMany-dots_and_dollars.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/insertMany-dots_and_dollars.json
rename to specifications/crud/tests/unified/insertMany-dots_and_dollars.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/insertMany-dots_and_dollars.yml b/specifications/crud/tests/unified/insertMany-dots_and_dollars.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/insertMany-dots_and_dollars.yml
rename to specifications/crud/tests/unified/insertMany-dots_and_dollars.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/insertOne-comment.json b/specifications/crud/tests/unified/insertOne-comment.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/insertOne-comment.json
rename to specifications/crud/tests/unified/insertOne-comment.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/insertOne-comment.yml b/specifications/crud/tests/unified/insertOne-comment.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/insertOne-comment.yml
rename to specifications/crud/tests/unified/insertOne-comment.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/insertOne-dots_and_dollars.json b/specifications/crud/tests/unified/insertOne-dots_and_dollars.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/insertOne-dots_and_dollars.json
rename to specifications/crud/tests/unified/insertOne-dots_and_dollars.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/insertOne-dots_and_dollars.yml b/specifications/crud/tests/unified/insertOne-dots_and_dollars.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/insertOne-dots_and_dollars.yml
rename to specifications/crud/tests/unified/insertOne-dots_and_dollars.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/replaceOne-comment.json b/specifications/crud/tests/unified/replaceOne-comment.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/replaceOne-comment.json
rename to specifications/crud/tests/unified/replaceOne-comment.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/replaceOne-comment.yml b/specifications/crud/tests/unified/replaceOne-comment.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/replaceOne-comment.yml
rename to specifications/crud/tests/unified/replaceOne-comment.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/replaceOne-dots_and_dollars.json b/specifications/crud/tests/unified/replaceOne-dots_and_dollars.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/replaceOne-dots_and_dollars.json
rename to specifications/crud/tests/unified/replaceOne-dots_and_dollars.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/replaceOne-dots_and_dollars.yml b/specifications/crud/tests/unified/replaceOne-dots_and_dollars.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/replaceOne-dots_and_dollars.yml
rename to specifications/crud/tests/unified/replaceOne-dots_and_dollars.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/replaceOne-hint.json b/specifications/crud/tests/unified/replaceOne-hint.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/replaceOne-hint.json
rename to specifications/crud/tests/unified/replaceOne-hint.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/replaceOne-hint.yml b/specifications/crud/tests/unified/replaceOne-hint.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/replaceOne-hint.yml
rename to specifications/crud/tests/unified/replaceOne-hint.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/replaceOne-let.json b/specifications/crud/tests/unified/replaceOne-let.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/replaceOne-let.json
rename to specifications/crud/tests/unified/replaceOne-let.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/replaceOne-let.yml b/specifications/crud/tests/unified/replaceOne-let.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/replaceOne-let.yml
rename to specifications/crud/tests/unified/replaceOne-let.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/replaceOne-validation.json b/specifications/crud/tests/unified/replaceOne-validation.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/replaceOne-validation.json
rename to specifications/crud/tests/unified/replaceOne-validation.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/replaceOne-validation.yml b/specifications/crud/tests/unified/replaceOne-validation.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/replaceOne-validation.yml
rename to specifications/crud/tests/unified/replaceOne-validation.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/updateMany-comment.json b/specifications/crud/tests/unified/updateMany-comment.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/updateMany-comment.json
rename to specifications/crud/tests/unified/updateMany-comment.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/updateMany-comment.yml b/specifications/crud/tests/unified/updateMany-comment.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/updateMany-comment.yml
rename to specifications/crud/tests/unified/updateMany-comment.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/updateMany-dots_and_dollars.json b/specifications/crud/tests/unified/updateMany-dots_and_dollars.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/updateMany-dots_and_dollars.json
rename to specifications/crud/tests/unified/updateMany-dots_and_dollars.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/updateMany-dots_and_dollars.yml b/specifications/crud/tests/unified/updateMany-dots_and_dollars.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/updateMany-dots_and_dollars.yml
rename to specifications/crud/tests/unified/updateMany-dots_and_dollars.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/updateMany-hint-clientError.json b/specifications/crud/tests/unified/updateMany-hint-clientError.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/updateMany-hint-clientError.json
rename to specifications/crud/tests/unified/updateMany-hint-clientError.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/updateMany-hint-clientError.yml b/specifications/crud/tests/unified/updateMany-hint-clientError.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/updateMany-hint-clientError.yml
rename to specifications/crud/tests/unified/updateMany-hint-clientError.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/updateMany-hint-serverError.json b/specifications/crud/tests/unified/updateMany-hint-serverError.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/updateMany-hint-serverError.json
rename to specifications/crud/tests/unified/updateMany-hint-serverError.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/updateMany-hint-serverError.yml b/specifications/crud/tests/unified/updateMany-hint-serverError.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/updateMany-hint-serverError.yml
rename to specifications/crud/tests/unified/updateMany-hint-serverError.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/updateMany-hint.json b/specifications/crud/tests/unified/updateMany-hint.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/updateMany-hint.json
rename to specifications/crud/tests/unified/updateMany-hint.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/updateMany-hint.yml b/specifications/crud/tests/unified/updateMany-hint.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/updateMany-hint.yml
rename to specifications/crud/tests/unified/updateMany-hint.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/updateMany-let.json b/specifications/crud/tests/unified/updateMany-let.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/updateMany-let.json
rename to specifications/crud/tests/unified/updateMany-let.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/updateMany-let.yml b/specifications/crud/tests/unified/updateMany-let.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/updateMany-let.yml
rename to specifications/crud/tests/unified/updateMany-let.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/updateMany-validation.json b/specifications/crud/tests/unified/updateMany-validation.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/updateMany-validation.json
rename to specifications/crud/tests/unified/updateMany-validation.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/updateMany-validation.yml b/specifications/crud/tests/unified/updateMany-validation.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/updateMany-validation.yml
rename to specifications/crud/tests/unified/updateMany-validation.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/updateOne-comment.json b/specifications/crud/tests/unified/updateOne-comment.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/updateOne-comment.json
rename to specifications/crud/tests/unified/updateOne-comment.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/updateOne-comment.yml b/specifications/crud/tests/unified/updateOne-comment.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/updateOne-comment.yml
rename to specifications/crud/tests/unified/updateOne-comment.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/updateOne-dots_and_dollars.json b/specifications/crud/tests/unified/updateOne-dots_and_dollars.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/updateOne-dots_and_dollars.json
rename to specifications/crud/tests/unified/updateOne-dots_and_dollars.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/updateOne-dots_and_dollars.yml b/specifications/crud/tests/unified/updateOne-dots_and_dollars.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/updateOne-dots_and_dollars.yml
rename to specifications/crud/tests/unified/updateOne-dots_and_dollars.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/updateOne-hint-clientError.json b/specifications/crud/tests/unified/updateOne-hint-clientError.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/updateOne-hint-clientError.json
rename to specifications/crud/tests/unified/updateOne-hint-clientError.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/updateOne-hint-clientError.yml b/specifications/crud/tests/unified/updateOne-hint-clientError.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/updateOne-hint-clientError.yml
rename to specifications/crud/tests/unified/updateOne-hint-clientError.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/updateOne-hint-serverError.json b/specifications/crud/tests/unified/updateOne-hint-serverError.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/updateOne-hint-serverError.json
rename to specifications/crud/tests/unified/updateOne-hint-serverError.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/updateOne-hint-serverError.yml b/specifications/crud/tests/unified/updateOne-hint-serverError.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/updateOne-hint-serverError.yml
rename to specifications/crud/tests/unified/updateOne-hint-serverError.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/updateOne-hint.json b/specifications/crud/tests/unified/updateOne-hint.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/updateOne-hint.json
rename to specifications/crud/tests/unified/updateOne-hint.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/updateOne-hint.yml b/specifications/crud/tests/unified/updateOne-hint.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/updateOne-hint.yml
rename to specifications/crud/tests/unified/updateOne-hint.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/updateOne-let.json b/specifications/crud/tests/unified/updateOne-let.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/updateOne-let.json
rename to specifications/crud/tests/unified/updateOne-let.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/updateOne-let.yml b/specifications/crud/tests/unified/updateOne-let.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/updateOne-let.yml
rename to specifications/crud/tests/unified/updateOne-let.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/updateOne-validation.json b/specifications/crud/tests/unified/updateOne-validation.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/updateOne-validation.json
rename to specifications/crud/tests/unified/updateOne-validation.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/updateOne-validation.yml b/specifications/crud/tests/unified/updateOne-validation.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/updateOne-validation.yml
rename to specifications/crud/tests/unified/updateOne-validation.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/updateWithPipelines.json b/specifications/crud/tests/unified/updateWithPipelines.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/updateWithPipelines.json
rename to specifications/crud/tests/unified/updateWithPipelines.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/updateWithPipelines.yml b/specifications/crud/tests/unified/updateWithPipelines.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/unified/updateWithPipelines.yml
rename to specifications/crud/tests/unified/updateWithPipelines.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/read/aggregate-collation.json b/specifications/crud/tests/v1/read/aggregate-collation.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/read/aggregate-collation.json
rename to specifications/crud/tests/v1/read/aggregate-collation.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/read/aggregate-collation.yml b/specifications/crud/tests/v1/read/aggregate-collation.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/read/aggregate-collation.yml
rename to specifications/crud/tests/v1/read/aggregate-collation.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/read/aggregate-out.json b/specifications/crud/tests/v1/read/aggregate-out.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/read/aggregate-out.json
rename to specifications/crud/tests/v1/read/aggregate-out.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/read/aggregate-out.yml b/specifications/crud/tests/v1/read/aggregate-out.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/read/aggregate-out.yml
rename to specifications/crud/tests/v1/read/aggregate-out.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/read/aggregate.json b/specifications/crud/tests/v1/read/aggregate.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/read/aggregate.json
rename to specifications/crud/tests/v1/read/aggregate.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/read/aggregate.yml b/specifications/crud/tests/v1/read/aggregate.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/read/aggregate.yml
rename to specifications/crud/tests/v1/read/aggregate.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/read/count-collation.json b/specifications/crud/tests/v1/read/count-collation.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/read/count-collation.json
rename to specifications/crud/tests/v1/read/count-collation.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/read/count-collation.yml b/specifications/crud/tests/v1/read/count-collation.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/read/count-collation.yml
rename to specifications/crud/tests/v1/read/count-collation.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/read/count-empty.json b/specifications/crud/tests/v1/read/count-empty.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/read/count-empty.json
rename to specifications/crud/tests/v1/read/count-empty.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/read/count-empty.yml b/specifications/crud/tests/v1/read/count-empty.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/read/count-empty.yml
rename to specifications/crud/tests/v1/read/count-empty.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/read/count.json b/specifications/crud/tests/v1/read/count.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/read/count.json
rename to specifications/crud/tests/v1/read/count.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/read/count.yml b/specifications/crud/tests/v1/read/count.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/read/count.yml
rename to specifications/crud/tests/v1/read/count.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/read/distinct-collation.json b/specifications/crud/tests/v1/read/distinct-collation.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/read/distinct-collation.json
rename to specifications/crud/tests/v1/read/distinct-collation.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/read/distinct-collation.yml b/specifications/crud/tests/v1/read/distinct-collation.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/read/distinct-collation.yml
rename to specifications/crud/tests/v1/read/distinct-collation.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/read/distinct.json b/specifications/crud/tests/v1/read/distinct.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/read/distinct.json
rename to specifications/crud/tests/v1/read/distinct.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/read/distinct.yml b/specifications/crud/tests/v1/read/distinct.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/read/distinct.yml
rename to specifications/crud/tests/v1/read/distinct.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/read/find-collation.json b/specifications/crud/tests/v1/read/find-collation.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/read/find-collation.json
rename to specifications/crud/tests/v1/read/find-collation.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/read/find-collation.yml b/specifications/crud/tests/v1/read/find-collation.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/read/find-collation.yml
rename to specifications/crud/tests/v1/read/find-collation.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/read/find.json b/specifications/crud/tests/v1/read/find.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/read/find.json
rename to specifications/crud/tests/v1/read/find.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/read/find.yml b/specifications/crud/tests/v1/read/find.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/read/find.yml
rename to specifications/crud/tests/v1/read/find.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/bulkWrite-arrayFilters.json b/specifications/crud/tests/v1/write/bulkWrite-arrayFilters.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/bulkWrite-arrayFilters.json
rename to specifications/crud/tests/v1/write/bulkWrite-arrayFilters.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/bulkWrite-arrayFilters.yml b/specifications/crud/tests/v1/write/bulkWrite-arrayFilters.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/bulkWrite-arrayFilters.yml
rename to specifications/crud/tests/v1/write/bulkWrite-arrayFilters.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/bulkWrite-collation.json b/specifications/crud/tests/v1/write/bulkWrite-collation.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/bulkWrite-collation.json
rename to specifications/crud/tests/v1/write/bulkWrite-collation.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/bulkWrite-collation.yml b/specifications/crud/tests/v1/write/bulkWrite-collation.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/bulkWrite-collation.yml
rename to specifications/crud/tests/v1/write/bulkWrite-collation.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/bulkWrite.json b/specifications/crud/tests/v1/write/bulkWrite.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/bulkWrite.json
rename to specifications/crud/tests/v1/write/bulkWrite.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/bulkWrite.yml b/specifications/crud/tests/v1/write/bulkWrite.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/bulkWrite.yml
rename to specifications/crud/tests/v1/write/bulkWrite.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/deleteMany-collation.json b/specifications/crud/tests/v1/write/deleteMany-collation.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/deleteMany-collation.json
rename to specifications/crud/tests/v1/write/deleteMany-collation.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/deleteMany-collation.yml b/specifications/crud/tests/v1/write/deleteMany-collation.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/deleteMany-collation.yml
rename to specifications/crud/tests/v1/write/deleteMany-collation.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/deleteMany.json b/specifications/crud/tests/v1/write/deleteMany.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/deleteMany.json
rename to specifications/crud/tests/v1/write/deleteMany.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/deleteMany.yml b/specifications/crud/tests/v1/write/deleteMany.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/deleteMany.yml
rename to specifications/crud/tests/v1/write/deleteMany.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/deleteOne-collation.json b/specifications/crud/tests/v1/write/deleteOne-collation.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/deleteOne-collation.json
rename to specifications/crud/tests/v1/write/deleteOne-collation.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/deleteOne-collation.yml b/specifications/crud/tests/v1/write/deleteOne-collation.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/deleteOne-collation.yml
rename to specifications/crud/tests/v1/write/deleteOne-collation.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/deleteOne.json b/specifications/crud/tests/v1/write/deleteOne.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/deleteOne.json
rename to specifications/crud/tests/v1/write/deleteOne.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/deleteOne.yml b/specifications/crud/tests/v1/write/deleteOne.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/deleteOne.yml
rename to specifications/crud/tests/v1/write/deleteOne.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/findOneAndDelete-collation.json b/specifications/crud/tests/v1/write/findOneAndDelete-collation.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/findOneAndDelete-collation.json
rename to specifications/crud/tests/v1/write/findOneAndDelete-collation.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/findOneAndDelete-collation.yml b/specifications/crud/tests/v1/write/findOneAndDelete-collation.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/findOneAndDelete-collation.yml
rename to specifications/crud/tests/v1/write/findOneAndDelete-collation.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/findOneAndDelete.json b/specifications/crud/tests/v1/write/findOneAndDelete.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/findOneAndDelete.json
rename to specifications/crud/tests/v1/write/findOneAndDelete.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/findOneAndDelete.yml b/specifications/crud/tests/v1/write/findOneAndDelete.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/findOneAndDelete.yml
rename to specifications/crud/tests/v1/write/findOneAndDelete.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/findOneAndReplace-collation.json b/specifications/crud/tests/v1/write/findOneAndReplace-collation.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/findOneAndReplace-collation.json
rename to specifications/crud/tests/v1/write/findOneAndReplace-collation.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/findOneAndReplace-collation.yml b/specifications/crud/tests/v1/write/findOneAndReplace-collation.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/findOneAndReplace-collation.yml
rename to specifications/crud/tests/v1/write/findOneAndReplace-collation.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/findOneAndReplace-upsert.json b/specifications/crud/tests/v1/write/findOneAndReplace-upsert.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/findOneAndReplace-upsert.json
rename to specifications/crud/tests/v1/write/findOneAndReplace-upsert.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/findOneAndReplace-upsert.yml b/specifications/crud/tests/v1/write/findOneAndReplace-upsert.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/findOneAndReplace-upsert.yml
rename to specifications/crud/tests/v1/write/findOneAndReplace-upsert.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/findOneAndReplace.json b/specifications/crud/tests/v1/write/findOneAndReplace.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/findOneAndReplace.json
rename to specifications/crud/tests/v1/write/findOneAndReplace.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/findOneAndReplace.yml b/specifications/crud/tests/v1/write/findOneAndReplace.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/findOneAndReplace.yml
rename to specifications/crud/tests/v1/write/findOneAndReplace.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/findOneAndUpdate-arrayFilters.json b/specifications/crud/tests/v1/write/findOneAndUpdate-arrayFilters.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/findOneAndUpdate-arrayFilters.json
rename to specifications/crud/tests/v1/write/findOneAndUpdate-arrayFilters.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/findOneAndUpdate-arrayFilters.yml b/specifications/crud/tests/v1/write/findOneAndUpdate-arrayFilters.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/findOneAndUpdate-arrayFilters.yml
rename to specifications/crud/tests/v1/write/findOneAndUpdate-arrayFilters.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/findOneAndUpdate-collation.json b/specifications/crud/tests/v1/write/findOneAndUpdate-collation.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/findOneAndUpdate-collation.json
rename to specifications/crud/tests/v1/write/findOneAndUpdate-collation.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/findOneAndUpdate-collation.yml b/specifications/crud/tests/v1/write/findOneAndUpdate-collation.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/findOneAndUpdate-collation.yml
rename to specifications/crud/tests/v1/write/findOneAndUpdate-collation.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/findOneAndUpdate.json b/specifications/crud/tests/v1/write/findOneAndUpdate.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/findOneAndUpdate.json
rename to specifications/crud/tests/v1/write/findOneAndUpdate.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/findOneAndUpdate.yml b/specifications/crud/tests/v1/write/findOneAndUpdate.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/findOneAndUpdate.yml
rename to specifications/crud/tests/v1/write/findOneAndUpdate.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/insertMany.json b/specifications/crud/tests/v1/write/insertMany.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/insertMany.json
rename to specifications/crud/tests/v1/write/insertMany.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/insertMany.yml b/specifications/crud/tests/v1/write/insertMany.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/insertMany.yml
rename to specifications/crud/tests/v1/write/insertMany.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/insertOne.json b/specifications/crud/tests/v1/write/insertOne.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/insertOne.json
rename to specifications/crud/tests/v1/write/insertOne.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/insertOne.yml b/specifications/crud/tests/v1/write/insertOne.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/insertOne.yml
rename to specifications/crud/tests/v1/write/insertOne.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/replaceOne-collation.json b/specifications/crud/tests/v1/write/replaceOne-collation.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/replaceOne-collation.json
rename to specifications/crud/tests/v1/write/replaceOne-collation.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/replaceOne-collation.yml b/specifications/crud/tests/v1/write/replaceOne-collation.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/replaceOne-collation.yml
rename to specifications/crud/tests/v1/write/replaceOne-collation.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/replaceOne.json b/specifications/crud/tests/v1/write/replaceOne.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/replaceOne.json
rename to specifications/crud/tests/v1/write/replaceOne.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/replaceOne.yml b/specifications/crud/tests/v1/write/replaceOne.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/replaceOne.yml
rename to specifications/crud/tests/v1/write/replaceOne.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/updateMany-arrayFilters.json b/specifications/crud/tests/v1/write/updateMany-arrayFilters.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/updateMany-arrayFilters.json
rename to specifications/crud/tests/v1/write/updateMany-arrayFilters.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/updateMany-arrayFilters.yml b/specifications/crud/tests/v1/write/updateMany-arrayFilters.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/updateMany-arrayFilters.yml
rename to specifications/crud/tests/v1/write/updateMany-arrayFilters.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/updateMany-collation.json b/specifications/crud/tests/v1/write/updateMany-collation.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/updateMany-collation.json
rename to specifications/crud/tests/v1/write/updateMany-collation.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/updateMany-collation.yml b/specifications/crud/tests/v1/write/updateMany-collation.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/updateMany-collation.yml
rename to specifications/crud/tests/v1/write/updateMany-collation.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/updateMany.json b/specifications/crud/tests/v1/write/updateMany.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/updateMany.json
rename to specifications/crud/tests/v1/write/updateMany.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/updateMany.yml b/specifications/crud/tests/v1/write/updateMany.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/updateMany.yml
rename to specifications/crud/tests/v1/write/updateMany.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/updateOne-arrayFilters.json b/specifications/crud/tests/v1/write/updateOne-arrayFilters.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/updateOne-arrayFilters.json
rename to specifications/crud/tests/v1/write/updateOne-arrayFilters.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/updateOne-arrayFilters.yml b/specifications/crud/tests/v1/write/updateOne-arrayFilters.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/updateOne-arrayFilters.yml
rename to specifications/crud/tests/v1/write/updateOne-arrayFilters.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/updateOne-collation.json b/specifications/crud/tests/v1/write/updateOne-collation.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/updateOne-collation.json
rename to specifications/crud/tests/v1/write/updateOne-collation.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/updateOne-collation.yml b/specifications/crud/tests/v1/write/updateOne-collation.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/updateOne-collation.yml
rename to specifications/crud/tests/v1/write/updateOne-collation.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/updateOne.json b/specifications/crud/tests/v1/write/updateOne.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/updateOne.json
rename to specifications/crud/tests/v1/write/updateOne.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/updateOne.yml b/specifications/crud/tests/v1/write/updateOne.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/crud/tests/v1/write/updateOne.yml
rename to specifications/crud/tests/v1/write/updateOne.yml
diff --git a/tests/MongoDB.Driver.GridFS.Tests/Specifications/gridfs/tests/delete.json b/specifications/gridfs/tests/delete.json
similarity index 100%
rename from tests/MongoDB.Driver.GridFS.Tests/Specifications/gridfs/tests/delete.json
rename to specifications/gridfs/tests/delete.json
diff --git a/tests/MongoDB.Driver.GridFS.Tests/Specifications/gridfs/tests/delete.yml b/specifications/gridfs/tests/delete.yml
similarity index 100%
rename from tests/MongoDB.Driver.GridFS.Tests/Specifications/gridfs/tests/delete.yml
rename to specifications/gridfs/tests/delete.yml
diff --git a/tests/MongoDB.Driver.GridFS.Tests/Specifications/gridfs/tests/download.json b/specifications/gridfs/tests/download.json
similarity index 100%
rename from tests/MongoDB.Driver.GridFS.Tests/Specifications/gridfs/tests/download.json
rename to specifications/gridfs/tests/download.json
diff --git a/tests/MongoDB.Driver.GridFS.Tests/Specifications/gridfs/tests/download.yml b/specifications/gridfs/tests/download.yml
similarity index 100%
rename from tests/MongoDB.Driver.GridFS.Tests/Specifications/gridfs/tests/download.yml
rename to specifications/gridfs/tests/download.yml
diff --git a/tests/MongoDB.Driver.GridFS.Tests/Specifications/gridfs/tests/download_by_name.json b/specifications/gridfs/tests/download_by_name.json
similarity index 100%
rename from tests/MongoDB.Driver.GridFS.Tests/Specifications/gridfs/tests/download_by_name.json
rename to specifications/gridfs/tests/download_by_name.json
diff --git a/tests/MongoDB.Driver.GridFS.Tests/Specifications/gridfs/tests/download_by_name.yml b/specifications/gridfs/tests/download_by_name.yml
similarity index 100%
rename from tests/MongoDB.Driver.GridFS.Tests/Specifications/gridfs/tests/download_by_name.yml
rename to specifications/gridfs/tests/download_by_name.yml
diff --git a/tests/MongoDB.Driver.GridFS.Tests/Specifications/gridfs/tests/upload.json b/specifications/gridfs/tests/upload.json
similarity index 100%
rename from tests/MongoDB.Driver.GridFS.Tests/Specifications/gridfs/tests/upload.json
rename to specifications/gridfs/tests/upload.json
diff --git a/tests/MongoDB.Driver.GridFS.Tests/Specifications/gridfs/tests/upload.yml b/specifications/gridfs/tests/upload.yml
similarity index 100%
rename from tests/MongoDB.Driver.GridFS.Tests/Specifications/gridfs/tests/upload.yml
rename to specifications/gridfs/tests/upload.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/README.rst b/specifications/initial-dns-seedlist-discovery/tests/README.rst
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/README.rst
rename to specifications/initial-dns-seedlist-discovery/tests/README.rst
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/direct-connection-false.json b/specifications/initial-dns-seedlist-discovery/tests/direct-connection-false.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/direct-connection-false.json
rename to specifications/initial-dns-seedlist-discovery/tests/direct-connection-false.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/direct-connection-false.yml b/specifications/initial-dns-seedlist-discovery/tests/direct-connection-false.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/direct-connection-false.yml
rename to specifications/initial-dns-seedlist-discovery/tests/direct-connection-false.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/direct-connection-true.json b/specifications/initial-dns-seedlist-discovery/tests/direct-connection-true.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/direct-connection-true.json
rename to specifications/initial-dns-seedlist-discovery/tests/direct-connection-true.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/direct-connection-true.yml b/specifications/initial-dns-seedlist-discovery/tests/direct-connection-true.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/direct-connection-true.yml
rename to specifications/initial-dns-seedlist-discovery/tests/direct-connection-true.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/load-balanced/loadBalanced-directConnection.json b/specifications/initial-dns-seedlist-discovery/tests/load-balanced/loadBalanced-directConnection.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/load-balanced/loadBalanced-directConnection.json
rename to specifications/initial-dns-seedlist-discovery/tests/load-balanced/loadBalanced-directConnection.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/load-balanced/loadBalanced-directConnection.yml b/specifications/initial-dns-seedlist-discovery/tests/load-balanced/loadBalanced-directConnection.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/load-balanced/loadBalanced-directConnection.yml
rename to specifications/initial-dns-seedlist-discovery/tests/load-balanced/loadBalanced-directConnection.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/load-balanced/loadBalanced-no-results.json b/specifications/initial-dns-seedlist-discovery/tests/load-balanced/loadBalanced-no-results.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/load-balanced/loadBalanced-no-results.json
rename to specifications/initial-dns-seedlist-discovery/tests/load-balanced/loadBalanced-no-results.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/load-balanced/loadBalanced-no-results.yml b/specifications/initial-dns-seedlist-discovery/tests/load-balanced/loadBalanced-no-results.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/load-balanced/loadBalanced-no-results.yml
rename to specifications/initial-dns-seedlist-discovery/tests/load-balanced/loadBalanced-no-results.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/load-balanced/loadBalanced-replicaSet-errors.json b/specifications/initial-dns-seedlist-discovery/tests/load-balanced/loadBalanced-replicaSet-errors.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/load-balanced/loadBalanced-replicaSet-errors.json
rename to specifications/initial-dns-seedlist-discovery/tests/load-balanced/loadBalanced-replicaSet-errors.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/load-balanced/loadBalanced-replicaSet-errors.yml b/specifications/initial-dns-seedlist-discovery/tests/load-balanced/loadBalanced-replicaSet-errors.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/load-balanced/loadBalanced-replicaSet-errors.yml
rename to specifications/initial-dns-seedlist-discovery/tests/load-balanced/loadBalanced-replicaSet-errors.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/load-balanced/loadBalanced-true-multiple-hosts.json b/specifications/initial-dns-seedlist-discovery/tests/load-balanced/loadBalanced-true-multiple-hosts.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/load-balanced/loadBalanced-true-multiple-hosts.json
rename to specifications/initial-dns-seedlist-discovery/tests/load-balanced/loadBalanced-true-multiple-hosts.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/load-balanced/loadBalanced-true-multiple-hosts.yml b/specifications/initial-dns-seedlist-discovery/tests/load-balanced/loadBalanced-true-multiple-hosts.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/load-balanced/loadBalanced-true-multiple-hosts.yml
rename to specifications/initial-dns-seedlist-discovery/tests/load-balanced/loadBalanced-true-multiple-hosts.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/load-balanced/loadBalanced-true-txt.json b/specifications/initial-dns-seedlist-discovery/tests/load-balanced/loadBalanced-true-txt.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/load-balanced/loadBalanced-true-txt.json
rename to specifications/initial-dns-seedlist-discovery/tests/load-balanced/loadBalanced-true-txt.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/load-balanced/loadBalanced-true-txt.yml b/specifications/initial-dns-seedlist-discovery/tests/load-balanced/loadBalanced-true-txt.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/load-balanced/loadBalanced-true-txt.yml
rename to specifications/initial-dns-seedlist-discovery/tests/load-balanced/loadBalanced-true-txt.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/load-balanced/srvMaxHosts-conflicts_with_loadBalanced-true-txt.json b/specifications/initial-dns-seedlist-discovery/tests/load-balanced/srvMaxHosts-conflicts_with_loadBalanced-true-txt.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/load-balanced/srvMaxHosts-conflicts_with_loadBalanced-true-txt.json
rename to specifications/initial-dns-seedlist-discovery/tests/load-balanced/srvMaxHosts-conflicts_with_loadBalanced-true-txt.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/load-balanced/srvMaxHosts-conflicts_with_loadBalanced-true-txt.yml b/specifications/initial-dns-seedlist-discovery/tests/load-balanced/srvMaxHosts-conflicts_with_loadBalanced-true-txt.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/load-balanced/srvMaxHosts-conflicts_with_loadBalanced-true-txt.yml
rename to specifications/initial-dns-seedlist-discovery/tests/load-balanced/srvMaxHosts-conflicts_with_loadBalanced-true-txt.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/load-balanced/srvMaxHosts-conflicts_with_loadBalanced-true.json b/specifications/initial-dns-seedlist-discovery/tests/load-balanced/srvMaxHosts-conflicts_with_loadBalanced-true.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/load-balanced/srvMaxHosts-conflicts_with_loadBalanced-true.json
rename to specifications/initial-dns-seedlist-discovery/tests/load-balanced/srvMaxHosts-conflicts_with_loadBalanced-true.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/load-balanced/srvMaxHosts-conflicts_with_loadBalanced-true.yml b/specifications/initial-dns-seedlist-discovery/tests/load-balanced/srvMaxHosts-conflicts_with_loadBalanced-true.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/load-balanced/srvMaxHosts-conflicts_with_loadBalanced-true.yml
rename to specifications/initial-dns-seedlist-discovery/tests/load-balanced/srvMaxHosts-conflicts_with_loadBalanced-true.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/load-balanced/srvMaxHosts-zero-txt.json b/specifications/initial-dns-seedlist-discovery/tests/load-balanced/srvMaxHosts-zero-txt.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/load-balanced/srvMaxHosts-zero-txt.json
rename to specifications/initial-dns-seedlist-discovery/tests/load-balanced/srvMaxHosts-zero-txt.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/load-balanced/srvMaxHosts-zero-txt.yml b/specifications/initial-dns-seedlist-discovery/tests/load-balanced/srvMaxHosts-zero-txt.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/load-balanced/srvMaxHosts-zero-txt.yml
rename to specifications/initial-dns-seedlist-discovery/tests/load-balanced/srvMaxHosts-zero-txt.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/load-balanced/srvMaxHosts-zero.json b/specifications/initial-dns-seedlist-discovery/tests/load-balanced/srvMaxHosts-zero.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/load-balanced/srvMaxHosts-zero.json
rename to specifications/initial-dns-seedlist-discovery/tests/load-balanced/srvMaxHosts-zero.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/load-balanced/srvMaxHosts-zero.yml b/specifications/initial-dns-seedlist-discovery/tests/load-balanced/srvMaxHosts-zero.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/load-balanced/srvMaxHosts-zero.yml
rename to specifications/initial-dns-seedlist-discovery/tests/load-balanced/srvMaxHosts-zero.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/longer-parent-in-return.json b/specifications/initial-dns-seedlist-discovery/tests/longer-parent-in-return.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/longer-parent-in-return.json
rename to specifications/initial-dns-seedlist-discovery/tests/longer-parent-in-return.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/longer-parent-in-return.yml b/specifications/initial-dns-seedlist-discovery/tests/longer-parent-in-return.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/longer-parent-in-return.yml
rename to specifications/initial-dns-seedlist-discovery/tests/longer-parent-in-return.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/misformatted-option.json b/specifications/initial-dns-seedlist-discovery/tests/misformatted-option.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/misformatted-option.json
rename to specifications/initial-dns-seedlist-discovery/tests/misformatted-option.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/misformatted-option.yml b/specifications/initial-dns-seedlist-discovery/tests/misformatted-option.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/misformatted-option.yml
rename to specifications/initial-dns-seedlist-discovery/tests/misformatted-option.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/no-results.json b/specifications/initial-dns-seedlist-discovery/tests/no-results.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/no-results.json
rename to specifications/initial-dns-seedlist-discovery/tests/no-results.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/no-results.yml b/specifications/initial-dns-seedlist-discovery/tests/no-results.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/no-results.yml
rename to specifications/initial-dns-seedlist-discovery/tests/no-results.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/not-enough-parts.json b/specifications/initial-dns-seedlist-discovery/tests/not-enough-parts.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/not-enough-parts.json
rename to specifications/initial-dns-seedlist-discovery/tests/not-enough-parts.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/not-enough-parts.yml b/specifications/initial-dns-seedlist-discovery/tests/not-enough-parts.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/not-enough-parts.yml
rename to specifications/initial-dns-seedlist-discovery/tests/not-enough-parts.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/one-result-default-port.json b/specifications/initial-dns-seedlist-discovery/tests/one-result-default-port.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/one-result-default-port.json
rename to specifications/initial-dns-seedlist-discovery/tests/one-result-default-port.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/one-result-default-port.yml b/specifications/initial-dns-seedlist-discovery/tests/one-result-default-port.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/one-result-default-port.yml
rename to specifications/initial-dns-seedlist-discovery/tests/one-result-default-port.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/one-txt-record-multiple-strings.json b/specifications/initial-dns-seedlist-discovery/tests/one-txt-record-multiple-strings.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/one-txt-record-multiple-strings.json
rename to specifications/initial-dns-seedlist-discovery/tests/one-txt-record-multiple-strings.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/one-txt-record-multiple-strings.yml b/specifications/initial-dns-seedlist-discovery/tests/one-txt-record-multiple-strings.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/one-txt-record-multiple-strings.yml
rename to specifications/initial-dns-seedlist-discovery/tests/one-txt-record-multiple-strings.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/one-txt-record.json b/specifications/initial-dns-seedlist-discovery/tests/one-txt-record.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/one-txt-record.json
rename to specifications/initial-dns-seedlist-discovery/tests/one-txt-record.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/one-txt-record.yml b/specifications/initial-dns-seedlist-discovery/tests/one-txt-record.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/one-txt-record.yml
rename to specifications/initial-dns-seedlist-discovery/tests/one-txt-record.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/parent-part-mismatch1.json b/specifications/initial-dns-seedlist-discovery/tests/parent-part-mismatch1.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/parent-part-mismatch1.json
rename to specifications/initial-dns-seedlist-discovery/tests/parent-part-mismatch1.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/parent-part-mismatch1.yml b/specifications/initial-dns-seedlist-discovery/tests/parent-part-mismatch1.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/parent-part-mismatch1.yml
rename to specifications/initial-dns-seedlist-discovery/tests/parent-part-mismatch1.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/parent-part-mismatch2.json b/specifications/initial-dns-seedlist-discovery/tests/parent-part-mismatch2.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/parent-part-mismatch2.json
rename to specifications/initial-dns-seedlist-discovery/tests/parent-part-mismatch2.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/parent-part-mismatch2.yml b/specifications/initial-dns-seedlist-discovery/tests/parent-part-mismatch2.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/parent-part-mismatch2.yml
rename to specifications/initial-dns-seedlist-discovery/tests/parent-part-mismatch2.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/parent-part-mismatch3.json b/specifications/initial-dns-seedlist-discovery/tests/parent-part-mismatch3.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/parent-part-mismatch3.json
rename to specifications/initial-dns-seedlist-discovery/tests/parent-part-mismatch3.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/parent-part-mismatch3.yml b/specifications/initial-dns-seedlist-discovery/tests/parent-part-mismatch3.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/parent-part-mismatch3.yml
rename to specifications/initial-dns-seedlist-discovery/tests/parent-part-mismatch3.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/parent-part-mismatch4.json b/specifications/initial-dns-seedlist-discovery/tests/parent-part-mismatch4.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/parent-part-mismatch4.json
rename to specifications/initial-dns-seedlist-discovery/tests/parent-part-mismatch4.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/parent-part-mismatch4.yml b/specifications/initial-dns-seedlist-discovery/tests/parent-part-mismatch4.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/parent-part-mismatch4.yml
rename to specifications/initial-dns-seedlist-discovery/tests/parent-part-mismatch4.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/parent-part-mismatch5.json b/specifications/initial-dns-seedlist-discovery/tests/parent-part-mismatch5.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/parent-part-mismatch5.json
rename to specifications/initial-dns-seedlist-discovery/tests/parent-part-mismatch5.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/parent-part-mismatch5.yml b/specifications/initial-dns-seedlist-discovery/tests/parent-part-mismatch5.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/parent-part-mismatch5.yml
rename to specifications/initial-dns-seedlist-discovery/tests/parent-part-mismatch5.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/direct-connection-false.json b/specifications/initial-dns-seedlist-discovery/tests/replica-set/direct-connection-false.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/direct-connection-false.json
rename to specifications/initial-dns-seedlist-discovery/tests/replica-set/direct-connection-false.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/direct-connection-true.json b/specifications/initial-dns-seedlist-discovery/tests/replica-set/direct-connection-true.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/direct-connection-true.json
rename to specifications/initial-dns-seedlist-discovery/tests/replica-set/direct-connection-true.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/loadBalanced-false-txt.json b/specifications/initial-dns-seedlist-discovery/tests/replica-set/loadBalanced-false-txt.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/loadBalanced-false-txt.json
rename to specifications/initial-dns-seedlist-discovery/tests/replica-set/loadBalanced-false-txt.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/longer-parent-in-return.json b/specifications/initial-dns-seedlist-discovery/tests/replica-set/longer-parent-in-return.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/longer-parent-in-return.json
rename to specifications/initial-dns-seedlist-discovery/tests/replica-set/longer-parent-in-return.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/misformatted-option.json b/specifications/initial-dns-seedlist-discovery/tests/replica-set/misformatted-option.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/misformatted-option.json
rename to specifications/initial-dns-seedlist-discovery/tests/replica-set/misformatted-option.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/no-results.json b/specifications/initial-dns-seedlist-discovery/tests/replica-set/no-results.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/no-results.json
rename to specifications/initial-dns-seedlist-discovery/tests/replica-set/no-results.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/not-enough-parts.json b/specifications/initial-dns-seedlist-discovery/tests/replica-set/not-enough-parts.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/not-enough-parts.json
rename to specifications/initial-dns-seedlist-discovery/tests/replica-set/not-enough-parts.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/one-result-default-port.json b/specifications/initial-dns-seedlist-discovery/tests/replica-set/one-result-default-port.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/one-result-default-port.json
rename to specifications/initial-dns-seedlist-discovery/tests/replica-set/one-result-default-port.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/one-txt-record-multiple-strings.json b/specifications/initial-dns-seedlist-discovery/tests/replica-set/one-txt-record-multiple-strings.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/one-txt-record-multiple-strings.json
rename to specifications/initial-dns-seedlist-discovery/tests/replica-set/one-txt-record-multiple-strings.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/one-txt-record.json b/specifications/initial-dns-seedlist-discovery/tests/replica-set/one-txt-record.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/one-txt-record.json
rename to specifications/initial-dns-seedlist-discovery/tests/replica-set/one-txt-record.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/parent-part-mismatch1.json b/specifications/initial-dns-seedlist-discovery/tests/replica-set/parent-part-mismatch1.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/parent-part-mismatch1.json
rename to specifications/initial-dns-seedlist-discovery/tests/replica-set/parent-part-mismatch1.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/parent-part-mismatch2.json b/specifications/initial-dns-seedlist-discovery/tests/replica-set/parent-part-mismatch2.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/parent-part-mismatch2.json
rename to specifications/initial-dns-seedlist-discovery/tests/replica-set/parent-part-mismatch2.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/parent-part-mismatch3.json b/specifications/initial-dns-seedlist-discovery/tests/replica-set/parent-part-mismatch3.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/parent-part-mismatch3.json
rename to specifications/initial-dns-seedlist-discovery/tests/replica-set/parent-part-mismatch3.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/parent-part-mismatch4.json b/specifications/initial-dns-seedlist-discovery/tests/replica-set/parent-part-mismatch4.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/parent-part-mismatch4.json
rename to specifications/initial-dns-seedlist-discovery/tests/replica-set/parent-part-mismatch4.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/parent-part-mismatch5.json b/specifications/initial-dns-seedlist-discovery/tests/replica-set/parent-part-mismatch5.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/parent-part-mismatch5.json
rename to specifications/initial-dns-seedlist-discovery/tests/replica-set/parent-part-mismatch5.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/returned-parent-too-short.json b/specifications/initial-dns-seedlist-discovery/tests/replica-set/returned-parent-too-short.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/returned-parent-too-short.json
rename to specifications/initial-dns-seedlist-discovery/tests/replica-set/returned-parent-too-short.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/returned-parent-wrong.json b/specifications/initial-dns-seedlist-discovery/tests/replica-set/returned-parent-wrong.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/returned-parent-wrong.json
rename to specifications/initial-dns-seedlist-discovery/tests/replica-set/returned-parent-wrong.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-conflicts_with_replicaSet-txt.json b/specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-conflicts_with_replicaSet-txt.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-conflicts_with_replicaSet-txt.json
rename to specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-conflicts_with_replicaSet-txt.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-conflicts_with_replicaSet-txt.yml b/specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-conflicts_with_replicaSet-txt.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-conflicts_with_replicaSet-txt.yml
rename to specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-conflicts_with_replicaSet-txt.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-conflicts_with_replicaSet.json b/specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-conflicts_with_replicaSet.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-conflicts_with_replicaSet.json
rename to specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-conflicts_with_replicaSet.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-conflicts_with_replicaSet.yml b/specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-conflicts_with_replicaSet.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-conflicts_with_replicaSet.yml
rename to specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-conflicts_with_replicaSet.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-equal_to_srv_records.json b/specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-equal_to_srv_records.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-equal_to_srv_records.json
rename to specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-equal_to_srv_records.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-equal_to_srv_records.yml b/specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-equal_to_srv_records.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-equal_to_srv_records.yml
rename to specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-equal_to_srv_records.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-greater_than_srv_records.json b/specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-greater_than_srv_records.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-greater_than_srv_records.json
rename to specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-greater_than_srv_records.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-greater_than_srv_records.yml b/specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-greater_than_srv_records.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-greater_than_srv_records.yml
rename to specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-greater_than_srv_records.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-invalid_integer.json b/specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-invalid_integer.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-invalid_integer.json
rename to specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-invalid_integer.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-invalid_integer.yml b/specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-invalid_integer.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-invalid_integer.yml
rename to specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-invalid_integer.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-invalid_type.json b/specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-invalid_type.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-invalid_type.json
rename to specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-invalid_type.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-invalid_type.yml b/specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-invalid_type.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-invalid_type.yml
rename to specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-invalid_type.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-less_than_srv_records.json b/specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-less_than_srv_records.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-less_than_srv_records.json
rename to specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-less_than_srv_records.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-less_than_srv_records.yml b/specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-less_than_srv_records.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-less_than_srv_records.yml
rename to specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-less_than_srv_records.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-zero-txt.json b/specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-zero-txt.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-zero-txt.json
rename to specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-zero-txt.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-zero-txt.yml b/specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-zero-txt.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-zero-txt.yml
rename to specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-zero-txt.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-zero.json b/specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-zero.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-zero.json
rename to specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-zero.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-zero.yml b/specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-zero.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-zero.yml
rename to specifications/initial-dns-seedlist-discovery/tests/replica-set/srvMaxHosts-zero.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/two-results-default-port.json b/specifications/initial-dns-seedlist-discovery/tests/replica-set/two-results-default-port.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/two-results-default-port.json
rename to specifications/initial-dns-seedlist-discovery/tests/replica-set/two-results-default-port.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/two-results-nonstandard-port.json b/specifications/initial-dns-seedlist-discovery/tests/replica-set/two-results-nonstandard-port.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/two-results-nonstandard-port.json
rename to specifications/initial-dns-seedlist-discovery/tests/replica-set/two-results-nonstandard-port.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/two-txt-records.json b/specifications/initial-dns-seedlist-discovery/tests/replica-set/two-txt-records.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/two-txt-records.json
rename to specifications/initial-dns-seedlist-discovery/tests/replica-set/two-txt-records.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/txt-record-not-allowed-option.json b/specifications/initial-dns-seedlist-discovery/tests/replica-set/txt-record-not-allowed-option.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/txt-record-not-allowed-option.json
rename to specifications/initial-dns-seedlist-discovery/tests/replica-set/txt-record-not-allowed-option.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/txt-record-with-overridden-ssl-option.json b/specifications/initial-dns-seedlist-discovery/tests/replica-set/txt-record-with-overridden-ssl-option.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/txt-record-with-overridden-ssl-option.json
rename to specifications/initial-dns-seedlist-discovery/tests/replica-set/txt-record-with-overridden-ssl-option.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/txt-record-with-overridden-uri-option.json b/specifications/initial-dns-seedlist-discovery/tests/replica-set/txt-record-with-overridden-uri-option.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/txt-record-with-overridden-uri-option.json
rename to specifications/initial-dns-seedlist-discovery/tests/replica-set/txt-record-with-overridden-uri-option.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/txt-record-with-unallowed-option.json b/specifications/initial-dns-seedlist-discovery/tests/replica-set/txt-record-with-unallowed-option.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/txt-record-with-unallowed-option.json
rename to specifications/initial-dns-seedlist-discovery/tests/replica-set/txt-record-with-unallowed-option.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/uri-with-port.json b/specifications/initial-dns-seedlist-discovery/tests/replica-set/uri-with-port.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/uri-with-port.json
rename to specifications/initial-dns-seedlist-discovery/tests/replica-set/uri-with-port.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/uri-with-two-hosts.json b/specifications/initial-dns-seedlist-discovery/tests/replica-set/uri-with-two-hosts.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/replica-set/uri-with-two-hosts.json
rename to specifications/initial-dns-seedlist-discovery/tests/replica-set/uri-with-two-hosts.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/returned-parent-too-short.json b/specifications/initial-dns-seedlist-discovery/tests/returned-parent-too-short.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/returned-parent-too-short.json
rename to specifications/initial-dns-seedlist-discovery/tests/returned-parent-too-short.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/returned-parent-too-short.yml b/specifications/initial-dns-seedlist-discovery/tests/returned-parent-too-short.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/returned-parent-too-short.yml
rename to specifications/initial-dns-seedlist-discovery/tests/returned-parent-too-short.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/returned-parent-wrong.json b/specifications/initial-dns-seedlist-discovery/tests/returned-parent-wrong.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/returned-parent-wrong.json
rename to specifications/initial-dns-seedlist-discovery/tests/returned-parent-wrong.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/returned-parent-wrong.yml b/specifications/initial-dns-seedlist-discovery/tests/returned-parent-wrong.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/returned-parent-wrong.yml
rename to specifications/initial-dns-seedlist-discovery/tests/returned-parent-wrong.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/sharded/srvMaxHosts-equal_to_srv_records.json b/specifications/initial-dns-seedlist-discovery/tests/sharded/srvMaxHosts-equal_to_srv_records.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/sharded/srvMaxHosts-equal_to_srv_records.json
rename to specifications/initial-dns-seedlist-discovery/tests/sharded/srvMaxHosts-equal_to_srv_records.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/sharded/srvMaxHosts-equal_to_srv_records.yml b/specifications/initial-dns-seedlist-discovery/tests/sharded/srvMaxHosts-equal_to_srv_records.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/sharded/srvMaxHosts-equal_to_srv_records.yml
rename to specifications/initial-dns-seedlist-discovery/tests/sharded/srvMaxHosts-equal_to_srv_records.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/sharded/srvMaxHosts-greater_than_srv_records.json b/specifications/initial-dns-seedlist-discovery/tests/sharded/srvMaxHosts-greater_than_srv_records.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/sharded/srvMaxHosts-greater_than_srv_records.json
rename to specifications/initial-dns-seedlist-discovery/tests/sharded/srvMaxHosts-greater_than_srv_records.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/sharded/srvMaxHosts-greater_than_srv_records.yml b/specifications/initial-dns-seedlist-discovery/tests/sharded/srvMaxHosts-greater_than_srv_records.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/sharded/srvMaxHosts-greater_than_srv_records.yml
rename to specifications/initial-dns-seedlist-discovery/tests/sharded/srvMaxHosts-greater_than_srv_records.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/sharded/srvMaxHosts-invalid_integer.json b/specifications/initial-dns-seedlist-discovery/tests/sharded/srvMaxHosts-invalid_integer.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/sharded/srvMaxHosts-invalid_integer.json
rename to specifications/initial-dns-seedlist-discovery/tests/sharded/srvMaxHosts-invalid_integer.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/sharded/srvMaxHosts-invalid_integer.yml b/specifications/initial-dns-seedlist-discovery/tests/sharded/srvMaxHosts-invalid_integer.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/sharded/srvMaxHosts-invalid_integer.yml
rename to specifications/initial-dns-seedlist-discovery/tests/sharded/srvMaxHosts-invalid_integer.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/sharded/srvMaxHosts-invalid_type.json b/specifications/initial-dns-seedlist-discovery/tests/sharded/srvMaxHosts-invalid_type.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/sharded/srvMaxHosts-invalid_type.json
rename to specifications/initial-dns-seedlist-discovery/tests/sharded/srvMaxHosts-invalid_type.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/sharded/srvMaxHosts-invalid_type.yml b/specifications/initial-dns-seedlist-discovery/tests/sharded/srvMaxHosts-invalid_type.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/sharded/srvMaxHosts-invalid_type.yml
rename to specifications/initial-dns-seedlist-discovery/tests/sharded/srvMaxHosts-invalid_type.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/sharded/srvMaxHosts-less_than_srv_records.json b/specifications/initial-dns-seedlist-discovery/tests/sharded/srvMaxHosts-less_than_srv_records.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/sharded/srvMaxHosts-less_than_srv_records.json
rename to specifications/initial-dns-seedlist-discovery/tests/sharded/srvMaxHosts-less_than_srv_records.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/sharded/srvMaxHosts-less_than_srv_records.yml b/specifications/initial-dns-seedlist-discovery/tests/sharded/srvMaxHosts-less_than_srv_records.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/sharded/srvMaxHosts-less_than_srv_records.yml
rename to specifications/initial-dns-seedlist-discovery/tests/sharded/srvMaxHosts-less_than_srv_records.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/sharded/srvMaxHosts-zero.json b/specifications/initial-dns-seedlist-discovery/tests/sharded/srvMaxHosts-zero.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/sharded/srvMaxHosts-zero.json
rename to specifications/initial-dns-seedlist-discovery/tests/sharded/srvMaxHosts-zero.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/sharded/srvMaxHosts-zero.yml b/specifications/initial-dns-seedlist-discovery/tests/sharded/srvMaxHosts-zero.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/sharded/srvMaxHosts-zero.yml
rename to specifications/initial-dns-seedlist-discovery/tests/sharded/srvMaxHosts-zero.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/two-results-default-port.json b/specifications/initial-dns-seedlist-discovery/tests/two-results-default-port.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/two-results-default-port.json
rename to specifications/initial-dns-seedlist-discovery/tests/two-results-default-port.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/two-results-default-port.yml b/specifications/initial-dns-seedlist-discovery/tests/two-results-default-port.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/two-results-default-port.yml
rename to specifications/initial-dns-seedlist-discovery/tests/two-results-default-port.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/two-results-nonstandard-port.json b/specifications/initial-dns-seedlist-discovery/tests/two-results-nonstandard-port.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/two-results-nonstandard-port.json
rename to specifications/initial-dns-seedlist-discovery/tests/two-results-nonstandard-port.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/two-results-nonstandard-port.yml b/specifications/initial-dns-seedlist-discovery/tests/two-results-nonstandard-port.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/two-results-nonstandard-port.yml
rename to specifications/initial-dns-seedlist-discovery/tests/two-results-nonstandard-port.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/two-txt-records.json b/specifications/initial-dns-seedlist-discovery/tests/two-txt-records.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/two-txt-records.json
rename to specifications/initial-dns-seedlist-discovery/tests/two-txt-records.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/two-txt-records.yml b/specifications/initial-dns-seedlist-discovery/tests/two-txt-records.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/two-txt-records.yml
rename to specifications/initial-dns-seedlist-discovery/tests/two-txt-records.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/txt-record-not-allowed-option.json b/specifications/initial-dns-seedlist-discovery/tests/txt-record-not-allowed-option.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/txt-record-not-allowed-option.json
rename to specifications/initial-dns-seedlist-discovery/tests/txt-record-not-allowed-option.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/txt-record-not-allowed-option.yml b/specifications/initial-dns-seedlist-discovery/tests/txt-record-not-allowed-option.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/txt-record-not-allowed-option.yml
rename to specifications/initial-dns-seedlist-discovery/tests/txt-record-not-allowed-option.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/txt-record-with-overridden-ssl-option.json b/specifications/initial-dns-seedlist-discovery/tests/txt-record-with-overridden-ssl-option.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/txt-record-with-overridden-ssl-option.json
rename to specifications/initial-dns-seedlist-discovery/tests/txt-record-with-overridden-ssl-option.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/txt-record-with-overridden-ssl-option.yml b/specifications/initial-dns-seedlist-discovery/tests/txt-record-with-overridden-ssl-option.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/txt-record-with-overridden-ssl-option.yml
rename to specifications/initial-dns-seedlist-discovery/tests/txt-record-with-overridden-ssl-option.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/txt-record-with-overridden-uri-option.json b/specifications/initial-dns-seedlist-discovery/tests/txt-record-with-overridden-uri-option.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/txt-record-with-overridden-uri-option.json
rename to specifications/initial-dns-seedlist-discovery/tests/txt-record-with-overridden-uri-option.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/txt-record-with-overridden-uri-option.yml b/specifications/initial-dns-seedlist-discovery/tests/txt-record-with-overridden-uri-option.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/txt-record-with-overridden-uri-option.yml
rename to specifications/initial-dns-seedlist-discovery/tests/txt-record-with-overridden-uri-option.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/txt-record-with-unallowed-option.json b/specifications/initial-dns-seedlist-discovery/tests/txt-record-with-unallowed-option.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/txt-record-with-unallowed-option.json
rename to specifications/initial-dns-seedlist-discovery/tests/txt-record-with-unallowed-option.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/txt-record-with-unallowed-option.yml b/specifications/initial-dns-seedlist-discovery/tests/txt-record-with-unallowed-option.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/txt-record-with-unallowed-option.yml
rename to specifications/initial-dns-seedlist-discovery/tests/txt-record-with-unallowed-option.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/uri-with-port.json b/specifications/initial-dns-seedlist-discovery/tests/uri-with-port.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/uri-with-port.json
rename to specifications/initial-dns-seedlist-discovery/tests/uri-with-port.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/uri-with-port.yml b/specifications/initial-dns-seedlist-discovery/tests/uri-with-port.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/uri-with-port.yml
rename to specifications/initial-dns-seedlist-discovery/tests/uri-with-port.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/uri-with-two-hosts.json b/specifications/initial-dns-seedlist-discovery/tests/uri-with-two-hosts.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/uri-with-two-hosts.json
rename to specifications/initial-dns-seedlist-discovery/tests/uri-with-two-hosts.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/uri-with-two-hosts.yml b/specifications/initial-dns-seedlist-discovery/tests/uri-with-two-hosts.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/initial-dns-seedlist-discovery/tests/uri-with-two-hosts.yml
rename to specifications/initial-dns-seedlist-discovery/tests/uri-with-two-hosts.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/load-balancers/tests/README.rst b/specifications/load-balancers/tests/README.rst
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/load-balancers/tests/README.rst
rename to specifications/load-balancers/tests/README.rst
diff --git a/tests/MongoDB.Driver.Tests/Specifications/load-balancers/tests/cursors.json b/specifications/load-balancers/tests/cursors.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/load-balancers/tests/cursors.json
rename to specifications/load-balancers/tests/cursors.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/load-balancers/tests/cursors.yml b/specifications/load-balancers/tests/cursors.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/load-balancers/tests/cursors.yml
rename to specifications/load-balancers/tests/cursors.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/load-balancers/tests/event-monitoring.json b/specifications/load-balancers/tests/event-monitoring.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/load-balancers/tests/event-monitoring.json
rename to specifications/load-balancers/tests/event-monitoring.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/load-balancers/tests/event-monitoring.yml b/specifications/load-balancers/tests/event-monitoring.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/load-balancers/tests/event-monitoring.yml
rename to specifications/load-balancers/tests/event-monitoring.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/load-balancers/tests/lb-connection-establishment.json b/specifications/load-balancers/tests/lb-connection-establishment.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/load-balancers/tests/lb-connection-establishment.json
rename to specifications/load-balancers/tests/lb-connection-establishment.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/load-balancers/tests/lb-connection-establishment.yml b/specifications/load-balancers/tests/lb-connection-establishment.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/load-balancers/tests/lb-connection-establishment.yml
rename to specifications/load-balancers/tests/lb-connection-establishment.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/load-balancers/tests/non-lb-connection-establishment.json b/specifications/load-balancers/tests/non-lb-connection-establishment.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/load-balancers/tests/non-lb-connection-establishment.json
rename to specifications/load-balancers/tests/non-lb-connection-establishment.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/load-balancers/tests/non-lb-connection-establishment.yml b/specifications/load-balancers/tests/non-lb-connection-establishment.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/load-balancers/tests/non-lb-connection-establishment.yml
rename to specifications/load-balancers/tests/non-lb-connection-establishment.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/load-balancers/tests/sdam-error-handling.json b/specifications/load-balancers/tests/sdam-error-handling.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/load-balancers/tests/sdam-error-handling.json
rename to specifications/load-balancers/tests/sdam-error-handling.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/load-balancers/tests/sdam-error-handling.yml b/specifications/load-balancers/tests/sdam-error-handling.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/load-balancers/tests/sdam-error-handling.yml
rename to specifications/load-balancers/tests/sdam-error-handling.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/load-balancers/tests/server-selection.json b/specifications/load-balancers/tests/server-selection.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/load-balancers/tests/server-selection.json
rename to specifications/load-balancers/tests/server-selection.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/load-balancers/tests/server-selection.yml b/specifications/load-balancers/tests/server-selection.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/load-balancers/tests/server-selection.yml
rename to specifications/load-balancers/tests/server-selection.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/load-balancers/tests/transactions.json b/specifications/load-balancers/tests/transactions.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/load-balancers/tests/transactions.json
rename to specifications/load-balancers/tests/transactions.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/load-balancers/tests/transactions.yml b/specifications/load-balancers/tests/transactions.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/load-balancers/tests/transactions.yml
rename to specifications/load-balancers/tests/transactions.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/load-balancers/tests/wait-queue-timeouts.json b/specifications/load-balancers/tests/wait-queue-timeouts.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/load-balancers/tests/wait-queue-timeouts.json
rename to specifications/load-balancers/tests/wait-queue-timeouts.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/load-balancers/tests/wait-queue-timeouts.yml b/specifications/load-balancers/tests/wait-queue-timeouts.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/load-balancers/tests/wait-queue-timeouts.yml
rename to specifications/load-balancers/tests/wait-queue-timeouts.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/origin.txt b/specifications/max-staleness/origin.txt
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/origin.txt
rename to specifications/max-staleness/origin.txt
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/runner.txt b/specifications/max-staleness/runner.txt
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/runner.txt
rename to specifications/max-staleness/runner.txt
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/README.rst b/specifications/max-staleness/tests/README.rst
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/README.rst
rename to specifications/max-staleness/tests/README.rst
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetNoPrimary/DefaultNoMaxStaleness.json b/specifications/max-staleness/tests/ReplicaSetNoPrimary/DefaultNoMaxStaleness.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetNoPrimary/DefaultNoMaxStaleness.json
rename to specifications/max-staleness/tests/ReplicaSetNoPrimary/DefaultNoMaxStaleness.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetNoPrimary/DefaultNoMaxStaleness.yml b/specifications/max-staleness/tests/ReplicaSetNoPrimary/DefaultNoMaxStaleness.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetNoPrimary/DefaultNoMaxStaleness.yml
rename to specifications/max-staleness/tests/ReplicaSetNoPrimary/DefaultNoMaxStaleness.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetNoPrimary/LastUpdateTime.json b/specifications/max-staleness/tests/ReplicaSetNoPrimary/LastUpdateTime.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetNoPrimary/LastUpdateTime.json
rename to specifications/max-staleness/tests/ReplicaSetNoPrimary/LastUpdateTime.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetNoPrimary/LastUpdateTime.yml b/specifications/max-staleness/tests/ReplicaSetNoPrimary/LastUpdateTime.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetNoPrimary/LastUpdateTime.yml
rename to specifications/max-staleness/tests/ReplicaSetNoPrimary/LastUpdateTime.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetNoPrimary/MaxStalenessTooSmall.json b/specifications/max-staleness/tests/ReplicaSetNoPrimary/MaxStalenessTooSmall.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetNoPrimary/MaxStalenessTooSmall.json
rename to specifications/max-staleness/tests/ReplicaSetNoPrimary/MaxStalenessTooSmall.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetNoPrimary/MaxStalenessTooSmall.yml b/specifications/max-staleness/tests/ReplicaSetNoPrimary/MaxStalenessTooSmall.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetNoPrimary/MaxStalenessTooSmall.yml
rename to specifications/max-staleness/tests/ReplicaSetNoPrimary/MaxStalenessTooSmall.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetNoPrimary/Nearest.json b/specifications/max-staleness/tests/ReplicaSetNoPrimary/Nearest.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetNoPrimary/Nearest.json
rename to specifications/max-staleness/tests/ReplicaSetNoPrimary/Nearest.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetNoPrimary/Nearest.yml b/specifications/max-staleness/tests/ReplicaSetNoPrimary/Nearest.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetNoPrimary/Nearest.yml
rename to specifications/max-staleness/tests/ReplicaSetNoPrimary/Nearest.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetNoPrimary/Nearest2.json b/specifications/max-staleness/tests/ReplicaSetNoPrimary/Nearest2.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetNoPrimary/Nearest2.json
rename to specifications/max-staleness/tests/ReplicaSetNoPrimary/Nearest2.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetNoPrimary/Nearest2.yml b/specifications/max-staleness/tests/ReplicaSetNoPrimary/Nearest2.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetNoPrimary/Nearest2.yml
rename to specifications/max-staleness/tests/ReplicaSetNoPrimary/Nearest2.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetNoPrimary/NoKnownServers.json b/specifications/max-staleness/tests/ReplicaSetNoPrimary/NoKnownServers.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetNoPrimary/NoKnownServers.json
rename to specifications/max-staleness/tests/ReplicaSetNoPrimary/NoKnownServers.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetNoPrimary/NoKnownServers.yml b/specifications/max-staleness/tests/ReplicaSetNoPrimary/NoKnownServers.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetNoPrimary/NoKnownServers.yml
rename to specifications/max-staleness/tests/ReplicaSetNoPrimary/NoKnownServers.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetNoPrimary/OneKnownTwoUnavailable.json b/specifications/max-staleness/tests/ReplicaSetNoPrimary/OneKnownTwoUnavailable.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetNoPrimary/OneKnownTwoUnavailable.json
rename to specifications/max-staleness/tests/ReplicaSetNoPrimary/OneKnownTwoUnavailable.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetNoPrimary/OneKnownTwoUnavailable.yml b/specifications/max-staleness/tests/ReplicaSetNoPrimary/OneKnownTwoUnavailable.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetNoPrimary/OneKnownTwoUnavailable.yml
rename to specifications/max-staleness/tests/ReplicaSetNoPrimary/OneKnownTwoUnavailable.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetNoPrimary/PrimaryPreferred.json b/specifications/max-staleness/tests/ReplicaSetNoPrimary/PrimaryPreferred.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetNoPrimary/PrimaryPreferred.json
rename to specifications/max-staleness/tests/ReplicaSetNoPrimary/PrimaryPreferred.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetNoPrimary/PrimaryPreferred.yml b/specifications/max-staleness/tests/ReplicaSetNoPrimary/PrimaryPreferred.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetNoPrimary/PrimaryPreferred.yml
rename to specifications/max-staleness/tests/ReplicaSetNoPrimary/PrimaryPreferred.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetNoPrimary/PrimaryPreferred_tags.json b/specifications/max-staleness/tests/ReplicaSetNoPrimary/PrimaryPreferred_tags.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetNoPrimary/PrimaryPreferred_tags.json
rename to specifications/max-staleness/tests/ReplicaSetNoPrimary/PrimaryPreferred_tags.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetNoPrimary/PrimaryPreferred_tags.yml b/specifications/max-staleness/tests/ReplicaSetNoPrimary/PrimaryPreferred_tags.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetNoPrimary/PrimaryPreferred_tags.yml
rename to specifications/max-staleness/tests/ReplicaSetNoPrimary/PrimaryPreferred_tags.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetNoPrimary/Secondary.json b/specifications/max-staleness/tests/ReplicaSetNoPrimary/Secondary.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetNoPrimary/Secondary.json
rename to specifications/max-staleness/tests/ReplicaSetNoPrimary/Secondary.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetNoPrimary/Secondary.yml b/specifications/max-staleness/tests/ReplicaSetNoPrimary/Secondary.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetNoPrimary/Secondary.yml
rename to specifications/max-staleness/tests/ReplicaSetNoPrimary/Secondary.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetNoPrimary/SecondaryPreferred.json b/specifications/max-staleness/tests/ReplicaSetNoPrimary/SecondaryPreferred.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetNoPrimary/SecondaryPreferred.json
rename to specifications/max-staleness/tests/ReplicaSetNoPrimary/SecondaryPreferred.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetNoPrimary/SecondaryPreferred.yml b/specifications/max-staleness/tests/ReplicaSetNoPrimary/SecondaryPreferred.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetNoPrimary/SecondaryPreferred.yml
rename to specifications/max-staleness/tests/ReplicaSetNoPrimary/SecondaryPreferred.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetNoPrimary/SecondaryPreferred_tags.json b/specifications/max-staleness/tests/ReplicaSetNoPrimary/SecondaryPreferred_tags.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetNoPrimary/SecondaryPreferred_tags.json
rename to specifications/max-staleness/tests/ReplicaSetNoPrimary/SecondaryPreferred_tags.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetNoPrimary/SecondaryPreferred_tags.yml b/specifications/max-staleness/tests/ReplicaSetNoPrimary/SecondaryPreferred_tags.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetNoPrimary/SecondaryPreferred_tags.yml
rename to specifications/max-staleness/tests/ReplicaSetNoPrimary/SecondaryPreferred_tags.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetNoPrimary/ZeroMaxStaleness.json b/specifications/max-staleness/tests/ReplicaSetNoPrimary/ZeroMaxStaleness.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetNoPrimary/ZeroMaxStaleness.json
rename to specifications/max-staleness/tests/ReplicaSetNoPrimary/ZeroMaxStaleness.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetNoPrimary/ZeroMaxStaleness.yml b/specifications/max-staleness/tests/ReplicaSetNoPrimary/ZeroMaxStaleness.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetNoPrimary/ZeroMaxStaleness.yml
rename to specifications/max-staleness/tests/ReplicaSetNoPrimary/ZeroMaxStaleness.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/DefaultNoMaxStaleness.json b/specifications/max-staleness/tests/ReplicaSetWithPrimary/DefaultNoMaxStaleness.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/DefaultNoMaxStaleness.json
rename to specifications/max-staleness/tests/ReplicaSetWithPrimary/DefaultNoMaxStaleness.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/DefaultNoMaxStaleness.yml b/specifications/max-staleness/tests/ReplicaSetWithPrimary/DefaultNoMaxStaleness.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/DefaultNoMaxStaleness.yml
rename to specifications/max-staleness/tests/ReplicaSetWithPrimary/DefaultNoMaxStaleness.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/LastUpdateTime.json b/specifications/max-staleness/tests/ReplicaSetWithPrimary/LastUpdateTime.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/LastUpdateTime.json
rename to specifications/max-staleness/tests/ReplicaSetWithPrimary/LastUpdateTime.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/LastUpdateTime.yml b/specifications/max-staleness/tests/ReplicaSetWithPrimary/LastUpdateTime.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/LastUpdateTime.yml
rename to specifications/max-staleness/tests/ReplicaSetWithPrimary/LastUpdateTime.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/LongHeartbeat.json b/specifications/max-staleness/tests/ReplicaSetWithPrimary/LongHeartbeat.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/LongHeartbeat.json
rename to specifications/max-staleness/tests/ReplicaSetWithPrimary/LongHeartbeat.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/LongHeartbeat.yml b/specifications/max-staleness/tests/ReplicaSetWithPrimary/LongHeartbeat.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/LongHeartbeat.yml
rename to specifications/max-staleness/tests/ReplicaSetWithPrimary/LongHeartbeat.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/LongHeartbeat2.json b/specifications/max-staleness/tests/ReplicaSetWithPrimary/LongHeartbeat2.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/LongHeartbeat2.json
rename to specifications/max-staleness/tests/ReplicaSetWithPrimary/LongHeartbeat2.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/LongHeartbeat2.yml b/specifications/max-staleness/tests/ReplicaSetWithPrimary/LongHeartbeat2.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/LongHeartbeat2.yml
rename to specifications/max-staleness/tests/ReplicaSetWithPrimary/LongHeartbeat2.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/MaxStalenessTooSmall.json b/specifications/max-staleness/tests/ReplicaSetWithPrimary/MaxStalenessTooSmall.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/MaxStalenessTooSmall.json
rename to specifications/max-staleness/tests/ReplicaSetWithPrimary/MaxStalenessTooSmall.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/MaxStalenessTooSmall.yml b/specifications/max-staleness/tests/ReplicaSetWithPrimary/MaxStalenessTooSmall.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/MaxStalenessTooSmall.yml
rename to specifications/max-staleness/tests/ReplicaSetWithPrimary/MaxStalenessTooSmall.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/MaxStalenessWithModePrimary.json b/specifications/max-staleness/tests/ReplicaSetWithPrimary/MaxStalenessWithModePrimary.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/MaxStalenessWithModePrimary.json
rename to specifications/max-staleness/tests/ReplicaSetWithPrimary/MaxStalenessWithModePrimary.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/MaxStalenessWithModePrimary.yml b/specifications/max-staleness/tests/ReplicaSetWithPrimary/MaxStalenessWithModePrimary.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/MaxStalenessWithModePrimary.yml
rename to specifications/max-staleness/tests/ReplicaSetWithPrimary/MaxStalenessWithModePrimary.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/Nearest.json b/specifications/max-staleness/tests/ReplicaSetWithPrimary/Nearest.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/Nearest.json
rename to specifications/max-staleness/tests/ReplicaSetWithPrimary/Nearest.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/Nearest.yml b/specifications/max-staleness/tests/ReplicaSetWithPrimary/Nearest.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/Nearest.yml
rename to specifications/max-staleness/tests/ReplicaSetWithPrimary/Nearest.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/Nearest2.json b/specifications/max-staleness/tests/ReplicaSetWithPrimary/Nearest2.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/Nearest2.json
rename to specifications/max-staleness/tests/ReplicaSetWithPrimary/Nearest2.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/Nearest2.yml b/specifications/max-staleness/tests/ReplicaSetWithPrimary/Nearest2.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/Nearest2.yml
rename to specifications/max-staleness/tests/ReplicaSetWithPrimary/Nearest2.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/Nearest_tags.json b/specifications/max-staleness/tests/ReplicaSetWithPrimary/Nearest_tags.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/Nearest_tags.json
rename to specifications/max-staleness/tests/ReplicaSetWithPrimary/Nearest_tags.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/Nearest_tags.yml b/specifications/max-staleness/tests/ReplicaSetWithPrimary/Nearest_tags.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/Nearest_tags.yml
rename to specifications/max-staleness/tests/ReplicaSetWithPrimary/Nearest_tags.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/PrimaryPreferred.json b/specifications/max-staleness/tests/ReplicaSetWithPrimary/PrimaryPreferred.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/PrimaryPreferred.json
rename to specifications/max-staleness/tests/ReplicaSetWithPrimary/PrimaryPreferred.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/PrimaryPreferred.yml b/specifications/max-staleness/tests/ReplicaSetWithPrimary/PrimaryPreferred.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/PrimaryPreferred.yml
rename to specifications/max-staleness/tests/ReplicaSetWithPrimary/PrimaryPreferred.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/SecondaryPreferred.json b/specifications/max-staleness/tests/ReplicaSetWithPrimary/SecondaryPreferred.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/SecondaryPreferred.json
rename to specifications/max-staleness/tests/ReplicaSetWithPrimary/SecondaryPreferred.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/SecondaryPreferred.yml b/specifications/max-staleness/tests/ReplicaSetWithPrimary/SecondaryPreferred.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/SecondaryPreferred.yml
rename to specifications/max-staleness/tests/ReplicaSetWithPrimary/SecondaryPreferred.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/SecondaryPreferred_tags.json b/specifications/max-staleness/tests/ReplicaSetWithPrimary/SecondaryPreferred_tags.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/SecondaryPreferred_tags.json
rename to specifications/max-staleness/tests/ReplicaSetWithPrimary/SecondaryPreferred_tags.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/SecondaryPreferred_tags.yml b/specifications/max-staleness/tests/ReplicaSetWithPrimary/SecondaryPreferred_tags.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/SecondaryPreferred_tags.yml
rename to specifications/max-staleness/tests/ReplicaSetWithPrimary/SecondaryPreferred_tags.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/SecondaryPreferred_tags2.json b/specifications/max-staleness/tests/ReplicaSetWithPrimary/SecondaryPreferred_tags2.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/SecondaryPreferred_tags2.json
rename to specifications/max-staleness/tests/ReplicaSetWithPrimary/SecondaryPreferred_tags2.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/SecondaryPreferred_tags2.yml b/specifications/max-staleness/tests/ReplicaSetWithPrimary/SecondaryPreferred_tags2.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/SecondaryPreferred_tags2.yml
rename to specifications/max-staleness/tests/ReplicaSetWithPrimary/SecondaryPreferred_tags2.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/Secondary_tags.json b/specifications/max-staleness/tests/ReplicaSetWithPrimary/Secondary_tags.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/Secondary_tags.json
rename to specifications/max-staleness/tests/ReplicaSetWithPrimary/Secondary_tags.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/Secondary_tags.yml b/specifications/max-staleness/tests/ReplicaSetWithPrimary/Secondary_tags.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/Secondary_tags.yml
rename to specifications/max-staleness/tests/ReplicaSetWithPrimary/Secondary_tags.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/Secondary_tags2.json b/specifications/max-staleness/tests/ReplicaSetWithPrimary/Secondary_tags2.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/Secondary_tags2.json
rename to specifications/max-staleness/tests/ReplicaSetWithPrimary/Secondary_tags2.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/Secondary_tags2.yml b/specifications/max-staleness/tests/ReplicaSetWithPrimary/Secondary_tags2.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/Secondary_tags2.yml
rename to specifications/max-staleness/tests/ReplicaSetWithPrimary/Secondary_tags2.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/ZeroMaxStaleness.json b/specifications/max-staleness/tests/ReplicaSetWithPrimary/ZeroMaxStaleness.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/ZeroMaxStaleness.json
rename to specifications/max-staleness/tests/ReplicaSetWithPrimary/ZeroMaxStaleness.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/ZeroMaxStaleness.yml b/specifications/max-staleness/tests/ReplicaSetWithPrimary/ZeroMaxStaleness.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/ReplicaSetWithPrimary/ZeroMaxStaleness.yml
rename to specifications/max-staleness/tests/ReplicaSetWithPrimary/ZeroMaxStaleness.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/Sharded/SmallMaxStaleness.json b/specifications/max-staleness/tests/Sharded/SmallMaxStaleness.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/Sharded/SmallMaxStaleness.json
rename to specifications/max-staleness/tests/Sharded/SmallMaxStaleness.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/Sharded/SmallMaxStaleness.yml b/specifications/max-staleness/tests/Sharded/SmallMaxStaleness.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/Sharded/SmallMaxStaleness.yml
rename to specifications/max-staleness/tests/Sharded/SmallMaxStaleness.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/Single/SmallMaxStaleness.json b/specifications/max-staleness/tests/Single/SmallMaxStaleness.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/Single/SmallMaxStaleness.json
rename to specifications/max-staleness/tests/Single/SmallMaxStaleness.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/Single/SmallMaxStaleness.yml b/specifications/max-staleness/tests/Single/SmallMaxStaleness.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/Single/SmallMaxStaleness.yml
rename to specifications/max-staleness/tests/Single/SmallMaxStaleness.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/Unknown/SmallMaxStaleness.json b/specifications/max-staleness/tests/Unknown/SmallMaxStaleness.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/Unknown/SmallMaxStaleness.json
rename to specifications/max-staleness/tests/Unknown/SmallMaxStaleness.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/Unknown/SmallMaxStaleness.yml b/specifications/max-staleness/tests/Unknown/SmallMaxStaleness.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/max-staleness/tests/Unknown/SmallMaxStaleness.yml
rename to specifications/max-staleness/tests/Unknown/SmallMaxStaleness.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/read-write-concern/tests/README.rst b/specifications/read-write-concern/tests/README.rst
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/read-write-concern/tests/README.rst
rename to specifications/read-write-concern/tests/README.rst
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/read-write-concern/tests/connection-string/read-concern.json b/specifications/read-write-concern/tests/connection-string/read-concern.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/read-write-concern/tests/connection-string/read-concern.json
rename to specifications/read-write-concern/tests/connection-string/read-concern.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/read-write-concern/tests/connection-string/read-concern.yml b/specifications/read-write-concern/tests/connection-string/read-concern.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/read-write-concern/tests/connection-string/read-concern.yml
rename to specifications/read-write-concern/tests/connection-string/read-concern.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/read-write-concern/tests/connection-string/write-concern.json b/specifications/read-write-concern/tests/connection-string/write-concern.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/read-write-concern/tests/connection-string/write-concern.json
rename to specifications/read-write-concern/tests/connection-string/write-concern.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/read-write-concern/tests/connection-string/write-concern.yml b/specifications/read-write-concern/tests/connection-string/write-concern.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/read-write-concern/tests/connection-string/write-concern.yml
rename to specifications/read-write-concern/tests/connection-string/write-concern.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/read-write-concern/tests/document/read-concern.json b/specifications/read-write-concern/tests/document/read-concern.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/read-write-concern/tests/document/read-concern.json
rename to specifications/read-write-concern/tests/document/read-concern.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/read-write-concern/tests/document/read-concern.yml b/specifications/read-write-concern/tests/document/read-concern.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/read-write-concern/tests/document/read-concern.yml
rename to specifications/read-write-concern/tests/document/read-concern.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/read-write-concern/tests/document/write-concern.json b/specifications/read-write-concern/tests/document/write-concern.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/read-write-concern/tests/document/write-concern.json
rename to specifications/read-write-concern/tests/document/write-concern.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/read-write-concern/tests/document/write-concern.yml b/specifications/read-write-concern/tests/document/write-concern.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/read-write-concern/tests/document/write-concern.yml
rename to specifications/read-write-concern/tests/document/write-concern.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/read-write-concern/tests/operation/default-write-concern-2.6.json b/specifications/read-write-concern/tests/operation/default-write-concern-2.6.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/read-write-concern/tests/operation/default-write-concern-2.6.json
rename to specifications/read-write-concern/tests/operation/default-write-concern-2.6.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/read-write-concern/tests/operation/default-write-concern-2.6.yml b/specifications/read-write-concern/tests/operation/default-write-concern-2.6.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/read-write-concern/tests/operation/default-write-concern-2.6.yml
rename to specifications/read-write-concern/tests/operation/default-write-concern-2.6.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/read-write-concern/tests/operation/default-write-concern-3.2.json b/specifications/read-write-concern/tests/operation/default-write-concern-3.2.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/read-write-concern/tests/operation/default-write-concern-3.2.json
rename to specifications/read-write-concern/tests/operation/default-write-concern-3.2.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/read-write-concern/tests/operation/default-write-concern-3.2.yml b/specifications/read-write-concern/tests/operation/default-write-concern-3.2.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/read-write-concern/tests/operation/default-write-concern-3.2.yml
rename to specifications/read-write-concern/tests/operation/default-write-concern-3.2.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/read-write-concern/tests/operation/default-write-concern-3.4.json b/specifications/read-write-concern/tests/operation/default-write-concern-3.4.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/read-write-concern/tests/operation/default-write-concern-3.4.json
rename to specifications/read-write-concern/tests/operation/default-write-concern-3.4.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/read-write-concern/tests/operation/default-write-concern-3.4.yml b/specifications/read-write-concern/tests/operation/default-write-concern-3.4.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/read-write-concern/tests/operation/default-write-concern-3.4.yml
rename to specifications/read-write-concern/tests/operation/default-write-concern-3.4.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/read-write-concern/tests/operation/default-write-concern-4.2.json b/specifications/read-write-concern/tests/operation/default-write-concern-4.2.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/read-write-concern/tests/operation/default-write-concern-4.2.json
rename to specifications/read-write-concern/tests/operation/default-write-concern-4.2.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/read-write-concern/tests/operation/default-write-concern-4.2.yml b/specifications/read-write-concern/tests/operation/default-write-concern-4.2.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/read-write-concern/tests/operation/default-write-concern-4.2.yml
rename to specifications/read-write-concern/tests/operation/default-write-concern-4.2.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/README.rst b/specifications/retryable-reads/tests/README.rst
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/README.rst
rename to specifications/retryable-reads/tests/README.rst
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/aggregate-merge.json b/specifications/retryable-reads/tests/legacy/aggregate-merge.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/aggregate-merge.json
rename to specifications/retryable-reads/tests/legacy/aggregate-merge.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/aggregate-merge.yml b/specifications/retryable-reads/tests/legacy/aggregate-merge.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/aggregate-merge.yml
rename to specifications/retryable-reads/tests/legacy/aggregate-merge.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/aggregate-serverErrors.json b/specifications/retryable-reads/tests/legacy/aggregate-serverErrors.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/aggregate-serverErrors.json
rename to specifications/retryable-reads/tests/legacy/aggregate-serverErrors.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/aggregate-serverErrors.yml b/specifications/retryable-reads/tests/legacy/aggregate-serverErrors.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/aggregate-serverErrors.yml
rename to specifications/retryable-reads/tests/legacy/aggregate-serverErrors.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/aggregate.json b/specifications/retryable-reads/tests/legacy/aggregate.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/aggregate.json
rename to specifications/retryable-reads/tests/legacy/aggregate.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/aggregate.yml b/specifications/retryable-reads/tests/legacy/aggregate.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/aggregate.yml
rename to specifications/retryable-reads/tests/legacy/aggregate.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/changeStreams-client.watch-serverErrors.json b/specifications/retryable-reads/tests/legacy/changeStreams-client.watch-serverErrors.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/changeStreams-client.watch-serverErrors.json
rename to specifications/retryable-reads/tests/legacy/changeStreams-client.watch-serverErrors.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/changeStreams-client.watch-serverErrors.yml b/specifications/retryable-reads/tests/legacy/changeStreams-client.watch-serverErrors.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/changeStreams-client.watch-serverErrors.yml
rename to specifications/retryable-reads/tests/legacy/changeStreams-client.watch-serverErrors.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/changeStreams-client.watch.json b/specifications/retryable-reads/tests/legacy/changeStreams-client.watch.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/changeStreams-client.watch.json
rename to specifications/retryable-reads/tests/legacy/changeStreams-client.watch.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/changeStreams-client.watch.yml b/specifications/retryable-reads/tests/legacy/changeStreams-client.watch.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/changeStreams-client.watch.yml
rename to specifications/retryable-reads/tests/legacy/changeStreams-client.watch.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/changeStreams-db.coll.watch-serverErrors.json b/specifications/retryable-reads/tests/legacy/changeStreams-db.coll.watch-serverErrors.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/changeStreams-db.coll.watch-serverErrors.json
rename to specifications/retryable-reads/tests/legacy/changeStreams-db.coll.watch-serverErrors.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/changeStreams-db.coll.watch-serverErrors.yml b/specifications/retryable-reads/tests/legacy/changeStreams-db.coll.watch-serverErrors.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/changeStreams-db.coll.watch-serverErrors.yml
rename to specifications/retryable-reads/tests/legacy/changeStreams-db.coll.watch-serverErrors.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/changeStreams-db.coll.watch.json b/specifications/retryable-reads/tests/legacy/changeStreams-db.coll.watch.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/changeStreams-db.coll.watch.json
rename to specifications/retryable-reads/tests/legacy/changeStreams-db.coll.watch.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/changeStreams-db.coll.watch.yml b/specifications/retryable-reads/tests/legacy/changeStreams-db.coll.watch.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/changeStreams-db.coll.watch.yml
rename to specifications/retryable-reads/tests/legacy/changeStreams-db.coll.watch.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/changeStreams-db.watch-serverErrors.json b/specifications/retryable-reads/tests/legacy/changeStreams-db.watch-serverErrors.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/changeStreams-db.watch-serverErrors.json
rename to specifications/retryable-reads/tests/legacy/changeStreams-db.watch-serverErrors.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/changeStreams-db.watch-serverErrors.yml b/specifications/retryable-reads/tests/legacy/changeStreams-db.watch-serverErrors.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/changeStreams-db.watch-serverErrors.yml
rename to specifications/retryable-reads/tests/legacy/changeStreams-db.watch-serverErrors.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/changeStreams-db.watch.json b/specifications/retryable-reads/tests/legacy/changeStreams-db.watch.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/changeStreams-db.watch.json
rename to specifications/retryable-reads/tests/legacy/changeStreams-db.watch.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/changeStreams-db.watch.yml b/specifications/retryable-reads/tests/legacy/changeStreams-db.watch.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/changeStreams-db.watch.yml
rename to specifications/retryable-reads/tests/legacy/changeStreams-db.watch.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/count-serverErrors.json b/specifications/retryable-reads/tests/legacy/count-serverErrors.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/count-serverErrors.json
rename to specifications/retryable-reads/tests/legacy/count-serverErrors.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/count-serverErrors.yml b/specifications/retryable-reads/tests/legacy/count-serverErrors.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/count-serverErrors.yml
rename to specifications/retryable-reads/tests/legacy/count-serverErrors.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/count.json b/specifications/retryable-reads/tests/legacy/count.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/count.json
rename to specifications/retryable-reads/tests/legacy/count.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/count.yml b/specifications/retryable-reads/tests/legacy/count.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/count.yml
rename to specifications/retryable-reads/tests/legacy/count.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/countDocuments-serverErrors.json b/specifications/retryable-reads/tests/legacy/countDocuments-serverErrors.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/countDocuments-serverErrors.json
rename to specifications/retryable-reads/tests/legacy/countDocuments-serverErrors.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/countDocuments-serverErrors.yml b/specifications/retryable-reads/tests/legacy/countDocuments-serverErrors.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/countDocuments-serverErrors.yml
rename to specifications/retryable-reads/tests/legacy/countDocuments-serverErrors.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/countDocuments.json b/specifications/retryable-reads/tests/legacy/countDocuments.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/countDocuments.json
rename to specifications/retryable-reads/tests/legacy/countDocuments.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/countDocuments.yml b/specifications/retryable-reads/tests/legacy/countDocuments.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/countDocuments.yml
rename to specifications/retryable-reads/tests/legacy/countDocuments.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/distinct-serverErrors.json b/specifications/retryable-reads/tests/legacy/distinct-serverErrors.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/distinct-serverErrors.json
rename to specifications/retryable-reads/tests/legacy/distinct-serverErrors.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/distinct-serverErrors.yml b/specifications/retryable-reads/tests/legacy/distinct-serverErrors.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/distinct-serverErrors.yml
rename to specifications/retryable-reads/tests/legacy/distinct-serverErrors.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/distinct.json b/specifications/retryable-reads/tests/legacy/distinct.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/distinct.json
rename to specifications/retryable-reads/tests/legacy/distinct.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/distinct.yml b/specifications/retryable-reads/tests/legacy/distinct.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/distinct.yml
rename to specifications/retryable-reads/tests/legacy/distinct.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/estimatedDocumentCount-serverErrors.json b/specifications/retryable-reads/tests/legacy/estimatedDocumentCount-serverErrors.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/estimatedDocumentCount-serverErrors.json
rename to specifications/retryable-reads/tests/legacy/estimatedDocumentCount-serverErrors.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/estimatedDocumentCount-serverErrors.yml b/specifications/retryable-reads/tests/legacy/estimatedDocumentCount-serverErrors.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/estimatedDocumentCount-serverErrors.yml
rename to specifications/retryable-reads/tests/legacy/estimatedDocumentCount-serverErrors.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/estimatedDocumentCount.json b/specifications/retryable-reads/tests/legacy/estimatedDocumentCount.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/estimatedDocumentCount.json
rename to specifications/retryable-reads/tests/legacy/estimatedDocumentCount.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/estimatedDocumentCount.yml b/specifications/retryable-reads/tests/legacy/estimatedDocumentCount.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/estimatedDocumentCount.yml
rename to specifications/retryable-reads/tests/legacy/estimatedDocumentCount.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/find-serverErrors.json b/specifications/retryable-reads/tests/legacy/find-serverErrors.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/find-serverErrors.json
rename to specifications/retryable-reads/tests/legacy/find-serverErrors.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/find-serverErrors.yml b/specifications/retryable-reads/tests/legacy/find-serverErrors.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/find-serverErrors.yml
rename to specifications/retryable-reads/tests/legacy/find-serverErrors.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/find.json b/specifications/retryable-reads/tests/legacy/find.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/find.json
rename to specifications/retryable-reads/tests/legacy/find.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/find.yml b/specifications/retryable-reads/tests/legacy/find.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/find.yml
rename to specifications/retryable-reads/tests/legacy/find.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/findOne-serverErrors.json b/specifications/retryable-reads/tests/legacy/findOne-serverErrors.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/findOne-serverErrors.json
rename to specifications/retryable-reads/tests/legacy/findOne-serverErrors.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/findOne-serverErrors.yml b/specifications/retryable-reads/tests/legacy/findOne-serverErrors.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/findOne-serverErrors.yml
rename to specifications/retryable-reads/tests/legacy/findOne-serverErrors.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/findOne.json b/specifications/retryable-reads/tests/legacy/findOne.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/findOne.json
rename to specifications/retryable-reads/tests/legacy/findOne.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/findOne.yml b/specifications/retryable-reads/tests/legacy/findOne.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/findOne.yml
rename to specifications/retryable-reads/tests/legacy/findOne.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/gridfs-download-serverErrors.json b/specifications/retryable-reads/tests/legacy/gridfs-download-serverErrors.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/gridfs-download-serverErrors.json
rename to specifications/retryable-reads/tests/legacy/gridfs-download-serverErrors.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/gridfs-download-serverErrors.yml b/specifications/retryable-reads/tests/legacy/gridfs-download-serverErrors.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/gridfs-download-serverErrors.yml
rename to specifications/retryable-reads/tests/legacy/gridfs-download-serverErrors.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/gridfs-download.json b/specifications/retryable-reads/tests/legacy/gridfs-download.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/gridfs-download.json
rename to specifications/retryable-reads/tests/legacy/gridfs-download.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/gridfs-download.yml b/specifications/retryable-reads/tests/legacy/gridfs-download.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/gridfs-download.yml
rename to specifications/retryable-reads/tests/legacy/gridfs-download.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/gridfs-downloadByName-serverErrors.json b/specifications/retryable-reads/tests/legacy/gridfs-downloadByName-serverErrors.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/gridfs-downloadByName-serverErrors.json
rename to specifications/retryable-reads/tests/legacy/gridfs-downloadByName-serverErrors.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/gridfs-downloadByName-serverErrors.yml b/specifications/retryable-reads/tests/legacy/gridfs-downloadByName-serverErrors.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/gridfs-downloadByName-serverErrors.yml
rename to specifications/retryable-reads/tests/legacy/gridfs-downloadByName-serverErrors.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/gridfs-downloadByName.json b/specifications/retryable-reads/tests/legacy/gridfs-downloadByName.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/gridfs-downloadByName.json
rename to specifications/retryable-reads/tests/legacy/gridfs-downloadByName.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/gridfs-downloadByName.yml b/specifications/retryable-reads/tests/legacy/gridfs-downloadByName.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/gridfs-downloadByName.yml
rename to specifications/retryable-reads/tests/legacy/gridfs-downloadByName.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listCollectionNames-serverErrors.json b/specifications/retryable-reads/tests/legacy/listCollectionNames-serverErrors.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listCollectionNames-serverErrors.json
rename to specifications/retryable-reads/tests/legacy/listCollectionNames-serverErrors.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listCollectionNames-serverErrors.yml b/specifications/retryable-reads/tests/legacy/listCollectionNames-serverErrors.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listCollectionNames-serverErrors.yml
rename to specifications/retryable-reads/tests/legacy/listCollectionNames-serverErrors.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listCollectionNames.json b/specifications/retryable-reads/tests/legacy/listCollectionNames.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listCollectionNames.json
rename to specifications/retryable-reads/tests/legacy/listCollectionNames.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listCollectionNames.yml b/specifications/retryable-reads/tests/legacy/listCollectionNames.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listCollectionNames.yml
rename to specifications/retryable-reads/tests/legacy/listCollectionNames.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listCollectionObjects-serverErrors.json b/specifications/retryable-reads/tests/legacy/listCollectionObjects-serverErrors.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listCollectionObjects-serverErrors.json
rename to specifications/retryable-reads/tests/legacy/listCollectionObjects-serverErrors.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listCollectionObjects-serverErrors.yml b/specifications/retryable-reads/tests/legacy/listCollectionObjects-serverErrors.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listCollectionObjects-serverErrors.yml
rename to specifications/retryable-reads/tests/legacy/listCollectionObjects-serverErrors.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listCollectionObjects.json b/specifications/retryable-reads/tests/legacy/listCollectionObjects.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listCollectionObjects.json
rename to specifications/retryable-reads/tests/legacy/listCollectionObjects.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listCollectionObjects.yml b/specifications/retryable-reads/tests/legacy/listCollectionObjects.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listCollectionObjects.yml
rename to specifications/retryable-reads/tests/legacy/listCollectionObjects.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listCollections-serverErrors.json b/specifications/retryable-reads/tests/legacy/listCollections-serverErrors.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listCollections-serverErrors.json
rename to specifications/retryable-reads/tests/legacy/listCollections-serverErrors.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listCollections-serverErrors.yml b/specifications/retryable-reads/tests/legacy/listCollections-serverErrors.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listCollections-serverErrors.yml
rename to specifications/retryable-reads/tests/legacy/listCollections-serverErrors.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listCollections.json b/specifications/retryable-reads/tests/legacy/listCollections.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listCollections.json
rename to specifications/retryable-reads/tests/legacy/listCollections.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listCollections.yml b/specifications/retryable-reads/tests/legacy/listCollections.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listCollections.yml
rename to specifications/retryable-reads/tests/legacy/listCollections.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listDatabaseNames-serverErrors.json b/specifications/retryable-reads/tests/legacy/listDatabaseNames-serverErrors.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listDatabaseNames-serverErrors.json
rename to specifications/retryable-reads/tests/legacy/listDatabaseNames-serverErrors.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listDatabaseNames-serverErrors.yml b/specifications/retryable-reads/tests/legacy/listDatabaseNames-serverErrors.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listDatabaseNames-serverErrors.yml
rename to specifications/retryable-reads/tests/legacy/listDatabaseNames-serverErrors.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listDatabaseNames.json b/specifications/retryable-reads/tests/legacy/listDatabaseNames.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listDatabaseNames.json
rename to specifications/retryable-reads/tests/legacy/listDatabaseNames.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listDatabaseNames.yml b/specifications/retryable-reads/tests/legacy/listDatabaseNames.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listDatabaseNames.yml
rename to specifications/retryable-reads/tests/legacy/listDatabaseNames.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listDatabaseObjects-serverErrors.json b/specifications/retryable-reads/tests/legacy/listDatabaseObjects-serverErrors.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listDatabaseObjects-serverErrors.json
rename to specifications/retryable-reads/tests/legacy/listDatabaseObjects-serverErrors.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listDatabaseObjects-serverErrors.yml b/specifications/retryable-reads/tests/legacy/listDatabaseObjects-serverErrors.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listDatabaseObjects-serverErrors.yml
rename to specifications/retryable-reads/tests/legacy/listDatabaseObjects-serverErrors.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listDatabaseObjects.json b/specifications/retryable-reads/tests/legacy/listDatabaseObjects.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listDatabaseObjects.json
rename to specifications/retryable-reads/tests/legacy/listDatabaseObjects.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listDatabaseObjects.yml b/specifications/retryable-reads/tests/legacy/listDatabaseObjects.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listDatabaseObjects.yml
rename to specifications/retryable-reads/tests/legacy/listDatabaseObjects.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listDatabases-serverErrors.json b/specifications/retryable-reads/tests/legacy/listDatabases-serverErrors.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listDatabases-serverErrors.json
rename to specifications/retryable-reads/tests/legacy/listDatabases-serverErrors.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listDatabases-serverErrors.yml b/specifications/retryable-reads/tests/legacy/listDatabases-serverErrors.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listDatabases-serverErrors.yml
rename to specifications/retryable-reads/tests/legacy/listDatabases-serverErrors.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listDatabases.json b/specifications/retryable-reads/tests/legacy/listDatabases.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listDatabases.json
rename to specifications/retryable-reads/tests/legacy/listDatabases.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listDatabases.yml b/specifications/retryable-reads/tests/legacy/listDatabases.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listDatabases.yml
rename to specifications/retryable-reads/tests/legacy/listDatabases.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listIndexNames-serverErrors.json b/specifications/retryable-reads/tests/legacy/listIndexNames-serverErrors.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listIndexNames-serverErrors.json
rename to specifications/retryable-reads/tests/legacy/listIndexNames-serverErrors.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listIndexNames-serverErrors.yml b/specifications/retryable-reads/tests/legacy/listIndexNames-serverErrors.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listIndexNames-serverErrors.yml
rename to specifications/retryable-reads/tests/legacy/listIndexNames-serverErrors.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listIndexNames.json b/specifications/retryable-reads/tests/legacy/listIndexNames.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listIndexNames.json
rename to specifications/retryable-reads/tests/legacy/listIndexNames.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listIndexNames.yml b/specifications/retryable-reads/tests/legacy/listIndexNames.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listIndexNames.yml
rename to specifications/retryable-reads/tests/legacy/listIndexNames.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listIndexes-serverErrors.json b/specifications/retryable-reads/tests/legacy/listIndexes-serverErrors.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listIndexes-serverErrors.json
rename to specifications/retryable-reads/tests/legacy/listIndexes-serverErrors.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listIndexes-serverErrors.yml b/specifications/retryable-reads/tests/legacy/listIndexes-serverErrors.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listIndexes-serverErrors.yml
rename to specifications/retryable-reads/tests/legacy/listIndexes-serverErrors.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listIndexes.json b/specifications/retryable-reads/tests/legacy/listIndexes.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listIndexes.json
rename to specifications/retryable-reads/tests/legacy/listIndexes.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listIndexes.yml b/specifications/retryable-reads/tests/legacy/listIndexes.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/listIndexes.yml
rename to specifications/retryable-reads/tests/legacy/listIndexes.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/mapReduce.json b/specifications/retryable-reads/tests/legacy/mapReduce.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/mapReduce.json
rename to specifications/retryable-reads/tests/legacy/mapReduce.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/mapReduce.yml b/specifications/retryable-reads/tests/legacy/mapReduce.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-reads/tests/legacy/mapReduce.yml
rename to specifications/retryable-reads/tests/legacy/mapReduce.yml
diff --git a/specifications/retryable-reads/tests/unified/handshakeError.json b/specifications/retryable-reads/tests/unified/handshakeError.json
new file mode 100644
index 00000000000..2921d8a9540
--- /dev/null
+++ b/specifications/retryable-reads/tests/unified/handshakeError.json
@@ -0,0 +1,3079 @@
+{
+ "description": "retryable reads handshake failures",
+ "schemaVersion": "1.4",
+ "runOnRequirements": [
+ {
+ "minServerVersion": "4.2",
+ "topologies": [
+ "replicaset",
+ "sharded",
+ "load-balanced"
+ ],
+ "auth": true
+ }
+ ],
+ "createEntities": [
+ {
+ "client": {
+ "id": "client",
+ "useMultipleMongoses": false,
+ "observeEvents": [
+ "connectionCheckOutStartedEvent",
+ "commandStartedEvent",
+ "commandSucceededEvent",
+ "commandFailedEvent"
+ ]
+ }
+ },
+ {
+ "database": {
+ "id": "database",
+ "client": "client",
+ "databaseName": "retryable-reads-handshake-tests"
+ }
+ },
+ {
+ "collection": {
+ "id": "collection",
+ "database": "database",
+ "collectionName": "coll"
+ }
+ }
+ ],
+ "initialData": [
+ {
+ "collectionName": "coll",
+ "databaseName": "retryable-reads-handshake-tests",
+ "documents": [
+ {
+ "_id": 1,
+ "x": 11
+ },
+ {
+ "_id": 2,
+ "x": 22
+ },
+ {
+ "_id": 3,
+ "x": 33
+ }
+ ]
+ }
+ ],
+ "tests": [
+ {
+ "description": "client.listDatabases succeeds after retryable handshake network error",
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 2
+ },
+ "data": {
+ "failCommands": [
+ "ping",
+ "saslContinue"
+ ],
+ "closeConnection": true
+ }
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "ping",
+ "command": {
+ "ping": 1
+ }
+ },
+ "expectError": {
+ "isError": true
+ }
+ },
+ {
+ "name": "listDatabases",
+ "object": "client",
+ "arguments": {
+ "filter": {}
+ }
+ }
+ ],
+ "expectEvents": [
+ {
+ "client": "client",
+ "eventType": "cmap",
+ "events": [
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ }
+ ]
+ },
+ {
+ "client": "client",
+ "events": [
+ {
+ "commandStartedEvent": {
+ "command": {
+ "ping": 1
+ },
+ "databaseName": "retryable-reads-handshake-tests"
+ }
+ },
+ {
+ "commandFailedEvent": {
+ "commandName": "ping"
+ }
+ },
+ {
+ "commandStartedEvent": {
+ "commandName": "listDatabases"
+ }
+ },
+ {
+ "commandSucceededEvent": {
+ "commandName": "listDatabases"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "client.listDatabases succeeds after retryable handshake server error (ShutdownInProgress)",
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 2
+ },
+ "data": {
+ "failCommands": [
+ "ping",
+ "saslContinue"
+ ],
+ "closeConnection": true
+ }
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "ping",
+ "command": {
+ "ping": 1
+ }
+ },
+ "expectError": {
+ "isError": true
+ }
+ },
+ {
+ "name": "listDatabases",
+ "object": "client",
+ "arguments": {
+ "filter": {}
+ }
+ }
+ ],
+ "expectEvents": [
+ {
+ "client": "client",
+ "eventType": "cmap",
+ "events": [
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ }
+ ]
+ },
+ {
+ "client": "client",
+ "events": [
+ {
+ "commandStartedEvent": {
+ "command": {
+ "ping": 1
+ },
+ "databaseName": "retryable-reads-handshake-tests"
+ }
+ },
+ {
+ "commandFailedEvent": {
+ "commandName": "ping"
+ }
+ },
+ {
+ "commandStartedEvent": {
+ "commandName": "listDatabases"
+ }
+ },
+ {
+ "commandSucceededEvent": {
+ "commandName": "listDatabases"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "client.listDatabaseNames succeeds after retryable handshake network error",
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 2
+ },
+ "data": {
+ "failCommands": [
+ "ping",
+ "saslContinue"
+ ],
+ "closeConnection": true
+ }
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "ping",
+ "command": {
+ "ping": 1
+ }
+ },
+ "expectError": {
+ "isError": true
+ }
+ },
+ {
+ "name": "listDatabaseNames",
+ "object": "client"
+ }
+ ],
+ "expectEvents": [
+ {
+ "client": "client",
+ "eventType": "cmap",
+ "events": [
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ }
+ ]
+ },
+ {
+ "client": "client",
+ "events": [
+ {
+ "commandStartedEvent": {
+ "command": {
+ "ping": 1
+ },
+ "databaseName": "retryable-reads-handshake-tests"
+ }
+ },
+ {
+ "commandFailedEvent": {
+ "commandName": "ping"
+ }
+ },
+ {
+ "commandStartedEvent": {
+ "commandName": "listDatabases"
+ }
+ },
+ {
+ "commandSucceededEvent": {
+ "commandName": "listDatabases"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "client.listDatabaseNames succeeds after retryable handshake server error (ShutdownInProgress)",
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 2
+ },
+ "data": {
+ "failCommands": [
+ "ping",
+ "saslContinue"
+ ],
+ "closeConnection": true
+ }
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "ping",
+ "command": {
+ "ping": 1
+ }
+ },
+ "expectError": {
+ "isError": true
+ }
+ },
+ {
+ "name": "listDatabaseNames",
+ "object": "client"
+ }
+ ],
+ "expectEvents": [
+ {
+ "client": "client",
+ "eventType": "cmap",
+ "events": [
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ }
+ ]
+ },
+ {
+ "client": "client",
+ "events": [
+ {
+ "commandStartedEvent": {
+ "command": {
+ "ping": 1
+ },
+ "databaseName": "retryable-reads-handshake-tests"
+ }
+ },
+ {
+ "commandFailedEvent": {
+ "commandName": "ping"
+ }
+ },
+ {
+ "commandStartedEvent": {
+ "commandName": "listDatabases"
+ }
+ },
+ {
+ "commandSucceededEvent": {
+ "commandName": "listDatabases"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "client.createChangeStream succeeds after retryable handshake network error",
+ "runOnRequirements": [
+ {
+ "serverless": "forbid"
+ }
+ ],
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 2
+ },
+ "data": {
+ "failCommands": [
+ "ping",
+ "saslContinue"
+ ],
+ "closeConnection": true
+ }
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "ping",
+ "command": {
+ "ping": 1
+ }
+ },
+ "expectError": {
+ "isError": true
+ }
+ },
+ {
+ "name": "createChangeStream",
+ "object": "client",
+ "arguments": {
+ "pipeline": []
+ },
+ "saveResultAsEntity": "changeStream"
+ }
+ ],
+ "expectEvents": [
+ {
+ "client": "client",
+ "eventType": "cmap",
+ "events": [
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ }
+ ]
+ },
+ {
+ "client": "client",
+ "events": [
+ {
+ "commandStartedEvent": {
+ "command": {
+ "ping": 1
+ },
+ "databaseName": "retryable-reads-handshake-tests"
+ }
+ },
+ {
+ "commandFailedEvent": {
+ "commandName": "ping"
+ }
+ },
+ {
+ "commandStartedEvent": {
+ "commandName": "aggregate"
+ }
+ },
+ {
+ "commandSucceededEvent": {
+ "commandName": "aggregate"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "client.createChangeStream succeeds after retryable handshake server error (ShutdownInProgress)",
+ "runOnRequirements": [
+ {
+ "serverless": "forbid"
+ }
+ ],
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 2
+ },
+ "data": {
+ "failCommands": [
+ "ping",
+ "saslContinue"
+ ],
+ "closeConnection": true
+ }
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "ping",
+ "command": {
+ "ping": 1
+ }
+ },
+ "expectError": {
+ "isError": true
+ }
+ },
+ {
+ "name": "createChangeStream",
+ "object": "client",
+ "arguments": {
+ "pipeline": []
+ },
+ "saveResultAsEntity": "changeStream"
+ }
+ ],
+ "expectEvents": [
+ {
+ "client": "client",
+ "eventType": "cmap",
+ "events": [
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ }
+ ]
+ },
+ {
+ "client": "client",
+ "events": [
+ {
+ "commandStartedEvent": {
+ "command": {
+ "ping": 1
+ },
+ "databaseName": "retryable-reads-handshake-tests"
+ }
+ },
+ {
+ "commandFailedEvent": {
+ "commandName": "ping"
+ }
+ },
+ {
+ "commandStartedEvent": {
+ "commandName": "aggregate"
+ }
+ },
+ {
+ "commandSucceededEvent": {
+ "commandName": "aggregate"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "database.aggregate succeeds after retryable handshake network error",
+ "runOnRequirements": [
+ {
+ "serverless": "forbid"
+ }
+ ],
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 2
+ },
+ "data": {
+ "failCommands": [
+ "ping",
+ "saslContinue"
+ ],
+ "closeConnection": true
+ }
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "ping",
+ "command": {
+ "ping": 1
+ }
+ },
+ "expectError": {
+ "isError": true
+ }
+ },
+ {
+ "name": "aggregate",
+ "object": "database",
+ "arguments": {
+ "pipeline": [
+ {
+ "$listLocalSessions": {}
+ },
+ {
+ "$limit": 1
+ }
+ ]
+ }
+ }
+ ],
+ "expectEvents": [
+ {
+ "client": "client",
+ "eventType": "cmap",
+ "events": [
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ }
+ ]
+ },
+ {
+ "client": "client",
+ "events": [
+ {
+ "commandStartedEvent": {
+ "command": {
+ "ping": 1
+ },
+ "databaseName": "retryable-reads-handshake-tests"
+ }
+ },
+ {
+ "commandFailedEvent": {
+ "commandName": "ping"
+ }
+ },
+ {
+ "commandStartedEvent": {
+ "commandName": "aggregate"
+ }
+ },
+ {
+ "commandSucceededEvent": {
+ "commandName": "aggregate"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "database.aggregate succeeds after retryable handshake server error (ShutdownInProgress)",
+ "runOnRequirements": [
+ {
+ "serverless": "forbid"
+ }
+ ],
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 2
+ },
+ "data": {
+ "failCommands": [
+ "ping",
+ "saslContinue"
+ ],
+ "closeConnection": true
+ }
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "ping",
+ "command": {
+ "ping": 1
+ }
+ },
+ "expectError": {
+ "isError": true
+ }
+ },
+ {
+ "name": "aggregate",
+ "object": "database",
+ "arguments": {
+ "pipeline": [
+ {
+ "$listLocalSessions": {}
+ },
+ {
+ "$limit": 1
+ }
+ ]
+ }
+ }
+ ],
+ "expectEvents": [
+ {
+ "client": "client",
+ "eventType": "cmap",
+ "events": [
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ }
+ ]
+ },
+ {
+ "client": "client",
+ "events": [
+ {
+ "commandStartedEvent": {
+ "command": {
+ "ping": 1
+ },
+ "databaseName": "retryable-reads-handshake-tests"
+ }
+ },
+ {
+ "commandFailedEvent": {
+ "commandName": "ping"
+ }
+ },
+ {
+ "commandStartedEvent": {
+ "commandName": "aggregate"
+ }
+ },
+ {
+ "commandSucceededEvent": {
+ "commandName": "aggregate"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "database.listCollections succeeds after retryable handshake network error",
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 2
+ },
+ "data": {
+ "failCommands": [
+ "ping",
+ "saslContinue"
+ ],
+ "closeConnection": true
+ }
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "ping",
+ "command": {
+ "ping": 1
+ }
+ },
+ "expectError": {
+ "isError": true
+ }
+ },
+ {
+ "name": "listCollections",
+ "object": "database",
+ "arguments": {
+ "filter": {}
+ }
+ }
+ ],
+ "expectEvents": [
+ {
+ "client": "client",
+ "eventType": "cmap",
+ "events": [
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ }
+ ]
+ },
+ {
+ "client": "client",
+ "events": [
+ {
+ "commandStartedEvent": {
+ "command": {
+ "ping": 1
+ },
+ "databaseName": "retryable-reads-handshake-tests"
+ }
+ },
+ {
+ "commandFailedEvent": {
+ "commandName": "ping"
+ }
+ },
+ {
+ "commandStartedEvent": {
+ "commandName": "listCollections"
+ }
+ },
+ {
+ "commandSucceededEvent": {
+ "commandName": "listCollections"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "database.listCollections succeeds after retryable handshake server error (ShutdownInProgress)",
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 2
+ },
+ "data": {
+ "failCommands": [
+ "ping",
+ "saslContinue"
+ ],
+ "closeConnection": true
+ }
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "ping",
+ "command": {
+ "ping": 1
+ }
+ },
+ "expectError": {
+ "isError": true
+ }
+ },
+ {
+ "name": "listCollections",
+ "object": "database",
+ "arguments": {
+ "filter": {}
+ }
+ }
+ ],
+ "expectEvents": [
+ {
+ "client": "client",
+ "eventType": "cmap",
+ "events": [
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ }
+ ]
+ },
+ {
+ "client": "client",
+ "events": [
+ {
+ "commandStartedEvent": {
+ "command": {
+ "ping": 1
+ },
+ "databaseName": "retryable-reads-handshake-tests"
+ }
+ },
+ {
+ "commandFailedEvent": {
+ "commandName": "ping"
+ }
+ },
+ {
+ "commandStartedEvent": {
+ "commandName": "listCollections"
+ }
+ },
+ {
+ "commandSucceededEvent": {
+ "commandName": "listCollections"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "database.listCollectionNames succeeds after retryable handshake network error",
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 2
+ },
+ "data": {
+ "failCommands": [
+ "ping",
+ "saslContinue"
+ ],
+ "closeConnection": true
+ }
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "ping",
+ "command": {
+ "ping": 1
+ }
+ },
+ "expectError": {
+ "isError": true
+ }
+ },
+ {
+ "name": "listCollectionNames",
+ "object": "database",
+ "arguments": {
+ "filter": {}
+ }
+ }
+ ],
+ "expectEvents": [
+ {
+ "client": "client",
+ "eventType": "cmap",
+ "events": [
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ }
+ ]
+ },
+ {
+ "client": "client",
+ "events": [
+ {
+ "commandStartedEvent": {
+ "command": {
+ "ping": 1
+ },
+ "databaseName": "retryable-reads-handshake-tests"
+ }
+ },
+ {
+ "commandFailedEvent": {
+ "commandName": "ping"
+ }
+ },
+ {
+ "commandStartedEvent": {
+ "commandName": "listCollections"
+ }
+ },
+ {
+ "commandSucceededEvent": {
+ "commandName": "listCollections"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "database.listCollectionNames succeeds after retryable handshake server error (ShutdownInProgress)",
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 2
+ },
+ "data": {
+ "failCommands": [
+ "ping",
+ "saslContinue"
+ ],
+ "closeConnection": true
+ }
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "ping",
+ "command": {
+ "ping": 1
+ }
+ },
+ "expectError": {
+ "isError": true
+ }
+ },
+ {
+ "name": "listCollectionNames",
+ "object": "database",
+ "arguments": {
+ "filter": {}
+ }
+ }
+ ],
+ "expectEvents": [
+ {
+ "client": "client",
+ "eventType": "cmap",
+ "events": [
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ }
+ ]
+ },
+ {
+ "client": "client",
+ "events": [
+ {
+ "commandStartedEvent": {
+ "command": {
+ "ping": 1
+ },
+ "databaseName": "retryable-reads-handshake-tests"
+ }
+ },
+ {
+ "commandFailedEvent": {
+ "commandName": "ping"
+ }
+ },
+ {
+ "commandStartedEvent": {
+ "commandName": "listCollections"
+ }
+ },
+ {
+ "commandSucceededEvent": {
+ "commandName": "listCollections"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "database.createChangeStream succeeds after retryable handshake network error",
+ "runOnRequirements": [
+ {
+ "serverless": "forbid"
+ }
+ ],
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 2
+ },
+ "data": {
+ "failCommands": [
+ "ping",
+ "saslContinue"
+ ],
+ "closeConnection": true
+ }
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "ping",
+ "command": {
+ "ping": 1
+ }
+ },
+ "expectError": {
+ "isError": true
+ }
+ },
+ {
+ "name": "createChangeStream",
+ "object": "database",
+ "arguments": {
+ "pipeline": []
+ },
+ "saveResultAsEntity": "changeStream"
+ }
+ ],
+ "expectEvents": [
+ {
+ "client": "client",
+ "eventType": "cmap",
+ "events": [
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ }
+ ]
+ },
+ {
+ "client": "client",
+ "events": [
+ {
+ "commandStartedEvent": {
+ "command": {
+ "ping": 1
+ },
+ "databaseName": "retryable-reads-handshake-tests"
+ }
+ },
+ {
+ "commandFailedEvent": {
+ "commandName": "ping"
+ }
+ },
+ {
+ "commandStartedEvent": {
+ "commandName": "aggregate"
+ }
+ },
+ {
+ "commandSucceededEvent": {
+ "commandName": "aggregate"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "database.createChangeStream succeeds after retryable handshake server error (ShutdownInProgress)",
+ "runOnRequirements": [
+ {
+ "serverless": "forbid"
+ }
+ ],
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 2
+ },
+ "data": {
+ "failCommands": [
+ "ping",
+ "saslContinue"
+ ],
+ "closeConnection": true
+ }
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "ping",
+ "command": {
+ "ping": 1
+ }
+ },
+ "expectError": {
+ "isError": true
+ }
+ },
+ {
+ "name": "createChangeStream",
+ "object": "database",
+ "arguments": {
+ "pipeline": []
+ },
+ "saveResultAsEntity": "changeStream"
+ }
+ ],
+ "expectEvents": [
+ {
+ "client": "client",
+ "eventType": "cmap",
+ "events": [
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ }
+ ]
+ },
+ {
+ "client": "client",
+ "events": [
+ {
+ "commandStartedEvent": {
+ "command": {
+ "ping": 1
+ },
+ "databaseName": "retryable-reads-handshake-tests"
+ }
+ },
+ {
+ "commandFailedEvent": {
+ "commandName": "ping"
+ }
+ },
+ {
+ "commandStartedEvent": {
+ "commandName": "aggregate"
+ }
+ },
+ {
+ "commandSucceededEvent": {
+ "commandName": "aggregate"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "collection.aggregate succeeds after retryable handshake network error",
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 2
+ },
+ "data": {
+ "failCommands": [
+ "ping",
+ "saslContinue"
+ ],
+ "closeConnection": true
+ }
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "ping",
+ "command": {
+ "ping": 1
+ }
+ },
+ "expectError": {
+ "isError": true
+ }
+ },
+ {
+ "name": "aggregate",
+ "object": "collection",
+ "arguments": {
+ "pipeline": []
+ }
+ }
+ ],
+ "expectEvents": [
+ {
+ "client": "client",
+ "eventType": "cmap",
+ "events": [
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ }
+ ]
+ },
+ {
+ "client": "client",
+ "events": [
+ {
+ "commandStartedEvent": {
+ "command": {
+ "ping": 1
+ },
+ "databaseName": "retryable-reads-handshake-tests"
+ }
+ },
+ {
+ "commandFailedEvent": {
+ "commandName": "ping"
+ }
+ },
+ {
+ "commandStartedEvent": {
+ "commandName": "aggregate"
+ }
+ },
+ {
+ "commandSucceededEvent": {
+ "commandName": "aggregate"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "collection.aggregate succeeds after retryable handshake server error (ShutdownInProgress)",
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 2
+ },
+ "data": {
+ "failCommands": [
+ "ping",
+ "saslContinue"
+ ],
+ "closeConnection": true
+ }
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "ping",
+ "command": {
+ "ping": 1
+ }
+ },
+ "expectError": {
+ "isError": true
+ }
+ },
+ {
+ "name": "aggregate",
+ "object": "collection",
+ "arguments": {
+ "pipeline": []
+ }
+ }
+ ],
+ "expectEvents": [
+ {
+ "client": "client",
+ "eventType": "cmap",
+ "events": [
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ }
+ ]
+ },
+ {
+ "client": "client",
+ "events": [
+ {
+ "commandStartedEvent": {
+ "command": {
+ "ping": 1
+ },
+ "databaseName": "retryable-reads-handshake-tests"
+ }
+ },
+ {
+ "commandFailedEvent": {
+ "commandName": "ping"
+ }
+ },
+ {
+ "commandStartedEvent": {
+ "commandName": "aggregate"
+ }
+ },
+ {
+ "commandSucceededEvent": {
+ "commandName": "aggregate"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "collection.countDocuments succeeds after retryable handshake network error",
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 2
+ },
+ "data": {
+ "failCommands": [
+ "ping",
+ "saslContinue"
+ ],
+ "closeConnection": true
+ }
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "ping",
+ "command": {
+ "ping": 1
+ }
+ },
+ "expectError": {
+ "isError": true
+ }
+ },
+ {
+ "name": "countDocuments",
+ "object": "collection",
+ "arguments": {
+ "filter": {}
+ }
+ }
+ ],
+ "expectEvents": [
+ {
+ "client": "client",
+ "eventType": "cmap",
+ "events": [
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ }
+ ]
+ },
+ {
+ "client": "client",
+ "events": [
+ {
+ "commandStartedEvent": {
+ "command": {
+ "ping": 1
+ },
+ "databaseName": "retryable-reads-handshake-tests"
+ }
+ },
+ {
+ "commandFailedEvent": {
+ "commandName": "ping"
+ }
+ },
+ {
+ "commandStartedEvent": {
+ "commandName": "aggregate"
+ }
+ },
+ {
+ "commandSucceededEvent": {
+ "commandName": "aggregate"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "collection.countDocuments succeeds after retryable handshake server error (ShutdownInProgress)",
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 2
+ },
+ "data": {
+ "failCommands": [
+ "ping",
+ "saslContinue"
+ ],
+ "closeConnection": true
+ }
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "ping",
+ "command": {
+ "ping": 1
+ }
+ },
+ "expectError": {
+ "isError": true
+ }
+ },
+ {
+ "name": "countDocuments",
+ "object": "collection",
+ "arguments": {
+ "filter": {}
+ }
+ }
+ ],
+ "expectEvents": [
+ {
+ "client": "client",
+ "eventType": "cmap",
+ "events": [
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ }
+ ]
+ },
+ {
+ "client": "client",
+ "events": [
+ {
+ "commandStartedEvent": {
+ "command": {
+ "ping": 1
+ },
+ "databaseName": "retryable-reads-handshake-tests"
+ }
+ },
+ {
+ "commandFailedEvent": {
+ "commandName": "ping"
+ }
+ },
+ {
+ "commandStartedEvent": {
+ "commandName": "aggregate"
+ }
+ },
+ {
+ "commandSucceededEvent": {
+ "commandName": "aggregate"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "collection.estimatedDocumentCount succeeds after retryable handshake network error",
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 2
+ },
+ "data": {
+ "failCommands": [
+ "ping",
+ "saslContinue"
+ ],
+ "closeConnection": true
+ }
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "ping",
+ "command": {
+ "ping": 1
+ }
+ },
+ "expectError": {
+ "isError": true
+ }
+ },
+ {
+ "name": "estimatedDocumentCount",
+ "object": "collection"
+ }
+ ],
+ "expectEvents": [
+ {
+ "client": "client",
+ "eventType": "cmap",
+ "events": [
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ }
+ ]
+ },
+ {
+ "client": "client",
+ "events": [
+ {
+ "commandStartedEvent": {
+ "command": {
+ "ping": 1
+ },
+ "databaseName": "retryable-reads-handshake-tests"
+ }
+ },
+ {
+ "commandFailedEvent": {
+ "commandName": "ping"
+ }
+ },
+ {
+ "commandStartedEvent": {
+ "commandName": "count"
+ }
+ },
+ {
+ "commandSucceededEvent": {
+ "commandName": "count"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "collection.estimatedDocumentCount succeeds after retryable handshake server error (ShutdownInProgress)",
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 2
+ },
+ "data": {
+ "failCommands": [
+ "ping",
+ "saslContinue"
+ ],
+ "closeConnection": true
+ }
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "ping",
+ "command": {
+ "ping": 1
+ }
+ },
+ "expectError": {
+ "isError": true
+ }
+ },
+ {
+ "name": "estimatedDocumentCount",
+ "object": "collection"
+ }
+ ],
+ "expectEvents": [
+ {
+ "client": "client",
+ "eventType": "cmap",
+ "events": [
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ }
+ ]
+ },
+ {
+ "client": "client",
+ "events": [
+ {
+ "commandStartedEvent": {
+ "command": {
+ "ping": 1
+ },
+ "databaseName": "retryable-reads-handshake-tests"
+ }
+ },
+ {
+ "commandFailedEvent": {
+ "commandName": "ping"
+ }
+ },
+ {
+ "commandStartedEvent": {
+ "commandName": "count"
+ }
+ },
+ {
+ "commandSucceededEvent": {
+ "commandName": "count"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "collection.distinct succeeds after retryable handshake network error",
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 2
+ },
+ "data": {
+ "failCommands": [
+ "ping",
+ "saslContinue"
+ ],
+ "closeConnection": true
+ }
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "ping",
+ "command": {
+ "ping": 1
+ }
+ },
+ "expectError": {
+ "isError": true
+ }
+ },
+ {
+ "name": "distinct",
+ "object": "collection",
+ "arguments": {
+ "fieldName": "x",
+ "filter": {}
+ }
+ }
+ ],
+ "expectEvents": [
+ {
+ "client": "client",
+ "eventType": "cmap",
+ "events": [
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ }
+ ]
+ },
+ {
+ "client": "client",
+ "events": [
+ {
+ "commandStartedEvent": {
+ "command": {
+ "ping": 1
+ },
+ "databaseName": "retryable-reads-handshake-tests"
+ }
+ },
+ {
+ "commandFailedEvent": {
+ "commandName": "ping"
+ }
+ },
+ {
+ "commandStartedEvent": {
+ "commandName": "distinct"
+ }
+ },
+ {
+ "commandSucceededEvent": {
+ "commandName": "distinct"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "collection.distinct succeeds after retryable handshake server error (ShutdownInProgress)",
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 2
+ },
+ "data": {
+ "failCommands": [
+ "ping",
+ "saslContinue"
+ ],
+ "closeConnection": true
+ }
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "ping",
+ "command": {
+ "ping": 1
+ }
+ },
+ "expectError": {
+ "isError": true
+ }
+ },
+ {
+ "name": "distinct",
+ "object": "collection",
+ "arguments": {
+ "fieldName": "x",
+ "filter": {}
+ }
+ }
+ ],
+ "expectEvents": [
+ {
+ "client": "client",
+ "eventType": "cmap",
+ "events": [
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ }
+ ]
+ },
+ {
+ "client": "client",
+ "events": [
+ {
+ "commandStartedEvent": {
+ "command": {
+ "ping": 1
+ },
+ "databaseName": "retryable-reads-handshake-tests"
+ }
+ },
+ {
+ "commandFailedEvent": {
+ "commandName": "ping"
+ }
+ },
+ {
+ "commandStartedEvent": {
+ "commandName": "distinct"
+ }
+ },
+ {
+ "commandSucceededEvent": {
+ "commandName": "distinct"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "collection.find succeeds after retryable handshake network error",
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 2
+ },
+ "data": {
+ "failCommands": [
+ "ping",
+ "saslContinue"
+ ],
+ "closeConnection": true
+ }
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "ping",
+ "command": {
+ "ping": 1
+ }
+ },
+ "expectError": {
+ "isError": true
+ }
+ },
+ {
+ "name": "find",
+ "object": "collection",
+ "arguments": {
+ "filter": {}
+ }
+ }
+ ],
+ "expectEvents": [
+ {
+ "client": "client",
+ "eventType": "cmap",
+ "events": [
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ }
+ ]
+ },
+ {
+ "client": "client",
+ "events": [
+ {
+ "commandStartedEvent": {
+ "command": {
+ "ping": 1
+ },
+ "databaseName": "retryable-reads-handshake-tests"
+ }
+ },
+ {
+ "commandFailedEvent": {
+ "commandName": "ping"
+ }
+ },
+ {
+ "commandStartedEvent": {
+ "commandName": "find"
+ }
+ },
+ {
+ "commandSucceededEvent": {
+ "commandName": "find"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "collection.find succeeds after retryable handshake server error (ShutdownInProgress)",
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 2
+ },
+ "data": {
+ "failCommands": [
+ "ping",
+ "saslContinue"
+ ],
+ "closeConnection": true
+ }
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "ping",
+ "command": {
+ "ping": 1
+ }
+ },
+ "expectError": {
+ "isError": true
+ }
+ },
+ {
+ "name": "find",
+ "object": "collection",
+ "arguments": {
+ "filter": {}
+ }
+ }
+ ],
+ "expectEvents": [
+ {
+ "client": "client",
+ "eventType": "cmap",
+ "events": [
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ }
+ ]
+ },
+ {
+ "client": "client",
+ "events": [
+ {
+ "commandStartedEvent": {
+ "command": {
+ "ping": 1
+ },
+ "databaseName": "retryable-reads-handshake-tests"
+ }
+ },
+ {
+ "commandFailedEvent": {
+ "commandName": "ping"
+ }
+ },
+ {
+ "commandStartedEvent": {
+ "commandName": "find"
+ }
+ },
+ {
+ "commandSucceededEvent": {
+ "commandName": "find"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "collection.findOne succeeds after retryable handshake network error",
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 2
+ },
+ "data": {
+ "failCommands": [
+ "ping",
+ "saslContinue"
+ ],
+ "closeConnection": true
+ }
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "ping",
+ "command": {
+ "ping": 1
+ }
+ },
+ "expectError": {
+ "isError": true
+ }
+ },
+ {
+ "name": "findOne",
+ "object": "collection",
+ "arguments": {
+ "filter": {}
+ }
+ }
+ ],
+ "expectEvents": [
+ {
+ "client": "client",
+ "eventType": "cmap",
+ "events": [
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ }
+ ]
+ },
+ {
+ "client": "client",
+ "events": [
+ {
+ "commandStartedEvent": {
+ "command": {
+ "ping": 1
+ },
+ "databaseName": "retryable-reads-handshake-tests"
+ }
+ },
+ {
+ "commandFailedEvent": {
+ "commandName": "ping"
+ }
+ },
+ {
+ "commandStartedEvent": {
+ "commandName": "find"
+ }
+ },
+ {
+ "commandSucceededEvent": {
+ "commandName": "find"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "collection.findOne succeeds after retryable handshake server error (ShutdownInProgress)",
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 2
+ },
+ "data": {
+ "failCommands": [
+ "ping",
+ "saslContinue"
+ ],
+ "closeConnection": true
+ }
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "ping",
+ "command": {
+ "ping": 1
+ }
+ },
+ "expectError": {
+ "isError": true
+ }
+ },
+ {
+ "name": "findOne",
+ "object": "collection",
+ "arguments": {
+ "filter": {}
+ }
+ }
+ ],
+ "expectEvents": [
+ {
+ "client": "client",
+ "eventType": "cmap",
+ "events": [
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ }
+ ]
+ },
+ {
+ "client": "client",
+ "events": [
+ {
+ "commandStartedEvent": {
+ "command": {
+ "ping": 1
+ },
+ "databaseName": "retryable-reads-handshake-tests"
+ }
+ },
+ {
+ "commandFailedEvent": {
+ "commandName": "ping"
+ }
+ },
+ {
+ "commandStartedEvent": {
+ "commandName": "find"
+ }
+ },
+ {
+ "commandSucceededEvent": {
+ "commandName": "find"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "collection.listIndexes succeeds after retryable handshake network error",
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 2
+ },
+ "data": {
+ "failCommands": [
+ "ping",
+ "saslContinue"
+ ],
+ "closeConnection": true
+ }
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "ping",
+ "command": {
+ "ping": 1
+ }
+ },
+ "expectError": {
+ "isError": true
+ }
+ },
+ {
+ "name": "listIndexes",
+ "object": "collection"
+ }
+ ],
+ "expectEvents": [
+ {
+ "client": "client",
+ "eventType": "cmap",
+ "events": [
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ }
+ ]
+ },
+ {
+ "client": "client",
+ "events": [
+ {
+ "commandStartedEvent": {
+ "command": {
+ "ping": 1
+ },
+ "databaseName": "retryable-reads-handshake-tests"
+ }
+ },
+ {
+ "commandFailedEvent": {
+ "commandName": "ping"
+ }
+ },
+ {
+ "commandStartedEvent": {
+ "commandName": "listIndexes"
+ }
+ },
+ {
+ "commandSucceededEvent": {
+ "commandName": "listIndexes"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "collection.listIndexes succeeds after retryable handshake server error (ShutdownInProgress)",
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 2
+ },
+ "data": {
+ "failCommands": [
+ "ping",
+ "saslContinue"
+ ],
+ "closeConnection": true
+ }
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "ping",
+ "command": {
+ "ping": 1
+ }
+ },
+ "expectError": {
+ "isError": true
+ }
+ },
+ {
+ "name": "listIndexes",
+ "object": "collection"
+ }
+ ],
+ "expectEvents": [
+ {
+ "client": "client",
+ "eventType": "cmap",
+ "events": [
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ }
+ ]
+ },
+ {
+ "client": "client",
+ "events": [
+ {
+ "commandStartedEvent": {
+ "command": {
+ "ping": 1
+ },
+ "databaseName": "retryable-reads-handshake-tests"
+ }
+ },
+ {
+ "commandFailedEvent": {
+ "commandName": "ping"
+ }
+ },
+ {
+ "commandStartedEvent": {
+ "commandName": "listIndexes"
+ }
+ },
+ {
+ "commandSucceededEvent": {
+ "commandName": "listIndexes"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "collection.listIndexNames succeeds after retryable handshake network error",
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 2
+ },
+ "data": {
+ "failCommands": [
+ "ping",
+ "saslContinue"
+ ],
+ "closeConnection": true
+ }
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "ping",
+ "command": {
+ "ping": 1
+ }
+ },
+ "expectError": {
+ "isError": true
+ }
+ },
+ {
+ "name": "listIndexNames",
+ "object": "collection"
+ }
+ ],
+ "expectEvents": [
+ {
+ "client": "client",
+ "eventType": "cmap",
+ "events": [
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ }
+ ]
+ },
+ {
+ "client": "client",
+ "events": [
+ {
+ "commandStartedEvent": {
+ "command": {
+ "ping": 1
+ },
+ "databaseName": "retryable-reads-handshake-tests"
+ }
+ },
+ {
+ "commandFailedEvent": {
+ "commandName": "ping"
+ }
+ },
+ {
+ "commandStartedEvent": {
+ "commandName": "listIndexes"
+ }
+ },
+ {
+ "commandSucceededEvent": {
+ "commandName": "listIndexes"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "collection.listIndexNames succeeds after retryable handshake server error (ShutdownInProgress)",
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 2
+ },
+ "data": {
+ "failCommands": [
+ "ping",
+ "saslContinue"
+ ],
+ "closeConnection": true
+ }
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "ping",
+ "command": {
+ "ping": 1
+ }
+ },
+ "expectError": {
+ "isError": true
+ }
+ },
+ {
+ "name": "listIndexNames",
+ "object": "collection"
+ }
+ ],
+ "expectEvents": [
+ {
+ "client": "client",
+ "eventType": "cmap",
+ "events": [
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ }
+ ]
+ },
+ {
+ "client": "client",
+ "events": [
+ {
+ "commandStartedEvent": {
+ "command": {
+ "ping": 1
+ },
+ "databaseName": "retryable-reads-handshake-tests"
+ }
+ },
+ {
+ "commandFailedEvent": {
+ "commandName": "ping"
+ }
+ },
+ {
+ "commandStartedEvent": {
+ "commandName": "listIndexes"
+ }
+ },
+ {
+ "commandSucceededEvent": {
+ "commandName": "listIndexes"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "collection.createChangeStream succeeds after retryable handshake network error",
+ "runOnRequirements": [
+ {
+ "serverless": "forbid"
+ }
+ ],
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 2
+ },
+ "data": {
+ "failCommands": [
+ "ping",
+ "saslContinue"
+ ],
+ "closeConnection": true
+ }
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "ping",
+ "command": {
+ "ping": 1
+ }
+ },
+ "expectError": {
+ "isError": true
+ }
+ },
+ {
+ "name": "createChangeStream",
+ "object": "collection",
+ "arguments": {
+ "pipeline": []
+ },
+ "saveResultAsEntity": "changeStream"
+ }
+ ],
+ "expectEvents": [
+ {
+ "client": "client",
+ "eventType": "cmap",
+ "events": [
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ }
+ ]
+ },
+ {
+ "client": "client",
+ "events": [
+ {
+ "commandStartedEvent": {
+ "command": {
+ "ping": 1
+ },
+ "databaseName": "retryable-reads-handshake-tests"
+ }
+ },
+ {
+ "commandFailedEvent": {
+ "commandName": "ping"
+ }
+ },
+ {
+ "commandStartedEvent": {
+ "commandName": "aggregate"
+ }
+ },
+ {
+ "commandSucceededEvent": {
+ "commandName": "aggregate"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "collection.createChangeStream succeeds after retryable handshake server error (ShutdownInProgress)",
+ "runOnRequirements": [
+ {
+ "serverless": "forbid"
+ }
+ ],
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 2
+ },
+ "data": {
+ "failCommands": [
+ "ping",
+ "saslContinue"
+ ],
+ "closeConnection": true
+ }
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "ping",
+ "command": {
+ "ping": 1
+ }
+ },
+ "expectError": {
+ "isError": true
+ }
+ },
+ {
+ "name": "createChangeStream",
+ "object": "collection",
+ "arguments": {
+ "pipeline": []
+ },
+ "saveResultAsEntity": "changeStream"
+ }
+ ],
+ "expectEvents": [
+ {
+ "client": "client",
+ "eventType": "cmap",
+ "events": [
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ }
+ ]
+ },
+ {
+ "client": "client",
+ "events": [
+ {
+ "commandStartedEvent": {
+ "command": {
+ "ping": 1
+ },
+ "databaseName": "retryable-reads-handshake-tests"
+ }
+ },
+ {
+ "commandFailedEvent": {
+ "commandName": "ping"
+ }
+ },
+ {
+ "commandStartedEvent": {
+ "commandName": "aggregate"
+ }
+ },
+ {
+ "commandSucceededEvent": {
+ "commandName": "aggregate"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/specifications/retryable-reads/tests/unified/handshakeError.yml b/specifications/retryable-reads/tests/unified/handshakeError.yml
new file mode 100644
index 00000000000..f2b1ec982ce
--- /dev/null
+++ b/specifications/retryable-reads/tests/unified/handshakeError.yml
@@ -0,0 +1,1342 @@
+# Tests in this file are generated from handshakeError.yml.template.
+
+description: "retryable reads handshake failures"
+
+# 1.4 is required for "serverless: forbid".
+schemaVersion: "1.4"
+
+runOnRequirements:
+ - minServerVersion: "4.2"
+ topologies: [replicaset, sharded, load-balanced]
+ auth: true
+
+createEntities:
+ - client:
+ id: &client client
+ useMultipleMongoses: false
+ observeEvents:
+ - connectionCheckOutStartedEvent
+ - commandStartedEvent
+ - commandSucceededEvent
+ - commandFailedEvent
+ - database:
+ id: &database database
+ client: *client
+ databaseName: &databaseName retryable-reads-handshake-tests
+ - collection:
+ id: &collection collection
+ database: *database
+ collectionName: &collectionName coll
+
+initialData:
+ - collectionName: *collectionName
+ databaseName: *databaseName
+ documents:
+ - { _id: 1, x: 11 }
+ - { _id: 2, x: 22 }
+ - { _id: 3, x: 33 }
+
+tests:
+ # Because setting a failPoint creates a connection in the connection pool, run
+ # a ping operation that fails immediately after the failPoint operation in
+ # order to discard the connection before running the actual operation to be
+ # tested. The saslContinue command is used to avoid SDAM errors.
+ #
+ # Description of events:
+ # - Failpoint operation.
+ # - Creates a connection in the connection pool that must be closed.
+ # - Ping operation.
+ # - Triggers failpoint (first time).
+ # - Closes the connection made by the fail point operation.
+ # - Test operation.
+ # - New connection is created.
+ # - Triggers failpoint (second time).
+ # - Tests whether operation successfully retries the handshake and succeeds.
+
+ - description: "client.listDatabases succeeds after retryable handshake network error"
+ operations:
+ - name: failPoint
+ object: testRunner
+ arguments:
+ client: *client
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 2 }
+ data:
+ failCommands: [ping, saslContinue]
+ closeConnection: true
+ - name: runCommand
+ object: *database
+ arguments: { commandName: ping, command: { ping: 1 } }
+ expectError: { isError: true }
+ - name: listDatabases
+ object: *client
+ arguments:
+ filter: {}
+ expectEvents:
+ - client: *client
+ eventType: cmap
+ events:
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - client: *client
+ events:
+ - commandStartedEvent:
+ command: { ping: 1 }
+ databaseName: *databaseName
+ - commandFailedEvent:
+ commandName: ping
+ - commandStartedEvent:
+ commandName: listDatabases
+ - commandSucceededEvent:
+ commandName: listDatabases
+
+ - description: "client.listDatabases succeeds after retryable handshake server error (ShutdownInProgress)"
+ operations:
+ - name: failPoint
+ object: testRunner
+ arguments:
+ client: *client
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 2 }
+ data:
+ failCommands: [ping, saslContinue]
+ closeConnection: true
+ - name: runCommand
+ object: *database
+ arguments: { commandName: ping, command: { ping: 1 } }
+ expectError: { isError: true }
+ - name: listDatabases
+ object: *client
+ arguments:
+ filter: {}
+ expectEvents:
+ - client: *client
+ eventType: cmap
+ events:
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - client: *client
+ events:
+ - commandStartedEvent:
+ command: { ping: 1 }
+ databaseName: *databaseName
+ - commandFailedEvent:
+ commandName: ping
+ - commandStartedEvent:
+ commandName: listDatabases
+ - commandSucceededEvent:
+ commandName: listDatabases
+
+ - description: "client.listDatabaseNames succeeds after retryable handshake network error"
+ operations:
+ - name: failPoint
+ object: testRunner
+ arguments:
+ client: *client
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 2 }
+ data:
+ failCommands: [ping, saslContinue]
+ closeConnection: true
+ - name: runCommand
+ object: *database
+ arguments: { commandName: ping, command: { ping: 1 } }
+ expectError: { isError: true }
+ - name: listDatabaseNames
+ object: *client
+ expectEvents:
+ - client: *client
+ eventType: cmap
+ events:
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - client: *client
+ events:
+ - commandStartedEvent:
+ command: { ping: 1 }
+ databaseName: *databaseName
+ - commandFailedEvent:
+ commandName: ping
+ - commandStartedEvent:
+ commandName: listDatabases
+ - commandSucceededEvent:
+ commandName: listDatabases
+
+ - description: "client.listDatabaseNames succeeds after retryable handshake server error (ShutdownInProgress)"
+ operations:
+ - name: failPoint
+ object: testRunner
+ arguments:
+ client: *client
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 2 }
+ data:
+ failCommands: [ping, saslContinue]
+ closeConnection: true
+ - name: runCommand
+ object: *database
+ arguments: { commandName: ping, command: { ping: 1 } }
+ expectError: { isError: true }
+ - name: listDatabaseNames
+ object: *client
+ expectEvents:
+ - client: *client
+ eventType: cmap
+ events:
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - client: *client
+ events:
+ - commandStartedEvent:
+ command: { ping: 1 }
+ databaseName: *databaseName
+ - commandFailedEvent:
+ commandName: ping
+ - commandStartedEvent:
+ commandName: listDatabases
+ - commandSucceededEvent:
+ commandName: listDatabases
+
+ - description: "client.createChangeStream succeeds after retryable handshake network error"
+ runOnRequirements:
+ - serverless: forbid
+ operations:
+ - name: failPoint
+ object: testRunner
+ arguments:
+ client: *client
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 2 }
+ data:
+ failCommands: [ping, saslContinue]
+ closeConnection: true
+ - name: runCommand
+ object: *database
+ arguments: { commandName: ping, command: { ping: 1 } }
+ expectError: { isError: true }
+ - name: createChangeStream
+ object: *client
+ arguments:
+ pipeline: []
+ saveResultAsEntity: changeStream
+ expectEvents:
+ - client: *client
+ eventType: cmap
+ events:
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - client: *client
+ events:
+ - commandStartedEvent:
+ command: { ping: 1 }
+ databaseName: *databaseName
+ - commandFailedEvent:
+ commandName: ping
+ - commandStartedEvent:
+ commandName: aggregate
+ - commandSucceededEvent:
+ commandName: aggregate
+
+ - description: "client.createChangeStream succeeds after retryable handshake server error (ShutdownInProgress)"
+ runOnRequirements:
+ - serverless: forbid
+ operations:
+ - name: failPoint
+ object: testRunner
+ arguments:
+ client: *client
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 2 }
+ data:
+ failCommands: [ping, saslContinue]
+ closeConnection: true
+ - name: runCommand
+ object: *database
+ arguments: { commandName: ping, command: { ping: 1 } }
+ expectError: { isError: true }
+ - name: createChangeStream
+ object: *client
+ arguments:
+ pipeline: []
+ saveResultAsEntity: changeStream
+ expectEvents:
+ - client: *client
+ eventType: cmap
+ events:
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - client: *client
+ events:
+ - commandStartedEvent:
+ command: { ping: 1 }
+ databaseName: *databaseName
+ - commandFailedEvent:
+ commandName: ping
+ - commandStartedEvent:
+ commandName: aggregate
+ - commandSucceededEvent:
+ commandName: aggregate
+
+ - description: "database.aggregate succeeds after retryable handshake network error"
+ runOnRequirements:
+ - serverless: forbid
+ operations:
+ - name: failPoint
+ object: testRunner
+ arguments:
+ client: *client
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 2 }
+ data:
+ failCommands: [ping, saslContinue]
+ closeConnection: true
+ - name: runCommand
+ object: *database
+ arguments: { commandName: ping, command: { ping: 1 } }
+ expectError: { isError: true }
+ - name: aggregate
+ object: *database
+ arguments:
+ pipeline: [ { $listLocalSessions: {} }, { $limit: 1 } ]
+ expectEvents:
+ - client: *client
+ eventType: cmap
+ events:
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - client: *client
+ events:
+ - commandStartedEvent:
+ command: { ping: 1 }
+ databaseName: *databaseName
+ - commandFailedEvent:
+ commandName: ping
+ - commandStartedEvent:
+ commandName: aggregate
+ - commandSucceededEvent:
+ commandName: aggregate
+
+ - description: "database.aggregate succeeds after retryable handshake server error (ShutdownInProgress)"
+ runOnRequirements:
+ - serverless: forbid
+ operations:
+ - name: failPoint
+ object: testRunner
+ arguments:
+ client: *client
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 2 }
+ data:
+ failCommands: [ping, saslContinue]
+ closeConnection: true
+ - name: runCommand
+ object: *database
+ arguments: { commandName: ping, command: { ping: 1 } }
+ expectError: { isError: true }
+ - name: aggregate
+ object: *database
+ arguments:
+ pipeline: [ { $listLocalSessions: {} }, { $limit: 1 } ]
+ expectEvents:
+ - client: *client
+ eventType: cmap
+ events:
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - client: *client
+ events:
+ - commandStartedEvent:
+ command: { ping: 1 }
+ databaseName: *databaseName
+ - commandFailedEvent:
+ commandName: ping
+ - commandStartedEvent:
+ commandName: aggregate
+ - commandSucceededEvent:
+ commandName: aggregate
+
+ - description: "database.listCollections succeeds after retryable handshake network error"
+ operations:
+ - name: failPoint
+ object: testRunner
+ arguments:
+ client: *client
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 2 }
+ data:
+ failCommands: [ping, saslContinue]
+ closeConnection: true
+ - name: runCommand
+ object: *database
+ arguments: { commandName: ping, command: { ping: 1 } }
+ expectError: { isError: true }
+ - name: listCollections
+ object: *database
+ arguments:
+ filter: {}
+ expectEvents:
+ - client: *client
+ eventType: cmap
+ events:
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - client: *client
+ events:
+ - commandStartedEvent:
+ command: { ping: 1 }
+ databaseName: *databaseName
+ - commandFailedEvent:
+ commandName: ping
+ - commandStartedEvent:
+ commandName: listCollections
+ - commandSucceededEvent:
+ commandName: listCollections
+
+ - description: "database.listCollections succeeds after retryable handshake server error (ShutdownInProgress)"
+ operations:
+ - name: failPoint
+ object: testRunner
+ arguments:
+ client: *client
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 2 }
+ data:
+ failCommands: [ping, saslContinue]
+ closeConnection: true
+ - name: runCommand
+ object: *database
+ arguments: { commandName: ping, command: { ping: 1 } }
+ expectError: { isError: true }
+ - name: listCollections
+ object: *database
+ arguments:
+ filter: {}
+ expectEvents:
+ - client: *client
+ eventType: cmap
+ events:
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - client: *client
+ events:
+ - commandStartedEvent:
+ command: { ping: 1 }
+ databaseName: *databaseName
+ - commandFailedEvent:
+ commandName: ping
+ - commandStartedEvent:
+ commandName: listCollections
+ - commandSucceededEvent:
+ commandName: listCollections
+
+ - description: "database.listCollectionNames succeeds after retryable handshake network error"
+ operations:
+ - name: failPoint
+ object: testRunner
+ arguments:
+ client: *client
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 2 }
+ data:
+ failCommands: [ping, saslContinue]
+ closeConnection: true
+ - name: runCommand
+ object: *database
+ arguments: { commandName: ping, command: { ping: 1 } }
+ expectError: { isError: true }
+ - name: listCollectionNames
+ object: *database
+ arguments:
+ filter: {}
+ expectEvents:
+ - client: *client
+ eventType: cmap
+ events:
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - client: *client
+ events:
+ - commandStartedEvent:
+ command: { ping: 1 }
+ databaseName: *databaseName
+ - commandFailedEvent:
+ commandName: ping
+ - commandStartedEvent:
+ commandName: listCollections
+ - commandSucceededEvent:
+ commandName: listCollections
+
+ - description: "database.listCollectionNames succeeds after retryable handshake server error (ShutdownInProgress)"
+ operations:
+ - name: failPoint
+ object: testRunner
+ arguments:
+ client: *client
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 2 }
+ data:
+ failCommands: [ping, saslContinue]
+ closeConnection: true
+ - name: runCommand
+ object: *database
+ arguments: { commandName: ping, command: { ping: 1 } }
+ expectError: { isError: true }
+ - name: listCollectionNames
+ object: *database
+ arguments:
+ filter: {}
+ expectEvents:
+ - client: *client
+ eventType: cmap
+ events:
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - client: *client
+ events:
+ - commandStartedEvent:
+ command: { ping: 1 }
+ databaseName: *databaseName
+ - commandFailedEvent:
+ commandName: ping
+ - commandStartedEvent:
+ commandName: listCollections
+ - commandSucceededEvent:
+ commandName: listCollections
+
+ - description: "database.createChangeStream succeeds after retryable handshake network error"
+ runOnRequirements:
+ - serverless: forbid
+ operations:
+ - name: failPoint
+ object: testRunner
+ arguments:
+ client: *client
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 2 }
+ data:
+ failCommands: [ping, saslContinue]
+ closeConnection: true
+ - name: runCommand
+ object: *database
+ arguments: { commandName: ping, command: { ping: 1 } }
+ expectError: { isError: true }
+ - name: createChangeStream
+ object: *database
+ arguments:
+ pipeline: []
+ saveResultAsEntity: changeStream
+ expectEvents:
+ - client: *client
+ eventType: cmap
+ events:
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - client: *client
+ events:
+ - commandStartedEvent:
+ command: { ping: 1 }
+ databaseName: *databaseName
+ - commandFailedEvent:
+ commandName: ping
+ - commandStartedEvent:
+ commandName: aggregate
+ - commandSucceededEvent:
+ commandName: aggregate
+
+ - description: "database.createChangeStream succeeds after retryable handshake server error (ShutdownInProgress)"
+ runOnRequirements:
+ - serverless: forbid
+ operations:
+ - name: failPoint
+ object: testRunner
+ arguments:
+ client: *client
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 2 }
+ data:
+ failCommands: [ping, saslContinue]
+ closeConnection: true
+ - name: runCommand
+ object: *database
+ arguments: { commandName: ping, command: { ping: 1 } }
+ expectError: { isError: true }
+ - name: createChangeStream
+ object: *database
+ arguments:
+ pipeline: []
+ saveResultAsEntity: changeStream
+ expectEvents:
+ - client: *client
+ eventType: cmap
+ events:
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - client: *client
+ events:
+ - commandStartedEvent:
+ command: { ping: 1 }
+ databaseName: *databaseName
+ - commandFailedEvent:
+ commandName: ping
+ - commandStartedEvent:
+ commandName: aggregate
+ - commandSucceededEvent:
+ commandName: aggregate
+
+ - description: "collection.aggregate succeeds after retryable handshake network error"
+ operations:
+ - name: failPoint
+ object: testRunner
+ arguments:
+ client: *client
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 2 }
+ data:
+ failCommands: [ping, saslContinue]
+ closeConnection: true
+ - name: runCommand
+ object: *database
+ arguments: { commandName: ping, command: { ping: 1 } }
+ expectError: { isError: true }
+ - name: aggregate
+ object: *collection
+ arguments:
+ pipeline: []
+ expectEvents:
+ - client: *client
+ eventType: cmap
+ events:
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - client: *client
+ events:
+ - commandStartedEvent:
+ command: { ping: 1 }
+ databaseName: *databaseName
+ - commandFailedEvent:
+ commandName: ping
+ - commandStartedEvent:
+ commandName: aggregate
+ - commandSucceededEvent:
+ commandName: aggregate
+
+ - description: "collection.aggregate succeeds after retryable handshake server error (ShutdownInProgress)"
+ operations:
+ - name: failPoint
+ object: testRunner
+ arguments:
+ client: *client
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 2 }
+ data:
+ failCommands: [ping, saslContinue]
+ closeConnection: true
+ - name: runCommand
+ object: *database
+ arguments: { commandName: ping, command: { ping: 1 } }
+ expectError: { isError: true }
+ - name: aggregate
+ object: *collection
+ arguments:
+ pipeline: []
+ expectEvents:
+ - client: *client
+ eventType: cmap
+ events:
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - client: *client
+ events:
+ - commandStartedEvent:
+ command: { ping: 1 }
+ databaseName: *databaseName
+ - commandFailedEvent:
+ commandName: ping
+ - commandStartedEvent:
+ commandName: aggregate
+ - commandSucceededEvent:
+ commandName: aggregate
+
+ - description: "collection.countDocuments succeeds after retryable handshake network error"
+ operations:
+ - name: failPoint
+ object: testRunner
+ arguments:
+ client: *client
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 2 }
+ data:
+ failCommands: [ping, saslContinue]
+ closeConnection: true
+ - name: runCommand
+ object: *database
+ arguments: { commandName: ping, command: { ping: 1 } }
+ expectError: { isError: true }
+ - name: countDocuments
+ object: *collection
+ arguments:
+ filter: {}
+ expectEvents:
+ - client: *client
+ eventType: cmap
+ events:
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - client: *client
+ events:
+ - commandStartedEvent:
+ command: { ping: 1 }
+ databaseName: *databaseName
+ - commandFailedEvent:
+ commandName: ping
+ - commandStartedEvent:
+ commandName: aggregate
+ - commandSucceededEvent:
+ commandName: aggregate
+
+ - description: "collection.countDocuments succeeds after retryable handshake server error (ShutdownInProgress)"
+ operations:
+ - name: failPoint
+ object: testRunner
+ arguments:
+ client: *client
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 2 }
+ data:
+ failCommands: [ping, saslContinue]
+ closeConnection: true
+ - name: runCommand
+ object: *database
+ arguments: { commandName: ping, command: { ping: 1 } }
+ expectError: { isError: true }
+ - name: countDocuments
+ object: *collection
+ arguments:
+ filter: {}
+ expectEvents:
+ - client: *client
+ eventType: cmap
+ events:
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - client: *client
+ events:
+ - commandStartedEvent:
+ command: { ping: 1 }
+ databaseName: *databaseName
+ - commandFailedEvent:
+ commandName: ping
+ - commandStartedEvent:
+ commandName: aggregate
+ - commandSucceededEvent:
+ commandName: aggregate
+
+ - description: "collection.estimatedDocumentCount succeeds after retryable handshake network error"
+ operations:
+ - name: failPoint
+ object: testRunner
+ arguments:
+ client: *client
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 2 }
+ data:
+ failCommands: [ping, saslContinue]
+ closeConnection: true
+ - name: runCommand
+ object: *database
+ arguments: { commandName: ping, command: { ping: 1 } }
+ expectError: { isError: true }
+ - name: estimatedDocumentCount
+ object: *collection
+ expectEvents:
+ - client: *client
+ eventType: cmap
+ events:
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - client: *client
+ events:
+ - commandStartedEvent:
+ command: { ping: 1 }
+ databaseName: *databaseName
+ - commandFailedEvent:
+ commandName: ping
+ - commandStartedEvent:
+ commandName: count
+ - commandSucceededEvent:
+ commandName: count
+
+ - description: "collection.estimatedDocumentCount succeeds after retryable handshake server error (ShutdownInProgress)"
+ operations:
+ - name: failPoint
+ object: testRunner
+ arguments:
+ client: *client
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 2 }
+ data:
+ failCommands: [ping, saslContinue]
+ closeConnection: true
+ - name: runCommand
+ object: *database
+ arguments: { commandName: ping, command: { ping: 1 } }
+ expectError: { isError: true }
+ - name: estimatedDocumentCount
+ object: *collection
+ expectEvents:
+ - client: *client
+ eventType: cmap
+ events:
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - client: *client
+ events:
+ - commandStartedEvent:
+ command: { ping: 1 }
+ databaseName: *databaseName
+ - commandFailedEvent:
+ commandName: ping
+ - commandStartedEvent:
+ commandName: count
+ - commandSucceededEvent:
+ commandName: count
+
+ - description: "collection.distinct succeeds after retryable handshake network error"
+ operations:
+ - name: failPoint
+ object: testRunner
+ arguments:
+ client: *client
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 2 }
+ data:
+ failCommands: [ping, saslContinue]
+ closeConnection: true
+ - name: runCommand
+ object: *database
+ arguments: { commandName: ping, command: { ping: 1 } }
+ expectError: { isError: true }
+ - name: distinct
+ object: *collection
+ arguments:
+ fieldName: x
+ filter: {}
+ expectEvents:
+ - client: *client
+ eventType: cmap
+ events:
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - client: *client
+ events:
+ - commandStartedEvent:
+ command: { ping: 1 }
+ databaseName: *databaseName
+ - commandFailedEvent:
+ commandName: ping
+ - commandStartedEvent:
+ commandName: distinct
+ - commandSucceededEvent:
+ commandName: distinct
+
+ - description: "collection.distinct succeeds after retryable handshake server error (ShutdownInProgress)"
+ operations:
+ - name: failPoint
+ object: testRunner
+ arguments:
+ client: *client
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 2 }
+ data:
+ failCommands: [ping, saslContinue]
+ closeConnection: true
+ - name: runCommand
+ object: *database
+ arguments: { commandName: ping, command: { ping: 1 } }
+ expectError: { isError: true }
+ - name: distinct
+ object: *collection
+ arguments:
+ fieldName: x
+ filter: {}
+ expectEvents:
+ - client: *client
+ eventType: cmap
+ events:
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - client: *client
+ events:
+ - commandStartedEvent:
+ command: { ping: 1 }
+ databaseName: *databaseName
+ - commandFailedEvent:
+ commandName: ping
+ - commandStartedEvent:
+ commandName: distinct
+ - commandSucceededEvent:
+ commandName: distinct
+
+ - description: "collection.find succeeds after retryable handshake network error"
+ operations:
+ - name: failPoint
+ object: testRunner
+ arguments:
+ client: *client
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 2 }
+ data:
+ failCommands: [ping, saslContinue]
+ closeConnection: true
+ - name: runCommand
+ object: *database
+ arguments: { commandName: ping, command: { ping: 1 } }
+ expectError: { isError: true }
+ - name: find
+ object: *collection
+ arguments:
+ filter: {}
+ expectEvents:
+ - client: *client
+ eventType: cmap
+ events:
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - client: *client
+ events:
+ - commandStartedEvent:
+ command: { ping: 1 }
+ databaseName: *databaseName
+ - commandFailedEvent:
+ commandName: ping
+ - commandStartedEvent:
+ commandName: find
+ - commandSucceededEvent:
+ commandName: find
+
+ - description: "collection.find succeeds after retryable handshake server error (ShutdownInProgress)"
+ operations:
+ - name: failPoint
+ object: testRunner
+ arguments:
+ client: *client
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 2 }
+ data:
+ failCommands: [ping, saslContinue]
+ closeConnection: true
+ - name: runCommand
+ object: *database
+ arguments: { commandName: ping, command: { ping: 1 } }
+ expectError: { isError: true }
+ - name: find
+ object: *collection
+ arguments:
+ filter: {}
+ expectEvents:
+ - client: *client
+ eventType: cmap
+ events:
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - client: *client
+ events:
+ - commandStartedEvent:
+ command: { ping: 1 }
+ databaseName: *databaseName
+ - commandFailedEvent:
+ commandName: ping
+ - commandStartedEvent:
+ commandName: find
+ - commandSucceededEvent:
+ commandName: find
+
+ - description: "collection.findOne succeeds after retryable handshake network error"
+ operations:
+ - name: failPoint
+ object: testRunner
+ arguments:
+ client: *client
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 2 }
+ data:
+ failCommands: [ping, saslContinue]
+ closeConnection: true
+ - name: runCommand
+ object: *database
+ arguments: { commandName: ping, command: { ping: 1 } }
+ expectError: { isError: true }
+ - name: findOne
+ object: *collection
+ arguments:
+ filter: {}
+ expectEvents:
+ - client: *client
+ eventType: cmap
+ events:
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - client: *client
+ events:
+ - commandStartedEvent:
+ command: { ping: 1 }
+ databaseName: *databaseName
+ - commandFailedEvent:
+ commandName: ping
+ - commandStartedEvent:
+ commandName: find
+ - commandSucceededEvent:
+ commandName: find
+
+ - description: "collection.findOne succeeds after retryable handshake server error (ShutdownInProgress)"
+ operations:
+ - name: failPoint
+ object: testRunner
+ arguments:
+ client: *client
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 2 }
+ data:
+ failCommands: [ping, saslContinue]
+ closeConnection: true
+ - name: runCommand
+ object: *database
+ arguments: { commandName: ping, command: { ping: 1 } }
+ expectError: { isError: true }
+ - name: findOne
+ object: *collection
+ arguments:
+ filter: {}
+ expectEvents:
+ - client: *client
+ eventType: cmap
+ events:
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - client: *client
+ events:
+ - commandStartedEvent:
+ command: { ping: 1 }
+ databaseName: *databaseName
+ - commandFailedEvent:
+ commandName: ping
+ - commandStartedEvent:
+ commandName: find
+ - commandSucceededEvent:
+ commandName: find
+
+ - description: "collection.listIndexes succeeds after retryable handshake network error"
+ operations:
+ - name: failPoint
+ object: testRunner
+ arguments:
+ client: *client
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 2 }
+ data:
+ failCommands: [ping, saslContinue]
+ closeConnection: true
+ - name: runCommand
+ object: *database
+ arguments: { commandName: ping, command: { ping: 1 } }
+ expectError: { isError: true }
+ - name: listIndexes
+ object: *collection
+ expectEvents:
+ - client: *client
+ eventType: cmap
+ events:
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - client: *client
+ events:
+ - commandStartedEvent:
+ command: { ping: 1 }
+ databaseName: *databaseName
+ - commandFailedEvent:
+ commandName: ping
+ - commandStartedEvent:
+ commandName: listIndexes
+ - commandSucceededEvent:
+ commandName: listIndexes
+
+ - description: "collection.listIndexes succeeds after retryable handshake server error (ShutdownInProgress)"
+ operations:
+ - name: failPoint
+ object: testRunner
+ arguments:
+ client: *client
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 2 }
+ data:
+ failCommands: [ping, saslContinue]
+ closeConnection: true
+ - name: runCommand
+ object: *database
+ arguments: { commandName: ping, command: { ping: 1 } }
+ expectError: { isError: true }
+ - name: listIndexes
+ object: *collection
+ expectEvents:
+ - client: *client
+ eventType: cmap
+ events:
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - client: *client
+ events:
+ - commandStartedEvent:
+ command: { ping: 1 }
+ databaseName: *databaseName
+ - commandFailedEvent:
+ commandName: ping
+ - commandStartedEvent:
+ commandName: listIndexes
+ - commandSucceededEvent:
+ commandName: listIndexes
+
+ - description: "collection.listIndexNames succeeds after retryable handshake network error"
+ operations:
+ - name: failPoint
+ object: testRunner
+ arguments:
+ client: *client
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 2 }
+ data:
+ failCommands: [ping, saslContinue]
+ closeConnection: true
+ - name: runCommand
+ object: *database
+ arguments: { commandName: ping, command: { ping: 1 } }
+ expectError: { isError: true }
+ - name: listIndexNames
+ object: *collection
+ expectEvents:
+ - client: *client
+ eventType: cmap
+ events:
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - client: *client
+ events:
+ - commandStartedEvent:
+ command: { ping: 1 }
+ databaseName: *databaseName
+ - commandFailedEvent:
+ commandName: ping
+ - commandStartedEvent:
+ commandName: listIndexes
+ - commandSucceededEvent:
+ commandName: listIndexes
+
+ - description: "collection.listIndexNames succeeds after retryable handshake server error (ShutdownInProgress)"
+ operations:
+ - name: failPoint
+ object: testRunner
+ arguments:
+ client: *client
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 2 }
+ data:
+ failCommands: [ping, saslContinue]
+ closeConnection: true
+ - name: runCommand
+ object: *database
+ arguments: { commandName: ping, command: { ping: 1 } }
+ expectError: { isError: true }
+ - name: listIndexNames
+ object: *collection
+ expectEvents:
+ - client: *client
+ eventType: cmap
+ events:
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - client: *client
+ events:
+ - commandStartedEvent:
+ command: { ping: 1 }
+ databaseName: *databaseName
+ - commandFailedEvent:
+ commandName: ping
+ - commandStartedEvent:
+ commandName: listIndexes
+ - commandSucceededEvent:
+ commandName: listIndexes
+
+ - description: "collection.createChangeStream succeeds after retryable handshake network error"
+ runOnRequirements:
+ - serverless: forbid
+ operations:
+ - name: failPoint
+ object: testRunner
+ arguments:
+ client: *client
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 2 }
+ data:
+ failCommands: [ping, saslContinue]
+ closeConnection: true
+ - name: runCommand
+ object: *database
+ arguments: { commandName: ping, command: { ping: 1 } }
+ expectError: { isError: true }
+ - name: createChangeStream
+ object: *collection
+ arguments:
+ pipeline: []
+ saveResultAsEntity: changeStream
+ expectEvents:
+ - client: *client
+ eventType: cmap
+ events:
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - client: *client
+ events:
+ - commandStartedEvent:
+ command: { ping: 1 }
+ databaseName: *databaseName
+ - commandFailedEvent:
+ commandName: ping
+ - commandStartedEvent:
+ commandName: aggregate
+ - commandSucceededEvent:
+ commandName: aggregate
+
+ - description: "collection.createChangeStream succeeds after retryable handshake server error (ShutdownInProgress)"
+ runOnRequirements:
+ - serverless: forbid
+ operations:
+ - name: failPoint
+ object: testRunner
+ arguments:
+ client: *client
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 2 }
+ data:
+ failCommands: [ping, saslContinue]
+ closeConnection: true
+ - name: runCommand
+ object: *database
+ arguments: { commandName: ping, command: { ping: 1 } }
+ expectError: { isError: true }
+ - name: createChangeStream
+ object: *collection
+ arguments:
+ pipeline: []
+ saveResultAsEntity: changeStream
+ expectEvents:
+ - client: *client
+ eventType: cmap
+ events:
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - client: *client
+ events:
+ - commandStartedEvent:
+ command: { ping: 1 }
+ databaseName: *databaseName
+ - commandFailedEvent:
+ commandName: ping
+ - commandStartedEvent:
+ commandName: aggregate
+ - commandSucceededEvent:
+ commandName: aggregate
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/README.rst b/specifications/retryable-writes/tests/legacy/README.rst
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/README.rst
rename to specifications/retryable-writes/tests/legacy/README.rst
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/bulkWrite-errorLabels.json b/specifications/retryable-writes/tests/legacy/bulkWrite-errorLabels.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/bulkWrite-errorLabels.json
rename to specifications/retryable-writes/tests/legacy/bulkWrite-errorLabels.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/bulkWrite-errorLabels.yml b/specifications/retryable-writes/tests/legacy/bulkWrite-errorLabels.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/bulkWrite-errorLabels.yml
rename to specifications/retryable-writes/tests/legacy/bulkWrite-errorLabels.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/bulkWrite-serverErrors.json b/specifications/retryable-writes/tests/legacy/bulkWrite-serverErrors.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/bulkWrite-serverErrors.json
rename to specifications/retryable-writes/tests/legacy/bulkWrite-serverErrors.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/bulkWrite-serverErrors.yml b/specifications/retryable-writes/tests/legacy/bulkWrite-serverErrors.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/bulkWrite-serverErrors.yml
rename to specifications/retryable-writes/tests/legacy/bulkWrite-serverErrors.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/bulkWrite.json b/specifications/retryable-writes/tests/legacy/bulkWrite.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/bulkWrite.json
rename to specifications/retryable-writes/tests/legacy/bulkWrite.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/bulkWrite.yml b/specifications/retryable-writes/tests/legacy/bulkWrite.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/bulkWrite.yml
rename to specifications/retryable-writes/tests/legacy/bulkWrite.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/deleteMany.json b/specifications/retryable-writes/tests/legacy/deleteMany.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/deleteMany.json
rename to specifications/retryable-writes/tests/legacy/deleteMany.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/deleteMany.yml b/specifications/retryable-writes/tests/legacy/deleteMany.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/deleteMany.yml
rename to specifications/retryable-writes/tests/legacy/deleteMany.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/deleteOne-errorLabels.json b/specifications/retryable-writes/tests/legacy/deleteOne-errorLabels.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/deleteOne-errorLabels.json
rename to specifications/retryable-writes/tests/legacy/deleteOne-errorLabels.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/deleteOne-errorLabels.yml b/specifications/retryable-writes/tests/legacy/deleteOne-errorLabels.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/deleteOne-errorLabels.yml
rename to specifications/retryable-writes/tests/legacy/deleteOne-errorLabels.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/deleteOne-serverErrors.json b/specifications/retryable-writes/tests/legacy/deleteOne-serverErrors.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/deleteOne-serverErrors.json
rename to specifications/retryable-writes/tests/legacy/deleteOne-serverErrors.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/deleteOne-serverErrors.yml b/specifications/retryable-writes/tests/legacy/deleteOne-serverErrors.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/deleteOne-serverErrors.yml
rename to specifications/retryable-writes/tests/legacy/deleteOne-serverErrors.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/deleteOne.json b/specifications/retryable-writes/tests/legacy/deleteOne.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/deleteOne.json
rename to specifications/retryable-writes/tests/legacy/deleteOne.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/deleteOne.yml b/specifications/retryable-writes/tests/legacy/deleteOne.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/deleteOne.yml
rename to specifications/retryable-writes/tests/legacy/deleteOne.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/findOneAndDelete-errorLabels.json b/specifications/retryable-writes/tests/legacy/findOneAndDelete-errorLabels.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/findOneAndDelete-errorLabels.json
rename to specifications/retryable-writes/tests/legacy/findOneAndDelete-errorLabels.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/findOneAndDelete-errorLabels.yml b/specifications/retryable-writes/tests/legacy/findOneAndDelete-errorLabels.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/findOneAndDelete-errorLabels.yml
rename to specifications/retryable-writes/tests/legacy/findOneAndDelete-errorLabels.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/findOneAndDelete-serverErrors.json b/specifications/retryable-writes/tests/legacy/findOneAndDelete-serverErrors.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/findOneAndDelete-serverErrors.json
rename to specifications/retryable-writes/tests/legacy/findOneAndDelete-serverErrors.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/findOneAndDelete-serverErrors.yml b/specifications/retryable-writes/tests/legacy/findOneAndDelete-serverErrors.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/findOneAndDelete-serverErrors.yml
rename to specifications/retryable-writes/tests/legacy/findOneAndDelete-serverErrors.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/findOneAndDelete.json b/specifications/retryable-writes/tests/legacy/findOneAndDelete.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/findOneAndDelete.json
rename to specifications/retryable-writes/tests/legacy/findOneAndDelete.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/findOneAndDelete.yml b/specifications/retryable-writes/tests/legacy/findOneAndDelete.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/findOneAndDelete.yml
rename to specifications/retryable-writes/tests/legacy/findOneAndDelete.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/findOneAndReplace-errorLabels.json b/specifications/retryable-writes/tests/legacy/findOneAndReplace-errorLabels.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/findOneAndReplace-errorLabels.json
rename to specifications/retryable-writes/tests/legacy/findOneAndReplace-errorLabels.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/findOneAndReplace-errorLabels.yml b/specifications/retryable-writes/tests/legacy/findOneAndReplace-errorLabels.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/findOneAndReplace-errorLabels.yml
rename to specifications/retryable-writes/tests/legacy/findOneAndReplace-errorLabels.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/findOneAndReplace-serverErrors.json b/specifications/retryable-writes/tests/legacy/findOneAndReplace-serverErrors.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/findOneAndReplace-serverErrors.json
rename to specifications/retryable-writes/tests/legacy/findOneAndReplace-serverErrors.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/findOneAndReplace-serverErrors.yml b/specifications/retryable-writes/tests/legacy/findOneAndReplace-serverErrors.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/findOneAndReplace-serverErrors.yml
rename to specifications/retryable-writes/tests/legacy/findOneAndReplace-serverErrors.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/findOneAndReplace.json b/specifications/retryable-writes/tests/legacy/findOneAndReplace.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/findOneAndReplace.json
rename to specifications/retryable-writes/tests/legacy/findOneAndReplace.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/findOneAndReplace.yml b/specifications/retryable-writes/tests/legacy/findOneAndReplace.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/findOneAndReplace.yml
rename to specifications/retryable-writes/tests/legacy/findOneAndReplace.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/findOneAndUpdate-errorLabels.json b/specifications/retryable-writes/tests/legacy/findOneAndUpdate-errorLabels.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/findOneAndUpdate-errorLabels.json
rename to specifications/retryable-writes/tests/legacy/findOneAndUpdate-errorLabels.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/findOneAndUpdate-errorLabels.yml b/specifications/retryable-writes/tests/legacy/findOneAndUpdate-errorLabels.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/findOneAndUpdate-errorLabels.yml
rename to specifications/retryable-writes/tests/legacy/findOneAndUpdate-errorLabels.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/findOneAndUpdate-serverErrors.json b/specifications/retryable-writes/tests/legacy/findOneAndUpdate-serverErrors.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/findOneAndUpdate-serverErrors.json
rename to specifications/retryable-writes/tests/legacy/findOneAndUpdate-serverErrors.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/findOneAndUpdate-serverErrors.yml b/specifications/retryable-writes/tests/legacy/findOneAndUpdate-serverErrors.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/findOneAndUpdate-serverErrors.yml
rename to specifications/retryable-writes/tests/legacy/findOneAndUpdate-serverErrors.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/findOneAndUpdate.json b/specifications/retryable-writes/tests/legacy/findOneAndUpdate.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/findOneAndUpdate.json
rename to specifications/retryable-writes/tests/legacy/findOneAndUpdate.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/findOneAndUpdate.yml b/specifications/retryable-writes/tests/legacy/findOneAndUpdate.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/findOneAndUpdate.yml
rename to specifications/retryable-writes/tests/legacy/findOneAndUpdate.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/insertMany-errorLabels.json b/specifications/retryable-writes/tests/legacy/insertMany-errorLabels.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/insertMany-errorLabels.json
rename to specifications/retryable-writes/tests/legacy/insertMany-errorLabels.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/insertMany-errorLabels.yml b/specifications/retryable-writes/tests/legacy/insertMany-errorLabels.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/insertMany-errorLabels.yml
rename to specifications/retryable-writes/tests/legacy/insertMany-errorLabels.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/insertMany-serverErrors.json b/specifications/retryable-writes/tests/legacy/insertMany-serverErrors.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/insertMany-serverErrors.json
rename to specifications/retryable-writes/tests/legacy/insertMany-serverErrors.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/insertMany-serverErrors.yml b/specifications/retryable-writes/tests/legacy/insertMany-serverErrors.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/insertMany-serverErrors.yml
rename to specifications/retryable-writes/tests/legacy/insertMany-serverErrors.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/insertMany.json b/specifications/retryable-writes/tests/legacy/insertMany.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/insertMany.json
rename to specifications/retryable-writes/tests/legacy/insertMany.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/insertMany.yml b/specifications/retryable-writes/tests/legacy/insertMany.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/insertMany.yml
rename to specifications/retryable-writes/tests/legacy/insertMany.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/insertOne-errorLabels.json b/specifications/retryable-writes/tests/legacy/insertOne-errorLabels.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/insertOne-errorLabels.json
rename to specifications/retryable-writes/tests/legacy/insertOne-errorLabels.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/insertOne-errorLabels.yml b/specifications/retryable-writes/tests/legacy/insertOne-errorLabels.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/insertOne-errorLabels.yml
rename to specifications/retryable-writes/tests/legacy/insertOne-errorLabels.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/insertOne-serverErrors.json b/specifications/retryable-writes/tests/legacy/insertOne-serverErrors.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/insertOne-serverErrors.json
rename to specifications/retryable-writes/tests/legacy/insertOne-serverErrors.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/insertOne-serverErrors.yml b/specifications/retryable-writes/tests/legacy/insertOne-serverErrors.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/insertOne-serverErrors.yml
rename to specifications/retryable-writes/tests/legacy/insertOne-serverErrors.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/insertOne.json b/specifications/retryable-writes/tests/legacy/insertOne.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/insertOne.json
rename to specifications/retryable-writes/tests/legacy/insertOne.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/insertOne.yml b/specifications/retryable-writes/tests/legacy/insertOne.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/insertOne.yml
rename to specifications/retryable-writes/tests/legacy/insertOne.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/replaceOne-errorLabels.json b/specifications/retryable-writes/tests/legacy/replaceOne-errorLabels.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/replaceOne-errorLabels.json
rename to specifications/retryable-writes/tests/legacy/replaceOne-errorLabels.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/replaceOne-errorLabels.yml b/specifications/retryable-writes/tests/legacy/replaceOne-errorLabels.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/replaceOne-errorLabels.yml
rename to specifications/retryable-writes/tests/legacy/replaceOne-errorLabels.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/replaceOne-serverErrors.json b/specifications/retryable-writes/tests/legacy/replaceOne-serverErrors.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/replaceOne-serverErrors.json
rename to specifications/retryable-writes/tests/legacy/replaceOne-serverErrors.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/replaceOne-serverErrors.yml b/specifications/retryable-writes/tests/legacy/replaceOne-serverErrors.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/replaceOne-serverErrors.yml
rename to specifications/retryable-writes/tests/legacy/replaceOne-serverErrors.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/replaceOne.json b/specifications/retryable-writes/tests/legacy/replaceOne.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/replaceOne.json
rename to specifications/retryable-writes/tests/legacy/replaceOne.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/replaceOne.yml b/specifications/retryable-writes/tests/legacy/replaceOne.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/replaceOne.yml
rename to specifications/retryable-writes/tests/legacy/replaceOne.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/updateMany.json b/specifications/retryable-writes/tests/legacy/updateMany.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/updateMany.json
rename to specifications/retryable-writes/tests/legacy/updateMany.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/updateMany.yml b/specifications/retryable-writes/tests/legacy/updateMany.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/updateMany.yml
rename to specifications/retryable-writes/tests/legacy/updateMany.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/updateOne-errorLabels.json b/specifications/retryable-writes/tests/legacy/updateOne-errorLabels.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/updateOne-errorLabels.json
rename to specifications/retryable-writes/tests/legacy/updateOne-errorLabels.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/updateOne-errorLabels.yml b/specifications/retryable-writes/tests/legacy/updateOne-errorLabels.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/updateOne-errorLabels.yml
rename to specifications/retryable-writes/tests/legacy/updateOne-errorLabels.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/updateOne-serverErrors.json b/specifications/retryable-writes/tests/legacy/updateOne-serverErrors.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/updateOne-serverErrors.json
rename to specifications/retryable-writes/tests/legacy/updateOne-serverErrors.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/updateOne-serverErrors.yml b/specifications/retryable-writes/tests/legacy/updateOne-serverErrors.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/updateOne-serverErrors.yml
rename to specifications/retryable-writes/tests/legacy/updateOne-serverErrors.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/updateOne.json b/specifications/retryable-writes/tests/legacy/updateOne.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/updateOne.json
rename to specifications/retryable-writes/tests/legacy/updateOne.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/updateOne.yml b/specifications/retryable-writes/tests/legacy/updateOne.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/legacy/updateOne.yml
rename to specifications/retryable-writes/tests/legacy/updateOne.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/unified/bulkWrite-serverErrors.json b/specifications/retryable-writes/tests/unified/bulkWrite-serverErrors.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/unified/bulkWrite-serverErrors.json
rename to specifications/retryable-writes/tests/unified/bulkWrite-serverErrors.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/unified/bulkWrite-serverErrors.yml b/specifications/retryable-writes/tests/unified/bulkWrite-serverErrors.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/unified/bulkWrite-serverErrors.yml
rename to specifications/retryable-writes/tests/unified/bulkWrite-serverErrors.yml
diff --git a/specifications/retryable-writes/tests/unified/handshakeError.json b/specifications/retryable-writes/tests/unified/handshakeError.json
new file mode 100644
index 00000000000..df37bd72322
--- /dev/null
+++ b/specifications/retryable-writes/tests/unified/handshakeError.json
@@ -0,0 +1,1797 @@
+{
+ "description": "retryable writes handshake failures",
+ "schemaVersion": "1.3",
+ "runOnRequirements": [
+ {
+ "minServerVersion": "4.2",
+ "topologies": [
+ "replicaset",
+ "sharded",
+ "load-balanced"
+ ],
+ "auth": true
+ }
+ ],
+ "createEntities": [
+ {
+ "client": {
+ "id": "client",
+ "useMultipleMongoses": false,
+ "observeEvents": [
+ "connectionCheckOutStartedEvent",
+ "commandStartedEvent",
+ "commandSucceededEvent",
+ "commandFailedEvent"
+ ]
+ }
+ },
+ {
+ "database": {
+ "id": "database",
+ "client": "client",
+ "databaseName": "retryable-writes-handshake-tests"
+ }
+ },
+ {
+ "collection": {
+ "id": "collection",
+ "database": "database",
+ "collectionName": "coll"
+ }
+ }
+ ],
+ "initialData": [
+ {
+ "collectionName": "coll",
+ "databaseName": "retryable-writes-handshake-tests",
+ "documents": [
+ {
+ "_id": 1,
+ "x": 11
+ }
+ ]
+ }
+ ],
+ "tests": [
+ {
+ "description": "collection.insertOne succeeds after retryable handshake network error",
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 2
+ },
+ "data": {
+ "failCommands": [
+ "ping",
+ "saslContinue"
+ ],
+ "closeConnection": true
+ }
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "ping",
+ "command": {
+ "ping": 1
+ }
+ },
+ "expectError": {
+ "isError": true
+ }
+ },
+ {
+ "name": "insertOne",
+ "object": "collection",
+ "arguments": {
+ "document": {
+ "_id": 2,
+ "x": 22
+ }
+ }
+ }
+ ],
+ "expectEvents": [
+ {
+ "client": "client",
+ "eventType": "cmap",
+ "events": [
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ }
+ ]
+ },
+ {
+ "client": "client",
+ "events": [
+ {
+ "commandStartedEvent": {
+ "command": {
+ "ping": 1
+ },
+ "databaseName": "retryable-writes-handshake-tests"
+ }
+ },
+ {
+ "commandFailedEvent": {
+ "commandName": "ping"
+ }
+ },
+ {
+ "commandStartedEvent": {
+ "commandName": "insert"
+ }
+ },
+ {
+ "commandSucceededEvent": {
+ "commandName": "insert"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "collection.insertOne succeeds after retryable handshake server error (ShutdownInProgress)",
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 2
+ },
+ "data": {
+ "failCommands": [
+ "ping",
+ "saslContinue"
+ ],
+ "closeConnection": true
+ }
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "ping",
+ "command": {
+ "ping": 1
+ }
+ },
+ "expectError": {
+ "isError": true
+ }
+ },
+ {
+ "name": "insertOne",
+ "object": "collection",
+ "arguments": {
+ "document": {
+ "_id": 2,
+ "x": 22
+ }
+ }
+ }
+ ],
+ "expectEvents": [
+ {
+ "client": "client",
+ "eventType": "cmap",
+ "events": [
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ }
+ ]
+ },
+ {
+ "client": "client",
+ "events": [
+ {
+ "commandStartedEvent": {
+ "command": {
+ "ping": 1
+ },
+ "databaseName": "retryable-writes-handshake-tests"
+ }
+ },
+ {
+ "commandFailedEvent": {
+ "commandName": "ping"
+ }
+ },
+ {
+ "commandStartedEvent": {
+ "commandName": "insert"
+ }
+ },
+ {
+ "commandSucceededEvent": {
+ "commandName": "insert"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "collection.insertMany succeeds after retryable handshake network error",
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 2
+ },
+ "data": {
+ "failCommands": [
+ "ping",
+ "saslContinue"
+ ],
+ "closeConnection": true
+ }
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "ping",
+ "command": {
+ "ping": 1
+ }
+ },
+ "expectError": {
+ "isError": true
+ }
+ },
+ {
+ "name": "insertMany",
+ "object": "collection",
+ "arguments": {
+ "documents": [
+ {
+ "_id": 2,
+ "x": 22
+ }
+ ]
+ }
+ }
+ ],
+ "expectEvents": [
+ {
+ "client": "client",
+ "eventType": "cmap",
+ "events": [
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ }
+ ]
+ },
+ {
+ "client": "client",
+ "events": [
+ {
+ "commandStartedEvent": {
+ "command": {
+ "ping": 1
+ },
+ "databaseName": "retryable-writes-handshake-tests"
+ }
+ },
+ {
+ "commandFailedEvent": {
+ "commandName": "ping"
+ }
+ },
+ {
+ "commandStartedEvent": {
+ "commandName": "insert"
+ }
+ },
+ {
+ "commandSucceededEvent": {
+ "commandName": "insert"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "collection.insertMany succeeds after retryable handshake server error (ShutdownInProgress)",
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 2
+ },
+ "data": {
+ "failCommands": [
+ "ping",
+ "saslContinue"
+ ],
+ "closeConnection": true
+ }
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "ping",
+ "command": {
+ "ping": 1
+ }
+ },
+ "expectError": {
+ "isError": true
+ }
+ },
+ {
+ "name": "insertMany",
+ "object": "collection",
+ "arguments": {
+ "documents": [
+ {
+ "_id": 2,
+ "x": 22
+ }
+ ]
+ }
+ }
+ ],
+ "expectEvents": [
+ {
+ "client": "client",
+ "eventType": "cmap",
+ "events": [
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ }
+ ]
+ },
+ {
+ "client": "client",
+ "events": [
+ {
+ "commandStartedEvent": {
+ "command": {
+ "ping": 1
+ },
+ "databaseName": "retryable-writes-handshake-tests"
+ }
+ },
+ {
+ "commandFailedEvent": {
+ "commandName": "ping"
+ }
+ },
+ {
+ "commandStartedEvent": {
+ "commandName": "insert"
+ }
+ },
+ {
+ "commandSucceededEvent": {
+ "commandName": "insert"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "collection.deleteOne succeeds after retryable handshake network error",
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 2
+ },
+ "data": {
+ "failCommands": [
+ "ping",
+ "saslContinue"
+ ],
+ "closeConnection": true
+ }
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "ping",
+ "command": {
+ "ping": 1
+ }
+ },
+ "expectError": {
+ "isError": true
+ }
+ },
+ {
+ "name": "deleteOne",
+ "object": "collection",
+ "arguments": {
+ "filter": {}
+ }
+ }
+ ],
+ "expectEvents": [
+ {
+ "client": "client",
+ "eventType": "cmap",
+ "events": [
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ }
+ ]
+ },
+ {
+ "client": "client",
+ "events": [
+ {
+ "commandStartedEvent": {
+ "command": {
+ "ping": 1
+ },
+ "databaseName": "retryable-writes-handshake-tests"
+ }
+ },
+ {
+ "commandFailedEvent": {
+ "commandName": "ping"
+ }
+ },
+ {
+ "commandStartedEvent": {
+ "commandName": "delete"
+ }
+ },
+ {
+ "commandSucceededEvent": {
+ "commandName": "delete"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "collection.deleteOne succeeds after retryable handshake server error (ShutdownInProgress)",
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 2
+ },
+ "data": {
+ "failCommands": [
+ "ping",
+ "saslContinue"
+ ],
+ "closeConnection": true
+ }
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "ping",
+ "command": {
+ "ping": 1
+ }
+ },
+ "expectError": {
+ "isError": true
+ }
+ },
+ {
+ "name": "deleteOne",
+ "object": "collection",
+ "arguments": {
+ "filter": {}
+ }
+ }
+ ],
+ "expectEvents": [
+ {
+ "client": "client",
+ "eventType": "cmap",
+ "events": [
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ }
+ ]
+ },
+ {
+ "client": "client",
+ "events": [
+ {
+ "commandStartedEvent": {
+ "command": {
+ "ping": 1
+ },
+ "databaseName": "retryable-writes-handshake-tests"
+ }
+ },
+ {
+ "commandFailedEvent": {
+ "commandName": "ping"
+ }
+ },
+ {
+ "commandStartedEvent": {
+ "commandName": "delete"
+ }
+ },
+ {
+ "commandSucceededEvent": {
+ "commandName": "delete"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "collection.replaceOne succeeds after retryable handshake network error",
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 2
+ },
+ "data": {
+ "failCommands": [
+ "ping",
+ "saslContinue"
+ ],
+ "closeConnection": true
+ }
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "ping",
+ "command": {
+ "ping": 1
+ }
+ },
+ "expectError": {
+ "isError": true
+ }
+ },
+ {
+ "name": "replaceOne",
+ "object": "collection",
+ "arguments": {
+ "filter": {},
+ "replacement": {
+ "x": 22
+ }
+ }
+ }
+ ],
+ "expectEvents": [
+ {
+ "client": "client",
+ "eventType": "cmap",
+ "events": [
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ }
+ ]
+ },
+ {
+ "client": "client",
+ "events": [
+ {
+ "commandStartedEvent": {
+ "command": {
+ "ping": 1
+ },
+ "databaseName": "retryable-writes-handshake-tests"
+ }
+ },
+ {
+ "commandFailedEvent": {
+ "commandName": "ping"
+ }
+ },
+ {
+ "commandStartedEvent": {
+ "commandName": "update"
+ }
+ },
+ {
+ "commandSucceededEvent": {
+ "commandName": "update"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "collection.replaceOne succeeds after retryable handshake server error (ShutdownInProgress)",
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 2
+ },
+ "data": {
+ "failCommands": [
+ "ping",
+ "saslContinue"
+ ],
+ "closeConnection": true
+ }
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "ping",
+ "command": {
+ "ping": 1
+ }
+ },
+ "expectError": {
+ "isError": true
+ }
+ },
+ {
+ "name": "replaceOne",
+ "object": "collection",
+ "arguments": {
+ "filter": {},
+ "replacement": {
+ "x": 22
+ }
+ }
+ }
+ ],
+ "expectEvents": [
+ {
+ "client": "client",
+ "eventType": "cmap",
+ "events": [
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ }
+ ]
+ },
+ {
+ "client": "client",
+ "events": [
+ {
+ "commandStartedEvent": {
+ "command": {
+ "ping": 1
+ },
+ "databaseName": "retryable-writes-handshake-tests"
+ }
+ },
+ {
+ "commandFailedEvent": {
+ "commandName": "ping"
+ }
+ },
+ {
+ "commandStartedEvent": {
+ "commandName": "update"
+ }
+ },
+ {
+ "commandSucceededEvent": {
+ "commandName": "update"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "collection.updateOne succeeds after retryable handshake network error",
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 2
+ },
+ "data": {
+ "failCommands": [
+ "ping",
+ "saslContinue"
+ ],
+ "closeConnection": true
+ }
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "ping",
+ "command": {
+ "ping": 1
+ }
+ },
+ "expectError": {
+ "isError": true
+ }
+ },
+ {
+ "name": "updateOne",
+ "object": "collection",
+ "arguments": {
+ "filter": {},
+ "update": {
+ "$set": {
+ "x": 22
+ }
+ }
+ }
+ }
+ ],
+ "expectEvents": [
+ {
+ "client": "client",
+ "eventType": "cmap",
+ "events": [
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ }
+ ]
+ },
+ {
+ "client": "client",
+ "events": [
+ {
+ "commandStartedEvent": {
+ "command": {
+ "ping": 1
+ },
+ "databaseName": "retryable-writes-handshake-tests"
+ }
+ },
+ {
+ "commandFailedEvent": {
+ "commandName": "ping"
+ }
+ },
+ {
+ "commandStartedEvent": {
+ "commandName": "update"
+ }
+ },
+ {
+ "commandSucceededEvent": {
+ "commandName": "update"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "collection.updateOne succeeds after retryable handshake server error (ShutdownInProgress)",
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 2
+ },
+ "data": {
+ "failCommands": [
+ "ping",
+ "saslContinue"
+ ],
+ "closeConnection": true
+ }
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "ping",
+ "command": {
+ "ping": 1
+ }
+ },
+ "expectError": {
+ "isError": true
+ }
+ },
+ {
+ "name": "updateOne",
+ "object": "collection",
+ "arguments": {
+ "filter": {},
+ "update": {
+ "$set": {
+ "x": 22
+ }
+ }
+ }
+ }
+ ],
+ "expectEvents": [
+ {
+ "client": "client",
+ "eventType": "cmap",
+ "events": [
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ }
+ ]
+ },
+ {
+ "client": "client",
+ "events": [
+ {
+ "commandStartedEvent": {
+ "command": {
+ "ping": 1
+ },
+ "databaseName": "retryable-writes-handshake-tests"
+ }
+ },
+ {
+ "commandFailedEvent": {
+ "commandName": "ping"
+ }
+ },
+ {
+ "commandStartedEvent": {
+ "commandName": "update"
+ }
+ },
+ {
+ "commandSucceededEvent": {
+ "commandName": "update"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "collection.findOneAndDelete succeeds after retryable handshake network error",
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 2
+ },
+ "data": {
+ "failCommands": [
+ "ping",
+ "saslContinue"
+ ],
+ "closeConnection": true
+ }
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "ping",
+ "command": {
+ "ping": 1
+ }
+ },
+ "expectError": {
+ "isError": true
+ }
+ },
+ {
+ "name": "findOneAndDelete",
+ "object": "collection",
+ "arguments": {
+ "filter": {}
+ }
+ }
+ ],
+ "expectEvents": [
+ {
+ "client": "client",
+ "eventType": "cmap",
+ "events": [
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ }
+ ]
+ },
+ {
+ "client": "client",
+ "events": [
+ {
+ "commandStartedEvent": {
+ "command": {
+ "ping": 1
+ },
+ "databaseName": "retryable-writes-handshake-tests"
+ }
+ },
+ {
+ "commandFailedEvent": {
+ "commandName": "ping"
+ }
+ },
+ {
+ "commandStartedEvent": {
+ "commandName": "findAndModify"
+ }
+ },
+ {
+ "commandSucceededEvent": {
+ "commandName": "findAndModify"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "collection.findOneAndDelete succeeds after retryable handshake server error (ShutdownInProgress)",
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 2
+ },
+ "data": {
+ "failCommands": [
+ "ping",
+ "saslContinue"
+ ],
+ "closeConnection": true
+ }
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "ping",
+ "command": {
+ "ping": 1
+ }
+ },
+ "expectError": {
+ "isError": true
+ }
+ },
+ {
+ "name": "findOneAndDelete",
+ "object": "collection",
+ "arguments": {
+ "filter": {}
+ }
+ }
+ ],
+ "expectEvents": [
+ {
+ "client": "client",
+ "eventType": "cmap",
+ "events": [
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ }
+ ]
+ },
+ {
+ "client": "client",
+ "events": [
+ {
+ "commandStartedEvent": {
+ "command": {
+ "ping": 1
+ },
+ "databaseName": "retryable-writes-handshake-tests"
+ }
+ },
+ {
+ "commandFailedEvent": {
+ "commandName": "ping"
+ }
+ },
+ {
+ "commandStartedEvent": {
+ "commandName": "findAndModify"
+ }
+ },
+ {
+ "commandSucceededEvent": {
+ "commandName": "findAndModify"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "collection.findOneAndReplace succeeds after retryable handshake network error",
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 2
+ },
+ "data": {
+ "failCommands": [
+ "ping",
+ "saslContinue"
+ ],
+ "closeConnection": true
+ }
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "ping",
+ "command": {
+ "ping": 1
+ }
+ },
+ "expectError": {
+ "isError": true
+ }
+ },
+ {
+ "name": "findOneAndReplace",
+ "object": "collection",
+ "arguments": {
+ "filter": {},
+ "replacement": {
+ "x": 22
+ }
+ }
+ }
+ ],
+ "expectEvents": [
+ {
+ "client": "client",
+ "eventType": "cmap",
+ "events": [
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ }
+ ]
+ },
+ {
+ "client": "client",
+ "events": [
+ {
+ "commandStartedEvent": {
+ "command": {
+ "ping": 1
+ },
+ "databaseName": "retryable-writes-handshake-tests"
+ }
+ },
+ {
+ "commandFailedEvent": {
+ "commandName": "ping"
+ }
+ },
+ {
+ "commandStartedEvent": {
+ "commandName": "findAndModify"
+ }
+ },
+ {
+ "commandSucceededEvent": {
+ "commandName": "findAndModify"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "collection.findOneAndReplace succeeds after retryable handshake server error (ShutdownInProgress)",
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 2
+ },
+ "data": {
+ "failCommands": [
+ "ping",
+ "saslContinue"
+ ],
+ "closeConnection": true
+ }
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "ping",
+ "command": {
+ "ping": 1
+ }
+ },
+ "expectError": {
+ "isError": true
+ }
+ },
+ {
+ "name": "findOneAndReplace",
+ "object": "collection",
+ "arguments": {
+ "filter": {},
+ "replacement": {
+ "x": 22
+ }
+ }
+ }
+ ],
+ "expectEvents": [
+ {
+ "client": "client",
+ "eventType": "cmap",
+ "events": [
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ }
+ ]
+ },
+ {
+ "client": "client",
+ "events": [
+ {
+ "commandStartedEvent": {
+ "command": {
+ "ping": 1
+ },
+ "databaseName": "retryable-writes-handshake-tests"
+ }
+ },
+ {
+ "commandFailedEvent": {
+ "commandName": "ping"
+ }
+ },
+ {
+ "commandStartedEvent": {
+ "commandName": "findAndModify"
+ }
+ },
+ {
+ "commandSucceededEvent": {
+ "commandName": "findAndModify"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "collection.findOneAndUpdate succeeds after retryable handshake network error",
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 2
+ },
+ "data": {
+ "failCommands": [
+ "ping",
+ "saslContinue"
+ ],
+ "closeConnection": true
+ }
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "ping",
+ "command": {
+ "ping": 1
+ }
+ },
+ "expectError": {
+ "isError": true
+ }
+ },
+ {
+ "name": "findOneAndUpdate",
+ "object": "collection",
+ "arguments": {
+ "filter": {},
+ "update": {
+ "$set": {
+ "x": 22
+ }
+ }
+ }
+ }
+ ],
+ "expectEvents": [
+ {
+ "client": "client",
+ "eventType": "cmap",
+ "events": [
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ }
+ ]
+ },
+ {
+ "client": "client",
+ "events": [
+ {
+ "commandStartedEvent": {
+ "command": {
+ "ping": 1
+ },
+ "databaseName": "retryable-writes-handshake-tests"
+ }
+ },
+ {
+ "commandFailedEvent": {
+ "commandName": "ping"
+ }
+ },
+ {
+ "commandStartedEvent": {
+ "commandName": "findAndModify"
+ }
+ },
+ {
+ "commandSucceededEvent": {
+ "commandName": "findAndModify"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "collection.findOneAndUpdate succeeds after retryable handshake server error (ShutdownInProgress)",
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 2
+ },
+ "data": {
+ "failCommands": [
+ "ping",
+ "saslContinue"
+ ],
+ "closeConnection": true
+ }
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "ping",
+ "command": {
+ "ping": 1
+ }
+ },
+ "expectError": {
+ "isError": true
+ }
+ },
+ {
+ "name": "findOneAndUpdate",
+ "object": "collection",
+ "arguments": {
+ "filter": {},
+ "update": {
+ "$set": {
+ "x": 22
+ }
+ }
+ }
+ }
+ ],
+ "expectEvents": [
+ {
+ "client": "client",
+ "eventType": "cmap",
+ "events": [
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ }
+ ]
+ },
+ {
+ "client": "client",
+ "events": [
+ {
+ "commandStartedEvent": {
+ "command": {
+ "ping": 1
+ },
+ "databaseName": "retryable-writes-handshake-tests"
+ }
+ },
+ {
+ "commandFailedEvent": {
+ "commandName": "ping"
+ }
+ },
+ {
+ "commandStartedEvent": {
+ "commandName": "findAndModify"
+ }
+ },
+ {
+ "commandSucceededEvent": {
+ "commandName": "findAndModify"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "collection.bulkWrite succeeds after retryable handshake network error",
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 2
+ },
+ "data": {
+ "failCommands": [
+ "ping",
+ "saslContinue"
+ ],
+ "closeConnection": true
+ }
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "ping",
+ "command": {
+ "ping": 1
+ }
+ },
+ "expectError": {
+ "isError": true
+ }
+ },
+ {
+ "name": "bulkWrite",
+ "object": "collection",
+ "arguments": {
+ "requests": [
+ {
+ "insertOne": {
+ "document": {
+ "_id": 2,
+ "x": 22
+ }
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "expectEvents": [
+ {
+ "client": "client",
+ "eventType": "cmap",
+ "events": [
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ }
+ ]
+ },
+ {
+ "client": "client",
+ "events": [
+ {
+ "commandStartedEvent": {
+ "command": {
+ "ping": 1
+ },
+ "databaseName": "retryable-writes-handshake-tests"
+ }
+ },
+ {
+ "commandFailedEvent": {
+ "commandName": "ping"
+ }
+ },
+ {
+ "commandStartedEvent": {
+ "commandName": "insert"
+ }
+ },
+ {
+ "commandSucceededEvent": {
+ "commandName": "insert"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "collection.bulkWrite succeeds after retryable handshake server error (ShutdownInProgress)",
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 2
+ },
+ "data": {
+ "failCommands": [
+ "ping",
+ "saslContinue"
+ ],
+ "closeConnection": true
+ }
+ }
+ }
+ },
+ {
+ "name": "runCommand",
+ "object": "database",
+ "arguments": {
+ "commandName": "ping",
+ "command": {
+ "ping": 1
+ }
+ },
+ "expectError": {
+ "isError": true
+ }
+ },
+ {
+ "name": "bulkWrite",
+ "object": "collection",
+ "arguments": {
+ "requests": [
+ {
+ "insertOne": {
+ "document": {
+ "_id": 2,
+ "x": 22
+ }
+ }
+ }
+ ]
+ }
+ }
+ ],
+ "expectEvents": [
+ {
+ "client": "client",
+ "eventType": "cmap",
+ "events": [
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ },
+ {
+ "connectionCheckOutStartedEvent": {}
+ }
+ ]
+ },
+ {
+ "client": "client",
+ "events": [
+ {
+ "commandStartedEvent": {
+ "command": {
+ "ping": 1
+ },
+ "databaseName": "retryable-writes-handshake-tests"
+ }
+ },
+ {
+ "commandFailedEvent": {
+ "commandName": "ping"
+ }
+ },
+ {
+ "commandStartedEvent": {
+ "commandName": "insert"
+ }
+ },
+ {
+ "commandSucceededEvent": {
+ "commandName": "insert"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/specifications/retryable-writes/tests/unified/handshakeError.yml b/specifications/retryable-writes/tests/unified/handshakeError.yml
new file mode 100644
index 00000000000..9b2774bc77e
--- /dev/null
+++ b/specifications/retryable-writes/tests/unified/handshakeError.yml
@@ -0,0 +1,785 @@
+# Tests in this file are generated from handshakeError.yml.template.
+
+description: "retryable writes handshake failures"
+
+schemaVersion: "1.3"
+
+runOnRequirements:
+ - minServerVersion: "4.2"
+ topologies: [replicaset, sharded, load-balanced]
+ auth: true
+
+createEntities:
+ - client:
+ id: &client client
+ useMultipleMongoses: false
+ observeEvents:
+ - connectionCheckOutStartedEvent
+ - commandStartedEvent
+ - commandSucceededEvent
+ - commandFailedEvent
+ - database:
+ id: &database database
+ client: *client
+ databaseName: &databaseName retryable-writes-handshake-tests
+ - collection:
+ id: &collection collection
+ database: *database
+ collectionName: &collectionName coll
+
+initialData:
+ - collectionName: *collectionName
+ databaseName: *databaseName
+ documents:
+ - { _id: 1, x: 11 }
+
+tests:
+ # Because setting a failPoint creates a connection in the connection pool, run
+ # a ping operation that fails immediately after the failPoint operation in
+ # order to discard the connection before running the actual operation to be
+ # tested. The saslContinue command is used to avoid SDAM errors.
+ #
+ # Description of events:
+ # - Failpoint operation.
+ # - Creates a connection in the connection pool that must be closed.
+ # - Ping operation.
+ # - Triggers failpoint (first time).
+ # - Closes the connection made by the fail point operation.
+ # - Test operation.
+ # - New connection is created.
+ # - Triggers failpoint (second time).
+ # - Tests whether operation successfully retries the handshake and succeeds.
+
+ - description: "collection.insertOne succeeds after retryable handshake network error"
+ operations:
+ - name: failPoint
+ object: testRunner
+ arguments:
+ client: *client
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 2 }
+ data:
+ failCommands: [ping, saslContinue]
+ closeConnection: true
+ - name: runCommand
+ object: *database
+ arguments: { commandName: ping, command: { ping: 1 } }
+ expectError: { isError: true }
+ - name: insertOne
+ object: *collection
+ arguments:
+ document: { _id: 2, x: 22 }
+ expectEvents:
+ - client: *client
+ eventType: cmap
+ events:
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - client: *client
+ events:
+ - commandStartedEvent:
+ command: { ping: 1 }
+ databaseName: *databaseName
+ - commandFailedEvent:
+ commandName: ping
+ - commandStartedEvent:
+ commandName: insert
+ - commandSucceededEvent:
+ commandName: insert
+
+ - description: "collection.insertOne succeeds after retryable handshake server error (ShutdownInProgress)"
+ operations:
+ - name: failPoint
+ object: testRunner
+ arguments:
+ client: *client
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 2 }
+ data:
+ failCommands: [ping, saslContinue]
+ closeConnection: true
+ - name: runCommand
+ object: *database
+ arguments: { commandName: ping, command: { ping: 1 } }
+ expectError: { isError: true }
+ - name: insertOne
+ object: *collection
+ arguments:
+ document: { _id: 2, x: 22 }
+ expectEvents:
+ - client: *client
+ eventType: cmap
+ events:
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - client: *client
+ events:
+ - commandStartedEvent:
+ command: { ping: 1 }
+ databaseName: *databaseName
+ - commandFailedEvent:
+ commandName: ping
+ - commandStartedEvent:
+ commandName: insert
+ - commandSucceededEvent:
+ commandName: insert
+
+ - description: "collection.insertMany succeeds after retryable handshake network error"
+ operations:
+ - name: failPoint
+ object: testRunner
+ arguments:
+ client: *client
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 2 }
+ data:
+ failCommands: [ping, saslContinue]
+ closeConnection: true
+ - name: runCommand
+ object: *database
+ arguments: { commandName: ping, command: { ping: 1 } }
+ expectError: { isError: true }
+ - name: insertMany
+ object: *collection
+ arguments:
+ documents:
+ - { _id: 2, x: 22 }
+ expectEvents:
+ - client: *client
+ eventType: cmap
+ events:
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - client: *client
+ events:
+ - commandStartedEvent:
+ command: { ping: 1 }
+ databaseName: *databaseName
+ - commandFailedEvent:
+ commandName: ping
+ - commandStartedEvent:
+ commandName: insert
+ - commandSucceededEvent:
+ commandName: insert
+
+ - description: "collection.insertMany succeeds after retryable handshake server error (ShutdownInProgress)"
+ operations:
+ - name: failPoint
+ object: testRunner
+ arguments:
+ client: *client
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 2 }
+ data:
+ failCommands: [ping, saslContinue]
+ closeConnection: true
+ - name: runCommand
+ object: *database
+ arguments: { commandName: ping, command: { ping: 1 } }
+ expectError: { isError: true }
+ - name: insertMany
+ object: *collection
+ arguments:
+ documents:
+ - { _id: 2, x: 22 }
+ expectEvents:
+ - client: *client
+ eventType: cmap
+ events:
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - client: *client
+ events:
+ - commandStartedEvent:
+ command: { ping: 1 }
+ databaseName: *databaseName
+ - commandFailedEvent:
+ commandName: ping
+ - commandStartedEvent:
+ commandName: insert
+ - commandSucceededEvent:
+ commandName: insert
+
+ - description: "collection.deleteOne succeeds after retryable handshake network error"
+ operations:
+ - name: failPoint
+ object: testRunner
+ arguments:
+ client: *client
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 2 }
+ data:
+ failCommands: [ping, saslContinue]
+ closeConnection: true
+ - name: runCommand
+ object: *database
+ arguments: { commandName: ping, command: { ping: 1 } }
+ expectError: { isError: true }
+ - name: deleteOne
+ object: *collection
+ arguments:
+ filter: {}
+ expectEvents:
+ - client: *client
+ eventType: cmap
+ events:
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - client: *client
+ events:
+ - commandStartedEvent:
+ command: { ping: 1 }
+ databaseName: *databaseName
+ - commandFailedEvent:
+ commandName: ping
+ - commandStartedEvent:
+ commandName: delete
+ - commandSucceededEvent:
+ commandName: delete
+
+ - description: "collection.deleteOne succeeds after retryable handshake server error (ShutdownInProgress)"
+ operations:
+ - name: failPoint
+ object: testRunner
+ arguments:
+ client: *client
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 2 }
+ data:
+ failCommands: [ping, saslContinue]
+ closeConnection: true
+ - name: runCommand
+ object: *database
+ arguments: { commandName: ping, command: { ping: 1 } }
+ expectError: { isError: true }
+ - name: deleteOne
+ object: *collection
+ arguments:
+ filter: {}
+ expectEvents:
+ - client: *client
+ eventType: cmap
+ events:
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - client: *client
+ events:
+ - commandStartedEvent:
+ command: { ping: 1 }
+ databaseName: *databaseName
+ - commandFailedEvent:
+ commandName: ping
+ - commandStartedEvent:
+ commandName: delete
+ - commandSucceededEvent:
+ commandName: delete
+
+ - description: "collection.replaceOne succeeds after retryable handshake network error"
+ operations:
+ - name: failPoint
+ object: testRunner
+ arguments:
+ client: *client
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 2 }
+ data:
+ failCommands: [ping, saslContinue]
+ closeConnection: true
+ - name: runCommand
+ object: *database
+ arguments: { commandName: ping, command: { ping: 1 } }
+ expectError: { isError: true }
+ - name: replaceOne
+ object: *collection
+ arguments:
+ filter: {}
+ replacement: { x: 22 }
+ expectEvents:
+ - client: *client
+ eventType: cmap
+ events:
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - client: *client
+ events:
+ - commandStartedEvent:
+ command: { ping: 1 }
+ databaseName: *databaseName
+ - commandFailedEvent:
+ commandName: ping
+ - commandStartedEvent:
+ commandName: update
+ - commandSucceededEvent:
+ commandName: update
+
+ - description: "collection.replaceOne succeeds after retryable handshake server error (ShutdownInProgress)"
+ operations:
+ - name: failPoint
+ object: testRunner
+ arguments:
+ client: *client
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 2 }
+ data:
+ failCommands: [ping, saslContinue]
+ closeConnection: true
+ - name: runCommand
+ object: *database
+ arguments: { commandName: ping, command: { ping: 1 } }
+ expectError: { isError: true }
+ - name: replaceOne
+ object: *collection
+ arguments:
+ filter: {}
+ replacement: { x: 22 }
+ expectEvents:
+ - client: *client
+ eventType: cmap
+ events:
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - client: *client
+ events:
+ - commandStartedEvent:
+ command: { ping: 1 }
+ databaseName: *databaseName
+ - commandFailedEvent:
+ commandName: ping
+ - commandStartedEvent:
+ commandName: update
+ - commandSucceededEvent:
+ commandName: update
+
+ - description: "collection.updateOne succeeds after retryable handshake network error"
+ operations:
+ - name: failPoint
+ object: testRunner
+ arguments:
+ client: *client
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 2 }
+ data:
+ failCommands: [ping, saslContinue]
+ closeConnection: true
+ - name: runCommand
+ object: *database
+ arguments: { commandName: ping, command: { ping: 1 } }
+ expectError: { isError: true }
+ - name: updateOne
+ object: *collection
+ arguments:
+ filter: {}
+ update: { $set: { x: 22 } }
+ expectEvents:
+ - client: *client
+ eventType: cmap
+ events:
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - client: *client
+ events:
+ - commandStartedEvent:
+ command: { ping: 1 }
+ databaseName: *databaseName
+ - commandFailedEvent:
+ commandName: ping
+ - commandStartedEvent:
+ commandName: update
+ - commandSucceededEvent:
+ commandName: update
+
+ - description: "collection.updateOne succeeds after retryable handshake server error (ShutdownInProgress)"
+ operations:
+ - name: failPoint
+ object: testRunner
+ arguments:
+ client: *client
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 2 }
+ data:
+ failCommands: [ping, saslContinue]
+ closeConnection: true
+ - name: runCommand
+ object: *database
+ arguments: { commandName: ping, command: { ping: 1 } }
+ expectError: { isError: true }
+ - name: updateOne
+ object: *collection
+ arguments:
+ filter: {}
+ update: { $set: { x: 22 } }
+ expectEvents:
+ - client: *client
+ eventType: cmap
+ events:
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - client: *client
+ events:
+ - commandStartedEvent:
+ command: { ping: 1 }
+ databaseName: *databaseName
+ - commandFailedEvent:
+ commandName: ping
+ - commandStartedEvent:
+ commandName: update
+ - commandSucceededEvent:
+ commandName: update
+
+ - description: "collection.findOneAndDelete succeeds after retryable handshake network error"
+ operations:
+ - name: failPoint
+ object: testRunner
+ arguments:
+ client: *client
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 2 }
+ data:
+ failCommands: [ping, saslContinue]
+ closeConnection: true
+ - name: runCommand
+ object: *database
+ arguments: { commandName: ping, command: { ping: 1 } }
+ expectError: { isError: true }
+ - name: findOneAndDelete
+ object: *collection
+ arguments:
+ filter: {}
+ expectEvents:
+ - client: *client
+ eventType: cmap
+ events:
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - client: *client
+ events:
+ - commandStartedEvent:
+ command: { ping: 1 }
+ databaseName: *databaseName
+ - commandFailedEvent:
+ commandName: ping
+ - commandStartedEvent:
+ commandName: findAndModify
+ - commandSucceededEvent:
+ commandName: findAndModify
+
+ - description: "collection.findOneAndDelete succeeds after retryable handshake server error (ShutdownInProgress)"
+ operations:
+ - name: failPoint
+ object: testRunner
+ arguments:
+ client: *client
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 2 }
+ data:
+ failCommands: [ping, saslContinue]
+ closeConnection: true
+ - name: runCommand
+ object: *database
+ arguments: { commandName: ping, command: { ping: 1 } }
+ expectError: { isError: true }
+ - name: findOneAndDelete
+ object: *collection
+ arguments:
+ filter: {}
+ expectEvents:
+ - client: *client
+ eventType: cmap
+ events:
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - client: *client
+ events:
+ - commandStartedEvent:
+ command: { ping: 1 }
+ databaseName: *databaseName
+ - commandFailedEvent:
+ commandName: ping
+ - commandStartedEvent:
+ commandName: findAndModify
+ - commandSucceededEvent:
+ commandName: findAndModify
+
+ - description: "collection.findOneAndReplace succeeds after retryable handshake network error"
+ operations:
+ - name: failPoint
+ object: testRunner
+ arguments:
+ client: *client
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 2 }
+ data:
+ failCommands: [ping, saslContinue]
+ closeConnection: true
+ - name: runCommand
+ object: *database
+ arguments: { commandName: ping, command: { ping: 1 } }
+ expectError: { isError: true }
+ - name: findOneAndReplace
+ object: *collection
+ arguments:
+ filter: {}
+ replacement: { x: 22 }
+ expectEvents:
+ - client: *client
+ eventType: cmap
+ events:
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - client: *client
+ events:
+ - commandStartedEvent:
+ command: { ping: 1 }
+ databaseName: *databaseName
+ - commandFailedEvent:
+ commandName: ping
+ - commandStartedEvent:
+ commandName: findAndModify
+ - commandSucceededEvent:
+ commandName: findAndModify
+
+ - description: "collection.findOneAndReplace succeeds after retryable handshake server error (ShutdownInProgress)"
+ operations:
+ - name: failPoint
+ object: testRunner
+ arguments:
+ client: *client
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 2 }
+ data:
+ failCommands: [ping, saslContinue]
+ closeConnection: true
+ - name: runCommand
+ object: *database
+ arguments: { commandName: ping, command: { ping: 1 } }
+ expectError: { isError: true }
+ - name: findOneAndReplace
+ object: *collection
+ arguments:
+ filter: {}
+ replacement: { x: 22 }
+ expectEvents:
+ - client: *client
+ eventType: cmap
+ events:
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - client: *client
+ events:
+ - commandStartedEvent:
+ command: { ping: 1 }
+ databaseName: *databaseName
+ - commandFailedEvent:
+ commandName: ping
+ - commandStartedEvent:
+ commandName: findAndModify
+ - commandSucceededEvent:
+ commandName: findAndModify
+
+ - description: "collection.findOneAndUpdate succeeds after retryable handshake network error"
+ operations:
+ - name: failPoint
+ object: testRunner
+ arguments:
+ client: *client
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 2 }
+ data:
+ failCommands: [ping, saslContinue]
+ closeConnection: true
+ - name: runCommand
+ object: *database
+ arguments: { commandName: ping, command: { ping: 1 } }
+ expectError: { isError: true }
+ - name: findOneAndUpdate
+ object: *collection
+ arguments:
+ filter: {}
+ update: { $set: { x: 22 } }
+ expectEvents:
+ - client: *client
+ eventType: cmap
+ events:
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - client: *client
+ events:
+ - commandStartedEvent:
+ command: { ping: 1 }
+ databaseName: *databaseName
+ - commandFailedEvent:
+ commandName: ping
+ - commandStartedEvent:
+ commandName: findAndModify
+ - commandSucceededEvent:
+ commandName: findAndModify
+
+ - description: "collection.findOneAndUpdate succeeds after retryable handshake server error (ShutdownInProgress)"
+ operations:
+ - name: failPoint
+ object: testRunner
+ arguments:
+ client: *client
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 2 }
+ data:
+ failCommands: [ping, saslContinue]
+ closeConnection: true
+ - name: runCommand
+ object: *database
+ arguments: { commandName: ping, command: { ping: 1 } }
+ expectError: { isError: true }
+ - name: findOneAndUpdate
+ object: *collection
+ arguments:
+ filter: {}
+ update: { $set: { x: 22 } }
+ expectEvents:
+ - client: *client
+ eventType: cmap
+ events:
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - client: *client
+ events:
+ - commandStartedEvent:
+ command: { ping: 1 }
+ databaseName: *databaseName
+ - commandFailedEvent:
+ commandName: ping
+ - commandStartedEvent:
+ commandName: findAndModify
+ - commandSucceededEvent:
+ commandName: findAndModify
+
+ - description: "collection.bulkWrite succeeds after retryable handshake network error"
+ operations:
+ - name: failPoint
+ object: testRunner
+ arguments:
+ client: *client
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 2 }
+ data:
+ failCommands: [ping, saslContinue]
+ closeConnection: true
+ - name: runCommand
+ object: *database
+ arguments: { commandName: ping, command: { ping: 1 } }
+ expectError: { isError: true }
+ - name: bulkWrite
+ object: *collection
+ arguments:
+ requests:
+ - insertOne:
+ document: { _id: 2, x: 22 }
+ expectEvents:
+ - client: *client
+ eventType: cmap
+ events:
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - client: *client
+ events:
+ - commandStartedEvent:
+ command: { ping: 1 }
+ databaseName: *databaseName
+ - commandFailedEvent:
+ commandName: ping
+ - commandStartedEvent:
+ commandName: insert
+ - commandSucceededEvent:
+ commandName: insert
+
+ - description: "collection.bulkWrite succeeds after retryable handshake server error (ShutdownInProgress)"
+ operations:
+ - name: failPoint
+ object: testRunner
+ arguments:
+ client: *client
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 2 }
+ data:
+ failCommands: [ping, saslContinue]
+ closeConnection: true
+ - name: runCommand
+ object: *database
+ arguments: { commandName: ping, command: { ping: 1 } }
+ expectError: { isError: true }
+ - name: bulkWrite
+ object: *collection
+ arguments:
+ requests:
+ - insertOne:
+ document: { _id: 2, x: 22 }
+ expectEvents:
+ - client: *client
+ eventType: cmap
+ events:
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - { connectionCheckOutStartedEvent: {} }
+ - client: *client
+ events:
+ - commandStartedEvent:
+ command: { ping: 1 }
+ databaseName: *databaseName
+ - commandFailedEvent:
+ commandName: ping
+ - commandStartedEvent:
+ commandName: insert
+ - commandSucceededEvent:
+ commandName: insert
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/unified/insertOne-serverErrors.json b/specifications/retryable-writes/tests/unified/insertOne-serverErrors.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/unified/insertOne-serverErrors.json
rename to specifications/retryable-writes/tests/unified/insertOne-serverErrors.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/unified/insertOne-serverErrors.yml b/specifications/retryable-writes/tests/unified/insertOne-serverErrors.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/retryable-writes/tests/unified/insertOne-serverErrors.yml
rename to specifications/retryable-writes/tests/unified/insertOne-serverErrors.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/server-discovery-and-monitoring-tests.rst b/specifications/server-discovery-and-monitoring/server-discovery-and-monitoring-tests.rst
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/server-discovery-and-monitoring-tests.rst
rename to specifications/server-discovery-and-monitoring/server-discovery-and-monitoring-tests.rst
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/README.rst b/specifications/server-discovery-and-monitoring/tests/README.rst
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/README.rst
rename to specifications/server-discovery-and-monitoring/tests/README.rst
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/error_handling_handshake.json b/specifications/server-discovery-and-monitoring/tests/errors/error_handling_handshake.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/error_handling_handshake.json
rename to specifications/server-discovery-and-monitoring/tests/errors/error_handling_handshake.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/error_handling_handshake.yml b/specifications/server-discovery-and-monitoring/tests/errors/error_handling_handshake.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/error_handling_handshake.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/error_handling_handshake.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-network-error.json b/specifications/server-discovery-and-monitoring/tests/errors/non-stale-network-error.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-network-error.json
rename to specifications/server-discovery-and-monitoring/tests/errors/non-stale-network-error.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-network-error.yml b/specifications/server-discovery-and-monitoring/tests/errors/non-stale-network-error.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-network-error.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/non-stale-network-error.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-network-timeout-error.json b/specifications/server-discovery-and-monitoring/tests/errors/non-stale-network-timeout-error.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-network-timeout-error.json
rename to specifications/server-discovery-and-monitoring/tests/errors/non-stale-network-timeout-error.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-network-timeout-error.yml b/specifications/server-discovery-and-monitoring/tests/errors/non-stale-network-timeout-error.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-network-timeout-error.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/non-stale-network-timeout-error.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-InterruptedAtShutdown.json b/specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-InterruptedAtShutdown.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-InterruptedAtShutdown.json
rename to specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-InterruptedAtShutdown.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-InterruptedAtShutdown.yml b/specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-InterruptedAtShutdown.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-InterruptedAtShutdown.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-InterruptedAtShutdown.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-InterruptedDueToReplStateChange.json b/specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-InterruptedDueToReplStateChange.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-InterruptedDueToReplStateChange.json
rename to specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-InterruptedDueToReplStateChange.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-InterruptedDueToReplStateChange.yml b/specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-InterruptedDueToReplStateChange.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-InterruptedDueToReplStateChange.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-InterruptedDueToReplStateChange.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-LegacyNotPrimary.json b/specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-LegacyNotPrimary.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-LegacyNotPrimary.json
rename to specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-LegacyNotPrimary.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-LegacyNotPrimary.yml b/specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-LegacyNotPrimary.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-LegacyNotPrimary.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-LegacyNotPrimary.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-NotPrimaryNoSecondaryOk.json b/specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-NotPrimaryNoSecondaryOk.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-NotPrimaryNoSecondaryOk.json
rename to specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-NotPrimaryNoSecondaryOk.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-NotPrimaryNoSecondaryOk.yml b/specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-NotPrimaryNoSecondaryOk.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-NotPrimaryNoSecondaryOk.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-NotPrimaryNoSecondaryOk.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-NotPrimaryOrSecondary.json b/specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-NotPrimaryOrSecondary.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-NotPrimaryOrSecondary.json
rename to specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-NotPrimaryOrSecondary.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-NotPrimaryOrSecondary.yml b/specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-NotPrimaryOrSecondary.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-NotPrimaryOrSecondary.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-NotPrimaryOrSecondary.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-NotWritablePrimary.json b/specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-NotWritablePrimary.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-NotWritablePrimary.json
rename to specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-NotWritablePrimary.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-NotWritablePrimary.yml b/specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-NotWritablePrimary.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-NotWritablePrimary.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-NotWritablePrimary.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-PrimarySteppedDown.json b/specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-PrimarySteppedDown.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-PrimarySteppedDown.json
rename to specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-PrimarySteppedDown.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-PrimarySteppedDown.yml b/specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-PrimarySteppedDown.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-PrimarySteppedDown.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-PrimarySteppedDown.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-ShutdownInProgress.json b/specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-ShutdownInProgress.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-ShutdownInProgress.json
rename to specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-ShutdownInProgress.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-ShutdownInProgress.yml b/specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-ShutdownInProgress.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-ShutdownInProgress.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-greater-ShutdownInProgress.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-InterruptedAtShutdown.json b/specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-InterruptedAtShutdown.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-InterruptedAtShutdown.json
rename to specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-InterruptedAtShutdown.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-InterruptedAtShutdown.yml b/specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-InterruptedAtShutdown.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-InterruptedAtShutdown.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-InterruptedAtShutdown.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-InterruptedDueToReplStateChange.json b/specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-InterruptedDueToReplStateChange.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-InterruptedDueToReplStateChange.json
rename to specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-InterruptedDueToReplStateChange.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-InterruptedDueToReplStateChange.yml b/specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-InterruptedDueToReplStateChange.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-InterruptedDueToReplStateChange.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-InterruptedDueToReplStateChange.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-LegacyNotPrimary.json b/specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-LegacyNotPrimary.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-LegacyNotPrimary.json
rename to specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-LegacyNotPrimary.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-LegacyNotPrimary.yml b/specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-LegacyNotPrimary.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-LegacyNotPrimary.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-LegacyNotPrimary.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-NotPrimaryNoSecondaryOk.json b/specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-NotPrimaryNoSecondaryOk.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-NotPrimaryNoSecondaryOk.json
rename to specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-NotPrimaryNoSecondaryOk.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-NotPrimaryNoSecondaryOk.yml b/specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-NotPrimaryNoSecondaryOk.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-NotPrimaryNoSecondaryOk.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-NotPrimaryNoSecondaryOk.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-NotPrimaryOrSecondary.json b/specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-NotPrimaryOrSecondary.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-NotPrimaryOrSecondary.json
rename to specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-NotPrimaryOrSecondary.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-NotPrimaryOrSecondary.yml b/specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-NotPrimaryOrSecondary.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-NotPrimaryOrSecondary.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-NotPrimaryOrSecondary.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-NotWritablePrimary.json b/specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-NotWritablePrimary.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-NotWritablePrimary.json
rename to specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-NotWritablePrimary.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-NotWritablePrimary.yml b/specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-NotWritablePrimary.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-NotWritablePrimary.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-NotWritablePrimary.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-PrimarySteppedDown.json b/specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-PrimarySteppedDown.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-PrimarySteppedDown.json
rename to specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-PrimarySteppedDown.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-PrimarySteppedDown.yml b/specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-PrimarySteppedDown.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-PrimarySteppedDown.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-PrimarySteppedDown.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-ShutdownInProgress.json b/specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-ShutdownInProgress.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-ShutdownInProgress.json
rename to specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-ShutdownInProgress.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-ShutdownInProgress.yml b/specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-ShutdownInProgress.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-ShutdownInProgress.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-missing-ShutdownInProgress.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-InterruptedAtShutdown.json b/specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-InterruptedAtShutdown.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-InterruptedAtShutdown.json
rename to specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-InterruptedAtShutdown.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-InterruptedAtShutdown.yml b/specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-InterruptedAtShutdown.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-InterruptedAtShutdown.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-InterruptedAtShutdown.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-InterruptedDueToReplStateChange.json b/specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-InterruptedDueToReplStateChange.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-InterruptedDueToReplStateChange.json
rename to specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-InterruptedDueToReplStateChange.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-InterruptedDueToReplStateChange.yml b/specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-InterruptedDueToReplStateChange.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-InterruptedDueToReplStateChange.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-InterruptedDueToReplStateChange.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-LegacyNotPrimary.json b/specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-LegacyNotPrimary.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-LegacyNotPrimary.json
rename to specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-LegacyNotPrimary.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-LegacyNotPrimary.yml b/specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-LegacyNotPrimary.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-LegacyNotPrimary.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-LegacyNotPrimary.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-NotPrimaryNoSecondaryOk.json b/specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-NotPrimaryNoSecondaryOk.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-NotPrimaryNoSecondaryOk.json
rename to specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-NotPrimaryNoSecondaryOk.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-NotPrimaryNoSecondaryOk.yml b/specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-NotPrimaryNoSecondaryOk.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-NotPrimaryNoSecondaryOk.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-NotPrimaryNoSecondaryOk.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-NotPrimaryOrSecondary.json b/specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-NotPrimaryOrSecondary.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-NotPrimaryOrSecondary.json
rename to specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-NotPrimaryOrSecondary.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-NotPrimaryOrSecondary.yml b/specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-NotPrimaryOrSecondary.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-NotPrimaryOrSecondary.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-NotPrimaryOrSecondary.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-NotWritablePrimary.json b/specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-NotWritablePrimary.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-NotWritablePrimary.json
rename to specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-NotWritablePrimary.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-NotWritablePrimary.yml b/specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-NotWritablePrimary.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-NotWritablePrimary.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-NotWritablePrimary.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-PrimarySteppedDown.json b/specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-PrimarySteppedDown.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-PrimarySteppedDown.json
rename to specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-PrimarySteppedDown.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-PrimarySteppedDown.yml b/specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-PrimarySteppedDown.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-PrimarySteppedDown.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-PrimarySteppedDown.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-ShutdownInProgress.json b/specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-ShutdownInProgress.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-ShutdownInProgress.json
rename to specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-ShutdownInProgress.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-ShutdownInProgress.yml b/specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-ShutdownInProgress.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-ShutdownInProgress.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion-proccessId-changed-ShutdownInProgress.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion.yml.template b/specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion.yml.template
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion.yml.template
rename to specifications/server-discovery-and-monitoring/tests/errors/non-stale-topologyVersion.yml.template
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/post-42-InterruptedAtShutdown.json b/specifications/server-discovery-and-monitoring/tests/errors/post-42-InterruptedAtShutdown.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/post-42-InterruptedAtShutdown.json
rename to specifications/server-discovery-and-monitoring/tests/errors/post-42-InterruptedAtShutdown.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/post-42-InterruptedAtShutdown.yml b/specifications/server-discovery-and-monitoring/tests/errors/post-42-InterruptedAtShutdown.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/post-42-InterruptedAtShutdown.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/post-42-InterruptedAtShutdown.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/post-42-InterruptedDueToReplStateChange.json b/specifications/server-discovery-and-monitoring/tests/errors/post-42-InterruptedDueToReplStateChange.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/post-42-InterruptedDueToReplStateChange.json
rename to specifications/server-discovery-and-monitoring/tests/errors/post-42-InterruptedDueToReplStateChange.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/post-42-InterruptedDueToReplStateChange.yml b/specifications/server-discovery-and-monitoring/tests/errors/post-42-InterruptedDueToReplStateChange.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/post-42-InterruptedDueToReplStateChange.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/post-42-InterruptedDueToReplStateChange.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/post-42-LegacyNotPrimary.json b/specifications/server-discovery-and-monitoring/tests/errors/post-42-LegacyNotPrimary.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/post-42-LegacyNotPrimary.json
rename to specifications/server-discovery-and-monitoring/tests/errors/post-42-LegacyNotPrimary.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/post-42-LegacyNotPrimary.yml b/specifications/server-discovery-and-monitoring/tests/errors/post-42-LegacyNotPrimary.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/post-42-LegacyNotPrimary.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/post-42-LegacyNotPrimary.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/post-42-NotPrimaryNoSecondaryOk.json b/specifications/server-discovery-and-monitoring/tests/errors/post-42-NotPrimaryNoSecondaryOk.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/post-42-NotPrimaryNoSecondaryOk.json
rename to specifications/server-discovery-and-monitoring/tests/errors/post-42-NotPrimaryNoSecondaryOk.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/post-42-NotPrimaryNoSecondaryOk.yml b/specifications/server-discovery-and-monitoring/tests/errors/post-42-NotPrimaryNoSecondaryOk.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/post-42-NotPrimaryNoSecondaryOk.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/post-42-NotPrimaryNoSecondaryOk.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/post-42-NotPrimaryOrSecondary.json b/specifications/server-discovery-and-monitoring/tests/errors/post-42-NotPrimaryOrSecondary.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/post-42-NotPrimaryOrSecondary.json
rename to specifications/server-discovery-and-monitoring/tests/errors/post-42-NotPrimaryOrSecondary.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/post-42-NotPrimaryOrSecondary.yml b/specifications/server-discovery-and-monitoring/tests/errors/post-42-NotPrimaryOrSecondary.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/post-42-NotPrimaryOrSecondary.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/post-42-NotPrimaryOrSecondary.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/post-42-NotWritablePrimary.json b/specifications/server-discovery-and-monitoring/tests/errors/post-42-NotWritablePrimary.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/post-42-NotWritablePrimary.json
rename to specifications/server-discovery-and-monitoring/tests/errors/post-42-NotWritablePrimary.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/post-42-NotWritablePrimary.yml b/specifications/server-discovery-and-monitoring/tests/errors/post-42-NotWritablePrimary.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/post-42-NotWritablePrimary.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/post-42-NotWritablePrimary.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/post-42-PrimarySteppedDown.json b/specifications/server-discovery-and-monitoring/tests/errors/post-42-PrimarySteppedDown.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/post-42-PrimarySteppedDown.json
rename to specifications/server-discovery-and-monitoring/tests/errors/post-42-PrimarySteppedDown.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/post-42-PrimarySteppedDown.yml b/specifications/server-discovery-and-monitoring/tests/errors/post-42-PrimarySteppedDown.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/post-42-PrimarySteppedDown.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/post-42-PrimarySteppedDown.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/post-42-ShutdownInProgress.json b/specifications/server-discovery-and-monitoring/tests/errors/post-42-ShutdownInProgress.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/post-42-ShutdownInProgress.json
rename to specifications/server-discovery-and-monitoring/tests/errors/post-42-ShutdownInProgress.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/post-42-ShutdownInProgress.yml b/specifications/server-discovery-and-monitoring/tests/errors/post-42-ShutdownInProgress.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/post-42-ShutdownInProgress.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/post-42-ShutdownInProgress.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/post-42.yml.template b/specifications/server-discovery-and-monitoring/tests/errors/post-42.yml.template
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/post-42.yml.template
rename to specifications/server-discovery-and-monitoring/tests/errors/post-42.yml.template
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/pre-42-InterruptedAtShutdown.json b/specifications/server-discovery-and-monitoring/tests/errors/pre-42-InterruptedAtShutdown.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/pre-42-InterruptedAtShutdown.json
rename to specifications/server-discovery-and-monitoring/tests/errors/pre-42-InterruptedAtShutdown.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/pre-42-InterruptedAtShutdown.yml b/specifications/server-discovery-and-monitoring/tests/errors/pre-42-InterruptedAtShutdown.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/pre-42-InterruptedAtShutdown.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/pre-42-InterruptedAtShutdown.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/pre-42-InterruptedDueToReplStateChange.json b/specifications/server-discovery-and-monitoring/tests/errors/pre-42-InterruptedDueToReplStateChange.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/pre-42-InterruptedDueToReplStateChange.json
rename to specifications/server-discovery-and-monitoring/tests/errors/pre-42-InterruptedDueToReplStateChange.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/pre-42-InterruptedDueToReplStateChange.yml b/specifications/server-discovery-and-monitoring/tests/errors/pre-42-InterruptedDueToReplStateChange.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/pre-42-InterruptedDueToReplStateChange.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/pre-42-InterruptedDueToReplStateChange.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/pre-42-LegacyNotPrimary.json b/specifications/server-discovery-and-monitoring/tests/errors/pre-42-LegacyNotPrimary.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/pre-42-LegacyNotPrimary.json
rename to specifications/server-discovery-and-monitoring/tests/errors/pre-42-LegacyNotPrimary.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/pre-42-LegacyNotPrimary.yml b/specifications/server-discovery-and-monitoring/tests/errors/pre-42-LegacyNotPrimary.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/pre-42-LegacyNotPrimary.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/pre-42-LegacyNotPrimary.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/pre-42-NotPrimaryNoSecondaryOk.json b/specifications/server-discovery-and-monitoring/tests/errors/pre-42-NotPrimaryNoSecondaryOk.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/pre-42-NotPrimaryNoSecondaryOk.json
rename to specifications/server-discovery-and-monitoring/tests/errors/pre-42-NotPrimaryNoSecondaryOk.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/pre-42-NotPrimaryNoSecondaryOk.yml b/specifications/server-discovery-and-monitoring/tests/errors/pre-42-NotPrimaryNoSecondaryOk.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/pre-42-NotPrimaryNoSecondaryOk.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/pre-42-NotPrimaryNoSecondaryOk.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/pre-42-NotPrimaryOrSecondary.json b/specifications/server-discovery-and-monitoring/tests/errors/pre-42-NotPrimaryOrSecondary.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/pre-42-NotPrimaryOrSecondary.json
rename to specifications/server-discovery-and-monitoring/tests/errors/pre-42-NotPrimaryOrSecondary.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/pre-42-NotPrimaryOrSecondary.yml b/specifications/server-discovery-and-monitoring/tests/errors/pre-42-NotPrimaryOrSecondary.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/pre-42-NotPrimaryOrSecondary.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/pre-42-NotPrimaryOrSecondary.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/pre-42-NotWritablePrimary.json b/specifications/server-discovery-and-monitoring/tests/errors/pre-42-NotWritablePrimary.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/pre-42-NotWritablePrimary.json
rename to specifications/server-discovery-and-monitoring/tests/errors/pre-42-NotWritablePrimary.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/pre-42-NotWritablePrimary.yml b/specifications/server-discovery-and-monitoring/tests/errors/pre-42-NotWritablePrimary.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/pre-42-NotWritablePrimary.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/pre-42-NotWritablePrimary.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/pre-42-PrimarySteppedDown.json b/specifications/server-discovery-and-monitoring/tests/errors/pre-42-PrimarySteppedDown.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/pre-42-PrimarySteppedDown.json
rename to specifications/server-discovery-and-monitoring/tests/errors/pre-42-PrimarySteppedDown.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/pre-42-PrimarySteppedDown.yml b/specifications/server-discovery-and-monitoring/tests/errors/pre-42-PrimarySteppedDown.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/pre-42-PrimarySteppedDown.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/pre-42-PrimarySteppedDown.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/pre-42-ShutdownInProgress.json b/specifications/server-discovery-and-monitoring/tests/errors/pre-42-ShutdownInProgress.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/pre-42-ShutdownInProgress.json
rename to specifications/server-discovery-and-monitoring/tests/errors/pre-42-ShutdownInProgress.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/pre-42-ShutdownInProgress.yml b/specifications/server-discovery-and-monitoring/tests/errors/pre-42-ShutdownInProgress.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/pre-42-ShutdownInProgress.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/pre-42-ShutdownInProgress.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/pre-42.yml.template b/specifications/server-discovery-and-monitoring/tests/errors/pre-42.yml.template
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/pre-42.yml.template
rename to specifications/server-discovery-and-monitoring/tests/errors/pre-42.yml.template
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/prefer-error-code.json b/specifications/server-discovery-and-monitoring/tests/errors/prefer-error-code.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/prefer-error-code.json
rename to specifications/server-discovery-and-monitoring/tests/errors/prefer-error-code.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/prefer-error-code.yml b/specifications/server-discovery-and-monitoring/tests/errors/prefer-error-code.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/prefer-error-code.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/prefer-error-code.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-InterruptedAtShutdown.json b/specifications/server-discovery-and-monitoring/tests/errors/stale-generation-InterruptedAtShutdown.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-InterruptedAtShutdown.json
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-generation-InterruptedAtShutdown.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-InterruptedAtShutdown.yml b/specifications/server-discovery-and-monitoring/tests/errors/stale-generation-InterruptedAtShutdown.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-InterruptedAtShutdown.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-generation-InterruptedAtShutdown.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-InterruptedDueToReplStateChange.json b/specifications/server-discovery-and-monitoring/tests/errors/stale-generation-InterruptedDueToReplStateChange.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-InterruptedDueToReplStateChange.json
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-generation-InterruptedDueToReplStateChange.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-InterruptedDueToReplStateChange.yml b/specifications/server-discovery-and-monitoring/tests/errors/stale-generation-InterruptedDueToReplStateChange.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-InterruptedDueToReplStateChange.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-generation-InterruptedDueToReplStateChange.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-NotPrimaryNoSecondaryOk.json b/specifications/server-discovery-and-monitoring/tests/errors/stale-generation-NotPrimaryNoSecondaryOk.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-NotPrimaryNoSecondaryOk.json
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-generation-NotPrimaryNoSecondaryOk.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-NotPrimaryNoSecondaryOk.yml b/specifications/server-discovery-and-monitoring/tests/errors/stale-generation-NotPrimaryNoSecondaryOk.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-NotPrimaryNoSecondaryOk.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-generation-NotPrimaryNoSecondaryOk.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-NotPrimaryOrSecondary.json b/specifications/server-discovery-and-monitoring/tests/errors/stale-generation-NotPrimaryOrSecondary.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-NotPrimaryOrSecondary.json
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-generation-NotPrimaryOrSecondary.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-NotPrimaryOrSecondary.yml b/specifications/server-discovery-and-monitoring/tests/errors/stale-generation-NotPrimaryOrSecondary.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-NotPrimaryOrSecondary.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-generation-NotPrimaryOrSecondary.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-NotWritablePrimary.json b/specifications/server-discovery-and-monitoring/tests/errors/stale-generation-NotWritablePrimary.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-NotWritablePrimary.json
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-generation-NotWritablePrimary.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-NotWritablePrimary.yml b/specifications/server-discovery-and-monitoring/tests/errors/stale-generation-NotWritablePrimary.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-NotWritablePrimary.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-generation-NotWritablePrimary.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-PrimarySteppedDown.json b/specifications/server-discovery-and-monitoring/tests/errors/stale-generation-PrimarySteppedDown.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-PrimarySteppedDown.json
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-generation-PrimarySteppedDown.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-PrimarySteppedDown.yml b/specifications/server-discovery-and-monitoring/tests/errors/stale-generation-PrimarySteppedDown.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-PrimarySteppedDown.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-generation-PrimarySteppedDown.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-ShutdownInProgress.json b/specifications/server-discovery-and-monitoring/tests/errors/stale-generation-ShutdownInProgress.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-ShutdownInProgress.json
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-generation-ShutdownInProgress.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-ShutdownInProgress.yml b/specifications/server-discovery-and-monitoring/tests/errors/stale-generation-ShutdownInProgress.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-ShutdownInProgress.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-generation-ShutdownInProgress.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-InterruptedAtShutdown.json b/specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-InterruptedAtShutdown.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-InterruptedAtShutdown.json
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-InterruptedAtShutdown.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-InterruptedAtShutdown.yml b/specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-InterruptedAtShutdown.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-InterruptedAtShutdown.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-InterruptedAtShutdown.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-InterruptedDueToReplStateChange.json b/specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-InterruptedDueToReplStateChange.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-InterruptedDueToReplStateChange.json
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-InterruptedDueToReplStateChange.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-InterruptedDueToReplStateChange.yml b/specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-InterruptedDueToReplStateChange.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-InterruptedDueToReplStateChange.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-InterruptedDueToReplStateChange.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-LegacyNotPrimary.json b/specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-LegacyNotPrimary.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-LegacyNotPrimary.json
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-LegacyNotPrimary.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-LegacyNotPrimary.yml b/specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-LegacyNotPrimary.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-LegacyNotPrimary.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-LegacyNotPrimary.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-NotPrimaryNoSecondaryOk.json b/specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-NotPrimaryNoSecondaryOk.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-NotPrimaryNoSecondaryOk.json
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-NotPrimaryNoSecondaryOk.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-NotPrimaryNoSecondaryOk.yml b/specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-NotPrimaryNoSecondaryOk.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-NotPrimaryNoSecondaryOk.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-NotPrimaryNoSecondaryOk.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-NotPrimaryOrSecondary.json b/specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-NotPrimaryOrSecondary.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-NotPrimaryOrSecondary.json
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-NotPrimaryOrSecondary.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-NotPrimaryOrSecondary.yml b/specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-NotPrimaryOrSecondary.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-NotPrimaryOrSecondary.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-NotPrimaryOrSecondary.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-NotWritablePrimary.json b/specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-NotWritablePrimary.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-NotWritablePrimary.json
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-NotWritablePrimary.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-NotWritablePrimary.yml b/specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-NotWritablePrimary.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-NotWritablePrimary.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-NotWritablePrimary.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-PrimarySteppedDown.json b/specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-PrimarySteppedDown.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-PrimarySteppedDown.json
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-PrimarySteppedDown.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-PrimarySteppedDown.yml b/specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-PrimarySteppedDown.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-PrimarySteppedDown.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-PrimarySteppedDown.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-ShutdownInProgress.json b/specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-ShutdownInProgress.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-ShutdownInProgress.json
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-ShutdownInProgress.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-ShutdownInProgress.yml b/specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-ShutdownInProgress.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-ShutdownInProgress.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-ShutdownInProgress.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-network.json b/specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-network.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-network.json
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-network.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-network.yml b/specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-network.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-network.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-network.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-timeout.json b/specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-timeout.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-timeout.json
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-timeout.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-timeout.yml b/specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-timeout.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-timeout.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-generation-afterHandshakeCompletes-timeout.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-InterruptedAtShutdown.json b/specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-InterruptedAtShutdown.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-InterruptedAtShutdown.json
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-InterruptedAtShutdown.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-InterruptedAtShutdown.yml b/specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-InterruptedAtShutdown.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-InterruptedAtShutdown.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-InterruptedAtShutdown.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-InterruptedDueToReplStateChange.json b/specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-InterruptedDueToReplStateChange.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-InterruptedDueToReplStateChange.json
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-InterruptedDueToReplStateChange.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-InterruptedDueToReplStateChange.yml b/specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-InterruptedDueToReplStateChange.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-InterruptedDueToReplStateChange.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-InterruptedDueToReplStateChange.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-LegacyNotPrimary.json b/specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-LegacyNotPrimary.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-LegacyNotPrimary.json
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-LegacyNotPrimary.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-LegacyNotPrimary.yml b/specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-LegacyNotPrimary.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-LegacyNotPrimary.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-LegacyNotPrimary.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-NotPrimaryNoSecondaryOk.json b/specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-NotPrimaryNoSecondaryOk.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-NotPrimaryNoSecondaryOk.json
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-NotPrimaryNoSecondaryOk.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-NotPrimaryNoSecondaryOk.yml b/specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-NotPrimaryNoSecondaryOk.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-NotPrimaryNoSecondaryOk.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-NotPrimaryNoSecondaryOk.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-NotPrimaryOrSecondary.json b/specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-NotPrimaryOrSecondary.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-NotPrimaryOrSecondary.json
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-NotPrimaryOrSecondary.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-NotPrimaryOrSecondary.yml b/specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-NotPrimaryOrSecondary.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-NotPrimaryOrSecondary.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-NotPrimaryOrSecondary.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-NotWritablePrimary.json b/specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-NotWritablePrimary.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-NotWritablePrimary.json
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-NotWritablePrimary.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-NotWritablePrimary.yml b/specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-NotWritablePrimary.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-NotWritablePrimary.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-NotWritablePrimary.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-PrimarySteppedDown.json b/specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-PrimarySteppedDown.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-PrimarySteppedDown.json
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-PrimarySteppedDown.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-PrimarySteppedDown.yml b/specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-PrimarySteppedDown.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-PrimarySteppedDown.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-PrimarySteppedDown.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-ShutdownInProgress.json b/specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-ShutdownInProgress.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-ShutdownInProgress.json
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-ShutdownInProgress.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-ShutdownInProgress.yml b/specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-ShutdownInProgress.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-ShutdownInProgress.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-ShutdownInProgress.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-network.json b/specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-network.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-network.json
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-network.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-network.yml b/specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-network.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-network.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-network.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-timeout.json b/specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-timeout.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-timeout.json
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-timeout.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-timeout.yml b/specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-timeout.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-timeout.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-generation-beforeHandshakeCompletes-timeout.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation.yml.template b/specifications/server-discovery-and-monitoring/tests/errors/stale-generation.yml.template
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-generation.yml.template
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-generation.yml.template
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-InterruptedAtShutdown.json b/specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-InterruptedAtShutdown.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-InterruptedAtShutdown.json
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-InterruptedAtShutdown.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-InterruptedAtShutdown.yml b/specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-InterruptedAtShutdown.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-InterruptedAtShutdown.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-InterruptedAtShutdown.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-InterruptedDueToReplStateChange.json b/specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-InterruptedDueToReplStateChange.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-InterruptedDueToReplStateChange.json
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-InterruptedDueToReplStateChange.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-InterruptedDueToReplStateChange.yml b/specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-InterruptedDueToReplStateChange.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-InterruptedDueToReplStateChange.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-InterruptedDueToReplStateChange.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-LegacyNotPrimary.json b/specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-LegacyNotPrimary.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-LegacyNotPrimary.json
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-LegacyNotPrimary.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-LegacyNotPrimary.yml b/specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-LegacyNotPrimary.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-LegacyNotPrimary.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-LegacyNotPrimary.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-NotPrimaryNoSecondaryOk.json b/specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-NotPrimaryNoSecondaryOk.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-NotPrimaryNoSecondaryOk.json
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-NotPrimaryNoSecondaryOk.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-NotPrimaryNoSecondaryOk.yml b/specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-NotPrimaryNoSecondaryOk.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-NotPrimaryNoSecondaryOk.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-NotPrimaryNoSecondaryOk.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-NotPrimaryOrSecondary.json b/specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-NotPrimaryOrSecondary.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-NotPrimaryOrSecondary.json
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-NotPrimaryOrSecondary.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-NotPrimaryOrSecondary.yml b/specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-NotPrimaryOrSecondary.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-NotPrimaryOrSecondary.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-NotPrimaryOrSecondary.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-NotWritablePrimary.json b/specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-NotWritablePrimary.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-NotWritablePrimary.json
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-NotWritablePrimary.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-NotWritablePrimary.yml b/specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-NotWritablePrimary.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-NotWritablePrimary.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-NotWritablePrimary.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-PrimarySteppedDown.json b/specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-PrimarySteppedDown.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-PrimarySteppedDown.json
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-PrimarySteppedDown.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-PrimarySteppedDown.yml b/specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-PrimarySteppedDown.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-PrimarySteppedDown.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-PrimarySteppedDown.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-ShutdownInProgress.json b/specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-ShutdownInProgress.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-ShutdownInProgress.json
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-ShutdownInProgress.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-ShutdownInProgress.yml b/specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-ShutdownInProgress.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-ShutdownInProgress.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion-ShutdownInProgress.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion.yml.template b/specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion.yml.template
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion.yml.template
rename to specifications/server-discovery-and-monitoring/tests/errors/stale-topologyVersion.yml.template
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/write_errors_ignored.json b/specifications/server-discovery-and-monitoring/tests/errors/write_errors_ignored.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/write_errors_ignored.json
rename to specifications/server-discovery-and-monitoring/tests/errors/write_errors_ignored.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/write_errors_ignored.yml b/specifications/server-discovery-and-monitoring/tests/errors/write_errors_ignored.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/errors/write_errors_ignored.yml
rename to specifications/server-discovery-and-monitoring/tests/errors/write_errors_ignored.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/auth-error.json b/specifications/server-discovery-and-monitoring/tests/integration/auth-error.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/auth-error.json
rename to specifications/server-discovery-and-monitoring/tests/integration/auth-error.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/auth-error.yml b/specifications/server-discovery-and-monitoring/tests/integration/auth-error.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/auth-error.yml
rename to specifications/server-discovery-and-monitoring/tests/integration/auth-error.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/auth-misc-command-error.json b/specifications/server-discovery-and-monitoring/tests/integration/auth-misc-command-error.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/auth-misc-command-error.json
rename to specifications/server-discovery-and-monitoring/tests/integration/auth-misc-command-error.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/auth-misc-command-error.yml b/specifications/server-discovery-and-monitoring/tests/integration/auth-misc-command-error.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/auth-misc-command-error.yml
rename to specifications/server-discovery-and-monitoring/tests/integration/auth-misc-command-error.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/auth-network-error.json b/specifications/server-discovery-and-monitoring/tests/integration/auth-network-error.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/auth-network-error.json
rename to specifications/server-discovery-and-monitoring/tests/integration/auth-network-error.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/auth-network-error.yml b/specifications/server-discovery-and-monitoring/tests/integration/auth-network-error.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/auth-network-error.yml
rename to specifications/server-discovery-and-monitoring/tests/integration/auth-network-error.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/auth-network-timeout-error.json b/specifications/server-discovery-and-monitoring/tests/integration/auth-network-timeout-error.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/auth-network-timeout-error.json
rename to specifications/server-discovery-and-monitoring/tests/integration/auth-network-timeout-error.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/auth-network-timeout-error.yml b/specifications/server-discovery-and-monitoring/tests/integration/auth-network-timeout-error.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/auth-network-timeout-error.yml
rename to specifications/server-discovery-and-monitoring/tests/integration/auth-network-timeout-error.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/auth-shutdown-error.json b/specifications/server-discovery-and-monitoring/tests/integration/auth-shutdown-error.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/auth-shutdown-error.json
rename to specifications/server-discovery-and-monitoring/tests/integration/auth-shutdown-error.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/auth-shutdown-error.yml b/specifications/server-discovery-and-monitoring/tests/integration/auth-shutdown-error.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/auth-shutdown-error.yml
rename to specifications/server-discovery-and-monitoring/tests/integration/auth-shutdown-error.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/cancel-server-check.json b/specifications/server-discovery-and-monitoring/tests/integration/cancel-server-check.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/cancel-server-check.json
rename to specifications/server-discovery-and-monitoring/tests/integration/cancel-server-check.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/cancel-server-check.yml b/specifications/server-discovery-and-monitoring/tests/integration/cancel-server-check.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/cancel-server-check.yml
rename to specifications/server-discovery-and-monitoring/tests/integration/cancel-server-check.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/connectTimeoutMS.json b/specifications/server-discovery-and-monitoring/tests/integration/connectTimeoutMS.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/connectTimeoutMS.json
rename to specifications/server-discovery-and-monitoring/tests/integration/connectTimeoutMS.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/connectTimeoutMS.yml b/specifications/server-discovery-and-monitoring/tests/integration/connectTimeoutMS.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/connectTimeoutMS.yml
rename to specifications/server-discovery-and-monitoring/tests/integration/connectTimeoutMS.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/find-network-error.json b/specifications/server-discovery-and-monitoring/tests/integration/find-network-error.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/find-network-error.json
rename to specifications/server-discovery-and-monitoring/tests/integration/find-network-error.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/find-network-error.yml b/specifications/server-discovery-and-monitoring/tests/integration/find-network-error.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/find-network-error.yml
rename to specifications/server-discovery-and-monitoring/tests/integration/find-network-error.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/find-network-timeout-error.json b/specifications/server-discovery-and-monitoring/tests/integration/find-network-timeout-error.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/find-network-timeout-error.json
rename to specifications/server-discovery-and-monitoring/tests/integration/find-network-timeout-error.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/find-network-timeout-error.yml b/specifications/server-discovery-and-monitoring/tests/integration/find-network-timeout-error.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/find-network-timeout-error.yml
rename to specifications/server-discovery-and-monitoring/tests/integration/find-network-timeout-error.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/find-shutdown-error.json b/specifications/server-discovery-and-monitoring/tests/integration/find-shutdown-error.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/find-shutdown-error.json
rename to specifications/server-discovery-and-monitoring/tests/integration/find-shutdown-error.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/find-shutdown-error.yml b/specifications/server-discovery-and-monitoring/tests/integration/find-shutdown-error.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/find-shutdown-error.yml
rename to specifications/server-discovery-and-monitoring/tests/integration/find-shutdown-error.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/hello-command-error.json b/specifications/server-discovery-and-monitoring/tests/integration/hello-command-error.json
similarity index 92%
rename from tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/hello-command-error.json
rename to specifications/server-discovery-and-monitoring/tests/integration/hello-command-error.json
index 05a93e751c5..d3bccd39008 100644
--- a/tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/hello-command-error.json
+++ b/specifications/server-discovery-and-monitoring/tests/integration/hello-command-error.json
@@ -117,7 +117,7 @@
"failPoint": {
"configureFailPoint": "failCommand",
"mode": {
- "times": 2
+ "times": 4
},
"data": {
"failCommands": [
@@ -162,22 +162,6 @@
}
]
}
- },
- {
- "name": "assertEventCount",
- "object": "testRunner",
- "arguments": {
- "event": "ServerMarkedUnknownEvent",
- "count": 1
- }
- },
- {
- "name": "assertEventCount",
- "object": "testRunner",
- "arguments": {
- "event": "PoolClearedEvent",
- "count": 1
- }
}
],
"expectations": [
diff --git a/tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/hello-command-error.yml b/specifications/server-discovery-and-monitoring/tests/integration/hello-command-error.yml
similarity index 89%
rename from tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/hello-command-error.yml
rename to specifications/server-discovery-and-monitoring/tests/integration/hello-command-error.yml
index ae25e4946c5..b6d8f2f80da 100644
--- a/tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/hello-command-error.yml
+++ b/specifications/server-discovery-and-monitoring/tests/integration/hello-command-error.yml
@@ -84,15 +84,16 @@ tests:
documents:
- _id: 1
- _id: 2
- # Configure the next streaming hello check to fail with a command
- # error.
- # Use times: 2 so that the RTT hello is blocked as well.
+ # Configure the next streaming hello check to fail with a command error.
+ # Use "times: 4" to increase the probability that the Monitor check fails
+ # since the RTT hello may trigger this failpoint one or many times as
+ # well.
- name: configureFailPoint
object: testRunner
arguments:
failPoint:
configureFailPoint: failCommand
- mode: { times: 2 }
+ mode: { times: 4 }
data:
failCommands: ["hello", "isMaster"]
appName: commandErrorCheckTest
@@ -119,17 +120,9 @@ tests:
documents:
- _id: 3
- _id: 4
- # Assert the server was marked Unknown and pool was cleared exactly once.
- - name: assertEventCount
- object: testRunner
- arguments:
- event: ServerMarkedUnknownEvent
- count: 1
- - name: assertEventCount
- object: testRunner
- arguments:
- event: PoolClearedEvent
- count: 1
+ # We cannot assert the server was marked Unknown and pool was cleared an
+ # exact number of times because the RTT hello may have triggered this
+ # failpoint one or many times as well.
expectations:
- command_started_event:
diff --git a/tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/hello-network-error.json b/specifications/server-discovery-and-monitoring/tests/integration/hello-network-error.json
similarity index 99%
rename from tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/hello-network-error.json
rename to specifications/server-discovery-and-monitoring/tests/integration/hello-network-error.json
index b699363923b..f9761d75563 100644
--- a/tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/hello-network-error.json
+++ b/specifications/server-discovery-and-monitoring/tests/integration/hello-network-error.json
@@ -116,7 +116,7 @@
"failPoint": {
"configureFailPoint": "failCommand",
"mode": {
- "times": 2
+ "times": 4
},
"data": {
"failCommands": [
diff --git a/tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/hello-network-error.yml b/specifications/server-discovery-and-monitoring/tests/integration/hello-network-error.yml
similarity index 87%
rename from tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/hello-network-error.yml
rename to specifications/server-discovery-and-monitoring/tests/integration/hello-network-error.yml
index 54c6a3bac3c..10d9ac6d90f 100644
--- a/tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/hello-network-error.yml
+++ b/specifications/server-discovery-and-monitoring/tests/integration/hello-network-error.yml
@@ -42,16 +42,6 @@ tests:
# We cannot assert the server was marked Unknown and pool was cleared an
# exact number of times because the RTT hello may or may not have
# triggered this failpoint as well.
- # - name: assertEventCount
- # object: testRunner
- # arguments:
- # event: ServerMarkedUnknownEvent
- # count: 1
- # - name: assertEventCount
- # object: testRunner
- # arguments:
- # event: PoolClearedEvent
- # count: 1
expectations:
- command_started_event:
@@ -84,14 +74,15 @@ tests:
- _id: 1
- _id: 2
# Configure the next streaming hello check to fail with a non-timeout
- # network error. Use times: 2 to ensure that the the Monitor check fails
- # since the RTT hello may trigger this failpoint as well.
+ # network error. Use "times: 4" to increase the probability that the
+ # Monitor check fails since the RTT hello may trigger this failpoint one
+ # or many times as well.
- name: configureFailPoint
object: testRunner
arguments:
failPoint:
configureFailPoint: failCommand
- mode: { times: 2 }
+ mode: { times: 4 }
data:
failCommands: ["hello", "isMaster"]
appName: networkErrorCheckTest
@@ -116,8 +107,8 @@ tests:
- _id: 3
- _id: 4
# We cannot assert the server was marked Unknown and pool was cleared an
- # exact number of times because the RTT hello may or may not have
- # triggered this failpoint as well.
+ # exact number of times because the RTT hello may have triggered this
+ # failpoint one or many times as well.
# - name: assertEventCount
# object: testRunner
# arguments:
diff --git a/tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/hello-timeout.json b/specifications/server-discovery-and-monitoring/tests/integration/hello-timeout.json
similarity index 94%
rename from tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/hello-timeout.json
rename to specifications/server-discovery-and-monitoring/tests/integration/hello-timeout.json
index 0d3c6fb0156..2d3d0ed718c 100644
--- a/tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/hello-timeout.json
+++ b/specifications/server-discovery-and-monitoring/tests/integration/hello-timeout.json
@@ -117,7 +117,7 @@
"failPoint": {
"configureFailPoint": "failCommand",
"mode": {
- "times": 2
+ "times": 4
},
"data": {
"failCommands": [
@@ -160,22 +160,6 @@
}
]
}
- },
- {
- "name": "assertEventCount",
- "object": "testRunner",
- "arguments": {
- "event": "ServerMarkedUnknownEvent",
- "count": 1
- }
- },
- {
- "name": "assertEventCount",
- "object": "testRunner",
- "arguments": {
- "event": "PoolClearedEvent",
- "count": 1
- }
}
],
"expectations": [
diff --git a/tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/hello-timeout.yml b/specifications/server-discovery-and-monitoring/tests/integration/hello-timeout.yml
similarity index 93%
rename from tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/hello-timeout.yml
rename to specifications/server-discovery-and-monitoring/tests/integration/hello-timeout.yml
index 69c9990f5cb..f7d40d88ef3 100644
--- a/tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/hello-timeout.yml
+++ b/specifications/server-discovery-and-monitoring/tests/integration/hello-timeout.yml
@@ -86,14 +86,16 @@ tests:
documents:
- _id: 1
- _id: 2
- # Configure the next streaming hello check to fail with a timeout
- # Use times: 2 so that the RTT hello is blocked as well.
+ # Configure the next streaming hello check to fail with a timeout.
+ # Use "times: 4" to increase the probability that the Monitor check times
+ # out since the RTT hello may trigger this failpoint one or many times as
+ # well.
- name: configureFailPoint
object: testRunner
arguments:
failPoint:
configureFailPoint: failCommand
- mode: { times: 2 }
+ mode: { times: 4 }
data:
failCommands: ["hello", "isMaster"]
appName: timeoutMonitorCheckTest
@@ -121,17 +123,9 @@ tests:
documents:
- _id: 3
- _id: 4
- # Assert the server was marked Unknown and pool was cleared exactly once.
- - name: assertEventCount
- object: testRunner
- arguments:
- event: ServerMarkedUnknownEvent
- count: 1
- - name: assertEventCount
- object: testRunner
- arguments:
- event: PoolClearedEvent
- count: 1
+ # We cannot assert the server was marked Unknown and pool was cleared an
+ # exact number of times because the RTT hello may have triggered this
+ # failpoint one or many times as well.
expectations:
- command_started_event:
diff --git a/tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/insert-network-error.json b/specifications/server-discovery-and-monitoring/tests/integration/insert-network-error.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/insert-network-error.json
rename to specifications/server-discovery-and-monitoring/tests/integration/insert-network-error.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/insert-network-error.yml b/specifications/server-discovery-and-monitoring/tests/integration/insert-network-error.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/insert-network-error.yml
rename to specifications/server-discovery-and-monitoring/tests/integration/insert-network-error.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/insert-shutdown-error.json b/specifications/server-discovery-and-monitoring/tests/integration/insert-shutdown-error.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/insert-shutdown-error.json
rename to specifications/server-discovery-and-monitoring/tests/integration/insert-shutdown-error.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/insert-shutdown-error.yml b/specifications/server-discovery-and-monitoring/tests/integration/insert-shutdown-error.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/insert-shutdown-error.yml
rename to specifications/server-discovery-and-monitoring/tests/integration/insert-shutdown-error.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/minPoolSize-error.json b/specifications/server-discovery-and-monitoring/tests/integration/minPoolSize-error.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/minPoolSize-error.json
rename to specifications/server-discovery-and-monitoring/tests/integration/minPoolSize-error.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/minPoolSize-error.yml b/specifications/server-discovery-and-monitoring/tests/integration/minPoolSize-error.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/minPoolSize-error.yml
rename to specifications/server-discovery-and-monitoring/tests/integration/minPoolSize-error.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/pool-cleared-error.json b/specifications/server-discovery-and-monitoring/tests/integration/pool-cleared-error.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/pool-cleared-error.json
rename to specifications/server-discovery-and-monitoring/tests/integration/pool-cleared-error.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/pool-cleared-error.yml b/specifications/server-discovery-and-monitoring/tests/integration/pool-cleared-error.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/pool-cleared-error.yml
rename to specifications/server-discovery-and-monitoring/tests/integration/pool-cleared-error.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/rediscover-quickly-after-step-down.json b/specifications/server-discovery-and-monitoring/tests/integration/rediscover-quickly-after-step-down.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/rediscover-quickly-after-step-down.json
rename to specifications/server-discovery-and-monitoring/tests/integration/rediscover-quickly-after-step-down.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/rediscover-quickly-after-step-down.yml b/specifications/server-discovery-and-monitoring/tests/integration/rediscover-quickly-after-step-down.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/server-discovery-and-monitoring/tests/integration/rediscover-quickly-after-step-down.yml
rename to specifications/server-discovery-and-monitoring/tests/integration/rediscover-quickly-after-step-down.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/load-balanced/discover_load_balancer.json b/specifications/server-discovery-and-monitoring/tests/load-balanced/discover_load_balancer.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/load-balanced/discover_load_balancer.json
rename to specifications/server-discovery-and-monitoring/tests/load-balanced/discover_load_balancer.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/load-balanced/discover_load_balancer.yml b/specifications/server-discovery-and-monitoring/tests/load-balanced/discover_load_balancer.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/load-balanced/discover_load_balancer.yml
rename to specifications/server-discovery-and-monitoring/tests/load-balanced/discover_load_balancer.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/monitoring/README.rst b/specifications/server-discovery-and-monitoring/tests/monitoring/README.rst
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/monitoring/README.rst
rename to specifications/server-discovery-and-monitoring/tests/monitoring/README.rst
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/monitoring/discovered_standalone.json b/specifications/server-discovery-and-monitoring/tests/monitoring/discovered_standalone.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/monitoring/discovered_standalone.json
rename to specifications/server-discovery-and-monitoring/tests/monitoring/discovered_standalone.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/monitoring/discovered_standalone.yml b/specifications/server-discovery-and-monitoring/tests/monitoring/discovered_standalone.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/monitoring/discovered_standalone.yml
rename to specifications/server-discovery-and-monitoring/tests/monitoring/discovered_standalone.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/monitoring/load_balancer.json b/specifications/server-discovery-and-monitoring/tests/monitoring/load_balancer.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/monitoring/load_balancer.json
rename to specifications/server-discovery-and-monitoring/tests/monitoring/load_balancer.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/monitoring/load_balancer.yml b/specifications/server-discovery-and-monitoring/tests/monitoring/load_balancer.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/monitoring/load_balancer.yml
rename to specifications/server-discovery-and-monitoring/tests/monitoring/load_balancer.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/monitoring/replica_set_with_no_primary.json b/specifications/server-discovery-and-monitoring/tests/monitoring/replica_set_with_no_primary.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/monitoring/replica_set_with_no_primary.json
rename to specifications/server-discovery-and-monitoring/tests/monitoring/replica_set_with_no_primary.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/monitoring/replica_set_with_no_primary.yml b/specifications/server-discovery-and-monitoring/tests/monitoring/replica_set_with_no_primary.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/monitoring/replica_set_with_no_primary.yml
rename to specifications/server-discovery-and-monitoring/tests/monitoring/replica_set_with_no_primary.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/monitoring/replica_set_with_primary.json b/specifications/server-discovery-and-monitoring/tests/monitoring/replica_set_with_primary.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/monitoring/replica_set_with_primary.json
rename to specifications/server-discovery-and-monitoring/tests/monitoring/replica_set_with_primary.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/monitoring/replica_set_with_primary.yml b/specifications/server-discovery-and-monitoring/tests/monitoring/replica_set_with_primary.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/monitoring/replica_set_with_primary.yml
rename to specifications/server-discovery-and-monitoring/tests/monitoring/replica_set_with_primary.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/monitoring/replica_set_with_removal.json b/specifications/server-discovery-and-monitoring/tests/monitoring/replica_set_with_removal.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/monitoring/replica_set_with_removal.json
rename to specifications/server-discovery-and-monitoring/tests/monitoring/replica_set_with_removal.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/monitoring/replica_set_with_removal.yml b/specifications/server-discovery-and-monitoring/tests/monitoring/replica_set_with_removal.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/monitoring/replica_set_with_removal.yml
rename to specifications/server-discovery-and-monitoring/tests/monitoring/replica_set_with_removal.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/monitoring/required_replica_set.json b/specifications/server-discovery-and-monitoring/tests/monitoring/required_replica_set.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/monitoring/required_replica_set.json
rename to specifications/server-discovery-and-monitoring/tests/monitoring/required_replica_set.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/monitoring/required_replica_set.yml b/specifications/server-discovery-and-monitoring/tests/monitoring/required_replica_set.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/monitoring/required_replica_set.yml
rename to specifications/server-discovery-and-monitoring/tests/monitoring/required_replica_set.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/monitoring/standalone.json b/specifications/server-discovery-and-monitoring/tests/monitoring/standalone.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/monitoring/standalone.json
rename to specifications/server-discovery-and-monitoring/tests/monitoring/standalone.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/monitoring/standalone.yml b/specifications/server-discovery-and-monitoring/tests/monitoring/standalone.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/monitoring/standalone.yml
rename to specifications/server-discovery-and-monitoring/tests/monitoring/standalone.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/monitoring/standalone_suppress_equal_description_changes.json b/specifications/server-discovery-and-monitoring/tests/monitoring/standalone_suppress_equal_description_changes.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/monitoring/standalone_suppress_equal_description_changes.json
rename to specifications/server-discovery-and-monitoring/tests/monitoring/standalone_suppress_equal_description_changes.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/monitoring/standalone_suppress_equal_description_changes.yml b/specifications/server-discovery-and-monitoring/tests/monitoring/standalone_suppress_equal_description_changes.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/monitoring/standalone_suppress_equal_description_changes.yml
rename to specifications/server-discovery-and-monitoring/tests/monitoring/standalone_suppress_equal_description_changes.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/compatible.json b/specifications/server-discovery-and-monitoring/tests/rs/compatible.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/compatible.json
rename to specifications/server-discovery-and-monitoring/tests/rs/compatible.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/compatible.yml b/specifications/server-discovery-and-monitoring/tests/rs/compatible.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/compatible.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/compatible.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/compatible_unknown.json b/specifications/server-discovery-and-monitoring/tests/rs/compatible_unknown.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/compatible_unknown.json
rename to specifications/server-discovery-and-monitoring/tests/rs/compatible_unknown.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/compatible_unknown.yml b/specifications/server-discovery-and-monitoring/tests/rs/compatible_unknown.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/compatible_unknown.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/compatible_unknown.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/discover_arbiters.json b/specifications/server-discovery-and-monitoring/tests/rs/discover_arbiters.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/discover_arbiters.json
rename to specifications/server-discovery-and-monitoring/tests/rs/discover_arbiters.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/discover_arbiters.yml b/specifications/server-discovery-and-monitoring/tests/rs/discover_arbiters.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/discover_arbiters.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/discover_arbiters.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/discover_arbiters_replicaset.json b/specifications/server-discovery-and-monitoring/tests/rs/discover_arbiters_replicaset.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/discover_arbiters_replicaset.json
rename to specifications/server-discovery-and-monitoring/tests/rs/discover_arbiters_replicaset.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/discover_arbiters_replicaset.yml b/specifications/server-discovery-and-monitoring/tests/rs/discover_arbiters_replicaset.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/discover_arbiters_replicaset.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/discover_arbiters_replicaset.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/discover_ghost.json b/specifications/server-discovery-and-monitoring/tests/rs/discover_ghost.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/discover_ghost.json
rename to specifications/server-discovery-and-monitoring/tests/rs/discover_ghost.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/discover_ghost.yml b/specifications/server-discovery-and-monitoring/tests/rs/discover_ghost.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/discover_ghost.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/discover_ghost.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/discover_ghost_replicaset.json b/specifications/server-discovery-and-monitoring/tests/rs/discover_ghost_replicaset.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/discover_ghost_replicaset.json
rename to specifications/server-discovery-and-monitoring/tests/rs/discover_ghost_replicaset.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/discover_ghost_replicaset.yml b/specifications/server-discovery-and-monitoring/tests/rs/discover_ghost_replicaset.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/discover_ghost_replicaset.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/discover_ghost_replicaset.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/discover_hidden.json b/specifications/server-discovery-and-monitoring/tests/rs/discover_hidden.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/discover_hidden.json
rename to specifications/server-discovery-and-monitoring/tests/rs/discover_hidden.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/discover_hidden.yml b/specifications/server-discovery-and-monitoring/tests/rs/discover_hidden.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/discover_hidden.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/discover_hidden.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/discover_hidden_replicaset.json b/specifications/server-discovery-and-monitoring/tests/rs/discover_hidden_replicaset.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/discover_hidden_replicaset.json
rename to specifications/server-discovery-and-monitoring/tests/rs/discover_hidden_replicaset.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/discover_hidden_replicaset.yml b/specifications/server-discovery-and-monitoring/tests/rs/discover_hidden_replicaset.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/discover_hidden_replicaset.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/discover_hidden_replicaset.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/discover_passives.json b/specifications/server-discovery-and-monitoring/tests/rs/discover_passives.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/discover_passives.json
rename to specifications/server-discovery-and-monitoring/tests/rs/discover_passives.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/discover_passives.yml b/specifications/server-discovery-and-monitoring/tests/rs/discover_passives.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/discover_passives.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/discover_passives.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/discover_passives_replicaset.json b/specifications/server-discovery-and-monitoring/tests/rs/discover_passives_replicaset.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/discover_passives_replicaset.json
rename to specifications/server-discovery-and-monitoring/tests/rs/discover_passives_replicaset.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/discover_passives_replicaset.yml b/specifications/server-discovery-and-monitoring/tests/rs/discover_passives_replicaset.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/discover_passives_replicaset.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/discover_passives_replicaset.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/discover_primary.json b/specifications/server-discovery-and-monitoring/tests/rs/discover_primary.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/discover_primary.json
rename to specifications/server-discovery-and-monitoring/tests/rs/discover_primary.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/discover_primary.yml b/specifications/server-discovery-and-monitoring/tests/rs/discover_primary.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/discover_primary.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/discover_primary.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/discover_primary_replicaset.json b/specifications/server-discovery-and-monitoring/tests/rs/discover_primary_replicaset.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/discover_primary_replicaset.json
rename to specifications/server-discovery-and-monitoring/tests/rs/discover_primary_replicaset.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/discover_primary_replicaset.yml b/specifications/server-discovery-and-monitoring/tests/rs/discover_primary_replicaset.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/discover_primary_replicaset.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/discover_primary_replicaset.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/discover_rsother.json b/specifications/server-discovery-and-monitoring/tests/rs/discover_rsother.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/discover_rsother.json
rename to specifications/server-discovery-and-monitoring/tests/rs/discover_rsother.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/discover_rsother.yml b/specifications/server-discovery-and-monitoring/tests/rs/discover_rsother.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/discover_rsother.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/discover_rsother.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/discover_rsother_replicaset.json b/specifications/server-discovery-and-monitoring/tests/rs/discover_rsother_replicaset.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/discover_rsother_replicaset.json
rename to specifications/server-discovery-and-monitoring/tests/rs/discover_rsother_replicaset.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/discover_rsother_replicaset.yml b/specifications/server-discovery-and-monitoring/tests/rs/discover_rsother_replicaset.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/discover_rsother_replicaset.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/discover_rsother_replicaset.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/discover_secondary.json b/specifications/server-discovery-and-monitoring/tests/rs/discover_secondary.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/discover_secondary.json
rename to specifications/server-discovery-and-monitoring/tests/rs/discover_secondary.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/discover_secondary.yml b/specifications/server-discovery-and-monitoring/tests/rs/discover_secondary.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/discover_secondary.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/discover_secondary.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/discover_secondary_replicaset.json b/specifications/server-discovery-and-monitoring/tests/rs/discover_secondary_replicaset.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/discover_secondary_replicaset.json
rename to specifications/server-discovery-and-monitoring/tests/rs/discover_secondary_replicaset.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/discover_secondary_replicaset.yml b/specifications/server-discovery-and-monitoring/tests/rs/discover_secondary_replicaset.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/discover_secondary_replicaset.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/discover_secondary_replicaset.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/discovery.json b/specifications/server-discovery-and-monitoring/tests/rs/discovery.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/discovery.json
rename to specifications/server-discovery-and-monitoring/tests/rs/discovery.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/discovery.yml b/specifications/server-discovery-and-monitoring/tests/rs/discovery.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/discovery.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/discovery.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/equal_electionids.json b/specifications/server-discovery-and-monitoring/tests/rs/equal_electionids.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/equal_electionids.json
rename to specifications/server-discovery-and-monitoring/tests/rs/equal_electionids.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/equal_electionids.yml b/specifications/server-discovery-and-monitoring/tests/rs/equal_electionids.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/equal_electionids.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/equal_electionids.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/hosts_differ_from_seeds.json b/specifications/server-discovery-and-monitoring/tests/rs/hosts_differ_from_seeds.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/hosts_differ_from_seeds.json
rename to specifications/server-discovery-and-monitoring/tests/rs/hosts_differ_from_seeds.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/hosts_differ_from_seeds.yml b/specifications/server-discovery-and-monitoring/tests/rs/hosts_differ_from_seeds.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/hosts_differ_from_seeds.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/hosts_differ_from_seeds.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/incompatible_arbiter.json b/specifications/server-discovery-and-monitoring/tests/rs/incompatible_arbiter.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/incompatible_arbiter.json
rename to specifications/server-discovery-and-monitoring/tests/rs/incompatible_arbiter.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/incompatible_arbiter.yml b/specifications/server-discovery-and-monitoring/tests/rs/incompatible_arbiter.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/incompatible_arbiter.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/incompatible_arbiter.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/incompatible_ghost.json b/specifications/server-discovery-and-monitoring/tests/rs/incompatible_ghost.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/incompatible_ghost.json
rename to specifications/server-discovery-and-monitoring/tests/rs/incompatible_ghost.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/incompatible_ghost.yml b/specifications/server-discovery-and-monitoring/tests/rs/incompatible_ghost.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/incompatible_ghost.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/incompatible_ghost.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/incompatible_other.json b/specifications/server-discovery-and-monitoring/tests/rs/incompatible_other.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/incompatible_other.json
rename to specifications/server-discovery-and-monitoring/tests/rs/incompatible_other.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/incompatible_other.yml b/specifications/server-discovery-and-monitoring/tests/rs/incompatible_other.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/incompatible_other.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/incompatible_other.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/ls_timeout.json b/specifications/server-discovery-and-monitoring/tests/rs/ls_timeout.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/ls_timeout.json
rename to specifications/server-discovery-and-monitoring/tests/rs/ls_timeout.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/ls_timeout.yml b/specifications/server-discovery-and-monitoring/tests/rs/ls_timeout.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/ls_timeout.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/ls_timeout.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/member_reconfig.json b/specifications/server-discovery-and-monitoring/tests/rs/member_reconfig.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/member_reconfig.json
rename to specifications/server-discovery-and-monitoring/tests/rs/member_reconfig.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/member_reconfig.yml b/specifications/server-discovery-and-monitoring/tests/rs/member_reconfig.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/member_reconfig.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/member_reconfig.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/member_standalone.json b/specifications/server-discovery-and-monitoring/tests/rs/member_standalone.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/member_standalone.json
rename to specifications/server-discovery-and-monitoring/tests/rs/member_standalone.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/member_standalone.yml b/specifications/server-discovery-and-monitoring/tests/rs/member_standalone.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/member_standalone.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/member_standalone.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/new_primary.json b/specifications/server-discovery-and-monitoring/tests/rs/new_primary.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/new_primary.json
rename to specifications/server-discovery-and-monitoring/tests/rs/new_primary.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/new_primary.yml b/specifications/server-discovery-and-monitoring/tests/rs/new_primary.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/new_primary.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/new_primary.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/new_primary_new_electionid.json b/specifications/server-discovery-and-monitoring/tests/rs/new_primary_new_electionid.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/new_primary_new_electionid.json
rename to specifications/server-discovery-and-monitoring/tests/rs/new_primary_new_electionid.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/new_primary_new_electionid.yml b/specifications/server-discovery-and-monitoring/tests/rs/new_primary_new_electionid.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/new_primary_new_electionid.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/new_primary_new_electionid.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/new_primary_new_setversion.json b/specifications/server-discovery-and-monitoring/tests/rs/new_primary_new_setversion.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/new_primary_new_setversion.json
rename to specifications/server-discovery-and-monitoring/tests/rs/new_primary_new_setversion.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/new_primary_new_setversion.yml b/specifications/server-discovery-and-monitoring/tests/rs/new_primary_new_setversion.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/new_primary_new_setversion.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/new_primary_new_setversion.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/new_primary_wrong_set_name.json b/specifications/server-discovery-and-monitoring/tests/rs/new_primary_wrong_set_name.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/new_primary_wrong_set_name.json
rename to specifications/server-discovery-and-monitoring/tests/rs/new_primary_wrong_set_name.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/new_primary_wrong_set_name.yml b/specifications/server-discovery-and-monitoring/tests/rs/new_primary_wrong_set_name.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/new_primary_wrong_set_name.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/new_primary_wrong_set_name.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/non_rs_member.json b/specifications/server-discovery-and-monitoring/tests/rs/non_rs_member.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/non_rs_member.json
rename to specifications/server-discovery-and-monitoring/tests/rs/non_rs_member.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/non_rs_member.yml b/specifications/server-discovery-and-monitoring/tests/rs/non_rs_member.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/non_rs_member.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/non_rs_member.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/normalize_case.json b/specifications/server-discovery-and-monitoring/tests/rs/normalize_case.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/normalize_case.json
rename to specifications/server-discovery-and-monitoring/tests/rs/normalize_case.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/normalize_case.yml b/specifications/server-discovery-and-monitoring/tests/rs/normalize_case.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/normalize_case.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/normalize_case.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/normalize_case_me.json b/specifications/server-discovery-and-monitoring/tests/rs/normalize_case_me.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/normalize_case_me.json
rename to specifications/server-discovery-and-monitoring/tests/rs/normalize_case_me.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/normalize_case_me.yml b/specifications/server-discovery-and-monitoring/tests/rs/normalize_case_me.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/normalize_case_me.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/normalize_case_me.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/null_election_id.json b/specifications/server-discovery-and-monitoring/tests/rs/null_election_id.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/null_election_id.json
rename to specifications/server-discovery-and-monitoring/tests/rs/null_election_id.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/null_election_id.yml b/specifications/server-discovery-and-monitoring/tests/rs/null_election_id.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/null_election_id.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/null_election_id.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/primary_becomes_ghost.json b/specifications/server-discovery-and-monitoring/tests/rs/primary_becomes_ghost.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/primary_becomes_ghost.json
rename to specifications/server-discovery-and-monitoring/tests/rs/primary_becomes_ghost.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/primary_becomes_ghost.yml b/specifications/server-discovery-and-monitoring/tests/rs/primary_becomes_ghost.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/primary_becomes_ghost.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/primary_becomes_ghost.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/primary_becomes_mongos.json b/specifications/server-discovery-and-monitoring/tests/rs/primary_becomes_mongos.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/primary_becomes_mongos.json
rename to specifications/server-discovery-and-monitoring/tests/rs/primary_becomes_mongos.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/primary_becomes_mongos.yml b/specifications/server-discovery-and-monitoring/tests/rs/primary_becomes_mongos.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/primary_becomes_mongos.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/primary_becomes_mongos.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/primary_becomes_standalone.json b/specifications/server-discovery-and-monitoring/tests/rs/primary_becomes_standalone.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/primary_becomes_standalone.json
rename to specifications/server-discovery-and-monitoring/tests/rs/primary_becomes_standalone.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/primary_becomes_standalone.yml b/specifications/server-discovery-and-monitoring/tests/rs/primary_becomes_standalone.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/primary_becomes_standalone.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/primary_becomes_standalone.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/primary_changes_set_name.json b/specifications/server-discovery-and-monitoring/tests/rs/primary_changes_set_name.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/primary_changes_set_name.json
rename to specifications/server-discovery-and-monitoring/tests/rs/primary_changes_set_name.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/primary_changes_set_name.yml b/specifications/server-discovery-and-monitoring/tests/rs/primary_changes_set_name.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/primary_changes_set_name.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/primary_changes_set_name.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/primary_disconnect.json b/specifications/server-discovery-and-monitoring/tests/rs/primary_disconnect.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/primary_disconnect.json
rename to specifications/server-discovery-and-monitoring/tests/rs/primary_disconnect.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/primary_disconnect.yml b/specifications/server-discovery-and-monitoring/tests/rs/primary_disconnect.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/primary_disconnect.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/primary_disconnect.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/primary_disconnect_electionid.json b/specifications/server-discovery-and-monitoring/tests/rs/primary_disconnect_electionid.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/primary_disconnect_electionid.json
rename to specifications/server-discovery-and-monitoring/tests/rs/primary_disconnect_electionid.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/primary_disconnect_electionid.yml b/specifications/server-discovery-and-monitoring/tests/rs/primary_disconnect_electionid.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/primary_disconnect_electionid.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/primary_disconnect_electionid.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/primary_disconnect_setversion.json b/specifications/server-discovery-and-monitoring/tests/rs/primary_disconnect_setversion.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/primary_disconnect_setversion.json
rename to specifications/server-discovery-and-monitoring/tests/rs/primary_disconnect_setversion.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/primary_disconnect_setversion.yml b/specifications/server-discovery-and-monitoring/tests/rs/primary_disconnect_setversion.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/primary_disconnect_setversion.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/primary_disconnect_setversion.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/primary_hint_from_secondary_with_mismatched_me.json b/specifications/server-discovery-and-monitoring/tests/rs/primary_hint_from_secondary_with_mismatched_me.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/primary_hint_from_secondary_with_mismatched_me.json
rename to specifications/server-discovery-and-monitoring/tests/rs/primary_hint_from_secondary_with_mismatched_me.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/primary_hint_from_secondary_with_mismatched_me.yml b/specifications/server-discovery-and-monitoring/tests/rs/primary_hint_from_secondary_with_mismatched_me.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/primary_hint_from_secondary_with_mismatched_me.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/primary_hint_from_secondary_with_mismatched_me.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/primary_mismatched_me.json b/specifications/server-discovery-and-monitoring/tests/rs/primary_mismatched_me.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/primary_mismatched_me.json
rename to specifications/server-discovery-and-monitoring/tests/rs/primary_mismatched_me.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/primary_mismatched_me.yml b/specifications/server-discovery-and-monitoring/tests/rs/primary_mismatched_me.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/primary_mismatched_me.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/primary_mismatched_me.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/primary_mismatched_me_not_removed.json b/specifications/server-discovery-and-monitoring/tests/rs/primary_mismatched_me_not_removed.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/primary_mismatched_me_not_removed.json
rename to specifications/server-discovery-and-monitoring/tests/rs/primary_mismatched_me_not_removed.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/primary_mismatched_me_not_removed.yml b/specifications/server-discovery-and-monitoring/tests/rs/primary_mismatched_me_not_removed.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/primary_mismatched_me_not_removed.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/primary_mismatched_me_not_removed.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/primary_reports_new_member.json b/specifications/server-discovery-and-monitoring/tests/rs/primary_reports_new_member.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/primary_reports_new_member.json
rename to specifications/server-discovery-and-monitoring/tests/rs/primary_reports_new_member.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/primary_reports_new_member.yml b/specifications/server-discovery-and-monitoring/tests/rs/primary_reports_new_member.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/primary_reports_new_member.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/primary_reports_new_member.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/primary_to_no_primary_mismatched_me.json b/specifications/server-discovery-and-monitoring/tests/rs/primary_to_no_primary_mismatched_me.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/primary_to_no_primary_mismatched_me.json
rename to specifications/server-discovery-and-monitoring/tests/rs/primary_to_no_primary_mismatched_me.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/primary_to_no_primary_mismatched_me.yml b/specifications/server-discovery-and-monitoring/tests/rs/primary_to_no_primary_mismatched_me.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/primary_to_no_primary_mismatched_me.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/primary_to_no_primary_mismatched_me.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/primary_wrong_set_name.json b/specifications/server-discovery-and-monitoring/tests/rs/primary_wrong_set_name.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/primary_wrong_set_name.json
rename to specifications/server-discovery-and-monitoring/tests/rs/primary_wrong_set_name.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/primary_wrong_set_name.yml b/specifications/server-discovery-and-monitoring/tests/rs/primary_wrong_set_name.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/primary_wrong_set_name.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/primary_wrong_set_name.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/repeated.json b/specifications/server-discovery-and-monitoring/tests/rs/repeated.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/repeated.json
rename to specifications/server-discovery-and-monitoring/tests/rs/repeated.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/repeated.yml b/specifications/server-discovery-and-monitoring/tests/rs/repeated.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/repeated.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/repeated.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/replicaset_rsnp.json b/specifications/server-discovery-and-monitoring/tests/rs/replicaset_rsnp.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/replicaset_rsnp.json
rename to specifications/server-discovery-and-monitoring/tests/rs/replicaset_rsnp.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/replicaset_rsnp.yml b/specifications/server-discovery-and-monitoring/tests/rs/replicaset_rsnp.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/replicaset_rsnp.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/replicaset_rsnp.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/response_from_removed.json b/specifications/server-discovery-and-monitoring/tests/rs/response_from_removed.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/response_from_removed.json
rename to specifications/server-discovery-and-monitoring/tests/rs/response_from_removed.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/response_from_removed.yml b/specifications/server-discovery-and-monitoring/tests/rs/response_from_removed.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/response_from_removed.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/response_from_removed.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/sec_not_auth.json b/specifications/server-discovery-and-monitoring/tests/rs/sec_not_auth.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/sec_not_auth.json
rename to specifications/server-discovery-and-monitoring/tests/rs/sec_not_auth.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/sec_not_auth.yml b/specifications/server-discovery-and-monitoring/tests/rs/sec_not_auth.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/sec_not_auth.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/sec_not_auth.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/secondary_ignore_ok_0.json b/specifications/server-discovery-and-monitoring/tests/rs/secondary_ignore_ok_0.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/secondary_ignore_ok_0.json
rename to specifications/server-discovery-and-monitoring/tests/rs/secondary_ignore_ok_0.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/secondary_ignore_ok_0.yml b/specifications/server-discovery-and-monitoring/tests/rs/secondary_ignore_ok_0.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/secondary_ignore_ok_0.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/secondary_ignore_ok_0.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/secondary_mismatched_me.json b/specifications/server-discovery-and-monitoring/tests/rs/secondary_mismatched_me.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/secondary_mismatched_me.json
rename to specifications/server-discovery-and-monitoring/tests/rs/secondary_mismatched_me.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/secondary_mismatched_me.yml b/specifications/server-discovery-and-monitoring/tests/rs/secondary_mismatched_me.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/secondary_mismatched_me.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/secondary_mismatched_me.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/secondary_wrong_set_name.json b/specifications/server-discovery-and-monitoring/tests/rs/secondary_wrong_set_name.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/secondary_wrong_set_name.json
rename to specifications/server-discovery-and-monitoring/tests/rs/secondary_wrong_set_name.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/secondary_wrong_set_name.yml b/specifications/server-discovery-and-monitoring/tests/rs/secondary_wrong_set_name.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/secondary_wrong_set_name.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/secondary_wrong_set_name.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/secondary_wrong_set_name_with_primary.json b/specifications/server-discovery-and-monitoring/tests/rs/secondary_wrong_set_name_with_primary.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/secondary_wrong_set_name_with_primary.json
rename to specifications/server-discovery-and-monitoring/tests/rs/secondary_wrong_set_name_with_primary.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/secondary_wrong_set_name_with_primary.yml b/specifications/server-discovery-and-monitoring/tests/rs/secondary_wrong_set_name_with_primary.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/secondary_wrong_set_name_with_primary.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/secondary_wrong_set_name_with_primary.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/setversion_without_electionid.json b/specifications/server-discovery-and-monitoring/tests/rs/setversion_without_electionid.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/setversion_without_electionid.json
rename to specifications/server-discovery-and-monitoring/tests/rs/setversion_without_electionid.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/setversion_without_electionid.yml b/specifications/server-discovery-and-monitoring/tests/rs/setversion_without_electionid.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/setversion_without_electionid.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/setversion_without_electionid.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/stepdown_change_set_name.json b/specifications/server-discovery-and-monitoring/tests/rs/stepdown_change_set_name.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/stepdown_change_set_name.json
rename to specifications/server-discovery-and-monitoring/tests/rs/stepdown_change_set_name.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/stepdown_change_set_name.yml b/specifications/server-discovery-and-monitoring/tests/rs/stepdown_change_set_name.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/stepdown_change_set_name.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/stepdown_change_set_name.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/too_new.json b/specifications/server-discovery-and-monitoring/tests/rs/too_new.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/too_new.json
rename to specifications/server-discovery-and-monitoring/tests/rs/too_new.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/too_new.yml b/specifications/server-discovery-and-monitoring/tests/rs/too_new.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/too_new.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/too_new.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/too_old.json b/specifications/server-discovery-and-monitoring/tests/rs/too_old.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/too_old.json
rename to specifications/server-discovery-and-monitoring/tests/rs/too_old.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/too_old.yml b/specifications/server-discovery-and-monitoring/tests/rs/too_old.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/too_old.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/too_old.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/topology_version_equal.json b/specifications/server-discovery-and-monitoring/tests/rs/topology_version_equal.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/topology_version_equal.json
rename to specifications/server-discovery-and-monitoring/tests/rs/topology_version_equal.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/topology_version_equal.yml b/specifications/server-discovery-and-monitoring/tests/rs/topology_version_equal.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/topology_version_equal.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/topology_version_equal.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/topology_version_greater.json b/specifications/server-discovery-and-monitoring/tests/rs/topology_version_greater.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/topology_version_greater.json
rename to specifications/server-discovery-and-monitoring/tests/rs/topology_version_greater.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/topology_version_greater.yml b/specifications/server-discovery-and-monitoring/tests/rs/topology_version_greater.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/topology_version_greater.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/topology_version_greater.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/topology_version_less.json b/specifications/server-discovery-and-monitoring/tests/rs/topology_version_less.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/topology_version_less.json
rename to specifications/server-discovery-and-monitoring/tests/rs/topology_version_less.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/topology_version_less.yml b/specifications/server-discovery-and-monitoring/tests/rs/topology_version_less.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/topology_version_less.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/topology_version_less.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/unexpected_mongos.json b/specifications/server-discovery-and-monitoring/tests/rs/unexpected_mongos.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/unexpected_mongos.json
rename to specifications/server-discovery-and-monitoring/tests/rs/unexpected_mongos.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/unexpected_mongos.yml b/specifications/server-discovery-and-monitoring/tests/rs/unexpected_mongos.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/unexpected_mongos.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/unexpected_mongos.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/use_setversion_without_electionid.json b/specifications/server-discovery-and-monitoring/tests/rs/use_setversion_without_electionid.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/use_setversion_without_electionid.json
rename to specifications/server-discovery-and-monitoring/tests/rs/use_setversion_without_electionid.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/use_setversion_without_electionid.yml b/specifications/server-discovery-and-monitoring/tests/rs/use_setversion_without_electionid.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/use_setversion_without_electionid.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/use_setversion_without_electionid.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/wrong_set_name.json b/specifications/server-discovery-and-monitoring/tests/rs/wrong_set_name.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/wrong_set_name.json
rename to specifications/server-discovery-and-monitoring/tests/rs/wrong_set_name.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/wrong_set_name.yml b/specifications/server-discovery-and-monitoring/tests/rs/wrong_set_name.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/rs/wrong_set_name.yml
rename to specifications/server-discovery-and-monitoring/tests/rs/wrong_set_name.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/sharded/compatible.json b/specifications/server-discovery-and-monitoring/tests/sharded/compatible.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/sharded/compatible.json
rename to specifications/server-discovery-and-monitoring/tests/sharded/compatible.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/sharded/compatible.yml b/specifications/server-discovery-and-monitoring/tests/sharded/compatible.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/sharded/compatible.yml
rename to specifications/server-discovery-and-monitoring/tests/sharded/compatible.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/sharded/discover_single_mongos.json b/specifications/server-discovery-and-monitoring/tests/sharded/discover_single_mongos.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/sharded/discover_single_mongos.json
rename to specifications/server-discovery-and-monitoring/tests/sharded/discover_single_mongos.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/sharded/discover_single_mongos.yml b/specifications/server-discovery-and-monitoring/tests/sharded/discover_single_mongos.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/sharded/discover_single_mongos.yml
rename to specifications/server-discovery-and-monitoring/tests/sharded/discover_single_mongos.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/sharded/ls_timeout_mongos.json b/specifications/server-discovery-and-monitoring/tests/sharded/ls_timeout_mongos.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/sharded/ls_timeout_mongos.json
rename to specifications/server-discovery-and-monitoring/tests/sharded/ls_timeout_mongos.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/sharded/ls_timeout_mongos.yml b/specifications/server-discovery-and-monitoring/tests/sharded/ls_timeout_mongos.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/sharded/ls_timeout_mongos.yml
rename to specifications/server-discovery-and-monitoring/tests/sharded/ls_timeout_mongos.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/sharded/mongos_disconnect.json b/specifications/server-discovery-and-monitoring/tests/sharded/mongos_disconnect.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/sharded/mongos_disconnect.json
rename to specifications/server-discovery-and-monitoring/tests/sharded/mongos_disconnect.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/sharded/mongos_disconnect.yml b/specifications/server-discovery-and-monitoring/tests/sharded/mongos_disconnect.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/sharded/mongos_disconnect.yml
rename to specifications/server-discovery-and-monitoring/tests/sharded/mongos_disconnect.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/sharded/multiple_mongoses.json b/specifications/server-discovery-and-monitoring/tests/sharded/multiple_mongoses.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/sharded/multiple_mongoses.json
rename to specifications/server-discovery-and-monitoring/tests/sharded/multiple_mongoses.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/sharded/multiple_mongoses.yml b/specifications/server-discovery-and-monitoring/tests/sharded/multiple_mongoses.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/sharded/multiple_mongoses.yml
rename to specifications/server-discovery-and-monitoring/tests/sharded/multiple_mongoses.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/sharded/non_mongos_removed.json b/specifications/server-discovery-and-monitoring/tests/sharded/non_mongos_removed.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/sharded/non_mongos_removed.json
rename to specifications/server-discovery-and-monitoring/tests/sharded/non_mongos_removed.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/sharded/non_mongos_removed.yml b/specifications/server-discovery-and-monitoring/tests/sharded/non_mongos_removed.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/sharded/non_mongos_removed.yml
rename to specifications/server-discovery-and-monitoring/tests/sharded/non_mongos_removed.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/sharded/normalize_uri_case.json b/specifications/server-discovery-and-monitoring/tests/sharded/normalize_uri_case.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/sharded/normalize_uri_case.json
rename to specifications/server-discovery-and-monitoring/tests/sharded/normalize_uri_case.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/sharded/normalize_uri_case.yml b/specifications/server-discovery-and-monitoring/tests/sharded/normalize_uri_case.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/sharded/normalize_uri_case.yml
rename to specifications/server-discovery-and-monitoring/tests/sharded/normalize_uri_case.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/sharded/too_new.json b/specifications/server-discovery-and-monitoring/tests/sharded/too_new.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/sharded/too_new.json
rename to specifications/server-discovery-and-monitoring/tests/sharded/too_new.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/sharded/too_new.yml b/specifications/server-discovery-and-monitoring/tests/sharded/too_new.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/sharded/too_new.yml
rename to specifications/server-discovery-and-monitoring/tests/sharded/too_new.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/sharded/too_old.json b/specifications/server-discovery-and-monitoring/tests/sharded/too_old.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/sharded/too_old.json
rename to specifications/server-discovery-and-monitoring/tests/sharded/too_old.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/sharded/too_old.yml b/specifications/server-discovery-and-monitoring/tests/sharded/too_old.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/sharded/too_old.yml
rename to specifications/server-discovery-and-monitoring/tests/sharded/too_old.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/compatible.json b/specifications/server-discovery-and-monitoring/tests/single/compatible.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/compatible.json
rename to specifications/server-discovery-and-monitoring/tests/single/compatible.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/compatible.yml b/specifications/server-discovery-and-monitoring/tests/single/compatible.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/compatible.yml
rename to specifications/server-discovery-and-monitoring/tests/single/compatible.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/direct_connection_external_ip.json b/specifications/server-discovery-and-monitoring/tests/single/direct_connection_external_ip.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/direct_connection_external_ip.json
rename to specifications/server-discovery-and-monitoring/tests/single/direct_connection_external_ip.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/direct_connection_external_ip.yml b/specifications/server-discovery-and-monitoring/tests/single/direct_connection_external_ip.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/direct_connection_external_ip.yml
rename to specifications/server-discovery-and-monitoring/tests/single/direct_connection_external_ip.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/direct_connection_mongos.json b/specifications/server-discovery-and-monitoring/tests/single/direct_connection_mongos.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/direct_connection_mongos.json
rename to specifications/server-discovery-and-monitoring/tests/single/direct_connection_mongos.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/direct_connection_mongos.yml b/specifications/server-discovery-and-monitoring/tests/single/direct_connection_mongos.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/direct_connection_mongos.yml
rename to specifications/server-discovery-and-monitoring/tests/single/direct_connection_mongos.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/direct_connection_replicaset.json b/specifications/server-discovery-and-monitoring/tests/single/direct_connection_replicaset.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/direct_connection_replicaset.json
rename to specifications/server-discovery-and-monitoring/tests/single/direct_connection_replicaset.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/direct_connection_replicaset.yml b/specifications/server-discovery-and-monitoring/tests/single/direct_connection_replicaset.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/direct_connection_replicaset.yml
rename to specifications/server-discovery-and-monitoring/tests/single/direct_connection_replicaset.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/direct_connection_rsarbiter.json b/specifications/server-discovery-and-monitoring/tests/single/direct_connection_rsarbiter.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/direct_connection_rsarbiter.json
rename to specifications/server-discovery-and-monitoring/tests/single/direct_connection_rsarbiter.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/direct_connection_rsarbiter.yml b/specifications/server-discovery-and-monitoring/tests/single/direct_connection_rsarbiter.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/direct_connection_rsarbiter.yml
rename to specifications/server-discovery-and-monitoring/tests/single/direct_connection_rsarbiter.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/direct_connection_rsprimary.json b/specifications/server-discovery-and-monitoring/tests/single/direct_connection_rsprimary.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/direct_connection_rsprimary.json
rename to specifications/server-discovery-and-monitoring/tests/single/direct_connection_rsprimary.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/direct_connection_rsprimary.yml b/specifications/server-discovery-and-monitoring/tests/single/direct_connection_rsprimary.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/direct_connection_rsprimary.yml
rename to specifications/server-discovery-and-monitoring/tests/single/direct_connection_rsprimary.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/direct_connection_rssecondary.json b/specifications/server-discovery-and-monitoring/tests/single/direct_connection_rssecondary.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/direct_connection_rssecondary.json
rename to specifications/server-discovery-and-monitoring/tests/single/direct_connection_rssecondary.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/direct_connection_rssecondary.yml b/specifications/server-discovery-and-monitoring/tests/single/direct_connection_rssecondary.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/direct_connection_rssecondary.yml
rename to specifications/server-discovery-and-monitoring/tests/single/direct_connection_rssecondary.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/direct_connection_standalone.json b/specifications/server-discovery-and-monitoring/tests/single/direct_connection_standalone.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/direct_connection_standalone.json
rename to specifications/server-discovery-and-monitoring/tests/single/direct_connection_standalone.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/direct_connection_standalone.yml b/specifications/server-discovery-and-monitoring/tests/single/direct_connection_standalone.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/direct_connection_standalone.yml
rename to specifications/server-discovery-and-monitoring/tests/single/direct_connection_standalone.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/direct_connection_unavailable_seed.json b/specifications/server-discovery-and-monitoring/tests/single/direct_connection_unavailable_seed.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/direct_connection_unavailable_seed.json
rename to specifications/server-discovery-and-monitoring/tests/single/direct_connection_unavailable_seed.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/direct_connection_unavailable_seed.yml b/specifications/server-discovery-and-monitoring/tests/single/direct_connection_unavailable_seed.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/direct_connection_unavailable_seed.yml
rename to specifications/server-discovery-and-monitoring/tests/single/direct_connection_unavailable_seed.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/direct_connection_wrong_set_name.json b/specifications/server-discovery-and-monitoring/tests/single/direct_connection_wrong_set_name.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/direct_connection_wrong_set_name.json
rename to specifications/server-discovery-and-monitoring/tests/single/direct_connection_wrong_set_name.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/direct_connection_wrong_set_name.yml b/specifications/server-discovery-and-monitoring/tests/single/direct_connection_wrong_set_name.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/direct_connection_wrong_set_name.yml
rename to specifications/server-discovery-and-monitoring/tests/single/direct_connection_wrong_set_name.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/discover_standalone.json b/specifications/server-discovery-and-monitoring/tests/single/discover_standalone.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/discover_standalone.json
rename to specifications/server-discovery-and-monitoring/tests/single/discover_standalone.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/discover_standalone.yml b/specifications/server-discovery-and-monitoring/tests/single/discover_standalone.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/discover_standalone.yml
rename to specifications/server-discovery-and-monitoring/tests/single/discover_standalone.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/discover_unavailable_seed.json b/specifications/server-discovery-and-monitoring/tests/single/discover_unavailable_seed.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/discover_unavailable_seed.json
rename to specifications/server-discovery-and-monitoring/tests/single/discover_unavailable_seed.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/discover_unavailable_seed.yml b/specifications/server-discovery-and-monitoring/tests/single/discover_unavailable_seed.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/discover_unavailable_seed.yml
rename to specifications/server-discovery-and-monitoring/tests/single/discover_unavailable_seed.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/ls_timeout_standalone.json b/specifications/server-discovery-and-monitoring/tests/single/ls_timeout_standalone.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/ls_timeout_standalone.json
rename to specifications/server-discovery-and-monitoring/tests/single/ls_timeout_standalone.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/ls_timeout_standalone.yml b/specifications/server-discovery-and-monitoring/tests/single/ls_timeout_standalone.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/ls_timeout_standalone.yml
rename to specifications/server-discovery-and-monitoring/tests/single/ls_timeout_standalone.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/not_ok_response.json b/specifications/server-discovery-and-monitoring/tests/single/not_ok_response.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/not_ok_response.json
rename to specifications/server-discovery-and-monitoring/tests/single/not_ok_response.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/not_ok_response.yml b/specifications/server-discovery-and-monitoring/tests/single/not_ok_response.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/not_ok_response.yml
rename to specifications/server-discovery-and-monitoring/tests/single/not_ok_response.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/standalone_removed.json b/specifications/server-discovery-and-monitoring/tests/single/standalone_removed.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/standalone_removed.json
rename to specifications/server-discovery-and-monitoring/tests/single/standalone_removed.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/standalone_removed.yml b/specifications/server-discovery-and-monitoring/tests/single/standalone_removed.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/standalone_removed.yml
rename to specifications/server-discovery-and-monitoring/tests/single/standalone_removed.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/standalone_using_legacy_hello.json b/specifications/server-discovery-and-monitoring/tests/single/standalone_using_legacy_hello.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/standalone_using_legacy_hello.json
rename to specifications/server-discovery-and-monitoring/tests/single/standalone_using_legacy_hello.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/standalone_using_legacy_hello.yml b/specifications/server-discovery-and-monitoring/tests/single/standalone_using_legacy_hello.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/standalone_using_legacy_hello.yml
rename to specifications/server-discovery-and-monitoring/tests/single/standalone_using_legacy_hello.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/too_new.json b/specifications/server-discovery-and-monitoring/tests/single/too_new.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/too_new.json
rename to specifications/server-discovery-and-monitoring/tests/single/too_new.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/too_new.yml b/specifications/server-discovery-and-monitoring/tests/single/too_new.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/too_new.yml
rename to specifications/server-discovery-and-monitoring/tests/single/too_new.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/too_old.json b/specifications/server-discovery-and-monitoring/tests/single/too_old.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/too_old.json
rename to specifications/server-discovery-and-monitoring/tests/single/too_old.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/too_old.yml b/specifications/server-discovery-and-monitoring/tests/single/too_old.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/too_old.yml
rename to specifications/server-discovery-and-monitoring/tests/single/too_old.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/too_old_then_upgraded.json b/specifications/server-discovery-and-monitoring/tests/single/too_old_then_upgraded.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/too_old_then_upgraded.json
rename to specifications/server-discovery-and-monitoring/tests/single/too_old_then_upgraded.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/too_old_then_upgraded.yml b/specifications/server-discovery-and-monitoring/tests/single/too_old_then_upgraded.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-discovery-and-monitoring/tests/single/too_old_then_upgraded.yml
rename to specifications/server-discovery-and-monitoring/tests/single/too_old_then_upgraded.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/README.rst b/specifications/server-selection/tests/README.rst
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/README.rst
rename to specifications/server-selection/tests/README.rst
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/in_window/equilibrium.json b/specifications/server-selection/tests/in_window/equilibrium.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/in_window/equilibrium.json
rename to specifications/server-selection/tests/in_window/equilibrium.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/in_window/equilibrium.yml b/specifications/server-selection/tests/in_window/equilibrium.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/in_window/equilibrium.yml
rename to specifications/server-selection/tests/in_window/equilibrium.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/in_window/many-choices.json b/specifications/server-selection/tests/in_window/many-choices.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/in_window/many-choices.json
rename to specifications/server-selection/tests/in_window/many-choices.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/in_window/many-choices.yml b/specifications/server-selection/tests/in_window/many-choices.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/in_window/many-choices.yml
rename to specifications/server-selection/tests/in_window/many-choices.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/in_window/one-least-two-tied.json b/specifications/server-selection/tests/in_window/one-least-two-tied.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/in_window/one-least-two-tied.json
rename to specifications/server-selection/tests/in_window/one-least-two-tied.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/in_window/one-least-two-tied.yml b/specifications/server-selection/tests/in_window/one-least-two-tied.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/in_window/one-least-two-tied.yml
rename to specifications/server-selection/tests/in_window/one-least-two-tied.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/in_window/rs-equilibrium.json b/specifications/server-selection/tests/in_window/rs-equilibrium.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/in_window/rs-equilibrium.json
rename to specifications/server-selection/tests/in_window/rs-equilibrium.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/in_window/rs-equilibrium.yml b/specifications/server-selection/tests/in_window/rs-equilibrium.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/in_window/rs-equilibrium.yml
rename to specifications/server-selection/tests/in_window/rs-equilibrium.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/in_window/rs-three-choices.json b/specifications/server-selection/tests/in_window/rs-three-choices.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/in_window/rs-three-choices.json
rename to specifications/server-selection/tests/in_window/rs-three-choices.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/in_window/rs-three-choices.yml b/specifications/server-selection/tests/in_window/rs-three-choices.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/in_window/rs-three-choices.yml
rename to specifications/server-selection/tests/in_window/rs-three-choices.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/in_window/three-choices.json b/specifications/server-selection/tests/in_window/three-choices.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/in_window/three-choices.json
rename to specifications/server-selection/tests/in_window/three-choices.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/in_window/three-choices.yml b/specifications/server-selection/tests/in_window/three-choices.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/in_window/three-choices.yml
rename to specifications/server-selection/tests/in_window/three-choices.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/in_window/two-choices.json b/specifications/server-selection/tests/in_window/two-choices.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/in_window/two-choices.json
rename to specifications/server-selection/tests/in_window/two-choices.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/in_window/two-choices.yml b/specifications/server-selection/tests/in_window/two-choices.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/in_window/two-choices.yml
rename to specifications/server-selection/tests/in_window/two-choices.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/in_window/two-least.json b/specifications/server-selection/tests/in_window/two-least.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/in_window/two-least.json
rename to specifications/server-selection/tests/in_window/two-least.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/in_window/two-least.yml b/specifications/server-selection/tests/in_window/two-least.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/in_window/two-least.yml
rename to specifications/server-selection/tests/in_window/two-least.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/rtt/first_value.json b/specifications/server-selection/tests/rtt/first_value.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/rtt/first_value.json
rename to specifications/server-selection/tests/rtt/first_value.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/rtt/first_value.yml b/specifications/server-selection/tests/rtt/first_value.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/rtt/first_value.yml
rename to specifications/server-selection/tests/rtt/first_value.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/rtt/first_value_zero.json b/specifications/server-selection/tests/rtt/first_value_zero.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/rtt/first_value_zero.json
rename to specifications/server-selection/tests/rtt/first_value_zero.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/rtt/first_value_zero.yml b/specifications/server-selection/tests/rtt/first_value_zero.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/rtt/first_value_zero.yml
rename to specifications/server-selection/tests/rtt/first_value_zero.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/rtt/value_test_1.json b/specifications/server-selection/tests/rtt/value_test_1.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/rtt/value_test_1.json
rename to specifications/server-selection/tests/rtt/value_test_1.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/rtt/value_test_1.yml b/specifications/server-selection/tests/rtt/value_test_1.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/rtt/value_test_1.yml
rename to specifications/server-selection/tests/rtt/value_test_1.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/rtt/value_test_2.json b/specifications/server-selection/tests/rtt/value_test_2.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/rtt/value_test_2.json
rename to specifications/server-selection/tests/rtt/value_test_2.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/rtt/value_test_2.yml b/specifications/server-selection/tests/rtt/value_test_2.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/rtt/value_test_2.yml
rename to specifications/server-selection/tests/rtt/value_test_2.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/rtt/value_test_3.json b/specifications/server-selection/tests/rtt/value_test_3.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/rtt/value_test_3.json
rename to specifications/server-selection/tests/rtt/value_test_3.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/rtt/value_test_3.yml b/specifications/server-selection/tests/rtt/value_test_3.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/rtt/value_test_3.yml
rename to specifications/server-selection/tests/rtt/value_test_3.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/rtt/value_test_4.json b/specifications/server-selection/tests/rtt/value_test_4.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/rtt/value_test_4.json
rename to specifications/server-selection/tests/rtt/value_test_4.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/rtt/value_test_4.yml b/specifications/server-selection/tests/rtt/value_test_4.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/rtt/value_test_4.yml
rename to specifications/server-selection/tests/rtt/value_test_4.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/rtt/value_test_5.json b/specifications/server-selection/tests/rtt/value_test_5.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/rtt/value_test_5.json
rename to specifications/server-selection/tests/rtt/value_test_5.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/rtt/value_test_5.yml b/specifications/server-selection/tests/rtt/value_test_5.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/rtt/value_test_5.yml
rename to specifications/server-selection/tests/rtt/value_test_5.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/LoadBalanced/read/Nearest.json b/specifications/server-selection/tests/server_selection/LoadBalanced/read/Nearest.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/LoadBalanced/read/Nearest.json
rename to specifications/server-selection/tests/server_selection/LoadBalanced/read/Nearest.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/LoadBalanced/read/Primary.json b/specifications/server-selection/tests/server_selection/LoadBalanced/read/Primary.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/LoadBalanced/read/Primary.json
rename to specifications/server-selection/tests/server_selection/LoadBalanced/read/Primary.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/LoadBalanced/read/PrimaryPreferred.json b/specifications/server-selection/tests/server_selection/LoadBalanced/read/PrimaryPreferred.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/LoadBalanced/read/PrimaryPreferred.json
rename to specifications/server-selection/tests/server_selection/LoadBalanced/read/PrimaryPreferred.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/LoadBalanced/read/Secondary.json b/specifications/server-selection/tests/server_selection/LoadBalanced/read/Secondary.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/LoadBalanced/read/Secondary.json
rename to specifications/server-selection/tests/server_selection/LoadBalanced/read/Secondary.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/LoadBalanced/read/SecondaryPreferred.json b/specifications/server-selection/tests/server_selection/LoadBalanced/read/SecondaryPreferred.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/LoadBalanced/read/SecondaryPreferred.json
rename to specifications/server-selection/tests/server_selection/LoadBalanced/read/SecondaryPreferred.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/LoadBalanced/write/Nearest.json b/specifications/server-selection/tests/server_selection/LoadBalanced/write/Nearest.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/LoadBalanced/write/Nearest.json
rename to specifications/server-selection/tests/server_selection/LoadBalanced/write/Nearest.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/LoadBalanced/write/Primary.json b/specifications/server-selection/tests/server_selection/LoadBalanced/write/Primary.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/LoadBalanced/write/Primary.json
rename to specifications/server-selection/tests/server_selection/LoadBalanced/write/Primary.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/LoadBalanced/write/PrimaryPreferred.json b/specifications/server-selection/tests/server_selection/LoadBalanced/write/PrimaryPreferred.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/LoadBalanced/write/PrimaryPreferred.json
rename to specifications/server-selection/tests/server_selection/LoadBalanced/write/PrimaryPreferred.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/LoadBalanced/write/Secondary.json b/specifications/server-selection/tests/server_selection/LoadBalanced/write/Secondary.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/LoadBalanced/write/Secondary.json
rename to specifications/server-selection/tests/server_selection/LoadBalanced/write/Secondary.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/LoadBalanced/write/SecondaryPreferred.json b/specifications/server-selection/tests/server_selection/LoadBalanced/write/SecondaryPreferred.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/LoadBalanced/write/SecondaryPreferred.json
rename to specifications/server-selection/tests/server_selection/LoadBalanced/write/SecondaryPreferred.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Nearest.json b/specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Nearest.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Nearest.json
rename to specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Nearest.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Nearest.yml b/specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Nearest.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Nearest.yml
rename to specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Nearest.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Nearest_multiple.json b/specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Nearest_multiple.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Nearest_multiple.json
rename to specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Nearest_multiple.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Nearest_multiple.yml b/specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Nearest_multiple.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Nearest_multiple.yml
rename to specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Nearest_multiple.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Nearest_non_matching.json b/specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Nearest_non_matching.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Nearest_non_matching.json
rename to specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Nearest_non_matching.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Nearest_non_matching.yml b/specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Nearest_non_matching.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Nearest_non_matching.yml
rename to specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Nearest_non_matching.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Primary.json b/specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Primary.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Primary.json
rename to specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Primary.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Primary.yml b/specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Primary.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Primary.yml
rename to specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Primary.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/PrimaryPreferred.json b/specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/PrimaryPreferred.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/PrimaryPreferred.json
rename to specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/PrimaryPreferred.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/PrimaryPreferred.yml b/specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/PrimaryPreferred.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/PrimaryPreferred.yml
rename to specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/PrimaryPreferred.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/PrimaryPreferred_non_matching.json b/specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/PrimaryPreferred_non_matching.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/PrimaryPreferred_non_matching.json
rename to specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/PrimaryPreferred_non_matching.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/PrimaryPreferred_non_matching.yml b/specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/PrimaryPreferred_non_matching.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/PrimaryPreferred_non_matching.yml
rename to specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/PrimaryPreferred_non_matching.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Secondary.json b/specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Secondary.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Secondary.json
rename to specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Secondary.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Secondary.yml b/specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Secondary.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Secondary.yml
rename to specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Secondary.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/SecondaryPreferred.json b/specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/SecondaryPreferred.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/SecondaryPreferred.json
rename to specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/SecondaryPreferred.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/SecondaryPreferred.yml b/specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/SecondaryPreferred.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/SecondaryPreferred.yml
rename to specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/SecondaryPreferred.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/SecondaryPreferred_non_matching.json b/specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/SecondaryPreferred_non_matching.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/SecondaryPreferred_non_matching.json
rename to specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/SecondaryPreferred_non_matching.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/SecondaryPreferred_non_matching.yml b/specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/SecondaryPreferred_non_matching.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/SecondaryPreferred_non_matching.yml
rename to specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/SecondaryPreferred_non_matching.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Secondary_multi_tags.json b/specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Secondary_multi_tags.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Secondary_multi_tags.json
rename to specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Secondary_multi_tags.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Secondary_multi_tags.yml b/specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Secondary_multi_tags.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Secondary_multi_tags.yml
rename to specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Secondary_multi_tags.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Secondary_multi_tags2.json b/specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Secondary_multi_tags2.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Secondary_multi_tags2.json
rename to specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Secondary_multi_tags2.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Secondary_multi_tags2.yml b/specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Secondary_multi_tags2.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Secondary_multi_tags2.yml
rename to specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Secondary_multi_tags2.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Secondary_non_matching.json b/specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Secondary_non_matching.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Secondary_non_matching.json
rename to specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Secondary_non_matching.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Secondary_non_matching.yml b/specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Secondary_non_matching.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Secondary_non_matching.yml
rename to specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/read/Secondary_non_matching.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/write/SecondaryPreferred.json b/specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/write/SecondaryPreferred.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/write/SecondaryPreferred.json
rename to specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/write/SecondaryPreferred.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/write/SecondaryPreferred.yml b/specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/write/SecondaryPreferred.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/write/SecondaryPreferred.yml
rename to specifications/server-selection/tests/server_selection/ReplicaSetNoPrimary/write/SecondaryPreferred.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/Nearest.json b/specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/Nearest.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/Nearest.json
rename to specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/Nearest.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/Nearest.yml b/specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/Nearest.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/Nearest.yml
rename to specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/Nearest.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/Nearest_multiple.json b/specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/Nearest_multiple.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/Nearest_multiple.json
rename to specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/Nearest_multiple.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/Nearest_multiple.yml b/specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/Nearest_multiple.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/Nearest_multiple.yml
rename to specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/Nearest_multiple.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/Nearest_non_matching.json b/specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/Nearest_non_matching.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/Nearest_non_matching.json
rename to specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/Nearest_non_matching.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/Nearest_non_matching.yml b/specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/Nearest_non_matching.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/Nearest_non_matching.yml
rename to specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/Nearest_non_matching.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/Primary.json b/specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/Primary.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/Primary.json
rename to specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/Primary.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/Primary.yml b/specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/Primary.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/Primary.yml
rename to specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/Primary.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/PrimaryPreferred.json b/specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/PrimaryPreferred.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/PrimaryPreferred.json
rename to specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/PrimaryPreferred.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/PrimaryPreferred.yml b/specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/PrimaryPreferred.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/PrimaryPreferred.yml
rename to specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/PrimaryPreferred.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/PrimaryPreferred_non_matching.json b/specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/PrimaryPreferred_non_matching.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/PrimaryPreferred_non_matching.json
rename to specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/PrimaryPreferred_non_matching.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/PrimaryPreferred_non_matching.yml b/specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/PrimaryPreferred_non_matching.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/PrimaryPreferred_non_matching.yml
rename to specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/PrimaryPreferred_non_matching.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/Secondary.json b/specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/Secondary.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/Secondary.json
rename to specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/Secondary.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/Secondary.yml b/specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/Secondary.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/Secondary.yml
rename to specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/Secondary.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/SecondaryPreferred.json b/specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/SecondaryPreferred.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/SecondaryPreferred.json
rename to specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/SecondaryPreferred.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/SecondaryPreferred.yml b/specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/SecondaryPreferred.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/SecondaryPreferred.yml
rename to specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/SecondaryPreferred.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/SecondaryPreferred_non_matching.json b/specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/SecondaryPreferred_non_matching.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/SecondaryPreferred_non_matching.json
rename to specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/SecondaryPreferred_non_matching.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/SecondaryPreferred_non_matching.yml b/specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/SecondaryPreferred_non_matching.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/SecondaryPreferred_non_matching.yml
rename to specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/SecondaryPreferred_non_matching.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/SecondaryPreferred_tags.json b/specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/SecondaryPreferred_tags.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/SecondaryPreferred_tags.json
rename to specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/SecondaryPreferred_tags.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/SecondaryPreferred_tags.yml b/specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/SecondaryPreferred_tags.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/SecondaryPreferred_tags.yml
rename to specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/SecondaryPreferred_tags.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/Secondary_non_matching.json b/specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/Secondary_non_matching.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/Secondary_non_matching.json
rename to specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/Secondary_non_matching.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/Secondary_non_matching.yml b/specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/Secondary_non_matching.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/Secondary_non_matching.yml
rename to specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/read/Secondary_non_matching.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/write/SecondaryPreferred.json b/specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/write/SecondaryPreferred.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/write/SecondaryPreferred.json
rename to specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/write/SecondaryPreferred.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/write/SecondaryPreferred.yml b/specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/write/SecondaryPreferred.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/write/SecondaryPreferred.yml
rename to specifications/server-selection/tests/server_selection/ReplicaSetWithPrimary/write/SecondaryPreferred.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/Sharded/read/Nearest.json b/specifications/server-selection/tests/server_selection/Sharded/read/Nearest.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/Sharded/read/Nearest.json
rename to specifications/server-selection/tests/server_selection/Sharded/read/Nearest.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/Sharded/read/Nearest.yml b/specifications/server-selection/tests/server_selection/Sharded/read/Nearest.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/Sharded/read/Nearest.yml
rename to specifications/server-selection/tests/server_selection/Sharded/read/Nearest.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/Sharded/read/Primary.json b/specifications/server-selection/tests/server_selection/Sharded/read/Primary.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/Sharded/read/Primary.json
rename to specifications/server-selection/tests/server_selection/Sharded/read/Primary.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/Sharded/read/Primary.yml b/specifications/server-selection/tests/server_selection/Sharded/read/Primary.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/Sharded/read/Primary.yml
rename to specifications/server-selection/tests/server_selection/Sharded/read/Primary.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/Sharded/read/PrimaryPreferred.json b/specifications/server-selection/tests/server_selection/Sharded/read/PrimaryPreferred.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/Sharded/read/PrimaryPreferred.json
rename to specifications/server-selection/tests/server_selection/Sharded/read/PrimaryPreferred.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/Sharded/read/PrimaryPreferred.yml b/specifications/server-selection/tests/server_selection/Sharded/read/PrimaryPreferred.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/Sharded/read/PrimaryPreferred.yml
rename to specifications/server-selection/tests/server_selection/Sharded/read/PrimaryPreferred.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/Sharded/read/Secondary.json b/specifications/server-selection/tests/server_selection/Sharded/read/Secondary.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/Sharded/read/Secondary.json
rename to specifications/server-selection/tests/server_selection/Sharded/read/Secondary.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/Sharded/read/Secondary.yml b/specifications/server-selection/tests/server_selection/Sharded/read/Secondary.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/Sharded/read/Secondary.yml
rename to specifications/server-selection/tests/server_selection/Sharded/read/Secondary.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/Sharded/read/SecondaryPreferred.json b/specifications/server-selection/tests/server_selection/Sharded/read/SecondaryPreferred.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/Sharded/read/SecondaryPreferred.json
rename to specifications/server-selection/tests/server_selection/Sharded/read/SecondaryPreferred.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/Sharded/read/SecondaryPreferred.yml b/specifications/server-selection/tests/server_selection/Sharded/read/SecondaryPreferred.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/Sharded/read/SecondaryPreferred.yml
rename to specifications/server-selection/tests/server_selection/Sharded/read/SecondaryPreferred.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/Sharded/write/Nearest.json b/specifications/server-selection/tests/server_selection/Sharded/write/Nearest.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/Sharded/write/Nearest.json
rename to specifications/server-selection/tests/server_selection/Sharded/write/Nearest.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/Sharded/write/Nearest.yml b/specifications/server-selection/tests/server_selection/Sharded/write/Nearest.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/Sharded/write/Nearest.yml
rename to specifications/server-selection/tests/server_selection/Sharded/write/Nearest.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/Sharded/write/Primary.json b/specifications/server-selection/tests/server_selection/Sharded/write/Primary.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/Sharded/write/Primary.json
rename to specifications/server-selection/tests/server_selection/Sharded/write/Primary.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/Sharded/write/Primary.yml b/specifications/server-selection/tests/server_selection/Sharded/write/Primary.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/Sharded/write/Primary.yml
rename to specifications/server-selection/tests/server_selection/Sharded/write/Primary.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/Sharded/write/PrimaryPreferred.json b/specifications/server-selection/tests/server_selection/Sharded/write/PrimaryPreferred.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/Sharded/write/PrimaryPreferred.json
rename to specifications/server-selection/tests/server_selection/Sharded/write/PrimaryPreferred.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/Sharded/write/PrimaryPreferred.yml b/specifications/server-selection/tests/server_selection/Sharded/write/PrimaryPreferred.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/Sharded/write/PrimaryPreferred.yml
rename to specifications/server-selection/tests/server_selection/Sharded/write/PrimaryPreferred.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/Sharded/write/Secondary.json b/specifications/server-selection/tests/server_selection/Sharded/write/Secondary.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/Sharded/write/Secondary.json
rename to specifications/server-selection/tests/server_selection/Sharded/write/Secondary.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/Sharded/write/Secondary.yml b/specifications/server-selection/tests/server_selection/Sharded/write/Secondary.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/Sharded/write/Secondary.yml
rename to specifications/server-selection/tests/server_selection/Sharded/write/Secondary.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/Sharded/write/SecondaryPreferred.json b/specifications/server-selection/tests/server_selection/Sharded/write/SecondaryPreferred.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/Sharded/write/SecondaryPreferred.json
rename to specifications/server-selection/tests/server_selection/Sharded/write/SecondaryPreferred.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/Sharded/write/SecondaryPreferred.yml b/specifications/server-selection/tests/server_selection/Sharded/write/SecondaryPreferred.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/Sharded/write/SecondaryPreferred.yml
rename to specifications/server-selection/tests/server_selection/Sharded/write/SecondaryPreferred.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/Single/read/SecondaryPreferred.json b/specifications/server-selection/tests/server_selection/Single/read/SecondaryPreferred.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/Single/read/SecondaryPreferred.json
rename to specifications/server-selection/tests/server_selection/Single/read/SecondaryPreferred.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/Single/read/SecondaryPreferred.yml b/specifications/server-selection/tests/server_selection/Single/read/SecondaryPreferred.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/Single/read/SecondaryPreferred.yml
rename to specifications/server-selection/tests/server_selection/Single/read/SecondaryPreferred.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/Single/write/SecondaryPreferred.json b/specifications/server-selection/tests/server_selection/Single/write/SecondaryPreferred.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/Single/write/SecondaryPreferred.json
rename to specifications/server-selection/tests/server_selection/Single/write/SecondaryPreferred.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/Single/write/SecondaryPreferred.yml b/specifications/server-selection/tests/server_selection/Single/write/SecondaryPreferred.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/Single/write/SecondaryPreferred.yml
rename to specifications/server-selection/tests/server_selection/Single/write/SecondaryPreferred.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/Unknown/read/SecondaryPreferred.json b/specifications/server-selection/tests/server_selection/Unknown/read/SecondaryPreferred.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/Unknown/read/SecondaryPreferred.json
rename to specifications/server-selection/tests/server_selection/Unknown/read/SecondaryPreferred.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/Unknown/read/SecondaryPreferred.yml b/specifications/server-selection/tests/server_selection/Unknown/read/SecondaryPreferred.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/Unknown/read/SecondaryPreferred.yml
rename to specifications/server-selection/tests/server_selection/Unknown/read/SecondaryPreferred.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/Unknown/write/SecondaryPreferred.json b/specifications/server-selection/tests/server_selection/Unknown/write/SecondaryPreferred.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/Unknown/write/SecondaryPreferred.json
rename to specifications/server-selection/tests/server_selection/Unknown/write/SecondaryPreferred.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/Unknown/write/SecondaryPreferred.yml b/specifications/server-selection/tests/server_selection/Unknown/write/SecondaryPreferred.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/tests/server_selection/Unknown/write/SecondaryPreferred.yml
rename to specifications/server-selection/tests/server_selection/Unknown/write/SecondaryPreferred.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/sessions/tests/README.rst b/specifications/sessions/tests/README.rst
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/sessions/tests/README.rst
rename to specifications/sessions/tests/README.rst
diff --git a/tests/MongoDB.Driver.Tests/Specifications/sessions/tests/legacy/dirty-session-errors.json b/specifications/sessions/tests/legacy/dirty-session-errors.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/sessions/tests/legacy/dirty-session-errors.json
rename to specifications/sessions/tests/legacy/dirty-session-errors.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/sessions/tests/legacy/dirty-session-errors.yml b/specifications/sessions/tests/legacy/dirty-session-errors.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/sessions/tests/legacy/dirty-session-errors.yml
rename to specifications/sessions/tests/legacy/dirty-session-errors.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/sessions/tests/legacy/server-support.json b/specifications/sessions/tests/legacy/server-support.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/sessions/tests/legacy/server-support.json
rename to specifications/sessions/tests/legacy/server-support.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/sessions/tests/legacy/server-support.yml b/specifications/sessions/tests/legacy/server-support.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/sessions/tests/legacy/server-support.yml
rename to specifications/sessions/tests/legacy/server-support.yml
diff --git a/specifications/sessions/tests/unified/implicit-sessions-default-causal-consistency.json b/specifications/sessions/tests/unified/implicit-sessions-default-causal-consistency.json
new file mode 100644
index 00000000000..517c8ebc63b
--- /dev/null
+++ b/specifications/sessions/tests/unified/implicit-sessions-default-causal-consistency.json
@@ -0,0 +1,318 @@
+{
+ "description": "implicit sessions default causal consistency",
+ "schemaVersion": "1.3",
+ "runOnRequirements": [
+ {
+ "minServerVersion": "4.2",
+ "topologies": [
+ "replicaset",
+ "sharded",
+ "load-balanced"
+ ]
+ }
+ ],
+ "createEntities": [
+ {
+ "client": {
+ "id": "client0",
+ "useMultipleMongoses": false,
+ "observeEvents": [
+ "commandStartedEvent"
+ ]
+ }
+ },
+ {
+ "database": {
+ "id": "database0",
+ "client": "client0",
+ "databaseName": "implicit-cc-tests"
+ }
+ },
+ {
+ "collection": {
+ "id": "collectionDefault",
+ "database": "database0",
+ "collectionName": "coll-default"
+ }
+ },
+ {
+ "collection": {
+ "id": "collectionSnapshot",
+ "database": "database0",
+ "collectionName": "coll-snapshot",
+ "collectionOptions": {
+ "readConcern": {
+ "level": "snapshot"
+ }
+ }
+ }
+ },
+ {
+ "collection": {
+ "id": "collectionlinearizable",
+ "database": "database0",
+ "collectionName": "coll-linearizable",
+ "collectionOptions": {
+ "readConcern": {
+ "level": "linearizable"
+ }
+ }
+ }
+ }
+ ],
+ "initialData": [
+ {
+ "collectionName": "coll-default",
+ "databaseName": "implicit-cc-tests",
+ "documents": [
+ {
+ "_id": 1,
+ "x": "default"
+ }
+ ]
+ },
+ {
+ "collectionName": "coll-snapshot",
+ "databaseName": "implicit-cc-tests",
+ "documents": [
+ {
+ "_id": 1,
+ "x": "snapshot"
+ }
+ ]
+ },
+ {
+ "collectionName": "coll-linearizable",
+ "databaseName": "implicit-cc-tests",
+ "documents": [
+ {
+ "_id": 1,
+ "x": "linearizable"
+ }
+ ]
+ }
+ ],
+ "tests": [
+ {
+ "description": "readConcern is not sent on retried read in implicit session when readConcern level is not specified",
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client0",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 1
+ },
+ "data": {
+ "failCommands": [
+ "find"
+ ],
+ "errorCode": 11600
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "object": "collectionDefault",
+ "arguments": {
+ "filter": {}
+ },
+ "expectResult": [
+ {
+ "_id": 1,
+ "x": "default"
+ }
+ ]
+ }
+ ],
+ "expectEvents": [
+ {
+ "client": "client0",
+ "events": [
+ {
+ "commandStartedEvent": {
+ "command": {
+ "find": "coll-default",
+ "filter": {},
+ "readConcern": {
+ "$$exists": false
+ }
+ },
+ "databaseName": "implicit-cc-tests"
+ }
+ },
+ {
+ "commandStartedEvent": {
+ "command": {
+ "find": "coll-default",
+ "filter": {},
+ "readConcern": {
+ "$$exists": false
+ }
+ },
+ "databaseName": "implicit-cc-tests"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "afterClusterTime is not sent on retried read in implicit session when readConcern level is snapshot",
+ "runOnRequirements": [
+ {
+ "minServerVersion": "5.0"
+ }
+ ],
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client0",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 1
+ },
+ "data": {
+ "failCommands": [
+ "find"
+ ],
+ "errorCode": 11600
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "object": "collectionSnapshot",
+ "arguments": {
+ "filter": {}
+ },
+ "expectResult": [
+ {
+ "_id": 1,
+ "x": "snapshot"
+ }
+ ]
+ }
+ ],
+ "expectEvents": [
+ {
+ "client": "client0",
+ "events": [
+ {
+ "commandStartedEvent": {
+ "command": {
+ "find": "coll-snapshot",
+ "filter": {},
+ "readConcern": {
+ "level": "snapshot",
+ "afterClusterTime": {
+ "$$exists": false
+ }
+ }
+ },
+ "databaseName": "implicit-cc-tests"
+ }
+ },
+ {
+ "commandStartedEvent": {
+ "command": {
+ "find": "coll-snapshot",
+ "filter": {},
+ "readConcern": {
+ "level": "snapshot",
+ "afterClusterTime": {
+ "$$exists": false
+ }
+ }
+ },
+ "databaseName": "implicit-cc-tests"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "description": "afterClusterTime is not sent on retried read in implicit session when readConcern level is linearizable",
+ "operations": [
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client0",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 1
+ },
+ "data": {
+ "failCommands": [
+ "find"
+ ],
+ "errorCode": 11600
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "object": "collectionlinearizable",
+ "arguments": {
+ "filter": {}
+ },
+ "expectResult": [
+ {
+ "_id": 1,
+ "x": "linearizable"
+ }
+ ]
+ }
+ ],
+ "expectEvents": [
+ {
+ "client": "client0",
+ "events": [
+ {
+ "commandStartedEvent": {
+ "command": {
+ "find": "coll-linearizable",
+ "filter": {},
+ "readConcern": {
+ "level": "linearizable",
+ "afterClusterTime": {
+ "$$exists": false
+ }
+ }
+ },
+ "databaseName": "implicit-cc-tests"
+ }
+ },
+ {
+ "commandStartedEvent": {
+ "command": {
+ "find": "coll-linearizable",
+ "filter": {},
+ "readConcern": {
+ "level": "linearizable",
+ "afterClusterTime": {
+ "$$exists": false
+ }
+ }
+ },
+ "databaseName": "implicit-cc-tests"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/specifications/sessions/tests/unified/implicit-sessions-default-causal-consistency.yml b/specifications/sessions/tests/unified/implicit-sessions-default-causal-consistency.yml
new file mode 100644
index 00000000000..052c6dac203
--- /dev/null
+++ b/specifications/sessions/tests/unified/implicit-sessions-default-causal-consistency.yml
@@ -0,0 +1,119 @@
+description: "implicit sessions default causal consistency"
+
+schemaVersion: "1.3"
+
+runOnRequirements:
+ - minServerVersion: "4.2"
+ topologies: [replicaset, sharded, load-balanced]
+
+createEntities:
+ - client:
+ id: &client0 client0
+ useMultipleMongoses: false
+ observeEvents: [commandStartedEvent]
+ - database:
+ id: &database0 database0
+ client: *client0
+ databaseName: &databaseName implicit-cc-tests
+ - collection:
+ id: &collectionDefault collectionDefault
+ database: *database0
+ collectionName: &collectionNameDefault coll-default
+ - collection:
+ id: &collectionSnapshot collectionSnapshot
+ database: *database0
+ collectionName: &collectionNameSnapshot coll-snapshot
+ collectionOptions:
+ readConcern: { level: snapshot }
+ - collection:
+ id: &collectionlinearizable collectionlinearizable
+ database: *database0
+ collectionName: &collectionNamelinearizable coll-linearizable
+ collectionOptions:
+ readConcern: { level: linearizable }
+
+initialData:
+ - collectionName: *collectionNameDefault
+ databaseName: *databaseName
+ documents:
+ - { _id: 1, x: default }
+ - collectionName: *collectionNameSnapshot
+ databaseName: *databaseName
+ documents:
+ - { _id: 1, x: snapshot }
+ - collectionName: *collectionNamelinearizable
+ databaseName: *databaseName
+ documents:
+ - { _id: 1, x: linearizable }
+
+tests:
+ - description: "readConcern is not sent on retried read in implicit session when readConcern level is not specified"
+ operations:
+ - &failPointCommand
+ name: failPoint
+ object: testRunner
+ arguments:
+ client: *client0
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 1 }
+ data:
+ failCommands: [find]
+ errorCode: 11600 #InterruptedAtShutdown
+ - name: find
+ object: *collectionDefault
+ arguments:
+ filter: {}
+ expectResult: [{ _id: 1, x: default }]
+ expectEvents:
+ - client: *client0
+ events:
+ - commandStartedEvent: &commandStartedEventDefault
+ command:
+ find: *collectionNameDefault
+ filter: {}
+ readConcern: { $$exists: false }
+ databaseName: *databaseName
+ - commandStartedEvent: *commandStartedEventDefault
+
+ - description: "afterClusterTime is not sent on retried read in implicit session when readConcern level is snapshot"
+ runOnRequirements:
+ - minServerVersion: "5.0"
+ operations:
+ - *failPointCommand
+ - name: find
+ object: *collectionSnapshot
+ arguments:
+ filter: {}
+ expectResult: [{ _id: 1, x: snapshot }]
+ expectEvents:
+ - client: *client0
+ events:
+ - commandStartedEvent: &commandStartedEventSnapshot
+ command:
+ find: *collectionNameSnapshot
+ filter: {}
+ readConcern:
+ { level: snapshot, afterClusterTime: { $$exists: false } }
+ databaseName: *databaseName
+ - commandStartedEvent: *commandStartedEventSnapshot
+
+ - description: "afterClusterTime is not sent on retried read in implicit session when readConcern level is linearizable"
+ operations:
+ - *failPointCommand
+ - name: find
+ object: *collectionlinearizable
+ arguments:
+ filter: {}
+ expectResult: [{ _id: 1, x: linearizable }]
+ expectEvents:
+ - client: *client0
+ events:
+ - commandStartedEvent: &commandStartedEventLinearizable
+ command:
+ find: *collectionNamelinearizable
+ filter: {}
+ readConcern:
+ { level: linearizable, afterClusterTime: { $$exists: false } }
+ databaseName: *databaseName
+ - commandStartedEvent: *commandStartedEventLinearizable
diff --git a/tests/MongoDB.Driver.Tests/Specifications/sessions/tests/unified/snapshot-sessions-not-supported-client-error.json b/specifications/sessions/tests/unified/snapshot-sessions-not-supported-client-error.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/sessions/tests/unified/snapshot-sessions-not-supported-client-error.json
rename to specifications/sessions/tests/unified/snapshot-sessions-not-supported-client-error.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/sessions/tests/unified/snapshot-sessions-not-supported-client-error.yml b/specifications/sessions/tests/unified/snapshot-sessions-not-supported-client-error.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/sessions/tests/unified/snapshot-sessions-not-supported-client-error.yml
rename to specifications/sessions/tests/unified/snapshot-sessions-not-supported-client-error.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/sessions/tests/unified/snapshot-sessions-not-supported-server-error.json b/specifications/sessions/tests/unified/snapshot-sessions-not-supported-server-error.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/sessions/tests/unified/snapshot-sessions-not-supported-server-error.json
rename to specifications/sessions/tests/unified/snapshot-sessions-not-supported-server-error.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/sessions/tests/unified/snapshot-sessions-not-supported-server-error.yml b/specifications/sessions/tests/unified/snapshot-sessions-not-supported-server-error.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/sessions/tests/unified/snapshot-sessions-not-supported-server-error.yml
rename to specifications/sessions/tests/unified/snapshot-sessions-not-supported-server-error.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/sessions/tests/unified/snapshot-sessions-unsupported-ops.json b/specifications/sessions/tests/unified/snapshot-sessions-unsupported-ops.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/sessions/tests/unified/snapshot-sessions-unsupported-ops.json
rename to specifications/sessions/tests/unified/snapshot-sessions-unsupported-ops.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/sessions/tests/unified/snapshot-sessions-unsupported-ops.yml b/specifications/sessions/tests/unified/snapshot-sessions-unsupported-ops.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/sessions/tests/unified/snapshot-sessions-unsupported-ops.yml
rename to specifications/sessions/tests/unified/snapshot-sessions-unsupported-ops.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/sessions/tests/unified/snapshot-sessions.json b/specifications/sessions/tests/unified/snapshot-sessions.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/sessions/tests/unified/snapshot-sessions.json
rename to specifications/sessions/tests/unified/snapshot-sessions.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/sessions/tests/unified/snapshot-sessions.yml b/specifications/sessions/tests/unified/snapshot-sessions.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/sessions/tests/unified/snapshot-sessions.yml
rename to specifications/sessions/tests/unified/snapshot-sessions.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions-convenient-api/tests/README.rst b/specifications/transactions-convenient-api/tests/README.rst
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions-convenient-api/tests/README.rst
rename to specifications/transactions-convenient-api/tests/README.rst
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions-convenient-api/tests/callback-aborts.json b/specifications/transactions-convenient-api/tests/callback-aborts.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions-convenient-api/tests/callback-aborts.json
rename to specifications/transactions-convenient-api/tests/callback-aborts.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions-convenient-api/tests/callback-aborts.yml b/specifications/transactions-convenient-api/tests/callback-aborts.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions-convenient-api/tests/callback-aborts.yml
rename to specifications/transactions-convenient-api/tests/callback-aborts.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions-convenient-api/tests/callback-commits.json b/specifications/transactions-convenient-api/tests/callback-commits.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions-convenient-api/tests/callback-commits.json
rename to specifications/transactions-convenient-api/tests/callback-commits.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions-convenient-api/tests/callback-commits.yml b/specifications/transactions-convenient-api/tests/callback-commits.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions-convenient-api/tests/callback-commits.yml
rename to specifications/transactions-convenient-api/tests/callback-commits.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions-convenient-api/tests/callback-retry.json b/specifications/transactions-convenient-api/tests/callback-retry.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions-convenient-api/tests/callback-retry.json
rename to specifications/transactions-convenient-api/tests/callback-retry.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions-convenient-api/tests/callback-retry.yml b/specifications/transactions-convenient-api/tests/callback-retry.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions-convenient-api/tests/callback-retry.yml
rename to specifications/transactions-convenient-api/tests/callback-retry.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions-convenient-api/tests/commit-retry.json b/specifications/transactions-convenient-api/tests/commit-retry.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions-convenient-api/tests/commit-retry.json
rename to specifications/transactions-convenient-api/tests/commit-retry.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions-convenient-api/tests/commit-retry.yml b/specifications/transactions-convenient-api/tests/commit-retry.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions-convenient-api/tests/commit-retry.yml
rename to specifications/transactions-convenient-api/tests/commit-retry.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions-convenient-api/tests/commit-transienttransactionerror-4.2.json b/specifications/transactions-convenient-api/tests/commit-transienttransactionerror-4.2.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions-convenient-api/tests/commit-transienttransactionerror-4.2.json
rename to specifications/transactions-convenient-api/tests/commit-transienttransactionerror-4.2.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions-convenient-api/tests/commit-transienttransactionerror-4.2.yml b/specifications/transactions-convenient-api/tests/commit-transienttransactionerror-4.2.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions-convenient-api/tests/commit-transienttransactionerror-4.2.yml
rename to specifications/transactions-convenient-api/tests/commit-transienttransactionerror-4.2.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions-convenient-api/tests/commit-transienttransactionerror.json b/specifications/transactions-convenient-api/tests/commit-transienttransactionerror.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions-convenient-api/tests/commit-transienttransactionerror.json
rename to specifications/transactions-convenient-api/tests/commit-transienttransactionerror.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions-convenient-api/tests/commit-transienttransactionerror.yml b/specifications/transactions-convenient-api/tests/commit-transienttransactionerror.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions-convenient-api/tests/commit-transienttransactionerror.yml
rename to specifications/transactions-convenient-api/tests/commit-transienttransactionerror.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions-convenient-api/tests/commit-writeconcernerror.json b/specifications/transactions-convenient-api/tests/commit-writeconcernerror.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions-convenient-api/tests/commit-writeconcernerror.json
rename to specifications/transactions-convenient-api/tests/commit-writeconcernerror.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions-convenient-api/tests/commit-writeconcernerror.yml b/specifications/transactions-convenient-api/tests/commit-writeconcernerror.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions-convenient-api/tests/commit-writeconcernerror.yml
rename to specifications/transactions-convenient-api/tests/commit-writeconcernerror.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions-convenient-api/tests/commit.json b/specifications/transactions-convenient-api/tests/commit.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions-convenient-api/tests/commit.json
rename to specifications/transactions-convenient-api/tests/commit.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions-convenient-api/tests/commit.yml b/specifications/transactions-convenient-api/tests/commit.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions-convenient-api/tests/commit.yml
rename to specifications/transactions-convenient-api/tests/commit.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions-convenient-api/tests/transaction-options.json b/specifications/transactions-convenient-api/tests/transaction-options.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions-convenient-api/tests/transaction-options.json
rename to specifications/transactions-convenient-api/tests/transaction-options.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions-convenient-api/tests/transaction-options.yml b/specifications/transactions-convenient-api/tests/transaction-options.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions-convenient-api/tests/transaction-options.yml
rename to specifications/transactions-convenient-api/tests/transaction-options.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/README.rst b/specifications/transactions/tests/README.rst
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/README.rst
rename to specifications/transactions/tests/README.rst
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/abort.json b/specifications/transactions/tests/legacy/abort.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/abort.json
rename to specifications/transactions/tests/legacy/abort.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/abort.yml b/specifications/transactions/tests/legacy/abort.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/abort.yml
rename to specifications/transactions/tests/legacy/abort.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/bulk.json b/specifications/transactions/tests/legacy/bulk.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/bulk.json
rename to specifications/transactions/tests/legacy/bulk.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/bulk.yml b/specifications/transactions/tests/legacy/bulk.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/bulk.yml
rename to specifications/transactions/tests/legacy/bulk.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/causal-consistency.json b/specifications/transactions/tests/legacy/causal-consistency.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/causal-consistency.json
rename to specifications/transactions/tests/legacy/causal-consistency.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/causal-consistency.yml b/specifications/transactions/tests/legacy/causal-consistency.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/causal-consistency.yml
rename to specifications/transactions/tests/legacy/causal-consistency.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/commit.json b/specifications/transactions/tests/legacy/commit.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/commit.json
rename to specifications/transactions/tests/legacy/commit.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/commit.yml b/specifications/transactions/tests/legacy/commit.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/commit.yml
rename to specifications/transactions/tests/legacy/commit.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/count.json b/specifications/transactions/tests/legacy/count.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/count.json
rename to specifications/transactions/tests/legacy/count.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/count.yml b/specifications/transactions/tests/legacy/count.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/count.yml
rename to specifications/transactions/tests/legacy/count.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/create-collection.json b/specifications/transactions/tests/legacy/create-collection.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/create-collection.json
rename to specifications/transactions/tests/legacy/create-collection.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/create-collection.yml b/specifications/transactions/tests/legacy/create-collection.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/create-collection.yml
rename to specifications/transactions/tests/legacy/create-collection.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/create-index.json b/specifications/transactions/tests/legacy/create-index.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/create-index.json
rename to specifications/transactions/tests/legacy/create-index.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/create-index.yml b/specifications/transactions/tests/legacy/create-index.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/create-index.yml
rename to specifications/transactions/tests/legacy/create-index.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/delete.json b/specifications/transactions/tests/legacy/delete.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/delete.json
rename to specifications/transactions/tests/legacy/delete.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/delete.yml b/specifications/transactions/tests/legacy/delete.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/delete.yml
rename to specifications/transactions/tests/legacy/delete.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/error-labels.json b/specifications/transactions/tests/legacy/error-labels.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/error-labels.json
rename to specifications/transactions/tests/legacy/error-labels.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/error-labels.yml b/specifications/transactions/tests/legacy/error-labels.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/error-labels.yml
rename to specifications/transactions/tests/legacy/error-labels.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/errors-client.json b/specifications/transactions/tests/legacy/errors-client.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/errors-client.json
rename to specifications/transactions/tests/legacy/errors-client.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/errors-client.yml b/specifications/transactions/tests/legacy/errors-client.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/errors-client.yml
rename to specifications/transactions/tests/legacy/errors-client.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/errors.json b/specifications/transactions/tests/legacy/errors.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/errors.json
rename to specifications/transactions/tests/legacy/errors.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/errors.yml b/specifications/transactions/tests/legacy/errors.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/errors.yml
rename to specifications/transactions/tests/legacy/errors.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/findOneAndDelete.json b/specifications/transactions/tests/legacy/findOneAndDelete.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/findOneAndDelete.json
rename to specifications/transactions/tests/legacy/findOneAndDelete.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/findOneAndDelete.yml b/specifications/transactions/tests/legacy/findOneAndDelete.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/findOneAndDelete.yml
rename to specifications/transactions/tests/legacy/findOneAndDelete.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/findOneAndReplace.json b/specifications/transactions/tests/legacy/findOneAndReplace.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/findOneAndReplace.json
rename to specifications/transactions/tests/legacy/findOneAndReplace.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/findOneAndReplace.yml b/specifications/transactions/tests/legacy/findOneAndReplace.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/findOneAndReplace.yml
rename to specifications/transactions/tests/legacy/findOneAndReplace.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/findOneAndUpdate.json b/specifications/transactions/tests/legacy/findOneAndUpdate.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/findOneAndUpdate.json
rename to specifications/transactions/tests/legacy/findOneAndUpdate.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/findOneAndUpdate.yml b/specifications/transactions/tests/legacy/findOneAndUpdate.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/findOneAndUpdate.yml
rename to specifications/transactions/tests/legacy/findOneAndUpdate.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/insert.json b/specifications/transactions/tests/legacy/insert.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/insert.json
rename to specifications/transactions/tests/legacy/insert.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/insert.yml b/specifications/transactions/tests/legacy/insert.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/insert.yml
rename to specifications/transactions/tests/legacy/insert.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/isolation.json b/specifications/transactions/tests/legacy/isolation.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/isolation.json
rename to specifications/transactions/tests/legacy/isolation.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/isolation.yml b/specifications/transactions/tests/legacy/isolation.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/isolation.yml
rename to specifications/transactions/tests/legacy/isolation.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/mongos-pin-auto-tests.py b/specifications/transactions/tests/legacy/mongos-pin-auto-tests.py
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/mongos-pin-auto-tests.py
rename to specifications/transactions/tests/legacy/mongos-pin-auto-tests.py
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/mongos-pin-auto.json b/specifications/transactions/tests/legacy/mongos-pin-auto.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/mongos-pin-auto.json
rename to specifications/transactions/tests/legacy/mongos-pin-auto.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/mongos-pin-auto.yml b/specifications/transactions/tests/legacy/mongos-pin-auto.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/mongos-pin-auto.yml
rename to specifications/transactions/tests/legacy/mongos-pin-auto.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/mongos-recovery-token.json b/specifications/transactions/tests/legacy/mongos-recovery-token.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/mongos-recovery-token.json
rename to specifications/transactions/tests/legacy/mongos-recovery-token.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/mongos-recovery-token.yml b/specifications/transactions/tests/legacy/mongos-recovery-token.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/mongos-recovery-token.yml
rename to specifications/transactions/tests/legacy/mongos-recovery-token.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/pin-mongos.json b/specifications/transactions/tests/legacy/pin-mongos.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/pin-mongos.json
rename to specifications/transactions/tests/legacy/pin-mongos.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/pin-mongos.yml b/specifications/transactions/tests/legacy/pin-mongos.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/pin-mongos.yml
rename to specifications/transactions/tests/legacy/pin-mongos.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/read-concern.json b/specifications/transactions/tests/legacy/read-concern.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/read-concern.json
rename to specifications/transactions/tests/legacy/read-concern.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/read-concern.yml b/specifications/transactions/tests/legacy/read-concern.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/read-concern.yml
rename to specifications/transactions/tests/legacy/read-concern.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/read-pref.json b/specifications/transactions/tests/legacy/read-pref.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/read-pref.json
rename to specifications/transactions/tests/legacy/read-pref.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/read-pref.yml b/specifications/transactions/tests/legacy/read-pref.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/read-pref.yml
rename to specifications/transactions/tests/legacy/read-pref.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/reads.json b/specifications/transactions/tests/legacy/reads.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/reads.json
rename to specifications/transactions/tests/legacy/reads.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/reads.yml b/specifications/transactions/tests/legacy/reads.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/reads.yml
rename to specifications/transactions/tests/legacy/reads.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/retryable-abort-errorLabels.json b/specifications/transactions/tests/legacy/retryable-abort-errorLabels.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/retryable-abort-errorLabels.json
rename to specifications/transactions/tests/legacy/retryable-abort-errorLabels.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/retryable-abort-errorLabels.yml b/specifications/transactions/tests/legacy/retryable-abort-errorLabels.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/retryable-abort-errorLabels.yml
rename to specifications/transactions/tests/legacy/retryable-abort-errorLabels.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/retryable-abort.json b/specifications/transactions/tests/legacy/retryable-abort.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/retryable-abort.json
rename to specifications/transactions/tests/legacy/retryable-abort.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/retryable-abort.yml b/specifications/transactions/tests/legacy/retryable-abort.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/retryable-abort.yml
rename to specifications/transactions/tests/legacy/retryable-abort.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/retryable-commit-errorLabels.json b/specifications/transactions/tests/legacy/retryable-commit-errorLabels.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/retryable-commit-errorLabels.json
rename to specifications/transactions/tests/legacy/retryable-commit-errorLabels.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/retryable-commit-errorLabels.yml b/specifications/transactions/tests/legacy/retryable-commit-errorLabels.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/retryable-commit-errorLabels.yml
rename to specifications/transactions/tests/legacy/retryable-commit-errorLabels.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/retryable-commit.json b/specifications/transactions/tests/legacy/retryable-commit.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/retryable-commit.json
rename to specifications/transactions/tests/legacy/retryable-commit.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/retryable-commit.yml b/specifications/transactions/tests/legacy/retryable-commit.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/retryable-commit.yml
rename to specifications/transactions/tests/legacy/retryable-commit.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/retryable-writes.json b/specifications/transactions/tests/legacy/retryable-writes.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/retryable-writes.json
rename to specifications/transactions/tests/legacy/retryable-writes.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/retryable-writes.yml b/specifications/transactions/tests/legacy/retryable-writes.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/retryable-writes.yml
rename to specifications/transactions/tests/legacy/retryable-writes.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/run-command.json b/specifications/transactions/tests/legacy/run-command.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/run-command.json
rename to specifications/transactions/tests/legacy/run-command.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/run-command.yml b/specifications/transactions/tests/legacy/run-command.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/run-command.yml
rename to specifications/transactions/tests/legacy/run-command.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/transaction-options-repl.json b/specifications/transactions/tests/legacy/transaction-options-repl.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/transaction-options-repl.json
rename to specifications/transactions/tests/legacy/transaction-options-repl.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/transaction-options-repl.yml b/specifications/transactions/tests/legacy/transaction-options-repl.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/transaction-options-repl.yml
rename to specifications/transactions/tests/legacy/transaction-options-repl.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/transaction-options.json b/specifications/transactions/tests/legacy/transaction-options.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/transaction-options.json
rename to specifications/transactions/tests/legacy/transaction-options.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/transaction-options.yml b/specifications/transactions/tests/legacy/transaction-options.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/transaction-options.yml
rename to specifications/transactions/tests/legacy/transaction-options.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/update.json b/specifications/transactions/tests/legacy/update.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/update.json
rename to specifications/transactions/tests/legacy/update.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/update.yml b/specifications/transactions/tests/legacy/update.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/update.yml
rename to specifications/transactions/tests/legacy/update.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/write-concern.json b/specifications/transactions/tests/legacy/write-concern.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/write-concern.json
rename to specifications/transactions/tests/legacy/write-concern.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/write-concern.yml b/specifications/transactions/tests/legacy/write-concern.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/legacy/write-concern.yml
rename to specifications/transactions/tests/legacy/write-concern.yml
diff --git a/specifications/transactions/tests/unified/do-not-retry-read-in-transaction.json b/specifications/transactions/tests/unified/do-not-retry-read-in-transaction.json
new file mode 100644
index 00000000000..6d9dc704b81
--- /dev/null
+++ b/specifications/transactions/tests/unified/do-not-retry-read-in-transaction.json
@@ -0,0 +1,115 @@
+{
+ "description": "do not retry read in a transaction",
+ "schemaVersion": "1.4",
+ "runOnRequirements": [
+ {
+ "minServerVersion": "4.0.0",
+ "topologies": [
+ "replicaset"
+ ]
+ },
+ {
+ "minServerVersion": "4.2.0",
+ "topologies": [
+ "sharded",
+ "load-balanced"
+ ]
+ }
+ ],
+ "createEntities": [
+ {
+ "client": {
+ "id": "client0",
+ "useMultipleMongoses": false,
+ "observeEvents": [
+ "commandStartedEvent"
+ ],
+ "uriOptions": {
+ "retryReads": true
+ }
+ }
+ },
+ {
+ "database": {
+ "id": "database0",
+ "client": "client0",
+ "databaseName": "retryable-read-in-transaction-test"
+ }
+ },
+ {
+ "collection": {
+ "id": "collection0",
+ "database": "database0",
+ "collectionName": "coll"
+ }
+ },
+ {
+ "session": {
+ "id": "session0",
+ "client": "client0"
+ }
+ }
+ ],
+ "tests": [
+ {
+ "description": "find does not retry in a transaction",
+ "operations": [
+ {
+ "name": "startTransaction",
+ "object": "session0"
+ },
+ {
+ "name": "failPoint",
+ "object": "testRunner",
+ "arguments": {
+ "client": "client0",
+ "failPoint": {
+ "configureFailPoint": "failCommand",
+ "mode": {
+ "times": 1
+ },
+ "data": {
+ "failCommands": [
+ "find"
+ ],
+ "closeConnection": true
+ }
+ }
+ }
+ },
+ {
+ "name": "find",
+ "object": "collection0",
+ "arguments": {
+ "filter": {},
+ "session": "session0"
+ },
+ "expectError": {
+ "isError": true,
+ "errorLabelsContain": [
+ "TransientTransactionError"
+ ]
+ }
+ }
+ ],
+ "expectEvents": [
+ {
+ "client": "client0",
+ "events": [
+ {
+ "commandStartedEvent": {
+ "command": {
+ "find": "coll",
+ "filter": {},
+ "startTransaction": true
+ },
+ "commandName": "find",
+ "databaseName": "retryable-read-in-transaction-test"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/specifications/transactions/tests/unified/do-not-retry-read-in-transaction.yml b/specifications/transactions/tests/unified/do-not-retry-read-in-transaction.yml
new file mode 100644
index 00000000000..e30df0b2904
--- /dev/null
+++ b/specifications/transactions/tests/unified/do-not-retry-read-in-transaction.yml
@@ -0,0 +1,64 @@
+description: "do not retry read in a transaction"
+
+schemaVersion: "1.4"
+
+runOnRequirements:
+ - minServerVersion: "4.0.0"
+ topologies: [ replicaset ]
+ - minServerVersion: "4.2.0"
+ topologies: [ sharded, load-balanced ]
+
+createEntities:
+ - client:
+ id: &client0 client0
+ useMultipleMongoses: false
+ observeEvents: [commandStartedEvent]
+ uriOptions: { retryReads: true }
+ - database:
+ id: &database0 database0
+ client: *client0
+ databaseName: &databaseName retryable-read-in-transaction-test
+ - collection:
+ id: &collection0 collection0
+ database: *database0
+ collectionName: &collectionName coll
+ - session:
+ id: &session0 session0
+ client: *client0
+
+tests:
+ - description: "find does not retry in a transaction"
+ operations:
+
+ - name: startTransaction
+ object: *session0
+
+ - name: failPoint # fail the following find command
+ object: testRunner
+ arguments:
+ client: *client0
+ failPoint:
+ configureFailPoint: failCommand
+ mode: { times: 1 }
+ data:
+ failCommands: [find]
+ closeConnection: true
+
+ - name: find
+ object: *collection0
+ arguments:
+ filter: {}
+ session: *session0
+ expectError:
+ isError: true
+ errorLabelsContain: ["TransientTransactionError"]
+ expectEvents:
+ - client: *client0
+ events:
+ - commandStartedEvent:
+ command:
+ find: *collectionName
+ filter: {}
+ startTransaction: true
+ commandName: find
+ databaseName: *databaseName
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/unified/mongos-unpin.json b/specifications/transactions/tests/unified/mongos-unpin.json
similarity index 87%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/unified/mongos-unpin.json
rename to specifications/transactions/tests/unified/mongos-unpin.json
index 3268394c1b2..4f7ae43794a 100644
--- a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/unified/mongos-unpin.json
+++ b/specifications/transactions/tests/unified/mongos-unpin.json
@@ -108,6 +108,24 @@
"arguments": {
"session": "session0"
}
+ },
+ {
+ "name": "startTransaction",
+ "object": "session0"
+ },
+ {
+ "name": "insertOne",
+ "object": "collection0",
+ "arguments": {
+ "document": {
+ "x": 1
+ },
+ "session": "session0"
+ }
+ },
+ {
+ "name": "abortTransaction",
+ "object": "session0"
}
]
},
@@ -142,7 +160,7 @@
]
},
{
- "description": "unpin after TransientTransactionError error on abort",
+ "description": "unpin after non-transient error on abort",
"runOnRequirements": [
{
"serverless": "forbid"
@@ -192,11 +210,29 @@
"arguments": {
"session": "session0"
}
+ },
+ {
+ "name": "startTransaction",
+ "object": "session0"
+ },
+ {
+ "name": "insertOne",
+ "object": "collection0",
+ "arguments": {
+ "document": {
+ "x": 1
+ },
+ "session": "session0"
+ }
+ },
+ {
+ "name": "abortTransaction",
+ "object": "session0"
}
]
},
{
- "description": "unpin after non-transient error on abort",
+ "description": "unpin after TransientTransactionError error on abort",
"operations": [
{
"name": "startTransaction",
@@ -241,6 +277,24 @@
"arguments": {
"session": "session0"
}
+ },
+ {
+ "name": "startTransaction",
+ "object": "session0"
+ },
+ {
+ "name": "insertOne",
+ "object": "collection0",
+ "arguments": {
+ "document": {
+ "x": 1
+ },
+ "session": "session0"
+ }
+ },
+ {
+ "name": "abortTransaction",
+ "object": "session0"
}
]
},
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/unified/mongos-unpin.yml b/specifications/transactions/tests/unified/mongos-unpin.yml
similarity index 98%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/unified/mongos-unpin.yml
rename to specifications/transactions/tests/unified/mongos-unpin.yml
index 99b7fb51fbd..c13798acaa5 100644
--- a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/unified/mongos-unpin.yml
+++ b/specifications/transactions/tests/unified/mongos-unpin.yml
@@ -85,7 +85,7 @@ tests:
- *abortTransaction
- *assertNoPinnedServer
- - description: unpin after TransientTransactionError error on abort
+ - description: unpin after non-transient error on abort
runOnRequirements:
# serverless proxy doesn't append error labels to errors in transactions
# caused by failpoints (CLOUDP-88216)
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/unified/retryable-abort-handshake.json b/specifications/transactions/tests/unified/retryable-abort-handshake.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/unified/retryable-abort-handshake.json
rename to specifications/transactions/tests/unified/retryable-abort-handshake.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/unified/retryable-abort-handshake.yml b/specifications/transactions/tests/unified/retryable-abort-handshake.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/unified/retryable-abort-handshake.yml
rename to specifications/transactions/tests/unified/retryable-abort-handshake.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/unified/retryable-commit-handshake.json b/specifications/transactions/tests/unified/retryable-commit-handshake.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/unified/retryable-commit-handshake.json
rename to specifications/transactions/tests/unified/retryable-commit-handshake.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/transactions/tests/unified/retryable-commit-handshake.yml b/specifications/transactions/tests/unified/retryable-commit-handshake.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/transactions/tests/unified/retryable-commit-handshake.yml
rename to specifications/transactions/tests/unified/retryable-commit-handshake.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/README.rst b/specifications/unified-test-format/tests/README.rst
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/README.rst
rename to specifications/unified-test-format/tests/README.rst
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/assertNumberConnectionsCheckedOut.json b/specifications/unified-test-format/tests/valid-fail/assertNumberConnectionsCheckedOut.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/assertNumberConnectionsCheckedOut.json
rename to specifications/unified-test-format/tests/valid-fail/assertNumberConnectionsCheckedOut.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/assertNumberConnectionsCheckedOut.yml b/specifications/unified-test-format/tests/valid-fail/assertNumberConnectionsCheckedOut.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/assertNumberConnectionsCheckedOut.yml
rename to specifications/unified-test-format/tests/valid-fail/assertNumberConnectionsCheckedOut.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/entity-bucket-database-undefined.json b/specifications/unified-test-format/tests/valid-fail/entity-bucket-database-undefined.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/entity-bucket-database-undefined.json
rename to specifications/unified-test-format/tests/valid-fail/entity-bucket-database-undefined.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/entity-bucket-database-undefined.yml b/specifications/unified-test-format/tests/valid-fail/entity-bucket-database-undefined.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/entity-bucket-database-undefined.yml
rename to specifications/unified-test-format/tests/valid-fail/entity-bucket-database-undefined.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/entity-client-apiVersion-unsupported.json b/specifications/unified-test-format/tests/valid-fail/entity-client-apiVersion-unsupported.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/entity-client-apiVersion-unsupported.json
rename to specifications/unified-test-format/tests/valid-fail/entity-client-apiVersion-unsupported.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/entity-client-apiVersion-unsupported.yml b/specifications/unified-test-format/tests/valid-fail/entity-client-apiVersion-unsupported.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/entity-client-apiVersion-unsupported.yml
rename to specifications/unified-test-format/tests/valid-fail/entity-client-apiVersion-unsupported.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/entity-collection-database-undefined.json b/specifications/unified-test-format/tests/valid-fail/entity-collection-database-undefined.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/entity-collection-database-undefined.json
rename to specifications/unified-test-format/tests/valid-fail/entity-collection-database-undefined.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/entity-collection-database-undefined.yml b/specifications/unified-test-format/tests/valid-fail/entity-collection-database-undefined.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/entity-collection-database-undefined.yml
rename to specifications/unified-test-format/tests/valid-fail/entity-collection-database-undefined.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/entity-database-client-undefined.json b/specifications/unified-test-format/tests/valid-fail/entity-database-client-undefined.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/entity-database-client-undefined.json
rename to specifications/unified-test-format/tests/valid-fail/entity-database-client-undefined.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/entity-database-client-undefined.yml b/specifications/unified-test-format/tests/valid-fail/entity-database-client-undefined.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/entity-database-client-undefined.yml
rename to specifications/unified-test-format/tests/valid-fail/entity-database-client-undefined.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/entity-findCursor-malformed.json b/specifications/unified-test-format/tests/valid-fail/entity-findCursor-malformed.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/entity-findCursor-malformed.json
rename to specifications/unified-test-format/tests/valid-fail/entity-findCursor-malformed.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/entity-findCursor-malformed.yml b/specifications/unified-test-format/tests/valid-fail/entity-findCursor-malformed.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/entity-findCursor-malformed.yml
rename to specifications/unified-test-format/tests/valid-fail/entity-findCursor-malformed.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/entity-findCursor.json b/specifications/unified-test-format/tests/valid-fail/entity-findCursor.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/entity-findCursor.json
rename to specifications/unified-test-format/tests/valid-fail/entity-findCursor.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/entity-findCursor.yml b/specifications/unified-test-format/tests/valid-fail/entity-findCursor.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/entity-findCursor.yml
rename to specifications/unified-test-format/tests/valid-fail/entity-findCursor.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/entity-session-client-undefined.json b/specifications/unified-test-format/tests/valid-fail/entity-session-client-undefined.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/entity-session-client-undefined.json
rename to specifications/unified-test-format/tests/valid-fail/entity-session-client-undefined.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/entity-session-client-undefined.yml b/specifications/unified-test-format/tests/valid-fail/entity-session-client-undefined.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/entity-session-client-undefined.yml
rename to specifications/unified-test-format/tests/valid-fail/entity-session-client-undefined.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/ignoreResultAndError-malformed.json b/specifications/unified-test-format/tests/valid-fail/ignoreResultAndError-malformed.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/ignoreResultAndError-malformed.json
rename to specifications/unified-test-format/tests/valid-fail/ignoreResultAndError-malformed.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/ignoreResultAndError-malformed.yml b/specifications/unified-test-format/tests/valid-fail/ignoreResultAndError-malformed.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/ignoreResultAndError-malformed.yml
rename to specifications/unified-test-format/tests/valid-fail/ignoreResultAndError-malformed.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/ignoreResultAndError.json b/specifications/unified-test-format/tests/valid-fail/ignoreResultAndError.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/ignoreResultAndError.json
rename to specifications/unified-test-format/tests/valid-fail/ignoreResultAndError.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/ignoreResultAndError.yml b/specifications/unified-test-format/tests/valid-fail/ignoreResultAndError.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/ignoreResultAndError.yml
rename to specifications/unified-test-format/tests/valid-fail/ignoreResultAndError.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/kmsProviders-missing_aws_kms_credentials.json b/specifications/unified-test-format/tests/valid-fail/kmsProviders-missing_aws_kms_credentials.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/kmsProviders-missing_aws_kms_credentials.json
rename to specifications/unified-test-format/tests/valid-fail/kmsProviders-missing_aws_kms_credentials.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/kmsProviders-missing_aws_kms_credentials.yml b/specifications/unified-test-format/tests/valid-fail/kmsProviders-missing_aws_kms_credentials.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/kmsProviders-missing_aws_kms_credentials.yml
rename to specifications/unified-test-format/tests/valid-fail/kmsProviders-missing_aws_kms_credentials.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/kmsProviders-missing_azure_kms_credentials.json b/specifications/unified-test-format/tests/valid-fail/kmsProviders-missing_azure_kms_credentials.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/kmsProviders-missing_azure_kms_credentials.json
rename to specifications/unified-test-format/tests/valid-fail/kmsProviders-missing_azure_kms_credentials.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/kmsProviders-missing_azure_kms_credentials.yml b/specifications/unified-test-format/tests/valid-fail/kmsProviders-missing_azure_kms_credentials.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/kmsProviders-missing_azure_kms_credentials.yml
rename to specifications/unified-test-format/tests/valid-fail/kmsProviders-missing_azure_kms_credentials.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/kmsProviders-missing_gcp_kms_credentials.json b/specifications/unified-test-format/tests/valid-fail/kmsProviders-missing_gcp_kms_credentials.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/kmsProviders-missing_gcp_kms_credentials.json
rename to specifications/unified-test-format/tests/valid-fail/kmsProviders-missing_gcp_kms_credentials.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/kmsProviders-missing_gcp_kms_credentials.yml b/specifications/unified-test-format/tests/valid-fail/kmsProviders-missing_gcp_kms_credentials.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/kmsProviders-missing_gcp_kms_credentials.yml
rename to specifications/unified-test-format/tests/valid-fail/kmsProviders-missing_gcp_kms_credentials.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/kmsProviders-no_kms.json b/specifications/unified-test-format/tests/valid-fail/kmsProviders-no_kms.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/kmsProviders-no_kms.json
rename to specifications/unified-test-format/tests/valid-fail/kmsProviders-no_kms.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/kmsProviders-no_kms.yml b/specifications/unified-test-format/tests/valid-fail/kmsProviders-no_kms.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/kmsProviders-no_kms.yml
rename to specifications/unified-test-format/tests/valid-fail/kmsProviders-no_kms.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/operation-failure.json b/specifications/unified-test-format/tests/valid-fail/operation-failure.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/operation-failure.json
rename to specifications/unified-test-format/tests/valid-fail/operation-failure.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/operation-failure.yml b/specifications/unified-test-format/tests/valid-fail/operation-failure.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/operation-failure.yml
rename to specifications/unified-test-format/tests/valid-fail/operation-failure.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/operation-unsupported.json b/specifications/unified-test-format/tests/valid-fail/operation-unsupported.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/operation-unsupported.json
rename to specifications/unified-test-format/tests/valid-fail/operation-unsupported.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/operation-unsupported.yml b/specifications/unified-test-format/tests/valid-fail/operation-unsupported.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/operation-unsupported.yml
rename to specifications/unified-test-format/tests/valid-fail/operation-unsupported.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/returnDocument-enum-invalid.json b/specifications/unified-test-format/tests/valid-fail/returnDocument-enum-invalid.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/returnDocument-enum-invalid.json
rename to specifications/unified-test-format/tests/valid-fail/returnDocument-enum-invalid.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/returnDocument-enum-invalid.yml b/specifications/unified-test-format/tests/valid-fail/returnDocument-enum-invalid.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/returnDocument-enum-invalid.yml
rename to specifications/unified-test-format/tests/valid-fail/returnDocument-enum-invalid.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/schemaVersion-unsupported.json b/specifications/unified-test-format/tests/valid-fail/schemaVersion-unsupported.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/schemaVersion-unsupported.json
rename to specifications/unified-test-format/tests/valid-fail/schemaVersion-unsupported.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/schemaVersion-unsupported.yml b/specifications/unified-test-format/tests/valid-fail/schemaVersion-unsupported.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-fail/schemaVersion-unsupported.yml
rename to specifications/unified-test-format/tests/valid-fail/schemaVersion-unsupported.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/assertNumberConnectionsCheckedOut.json b/specifications/unified-test-format/tests/valid-pass/assertNumberConnectionsCheckedOut.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/assertNumberConnectionsCheckedOut.json
rename to specifications/unified-test-format/tests/valid-pass/assertNumberConnectionsCheckedOut.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/assertNumberConnectionsCheckedOut.yml b/specifications/unified-test-format/tests/valid-pass/assertNumberConnectionsCheckedOut.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/assertNumberConnectionsCheckedOut.yml
rename to specifications/unified-test-format/tests/valid-pass/assertNumberConnectionsCheckedOut.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/entity-client-cmap-events.json b/specifications/unified-test-format/tests/valid-pass/entity-client-cmap-events.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/entity-client-cmap-events.json
rename to specifications/unified-test-format/tests/valid-pass/entity-client-cmap-events.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/entity-client-cmap-events.yml b/specifications/unified-test-format/tests/valid-pass/entity-client-cmap-events.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/entity-client-cmap-events.yml
rename to specifications/unified-test-format/tests/valid-pass/entity-client-cmap-events.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/entity-find-cursor.json b/specifications/unified-test-format/tests/valid-pass/entity-find-cursor.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/entity-find-cursor.json
rename to specifications/unified-test-format/tests/valid-pass/entity-find-cursor.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/entity-find-cursor.yml b/specifications/unified-test-format/tests/valid-pass/entity-find-cursor.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/entity-find-cursor.yml
rename to specifications/unified-test-format/tests/valid-pass/entity-find-cursor.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/expectedEventsForClient-eventType.json b/specifications/unified-test-format/tests/valid-pass/expectedEventsForClient-eventType.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/expectedEventsForClient-eventType.json
rename to specifications/unified-test-format/tests/valid-pass/expectedEventsForClient-eventType.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/expectedEventsForClient-eventType.yml b/specifications/unified-test-format/tests/valid-pass/expectedEventsForClient-eventType.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/expectedEventsForClient-eventType.yml
rename to specifications/unified-test-format/tests/valid-pass/expectedEventsForClient-eventType.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/expectedEventsForClient-ignoreExtraEvents.json b/specifications/unified-test-format/tests/valid-pass/expectedEventsForClient-ignoreExtraEvents.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/expectedEventsForClient-ignoreExtraEvents.json
rename to specifications/unified-test-format/tests/valid-pass/expectedEventsForClient-ignoreExtraEvents.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/expectedEventsForClient-ignoreExtraEvents.yml b/specifications/unified-test-format/tests/valid-pass/expectedEventsForClient-ignoreExtraEvents.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/expectedEventsForClient-ignoreExtraEvents.yml
rename to specifications/unified-test-format/tests/valid-pass/expectedEventsForClient-ignoreExtraEvents.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/ignoreResultAndError.json b/specifications/unified-test-format/tests/valid-pass/ignoreResultAndError.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/ignoreResultAndError.json
rename to specifications/unified-test-format/tests/valid-pass/ignoreResultAndError.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/ignoreResultAndError.yml b/specifications/unified-test-format/tests/valid-pass/ignoreResultAndError.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/ignoreResultAndError.yml
rename to specifications/unified-test-format/tests/valid-pass/ignoreResultAndError.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/kmsProviders-explicit_kms_credentials.json b/specifications/unified-test-format/tests/valid-pass/kmsProviders-explicit_kms_credentials.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/kmsProviders-explicit_kms_credentials.json
rename to specifications/unified-test-format/tests/valid-pass/kmsProviders-explicit_kms_credentials.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/kmsProviders-explicit_kms_credentials.yml b/specifications/unified-test-format/tests/valid-pass/kmsProviders-explicit_kms_credentials.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/kmsProviders-explicit_kms_credentials.yml
rename to specifications/unified-test-format/tests/valid-pass/kmsProviders-explicit_kms_credentials.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/kmsProviders-mixed_kms_credential_fields.json b/specifications/unified-test-format/tests/valid-pass/kmsProviders-mixed_kms_credential_fields.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/kmsProviders-mixed_kms_credential_fields.json
rename to specifications/unified-test-format/tests/valid-pass/kmsProviders-mixed_kms_credential_fields.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/kmsProviders-mixed_kms_credential_fields.yml b/specifications/unified-test-format/tests/valid-pass/kmsProviders-mixed_kms_credential_fields.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/kmsProviders-mixed_kms_credential_fields.yml
rename to specifications/unified-test-format/tests/valid-pass/kmsProviders-mixed_kms_credential_fields.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/kmsProviders-placeholder_kms_credentials.json b/specifications/unified-test-format/tests/valid-pass/kmsProviders-placeholder_kms_credentials.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/kmsProviders-placeholder_kms_credentials.json
rename to specifications/unified-test-format/tests/valid-pass/kmsProviders-placeholder_kms_credentials.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/kmsProviders-placeholder_kms_credentials.yml b/specifications/unified-test-format/tests/valid-pass/kmsProviders-placeholder_kms_credentials.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/kmsProviders-placeholder_kms_credentials.yml
rename to specifications/unified-test-format/tests/valid-pass/kmsProviders-placeholder_kms_credentials.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/kmsProviders-unconfigured_kms.json b/specifications/unified-test-format/tests/valid-pass/kmsProviders-unconfigured_kms.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/kmsProviders-unconfigured_kms.json
rename to specifications/unified-test-format/tests/valid-pass/kmsProviders-unconfigured_kms.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/kmsProviders-unconfigured_kms.yml b/specifications/unified-test-format/tests/valid-pass/kmsProviders-unconfigured_kms.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/kmsProviders-unconfigured_kms.yml
rename to specifications/unified-test-format/tests/valid-pass/kmsProviders-unconfigured_kms.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/observeSensitiveCommands.json b/specifications/unified-test-format/tests/valid-pass/observeSensitiveCommands.json
similarity index 98%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/observeSensitiveCommands.json
rename to specifications/unified-test-format/tests/valid-pass/observeSensitiveCommands.json
index 411ca19c5d0..d3ae5665be9 100644
--- a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/observeSensitiveCommands.json
+++ b/specifications/unified-test-format/tests/valid-pass/observeSensitiveCommands.json
@@ -61,6 +61,11 @@
"tests": [
{
"description": "getnonce is observed with observeSensitiveCommands=true",
+ "runOnRequirements": [
+ {
+ "maxServerVersion": "6.1.99"
+ }
+ ],
"operations": [
{
"name": "runCommand",
@@ -106,6 +111,11 @@
},
{
"description": "getnonce is not observed with observeSensitiveCommands=false",
+ "runOnRequirements": [
+ {
+ "maxServerVersion": "6.1.99"
+ }
+ ],
"operations": [
{
"name": "runCommand",
@@ -127,6 +137,11 @@
},
{
"description": "getnonce is not observed by default",
+ "runOnRequirements": [
+ {
+ "maxServerVersion": "6.1.99"
+ }
+ ],
"operations": [
{
"name": "runCommand",
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/observeSensitiveCommands.yml b/specifications/unified-test-format/tests/valid-pass/observeSensitiveCommands.yml
similarity index 96%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/observeSensitiveCommands.yml
rename to specifications/unified-test-format/tests/valid-pass/observeSensitiveCommands.yml
index 13db4137062..cd4d27a165b 100644
--- a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/observeSensitiveCommands.yml
+++ b/specifications/unified-test-format/tests/valid-pass/observeSensitiveCommands.yml
@@ -38,6 +38,8 @@ createEntities:
tests:
- description: "getnonce is observed with observeSensitiveCommands=true"
+ runOnRequirements:
+ - maxServerVersion: 6.1.99 # getnonce removed as of 6.2 via SERVER-71007
operations:
- name: runCommand
object: *databaseObserveSensitiveCommands
@@ -57,6 +59,8 @@ tests:
nonce: { $$exists: false }
- description: "getnonce is not observed with observeSensitiveCommands=false"
+ runOnRequirements:
+ - maxServerVersion: 6.1.99 # getnonce removed as of 6.2 via SERVER-71007
operations:
- name: runCommand
object: *databaseDoNotObserveSensitiveCommands
@@ -68,6 +72,8 @@ tests:
events: []
- description: "getnonce is not observed by default"
+ runOnRequirements:
+ - maxServerVersion: 6.1.99 # getnonce removed as of 6.2 via SERVER-71007
operations:
- name: runCommand
object: *databaseDoNotObserveSensitiveCommandsByDefault
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/poc-change-streams.json b/specifications/unified-test-format/tests/valid-pass/poc-change-streams.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/poc-change-streams.json
rename to specifications/unified-test-format/tests/valid-pass/poc-change-streams.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/poc-change-streams.yml b/specifications/unified-test-format/tests/valid-pass/poc-change-streams.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/poc-change-streams.yml
rename to specifications/unified-test-format/tests/valid-pass/poc-change-streams.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/poc-command-monitoring.json b/specifications/unified-test-format/tests/valid-pass/poc-command-monitoring.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/poc-command-monitoring.json
rename to specifications/unified-test-format/tests/valid-pass/poc-command-monitoring.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/poc-command-monitoring.yml b/specifications/unified-test-format/tests/valid-pass/poc-command-monitoring.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/poc-command-monitoring.yml
rename to specifications/unified-test-format/tests/valid-pass/poc-command-monitoring.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/poc-crud.json b/specifications/unified-test-format/tests/valid-pass/poc-crud.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/poc-crud.json
rename to specifications/unified-test-format/tests/valid-pass/poc-crud.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/poc-crud.yml b/specifications/unified-test-format/tests/valid-pass/poc-crud.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/poc-crud.yml
rename to specifications/unified-test-format/tests/valid-pass/poc-crud.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/poc-gridfs.json b/specifications/unified-test-format/tests/valid-pass/poc-gridfs.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/poc-gridfs.json
rename to specifications/unified-test-format/tests/valid-pass/poc-gridfs.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/poc-gridfs.yml b/specifications/unified-test-format/tests/valid-pass/poc-gridfs.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/poc-gridfs.yml
rename to specifications/unified-test-format/tests/valid-pass/poc-gridfs.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/poc-retryable-reads.json b/specifications/unified-test-format/tests/valid-pass/poc-retryable-reads.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/poc-retryable-reads.json
rename to specifications/unified-test-format/tests/valid-pass/poc-retryable-reads.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/poc-retryable-reads.yml b/specifications/unified-test-format/tests/valid-pass/poc-retryable-reads.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/poc-retryable-reads.yml
rename to specifications/unified-test-format/tests/valid-pass/poc-retryable-reads.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/poc-retryable-writes.json b/specifications/unified-test-format/tests/valid-pass/poc-retryable-writes.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/poc-retryable-writes.json
rename to specifications/unified-test-format/tests/valid-pass/poc-retryable-writes.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/poc-retryable-writes.yml b/specifications/unified-test-format/tests/valid-pass/poc-retryable-writes.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/poc-retryable-writes.yml
rename to specifications/unified-test-format/tests/valid-pass/poc-retryable-writes.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/poc-sessions.json b/specifications/unified-test-format/tests/valid-pass/poc-sessions.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/poc-sessions.json
rename to specifications/unified-test-format/tests/valid-pass/poc-sessions.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/poc-sessions.yml b/specifications/unified-test-format/tests/valid-pass/poc-sessions.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/poc-sessions.yml
rename to specifications/unified-test-format/tests/valid-pass/poc-sessions.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/poc-transactions-convenient-api.json b/specifications/unified-test-format/tests/valid-pass/poc-transactions-convenient-api.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/poc-transactions-convenient-api.json
rename to specifications/unified-test-format/tests/valid-pass/poc-transactions-convenient-api.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/poc-transactions-convenient-api.yml b/specifications/unified-test-format/tests/valid-pass/poc-transactions-convenient-api.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/poc-transactions-convenient-api.yml
rename to specifications/unified-test-format/tests/valid-pass/poc-transactions-convenient-api.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/poc-transactions-mongos-pin-auto.json b/specifications/unified-test-format/tests/valid-pass/poc-transactions-mongos-pin-auto.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/poc-transactions-mongos-pin-auto.json
rename to specifications/unified-test-format/tests/valid-pass/poc-transactions-mongos-pin-auto.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/poc-transactions-mongos-pin-auto.yml b/specifications/unified-test-format/tests/valid-pass/poc-transactions-mongos-pin-auto.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/poc-transactions-mongos-pin-auto.yml
rename to specifications/unified-test-format/tests/valid-pass/poc-transactions-mongos-pin-auto.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/poc-transactions.json b/specifications/unified-test-format/tests/valid-pass/poc-transactions.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/poc-transactions.json
rename to specifications/unified-test-format/tests/valid-pass/poc-transactions.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/poc-transactions.yml b/specifications/unified-test-format/tests/valid-pass/poc-transactions.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/unified-test-format/tests/valid-pass/poc-transactions.yml
rename to specifications/unified-test-format/tests/valid-pass/poc-transactions.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/uri-options/tests/README.rst b/specifications/uri-options/tests/README.rst
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/uri-options/tests/README.rst
rename to specifications/uri-options/tests/README.rst
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/uri-options/tests/auth-options.json b/specifications/uri-options/tests/auth-options.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/uri-options/tests/auth-options.json
rename to specifications/uri-options/tests/auth-options.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/uri-options/tests/auth-options.yml b/specifications/uri-options/tests/auth-options.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/uri-options/tests/auth-options.yml
rename to specifications/uri-options/tests/auth-options.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/uri-options/tests/ca.pem b/specifications/uri-options/tests/ca.pem
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/uri-options/tests/ca.pem
rename to specifications/uri-options/tests/ca.pem
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/uri-options/tests/cert.pem b/specifications/uri-options/tests/cert.pem
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/uri-options/tests/cert.pem
rename to specifications/uri-options/tests/cert.pem
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/uri-options/tests/client.pem b/specifications/uri-options/tests/client.pem
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/uri-options/tests/client.pem
rename to specifications/uri-options/tests/client.pem
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/uri-options/tests/compression-options.json b/specifications/uri-options/tests/compression-options.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/uri-options/tests/compression-options.json
rename to specifications/uri-options/tests/compression-options.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/uri-options/tests/compression-options.yml b/specifications/uri-options/tests/compression-options.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/uri-options/tests/compression-options.yml
rename to specifications/uri-options/tests/compression-options.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/uri-options/tests/concern-options.json b/specifications/uri-options/tests/concern-options.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/uri-options/tests/concern-options.json
rename to specifications/uri-options/tests/concern-options.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/uri-options/tests/concern-options.yml b/specifications/uri-options/tests/concern-options.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/uri-options/tests/concern-options.yml
rename to specifications/uri-options/tests/concern-options.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/uri-options/tests/connection-options.json b/specifications/uri-options/tests/connection-options.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/uri-options/tests/connection-options.json
rename to specifications/uri-options/tests/connection-options.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/uri-options/tests/connection-options.yml b/specifications/uri-options/tests/connection-options.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/uri-options/tests/connection-options.yml
rename to specifications/uri-options/tests/connection-options.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/uri-options/tests/connection-pool-options.json b/specifications/uri-options/tests/connection-pool-options.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/uri-options/tests/connection-pool-options.json
rename to specifications/uri-options/tests/connection-pool-options.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/uri-options/tests/connection-pool-options.yml b/specifications/uri-options/tests/connection-pool-options.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/uri-options/tests/connection-pool-options.yml
rename to specifications/uri-options/tests/connection-pool-options.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/uri-options/tests/read-preference-options.json b/specifications/uri-options/tests/read-preference-options.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/uri-options/tests/read-preference-options.json
rename to specifications/uri-options/tests/read-preference-options.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/uri-options/tests/read-preference-options.yml b/specifications/uri-options/tests/read-preference-options.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/uri-options/tests/read-preference-options.yml
rename to specifications/uri-options/tests/read-preference-options.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/uri-options/tests/single-threaded-options.json b/specifications/uri-options/tests/single-threaded-options.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/uri-options/tests/single-threaded-options.json
rename to specifications/uri-options/tests/single-threaded-options.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/uri-options/tests/single-threaded-options.yml b/specifications/uri-options/tests/single-threaded-options.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/uri-options/tests/single-threaded-options.yml
rename to specifications/uri-options/tests/single-threaded-options.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/uri-options/tests/srv-options.json b/specifications/uri-options/tests/srv-options.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/uri-options/tests/srv-options.json
rename to specifications/uri-options/tests/srv-options.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/uri-options/tests/srv-options.yml b/specifications/uri-options/tests/srv-options.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/uri-options/tests/srv-options.yml
rename to specifications/uri-options/tests/srv-options.yml
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/uri-options/tests/tls-options.json b/specifications/uri-options/tests/tls-options.json
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/uri-options/tests/tls-options.json
rename to specifications/uri-options/tests/tls-options.json
diff --git a/tests/MongoDB.Driver.Core.Tests/Specifications/uri-options/tests/tls-options.yml b/specifications/uri-options/tests/tls-options.yml
similarity index 100%
rename from tests/MongoDB.Driver.Core.Tests/Specifications/uri-options/tests/tls-options.yml
rename to specifications/uri-options/tests/tls-options.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/versioned-api/tests/README.rst b/specifications/versioned-api/tests/README.rst
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/versioned-api/tests/README.rst
rename to specifications/versioned-api/tests/README.rst
diff --git a/tests/MongoDB.Driver.Tests/Specifications/versioned-api/tests/crud-api-version-1-strict.json b/specifications/versioned-api/tests/crud-api-version-1-strict.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/versioned-api/tests/crud-api-version-1-strict.json
rename to specifications/versioned-api/tests/crud-api-version-1-strict.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/versioned-api/tests/crud-api-version-1-strict.yml b/specifications/versioned-api/tests/crud-api-version-1-strict.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/versioned-api/tests/crud-api-version-1-strict.yml
rename to specifications/versioned-api/tests/crud-api-version-1-strict.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/versioned-api/tests/crud-api-version-1.json b/specifications/versioned-api/tests/crud-api-version-1.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/versioned-api/tests/crud-api-version-1.json
rename to specifications/versioned-api/tests/crud-api-version-1.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/versioned-api/tests/crud-api-version-1.yml b/specifications/versioned-api/tests/crud-api-version-1.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/versioned-api/tests/crud-api-version-1.yml
rename to specifications/versioned-api/tests/crud-api-version-1.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/versioned-api/tests/runcommand-helper-no-api-version-declared.json b/specifications/versioned-api/tests/runcommand-helper-no-api-version-declared.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/versioned-api/tests/runcommand-helper-no-api-version-declared.json
rename to specifications/versioned-api/tests/runcommand-helper-no-api-version-declared.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/versioned-api/tests/runcommand-helper-no-api-version-declared.yml b/specifications/versioned-api/tests/runcommand-helper-no-api-version-declared.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/versioned-api/tests/runcommand-helper-no-api-version-declared.yml
rename to specifications/versioned-api/tests/runcommand-helper-no-api-version-declared.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/versioned-api/tests/test-commands-deprecation-errors.json b/specifications/versioned-api/tests/test-commands-deprecation-errors.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/versioned-api/tests/test-commands-deprecation-errors.json
rename to specifications/versioned-api/tests/test-commands-deprecation-errors.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/versioned-api/tests/test-commands-deprecation-errors.yml b/specifications/versioned-api/tests/test-commands-deprecation-errors.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/versioned-api/tests/test-commands-deprecation-errors.yml
rename to specifications/versioned-api/tests/test-commands-deprecation-errors.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/versioned-api/tests/test-commands-strict-mode.json b/specifications/versioned-api/tests/test-commands-strict-mode.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/versioned-api/tests/test-commands-strict-mode.json
rename to specifications/versioned-api/tests/test-commands-strict-mode.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/versioned-api/tests/test-commands-strict-mode.yml b/specifications/versioned-api/tests/test-commands-strict-mode.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/versioned-api/tests/test-commands-strict-mode.yml
rename to specifications/versioned-api/tests/test-commands-strict-mode.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/versioned-api/tests/transaction-handling.json b/specifications/versioned-api/tests/transaction-handling.json
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/versioned-api/tests/transaction-handling.json
rename to specifications/versioned-api/tests/transaction-handling.json
diff --git a/tests/MongoDB.Driver.Tests/Specifications/versioned-api/tests/transaction-handling.yml b/specifications/versioned-api/tests/transaction-handling.yml
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/versioned-api/tests/transaction-handling.yml
rename to specifications/versioned-api/tests/transaction-handling.yml
diff --git a/tests/MongoDB.Driver.Tests/Specifications/wireversion-featurelist.rst b/specifications/wireversion-featurelist.rst
similarity index 100%
rename from tests/MongoDB.Driver.Tests/Specifications/wireversion-featurelist.rst
rename to specifications/wireversion-featurelist.rst
diff --git a/src/Directory.Build.props b/src/Directory.Build.props
new file mode 100644
index 00000000000..7bfd170b9d0
--- /dev/null
+++ b/src/Directory.Build.props
@@ -0,0 +1,54 @@
+
+
+ true
+
+
+
+ netstandard2.0;netstandard2.1
+ $(TargetFrameworks);net472
+ 10.0
+ true
+ ..\..\MongoDB.ruleset
+
+
+
+ MongoDB Inc.
+ Copyright © 2010-present MongoDB Inc.
+ MongoDB Inc.
+ packageIcon.png
+ true
+ https://www.mongodb.com/docs/drivers/csharp/
+ mongodb;mongo;nosql
+ License.txt
+ en-US
+ true
+ snupkg
+ true
+
+
+
+ 0.0.0-local
+
+
+
+ TRACE
+
+
+
+ true
+
+
+
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers
+
+
+
+
+
+
+
+
diff --git a/src/MongoDB.Bson/BsonExtensionMethods.cs b/src/MongoDB.Bson/BsonExtensionMethods.cs
index bda37baf3a1..32844fdaa21 100644
--- a/src/MongoDB.Bson/BsonExtensionMethods.cs
+++ b/src/MongoDB.Bson/BsonExtensionMethods.cs
@@ -181,7 +181,7 @@ public static BsonDocument ToBsonDocument(
/// The object.
/// The JsonWriter settings.
/// The serializer.
- /// The serializastion context configurator.
+ /// The serialization context configurator.
/// The serialization args.
///
/// A JSON string.
diff --git a/src/MongoDB.Bson/IO/ThreadStaticBuffer.cs b/src/MongoDB.Bson/IO/ThreadStaticBuffer.cs
index ae4c99cb6fa..dea6f7aa9ad 100644
--- a/src/MongoDB.Bson/IO/ThreadStaticBuffer.cs
+++ b/src/MongoDB.Bson/IO/ThreadStaticBuffer.cs
@@ -80,25 +80,31 @@ public static RentedBuffer RentBuffer(int size)
throw new ArgumentOutOfRangeException(nameof(size), size, $"Valid buffer size range is [1..{MaxAllocationSize}] bytes.");
}
- __isBufferRented = true;
-
if (__threadId == default)
{
__threadId = Thread.CurrentThread.ManagedThreadId;
}
+ // Allocate space
+ RentedBuffer rentedBuffer;
if (size > MaxSize)
{
- return new RentedBuffer(__threadId, new byte[size]);
+ rentedBuffer = new RentedBuffer(__threadId, new byte[size]);
}
-
- if (__buffer == null || __buffer.Length < size)
+ else
{
- var newSize = size <= MinSize ? MinSize : PowerOf2.RoundUpToPowerOf2(size);
- __buffer = new byte[newSize];
+ if (__buffer == null || __buffer.Length < size)
+ {
+ var newSize = size <= MinSize ? MinSize : PowerOf2.RoundUpToPowerOf2(size);
+ __buffer = new byte[newSize];
+ }
+
+ rentedBuffer = new RentedBuffer(__threadId, __buffer);
}
- return new RentedBuffer(__threadId, __buffer);
+ // Set this last (in case of an exception in this method we want this to stay as-is.)
+ __isBufferRented = true;
+ return rentedBuffer;
}
}
}
diff --git a/src/MongoDB.Bson/MongoDB.Bson.csproj b/src/MongoDB.Bson/MongoDB.Bson.csproj
index 7d50a45c756..bb415b81013 100644
--- a/src/MongoDB.Bson/MongoDB.Bson.csproj
+++ b/src/MongoDB.Bson/MongoDB.Bson.csproj
@@ -1,68 +1,23 @@
-
- true
-
- netstandard2.0;netstandard2.1;net472
- netstandard2.0;netstandard2.1
- 9
- true
-
..\..\MongoDBLegacy.ruleset
MongoDB.Bson
MongoDB.Bson
- MongoDB Inc.
- Copyright © 2010-present MongoDB Inc.
Official MongoDB supported BSON library. See https://www.mongodb.com/docs/drivers/csharp/ for more details.
- MongoDB Inc.
- packageIcon.png
- true
MongoDB's Official Bson Library.
- https://www.mongodb.com/docs/drivers/csharp/
- License.txt
- mongodb;mongo;nosql;bson
- en-US
- true
- snupkg
- true
-
-
-
- 0.0.0-local
-
-
-
- TRACE
-
-
-
-
-
-
-
- true
+ $(PackageTags);bson
-
-
- all
- runtime; build; native; contentfiles; analyzers
-
-
-
-
-
-
diff --git a/src/MongoDB.Bson/ObjectModel/BsonBinaryData.cs b/src/MongoDB.Bson/ObjectModel/BsonBinaryData.cs
index 02a1b1df92a..b76fff33667 100644
--- a/src/MongoDB.Bson/ObjectModel/BsonBinaryData.cs
+++ b/src/MongoDB.Bson/ObjectModel/BsonBinaryData.cs
@@ -15,6 +15,7 @@
using System;
using System.Linq;
+using MongoDB.Shared;
namespace MongoDB.Bson
{
@@ -349,12 +350,12 @@ public override int GetHashCode()
// see Effective Java by Joshua Bloch
// note: guidRepresentation is not considered when computing the hash code
int hash = 17;
- hash = 37 * hash + BsonType.GetHashCode();
+ hash = 37 * hash + Hasher.GetHashCode(BsonType);
foreach (byte b in _bytes)
{
hash = 37 * hash + b;
}
- hash = 37 * hash + _subType.GetHashCode();
+ hash = 37 * hash + Hasher.GetHashCode(_subType);
return hash;
}
diff --git a/src/MongoDB.Bson/ObjectModel/BsonBoolean.cs b/src/MongoDB.Bson/ObjectModel/BsonBoolean.cs
index c1d6282eed6..1184d23208c 100644
--- a/src/MongoDB.Bson/ObjectModel/BsonBoolean.cs
+++ b/src/MongoDB.Bson/ObjectModel/BsonBoolean.cs
@@ -15,6 +15,7 @@
using System;
using MongoDB.Bson.IO;
+using MongoDB.Shared;
namespace MongoDB.Bson
{
@@ -191,7 +192,7 @@ public override int GetHashCode()
{
// see Effective Java by Joshua Bloch
int hash = 17;
- hash = 37 * hash + BsonType.GetHashCode();
+ hash = 37 * hash + Hasher.GetHashCode(BsonType);
hash = 37 * hash + _value.GetHashCode();
return hash;
}
diff --git a/src/MongoDB.Bson/ObjectModel/BsonDateTime.cs b/src/MongoDB.Bson/ObjectModel/BsonDateTime.cs
index 85e3c34867b..1d109657ed2 100644
--- a/src/MongoDB.Bson/ObjectModel/BsonDateTime.cs
+++ b/src/MongoDB.Bson/ObjectModel/BsonDateTime.cs
@@ -15,6 +15,7 @@
using System;
using MongoDB.Bson.IO;
+using MongoDB.Shared;
namespace MongoDB.Bson
{
@@ -209,7 +210,7 @@ public override int GetHashCode()
{
// see Effective Java by Joshua Bloch
int hash = 17;
- hash = 37 * hash + BsonType.GetHashCode();
+ hash = 37 * hash + Hasher.GetHashCode(BsonType);
hash = 37 * hash + _millisecondsSinceEpoch.GetHashCode();
return hash;
}
diff --git a/src/MongoDB.Bson/ObjectModel/BsonDecimal128.cs b/src/MongoDB.Bson/ObjectModel/BsonDecimal128.cs
index c34ee5096d1..b925d7f21dc 100644
--- a/src/MongoDB.Bson/ObjectModel/BsonDecimal128.cs
+++ b/src/MongoDB.Bson/ObjectModel/BsonDecimal128.cs
@@ -15,6 +15,7 @@
using System;
using MongoDB.Bson.IO;
+using MongoDB.Shared;
namespace MongoDB.Bson
{
@@ -175,7 +176,7 @@ public override int GetHashCode()
{
// see Effective Java by Joshua Bloch
int hash = 17;
- hash = 37 * hash + BsonType.GetHashCode();
+ hash = 37 * hash + Hasher.GetHashCode(BsonType);
hash = 37 * hash + _value.GetHashCode();
return hash;
}
diff --git a/src/MongoDB.Bson/ObjectModel/BsonDouble.cs b/src/MongoDB.Bson/ObjectModel/BsonDouble.cs
index 407b3c946ff..af10befca21 100644
--- a/src/MongoDB.Bson/ObjectModel/BsonDouble.cs
+++ b/src/MongoDB.Bson/ObjectModel/BsonDouble.cs
@@ -15,6 +15,7 @@
using System;
using MongoDB.Bson.IO;
+using MongoDB.Shared;
namespace MongoDB.Bson
{
@@ -198,7 +199,7 @@ public override int GetHashCode()
{
// see Effective Java by Joshua Bloch
int hash = 17;
- hash = 37 * hash + BsonType.GetHashCode();
+ hash = 37 * hash + Hasher.GetHashCode(BsonType);
hash = 37 * hash + _value.GetHashCode();
return hash;
}
diff --git a/src/MongoDB.Bson/ObjectModel/BsonInt32.cs b/src/MongoDB.Bson/ObjectModel/BsonInt32.cs
index 6c57461c31a..86fa49bab41 100644
--- a/src/MongoDB.Bson/ObjectModel/BsonInt32.cs
+++ b/src/MongoDB.Bson/ObjectModel/BsonInt32.cs
@@ -15,6 +15,7 @@
using System;
using MongoDB.Bson.IO;
+using MongoDB.Shared;
namespace MongoDB.Bson
{
@@ -257,7 +258,7 @@ public override int GetHashCode()
{
// see Effective Java by Joshua Bloch
int hash = 17;
- hash = 37 * hash + BsonType.GetHashCode();
+ hash = 37 * hash + Hasher.GetHashCode(BsonType);
hash = 37 * hash + _value.GetHashCode();
return hash;
}
diff --git a/src/MongoDB.Bson/ObjectModel/BsonInt64.cs b/src/MongoDB.Bson/ObjectModel/BsonInt64.cs
index 7a81dc637dd..fd4cd4c98b5 100644
--- a/src/MongoDB.Bson/ObjectModel/BsonInt64.cs
+++ b/src/MongoDB.Bson/ObjectModel/BsonInt64.cs
@@ -15,6 +15,7 @@
using System;
using MongoDB.Bson.IO;
+using MongoDB.Shared;
namespace MongoDB.Bson
{
@@ -211,7 +212,7 @@ public override int GetHashCode()
{
// see Effective Java by Joshua Bloch
int hash = 17;
- hash = 37 * hash + BsonType.GetHashCode();
+ hash = 37 * hash + Hasher.GetHashCode(BsonType);
hash = 37 * hash + _value.GetHashCode();
return hash;
}
diff --git a/src/MongoDB.Bson/ObjectModel/BsonJavaScript.cs b/src/MongoDB.Bson/ObjectModel/BsonJavaScript.cs
index 8887742c553..8fd98300e1c 100644
--- a/src/MongoDB.Bson/ObjectModel/BsonJavaScript.cs
+++ b/src/MongoDB.Bson/ObjectModel/BsonJavaScript.cs
@@ -14,6 +14,7 @@
*/
using System;
+using MongoDB.Shared;
namespace MongoDB.Bson
{
@@ -163,7 +164,7 @@ public override int GetHashCode()
{
// see Effective Java by Joshua Bloch
int hash = 17;
- hash = 37 * hash + BsonType.GetHashCode();
+ hash = 37 * hash + Hasher.GetHashCode(BsonType);
hash = 37 * hash + _code.GetHashCode();
return hash;
}
diff --git a/src/MongoDB.Bson/ObjectModel/BsonMaxKey.cs b/src/MongoDB.Bson/ObjectModel/BsonMaxKey.cs
index 83f78ca89dd..682a32c0521 100644
--- a/src/MongoDB.Bson/ObjectModel/BsonMaxKey.cs
+++ b/src/MongoDB.Bson/ObjectModel/BsonMaxKey.cs
@@ -14,6 +14,7 @@
*/
using System;
+using MongoDB.Shared;
namespace MongoDB.Bson
{
@@ -122,7 +123,7 @@ public override bool Equals(object obj)
/// The hash code.
public override int GetHashCode()
{
- return BsonType.GetHashCode();
+ return Hasher.GetHashCode(BsonType);
}
///
diff --git a/src/MongoDB.Bson/ObjectModel/BsonMinKey.cs b/src/MongoDB.Bson/ObjectModel/BsonMinKey.cs
index 6b070cb072e..c29e786eea5 100644
--- a/src/MongoDB.Bson/ObjectModel/BsonMinKey.cs
+++ b/src/MongoDB.Bson/ObjectModel/BsonMinKey.cs
@@ -14,6 +14,7 @@
*/
using System;
+using MongoDB.Shared;
namespace MongoDB.Bson
{
@@ -122,7 +123,7 @@ public override bool Equals(object obj)
/// The hash code.
public override int GetHashCode()
{
- return BsonType.GetHashCode();
+ return Hasher.GetHashCode(BsonType);
}
///
diff --git a/src/MongoDB.Bson/ObjectModel/BsonNull.cs b/src/MongoDB.Bson/ObjectModel/BsonNull.cs
index 5128a0afb6f..a585100dad0 100644
--- a/src/MongoDB.Bson/ObjectModel/BsonNull.cs
+++ b/src/MongoDB.Bson/ObjectModel/BsonNull.cs
@@ -14,6 +14,7 @@
*/
using System;
+using MongoDB.Shared;
namespace MongoDB.Bson
{
@@ -124,7 +125,7 @@ public override bool Equals(object obj)
/// The hash code.
public override int GetHashCode()
{
- return BsonType.GetHashCode();
+ return Hasher.GetHashCode(BsonType);
}
///
diff --git a/src/MongoDB.Bson/ObjectModel/BsonObjectId.cs b/src/MongoDB.Bson/ObjectModel/BsonObjectId.cs
index d9c79f61afe..17fc99e1de6 100644
--- a/src/MongoDB.Bson/ObjectModel/BsonObjectId.cs
+++ b/src/MongoDB.Bson/ObjectModel/BsonObjectId.cs
@@ -14,6 +14,7 @@
*/
using System;
+using MongoDB.Shared;
namespace MongoDB.Bson
{
@@ -337,7 +338,7 @@ public override bool Equals(object obj)
public override int GetHashCode()
{
int hash = 17;
- hash = 37 * hash + BsonType.GetHashCode();
+ hash = 37 * hash + Hasher.GetHashCode(BsonType);
hash = 37 * hash + _value.GetHashCode();
return hash;
}
diff --git a/src/MongoDB.Bson/ObjectModel/BsonRegularExpression.cs b/src/MongoDB.Bson/ObjectModel/BsonRegularExpression.cs
index 013268c4ea9..ab754b913f7 100644
--- a/src/MongoDB.Bson/ObjectModel/BsonRegularExpression.cs
+++ b/src/MongoDB.Bson/ObjectModel/BsonRegularExpression.cs
@@ -15,6 +15,7 @@
using System;
using System.Text.RegularExpressions;
+using MongoDB.Shared;
namespace MongoDB.Bson
{
@@ -243,7 +244,7 @@ public override int GetHashCode()
{
// see Effective Java by Joshua Bloch
int hash = 17;
- hash = 37 * hash + BsonType.GetHashCode();
+ hash = 37 * hash + Hasher.GetHashCode(BsonType);
hash = 37 * hash + _pattern.GetHashCode();
hash = 37 * hash + _options.GetHashCode();
return hash;
diff --git a/src/MongoDB.Bson/ObjectModel/BsonString.cs b/src/MongoDB.Bson/ObjectModel/BsonString.cs
index 2f4c464038f..24875d7af3f 100644
--- a/src/MongoDB.Bson/ObjectModel/BsonString.cs
+++ b/src/MongoDB.Bson/ObjectModel/BsonString.cs
@@ -15,6 +15,7 @@
using System;
using MongoDB.Bson.IO;
+using MongoDB.Shared;
namespace MongoDB.Bson
{
@@ -195,7 +196,7 @@ public override int GetHashCode()
{
// see Effective Java by Joshua Bloch
int hash = 17;
- hash = 37 * hash + BsonType.GetHashCode();
+ hash = 37 * hash + Hasher.GetHashCode(BsonType);
hash = 37 * hash + _value.GetHashCode();
return hash;
}
diff --git a/src/MongoDB.Bson/ObjectModel/BsonTimestamp.cs b/src/MongoDB.Bson/ObjectModel/BsonTimestamp.cs
index 6258feed4ae..c36b8a39635 100644
--- a/src/MongoDB.Bson/ObjectModel/BsonTimestamp.cs
+++ b/src/MongoDB.Bson/ObjectModel/BsonTimestamp.cs
@@ -15,6 +15,7 @@
using System;
using MongoDB.Bson.IO;
+using MongoDB.Shared;
namespace MongoDB.Bson
{
@@ -184,7 +185,7 @@ public override int GetHashCode()
{
// see Effective Java by Joshua Bloch
int hash = 17;
- hash = 37 * hash + BsonType.GetHashCode();
+ hash = 37 * hash + Hasher.GetHashCode(BsonType);
hash = 37 * hash + _value.GetHashCode();
return hash;
}
diff --git a/src/MongoDB.Bson/ObjectModel/BsonTypeMapper.cs b/src/MongoDB.Bson/ObjectModel/BsonTypeMapper.cs
index 1a7079493f0..48d7c888cb9 100644
--- a/src/MongoDB.Bson/ObjectModel/BsonTypeMapper.cs
+++ b/src/MongoDB.Bson/ObjectModel/BsonTypeMapper.cs
@@ -407,7 +407,7 @@ public static object MapToDotNetValue(BsonValue bsonValue, BsonTypeMapperOptions
}
else
{
- var message = string.Format("A BsonDocument can't be mapped to a {0}.", BsonUtils.GetFriendlyTypeName(options.MapBsonArrayTo));
+ var message = string.Format("A BsonDocument can't be mapped to a {0}.", BsonUtils.GetFriendlyTypeName(options.MapBsonDocumentTo));
throw new NotSupportedException(message);
}
case BsonType.Double:
diff --git a/src/MongoDB.Bson/ObjectModel/BsonUndefined.cs b/src/MongoDB.Bson/ObjectModel/BsonUndefined.cs
index 42322d8e2a8..74942df14b1 100644
--- a/src/MongoDB.Bson/ObjectModel/BsonUndefined.cs
+++ b/src/MongoDB.Bson/ObjectModel/BsonUndefined.cs
@@ -14,6 +14,7 @@
*/
using System;
+using MongoDB.Shared;
namespace MongoDB.Bson
{
@@ -123,7 +124,7 @@ public override bool Equals(object obj)
/// The hash code.
public override int GetHashCode()
{
- return BsonType.GetHashCode();
+ return Hasher.GetHashCode(BsonType);
}
///
diff --git a/src/MongoDB.Bson/Serialization/BsonClassMap.cs b/src/MongoDB.Bson/Serialization/BsonClassMap.cs
index 1b5ba072873..41d4cb82163 100644
--- a/src/MongoDB.Bson/Serialization/BsonClassMap.cs
+++ b/src/MongoDB.Bson/Serialization/BsonClassMap.cs
@@ -415,6 +415,112 @@ public static void RegisterClassMap(BsonClassMap classMap)
}
}
+ ///
+ /// Registers a class map if it is not already registered.
+ ///
+ /// The class.
+ /// True if this call registered the class map, false if the class map was already registered.
+ public static bool TryRegisterClassMap()
+ {
+ return TryRegisterClassMap(ClassMapFactory);
+
+ static BsonClassMap ClassMapFactory()
+ {
+ var classMap = new BsonClassMap();
+ classMap.AutoMap();
+ return classMap;
+ }
+ }
+
+ ///
+ /// Registers a class map if it is not already registered.
+ ///
+ /// The class.
+ /// The class map.
+ /// True if this call registered the class map, false if the class map was already registered.
+ public static bool TryRegisterClassMap(BsonClassMap classMap)
+ {
+ if (classMap == null)
+ {
+ throw new ArgumentNullException(nameof(classMap));
+ }
+
+ return TryRegisterClassMap(ClassMapFactory);
+
+ BsonClassMap ClassMapFactory()
+ {
+ return classMap;
+ }
+ }
+
+ ///
+ /// Registers a class map if it is not already registered.
+ ///
+ /// The class.
+ /// The class map initializer (only called if the class map is not already registered).
+ /// True if this call registered the class map, false if the class map was already registered.
+ public static bool TryRegisterClassMap(Action> classMapInitializer)
+ {
+ if (classMapInitializer == null)
+ {
+ throw new ArgumentNullException(nameof(classMapInitializer));
+ }
+
+ return TryRegisterClassMap(ClassMapFactory);
+
+ BsonClassMap ClassMapFactory()
+ {
+ return new BsonClassMap(classMapInitializer);
+ }
+ }
+
+ ///
+ /// Registers a class map if it is not already registered.
+ ///
+ /// The class.
+ /// The class map factory (only called if the class map is not already registered).
+ /// True if this call registered the class map, false if the class map was already registered.
+ public static bool TryRegisterClassMap(Func> classMapFactory)
+ {
+ if (classMapFactory == null)
+ {
+ throw new ArgumentNullException(nameof(classMapFactory));
+ }
+
+ BsonSerializer.ConfigLock.EnterReadLock();
+ try
+ {
+ if (__classMaps.ContainsKey(typeof(TClass)))
+ {
+ return false;
+ }
+ }
+ finally
+ {
+ BsonSerializer.ConfigLock.ExitReadLock();
+ }
+
+ BsonSerializer.ConfigLock.EnterWriteLock();
+ try
+ {
+ if (__classMaps.ContainsKey(typeof(TClass)))
+ {
+ return false;
+ }
+ else
+ {
+ // create a classMap for TClass and register it
+ var classMap = classMapFactory();
+ RegisterClassMap(classMap);
+ return true;
+ }
+ }
+ finally
+ {
+ BsonSerializer.ConfigLock.ExitWriteLock();
+ }
+ }
+
// public methods
///
/// Automaps the class.
@@ -1312,6 +1418,15 @@ public BsonClassMap(Action> classMapInitializer)
classMapInitializer(this);
}
+ ///
+ /// Initializes a new instance of the BsonClassMap class.
+ ///
+ /// The base class map.
+ public BsonClassMap(BsonClassMap baseClassMap)
+ : base(typeof(TClass), baseClassMap)
+ {
+ }
+
// public methods
///
/// Creates an instance.
diff --git a/src/MongoDB.Bson/Serialization/BsonSerializer.cs b/src/MongoDB.Bson/Serialization/BsonSerializer.cs
index 15d4858c3e7..5c027786d87 100644
--- a/src/MongoDB.Bson/Serialization/BsonSerializer.cs
+++ b/src/MongoDB.Bson/Serialization/BsonSerializer.cs
@@ -678,6 +678,28 @@ public static void Serialize(
serializer.Serialize(context, args, value);
}
+ ///
+ /// Tries to register a serializer for a type.
+ ///
+ /// The serializer.
+ /// The type.
+ /// True if the serializer was registered on this call, false if the same serializer was already registered on a previous call, throws an exception if a different serializer was already registered.
+ public static bool TryRegisterSerializer(Type type, IBsonSerializer serializer)
+ {
+ return __serializerRegistry.TryRegisterSerializer(type, serializer);
+ }
+
+ ///
+ /// Tries to register a serializer for a type.
+ ///
+ /// The type.
+ /// The serializer.
+ /// True if the serializer was registered on this call, false if the same serializer was already registered on a previous call, throws an exception if a different serializer was already registered.
+ public static bool TryRegisterSerializer(IBsonSerializer serializer)
+ {
+ return TryRegisterSerializer(typeof(T), serializer);
+ }
+
// internal static methods
internal static void EnsureKnownTypesAreRegistered(Type nominalType)
{
diff --git a/src/MongoDB.Bson/Serialization/BsonSerializerRegistry.cs b/src/MongoDB.Bson/Serialization/BsonSerializerRegistry.cs
index 4ff54ec6134..429386f6019 100644
--- a/src/MongoDB.Bson/Serialization/BsonSerializerRegistry.cs
+++ b/src/MongoDB.Bson/Serialization/BsonSerializerRegistry.cs
@@ -93,17 +93,7 @@ public void RegisterSerializer(Type type, IBsonSerializer serializer)
{
throw new ArgumentNullException("serializer");
}
- var typeInfo = type.GetTypeInfo();
- if (typeof(BsonValue).GetTypeInfo().IsAssignableFrom(type))
- {
- var message = string.Format("A serializer cannot be registered for type {0} because it is a subclass of BsonValue.", BsonUtils.GetFriendlyTypeName(type));
- throw new BsonSerializationException(message);
- }
- if (typeInfo.IsGenericType && typeInfo.ContainsGenericParameters)
- {
- var message = string.Format("Generic type {0} has unassigned type parameters.", BsonUtils.GetFriendlyTypeName(type));
- throw new ArgumentException(message, "type");
- }
+ EnsureRegisteringASerializerForThisTypeIsAllowed(type);
if (!_cache.TryAdd(type, serializer))
{
@@ -127,6 +117,40 @@ public void RegisterSerializationProvider(IBsonSerializationProvider serializati
_serializationProviders.Push(serializationProvider);
}
+ ///
+ /// Tries to register the serializer.
+ ///
+ /// The type.
+ /// The serializer.
+ /// True if the serializer was registered on this call, false if the same serializer was already registered on a previous call, throws an exception if a different serializer was already registered.
+ public bool TryRegisterSerializer(Type type, IBsonSerializer serializer)
+ {
+ if (type == null)
+ {
+ throw new ArgumentNullException(nameof(type));
+ }
+ if (serializer == null)
+ {
+ throw new ArgumentNullException(nameof(serializer));
+ }
+ EnsureRegisteringASerializerForThisTypeIsAllowed(type);
+
+ if (_cache.TryAdd(type, serializer))
+ {
+ return true;
+ }
+ else
+ {
+ var existingSerializer = _cache[type];
+ if (!existingSerializer.Equals(serializer))
+ {
+ var message = $"There is already a different serializer registered for type {BsonUtils.GetFriendlyTypeName(type)}.";
+ throw new BsonSerializationException(message);
+ }
+ return false;
+ }
+ }
+
// private methods
private IBsonSerializer CreateSerializer(Type type)
{
@@ -153,5 +177,20 @@ private IBsonSerializer CreateSerializer(Type type)
var message = string.Format("No serializer found for type {0}.", type.FullName);
throw new BsonSerializationException(message);
}
+
+ private void EnsureRegisteringASerializerForThisTypeIsAllowed(Type type)
+ {
+ var typeInfo = type.GetTypeInfo();
+ if (typeof(BsonValue).GetTypeInfo().IsAssignableFrom(type))
+ {
+ var message = string.Format("A serializer cannot be registered for type {0} because it is a subclass of BsonValue.", BsonUtils.GetFriendlyTypeName(type));
+ throw new BsonSerializationException(message);
+ }
+ if (typeInfo.IsGenericType && typeInfo.ContainsGenericParameters)
+ {
+ var message = string.Format("Generic type {0} has unassigned type parameters.", BsonUtils.GetFriendlyTypeName(type));
+ throw new ArgumentException(message, "type");
+ }
+ }
}
}
diff --git a/src/MongoDB.Bson/Serialization/CollectionsSerializationProvider.cs b/src/MongoDB.Bson/Serialization/CollectionsSerializationProvider.cs
index 9f8fd09a12e..c9496929852 100644
--- a/src/MongoDB.Bson/Serialization/CollectionsSerializationProvider.cs
+++ b/src/MongoDB.Bson/Serialization/CollectionsSerializationProvider.cs
@@ -204,10 +204,9 @@ private IBsonSerializer GetCollectionSerializer(Type type, IBsonSerializerRegist
if (typeInfo.IsInterface)
{
- var hashSetDefinition = typeof(HashSet<>);
- var hashSetType = hashSetDefinition.MakeGenericType(itemType);
- var serializerDefinition = typeof(ImpliedImplementationInterfaceSerializer<,>);
- return CreateGenericSerializer(serializerDefinition, new[] { type, hashSetType }, serializerRegistry);
+ var serializerDefinition = typeof(IEnumerableDeserializingAsCollectionSerializer<,,>);
+ var collectionType = typeof(HashSet<>).MakeGenericType(itemType);
+ return CreateGenericSerializer(serializerDefinition, new[] { type, itemType, collectionType }, serializerRegistry);
}
else
{
@@ -232,12 +231,12 @@ private IBsonSerializer GetCollectionSerializer(Type type, IBsonSerializerRegist
}
else if (typeInfo.IsInterface)
{
- var listDefinition = typeof(List<>);
- var listType = listDefinition.MakeGenericType(itemType);
+ var listType = typeof(List<>).MakeGenericType(itemType);
if (typeInfo.IsAssignableFrom(listType))
{
- var serializerDefinition = typeof(ImpliedImplementationInterfaceSerializer<,>);
- return CreateGenericSerializer(serializerDefinition, new[] { type, listType }, serializerRegistry);
+ var serializerDefinition = typeof(IEnumerableDeserializingAsCollectionSerializer<,,>);
+ var collectionType = typeof(List<>).MakeGenericType(itemType);
+ return CreateGenericSerializer(serializerDefinition, new[] { type, itemType, collectionType }, serializerRegistry);
}
}
diff --git a/src/MongoDB.Bson/Serialization/IRepresentationConfigurable.cs b/src/MongoDB.Bson/Serialization/IRepresentationConfigurable.cs
index e333e61a4f1..26e8cbf5bae 100644
--- a/src/MongoDB.Bson/Serialization/IRepresentationConfigurable.cs
+++ b/src/MongoDB.Bson/Serialization/IRepresentationConfigurable.cs
@@ -18,16 +18,19 @@ namespace MongoDB.Bson.Serialization
///
/// Represents a serializer that has a Representation property.
///
- public interface IRepresentationConfigurable
+ public interface IHasRepresentationSerializer
{
///
/// Gets the representation.
///
- ///
- /// The representation.
- ///
BsonType Representation { get; }
+ }
+ ///
+ /// Represents a serializer whose representation can be configured.
+ ///
+ public interface IRepresentationConfigurable : IHasRepresentationSerializer
+ {
///
/// Returns a serializer that has been reconfigured with the specified representation.
///
diff --git a/src/MongoDB.Bson/Serialization/PrimitiveSerializationProvider.cs b/src/MongoDB.Bson/Serialization/PrimitiveSerializationProvider.cs
index 441c759e89f..e799e216865 100644
--- a/src/MongoDB.Bson/Serialization/PrimitiveSerializationProvider.cs
+++ b/src/MongoDB.Bson/Serialization/PrimitiveSerializationProvider.cs
@@ -18,6 +18,7 @@
using System.Globalization;
using System.Net;
using System.Reflection;
+using System.Text.RegularExpressions;
using MongoDB.Bson.Serialization.Serializers;
namespace MongoDB.Bson.Serialization
@@ -53,6 +54,7 @@ static PrimitiveSerializationProvider()
{ typeof(Nullable<>), typeof(NullableSerializer<>) },
{ typeof(Object), typeof(ObjectSerializer) },
{ typeof(ObjectId), typeof(ObjectIdSerializer) },
+ { typeof(Regex), typeof(RegexSerializer) },
{ typeof(SByte), typeof(SByteSerializer) },
{ typeof(Single), typeof(SingleSerializer) },
{ typeof(String), typeof(StringSerializer) },
diff --git a/src/MongoDB.Bson/Serialization/Serializers/BsonClassMapSerializer.cs b/src/MongoDB.Bson/Serialization/Serializers/BsonClassMapSerializer.cs
index a3c400fef4e..52265b9fd15 100644
--- a/src/MongoDB.Bson/Serialization/Serializers/BsonClassMapSerializer.cs
+++ b/src/MongoDB.Bson/Serialization/Serializers/BsonClassMapSerializer.cs
@@ -29,7 +29,9 @@ namespace MongoDB.Bson.Serialization
public class BsonClassMapSerializer : SerializerBase, IBsonIdProvider, IBsonDocumentSerializer, IBsonPolymorphicSerializer
{
// private fields
- private BsonClassMap _classMap;
+ private readonly BsonClassMap _classMap;
+ private readonly bool _isReferenceType;
+ private readonly bool _isValueType;
// constructors
///
@@ -53,6 +55,8 @@ public BsonClassMapSerializer(BsonClassMap classMap)
}
_classMap = classMap;
+ _isValueType = _classMap.ClassType.IsValueType;
+ _isReferenceType = !_isValueType;
}
// public properties
@@ -78,12 +82,6 @@ public override TClass Deserialize(BsonDeserializationContext context, BsonDeser
{
var bsonReader = context.Reader;
- if (_classMap.ClassType.GetTypeInfo().IsValueType)
- {
- var message = string.Format("Value class {0} cannot be deserialized.", _classMap.ClassType.FullName);
- throw new BsonSerializationException(message);
- }
-
if (bsonReader.GetCurrentBsonType() == Bson.BsonType.Null)
{
bsonReader.ReadNull();
@@ -137,8 +135,19 @@ public TClass DeserializeClass(BsonDeserializationContext context)
else
{
// for mutable classes we deserialize the values directly into the result object
+ if (_isValueType)
+ {
+ var message = string.Format("Value class {0} cannot be deserialized without a constructor.", _classMap.ClassType.FullName);
+ throw new BsonSerializationException(message);
+ }
+
document = (TClass)_classMap.CreateInstance();
+ if (document == null)
+ {
+ throw new BsonSerializationException($"{nameof(BsonClassMap)} did not provide an instance of {typeof(TClass).Name}.");
+ }
+
supportsInitialization = document as ISupportInitialize;
if (supportsInitialization != null)
{
@@ -164,7 +173,7 @@ public TClass DeserializeClass(BsonDeserializationContext context)
var memberMap = allMemberMaps[memberMapIndex];
if (memberMapIndex != extraElementsMemberMapIndex)
{
- if (document != null)
+ if (_isReferenceType && document != null)
{
if (memberMap.IsReadOnly)
{
@@ -184,7 +193,7 @@ public TClass DeserializeClass(BsonDeserializationContext context)
}
else
{
- if (document != null)
+ if (_isReferenceType && document != null)
{
DeserializeExtraElementMember(context, document, elementName, memberMap);
}
@@ -206,7 +215,7 @@ public TClass DeserializeClass(BsonDeserializationContext context)
if (extraElementsMemberMapIndex >= 0)
{
var extraElementsMemberMap = _classMap.ExtraElementsMemberMap;
- if (document != null)
+ if (_isReferenceType && document != null)
{
DeserializeExtraElementMember(context, document, elementName, extraElementsMemberMap);
}
@@ -258,7 +267,7 @@ public TClass DeserializeClass(BsonDeserializationContext context)
throw new FormatException(message);
}
- if (document != null)
+ if (_isReferenceType && document != null)
{
memberMap.ApplyDefaultValue(document);
}
@@ -280,7 +289,7 @@ public TClass DeserializeClass(BsonDeserializationContext context)
}
}
- if (document != null)
+ if (_isReferenceType && document != null)
{
if (supportsInitialization != null)
{
@@ -426,6 +435,12 @@ private TClass CreateInstanceUsingCreator(Dictionary values)
var creatorMap = ChooseBestCreator(values);
var document = creatorMap.CreateInstance(values); // removes values consumed
+ if (values.Count > 0 && _isValueType)
+ {
+ var message = string.Format("Value class {0} cannot be deserialized unless all values can be passed to a constructor.", _classMap.ClassType.FullName);
+ throw new BsonSerializationException(message);
+ }
+
var supportsInitialization = document as ISupportInitialize;
if (supportsInitialization != null)
{
@@ -636,13 +651,23 @@ private void SerializeDiscriminator(BsonSerializationContext context, Type nomin
private void SerializeMember(BsonSerializationContext context, object obj, BsonMemberMap memberMap)
{
- if (memberMap != _classMap.ExtraElementsMemberMap)
+ try
{
- SerializeNormalMember(context, obj, memberMap);
+ if (memberMap != _classMap.ExtraElementsMemberMap)
+ {
+ SerializeNormalMember(context, obj, memberMap);
+ }
+ else
+ {
+ SerializeExtraElements(context, obj, memberMap);
+ }
}
- else
+ catch (Exception ex)
{
- SerializeExtraElements(context, obj, memberMap);
+ var message = string.Format(
+ "An error occurred while serializing the {0} {1} of class {2}: {3}", // terminating period provided by nested message
+ memberMap.MemberName, (memberMap.MemberInfo is FieldInfo) ? "field" : "property", memberMap.ClassMap.ClassType.FullName, ex.Message);
+ throw new BsonSerializationException(message, ex);
}
}
diff --git a/src/MongoDB.Bson/Serialization/Serializers/DateTimeOffsetSerializer.cs b/src/MongoDB.Bson/Serialization/Serializers/DateTimeOffsetSerializer.cs
index 27780654d71..48ecf234a86 100644
--- a/src/MongoDB.Bson/Serialization/Serializers/DateTimeOffsetSerializer.cs
+++ b/src/MongoDB.Bson/Serialization/Serializers/DateTimeOffsetSerializer.cs
@@ -105,8 +105,8 @@ public override DateTimeOffset Deserialize(BsonDeserializationContext context, B
{
case BsonType.Array:
bsonReader.ReadStartArray();
- ticks = bsonReader.ReadInt64();
- offset = TimeSpan.FromMinutes(bsonReader.ReadInt32());
+ ticks = _int64Serializer.Deserialize(context);
+ offset = TimeSpan.FromMinutes(_int32Serializer.Deserialize(context));
bsonReader.ReadEndArray();
return new DateTimeOffset(ticks, offset);
diff --git a/src/MongoDB.Bson/Serialization/Serializers/DictionarySerializerBase.cs b/src/MongoDB.Bson/Serialization/Serializers/DictionarySerializerBase.cs
index 73b45873c5c..9b04916444a 100644
--- a/src/MongoDB.Bson/Serialization/Serializers/DictionarySerializerBase.cs
+++ b/src/MongoDB.Bson/Serialization/Serializers/DictionarySerializerBase.cs
@@ -16,7 +16,6 @@
using System;
using System.Collections;
using System.Collections.Generic;
-using System.Linq.Expressions;
using MongoDB.Bson.IO;
using MongoDB.Bson.Serialization.Options;
@@ -59,7 +58,7 @@ public DictionarySerializerBase()
///
/// The dictionary representation.
public DictionarySerializerBase(DictionaryRepresentation dictionaryRepresentation)
- : this(dictionaryRepresentation, new ObjectSerializer(), new ObjectSerializer())
+ : this(dictionaryRepresentation, BsonSerializer.LookupSerializer(), BsonSerializer.LookupSerializer())
{
}
diff --git a/src/MongoDB.Bson/Serialization/Serializers/DiscriminatedInterfaceSerializer.cs b/src/MongoDB.Bson/Serialization/Serializers/DiscriminatedInterfaceSerializer.cs
index 3382f84f3a2..f59caa60836 100644
--- a/src/MongoDB.Bson/Serialization/Serializers/DiscriminatedInterfaceSerializer.cs
+++ b/src/MongoDB.Bson/Serialization/Serializers/DiscriminatedInterfaceSerializer.cs
@@ -23,11 +23,24 @@ namespace MongoDB.Bson.Serialization.Serializers
/// Represents a serializer for Interfaces.
///
/// The type of the interface.
- public class DiscriminatedInterfaceSerializer : SerializerBase // where TInterface is an interface
+ public class DiscriminatedInterfaceSerializer : SerializerBase, IBsonDocumentSerializer // where TInterface is an interface
{
+ #region static
+ private static IBsonSerializer CreateInterfaceSerializer()
+ {
+ var classMapDefinition = typeof(BsonClassMap<>);
+ var classMapType = classMapDefinition.MakeGenericType(typeof(TInterface));
+ var classMap = (BsonClassMap)Activator.CreateInstance(classMapType);
+ classMap.AutoMap();
+ classMap.Freeze();
+ return new BsonClassMapSerializer(classMap);
+ }
+ #endregion
+
// private fields
private readonly Type _interfaceType;
private readonly IDiscriminatorConvention _discriminatorConvention;
+ private readonly IBsonSerializer _interfaceSerializer;
private readonly IBsonSerializer _objectSerializer;
// constructors
@@ -46,6 +59,18 @@ public DiscriminatedInterfaceSerializer()
/// interfaceType
/// interfaceType
public DiscriminatedInterfaceSerializer(IDiscriminatorConvention discriminatorConvention)
+ : this(discriminatorConvention, CreateInterfaceSerializer())
+ {
+ }
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The discriminator convention.
+ /// The interface serializer (necessary to support LINQ queries).
+ /// interfaceType
+ /// interfaceType
+ public DiscriminatedInterfaceSerializer(IDiscriminatorConvention discriminatorConvention, IBsonSerializer interfaceSerializer)
{
var interfaceTypeInfo = typeof(TInterface).GetTypeInfo();
if (!interfaceTypeInfo.IsInterface)
@@ -56,7 +81,8 @@ public DiscriminatedInterfaceSerializer(IDiscriminatorConvention discriminatorCo
_interfaceType = typeof(TInterface);
_discriminatorConvention = discriminatorConvention;
- _objectSerializer = new ObjectSerializer(_discriminatorConvention);
+ _objectSerializer = ((ObjectSerializer)BsonSerializer.LookupSerializer()).WithDiscriminatorConvention(_discriminatorConvention);
+ _interfaceSerializer = interfaceSerializer;
}
// public methods
@@ -110,5 +136,17 @@ public override void Serialize(BsonSerializationContext context, BsonSerializati
_objectSerializer.Serialize(context, args, value);
}
}
+
+ ///
+ public bool TryGetMemberSerializationInfo(string memberName, out BsonSerializationInfo serializationInfo)
+ {
+ if (_interfaceSerializer is IBsonDocumentSerializer documentSerializer)
+ {
+ return documentSerializer.TryGetMemberSerializationInfo(memberName, out serializationInfo);
+ }
+
+ serializationInfo = null;
+ return false;
+ }
}
}
diff --git a/src/MongoDB.Bson/Serialization/Serializers/EnumSerializer.cs b/src/MongoDB.Bson/Serialization/Serializers/EnumSerializer.cs
index d74dcdb7d4a..477bd318e61 100644
--- a/src/MongoDB.Bson/Serialization/Serializers/EnumSerializer.cs
+++ b/src/MongoDB.Bson/Serialization/Serializers/EnumSerializer.cs
@@ -65,6 +65,11 @@ public EnumSerializer(BsonType representation)
throw new BsonSerializationException(message);
}
+ if (representation == 0)
+ {
+ representation = GetRepresentationForUnderlyingType();
+ }
+
_representation = representation;
_underlyingTypeCode = Type.GetTypeCode(Enum.GetUnderlyingType(typeof(TEnum)));
}
@@ -102,6 +107,20 @@ public override TEnum Deserialize(BsonDeserializationContext context, BsonDeseri
}
}
+ ///
+ public override bool Equals(object obj)
+ {
+ return
+ obj is EnumSerializer other &&
+ _representation == other.Representation;
+ }
+
+ ///
+ public override int GetHashCode()
+ {
+ return _representation.GetHashCode();
+ }
+
///
/// Serializes a value.
///
@@ -114,16 +133,6 @@ public override void Serialize(BsonSerializationContext context, BsonSerializati
switch (_representation)
{
- case 0:
- if (_underlyingTypeCode == TypeCode.Int64 || _underlyingTypeCode == TypeCode.UInt64)
- {
- goto case BsonType.Int64;
- }
- else
- {
- goto case BsonType.Int32;
- }
-
case BsonType.Int32:
bsonWriter.WriteInt32(ConvertEnumToInt32(value));
break;
@@ -148,6 +157,11 @@ public override void Serialize(BsonSerializationContext context, BsonSerializati
/// The reconfigured serializer.
public EnumSerializer WithRepresentation(BsonType representation)
{
+ if (representation == 0)
+ {
+ representation = GetRepresentationForUnderlyingType();
+ }
+
if (representation == _representation)
{
return this;
@@ -243,6 +257,12 @@ private TEnum ConvertInt64ToEnum(long value)
}
}
+ private BsonType GetRepresentationForUnderlyingType()
+ {
+ var underlyingType = Enum.GetUnderlyingType(typeof(TEnum));
+ return (underlyingType == typeof(long) || underlyingType == typeof(ulong)) ? BsonType.Int64 : BsonType.Int32;
+ }
+
private TEnum ConvertStringToEnum(string value)
{
if (Enum.TryParse(value, ignoreCase: false, out var result))
diff --git a/src/MongoDB.Bson/Serialization/Serializers/IEnumerableDeserializingAsCollectionSerializer.cs b/src/MongoDB.Bson/Serialization/Serializers/IEnumerableDeserializingAsCollectionSerializer.cs
new file mode 100644
index 00000000000..d2ca097339a
--- /dev/null
+++ b/src/MongoDB.Bson/Serialization/Serializers/IEnumerableDeserializingAsCollectionSerializer.cs
@@ -0,0 +1,173 @@
+/* Copyright 2010-present MongoDB Inc.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+using System;
+using System.Collections.Generic;
+
+namespace MongoDB.Bson.Serialization.Serializers
+{
+ ///
+ /// Represents a serializer for IEnumerable and any other derived interface implemented by TCollection.
+ ///
+ /// The type of an IEnumerable interface.
+ /// The type of the items.
+ /// The type of the collection used when deserializing.
+ public class IEnumerableDeserializingAsCollectionSerializer :
+ SerializerBase,
+ IBsonArraySerializer,
+ IChildSerializerConfigurable
+ where TIEnumerable : class, IEnumerable // TIEnumerable must be an interface
+ where TCollection : class, ICollection, new()
+ {
+ #region static
+ private static void EnsureTIEnumerableIsAnInterface()
+ {
+ if (!typeof(TIEnumerable).IsInterface)
+ {
+ // this constraint cannot be specified at compile time
+ throw new ArgumentException($"The {nameof(TIEnumerable)} type argument is not an interface: {typeof(TIEnumerable)}.", nameof(TIEnumerable));
+ }
+ }
+ #endregion
+
+ // private fields
+ private readonly Lazy> _lazyItemSerializer;
+
+ // constructors
+ ///
+ /// Initializes a new instance of the IEnumerableDeserializingAsCollectionSerializer class.
+ ///
+ public IEnumerableDeserializingAsCollectionSerializer()
+ : this(BsonSerializer.SerializerRegistry)
+ {
+ }
+
+ ///
+ /// Initializes a new instance of the IEnumerableDeserializingAsCollectionSerializer class.
+ ///
+ /// The item serializer.
+ public IEnumerableDeserializingAsCollectionSerializer(IBsonSerializer itemSerializer)
+ {
+ EnsureTIEnumerableIsAnInterface();
+ if (itemSerializer == null)
+ {
+ throw new ArgumentNullException(nameof(itemSerializer));
+ }
+
+ _lazyItemSerializer = new Lazy>(() => itemSerializer);
+ }
+
+ ///
+ /// Initializes a new instance of the IEnumerableDeserializingAsCollectionSerializer class.
+ ///
+ /// The serializer registry.
+ public IEnumerableDeserializingAsCollectionSerializer(IBsonSerializerRegistry serializerRegistry)
+ {
+ EnsureTIEnumerableIsAnInterface();
+ if (serializerRegistry == null)
+ {
+ throw new ArgumentNullException(nameof(serializerRegistry));
+ }
+
+ _lazyItemSerializer = new Lazy>(serializerRegistry.GetSerializer);
+ }
+
+ // public properties
+ ///
+ /// Gets the item serializer.
+ ///
+ ///
+ /// The item serializer.
+ ///
+ public IBsonSerializer ItemSerializer => _lazyItemSerializer.Value;
+
+ // public methods
+ ///
+ public override TIEnumerable Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
+ {
+ var reader = context.Reader;
+
+ if (reader.GetCurrentBsonType() == BsonType.Null)
+ {
+ reader.ReadNull();
+ return null;
+ }
+ else
+ {
+ reader.ReadStartArray();
+ var collection = new TCollection();
+ var itemSerializer = _lazyItemSerializer.Value;
+ while (reader.ReadBsonType() != 0)
+ {
+ var item = itemSerializer.Deserialize(context);
+ collection.Add(item);
+ }
+ reader.ReadEndArray();
+ return (TIEnumerable)(object)collection;
+ }
+ }
+
+ ///
+ public override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, TIEnumerable value)
+ {
+ var writer = context.Writer;
+
+ if (value == null)
+ {
+ writer.WriteNull();
+ }
+ else
+ {
+ writer.WriteStartArray();
+ var itemSerializer = _lazyItemSerializer.Value;
+ foreach (var item in value)
+ {
+ itemSerializer.Serialize(context, item);
+ }
+ writer.WriteEndArray();
+ }
+ }
+
+ ///
+ /// Tries to get the serialization info for the individual items of the array.
+ ///
+ /// The serialization information.
+ ///
+ /// The serialization info for the items.
+ ///
+ public bool TryGetItemSerializationInfo(out BsonSerializationInfo serializationInfo)
+ {
+ var itemSerializer = _lazyItemSerializer.Value;
+ serializationInfo = new BsonSerializationInfo(null, itemSerializer, itemSerializer.ValueType);
+ return true;
+ }
+
+ ///
+ /// Returns a serializer that has been reconfigured with the specified item serializer.
+ ///
+ /// The item serializer.
+ /// The reconfigured serializer.
+ public IEnumerableDeserializingAsCollectionSerializer WithItemSerializer(IBsonSerializer itemSerializer)
+ {
+ return new IEnumerableDeserializingAsCollectionSerializer(itemSerializer);
+ }
+
+ // explicit interface implementations
+ IBsonSerializer IChildSerializerConfigurable.ChildSerializer => ItemSerializer;
+
+ IBsonSerializer IChildSerializerConfigurable.WithChildSerializer(IBsonSerializer childSerializer)
+ => WithItemSerializer((IBsonSerializer)childSerializer);
+ }
+}
diff --git a/src/MongoDB.Bson/Serialization/Serializers/NullableGenericSerializer.cs b/src/MongoDB.Bson/Serialization/Serializers/NullableGenericSerializer.cs
index 3032c1c1280..a527d915b95 100644
--- a/src/MongoDB.Bson/Serialization/Serializers/NullableGenericSerializer.cs
+++ b/src/MongoDB.Bson/Serialization/Serializers/NullableGenericSerializer.cs
@@ -14,18 +14,46 @@
*/
using System;
-using MongoDB.Bson.IO;
-using MongoDB.Bson.Serialization.Attributes;
namespace MongoDB.Bson.Serialization.Serializers
{
+ ///
+ /// An interface used by the LINQ3 translators to access the value serializer without needing to use reflection.
+ ///
+ public interface INullableSerializer
+ {
+ ///
+ /// Gets the value serializer.
+ ///
+ IBsonSerializer ValueSerializer { get; }
+ }
+
+ ///
+ /// Static factory class for NullableSerializers.
+ ///
+ public static class NullableSerializer
+ {
+ ///
+ /// Creates a NullableSerializer.
+ ///
+ /// The value serializer.
+ /// A NullableSerializer
+ public static IBsonSerializer Create(IBsonSerializer valueSerializer)
+ {
+ var valueType = valueSerializer.ValueType;
+ var nullableSerializerType = typeof(NullableSerializer<>).MakeGenericType(valueType);
+ return (IBsonSerializer)Activator.CreateInstance(nullableSerializerType, valueSerializer);
+ }
+ }
+
///
/// Represents a serializer for nullable values.
///
/// The underlying type.
public class NullableSerializer :
SerializerBase>,
- IChildSerializerConfigurable
+ IChildSerializerConfigurable,
+ INullableSerializer
where T : struct
{
// private fields
@@ -68,6 +96,15 @@ public NullableSerializer(IBsonSerializerRegistry serializerRegistry)
_lazySerializer = new Lazy>(() => serializerRegistry.GetSerializer());
}
+ // public properties
+ ///
+ /// Gets the value serializer.
+ ///
+ public IBsonSerializer ValueSerializer => _lazySerializer.Value;
+
+ // explicitly implemented properties
+ IBsonSerializer INullableSerializer.ValueSerializer => ValueSerializer;
+
// public methods
///
/// Deserializes a value.
@@ -91,6 +128,17 @@ public NullableSerializer(IBsonSerializerRegistry serializerRegistry)
}
}
+ ///
+ public override bool Equals(object obj)
+ {
+ return
+ obj is NullableSerializer other &&
+ ValueSerializer.Equals(other.ValueSerializer);
+ }
+
+ ///
+ public override int GetHashCode() => ValueSerializer.GetHashCode();
+
///
/// Serializes a value.
///
diff --git a/src/MongoDB.Bson/Serialization/Serializers/ObjectSerializer.cs b/src/MongoDB.Bson/Serialization/Serializers/ObjectSerializer.cs
index 1415d0160fe..cdfce696933 100644
--- a/src/MongoDB.Bson/Serialization/Serializers/ObjectSerializer.cs
+++ b/src/MongoDB.Bson/Serialization/Serializers/ObjectSerializer.cs
@@ -14,8 +14,11 @@
*/
using System;
+using System.Collections.Generic;
+using System.Linq;
using MongoDB.Bson.IO;
using MongoDB.Bson.Serialization.Conventions;
+using MongoDB.Shared;
namespace MongoDB.Bson.Serialization.Serializers
{
@@ -24,10 +27,36 @@ namespace MongoDB.Bson.Serialization.Serializers
///
public class ObjectSerializer : ClassSerializerBase
{
+ #region static
// private static fields
+ private static readonly Func __allAllowedTypes = t => true;
private static readonly ObjectSerializer __instance = new ObjectSerializer();
+ private static readonly Func __noAllowedTypes = t => false;
+
+ // public static properties
+ ///
+ /// An allowed types function that returns true for all types.
+ ///
+ public static Func AllAllowedTypes => __allAllowedTypes;
+
+ ///
+ /// An allowed types function that returns true for framework types known to be safe.
+ ///
+ public static Func DefaultAllowedTypes => DefaultFrameworkAllowedTypes.AllowedTypes;
+
+ ///
+ /// Gets the standard instance.
+ ///
+ public static ObjectSerializer Instance => __instance;
+
+ ///
+ /// An allowed types function that returns false for all types.
+ ///
+ public static Func NoAllowedTypes => __noAllowedTypes;
+ #endregion
// private fields
+ private readonly Func _allowedTypes;
private readonly IDiscriminatorConvention _discriminatorConvention;
private readonly GuidRepresentation _guidRepresentation;
private readonly GuidSerializer _guidSerializer;
@@ -57,27 +86,50 @@ public ObjectSerializer(IDiscriminatorConvention discriminatorConvention)
/// The discriminator convention.
/// The Guid representation.
public ObjectSerializer(IDiscriminatorConvention discriminatorConvention, GuidRepresentation guidRepresentation)
+ : this(discriminatorConvention, guidRepresentation, DefaultFrameworkAllowedTypes.AllowedTypes)
+ {
+ }
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// A delegate that determines what types are allowed.
+ public ObjectSerializer(Func allowedTypes)
+ : this(BsonSerializer.LookupDiscriminatorConvention(typeof(object)), allowedTypes)
+ {
+ }
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The discriminator convention.
+ /// A delegate that determines what types are allowed.
+ public ObjectSerializer(IDiscriminatorConvention discriminatorConvention, Func allowedTypes)
+ : this(discriminatorConvention, GuidRepresentation.Unspecified, allowedTypes)
+ {
+ }
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The discriminator convention.
+ /// The Guid representation.
+ /// A delegate that determines what types are allowed.
+ public ObjectSerializer(IDiscriminatorConvention discriminatorConvention, GuidRepresentation guidRepresentation, Func allowedTypes)
{
if (discriminatorConvention == null)
{
throw new ArgumentNullException("discriminatorConvention");
}
+ if (allowedTypes == null)
+ {
+ throw new ArgumentNullException(nameof(allowedTypes));
+ }
_discriminatorConvention = discriminatorConvention;
_guidRepresentation = guidRepresentation;
_guidSerializer = new GuidSerializer(_guidRepresentation);
- }
-
- // public static properties
- ///
- /// Gets the standard instance.
- ///
- ///
- /// The standard instance.
- ///
- public static ObjectSerializer Instance
- {
- get { return __instance; }
+ _allowedTypes = allowedTypes;
}
// public methods
@@ -165,6 +217,21 @@ public override object Deserialize(BsonDeserializationContext context, BsonDeser
}
}
+ ///
+ public override bool Equals(object obj) =>
+ obj is ObjectSerializer other &&
+ GetType() == other.GetType() &&
+ _allowedTypes.Equals(other._allowedTypes) &&
+ _discriminatorConvention.Equals(other._discriminatorConvention) &&
+ _guidRepresentation == other._guidRepresentation;
+
+ ///
+ public override int GetHashCode() =>
+ new Hasher()
+ .Hash(_discriminatorConvention)
+ .Hash(_guidRepresentation)
+ .GetHashCode();
+
///
/// Serializes a value.
///
@@ -264,12 +331,27 @@ public override void Serialize(BsonSerializationContext context, BsonSerializati
}
}
+ ///
+ /// Returns a new ObjectSerializer configured the same but with the specified discriminator convention.
+ ///
+ /// The discriminator convention.
+ /// An ObjectSerializer with the specified discriminator convention.
+ public ObjectSerializer WithDiscriminatorConvention(IDiscriminatorConvention discriminatorConvention)
+ {
+ return new ObjectSerializer(discriminatorConvention, _guidRepresentation, _allowedTypes);
+ }
+
// private methods
private object DeserializeDiscriminatedValue(BsonDeserializationContext context, BsonDeserializationArgs args)
{
var bsonReader = context.Reader;
var actualType = _discriminatorConvention.GetActualType(bsonReader, typeof(object));
+ if (!_allowedTypes(actualType))
+ {
+ throw new BsonSerializationException($"Type {actualType.FullName} is not configured as an allowed type for this instance of ObjectSerializer.");
+ }
+
if (actualType == typeof(object))
{
var type = bsonReader.GetCurrentBsonType();
@@ -333,6 +415,11 @@ private object DeserializeDiscriminatedValue(BsonDeserializationContext context,
private void SerializeDiscriminatedValue(BsonSerializationContext context, BsonSerializationArgs args, object value, Type actualType)
{
+ if (!_allowedTypes(actualType))
+ {
+ throw new BsonSerializationException($"Type {actualType.FullName} is not configured as an allowed type for this instance of ObjectSerializer.");
+ }
+
var serializer = BsonSerializer.LookupSerializer(actualType);
var polymorphicSerializer = serializer as IBsonPolymorphicSerializer;
@@ -361,5 +448,101 @@ private void SerializeDiscriminatedValue(BsonSerializationContext context, BsonS
}
}
}
+
+ // nested types
+ private static class DefaultFrameworkAllowedTypes
+ {
+ private readonly static HashSet __allowedTypes = new HashSet
+ {
+ typeof(System.Boolean),
+ typeof(System.Byte),
+ typeof(System.Char),
+ typeof(System.Collections.ArrayList),
+ typeof(System.Collections.BitArray),
+ typeof(System.Collections.Hashtable),
+ typeof(System.Collections.Queue),
+ typeof(System.Collections.SortedList),
+ typeof(System.Collections.Specialized.ListDictionary),
+ typeof(System.Collections.Specialized.OrderedDictionary),
+ typeof(System.Collections.Stack),
+ typeof(System.DateTime),
+ typeof(System.DateTimeOffset),
+ typeof(System.Decimal),
+ typeof(System.Double),
+ typeof(System.Dynamic.ExpandoObject),
+ typeof(System.Guid),
+ typeof(System.Int16),
+ typeof(System.Int32),
+ typeof(System.Int64),
+ typeof(System.Net.DnsEndPoint),
+ typeof(System.Net.EndPoint),
+ typeof(System.Net.IPAddress),
+ typeof(System.Net.IPEndPoint),
+ typeof(System.Net.IPHostEntry),
+ typeof(System.Object),
+ typeof(System.SByte),
+ typeof(System.Single),
+ typeof(System.String),
+ typeof(System.Text.RegularExpressions.Regex),
+ typeof(System.TimeSpan),
+ typeof(System.UInt16),
+ typeof(System.UInt32),
+ typeof(System.UInt64),
+ typeof(System.Uri),
+ typeof(System.Version)
+ };
+
+ private readonly static HashSet __allowedGenericTypes = new HashSet
+ {
+ typeof(System.Collections.Generic.Dictionary<,>),
+ typeof(System.Collections.Generic.HashSet<>),
+ typeof(System.Collections.Generic.KeyValuePair<,>),
+ typeof(System.Collections.Generic.LinkedList<>),
+ typeof(System.Collections.Generic.List<>),
+ typeof(System.Collections.Generic.Queue<>),
+ typeof(System.Collections.Generic.SortedDictionary<,>),
+ typeof(System.Collections.Generic.SortedList<,>),
+ typeof(System.Collections.Generic.SortedSet<>),
+ typeof(System.Collections.Generic.Stack<>),
+ typeof(System.Collections.ObjectModel.Collection<>),
+ typeof(System.Collections.ObjectModel.KeyedCollection<,>),
+ typeof(System.Collections.ObjectModel.ObservableCollection<>),
+ typeof(System.Collections.ObjectModel.ReadOnlyCollection<>),
+ typeof(System.Collections.ObjectModel.ReadOnlyDictionary<,>),
+ typeof(System.Collections.ObjectModel.ReadOnlyObservableCollection<>),
+ typeof(System.Nullable<>),
+ typeof(System.Tuple<>),
+ typeof(System.Tuple<,>),
+ typeof(System.Tuple<,,>),
+ typeof(System.Tuple<,,,>),
+ typeof(System.Tuple<,,,,>),
+ typeof(System.Tuple<,,,,,>),
+ typeof(System.Tuple<,,,,,,>),
+ typeof(System.Tuple<,,,,,,,>),
+ typeof(System.ValueTuple<,,,,,,,>),
+ typeof(System.ValueTuple<>),
+ typeof(System.ValueTuple<,>),
+ typeof(System.ValueTuple<,,>),
+ typeof(System.ValueTuple<,,,>),
+ typeof(System.ValueTuple<,,,,>),
+ typeof(System.ValueTuple<,,,,,>),
+ typeof(System.ValueTuple<,,,,,,>),
+ typeof(System.ValueTuple<,,,,,,,>)
+ };
+
+ public static bool AllowedTypes(Type type)
+ {
+ return type.IsConstructedGenericType ? IsAllowedGenericType(type) : IsAllowedType(type);
+
+ static bool IsAllowedType(Type type) =>
+ __allowedTypes.Contains(type) ||
+ type.IsArray && AllowedTypes(type.GetElementType()) ||
+ type.IsEnum;
+
+ static bool IsAllowedGenericType(Type type) =>
+ __allowedGenericTypes.Contains(type.GetGenericTypeDefinition()) &&
+ type.GetGenericArguments().All(AllowedTypes);
+ }
+ }
}
}
diff --git a/src/MongoDB.Bson/Serialization/Serializers/RawBsonDocumentSerializer.cs b/src/MongoDB.Bson/Serialization/Serializers/RawBsonDocumentSerializer.cs
index 55c06ba20c0..beba07d8893 100644
--- a/src/MongoDB.Bson/Serialization/Serializers/RawBsonDocumentSerializer.cs
+++ b/src/MongoDB.Bson/Serialization/Serializers/RawBsonDocumentSerializer.cs
@@ -19,7 +19,7 @@ namespace MongoDB.Bson.Serialization.Serializers
///
/// Represents a serializer for RawBsonDocuments.
///
- public class RawBsonDocumentSerializer : BsonValueSerializerBase
+ public class RawBsonDocumentSerializer : BsonValueSerializerBase, IBsonDocumentSerializer
{
// private static fields
private static readonly RawBsonDocumentSerializer __instance = new RawBsonDocumentSerializer();
@@ -70,5 +70,15 @@ protected override void SerializeValue(BsonSerializationContext context, BsonSer
var bsonWriter = context.Writer;
bsonWriter.WriteRawBsonDocument(value.Slice);
}
+
+ ///
+ public bool TryGetMemberSerializationInfo(string memberName, out BsonSerializationInfo serializationInfo)
+ {
+ serializationInfo = new BsonSerializationInfo(
+ memberName,
+ BsonValueSerializer.Instance,
+ typeof(BsonValue));
+ return true;
+ }
}
}
diff --git a/src/MongoDB.Bson/Serialization/Serializers/RegexSerializer.cs b/src/MongoDB.Bson/Serialization/Serializers/RegexSerializer.cs
index d944d1d3d70..a6c9661ebcf 100644
--- a/src/MongoDB.Bson/Serialization/Serializers/RegexSerializer.cs
+++ b/src/MongoDB.Bson/Serialization/Serializers/RegexSerializer.cs
@@ -90,6 +90,10 @@ public override Regex Deserialize(BsonDeserializationContext context, BsonDeseri
var bsonType = reader.GetCurrentBsonType();
switch (bsonType)
{
+ case BsonType.Null:
+ reader.ReadNull();
+ return null;
+
case BsonType.RegularExpression:
return reader.ReadRegularExpression().ToRegex();
@@ -111,6 +115,12 @@ public override void Serialize(BsonSerializationContext context, BsonSerializati
{
var writer = context.Writer;
+ if (value == null)
+ {
+ writer.WriteNull();
+ return;
+ }
+
switch (_representation)
{
case BsonType.RegularExpression:
diff --git a/src/MongoDB.Bson/Serialization/TypeNameDiscriminator.cs b/src/MongoDB.Bson/Serialization/TypeNameDiscriminator.cs
index a0c0d81aeb9..4032179f934 100644
--- a/src/MongoDB.Bson/Serialization/TypeNameDiscriminator.cs
+++ b/src/MongoDB.Bson/Serialization/TypeNameDiscriminator.cs
@@ -27,17 +27,25 @@ namespace MongoDB.Bson.Serialization
public static class TypeNameDiscriminator
{
// private static fields
- private static Assembly[] __wellKnownAssemblies;
+ private static readonly HashSet __wellKnownAssemblies = new HashSet();
// static constructor
static TypeNameDiscriminator()
{
- __wellKnownAssemblies = new Assembly[]
+ var representativeTypes = new Type[]
{
- typeof(object).GetTypeInfo().Assembly, // mscorlib
- typeof(Queue<>).GetTypeInfo().Assembly, // System
- typeof(HashSet<>).GetTypeInfo().Assembly // System.Core
+ // the actual locations of these types varies depending on the target framework
+ typeof(object),
+ typeof(Queue<>),
+ typeof(HashSet<>),
+ typeof(SortedSet<>)
};
+
+ foreach (var type in representativeTypes)
+ {
+ var assembly = type.GetTypeInfo().Assembly;
+ __wellKnownAssemblies.Add(assembly);
+ }
}
// public static methods
diff --git a/src/MongoDB.Driver.Core/ChangeStreamDocument.cs b/src/MongoDB.Driver.Core/ChangeStreamDocument.cs
index d5338c587d3..189fae5bc5f 100644
--- a/src/MongoDB.Driver.Core/ChangeStreamDocument.cs
+++ b/src/MongoDB.Driver.Core/ChangeStreamDocument.cs
@@ -92,6 +92,37 @@ public ChangeStreamDocument(
///
public DatabaseNamespace DatabaseNamespace => GetValue(nameof(DatabaseNamespace), null);
+ ///
+ /// Gets the disambiguated paths if present.
+ ///
+ ///
+ /// The disambiguated paths.
+ ///
+ ///
+ ///
+ /// A document containing a map that associates an update path to an array containing the path components used in the update document. This data
+ /// can be used in combination with the other fields in an to determine the
+ /// actual path in the document that was updated. This is necessary in cases where a key contains dot-separated strings (i.e. { "a.b": "c" } ) or
+ /// a document contains a numeric literal string key (i.e. { "a": { "0": "a" } } ). Note that in this scenario, the numeric key can't be the top
+ /// level key because { "0": "a" } is not ambiguous - update paths would simply be '0' which is unambiguous because BSON documents cannot have
+ /// arrays at the top level. Each entry in the document maps an update path to an array which contains the actual path used when the document
+ /// was updated. For example, given a document with the following shape { "a": { "0": 0 } } and an update of { $inc: { "a.0": 1 } } ,
+ /// would look like the following:
+ ///
+ ///
+ /// {
+ /// "a.0": ["a", "0"]
+ /// }
+ ///
+ ///
+ /// In each array, all elements will be returned as strings with the exception of array indices, which will be returned as 32-bit integers.
+ ///
+ ///
+ /// Added in MongoDB version 6.1.0.
+ ///
+ ///
+ public BsonDocument DisambiguatedPaths => GetValue(nameof(DisambiguatedPaths), null);
+
///
/// Gets the document key.
///
diff --git a/src/MongoDB.Driver.Core/ChangeStreamDocumentSerializer.cs b/src/MongoDB.Driver.Core/ChangeStreamDocumentSerializer.cs
index 973f0dca06a..61e3cc850c0 100644
--- a/src/MongoDB.Driver.Core/ChangeStreamDocumentSerializer.cs
+++ b/src/MongoDB.Driver.Core/ChangeStreamDocumentSerializer.cs
@@ -44,6 +44,7 @@ public ChangeStreamDocumentSerializer(
RegisterMember("CollectionNamespace", "ns", ChangeStreamDocumentCollectionNamespaceSerializer.Instance);
RegisterMember("CollectionUuid", "ui", GuidSerializer.StandardInstance);
RegisterMember("DatabaseNamespace", "ns", ChangeStreamDocumentDatabaseNamespaceSerializer.Instance);
+ RegisterMember("DisambiguatedPaths", "disambiguatedPaths", BsonDocumentSerializer.Instance);
RegisterMember("DocumentKey", "documentKey", BsonDocumentSerializer.Instance);
RegisterMember("FullDocument", "fullDocument", _documentSerializer);
RegisterMember("FullDocumentBeforeChange", "fullDocumentBeforeChange", _documentSerializer);
diff --git a/src/MongoDB.Driver.Core/Core/Authentication/External/AwsAuthenticationCredentialsProvider.cs b/src/MongoDB.Driver.Core/Core/Authentication/External/AwsAuthenticationCredentialsProvider.cs
new file mode 100644
index 00000000000..64ab6552a6a
--- /dev/null
+++ b/src/MongoDB.Driver.Core/Core/Authentication/External/AwsAuthenticationCredentialsProvider.cs
@@ -0,0 +1,105 @@
+/* Copyright 2010-present MongoDB Inc.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+using System;
+using System.Security;
+using System.Threading;
+using System.Threading.Tasks;
+using Amazon.Runtime;
+using MongoDB.Bson;
+using MongoDB.Driver.Core.Misc;
+
+namespace MongoDB.Driver.Core.Authentication.External
+{
+ internal sealed class AwsCredentials : IExternalCredentials
+ {
+ private readonly string _accessKeyId;
+ private readonly SecureString _secretAccessKey;
+ private readonly string _sessionToken;
+
+ public AwsCredentials(string accessKeyId, string secretAccessKey, string sessionToken)
+ : this(accessKeyId, SecureStringHelper.ToSecureString(Ensure.IsNotNull(secretAccessKey, nameof(secretAccessKey))), sessionToken)
+ {
+ }
+
+ public AwsCredentials(string accessKeyId, SecureString secretAccessKey, string sessionToken)
+ {
+ _accessKeyId = Ensure.IsNotNull(accessKeyId, nameof(accessKeyId));
+ _secretAccessKey = Ensure.IsNotNull(secretAccessKey, nameof(secretAccessKey));
+ _sessionToken = sessionToken; // can be null
+ }
+
+ public string AccessKeyId => _accessKeyId;
+
+ ///
+ /// Expiration and caching related logic happens on AWS.SDK side.
+ ///
+ public DateTime? Expiration => (DateTime?)null;
+ public SecureString SecretAccessKey => _secretAccessKey;
+ public string SessionToken => _sessionToken;
+ public bool ShouldBeRefreshed => true;
+
+ public BsonDocument GetKmsCredentials() =>
+ new BsonDocument
+ {
+ { "accessKeyId", _accessKeyId },
+ { "secretAccessKey", SecureStringHelper.ToInsecureString(_secretAccessKey) },
+ { "sessionToken", _sessionToken, _sessionToken != null }
+ };
+ }
+
+ internal class AwsAuthenticationCredentialsProvider : IExternalAuthenticationCredentialsProvider, ICredentialsCache
+ {
+ private readonly object _lock = new object();
+
+ public void Clear()
+ {
+ lock (_lock)
+ {
+ FallbackCredentialsFactory.Reset();
+ }
+ }
+
+ public AwsCredentials CreateCredentialsFromExternalSource(CancellationToken cancellationToken)
+ {
+ AWSCredentials credentialsSource;
+ lock (_lock)
+ {
+ // returns cached credentials source immediately. Only if cached source unavailable, makes quite heavy steps
+ credentialsSource = FallbackCredentialsFactory.GetCredentials();
+ }
+ var immutableCredentials = credentialsSource.GetCredentials();
+ return CreateAwsCredentials(immutableCredentials);
+ }
+
+ public async Task CreateCredentialsFromExternalSourceAsync(CancellationToken cancellationToken)
+ {
+ AWSCredentials credentialsSource;
+ lock (_lock)
+ {
+ // returns cached credentials source immediately. Only if cached source unavailable, makes quite heavy steps
+ credentialsSource = FallbackCredentialsFactory.GetCredentials();
+ }
+ var immutableCredentials = await credentialsSource.GetCredentialsAsync().ConfigureAwait(false);
+ return CreateAwsCredentials(immutableCredentials);
+ }
+
+ private AwsCredentials CreateAwsCredentials(ImmutableCredentials immutableCredentials)
+ {
+ var token = immutableCredentials.Token;
+ return new AwsCredentials(immutableCredentials.AccessKey, immutableCredentials.SecretKey, string.IsNullOrEmpty(token) ? null : token);
+ }
+ }
+}
diff --git a/src/MongoDB.Driver.Core/Core/Authentication/External/AzureAuthenticationCredentialsProvider.cs b/src/MongoDB.Driver.Core/Core/Authentication/External/AzureAuthenticationCredentialsProvider.cs
new file mode 100644
index 00000000000..b46697e6572
--- /dev/null
+++ b/src/MongoDB.Driver.Core/Core/Authentication/External/AzureAuthenticationCredentialsProvider.cs
@@ -0,0 +1,111 @@
+/* Copyright 2010-present MongoDB Inc.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+using System;
+using System.Net.Http;
+using System.Threading;
+using System.Threading.Tasks;
+using MongoDB.Bson;
+using MongoDB.Driver.Core.Misc;
+
+namespace MongoDB.Driver.Core.Authentication.External
+{
+ internal sealed class AzureCredentials : IExternalCredentials
+ {
+ // credentials are considered expired when: Expiration - now < 1 mins
+ private static readonly TimeSpan __overlapWhereExpired = TimeSpan.FromMinutes(1);
+
+ private readonly DateTime? _expiration;
+ private readonly string _accessToken;
+
+ public AzureCredentials(string accessToken, DateTime? expiration)
+ {
+ _accessToken = Ensure.IsNotNull(accessToken, nameof(accessToken));
+ _expiration = expiration; // can be null
+ }
+
+ public string AccessToken => _accessToken;
+ public DateTime? Expiration => _expiration;
+ public bool ShouldBeRefreshed => _expiration.HasValue ? (_expiration.Value - DateTime.UtcNow) < __overlapWhereExpired : true;
+
+ public BsonDocument GetKmsCredentials() => new BsonDocument("accessToken", _accessToken);
+ }
+
+ internal sealed class AzureAuthenticationCredentialsProvider : IExternalAuthenticationCredentialsProvider
+ {
+ private readonly AzureHttpClientHelper _azureHttpClientHelper;
+
+ public AzureAuthenticationCredentialsProvider(IHttpClientWrapper httpClientWrapper) => _azureHttpClientHelper = new AzureHttpClientHelper(httpClientWrapper);
+
+ public AzureCredentials CreateCredentialsFromExternalSource(CancellationToken cancellationToken) =>
+ CreateCredentialsFromExternalSourceAsync(cancellationToken).GetAwaiter().GetResult();
+
+ public async Task CreateCredentialsFromExternalSourceAsync(CancellationToken cancellationToken)
+ {
+ var startTime = DateTime.UtcNow;
+ var response = await _azureHttpClientHelper.GetIMDSesponseAsync(cancellationToken).ConfigureAwait(false);
+ return CreateAzureCredentialsFromAzureIMDSResponse(response, startTime);
+ }
+
+ private AzureCredentials CreateAzureCredentialsFromAzureIMDSResponse(string azureResponse, DateTime startTime)
+ {
+ if (!BsonDocument.TryParse(azureResponse, out var parsedResponse))
+ {
+ throw new InvalidOperationException("Azure IMDS response must be in Json format.");
+ }
+ var accessToken = parsedResponse.GetValue("access_token", null)?.AsString;
+ if (accessToken == null)
+ {
+ throw new InvalidOperationException("Azure IMDS response must contain access_token.");
+ }
+ var expiresIn = parsedResponse.GetValue("expires_in", null)?.AsString;
+ if (!int.TryParse(expiresIn, out var expiresInSeconds))
+ {
+ var messageDetails = expiresIn?.ToString() ?? "null";
+ throw new InvalidOperationException($"Azure IMDS response must contain 'expires_in' integer, but was {messageDetails}.");
+ }
+ var expirationDateTime = startTime.AddSeconds(expiresInSeconds);
+
+ return new AzureCredentials(accessToken, expirationDateTime);
+ }
+
+ // nested types
+ private class AzureHttpClientHelper
+ {
+ #region static
+ private static readonly Uri __IMDSRequestUri = new Uri(
+ baseUri: new Uri("http://169.254.169.254"),
+ relativeUri: "metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://vault.azure.net");
+ #endregion
+
+ private readonly IHttpClientWrapper _httpClientWrapper;
+
+ public AzureHttpClientHelper(IHttpClientWrapper httpClientWrapper) => _httpClientWrapper = Ensure.IsNotNull(httpClientWrapper, nameof(httpClientWrapper));
+
+ public async Task GetIMDSesponseAsync(CancellationToken cancellationToken)
+ {
+ var credentialsRequest = new HttpRequestMessage
+ {
+ RequestUri = __IMDSRequestUri,
+ Method = HttpMethod.Get
+ };
+ credentialsRequest.Headers.Add("Metadata", "true");
+ credentialsRequest.Headers.Add("Accept", "application/json");
+
+ return await _httpClientWrapper.GetHttpContentAsync(credentialsRequest, "Failed to acquire IMDS access token.", cancellationToken).ConfigureAwait(false);
+ }
+ }
+ }
+}
diff --git a/src/MongoDB.Driver.Core/Core/Authentication/External/CacheableCredentialsProvider.cs b/src/MongoDB.Driver.Core/Core/Authentication/External/CacheableCredentialsProvider.cs
new file mode 100644
index 00000000000..75310ac37ad
--- /dev/null
+++ b/src/MongoDB.Driver.Core/Core/Authentication/External/CacheableCredentialsProvider.cs
@@ -0,0 +1,98 @@
+/* Copyright 2010-present MongoDB Inc.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+using System.Threading;
+using System.Threading.Tasks;
+using MongoDB.Driver.Core.Misc;
+
+namespace MongoDB.Driver.Core.Authentication.External
+{
+ internal interface ICredentialsCache where TCredentials : IExternalCredentials
+ {
+ void Clear();
+ }
+
+ internal sealed class CacheableCredentialsProvider : IExternalAuthenticationCredentialsProvider, ICredentialsCache
+ where TCredentials : IExternalCredentials
+ {
+ private TCredentials _cachedCredentials;
+ private readonly IExternalAuthenticationCredentialsProvider _provider;
+
+ public CacheableCredentialsProvider(IExternalAuthenticationCredentialsProvider provider)
+ {
+ _provider = Ensure.IsNotNull(provider, nameof(provider));
+ }
+
+ public TCredentials Credentials => _cachedCredentials;
+
+ public TCredentials CreateCredentialsFromExternalSource(CancellationToken cancellationToken = default)
+ {
+ var cachedCredentials = _cachedCredentials;
+ if (IsValidCache(cachedCredentials))
+ {
+ return cachedCredentials;
+ }
+ else
+ {
+ Clear();
+ try
+ {
+ cachedCredentials = _provider.CreateCredentialsFromExternalSource(cancellationToken);
+ if (cachedCredentials.Expiration.HasValue) // allows caching
+ {
+ _cachedCredentials = cachedCredentials;
+ }
+ return cachedCredentials;
+ }
+ catch
+ {
+ Clear();
+ throw;
+ }
+ }
+ }
+
+ public async Task CreateCredentialsFromExternalSourceAsync(CancellationToken cancellationToken = default)
+ {
+ var cachedCredentials = _cachedCredentials;
+ if (IsValidCache(cachedCredentials))
+ {
+ return cachedCredentials;
+ }
+ else
+ {
+ Clear();
+ try
+ {
+ cachedCredentials = await _provider.CreateCredentialsFromExternalSourceAsync(cancellationToken).ConfigureAwait(false);
+ if (cachedCredentials.Expiration.HasValue) // allows caching
+ {
+ _cachedCredentials = cachedCredentials;
+ }
+ return cachedCredentials;
+ }
+ catch
+ {
+ Clear();
+ throw;
+ }
+ }
+ }
+
+ // private methods
+ private bool IsValidCache(TCredentials credentials) => credentials != null && !credentials.ShouldBeRefreshed;
+ public void Clear() => _cachedCredentials = default;
+ }
+}
diff --git a/src/MongoDB.Driver.Core/Core/Authentication/External/ExternalCredentialsAuthenticators.cs b/src/MongoDB.Driver.Core/Core/Authentication/External/ExternalCredentialsAuthenticators.cs
new file mode 100644
index 00000000000..ff9814a4429
--- /dev/null
+++ b/src/MongoDB.Driver.Core/Core/Authentication/External/ExternalCredentialsAuthenticators.cs
@@ -0,0 +1,52 @@
+/* Copyright 2010-present MongoDB Inc.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+using System;
+using MongoDB.Driver.Core.Misc;
+
+namespace MongoDB.Driver.Core.Authentication.External
+{
+ internal sealed class ExternalCredentialsAuthenticators
+ {
+ #region static
+ private static Lazy __instance = new Lazy(() => new ExternalCredentialsAuthenticators(), isThreadSafe: true);
+ // public static
+ public static ExternalCredentialsAuthenticators Instance => __instance.Value;
+ #endregion
+
+ private readonly IHttpClientWrapper _httpClientWrapper;
+ private readonly Lazy> _awsExternalAuthenticationCredentialsProvider;
+ private readonly Lazy> _azureExternalAuthenticationCredentialsProvider;
+ private readonly Lazy> _gcpExternalAuthenticationCredentialsProvider;
+
+ internal ExternalCredentialsAuthenticators() : this(new HttpClientWrapper())
+ {
+ }
+
+ internal ExternalCredentialsAuthenticators(IHttpClientWrapper httpClientWrapper)
+ {
+ _httpClientWrapper = Ensure.IsNotNull(httpClientWrapper, nameof(httpClientWrapper));
+ _awsExternalAuthenticationCredentialsProvider = new Lazy>(() => new AwsAuthenticationCredentialsProvider(), isThreadSafe: true);
+ _azureExternalAuthenticationCredentialsProvider = new Lazy>(() => new CacheableCredentialsProvider(new AzureAuthenticationCredentialsProvider(_httpClientWrapper)), isThreadSafe: true);
+ _gcpExternalAuthenticationCredentialsProvider = new Lazy>(() => new GcpAuthenticationCredentialsProvider(_httpClientWrapper), isThreadSafe: true);
+ }
+
+ public IExternalAuthenticationCredentialsProvider Aws => _awsExternalAuthenticationCredentialsProvider.Value;
+ public IExternalAuthenticationCredentialsProvider Azure => _azureExternalAuthenticationCredentialsProvider.Value;
+ public IExternalAuthenticationCredentialsProvider Gcp => _gcpExternalAuthenticationCredentialsProvider.Value;
+
+ internal IHttpClientWrapper HttpClientWrapper => _httpClientWrapper;
+ }
+}
diff --git a/src/MongoDB.Driver.Core/Core/Authentication/External/GcpAuthenticationCredentialsProvider.cs b/src/MongoDB.Driver.Core/Core/Authentication/External/GcpAuthenticationCredentialsProvider.cs
new file mode 100644
index 00000000000..163b168f06c
--- /dev/null
+++ b/src/MongoDB.Driver.Core/Core/Authentication/External/GcpAuthenticationCredentialsProvider.cs
@@ -0,0 +1,85 @@
+/* Copyright 2010-present MongoDB Inc.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+using System;
+using System.Net.Http;
+using System.Threading;
+using System.Threading.Tasks;
+using MongoDB.Bson;
+using MongoDB.Driver.Core.Misc;
+
+namespace MongoDB.Driver.Core.Authentication.External
+{
+ internal sealed class GcpCredentials : IExternalCredentials
+ {
+ private readonly string _accessToken;
+
+ public GcpCredentials(string accessToken) => _accessToken = accessToken;
+
+ public string AccessToken => _accessToken;
+
+ public DateTime? Expiration => null;
+
+ public bool ShouldBeRefreshed => true;
+
+ public BsonDocument GetKmsCredentials() => new BsonDocument("accessToken", _accessToken);
+ }
+
+ internal sealed class GcpAuthenticationCredentialsProvider : IExternalAuthenticationCredentialsProvider
+ {
+ private readonly GcpHttpClientHelper _gcpHttpClientHelper;
+
+ public GcpAuthenticationCredentialsProvider(IHttpClientWrapper httpClientWrapper) => _gcpHttpClientHelper = new GcpHttpClientHelper(httpClientWrapper);
+
+ public GcpCredentials CreateCredentialsFromExternalSource(CancellationToken cancellationToken) =>
+ CreateCredentialsFromExternalSourceAsync(cancellationToken).GetAwaiter().GetResult();
+
+ public async Task CreateCredentialsFromExternalSourceAsync(CancellationToken cancellationToken)
+ {
+ var accessToken = await _gcpHttpClientHelper.GetAccessTokenAsync(cancellationToken).ConfigureAwait(false);
+ return new GcpCredentials(accessToken);
+ }
+
+ // nested types
+ private class GcpHttpClientHelper
+ {
+ // private static
+ private static readonly string __defaultGceMetadataHost = "metadata.google.internal";
+ private readonly IHttpClientWrapper _httpClientWrapper;
+
+ public GcpHttpClientHelper(IHttpClientWrapper httpClientWrapper) => _httpClientWrapper = Ensure.IsNotNull(httpClientWrapper, nameof(httpClientWrapper));
+
+ public async Task GetAccessTokenAsync(CancellationToken cancellationToken)
+ {
+ var host = Environment.GetEnvironmentVariable("GCE_METADATA_HOST") ?? __defaultGceMetadataHost;
+
+ var tokenRequest = new HttpRequestMessage
+ {
+ RequestUri = new Uri($"http://{host}/computeMetadata/v1/instance/service-accounts/default/token"),
+ Method = HttpMethod.Get
+ };
+ tokenRequest.Headers.Add("Metadata-Flavor", "Google");
+
+ var response = await _httpClientWrapper.GetHttpContentAsync(tokenRequest, "Failed to acquire gce metadata credentials.", cancellationToken).ConfigureAwait(false);
+ if (string.IsNullOrEmpty(response))
+ {
+ throw new MongoClientException($"The metadata host response is empty.");
+ }
+ var parsedResponse = BsonDocument.Parse(response);
+ return parsedResponse.GetValue("access_token", defaultValue: null)?.AsString ?? throw new MongoClientException($"The metadata host response {response} doesn't contain access_token.");
+ }
+ }
+ }
+}
diff --git a/src/MongoDB.Driver.Core/Core/Authentication/External/HttpClientWrapper.cs b/src/MongoDB.Driver.Core/Core/Authentication/External/HttpClientWrapper.cs
new file mode 100644
index 00000000000..b826e6dc811
--- /dev/null
+++ b/src/MongoDB.Driver.Core/Core/Authentication/External/HttpClientWrapper.cs
@@ -0,0 +1,66 @@
+/* Copyright 2010-present MongoDB Inc.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+using System;
+using System.Net.Http;
+using System.Threading;
+using System.Threading.Tasks;
+using MongoDB.Driver.Core.Misc;
+
+namespace MongoDB.Driver.Core.Authentication.External
+{
+ internal interface IHttpClientWrapper
+ {
+ Task GetHttpContentAsync(HttpRequestMessage request, string exceptionMessage, CancellationToken cancellationToken);
+ }
+
+ internal sealed class HttpClientWrapper : IHttpClientWrapper
+ {
+ #region static
+ public static HttpClient CreateHttpClient() => new HttpClient() { Timeout = TimeSpan.FromSeconds(10) };
+ #endregion
+
+ private readonly HttpClient _httpClient;
+
+ public HttpClientWrapper() : this(CreateHttpClient())
+ { }
+
+ internal HttpClientWrapper(HttpClient httpClient)
+ {
+ _httpClient = Ensure.IsNotNull(httpClient, nameof(httpClient));
+ }
+
+ public async Task GetHttpContentAsync(HttpRequestMessage request, string exceptionMessage, CancellationToken cancellationToken)
+ {
+ HttpResponseMessage response;
+ string content = null;
+ try
+ {
+ response = await _httpClient.SendAsync(request, cancellationToken).ConfigureAwait(false);
+ content = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
+ response.EnsureSuccessStatusCode();
+ return content;
+ }
+ catch (Exception ex) when (ex is OperationCanceledException or HttpRequestException)
+ {
+ if (content != null)
+ {
+ exceptionMessage = $"{exceptionMessage} Response body: {content}.";
+ }
+ throw new MongoClientException(exceptionMessage, ex);
+ }
+ }
+ }
+}
diff --git a/src/MongoDB.Driver.Core/Core/Authentication/External/IExternalAuthenticationCredentialsProvider.cs b/src/MongoDB.Driver.Core/Core/Authentication/External/IExternalAuthenticationCredentialsProvider.cs
new file mode 100644
index 00000000000..cb696283fba
--- /dev/null
+++ b/src/MongoDB.Driver.Core/Core/Authentication/External/IExternalAuthenticationCredentialsProvider.cs
@@ -0,0 +1,26 @@
+/* Copyright 2010-present MongoDB Inc.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace MongoDB.Driver.Core.Authentication.External
+{
+ internal interface IExternalAuthenticationCredentialsProvider where TCredentials : IExternalCredentials
+ {
+ TCredentials CreateCredentialsFromExternalSource(CancellationToken cancellationToken = default);
+ Task CreateCredentialsFromExternalSourceAsync(CancellationToken cancellationToken = default);
+ }
+}
diff --git a/tests/MongoDB.Driver.Core.TestHelpers/Logging/ILogger.cs b/src/MongoDB.Driver.Core/Core/Authentication/External/IExternalCredentials.cs
similarity index 65%
rename from tests/MongoDB.Driver.Core.TestHelpers/Logging/ILogger.cs
rename to src/MongoDB.Driver.Core/Core/Authentication/External/IExternalCredentials.cs
index 6303b90f92d..7a1bb13b914 100644
--- a/tests/MongoDB.Driver.Core.TestHelpers/Logging/ILogger.cs
+++ b/src/MongoDB.Driver.Core/Core/Authentication/External/IExternalCredentials.cs
@@ -1,4 +1,4 @@
-/* Copyright 2021-present MongoDB Inc.
+/* Copyright 2010-present MongoDB Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -13,14 +13,15 @@
* limitations under the License.
*/
-namespace MongoDB.Driver.Core.TestHelpers.Logging
-{
- public interface ILogger
- {
- public void Log(LogLevel logLevel, string decoration, string format, params object[] arguments);
- }
+using System;
+using MongoDB.Bson;
- public interface ILogger : ILogger
+namespace MongoDB.Driver.Core.Authentication.External
+{
+ internal interface IExternalCredentials
{
+ DateTime? Expiration { get; }
+ bool ShouldBeRefreshed { get; }
+ BsonDocument GetKmsCredentials();
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Authentication/MongoAWSAuthenticator.cs b/src/MongoDB.Driver.Core/Core/Authentication/MongoAWSAuthenticator.cs
index 8441be7a5fb..5858930dc9f 100644
--- a/src/MongoDB.Driver.Core/Core/Authentication/MongoAWSAuthenticator.cs
+++ b/src/MongoDB.Driver.Core/Core/Authentication/MongoAWSAuthenticator.cs
@@ -16,14 +16,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
-using System.Net.Http;
using System.Security;
+using System.Threading;
using System.Threading.Tasks;
using MongoDB.Bson;
using MongoDB.Bson.Serialization;
+using MongoDB.Driver.Core.Authentication.External;
using MongoDB.Driver.Core.Connections;
using MongoDB.Driver.Core.Misc;
-using MongoDB.Shared;
namespace MongoDB.Driver.Core.Authentication
{
@@ -53,6 +53,7 @@ private static MongoAWSMechanism CreateMechanism(
UsernamePasswordCredential credential,
IEnumerable> properties,
IRandomByteGenerator randomByteGenerator,
+ IExternalAuthenticationCredentialsProvider externalAuthenticationCredentialsProvider,
IClock clock)
{
if (credential.Source != "$external")
@@ -60,7 +61,7 @@ private static MongoAWSMechanism CreateMechanism(
throw new ArgumentException("MONGODB-AWS authentication may only use the $external source.", nameof(credential));
}
- return CreateMechanism(credential.Username, credential.Password, properties, randomByteGenerator, clock);
+ return CreateMechanism(credential.Username, credential.Password, properties, randomByteGenerator, externalAuthenticationCredentialsProvider, clock);
}
private static MongoAWSMechanism CreateMechanism(
@@ -68,18 +69,12 @@ private static MongoAWSMechanism CreateMechanism(
SecureString password,
IEnumerable> properties,
IRandomByteGenerator randomByteGenerator,
+ IExternalAuthenticationCredentialsProvider externalAuthenticationCredentialsProvider,
IClock clock)
{
var awsCredentials =
CreateAwsCredentialsFromMongoCredentials(username, password, properties) ??
- CreateAwsCredentialsFromEnvironmentVariables() ??
- CreateAwsCredentialsFromEcsResponse() ??
- CreateAwsCredentialsFromEc2Response();
-
- if (awsCredentials == null)
- {
- throw new InvalidOperationException("Unable to find credentials for MONGODB-AWS authentication.");
- }
+ externalAuthenticationCredentialsProvider.CreateCredentialsFromExternalSource();
return new MongoAWSMechanism(awsCredentials, randomByteGenerator, clock);
}
@@ -109,60 +104,6 @@ private static AwsCredentials CreateAwsCredentialsFromMongoCredentials(string us
return new AwsCredentials(accessKeyId: username, secretAccessKey: password, sessionToken);
}
- private static AwsCredentials CreateAwsCredentialsFromEnvironmentVariables()
- {
- var accessKeyId = Environment.GetEnvironmentVariable("AWS_ACCESS_KEY_ID");
- var secretAccessKey = Environment.GetEnvironmentVariable("AWS_SECRET_ACCESS_KEY");
- var sessionToken = Environment.GetEnvironmentVariable("AWS_SESSION_TOKEN");
-
- if (accessKeyId == null && secretAccessKey == null && sessionToken == null)
- {
- return null;
- }
- if (secretAccessKey != null && accessKeyId == null)
- {
- throw new InvalidOperationException("When using MONGODB-AWS authentication if a secret access key is provided via environment variables then an access key ID must be provided also.");
- }
- if (accessKeyId != null && secretAccessKey == null)
- {
- throw new InvalidOperationException("When using MONGODB-AWS authentication if an access key ID is provided via environment variables then a secret access key must be provided also.");
- }
- if (sessionToken != null && (accessKeyId == null || secretAccessKey == null))
- {
- throw new InvalidOperationException("When using MONGODB-AWS authentication if a session token is provided via environment variables then an access key ID and a secret access key must be provided also.");
- }
-
- return new AwsCredentials(accessKeyId, SecureStringHelper.ToSecureString(secretAccessKey), sessionToken);
- }
-
- private static AwsCredentials CreateAwsCredentialsFromEcsResponse()
- {
- var relativeUri = Environment.GetEnvironmentVariable("AWS_CONTAINER_CREDENTIALS_RELATIVE_URI");
- if (relativeUri == null)
- {
- return null;
- }
-
- var response = AwsHttpClientHelper.GetECSResponseAsync(relativeUri).GetAwaiter().GetResult();
- var parsedResponse = BsonDocument.Parse(response);
- var accessKeyId = parsedResponse.GetValue("AccessKeyId", null)?.AsString;
- var secretAccessKey = parsedResponse.GetValue("SecretAccessKey", null)?.AsString;
- var sessionToken = parsedResponse.GetValue("Token", null)?.AsString;
-
- return new AwsCredentials(accessKeyId, SecureStringHelper.ToSecureString(secretAccessKey), sessionToken);
- }
-
- private static AwsCredentials CreateAwsCredentialsFromEc2Response()
- {
- var response = AwsHttpClientHelper.GetEC2ResponseAsync().GetAwaiter().GetResult();
- var parsedResponse = BsonDocument.Parse(response);
- var accessKeyId = parsedResponse.GetValue("AccessKeyId", null)?.AsString;
- var secretAccessKey = parsedResponse.GetValue("SecretAccessKey", null)?.AsString;
- var sessionToken = parsedResponse.GetValue("Token", null)?.AsString;
-
- return new AwsCredentials(accessKeyId, SecureStringHelper.ToSecureString(secretAccessKey), sessionToken);
- }
-
private static string ExtractSessionTokenFromMechanismProperties(IEnumerable> properties)
{
if (properties != null)
@@ -194,18 +135,9 @@ private static void ValidateMechanismProperties(IEnumerable
- /// Initializes a new instance of the class.
- ///
- /// The credentials.
- /// The properties.
- [Obsolete("Use the newest overload instead.")]
- public MongoAWSAuthenticator(UsernamePasswordCredential credential, IEnumerable> properties)
- : this(credential, properties, serverApi: null)
- {
- }
+ private readonly ICredentialsCache _credentialsCache;
+ // constructors
///
/// Initializes a new instance of the class.
///
@@ -216,18 +148,13 @@ public MongoAWSAuthenticator(
UsernamePasswordCredential credential,
IEnumerable> properties,
ServerApi serverApi)
- : this(credential, properties, new DefaultRandomByteGenerator(), SystemClock.Instance, serverApi)
- {
- }
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// The username.
- /// The properties.
- [Obsolete("Use the newest overload instead.")]
- public MongoAWSAuthenticator(string username, IEnumerable> properties)
- : this(username, properties, serverApi: null)
+ : this(
+ credential,
+ properties,
+ new DefaultRandomByteGenerator(),
+ ExternalCredentialsAuthenticators.Instance.Aws,
+ SystemClock.Instance,
+ serverApi)
{
}
@@ -241,7 +168,13 @@ public MongoAWSAuthenticator(
string username,
IEnumerable> properties,
ServerApi serverApi)
- : this(username, properties, new DefaultRandomByteGenerator(), SystemClock.Instance, serverApi)
+ : this(
+ username,
+ properties,
+ new DefaultRandomByteGenerator(),
+ ExternalCredentialsAuthenticators.Instance.Aws,
+ SystemClock.Instance,
+ serverApi)
{
}
@@ -249,20 +182,24 @@ internal MongoAWSAuthenticator(
UsernamePasswordCredential credential,
IEnumerable> properties,
IRandomByteGenerator randomByteGenerator,
+ IExternalAuthenticationCredentialsProvider externalAuthenticationCredentialsProvider,
IClock clock,
ServerApi serverApi)
- : base(CreateMechanism(credential, properties, randomByteGenerator, clock), serverApi)
+ : base(CreateMechanism(credential, properties, randomByteGenerator, externalAuthenticationCredentialsProvider, clock), serverApi)
{
+ _credentialsCache = externalAuthenticationCredentialsProvider as ICredentialsCache; // can be null
}
internal MongoAWSAuthenticator(
string username,
IEnumerable> properties,
IRandomByteGenerator randomByteGenerator,
+ IExternalAuthenticationCredentialsProvider externalAuthenticationCredentialsProvider,
IClock clock,
ServerApi serverApi)
- : base(CreateMechanism(username, null, properties, randomByteGenerator, clock), serverApi)
+ : base(CreateMechanism(username, null, properties, randomByteGenerator, externalAuthenticationCredentialsProvider, clock), serverApi)
{
+ _credentialsCache = externalAuthenticationCredentialsProvider as ICredentialsCache; // can be null
}
///
@@ -271,115 +208,35 @@ public override string DatabaseName
get { return "$external"; }
}
- // nested classes
- private class AwsCredentials
- {
- private readonly string _accessKeyId;
- private readonly SecureString _secretAccessKey;
- private readonly string _sessionToken;
-
- public AwsCredentials(string accessKeyId, SecureString secretAccessKey, string sessionToken)
- {
- _accessKeyId = Ensure.IsNotNull(accessKeyId, nameof(accessKeyId));
- _secretAccessKey = Ensure.IsNotNull(secretAccessKey, nameof(secretAccessKey));
- _sessionToken = sessionToken; // can be null
- }
-
- public string AccessKeyId => _accessKeyId;
- public SecureString SecretAccessKey => _secretAccessKey;
- public string SessionToken => _sessionToken;
- }
-
- private static class AwsHttpClientHelper
+ ///
+ public override void Authenticate(IConnection connection, ConnectionDescription description, CancellationToken cancellationToken)
{
- // private static
- private static readonly Uri __ec2BaseUri = new Uri("http://169.254.169.254");
- private static readonly Uri __ecsBaseUri = new Uri("http://169.254.170.2");
- private static readonly Lazy __httpClientInstance = new Lazy(() => new HttpClient
- {
- Timeout = TimeSpan.FromSeconds(10)
- });
-
- public static async Task GetEC2ResponseAsync()
- {
- var tokenRequest = CreateTokenRequest(__ec2BaseUri);
- var token = await GetHttpContentAsync(tokenRequest, "Failed to acquire EC2 token.").ConfigureAwait(false);
-
- var roleRequest = CreateRoleRequest(__ec2BaseUri, token);
- var roleName = await GetHttpContentAsync(roleRequest, "Failed to acquire EC2 role name.").ConfigureAwait(false);
-
- var credentialsRequest = CreateCredentialsRequest(__ec2BaseUri, roleName, token);
- var credentials = await GetHttpContentAsync(credentialsRequest, "Failed to acquire EC2 credentials.").ConfigureAwait(false);
-
- return credentials;
- }
-
- public static async Task GetECSResponseAsync(string relativeUri)
- {
- var credentialsRequest = new HttpRequestMessage
- {
- RequestUri = new Uri(__ecsBaseUri, relativeUri),
- Method = HttpMethod.Get
- };
-
- return await GetHttpContentAsync(credentialsRequest, "Failed to acquire ECS credentials.").ConfigureAwait(false);
- }
-
- // private static methods
- private static HttpRequestMessage CreateCredentialsRequest(Uri baseUri, string roleName, string token)
+ try
{
- var credentialsUri = new Uri(baseUri, "latest/meta-data/iam/security-credentials/");
- var credentialsRequest = new HttpRequestMessage
- {
- RequestUri = new Uri(credentialsUri, roleName),
- Method = HttpMethod.Get
- };
- credentialsRequest.Headers.Add("X-aws-ec2-metadata-token", token);
-
- return credentialsRequest;
+ base.Authenticate(connection, description, cancellationToken);
}
-
- private static HttpRequestMessage CreateRoleRequest(Uri baseUri, string token)
+ catch
{
- var roleRequest = new HttpRequestMessage
- {
- RequestUri = new Uri(baseUri, "latest/meta-data/iam/security-credentials/"),
- Method = HttpMethod.Get
- };
- roleRequest.Headers.Add("X-aws-ec2-metadata-token", token);
-
- return roleRequest;
+ _credentialsCache?.Clear();
+ throw;
}
+ }
- private static HttpRequestMessage CreateTokenRequest(Uri baseUri)
+ ///
+ public override async Task AuthenticateAsync(IConnection connection, ConnectionDescription description, CancellationToken cancellationToken)
+ {
+ try
{
- var tokenRequest = new HttpRequestMessage
- {
- RequestUri = new Uri(baseUri, "latest/api/token"),
- Method = HttpMethod.Put,
- };
- tokenRequest.Headers.Add("X-aws-ec2-metadata-token-ttl-seconds", "30");
-
- return tokenRequest;
+ await base.AuthenticateAsync(connection, description, cancellationToken).ConfigureAwait(false);
}
-
- private static async Task GetHttpContentAsync(HttpRequestMessage request, string exceptionMessage)
+ catch
{
- HttpResponseMessage response;
- try
- {
- response = await __httpClientInstance.Value.SendAsync(request).ConfigureAwait(false);
- response.EnsureSuccessStatusCode();
- }
- catch (Exception ex) when (ex is OperationCanceledException || ex is MongoClientException)
- {
- throw new MongoClientException(exceptionMessage, ex);
- }
-
- return await response.Content.ReadAsStringAsync().ConfigureAwait(false);
+ _credentialsCache?.Clear();
+ throw;
}
}
+ // nested classes
private class MongoAWSMechanism : ISaslMechanism
{
private readonly AwsCredentials _awsCredentials;
diff --git a/src/MongoDB.Driver.Core/Core/Authentication/SaslAuthenticator.cs b/src/MongoDB.Driver.Core/Core/Authentication/SaslAuthenticator.cs
index 75fc13c63d8..d05223480ca 100644
--- a/src/MongoDB.Driver.Core/Core/Authentication/SaslAuthenticator.cs
+++ b/src/MongoDB.Driver.Core/Core/Authentication/SaslAuthenticator.cs
@@ -75,7 +75,7 @@ public string Name
// methods
///
- public void Authenticate(IConnection connection, ConnectionDescription description, CancellationToken cancellationToken)
+ public virtual void Authenticate(IConnection connection, ConnectionDescription description, CancellationToken cancellationToken)
{
Ensure.IsNotNull(connection, nameof(connection));
Ensure.IsNotNull(description, nameof(description));
@@ -114,7 +114,7 @@ public void Authenticate(IConnection connection, ConnectionDescription descripti
}
///
- public async Task AuthenticateAsync(IConnection connection, ConnectionDescription description, CancellationToken cancellationToken)
+ public virtual async Task AuthenticateAsync(IConnection connection, ConnectionDescription description, CancellationToken cancellationToken)
{
Ensure.IsNotNull(connection, nameof(connection));
Ensure.IsNotNull(description, nameof(description));
diff --git a/src/MongoDB.Driver.Core/Core/Bindings/CoreSession.cs b/src/MongoDB.Driver.Core/Core/Bindings/CoreSession.cs
index 1be2d69dda5..eca33510faf 100644
--- a/src/MongoDB.Driver.Core/Core/Bindings/CoreSession.cs
+++ b/src/MongoDB.Driver.Core/Core/Bindings/CoreSession.cs
@@ -513,6 +513,12 @@ private void EnsureStartTransactionCanBeCalled()
private void EnsureTransactionsAreSupported()
{
+ if (_cluster.Description.Type == ClusterType.LoadBalanced)
+ {
+ // LB always supports transactions
+ return;
+ }
+
var connectedDataBearingServers = _cluster.Description.Servers.Where(s => s.State == ServerState.Connected && s.IsDataBearing).ToList();
if (connectedDataBearingServers.Count == 0)
diff --git a/src/MongoDB.Driver.Core/Core/Clusters/Cluster.cs b/src/MongoDB.Driver.Core/Core/Clusters/Cluster.cs
index 4add0b293cd..188786f6b75 100644
--- a/src/MongoDB.Driver.Core/Core/Clusters/Cluster.cs
+++ b/src/MongoDB.Driver.Core/Core/Clusters/Cluster.cs
@@ -20,10 +20,12 @@
using System.Net;
using System.Threading;
using System.Threading.Tasks;
+using Microsoft.Extensions.Logging;
using MongoDB.Driver.Core.Bindings;
using MongoDB.Driver.Core.Clusters.ServerSelectors;
using MongoDB.Driver.Core.Configuration;
using MongoDB.Driver.Core.Events;
+using MongoDB.Driver.Core.Logging;
using MongoDB.Driver.Core.Misc;
using MongoDB.Driver.Core.Servers;
using MongoDB.Libmongocrypt;
@@ -69,6 +71,8 @@ internal abstract class Cluster : ICluster
private TaskCompletionSource _descriptionChangedTaskCompletionSource;
private readonly object _descriptionLock = new object();
private readonly LatencyLimitingServerSelector _latencyLimitingServerSelector;
+ protected readonly EventLogger _clusterEventLogger;
+ protected readonly EventLogger _serverSelectionEventLogger;
private Timer _rapidHeartbeatTimer;
private readonly object _serverSelectionWaitQueueLock = new object();
private int _serverSelectionWaitQueueSize;
@@ -78,13 +82,8 @@ internal abstract class Cluster : ICluster
private readonly InterlockedInt32 _state;
private readonly InterlockedInt32 _rapidHeartbeatTimerCallbackState;
- private readonly Action _descriptionChangedEventHandler;
- private readonly Action _selectingServerEventHandler;
- private readonly Action _selectedServerEventHandler;
- private readonly Action _selectingServerFailedEventHandler;
-
// constructors
- protected Cluster(ClusterSettings settings, IClusterableServerFactory serverFactory, IEventSubscriber eventSubscriber)
+ protected Cluster(ClusterSettings settings, IClusterableServerFactory serverFactory, IEventSubscriber eventSubscriber, ILoggerFactory loggerFactory)
{
_settings = Ensure.IsNotNull(settings, nameof(settings));
Ensure.That(!_settings.LoadBalanced, "LoadBalanced mode is not supported.");
@@ -100,13 +99,11 @@ protected Cluster(ClusterSettings settings, IClusterableServerFactory serverFact
_rapidHeartbeatTimer = new Timer(RapidHeartbeatTimerCallback, null, Timeout.InfiniteTimeSpan, Timeout.InfiniteTimeSpan);
- eventSubscriber.TryGetEventHandler(out _descriptionChangedEventHandler);
- eventSubscriber.TryGetEventHandler(out _selectingServerEventHandler);
- eventSubscriber.TryGetEventHandler(out _selectedServerEventHandler);
- eventSubscriber.TryGetEventHandler(out _selectingServerFailedEventHandler);
-
_serverSessionPool = new CoreServerSessionPool(this);
+ _clusterEventLogger = loggerFactory.CreateEventLogger(eventSubscriber);
+ _serverSelectionEventLogger = loggerFactory.CreateEventLogger(eventSubscriber);
+
ClusterDescription CreateInitialDescription()
{
#pragma warning disable CS0618 // Type or member is obsolete
@@ -169,6 +166,8 @@ protected virtual void Dispose(bool disposing)
{
if (_state.TryChange(State.Disposed))
{
+ _clusterEventLogger.Logger?.LogDebug(_clusterId, "Disposing");
+
#pragma warning disable CS0618 // Type or member is obsolete
var connectionModeSwitch = _description.ConnectionModeSwitch;
var connectionMode = connectionModeSwitch == ConnectionModeSwitch.UseConnectionMode ? _description.ConnectionMode : default;
@@ -188,6 +187,8 @@ protected virtual void Dispose(bool disposing)
_rapidHeartbeatTimer.Dispose();
_cryptClient?.Dispose();
+
+ _clusterEventLogger.Logger?.LogDebug(_clusterId, "Disposed");
}
}
@@ -223,9 +224,17 @@ public virtual void Initialize()
ThrowIfDisposed();
if (_state.TryChange(State.Initial, State.Open))
{
+ _clusterEventLogger.Logger?.LogDebug(_clusterId, "Initialized");
+
if (_settings.CryptClientSettings != null)
{
_cryptClient = CryptClientCreator.CreateCryptClient(_settings.CryptClientSettings);
+
+ _clusterEventLogger.Logger?.LogDebug(
+ StructuredLogTemplateProviders.ClusterId_Message_SharedLibraryVersion,
+ _clusterId,
+ "CryptClient created. Configured shared library version: ",
+ _cryptClient.CryptSharedLibraryVersion ?? "None");
}
}
}
@@ -256,17 +265,12 @@ private void RapidHeartbeatTimerCallback(object args)
protected void OnDescriptionChanged(ClusterDescription oldDescription, ClusterDescription newDescription, bool shouldClusterDescriptionChangedEventBePublished)
{
- if (shouldClusterDescriptionChangedEventBePublished && _descriptionChangedEventHandler != null)
+ if (shouldClusterDescriptionChangedEventBePublished)
{
- _descriptionChangedEventHandler(new ClusterDescriptionChangedEvent(oldDescription, newDescription));
+ _clusterEventLogger.LogAndPublish(new ClusterDescriptionChangedEvent(oldDescription, newDescription));
}
- var handler = DescriptionChanged;
- if (handler != null)
- {
- var args = new ClusterDescriptionChangedEventArgs(oldDescription, newDescription);
- handler(this, args);
- }
+ DescriptionChanged?.Invoke(this, new ClusterDescriptionChangedEventArgs(oldDescription, newDescription));
}
public IServer SelectServer(IServerSelector selector, CancellationToken cancellationToken)
@@ -464,15 +468,11 @@ public void Dispose()
public void HandleException(Exception exception)
{
- var selectingServerFailedEventHandler = _cluster._selectingServerFailedEventHandler;
- if (selectingServerFailedEventHandler != null)
- {
- selectingServerFailedEventHandler(new ClusterSelectingServerFailedEvent(
- _description,
- _selector,
- exception,
- EventContext.OperationId));
- }
+ _cluster._serverSelectionEventLogger.LogAndPublish(new ClusterSelectingServerFailedEvent(
+ _description,
+ _selector,
+ exception,
+ EventContext.OperationId));
}
public IServer SelectServer()
@@ -485,15 +485,11 @@ public IServer SelectServer()
if (!_serverSelectionWaitQueueEntered)
{
- var selectingServerEventHandler = _cluster._selectingServerEventHandler;
- if (selectingServerEventHandler != null)
- {
- // this is our first time through...
- selectingServerEventHandler(new ClusterSelectingServerEvent(
- _description,
- _selector,
- EventContext.OperationId));
- }
+ // this is our first time through...
+ _cluster._serverSelectionEventLogger.LogAndPublish(new ClusterSelectingServerEvent(
+ _description,
+ _selector,
+ EventContext.OperationId));
}
MongoIncompatibleDriverException.ThrowIfNotSupported(_description);
@@ -530,7 +526,7 @@ public IServer SelectServer()
{
_stopwatch.Stop();
- _cluster._selectedServerEventHandler?.Invoke(new ClusterSelectedServerEvent(
+ _cluster._serverSelectionEventLogger.LogAndPublish(new ClusterSelectedServerEvent(
_description,
_selector,
selectedServer.Description,
diff --git a/src/MongoDB.Driver.Core/Core/Clusters/ClusterFactory.cs b/src/MongoDB.Driver.Core/Core/Clusters/ClusterFactory.cs
index ed0ce03fb1a..31195e36e34 100644
--- a/src/MongoDB.Driver.Core/Core/Clusters/ClusterFactory.cs
+++ b/src/MongoDB.Driver.Core/Core/Clusters/ClusterFactory.cs
@@ -13,6 +13,7 @@
* limitations under the License.
*/
+using Microsoft.Extensions.Logging;
using MongoDB.Driver.Core.Configuration;
using MongoDB.Driver.Core.Events;
using MongoDB.Driver.Core.Misc;
@@ -24,15 +25,17 @@ internal class ClusterFactory : IClusterFactory
{
// fields
private readonly IEventSubscriber _eventSubscriber;
+ private readonly ILoggerFactory _loggerFactory;
private readonly IClusterableServerFactory _serverFactory;
private readonly ClusterSettings _settings;
// constructors
- public ClusterFactory(ClusterSettings settings, IClusterableServerFactory serverFactory, IEventSubscriber eventSubscriber)
+ public ClusterFactory(ClusterSettings settings, IClusterableServerFactory serverFactory, IEventSubscriber eventSubscriber, ILoggerFactory loggerFactory)
{
_settings = Ensure.IsNotNull(settings, nameof(settings));
_serverFactory = Ensure.IsNotNull(serverFactory, nameof(serverFactory));
_eventSubscriber = Ensure.IsNotNull(eventSubscriber, nameof(eventSubscriber));
+ _loggerFactory = loggerFactory;
}
// methods
@@ -87,17 +90,17 @@ public ICluster CreateCluster()
private MultiServerCluster CreateMultiServerCluster(ClusterSettings settings)
{
- return new MultiServerCluster(settings, _serverFactory, _eventSubscriber);
+ return new MultiServerCluster(settings, _serverFactory, _eventSubscriber, _loggerFactory);
}
private SingleServerCluster CreateSingleServerCluster(ClusterSettings settings)
{
- return new SingleServerCluster(settings, _serverFactory, _eventSubscriber);
+ return new SingleServerCluster(settings, _serverFactory, _eventSubscriber, _loggerFactory);
}
private LoadBalancedCluster CreateLoadBalancedCluster(ClusterSettings setting)
{
- return new LoadBalancedCluster(setting, _serverFactory, _eventSubscriber);
+ return new LoadBalancedCluster(setting, _serverFactory, _eventSubscriber, _loggerFactory);
}
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Clusters/DnsMonitor.cs b/src/MongoDB.Driver.Core/Core/Clusters/DnsMonitor.cs
index 8cb3cec4e4b..912c55548df 100644
--- a/src/MongoDB.Driver.Core/Core/Clusters/DnsMonitor.cs
+++ b/src/MongoDB.Driver.Core/Core/Clusters/DnsMonitor.cs
@@ -18,8 +18,10 @@
using System.Linq;
using System.Net;
using System.Threading;
+using Microsoft.Extensions.Logging;
using MongoDB.Driver.Core.Configuration;
using MongoDB.Driver.Core.Events;
+using MongoDB.Driver.Core.Logging;
using MongoDB.Driver.Core.Misc;
namespace MongoDB.Driver.Core.Clusters
@@ -45,10 +47,15 @@ private static string EnsureLookupDomainNameIsValid(string lookupDomainName)
private DnsMonitorState _state;
private Exception _unhandledException;
- private readonly Action _sdamInformationEventHandler;
+ private readonly EventLogger _eventLogger;
// constructors
- public DnsMonitor(IDnsMonitoringCluster cluster, IDnsResolver dnsResolver, string lookupDomainName, IEventSubscriber eventSubscriber, CancellationToken cancellationToken)
+ public DnsMonitor(IDnsMonitoringCluster cluster,
+ IDnsResolver dnsResolver,
+ string lookupDomainName,
+ IEventSubscriber eventSubscriber,
+ ILogger logger,
+ CancellationToken cancellationToken)
{
_cluster = Ensure.IsNotNull(cluster, nameof(cluster));
_dnsResolver = Ensure.IsNotNull(dnsResolver, nameof(dnsResolver));
@@ -57,7 +64,7 @@ public DnsMonitor(IDnsMonitoringCluster cluster, IDnsResolver dnsResolver, strin
_service = "_mongodb._tcp." + _lookupDomainName;
_state = DnsMonitorState.Created;
- eventSubscriber?.TryGetEventHandler(out _sdamInformationEventHandler);
+ _eventLogger = logger.ToEventLogger(eventSubscriber);
}
// public properties
@@ -94,12 +101,7 @@ private void ThreadStart()
{
_unhandledException = exception;
- if (_sdamInformationEventHandler != null)
- {
- var message = $"Unhandled exception in DnsMonitor: {exception}.";
- var sdamInformationEvent = new SdamInformationEvent(() => message);
- _sdamInformationEventHandler(sdamInformationEvent);
- }
+ _eventLogger.LogAndPublish(exception, new SdamInformationEvent("Unhandled exception in DnsMonitor: {0}.", exception));
_state = DnsMonitorState.Failed;
return;
@@ -144,12 +146,7 @@ private List GetValidEndPoints(List srvRecords)
}
else
{
- if (_sdamInformationEventHandler != null)
- {
- var message = $"Invalid host returned by DNS SRV lookup: {host}.";
- var sdamInformationEvent = new SdamInformationEvent(() => message);
- _sdamInformationEventHandler(sdamInformationEvent);
- }
+ _eventLogger.LogAndPublish(new SdamInformationEvent("Invalid host returned by DNS SRV lookup: {0}.", host));
}
}
@@ -193,12 +190,7 @@ private void Monitor()
}
else
{
- if (_sdamInformationEventHandler != null)
- {
- var message = $"A DNS SRV query on \"{_service}\" returned no valid hosts.";
- var sdamInformationEvent = new SdamInformationEvent(() => message);
- _sdamInformationEventHandler(sdamInformationEvent);
- }
+ _eventLogger.LogAndPublish(new SdamInformationEvent("A DNS SRV query on \"{0}\" returned no valid hosts.", _service));
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Clusters/DnsMonitorFactory.cs b/src/MongoDB.Driver.Core/Core/Clusters/DnsMonitorFactory.cs
index e22393433df..e9dfd6e2e27 100644
--- a/src/MongoDB.Driver.Core/Core/Clusters/DnsMonitorFactory.cs
+++ b/src/MongoDB.Driver.Core/Core/Clusters/DnsMonitorFactory.cs
@@ -14,7 +14,9 @@
*/
using System.Threading;
+using Microsoft.Extensions.Logging;
using MongoDB.Driver.Core.Events;
+using MongoDB.Driver.Core.Logging;
using MongoDB.Driver.Core.Misc;
namespace MongoDB.Driver.Core.Clusters
@@ -22,16 +24,18 @@ namespace MongoDB.Driver.Core.Clusters
internal class DnsMonitorFactory : IDnsMonitorFactory
{
private readonly IEventSubscriber _eventSubscriber;
+ private readonly ILoggerFactory _loggerFactory;
- public DnsMonitorFactory(IEventSubscriber eventSubscriber)
+ public DnsMonitorFactory(IEventSubscriber eventSubscriber, ILoggerFactory loggerFactory)
{
_eventSubscriber = Ensure.IsNotNull(eventSubscriber, nameof(eventSubscriber));
+ _loggerFactory = loggerFactory;
}
public IDnsMonitor CreateDnsMonitor(IDnsMonitoringCluster cluster, string lookupDomainName, CancellationToken cancellationToken)
{
var dnsResolver = DnsClientWrapper.Instance;
- return new DnsMonitor(cluster, dnsResolver, lookupDomainName, _eventSubscriber, cancellationToken);
+ return new DnsMonitor(cluster, dnsResolver, lookupDomainName, _eventSubscriber, _loggerFactory?.CreateLogger(), cancellationToken);
}
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Clusters/LoadBalancedCluster.cs b/src/MongoDB.Driver.Core/Core/Clusters/LoadBalancedCluster.cs
index 7807a231bd2..9179da03c43 100644
--- a/src/MongoDB.Driver.Core/Core/Clusters/LoadBalancedCluster.cs
+++ b/src/MongoDB.Driver.Core/Core/Clusters/LoadBalancedCluster.cs
@@ -20,10 +20,12 @@
using System.Net;
using System.Threading;
using System.Threading.Tasks;
+using Microsoft.Extensions.Logging;
using MongoDB.Driver.Core.Bindings;
using MongoDB.Driver.Core.Clusters.ServerSelectors;
using MongoDB.Driver.Core.Configuration;
using MongoDB.Driver.Core.Events;
+using MongoDB.Driver.Core.Logging;
using MongoDB.Driver.Core.Misc;
using MongoDB.Driver.Core.Servers;
using MongoDB.Libmongocrypt;
@@ -43,29 +45,25 @@ internal class LoadBalancedCluster : ICluster, IDnsMonitoringCluster
private readonly IDnsMonitorFactory _dnsMonitorFactory;
private Thread _dnsMonitorThread;
private readonly CancellationTokenSource _dnsMonitorCancellationTokenSource;
- private readonly IEventSubscriber _eventSubscriber;
private IClusterableServer _server;
private readonly IClusterableServerFactory _serverFactory;
private readonly TaskCompletionSource _serverReadyTaskCompletionSource;
private readonly ICoreServerSessionPool _serverSessionPool;
private readonly ClusterSettings _settings;
private readonly InterlockedInt32 _state;
-
- private readonly Action _closingEventHandler;
- private readonly Action _closedEventHandler;
- private readonly Action _openingEventHandler;
- private readonly Action _openedEventHandler;
- private readonly Action _descriptionChangedEventHandler;
+ private readonly EventLogger _eventLogger;
public LoadBalancedCluster(
ClusterSettings settings,
IClusterableServerFactory serverFactory,
- IEventSubscriber eventSubscriber)
+ IEventSubscriber eventSubscriber,
+ ILoggerFactory loggerFactory)
: this(
settings,
serverFactory,
eventSubscriber,
- dnsMonitorFactory: new DnsMonitorFactory(new EventAggregator())) // should not trigger any events
+ loggerFactory,
+ dnsMonitorFactory: new DnsMonitorFactory(new EventAggregator(), loggerFactory)) // should not trigger any events
{
}
@@ -73,6 +71,7 @@ public LoadBalancedCluster(
ClusterSettings settings,
IClusterableServerFactory serverFactory,
IEventSubscriber eventSubscriber,
+ ILoggerFactory loggerFactory,
IDnsMonitorFactory dnsMonitorFactory)
{
#pragma warning disable CS0618 // Type or member is obsolete
@@ -110,12 +109,7 @@ public LoadBalancedCluster(
#pragma warning restore CS0618 // Type or member is obsolete
null);
- _eventSubscriber = eventSubscriber;
- eventSubscriber.TryGetEventHandler(out _closingEventHandler);
- eventSubscriber.TryGetEventHandler(out _closedEventHandler);
- eventSubscriber.TryGetEventHandler(out _openingEventHandler);
- eventSubscriber.TryGetEventHandler(out _openedEventHandler);
- eventSubscriber.TryGetEventHandler(out _descriptionChangedEventHandler);
+ _eventLogger = loggerFactory.CreateEventLogger(eventSubscriber);
}
public ClusterId ClusterId => _clusterId;
@@ -149,14 +143,15 @@ private void Dispose(bool disposing)
_dnsMonitorCancellationTokenSource.Cancel();
_dnsMonitorCancellationTokenSource.Dispose();
- _closingEventHandler?.Invoke(new ClusterClosingEvent(ClusterId));
+ _eventLogger.LogAndPublish(new ClusterClosingEvent(ClusterId));
+
var stopwatch = Stopwatch.StartNew();
if (_server != null)
{
_server.DescriptionChanged -= ServerDescriptionChangedHandler;
_server.Dispose();
}
- _closedEventHandler?.Invoke(new ClusterClosedEvent(ClusterId, stopwatch.Elapsed));
+ _eventLogger.LogAndPublish(new ClusterClosedEvent(ClusterId, stopwatch.Elapsed));
}
}
}
@@ -168,7 +163,7 @@ public void Initialize()
if (_state.TryChange(State.Initial, State.Open))
{
var stopwatch = Stopwatch.StartNew();
- _openingEventHandler?.Invoke(new ClusterOpeningEvent(ClusterId, Settings));
+ _eventLogger.LogAndPublish(new ClusterOpeningEvent(ClusterId, Settings));
if (_settings.CryptClientSettings != null)
{
@@ -190,7 +185,7 @@ public void Initialize()
_dnsMonitorThread = monitor.Start();
}
- _openedEventHandler?.Invoke(new ClusterOpenedEvent(ClusterId, Settings, stopwatch.Elapsed));
+ _eventLogger.LogAndPublish(new ClusterOpenedEvent(ClusterId, Settings, stopwatch.Elapsed));
}
}
@@ -263,10 +258,7 @@ private void UpdateClusterDescription(ClusterDescription newClusterDescription)
void OnClusterDescriptionChanged(ClusterDescription oldDescription, ClusterDescription newDescription)
{
- if (_descriptionChangedEventHandler != null)
- {
- _descriptionChangedEventHandler(new ClusterDescriptionChangedEvent(oldDescription, newDescription));
- }
+ _eventLogger.LogAndPublish(new ClusterDescriptionChangedEvent(oldDescription, newDescription));
// used only in tests and legacy
var handler = DescriptionChanged;
diff --git a/src/MongoDB.Driver.Core/Core/Clusters/MultiServerCluster.cs b/src/MongoDB.Driver.Core/Core/Clusters/MultiServerCluster.cs
index 50504382c16..f2393035b6f 100644
--- a/src/MongoDB.Driver.Core/Core/Clusters/MultiServerCluster.cs
+++ b/src/MongoDB.Driver.Core/Core/Clusters/MultiServerCluster.cs
@@ -19,6 +19,7 @@
using System.Linq;
using System.Net;
using System.Threading;
+using Microsoft.Extensions.Logging;
using MongoDB.Driver.Core.Configuration;
using MongoDB.Driver.Core.Events;
using MongoDB.Driver.Core.Misc;
@@ -42,24 +43,14 @@ internal sealed class MultiServerCluster : Cluster, IDnsMonitoringCluster
private readonly InterlockedInt32 _state;
private readonly object _updateClusterDescriptionLock = new object();
- private readonly IEventSubscriber _eventSubscriber;
- private readonly Action _closingEventHandler;
- private readonly Action _closedEventHandler;
- private readonly Action _openingEventHandler;
- private readonly Action _openedEventHandler;
- private readonly Action _addingServerEventHandler;
- private readonly Action _addedServerEventHandler;
- private readonly Action _removingServerEventHandler;
- private readonly Action _removedServerEventHandler;
- private readonly Action _sdamInformationEventHandler;
-
// constructors
public MultiServerCluster(
ClusterSettings settings,
IClusterableServerFactory serverFactory,
IEventSubscriber eventSubscriber,
+ ILoggerFactory loggerFactory,
IDnsMonitorFactory dnsMonitorFactory = null)
- : base(settings, serverFactory, eventSubscriber)
+ : base(settings, serverFactory, eventSubscriber, loggerFactory)
{
Ensure.IsGreaterThanZero(settings.EndPoints.Count, "settings.EndPoints.Count");
@@ -75,22 +66,12 @@ public MultiServerCluster(
}
#pragma warning restore CS0618 // Type or member is obsolete
- _dnsMonitorFactory = dnsMonitorFactory ?? new DnsMonitorFactory(eventSubscriber);
+ _dnsMonitorFactory = dnsMonitorFactory ?? new DnsMonitorFactory(eventSubscriber, loggerFactory);
_monitorServersCancellationTokenSource = new CancellationTokenSource();
_servers = new List();
_state = new InterlockedInt32(State.Initial);
_replicaSetName = settings.ReplicaSetName;
- _eventSubscriber = eventSubscriber;
- eventSubscriber.TryGetEventHandler(out _closingEventHandler);
- eventSubscriber.TryGetEventHandler(out _closedEventHandler);
- eventSubscriber.TryGetEventHandler(out _openingEventHandler);
- eventSubscriber.TryGetEventHandler(out _openedEventHandler);
- eventSubscriber.TryGetEventHandler(out _addingServerEventHandler);
- eventSubscriber.TryGetEventHandler(out _addedServerEventHandler);
- eventSubscriber.TryGetEventHandler(out _removingServerEventHandler);
- eventSubscriber.TryGetEventHandler(out _removedServerEventHandler);
- eventSubscriber.TryGetEventHandler(out _sdamInformationEventHandler);
}
// methods
@@ -101,10 +82,7 @@ protected override void Dispose(bool disposing)
{
if (disposing)
{
- if (_closingEventHandler != null)
- {
- _closingEventHandler(new ClusterClosingEvent(ClusterId));
- }
+ _clusterEventLogger.LogAndPublish(new ClusterClosingEvent(ClusterId));
stopwatch = Stopwatch.StartNew();
_monitorServersCancellationTokenSource.Cancel();
@@ -123,9 +101,9 @@ protected override void Dispose(bool disposing)
base.Dispose(disposing);
- if (stopwatch != null && _closedEventHandler != null)
+ if (stopwatch != null)
{
- _closedEventHandler(new ClusterClosedEvent(ClusterId, stopwatch.Elapsed));
+ _clusterEventLogger.LogAndPublish(new ClusterClosedEvent(ClusterId, stopwatch.Elapsed));
}
}
@@ -134,10 +112,7 @@ public override void Initialize()
base.Initialize();
if (_state.TryChange(State.Initial, State.Open))
{
- if (_openingEventHandler != null)
- {
- _openingEventHandler(new ClusterOpeningEvent(ClusterId, Settings));
- }
+ _clusterEventLogger.LogAndPublish(new ClusterOpeningEvent(ClusterId, Settings));
var stopwatch = Stopwatch.StartNew();
@@ -170,10 +145,7 @@ public override void Initialize()
server.Initialize();
}
- if (_openedEventHandler != null)
- {
- _openedEventHandler(new ClusterOpenedEvent(ClusterId, Settings, stopwatch.Elapsed));
- }
+ _clusterEventLogger.LogAndPublish(new ClusterOpenedEvent(ClusterId, Settings, stopwatch.Elapsed));
if (Settings.Scheme == ConnectionStringScheme.MongoDBPlusSrv)
{
@@ -264,23 +236,12 @@ private void ServerDescriptionChangedHandler(object sender, ServerDescriptionCha
catch (Exception unexpectedException)
{
// if we catch an exception here it's because of a bug in the driver
- var handler = _sdamInformationEventHandler;
- if (handler != null)
- {
- try
- {
- handler.Invoke(new SdamInformationEvent(() =>
- string.Format(
- "Unexpected exception in MultiServerCluster.ServerDescriptionChangedHandler: {0}",
- unexpectedException.ToString())));
- }
- catch
- {
- // ignore any exceptions thrown by the handler (note: event handlers aren't supposed to throw exceptions)
- }
- }
- // TODO: should we reset the cluster state in some way? (the state is undefined since an unexpected exception was thrown)
+ _clusterEventLogger.LogAndPublish(new SdamInformationEvent(
+ "Unexpected exception in MultiServerCluster.ServerDescriptionChangedHandler: {0}",
+ unexpectedException),
+ unexpectedException);
}
+ // TODO: should we reset the cluster state in some way? (the state is undefined since an unexpected exception was thrown)
}
private void ProcessServerDescriptionChanged(ServerDescriptionChangedEventArgs args)
@@ -401,8 +362,7 @@ private ClusterDescription ProcessReplicaSetChange(ClusterDescription clusterDes
var server = _servers.SingleOrDefault(x => EndPointHelper.Equals(args.NewServerDescription.EndPoint, x.EndPoint));
server.Invalidate("ReportedPrimaryIsStale", args.NewServerDescription.TopologyVersion);
- _sdamInformationEventHandler?.Invoke(new SdamInformationEvent(() =>
- string.Format(
+ _clusterEventLogger.LogAndPublish(new SdamInformationEvent(
@"Invalidating server: Setting ServerType to ""Unknown"" for {0} because it " +
@"claimed to be the replica set primary for replica set ""{1}"" but sent a " +
@"(setVersion, electionId) tuple of ({2}, {3}) that was less than than the " +
@@ -412,7 +372,7 @@ private ClusterDescription ProcessReplicaSetChange(ClusterDescription clusterDes
args.NewServerDescription.ReplicaSetConfig.Version,
args.NewServerDescription.ElectionId,
_maxElectionInfo.SetVersion,
- _maxElectionInfo.ElectionId)));
+ _maxElectionInfo.ElectionId));
return clusterDescription.WithServerDescription(
new ServerDescription(server.ServerId, server.EndPoint, "ReportedPrimaryIsStale"));
@@ -424,8 +384,7 @@ private ClusterDescription ProcessReplicaSetChange(ClusterDescription clusterDes
{
if (_maxElectionInfo == null)
{
- _sdamInformationEventHandler?.Invoke(new SdamInformationEvent(() =>
- string.Format(
+ _clusterEventLogger.LogAndPublish(new SdamInformationEvent(
@"Initializing (maxSetVersion, maxElectionId): Saving tuple " +
@"(setVersion, electionId) of ({0}, {1}) as (maxSetVersion, maxElectionId) for " +
@"replica set ""{2}"" because replica set primary {3} sent ({0}, {1}), the first " +
@@ -434,7 +393,7 @@ private ClusterDescription ProcessReplicaSetChange(ClusterDescription clusterDes
args.NewServerDescription.ElectionId,
args.NewServerDescription.ReplicaSetConfig.Name,
args.NewServerDescription.EndPoint,
- args.NewServerDescription.ReplicaSetConfig.Name)));
+ args.NewServerDescription.ReplicaSetConfig.Name));
_maxElectionInfo = new ElectionInfo(
args.NewServerDescription.ReplicaSetConfig.Version.Value,
@@ -445,8 +404,7 @@ private ClusterDescription ProcessReplicaSetChange(ClusterDescription clusterDes
if (_maxElectionInfo.SetVersion < args.NewServerDescription.ReplicaSetConfig.Version.Value)
{
var electionId = args.NewServerDescription.ElectionId ?? _maxElectionInfo.ElectionId;
- _sdamInformationEventHandler?.Invoke(new SdamInformationEvent(() =>
- string.Format(
+ _clusterEventLogger.LogAndPublish(new SdamInformationEvent(
@"Updating stale setVersion: Updating the current " +
@"(maxSetVersion, maxElectionId) tuple from ({0}, {1}) to ({2}, {3}) for " +
@"replica set ""{4}"" because replica set primary {5} sent ({6}, {7})—a larger " +
@@ -458,7 +416,7 @@ private ClusterDescription ProcessReplicaSetChange(ClusterDescription clusterDes
args.NewServerDescription.ReplicaSetConfig.Name,
args.NewServerDescription.EndPoint,
args.NewServerDescription.ReplicaSetConfig.Version,
- args.NewServerDescription.ElectionId)));
+ args.NewServerDescription.ElectionId));
_maxElectionInfo = new ElectionInfo(
args.NewServerDescription.ReplicaSetConfig.Version.Value,
@@ -466,8 +424,7 @@ private ClusterDescription ProcessReplicaSetChange(ClusterDescription clusterDes
}
else // current primary is stale & setVersion is not stale ⇒ the electionId must be stale
{
- _sdamInformationEventHandler?.Invoke(new SdamInformationEvent(() =>
- string.Format(
+ _clusterEventLogger.LogAndPublish(new SdamInformationEvent(
@"Updating stale electionId: Updating the current " +
@"(maxSetVersion, maxElectionId) tuple from ({0}, {1}) to ({2}, {3}) for " +
@"replica set ""{4}"" because replica set primary {5} sent ({6}, {7})—" +
@@ -479,7 +436,7 @@ private ClusterDescription ProcessReplicaSetChange(ClusterDescription clusterDes
args.NewServerDescription.ReplicaSetConfig.Name,
args.NewServerDescription.EndPoint,
args.NewServerDescription.ReplicaSetConfig.Version,
- args.NewServerDescription.ElectionId)));
+ args.NewServerDescription.ElectionId));
_maxElectionInfo = new ElectionInfo(
args.NewServerDescription.ReplicaSetConfig.Version.Value,
@@ -626,10 +583,7 @@ private ClusterDescription EnsureServer(ClusterDescription clusterDescription, E
return clusterDescription;
}
- if (_addingServerEventHandler != null)
- {
- _addingServerEventHandler(new ClusterAddingServerEvent(ClusterId, endPoint));
- }
+ _clusterEventLogger.LogAndPublish(new ClusterAddingServerEvent(ClusterId, endPoint));
stopwatch.Start();
server = CreateServer(endPoint);
@@ -641,10 +595,7 @@ private ClusterDescription EnsureServer(ClusterDescription clusterDescription, E
clusterDescription = clusterDescription.WithServerDescription(server.Description);
stopwatch.Stop();
- if (_addedServerEventHandler != null)
- {
- _addedServerEventHandler(new ClusterAddedServerEvent(server.ServerId, stopwatch.Elapsed));
- }
+ _clusterEventLogger.LogAndPublish(new ClusterAddedServerEvent(server.ServerId, stopwatch.Elapsed));
return clusterDescription;
}
@@ -685,10 +636,7 @@ private ClusterDescription RemoveServer(ClusterDescription clusterDescription, E
return clusterDescription;
}
- if (_removingServerEventHandler != null)
- {
- _removingServerEventHandler(new ClusterRemovingServerEvent(server.ServerId, reason));
- }
+ _clusterEventLogger.LogAndPublish(new ClusterRemovingServerEvent(server.ServerId, reason));
stopwatch.Start();
_servers.Remove(server);
@@ -698,10 +646,7 @@ private ClusterDescription RemoveServer(ClusterDescription clusterDescription, E
server.Dispose();
stopwatch.Stop();
- if (_removedServerEventHandler != null)
- {
- _removedServerEventHandler(new ClusterRemovedServerEvent(server.ServerId, reason, stopwatch.Elapsed));
- }
+ _clusterEventLogger.LogAndPublish(new ClusterRemovedServerEvent(server.ServerId, reason, stopwatch.Elapsed));
return clusterDescription.WithoutServerDescription(endPoint);
}
diff --git a/src/MongoDB.Driver.Core/Core/Clusters/SingleServerCluster.cs b/src/MongoDB.Driver.Core/Core/Clusters/SingleServerCluster.cs
index a98f4a460f3..306094c8a10 100644
--- a/src/MongoDB.Driver.Core/Core/Clusters/SingleServerCluster.cs
+++ b/src/MongoDB.Driver.Core/Core/Clusters/SingleServerCluster.cs
@@ -16,6 +16,7 @@
using System;
using System.Diagnostics;
using System.Net;
+using Microsoft.Extensions.Logging;
using MongoDB.Driver.Core.Configuration;
using MongoDB.Driver.Core.Events;
using MongoDB.Driver.Core.Misc;
@@ -33,33 +34,15 @@ internal sealed class SingleServerCluster : Cluster
private readonly InterlockedInt32 _state;
private readonly string _replicaSetName;
- private readonly Action _closingEventHandler;
- private readonly Action _closedEventHandler;
- private readonly Action _openingEventHandler;
- private readonly Action _openedEventHandler;
- private readonly Action _addingServerEventHandler;
- private readonly Action _addedServerEventHandler;
- private readonly Action _removingServerEventHandler;
- private readonly Action _removedServerEventHandler;
-
// constructor
- internal SingleServerCluster(ClusterSettings settings, IClusterableServerFactory serverFactory, IEventSubscriber eventSubscriber)
- : base(settings, serverFactory, eventSubscriber)
+ internal SingleServerCluster(ClusterSettings settings, IClusterableServerFactory serverFactory, IEventSubscriber eventSubscriber, ILoggerFactory loggerFactory)
+ : base(settings, serverFactory, eventSubscriber, loggerFactory)
{
Ensure.That(settings.SrvMaxHosts == 0, "srvMaxHosts cannot be used with a single server cluster.");
Ensure.IsEqualTo(settings.EndPoints.Count, 1, "settings.EndPoints.Count");
_replicaSetName = settings.ReplicaSetName; // can be null
_state = new InterlockedInt32(State.Initial);
-
- eventSubscriber.TryGetEventHandler(out _closingEventHandler);
- eventSubscriber.TryGetEventHandler(out _closedEventHandler);
- eventSubscriber.TryGetEventHandler(out _openingEventHandler);
- eventSubscriber.TryGetEventHandler(out _openedEventHandler);
- eventSubscriber.TryGetEventHandler(out _addingServerEventHandler);
- eventSubscriber.TryGetEventHandler(out _addedServerEventHandler);
- eventSubscriber.TryGetEventHandler(out _removingServerEventHandler);
- eventSubscriber.TryGetEventHandler(out _removedServerEventHandler);
}
// methods
@@ -70,26 +53,18 @@ protected override void Dispose(bool disposing)
{
if (disposing)
{
- if (_closingEventHandler != null)
- {
- _closingEventHandler(new ClusterClosingEvent(ClusterId));
- }
+ _clusterEventLogger.LogAndPublish(new ClusterClosingEvent(ClusterId));
+
stopwatch = Stopwatch.StartNew();
if (_server != null)
{
- if (_removingServerEventHandler != null)
- {
- _removingServerEventHandler(new ClusterRemovingServerEvent(_server.ServerId, "Cluster is closing."));
- }
+ _clusterEventLogger.LogAndPublish(new ClusterRemovingServerEvent(_server.ServerId, "Removing server."));
_server.DescriptionChanged -= ServerDescriptionChanged;
_server.Dispose();
- if (_removedServerEventHandler != null)
- {
- _removedServerEventHandler(new ClusterRemovedServerEvent(_server.ServerId, "Cluster is closing.", stopwatch.Elapsed));
- }
+ _clusterEventLogger.LogAndPublish(new ClusterRemovedServerEvent(_server.ServerId, "Server removed.", stopwatch.Elapsed));
}
stopwatch.Stop();
}
@@ -97,9 +72,9 @@ protected override void Dispose(bool disposing)
base.Dispose(disposing);
- if (stopwatch != null && _closedEventHandler != null)
+ if (stopwatch != null)
{
- _closedEventHandler(new ClusterClosedEvent(ClusterId, stopwatch.Elapsed));
+ _clusterEventLogger.LogAndPublish(new ClusterClosedEvent(ClusterId, stopwatch.Elapsed));
}
}
@@ -108,36 +83,26 @@ public override void Initialize()
base.Initialize();
if (_state.TryChange(State.Initial, State.Open))
{
- if (_openingEventHandler != null)
- {
- _openingEventHandler(new ClusterOpeningEvent(ClusterId, Settings));
- }
+ _clusterEventLogger.LogAndPublish(new ClusterOpeningEvent(ClusterId, Settings));
var stopwatch = Stopwatch.StartNew();
_server = CreateServer(Settings.EndPoints[0]);
var newClusterDescription = Description
.WithType(Settings.GetInitialClusterType())
.WithServerDescription(_server.Description);
- if (_addingServerEventHandler != null)
- {
- _addingServerEventHandler(new ClusterAddingServerEvent(ClusterId, _server.EndPoint));
- }
+
+ _clusterEventLogger.LogAndPublish(new ClusterAddingServerEvent(ClusterId, _server.EndPoint));
+
_server.DescriptionChanged += ServerDescriptionChanged;
stopwatch.Stop();
- if (_addedServerEventHandler != null)
- {
- _addedServerEventHandler(new ClusterAddedServerEvent(_server.ServerId, stopwatch.Elapsed));
- }
+ _clusterEventLogger.LogAndPublish(new ClusterAddedServerEvent(_server.ServerId, stopwatch.Elapsed));
UpdateClusterDescription(newClusterDescription);
_server.Initialize();
- if (_openedEventHandler != null)
- {
- _openedEventHandler(new ClusterOpenedEvent(ClusterId, Settings, stopwatch.Elapsed));
- }
+ _clusterEventLogger.LogAndPublish(new ClusterOpenedEvent(ClusterId, Settings, stopwatch.Elapsed));
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Compression/Snappy/README.txt b/src/MongoDB.Driver.Core/Core/Compression/Snappy/README.txt
deleted file mode 100644
index 9929d65844b..00000000000
--- a/src/MongoDB.Driver.Core/Core/Compression/Snappy/README.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-Scripts to build library from the source after cloning : https://github.com/google/snappy
-
-$ git submodule update --init
-$ mkdir build
-$ cd build && cmake ../ && make
-$ cmake -DBUILD_SHARED_LIBS=ON ..
-$ cmake --build . --target snappy
-
-Note related to issues during building at the current time:
-- The latest release (1.1.9) cannot be built on macOS and linux due some building bugs (see the CSHARP-2813 PR and CSHARP-3819 for details),
-so use the previous stable 1.1.8 release instead.
-- Windows version can be built with 1.1.9 version, but it requires additional investigation how to configure options like x32 processor architecture.
-
diff --git a/src/MongoDB.Driver.Core/Core/Compression/Snappy/Snappy32NativeMethods.cs b/src/MongoDB.Driver.Core/Core/Compression/Snappy/Snappy32NativeMethods.cs
deleted file mode 100644
index ba8a6cb2910..00000000000
--- a/src/MongoDB.Driver.Core/Core/Compression/Snappy/Snappy32NativeMethods.cs
+++ /dev/null
@@ -1,120 +0,0 @@
-/* Original work:
- * Copyright (c) 2016 - David Rouyer rouyer.david@gmail.com Copyright (c) 2011 - 2014 Robert Važan, Google Inc.
- *
- * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
- *
- * * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution.
- *
- * * Neither the name of Robert Važan nor the names of contributors may be used to endorse or promote products derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * Modified work:
- * Copyright 2020–present MongoDB Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-using System;
-using System.Runtime.InteropServices;
-using MongoDB.Driver.Core.Misc;
-using MongoDB.Driver.Core.NativeLibraryLoader;
-
-namespace MongoDB.Driver.Core.Compression.Snappy
-{
- internal static class Snappy32NativeMethods
- {
- // private static fields
- private static readonly Lazy __libraryLoader;
- private static readonly Lazy __snappy_compress;
- private static readonly Lazy __snappy_max_compressed_length;
- private static readonly Lazy __snappy_uncompress;
- private static readonly Lazy __snappy_uncompressed_length;
- private static readonly Lazy __snappy_validate_compressed_buffer;
-
- // static constructor
- static Snappy32NativeMethods()
- {
- var snappyLocator = new SnappyLocator();
- __libraryLoader = new Lazy(() => new LibraryLoader(snappyLocator), isThreadSafe: true);
-
- __snappy_compress = CreateLazyForDelegate(nameof(snappy_compress));
- __snappy_max_compressed_length = CreateLazyForDelegate(nameof(snappy_max_compressed_length));
- __snappy_uncompress = CreateLazyForDelegate(nameof(snappy_uncompress));
- __snappy_uncompressed_length = CreateLazyForDelegate(nameof(snappy_uncompressed_length));
- __snappy_validate_compressed_buffer = CreateLazyForDelegate(nameof(snappy_validate_compressed_buffer));
- }
-
- // public static methods
- public static SnappyStatus snappy_compress(IntPtr input, uint input_length, IntPtr output, ref uint output_length)
- {
- return __snappy_compress.Value(input, input_length, output, ref output_length);
- }
-
- public static uint snappy_max_compressed_length(uint input_length)
- {
- return __snappy_max_compressed_length.Value(input_length);
- }
-
- public static SnappyStatus snappy_uncompress(IntPtr input, uint input_length, IntPtr output, ref uint output_length)
- {
- return __snappy_uncompress.Value(input, input_length, output, ref output_length);
- }
-
- public static SnappyStatus snappy_uncompressed_length(IntPtr input, uint input_length, out uint output_length)
- {
- return __snappy_uncompressed_length.Value(input, input_length, out output_length);
- }
-
- public static SnappyStatus snappy_validate_compressed_buffer(IntPtr input, uint input_length)
- {
- return __snappy_validate_compressed_buffer.Value(input, input_length);
- }
-
- // private static methods
- private static Lazy CreateLazyForDelegate(string name)
- {
- return new Lazy(() => __libraryLoader.Value.GetDelegate(name), isThreadSafe: true);
- }
-
- // nested types
- private class Delegates32
- {
- [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
- public delegate SnappyStatus snappy_compress(IntPtr input, uint input_length, IntPtr output, ref uint output_length);
- [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
- public delegate uint snappy_max_compressed_length(uint input_length);
- [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
- public delegate SnappyStatus snappy_uncompress(IntPtr input, uint input_length, IntPtr output, ref uint output_length);
- [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
- public delegate SnappyStatus snappy_uncompressed_length(IntPtr input, uint input_length, out uint output_length);
- [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
- public delegate SnappyStatus snappy_validate_compressed_buffer(IntPtr input, uint input_length);
- }
-
- private class SnappyLocator : RelativeLibraryLocatorBase
- {
- public override bool IsX32ModeSupported => OperatingSystemHelper.CurrentOperatingSystem == OperatingSystemPlatform.Windows;
- public override string LibraryName => "Snappy";
-
- public override string GetLibraryFileName(OperatingSystemPlatform currentPlatform) =>
- currentPlatform switch
- {
- OperatingSystemPlatform.Windows => "snappy32.dll", // supported only on windows
- _ => throw new InvalidOperationException($"{LibraryName} is not supported on the current platform: {currentPlatform} in 32-bit mode."),
- };
- }
- }
-}
diff --git a/src/MongoDB.Driver.Core/Core/Compression/Snappy/Snappy64NativeMethods.cs b/src/MongoDB.Driver.Core/Core/Compression/Snappy/Snappy64NativeMethods.cs
deleted file mode 100644
index 51b9f0b5514..00000000000
--- a/src/MongoDB.Driver.Core/Core/Compression/Snappy/Snappy64NativeMethods.cs
+++ /dev/null
@@ -1,116 +0,0 @@
-/* Original work:
- * Copyright (c) 2016 - David Rouyer rouyer.david@gmail.com Copyright (c) 2011 - 2014 Robert Važan, Google Inc.
- *
- * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
- *
- * * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution.
- *
- * * Neither the name of Robert Važan nor the names of contributors may be used to endorse or promote products derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * Modified work:
- * Copyright 2020–present MongoDB Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-using System;
-using MongoDB.Driver.Core.Misc;
-using MongoDB.Driver.Core.NativeLibraryLoader;
-
-namespace MongoDB.Driver.Core.Compression.Snappy
-{
- internal static class Snappy64NativeMethods
- {
- // private static fields
- private static readonly Lazy __libraryLoader;
- private static readonly Lazy __snappy_compress;
- private static readonly Lazy __snappy_max_compressed_length;
- private static readonly Lazy __snappy_uncompress;
- private static readonly Lazy __snappy_uncompressed_length;
- private static readonly Lazy __snappy_validate_compressed_buffer;
-
- // static constructor
- static Snappy64NativeMethods()
- {
- var snappyLocator = new SnappyLocator();
- __libraryLoader = new Lazy(() => new LibraryLoader(snappyLocator), isThreadSafe: true);
-
- __snappy_compress = CreateLazyForDelegate(nameof(snappy_compress));
- __snappy_max_compressed_length = CreateLazyForDelegate(nameof(snappy_max_compressed_length));
- __snappy_uncompress = CreateLazyForDelegate(nameof(snappy_uncompress));
- __snappy_uncompressed_length = CreateLazyForDelegate(nameof(snappy_uncompressed_length));
- __snappy_validate_compressed_buffer = CreateLazyForDelegate(nameof(snappy_validate_compressed_buffer));
- }
-
- // public static methods
- public static SnappyStatus snappy_compress(IntPtr input, ulong input_length, IntPtr output, ref ulong output_length)
- {
- return __snappy_compress.Value(input, input_length, output, ref output_length);
- }
-
- public static ulong snappy_max_compressed_length(ulong input_length)
- {
- return __snappy_max_compressed_length.Value(input_length);
- }
-
- public static SnappyStatus snappy_uncompress(IntPtr input, ulong input_length, IntPtr output, ref ulong output_length)
- {
- return __snappy_uncompress.Value(input, input_length, output, ref output_length);
- }
-
- public static SnappyStatus snappy_uncompressed_length(IntPtr input, ulong input_length, out ulong output_length)
- {
- return __snappy_uncompressed_length.Value(input, input_length, out output_length);
- }
-
- public static SnappyStatus snappy_validate_compressed_buffer(IntPtr input, ulong input_length)
- {
- return __snappy_validate_compressed_buffer.Value(input, input_length);
- }
-
- // private static methods
- private static Lazy CreateLazyForDelegate(string name)
- {
- return new Lazy(() => __libraryLoader.Value.GetDelegate(name), isThreadSafe: true);
- }
-
- // nested types
- private class Delegates64
- {
- public delegate SnappyStatus snappy_compress(IntPtr input, ulong input_length, IntPtr output, ref ulong output_length);
- public delegate ulong snappy_max_compressed_length(ulong input_length);
- public delegate SnappyStatus snappy_uncompress(IntPtr input, ulong input_length, IntPtr output, ref ulong output_length);
- public delegate SnappyStatus snappy_uncompressed_length(IntPtr input, ulong input_length, out ulong output_length);
- public delegate SnappyStatus snappy_validate_compressed_buffer(IntPtr input, ulong input_length);
- }
-
- private class SnappyLocator : RelativeLibraryLocatorBase
- {
- public override bool IsX32ModeSupported => false;
- public override string LibraryName => "Snappy";
-
- public override string GetLibraryFileName(OperatingSystemPlatform currentPlatform) =>
- currentPlatform switch
- {
- OperatingSystemPlatform.Windows => "snappy64.dll",
- OperatingSystemPlatform.Linux => "libsnappy64.so",
- OperatingSystemPlatform.MacOS => "libsnappy64.dylib",
- _ => throw new InvalidOperationException($"{LibraryName} is not supported on the current platform: {currentPlatform}."),
- };
- }
- }
-}
diff --git a/src/MongoDB.Driver.Core/Core/Compression/Snappy/SnappyAdapter.cs b/src/MongoDB.Driver.Core/Core/Compression/Snappy/SnappyAdapter.cs
deleted file mode 100644
index c4ae2a219c9..00000000000
--- a/src/MongoDB.Driver.Core/Core/Compression/Snappy/SnappyAdapter.cs
+++ /dev/null
@@ -1,145 +0,0 @@
-/* Copyright 2019–present MongoDB Inc.
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-using MongoDB.Driver.Core.NativeLibraryLoader;
-using System;
-
-namespace MongoDB.Driver.Core.Compression.Snappy
-{
- internal static class SnappyAdapter
- {
- public static SnappyStatus snappy_compress(byte[] input, int input_offset, int input_length, byte[] output, int output_offset, ref int output_length)
- {
- using (var pinnedInput = new PinnedBuffer(input, input_offset))
- using (var pinnedOutput = new PinnedBuffer(output, output_offset))
- {
- return SnappyNativeMethodsAdapter.snappy_compress(pinnedInput.IntPtr, input_length, pinnedOutput.IntPtr, ref output_length);
- }
- }
-
- public static int snappy_max_compressed_length(int input_length)
- {
- return SnappyNativeMethodsAdapter.snappy_max_compressed_length(input_length);
- }
-
- public static SnappyStatus snappy_uncompress(byte[] input, int input_offset, int input_length, byte[] output, int output_offset, ref int output_length)
- {
- using (var pinnedInput = new PinnedBuffer(input, input_offset))
- using (var pinnedOutput = new PinnedBuffer(output, output_offset))
- {
- return SnappyNativeMethodsAdapter.snappy_uncompress(pinnedInput.IntPtr, input_length, pinnedOutput.IntPtr, ref output_length);
- }
- }
-
- public static SnappyStatus snappy_uncompressed_length(byte[] input, int input_offset, int input_length, out int output_length)
- {
- using (var pinnedInput = new PinnedBuffer(input, input_offset))
- {
- return SnappyNativeMethodsAdapter.snappy_uncompressed_length(pinnedInput.IntPtr, input_length, out output_length);
- }
- }
-
- public static SnappyStatus snappy_validate_compressed_buffer(byte[] input, int input_offset, int input_length)
- {
- using (var pinnedInput = new PinnedBuffer(input, input_offset))
- {
- return SnappyNativeMethodsAdapter.snappy_validate_compressed_buffer(pinnedInput.IntPtr, input_length);
- }
- }
-
- // nested types
- private static class SnappyNativeMethodsAdapter
- {
- private static bool __is64BitProcess = Environment.Is64BitProcess;
-
- public static SnappyStatus snappy_compress(IntPtr input, int input_length, IntPtr output, ref int output_length)
- {
- SnappyStatus status;
- if (__is64BitProcess)
- {
- var ulongOutput_length = (ulong)output_length;
- status = Snappy64NativeMethods.snappy_compress(input, (ulong)input_length, output, ref ulongOutput_length);
- output_length = (int)ulongOutput_length;
- }
- else
- {
- var uintOutput_length = (uint)output_length;
- status = Snappy32NativeMethods.snappy_compress(input, (uint)input_length, output, ref uintOutput_length);
- output_length = (int)uintOutput_length;
- }
-
- return status;
- }
-
- public static int snappy_max_compressed_length(int input_length)
- {
- if (__is64BitProcess)
- {
- return (int)Snappy64NativeMethods.snappy_max_compressed_length((ulong)input_length);
- }
- else
- {
- return (int)Snappy32NativeMethods.snappy_max_compressed_length((uint)input_length);
- }
- }
-
- public static SnappyStatus snappy_uncompress(IntPtr input, int input_length, IntPtr output, ref int output_length)
- {
- SnappyStatus status;
- if (__is64BitProcess)
- {
- var ulongOutput_length = (ulong)output_length;
- status = Snappy64NativeMethods.snappy_uncompress(input, (ulong)input_length, output, ref ulongOutput_length);
- output_length = (int)ulongOutput_length;
- }
- else
- {
- var uintOutput_length = (uint)output_length;
- status = Snappy32NativeMethods.snappy_uncompress(input, (uint)input_length, output, ref uintOutput_length);
- output_length = (int)uintOutput_length;
- }
- return status;
- }
-
- public static SnappyStatus snappy_uncompressed_length(IntPtr input, int input_length, out int output_length)
- {
- SnappyStatus status;
- if (__is64BitProcess)
- {
- status = Snappy64NativeMethods.snappy_uncompressed_length(input, (ulong)input_length, out var ulongOutput_length);
- output_length = (int)ulongOutput_length;
- }
- else
- {
- status = Snappy32NativeMethods.snappy_uncompressed_length(input, (uint)input_length, out var uintOutput_length);
- output_length = (int)uintOutput_length;
- }
- return status;
- }
-
- public static SnappyStatus snappy_validate_compressed_buffer(IntPtr input, int input_length)
- {
- if (__is64BitProcess)
- {
- return Snappy64NativeMethods.snappy_validate_compressed_buffer(input, (ulong)input_length);
- }
- else
- {
- return Snappy32NativeMethods.snappy_validate_compressed_buffer(input, (uint)input_length);
- }
- }
- }
- }
-}
diff --git a/src/MongoDB.Driver.Core/Core/Compression/Snappy/SnappyCodec.cs b/src/MongoDB.Driver.Core/Core/Compression/Snappy/SnappyCodec.cs
deleted file mode 100644
index c10d97a624c..00000000000
--- a/src/MongoDB.Driver.Core/Core/Compression/Snappy/SnappyCodec.cs
+++ /dev/null
@@ -1,170 +0,0 @@
-/* Original work:
- * Copyright (c) 2016 - David Rouyer rouyer.david@gmail.com Copyright (c) 2011 - 2014 Robert Važan, Google Inc.
- *
- * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
- *
- * * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution.
- *
- * * Neither the name of Robert Važan nor the names of contributors may be used to endorse or promote products derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * Modified work:
- * Copyright 2020–present MongoDB Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-using System;
-using System.IO;
-using MongoDB.Driver.Core.Misc;
-
-namespace MongoDB.Driver.Core.Compression.Snappy
-{
- internal static class SnappyCodec
- {
- public static int Compress(byte[] input, int inputOffset, int inputLength, byte[] output, int outputOffset, int outputLength)
- {
- Ensure.IsNotNull(input, nameof(input));
- Ensure.IsNotNull(output, nameof(output));
- EnsureBufferRangeIsValid(inputOffset, inputLength, input.Length);
- EnsureBufferRangeIsValid(outputOffset, outputLength, output.Length);
-
- var status = SnappyAdapter.snappy_compress(input, inputOffset, inputLength, output, outputOffset, ref outputLength);
- switch (status)
- {
- case SnappyStatus.Ok:
- return outputLength;
- case SnappyStatus.BufferTooSmall:
- throw new ArgumentOutOfRangeException("Output array is too small.");
- default:
- throw new InvalidDataException("Invalid input.");
- }
- }
-
- public static byte[] Compress(byte[] input)
- {
- Ensure.IsNotNull(input, nameof(input));
-
- var max = GetMaxCompressedLength(input.Length);
-
- var output = new byte[max];
- var outputLength = Compress(input, 0, input.Length, output, 0, output.Length);
- if (outputLength == max)
- return output;
- var truncated = new byte[outputLength];
- Array.Copy(output, truncated, outputLength);
- return truncated;
- }
-
- public static int GetMaxCompressedLength(int inputLength)
- {
- return SnappyAdapter.snappy_max_compressed_length(inputLength);
- }
-
- public static int GetUncompressedLength(byte[] input, int inputOffset, int inputLength)
- {
- Ensure.IsNotNull(input, nameof(input));
- EnsureBufferRangeIsValid(inputOffset, inputLength, input.Length);
- if (inputLength == 0)
- {
- throw new InvalidDataException("Compressed block cannot be empty.");
- }
-
- var status = SnappyAdapter.snappy_uncompressed_length(input, inputOffset, inputLength, out var outputLength);
- switch (status)
- {
- case SnappyStatus.Ok:
- return outputLength;
- default:
- throw new InvalidDataException("Input is not a valid snappy-compressed block.");
- }
- }
-
- public static int GetUncompressedLength(byte[] input)
- {
- Ensure.IsNotNull(input, nameof(input));
-
- return GetUncompressedLength(input, 0, input.Length);
- }
-
- public static int Uncompress(byte[] input, int inputOffset, int inputLength, byte[] output, int outputOffset, int outputLength)
- {
- Ensure.IsNotNull(input, nameof(input));
- Ensure.IsNotNull(output, nameof(output));
- EnsureBufferRangeIsValid(inputOffset, inputLength, input.Length);
- EnsureBufferRangeIsValid(outputOffset, outputLength, output.Length);
-
- if (inputLength == 0)
- {
- throw new InvalidDataException("Compressed block cannot be empty.");
- }
-
- var status = SnappyAdapter.snappy_uncompress(input, inputOffset, inputLength, output, outputOffset, ref outputLength);
- switch (status)
- {
- case SnappyStatus.Ok:
- return outputLength;
- case SnappyStatus.BufferTooSmall:
- throw new ArgumentOutOfRangeException("Output array is too small.");
- default:
- throw new InvalidDataException("Input is not a valid snappy-compressed block.");
- }
- }
-
- public static byte[] Uncompress(byte[] input)
- {
- var max = GetUncompressedLength(input);
- var output = new byte[max];
- var outputLength = Uncompress(input, 0, input.Length, output, 0, output.Length);
- if (outputLength == max)
- {
- return output;
- }
-
- var truncated = new byte[outputLength];
- Array.Copy(output, truncated, outputLength);
- return truncated;
- }
-
- public static bool Validate(byte[] input, int inputOffset, int inputLength)
- {
- Ensure.IsNotNull(input, nameof(input));
- EnsureBufferRangeIsValid(inputOffset, inputLength, input.Length);
- if (inputLength == 0)
- {
- return false;
- }
-
- return SnappyAdapter.snappy_validate_compressed_buffer(input, inputOffset, inputLength) == SnappyStatus.Ok;
- }
-
- public static bool Validate(byte[] input)
- {
- Ensure.IsNotNull(input, nameof(input));
-
- return Validate(input, 0, input.Length);
- }
-
- // private static methods
- private static void EnsureBufferRangeIsValid(int offset, int length, int bufferLength)
- {
- if (offset < 0 || length < 0 || offset + length > bufferLength)
- {
- throw new ArgumentOutOfRangeException("Selected range is outside the bounds of the buffer.");
- }
- }
- }
-}
diff --git a/src/MongoDB.Driver.Core/Core/Compression/Snappy/SnappyStatus.cs b/src/MongoDB.Driver.Core/Core/Compression/Snappy/SnappyStatus.cs
deleted file mode 100644
index 1a83ec79b89..00000000000
--- a/src/MongoDB.Driver.Core/Core/Compression/Snappy/SnappyStatus.cs
+++ /dev/null
@@ -1,38 +0,0 @@
-/* Original work:
- * Copyright (c) 2016 - David Rouyer rouyer.david@gmail.com Copyright (c) 2011 - 2014 Robert Važan, Google Inc.
- *
- * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
- *
- * * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution.
- *
- * * Neither the name of Robert Važan nor the names of contributors may be used to endorse or promote products derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * Modified work:
- * Copyright 2020–present MongoDB Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-namespace MongoDB.Driver.Core.Compression.Snappy
-{
- internal enum SnappyStatus
- {
- Ok = 0,
- InvalidInput = 1,
- BufferTooSmall = 2
- }
-}
diff --git a/src/MongoDB.Driver.Core/Core/Compression/Snappy/lib/linux/libsnappy64.so b/src/MongoDB.Driver.Core/Core/Compression/Snappy/lib/linux/libsnappy64.so
deleted file mode 100644
index 584bedfc9fd..00000000000
Binary files a/src/MongoDB.Driver.Core/Core/Compression/Snappy/lib/linux/libsnappy64.so and /dev/null differ
diff --git a/src/MongoDB.Driver.Core/Core/Compression/Snappy/lib/osx/libsnappy64.dylib b/src/MongoDB.Driver.Core/Core/Compression/Snappy/lib/osx/libsnappy64.dylib
deleted file mode 100644
index bbce3c21e42..00000000000
Binary files a/src/MongoDB.Driver.Core/Core/Compression/Snappy/lib/osx/libsnappy64.dylib and /dev/null differ
diff --git a/src/MongoDB.Driver.Core/Core/Compression/Snappy/lib/win/snappy32.dll b/src/MongoDB.Driver.Core/Core/Compression/Snappy/lib/win/snappy32.dll
deleted file mode 100644
index afc82ca424c..00000000000
Binary files a/src/MongoDB.Driver.Core/Core/Compression/Snappy/lib/win/snappy32.dll and /dev/null differ
diff --git a/src/MongoDB.Driver.Core/Core/Compression/Snappy/lib/win/snappy64.dll b/src/MongoDB.Driver.Core/Core/Compression/Snappy/lib/win/snappy64.dll
deleted file mode 100644
index 36cd5fe795e..00000000000
Binary files a/src/MongoDB.Driver.Core/Core/Compression/Snappy/lib/win/snappy64.dll and /dev/null differ
diff --git a/src/MongoDB.Driver.Core/Core/Compression/SnappyCompressor.cs b/src/MongoDB.Driver.Core/Core/Compression/SnappyCompressor.cs
index 8d358799ee3..dbb11f48e59 100644
--- a/src/MongoDB.Driver.Core/Core/Compression/SnappyCompressor.cs
+++ b/src/MongoDB.Driver.Core/Core/Compression/SnappyCompressor.cs
@@ -13,9 +13,9 @@
* limitations under the License.
*/
+using Snappier;
using System.IO;
using System.Threading;
-using MongoDB.Driver.Core.Compression.Snappy;
using MongoDB.Driver.Core.Misc;
namespace MongoDB.Driver.Core.Compression
@@ -35,15 +35,9 @@ public void Compress(Stream input, Stream output)
var uncompressedSize = (int)(input.Length - input.Position);
var uncompressedBytes = new byte[uncompressedSize]; // does not include uncompressed message headers
input.ReadBytes(uncompressedBytes, offset: 0, count: uncompressedSize, CancellationToken.None);
- var maxCompressedSize = SnappyCodec.GetMaxCompressedLength(uncompressedSize);
+ var maxCompressedSize = Snappy.GetMaxCompressedLength(uncompressedSize);
var compressedBytes = new byte[maxCompressedSize];
- var compressedSize = SnappyCodec.Compress(
- input: uncompressedBytes,
- inputOffset: 0,
- inputLength: uncompressedSize,
- output: compressedBytes,
- outputOffset: 0,
- outputLength: compressedBytes.Length); // output.Length - outputOffset
+ var compressedSize = Snappy.Compress(uncompressedBytes, compressedBytes);
output.Write(compressedBytes, 0, compressedSize);
}
@@ -57,8 +51,10 @@ public void Decompress(Stream input, Stream output)
var compressedSize = (int)(input.Length - input.Position);
var compressedBytes = new byte[compressedSize];
input.ReadBytes(compressedBytes, offset: 0, count: compressedSize, CancellationToken.None);
- var decompressedBytes = SnappyCodec.Uncompress(compressedBytes);
- output.Write(decompressedBytes, offset: 0, count: decompressedBytes.Length);
+ var uncompressedSize = Snappy.GetUncompressedLength(compressedBytes);
+ var decompressedBytes = new byte[uncompressedSize];
+ var decompressedSize = Snappy.Decompress(compressedBytes, decompressedBytes);
+ output.Write(decompressedBytes, offset: 0, count: decompressedSize);
}
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Compression/Zstandard/NativeBufferInfo.cs b/src/MongoDB.Driver.Core/Core/Compression/Zstandard/NativeBufferInfo.cs
deleted file mode 100644
index 08762e656ad..00000000000
--- a/src/MongoDB.Driver.Core/Core/Compression/Zstandard/NativeBufferInfo.cs
+++ /dev/null
@@ -1,57 +0,0 @@
-/* Original work:
-* Copyright(c) 2016-present, Facebook, Inc. All rights reserved.
-*
-* Redistribution and use in source and binary forms, with or without modification,
-* are permitted provided that the following conditions are met:
-*
-* * Redistributions of source code must retain the above copyright notice, this
-* list of conditions and the following disclaimer.
-*
-* * Redistributions in binary form must reproduce the above copyright notice,
-* this list of conditions and the following disclaimer in the documentation
-* and/or other materials provided with the distribution.
-*
-* * Neither the name Facebook nor the names of its contributors may be used to
-* endorse or promote products derived from this software without specific
-* prior written permission.
-*
-* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-* DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
-* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*
-* Modified work:
-* Copyright 2020–present MongoDB Inc.
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-using System;
-using System.Runtime.InteropServices;
-
-namespace MongoDB.Driver.Core.Compression.Zstandard
-{
- [StructLayout(LayoutKind.Sequential)]
- internal class NativeBufferInfo
- {
- public IntPtr DataPointer = IntPtr.Zero;
- public ulong Size = 0;
- public ulong Position = 0;
- }
-}
diff --git a/src/MongoDB.Driver.Core/Core/Compression/Zstandard/PinnedBufferWalker.cs b/src/MongoDB.Driver.Core/Core/Compression/Zstandard/PinnedBufferWalker.cs
deleted file mode 100644
index 84e3da7c1d1..00000000000
--- a/src/MongoDB.Driver.Core/Core/Compression/Zstandard/PinnedBufferWalker.cs
+++ /dev/null
@@ -1,71 +0,0 @@
-/* Copyright 2020–present MongoDB Inc.
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-using System;
-using System.Runtime.InteropServices;
-using MongoDB.Driver.Core.Misc;
-
-namespace MongoDB.Driver.Core.Compression.Zstandard
-{
- internal class PinnedBufferWalker : IDisposable
- {
- private readonly byte[] _bytes;
- private GCHandle _handle; // not readonly to prevent a temporary copy from being created when calling Free
- private IntPtr _intPtr;
- private int _offset;
-
- public PinnedBufferWalker(byte[] bytes, int offset)
- {
- _bytes = Ensure.IsNotNull(bytes, nameof(bytes));
- // The array must be pinned by using a GCHandle before it is passed to UnsafeAddrOfPinnedArrayElement.
- // For maximum performance, this method does not validate the array passed to it; this can result in unexpected behavior.
- _handle = GCHandle.Alloc(_bytes, GCHandleType.Pinned);
- _offset = offset;
-
- RefreshIntPtr();
- }
-
- public IntPtr IntPtr => _intPtr;
-
- public int Offset
- {
- get => _offset;
- set
- {
- _offset = value;
- RefreshIntPtr();
- }
- }
-
- // public methods
- public void Dispose()
- {
- try
- {
- _handle.Free();
- }
- catch
- {
- // ignore exceptions
- }
- }
-
- // private methods
- private void RefreshIntPtr()
- {
- _intPtr = Marshal.UnsafeAddrOfPinnedArrayElement(_bytes, _offset);
- }
- }
-}
diff --git a/src/MongoDB.Driver.Core/Core/Compression/Zstandard/Zstandard64NativeMethods.cs b/src/MongoDB.Driver.Core/Core/Compression/Zstandard/Zstandard64NativeMethods.cs
deleted file mode 100644
index e7e197d90c5..00000000000
--- a/src/MongoDB.Driver.Core/Core/Compression/Zstandard/Zstandard64NativeMethods.cs
+++ /dev/null
@@ -1,269 +0,0 @@
-/* Original work:
-* Copyright(c) 2016-present, Facebook, Inc. All rights reserved.
-*
-* Redistribution and use in source and binary forms, with or without modification,
-* are permitted provided that the following conditions are met:
-*
-* * Redistributions of source code must retain the above copyright notice, this
-* list of conditions and the following disclaimer.
-*
-* * Redistributions in binary form must reproduce the above copyright notice,
-* this list of conditions and the following disclaimer in the documentation
-* and/or other materials provided with the distribution.
-*
-* * Neither the name Facebook nor the names of its contributors may be used to
-* endorse or promote products derived from this software without specific
-* prior written permission.
-*
-* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-* DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
-* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*
-* Modified work:
-* Copyright 2020–present MongoDB Inc.
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-using System;
-using System.IO;
-using System.Runtime.InteropServices;
-using MongoDB.Driver.Core.Misc;
-using MongoDB.Driver.Core.NativeLibraryLoader;
-
-namespace MongoDB.Driver.Core.Compression.Zstandard
-{
- internal class Zstandard64NativeMethods
- {
- // private static fields
- private static readonly Lazy __libraryLoader;
- private static readonly Lazy __ZSTD_CStreamInSize;
- private static readonly Lazy __ZSTD_CStreamOutSize;
- private static readonly Lazy __ZSTD_createCStream;
-
- private static readonly Lazy __ZSTD_DStreamInSize;
- private static readonly Lazy __ZSTD_DStreamOutSize;
- private static readonly Lazy __ZSTD_createDStream;
-
- private static readonly Lazy __ZSTD_maxCLevel;
-
- private static readonly Lazy __ZSTD_flushStream;
- private static readonly Lazy __ZSTD_endStream;
- private static readonly Lazy __ZSTD_freeCStream;
- private static readonly Lazy __ZSTD_freeDStream;
-
- private static readonly Lazy __ZSTD_initDStream;
- private static readonly Lazy __ZSTD_decompressStream;
-
- private static readonly Lazy __ZSTD_initCStream;
- private static readonly Lazy __ZSTD_compressStream;
-
- private static readonly Lazy __ZSTD_isError;
- private static readonly Lazy __ZSTD_getErrorName;
-
-
- // static constructor
- static Zstandard64NativeMethods()
- {
- var zstandardLocator = new ZstandardLocator();
- __libraryLoader = new Lazy(() => new LibraryLoader(zstandardLocator), isThreadSafe: true);
-
- __ZSTD_CStreamInSize = CreateLazyForDelegate(nameof(ZSTD_CStreamInSize));
- __ZSTD_CStreamOutSize = CreateLazyForDelegate(nameof(ZSTD_CStreamOutSize));
- __ZSTD_createCStream = CreateLazyForDelegate(nameof(ZSTD_createCStream));
-
- __ZSTD_DStreamInSize = CreateLazyForDelegate(nameof(ZSTD_DStreamInSize));
- __ZSTD_DStreamOutSize = CreateLazyForDelegate(nameof(ZSTD_DStreamOutSize));
- __ZSTD_createDStream = CreateLazyForDelegate(nameof(ZSTD_createDStream));
-
- __ZSTD_maxCLevel = CreateLazyForDelegate(nameof(ZSTD_maxCLevel));
-
- __ZSTD_flushStream = CreateLazyForDelegate(nameof(ZSTD_flushStream));
- __ZSTD_endStream = CreateLazyForDelegate(nameof(ZSTD_endStream));
- __ZSTD_freeCStream = CreateLazyForDelegate(nameof(ZSTD_freeCStream));
- __ZSTD_freeDStream = CreateLazyForDelegate(nameof(ZSTD_freeDStream));
-
- __ZSTD_initDStream = CreateLazyForDelegate(nameof(ZSTD_initDStream));
- __ZSTD_decompressStream = CreateLazyForDelegate(nameof(ZSTD_decompressStream));
-
- __ZSTD_initCStream = CreateLazyForDelegate(nameof(ZSTD_initCStream));
- __ZSTD_compressStream = CreateLazyForDelegate(nameof(ZSTD_compressStream));
-
- __ZSTD_isError = CreateLazyForDelegate(nameof(ZSTD_isError));
- __ZSTD_getErrorName = CreateLazyForDelegate(nameof(ZSTD_getErrorName));
- }
-
- // public static methods
- public static ulong ZSTD_CStreamInSize()
- {
- return __ZSTD_CStreamInSize.Value();
- }
-
- public static ulong ZSTD_CStreamOutSize()
- {
- return __ZSTD_CStreamOutSize.Value();
- }
-
- public static IntPtr ZSTD_createCStream()
- {
- return __ZSTD_createCStream.Value();
- }
-
- public static ulong ZSTD_DStreamInSize()
- {
- return __ZSTD_DStreamInSize.Value();
- }
-
- public static ulong ZSTD_DStreamOutSize()
- {
- return __ZSTD_DStreamOutSize.Value();
- }
-
- public static IntPtr ZSTD_createDStream()
- {
- return __ZSTD_createDStream.Value();
- }
-
- public static long ZSTD_maxCLevel()
- {
- return __ZSTD_maxCLevel.Value();
- }
-
- public static ulong ZSTD_flushStream(IntPtr zcs, NativeBufferInfo outputBuffer)
- {
- var result = __ZSTD_flushStream.Value(zcs, outputBuffer);
- ThrowIfError(result);
- return result;
- }
-
- public static ulong ZSTD_endStream(IntPtr zcs, NativeBufferInfo outputBuffer)
- {
- var result = __ZSTD_endStream.Value(zcs, outputBuffer);
- ThrowIfError(result);
- return result;
- }
-
- public static ulong ZSTD_freeCStream(IntPtr zcs)
- {
- return __ZSTD_freeCStream.Value(zcs);
- }
-
- public static ulong ZSTD_freeDStream(IntPtr zds)
- {
- return __ZSTD_freeDStream.Value(zds);
- }
-
- public static ulong ZSTD_initDStream(IntPtr zds)
- {
- return __ZSTD_initDStream.Value(zds);
- }
-
- public static ulong ZSTD_decompressStream(IntPtr zds, NativeBufferInfo outputBuffer, NativeBufferInfo inputBuffer)
- {
- var result = __ZSTD_decompressStream.Value(zds, outputBuffer, inputBuffer);
- ThrowIfError(result);
- return result;
- }
-
- public static ulong ZSTD_initCStream(IntPtr zcs, int compressionLevel)
- {
- var result = __ZSTD_initCStream.Value(zcs, compressionLevel);
- ThrowIfError(result);
- return result;
- }
-
- public static ulong ZSTD_compressStream(IntPtr zcs, NativeBufferInfo outputBuffer, NativeBufferInfo inputBuffer)
- {
- var result = __ZSTD_compressStream.Value(zcs, outputBuffer, inputBuffer);
- ThrowIfError(result);
- return result;
- }
-
- // private static methods
- private static Lazy CreateLazyForDelegate(string name)
- {
- return new Lazy(() => __libraryLoader.Value.GetDelegate(name), isThreadSafe: true);
- }
-
- private static void ThrowIfError(ulong code)
- {
- if (Zstandard64NativeMethods.ZSTD_isError(code))
- {
- var errorPtr = Zstandard64NativeMethods.ZSTD_getErrorName(code);
- var errorMsg = Marshal.PtrToStringAnsi(errorPtr);
- throw new IOException(errorMsg);
- }
- }
-
- private static bool ZSTD_isError(ulong code)
- {
- return __ZSTD_isError.Value(code);
- }
-
- private static IntPtr ZSTD_getErrorName(ulong code)
- {
- return __ZSTD_getErrorName.Value(code);
- }
-
- // nested types
- private class Delegates64
- {
- public delegate ulong ZSTD_CStreamInSize();
- public delegate ulong ZSTD_CStreamOutSize();
- public delegate IntPtr ZSTD_createCStream();
-
- public delegate ulong ZSTD_DStreamInSize();
- public delegate ulong ZSTD_DStreamOutSize();
- public delegate IntPtr ZSTD_createDStream();
-
- public delegate long ZSTD_maxCLevel();
-
- public delegate ulong ZSTD_flushStream(IntPtr zcs, [MarshalAs(UnmanagedType.LPStruct)] NativeBufferInfo outputBuffer);
- public delegate ulong ZSTD_endStream(IntPtr zcs, [MarshalAs(UnmanagedType.LPStruct)] NativeBufferInfo outputBuffer);
- public delegate ulong ZSTD_freeCStream(IntPtr zcs);
- public delegate ulong ZSTD_freeDStream(IntPtr zds);
-
- public delegate ulong ZSTD_initDStream(IntPtr zds);
-
- public delegate ulong ZSTD_decompressStream(IntPtr zds, [MarshalAs(UnmanagedType.LPStruct)] NativeBufferInfo outputBuffer, [MarshalAs(UnmanagedType.LPStruct)] NativeBufferInfo inputBuffer);
-
- public delegate ulong ZSTD_initCStream(IntPtr zcs, int compressionLevel);
-
- public delegate ulong ZSTD_compressStream(IntPtr zcs, [MarshalAs(UnmanagedType.LPStruct)] NativeBufferInfo outputBuffer, [MarshalAs(UnmanagedType.LPStruct)] NativeBufferInfo inputBuffer);
-
- public delegate bool ZSTD_isError(ulong code);
- public delegate IntPtr ZSTD_getErrorName(ulong code);
- }
-
- private class ZstandardLocator : RelativeLibraryLocatorBase
- {
- public override string LibraryName => "Zstandard";
-
- public override string GetLibraryFileName(OperatingSystemPlatform currentPlatform) =>
- currentPlatform switch
- {
- OperatingSystemPlatform.Windows => "libzstd.dll",
- OperatingSystemPlatform.Linux => "libzstd.so",
- OperatingSystemPlatform.MacOS => "libzstd.dylib",
- _ => throw new InvalidOperationException($"{LibraryName} is not supported on the current platform: {currentPlatform}."),
- };
- }
- }
-}
diff --git a/src/MongoDB.Driver.Core/Core/Compression/Zstandard/ZstandardNativeWrapper.cs b/src/MongoDB.Driver.Core/Core/Compression/Zstandard/ZstandardNativeWrapper.cs
deleted file mode 100644
index 092780a8313..00000000000
--- a/src/MongoDB.Driver.Core/Core/Compression/Zstandard/ZstandardNativeWrapper.cs
+++ /dev/null
@@ -1,290 +0,0 @@
-/* Original work:
-* Copyright(c) 2016-present, Facebook, Inc. All rights reserved.
-*
-* Redistribution and use in source and binary forms, with or without modification,
-* are permitted provided that the following conditions are met:
-*
-* * Redistributions of source code must retain the above copyright notice, this
-* list of conditions and the following disclaimer.
-*
-* * Redistributions in binary form must reproduce the above copyright notice,
-* this list of conditions and the following disclaimer in the documentation
-* and/or other materials provided with the distribution.
-*
-* * Neither the name Facebook nor the names of its contributors may be used to
-* endorse or promote products derived from this software without specific
-* prior written permission.
-*
-* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-* DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
-* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*
-* Modified work:
-* Copyright 2020–present MongoDB Inc.
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.IO.Compression;
-using MongoDB.Driver.Core.Misc;
-
-namespace MongoDB.Driver.Core.Compression.Zstandard
-{
- internal class ZstandardNativeWrapper : IDisposable
- {
- #region static
- public static int MaxCompressionLevel => (int)Zstandard64NativeMethods.ZSTD_maxCLevel();
- #endregion
-
- private readonly int _compressionLevel;
- private readonly CompressionMode _compressionMode;
- private bool _operationInitialized;
- private readonly ulong _recommendedZstreamInputSize;
- private readonly ulong _recommendedZstreamOutputSize;
- private IntPtr _zstreamPointer;
-
- public ZstandardNativeWrapper(CompressionMode compressionMode, int compressionLevel)
- {
- _compressionLevel = compressionLevel;
- _compressionMode = compressionMode;
-
- switch (_compressionMode)
- {
- case CompressionMode.Compress:
- // calculate recommended size for input buffer
- _recommendedZstreamInputSize = Zstandard64NativeMethods.ZSTD_CStreamInSize();
- // calculate recommended size for output buffer. Guarantee to successfully flush at least one complete compressed block
- _recommendedZstreamOutputSize = Zstandard64NativeMethods.ZSTD_CStreamOutSize();
- _zstreamPointer = Zstandard64NativeMethods.ZSTD_createCStream(); // create resource
- break;
- case CompressionMode.Decompress:
- // calculate recommended size for input buffer
- _recommendedZstreamInputSize = Zstandard64NativeMethods.ZSTD_DStreamInSize();
- // calculate recommended size for output buffer. Guarantee to successfully flush at least one complete block in all circumstances
- _recommendedZstreamOutputSize = Zstandard64NativeMethods.ZSTD_DStreamOutSize();
- _zstreamPointer = Zstandard64NativeMethods.ZSTD_createDStream(); // create resource
- break;
- }
- }
-
- public int RecommendedInputSize => (int)_recommendedZstreamInputSize;
- public int RecommendedOutputSize => (int)_recommendedZstreamOutputSize;
-
- // public methods
- public void Compress(
- OperationContext operationContext,
- int inputCompressedSize,
- int inputUncompressedSize,
- out int compressedBytesProcessed,
- out int uncompressedBytesProcessed)
- {
- Ensure.IsNotNull(operationContext, nameof(operationContext));
- Ensure.That(_compressionMode == CompressionMode.Compress, nameof(_compressionMode));
- Ensure.IsGreaterThanOrEqualToZero(inputCompressedSize, nameof(inputCompressedSize));
- Ensure.IsGreaterThanOrEqualToZero(inputUncompressedSize, nameof(inputUncompressedSize));
-
- InitializeIfNotAlreadyInitialized();
-
- // compressed data
- var outputNativeBuffer = CreateNativeBuffer(
- operationContext.CompressedPinnedBufferWalker, // operation result
- (ulong)inputCompressedSize);
-
- // uncompressed data
- var inputNativeBuffer = CreateNativeBuffer(
- operationContext.UncompressedPinnedBufferWalker,
- (ulong)inputUncompressedSize);
-
- // compress inputNativeBuffer to outputNativeBuffer
- _ = Zstandard64NativeMethods.ZSTD_compressStream(
- _zstreamPointer,
- outputNativeBuffer,
- inputNativeBuffer);
-
- compressedBytesProcessed = (int)outputNativeBuffer.Position; // because start Position is always 0
- uncompressedBytesProcessed = (int)inputNativeBuffer.Position; // because start Position is always 0
-
- operationContext.UncompressedPinnedBufferWalker.Offset += uncompressedBytesProcessed;
- // CompressedPinnedBufferWalker.Offset is always 0
- }
-
- public void Decompress(
- OperationContext operationContext,
- int compressedOffset,
- int inputCompressedSize,
- int inputUncompressedSize,
- out int compressedBytesProcessed,
- out int uncompressedBytesProcessed)
- {
- Ensure.IsNotNull(operationContext, nameof(operationContext));
- Ensure.That(_compressionMode == CompressionMode.Decompress, nameof(_compressionMode));
- Ensure.IsGreaterThanOrEqualToZero(inputCompressedSize, nameof(inputCompressedSize));
- Ensure.IsGreaterThanOrEqualToZero(inputUncompressedSize, nameof(inputUncompressedSize));
-
- InitializeIfNotAlreadyInitialized();
-
- // apply reading progress on CompressedPinnedBufferWalker
- operationContext.CompressedPinnedBufferWalker.Offset = compressedOffset;
- // compressed data
- var inputNativeBuffer = CreateNativeBuffer(
- inputCompressedSize <= 0 ? null : operationContext.CompressedPinnedBufferWalker,
- inputCompressedSize <= 0 ? 0 : (ulong)inputCompressedSize);
-
- // uncompressed data
- var outputNativeBuffer = CreateNativeBuffer(
- operationContext.UncompressedPinnedBufferWalker, // operation result
- (ulong)inputUncompressedSize);
-
- // decompress inputNativeBuffer to outputNativeBuffer
- _ = Zstandard64NativeMethods.ZSTD_decompressStream(
- _zstreamPointer,
- outputNativeBuffer,
- inputNativeBuffer);
-
- uncompressedBytesProcessed = (int)outputNativeBuffer.Position; // because start Position is always 0
- compressedBytesProcessed = (int)inputNativeBuffer.Position; // because start Position is always 0
-
- operationContext.UncompressedPinnedBufferWalker.Offset += uncompressedBytesProcessed;
- // CompressedPinnedBufferWalker.Offset will be calculated on stream side
- }
-
- public void Dispose()
- {
- switch (_compressionMode)
- {
- case CompressionMode.Compress:
- Zstandard64NativeMethods.ZSTD_freeCStream(_zstreamPointer);
- break;
- case CompressionMode.Decompress:
- Zstandard64NativeMethods.ZSTD_freeDStream(_zstreamPointer);
- break;
- }
- }
-
- public OperationContext InitializeOperationContext(
- BufferInfo compressedBufferInfo,
- BufferInfo uncompressedBufferInfo = null)
- {
- var compressedPinnedBufferWalker = new PinnedBufferWalker(compressedBufferInfo.Bytes, compressedBufferInfo.Offset);
- PinnedBufferWalker uncompressedPinnedBufferWalker = null;
- if (uncompressedBufferInfo != null)
- {
- uncompressedPinnedBufferWalker = new PinnedBufferWalker(uncompressedBufferInfo.Bytes, uncompressedBufferInfo.Offset);
- }
-
- return new OperationContext(uncompressedPinnedBufferWalker, compressedPinnedBufferWalker);
- }
-
- public IEnumerable StepwiseFlush(BufferInfo compressedBufferInfo)
- {
- if (_compressionMode != CompressionMode.Compress)
- {
- throw new InvalidDataException($"{nameof(StepwiseFlush)} must be called only from Compress mode.");
- }
-
- using (var operationContext = InitializeOperationContext(compressedBufferInfo))
- {
- yield return ProcessCompressedOutput(operationContext, (zcs, buffer) => Zstandard64NativeMethods.ZSTD_flushStream(zcs, buffer));
- }
-
- using (var operationContext = InitializeOperationContext(compressedBufferInfo))
- {
- yield return ProcessCompressedOutput(operationContext, (zcs, buffer) => Zstandard64NativeMethods.ZSTD_endStream(zcs, buffer));
- }
-
- int ProcessCompressedOutput(OperationContext context, Action outputAction)
- {
- var outputNativeBuffer = CreateNativeBuffer(
- context.CompressedPinnedBufferWalker,
- _recommendedZstreamOutputSize);
-
- outputAction(_zstreamPointer, outputNativeBuffer);
-
- return (int)outputNativeBuffer.Position;
- }
- }
-
- // private methods
- private NativeBufferInfo CreateNativeBuffer(PinnedBufferWalker pinnedBufferWalker, ulong size)
- {
- var nativeBuffer = new NativeBufferInfo();
- nativeBuffer.DataPointer = pinnedBufferWalker?.IntPtr ?? IntPtr.Zero;
- nativeBuffer.Size = size;
- nativeBuffer.Position = 0;
- return nativeBuffer;
- }
-
- private void InitializeIfNotAlreadyInitialized()
- {
- if (!_operationInitialized)
- {
- _operationInitialized = true;
-
- switch (_compressionMode)
- {
- case CompressionMode.Compress:
- Zstandard64NativeMethods.ZSTD_initCStream(_zstreamPointer, _compressionLevel); // start a new compression operation
- break;
- case CompressionMode.Decompress:
- Zstandard64NativeMethods.ZSTD_initDStream(_zstreamPointer); // start a new decompression operation
- break;
- }
- }
- }
-
- // nested types
- internal class OperationContext : IDisposable
- {
- private readonly PinnedBufferWalker _compressedPinnedBufferWalker;
- private readonly PinnedBufferWalker _uncompressedPinnedBufferWalker;
-
- public OperationContext(PinnedBufferWalker uncompressedPinnedBufferWalker, PinnedBufferWalker compressedPinnedBufferWalker)
- {
- _compressedPinnedBufferWalker = Ensure.IsNotNull(compressedPinnedBufferWalker, nameof(compressedPinnedBufferWalker));
- _uncompressedPinnedBufferWalker = uncompressedPinnedBufferWalker; // can be null
- }
-
- public PinnedBufferWalker CompressedPinnedBufferWalker => _compressedPinnedBufferWalker; // internal data
- public PinnedBufferWalker UncompressedPinnedBufferWalker => _uncompressedPinnedBufferWalker; // external data
-
- // public methods
- public void Dispose()
- {
- _compressedPinnedBufferWalker.Dispose(); // PinnedBufferWalker.Dispose suppresses all errors
- _uncompressedPinnedBufferWalker?.Dispose();
- }
- }
- }
-
- internal class BufferInfo
- {
- public BufferInfo(byte[] bytes, int offset)
- {
- Bytes = bytes;
- Offset = offset;
- }
-
- public byte[] Bytes { get; }
- public int Offset { get; }
- }
-}
diff --git a/src/MongoDB.Driver.Core/Core/Compression/Zstandard/ZstandardStream.cs b/src/MongoDB.Driver.Core/Core/Compression/Zstandard/ZstandardStream.cs
deleted file mode 100644
index f025ad81905..00000000000
--- a/src/MongoDB.Driver.Core/Core/Compression/Zstandard/ZstandardStream.cs
+++ /dev/null
@@ -1,369 +0,0 @@
-/* Original work:
-* Copyright(c) 2016-present, Facebook, Inc. All rights reserved.
-*
-* Redistribution and use in source and binary forms, with or without modification,
-* are permitted provided that the following conditions are met:
-*
-* * Redistributions of source code must retain the above copyright notice, this
-* list of conditions and the following disclaimer.
-*
-* * Redistributions in binary form must reproduce the above copyright notice,
-* this list of conditions and the following disclaimer in the documentation
-* and/or other materials provided with the distribution.
-*
-* * Neither the name Facebook nor the names of its contributors may be used to
-* endorse or promote products derived from this software without specific
-* prior written permission.
-*
-* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-* DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
-* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*
-* Modified work:
-* Copyright 2020–present MongoDB Inc.
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-using System;
-using System.Buffers;
-using System.IO;
-using System.IO.Compression;
-using MongoDB.Driver.Core.Misc;
-
-namespace MongoDB.Driver.Core.Compression.Zstandard
-{
- internal class ZstandardStream : Stream
- {
- #region static
- public static int MaxCompressionLevel => ZstandardNativeWrapper.MaxCompressionLevel; // maximum compression level available
- #endregion
-
- private const int _defaultCompressionLevel = 6;
-
- private readonly ArrayPool _arrayPool = ArrayPool.Shared;
- private readonly Stream _compressedStream; // input for decompress and output for compress
-
- private readonly StreamReadHelper _streamReadHelper;
- private readonly StreamWriteHelper _streamWriteHelper;
- private readonly CompressionMode _compressionMode;
-
- private bool _disposed;
- private bool _flushed;
- private readonly ZstandardNativeWrapper _nativeWrapper;
-
- public ZstandardStream(
- Stream compressedStream,
- CompressionMode compressionMode,
- Optional compressionLevel = default)
- {
- _compressedStream = Ensure.IsNotNull(compressedStream, nameof(compressedStream));
- _compressionMode = EnsureCompressionModeIsValid(compressionMode);
-
- _nativeWrapper = new ZstandardNativeWrapper(_compressionMode, EnsureCompressionLevelIsValid(compressionLevel));
- switch (_compressionMode)
- {
- case CompressionMode.Compress:
- _streamWriteHelper = new StreamWriteHelper(
- compressedStream: compressedStream,
- compressedBuffer: _arrayPool.Rent(_nativeWrapper.RecommendedOutputSize));
- break;
- case CompressionMode.Decompress:
- _streamReadHelper = new StreamReadHelper(
- compressedStream: compressedStream,
- compressedBuffer: _arrayPool.Rent(_nativeWrapper.RecommendedInputSize));
- break;
- }
- }
-
- public override bool CanRead => _compressedStream.CanRead && _compressionMode == CompressionMode.Decompress;
-
- public override bool CanWrite => _compressedStream.CanWrite && _compressionMode == CompressionMode.Compress;
-
- public override bool CanSeek => false;
-
- public override long Length => throw new NotSupportedException();
-
- public override long Position
- {
- get => throw new NotSupportedException();
- set => throw new NotSupportedException();
- }
-
- protected override void Dispose(bool disposing)
- {
- base.Dispose(disposing);
-
- if (!_disposed)
- {
- switch (_compressionMode)
- {
- case CompressionMode.Compress:
- if (!_flushed)
- {
- try { Flush(); } catch { }
- }
- _nativeWrapper.Dispose();
- _arrayPool.Return(_streamWriteHelper.CompressedBufferInfo.Bytes);
- break;
- case CompressionMode.Decompress:
- _nativeWrapper.Dispose();
- _arrayPool.Return(_streamReadHelper.CompressedBufferInfo.Bytes);
- break;
- }
-
- _disposed = true;
- }
- }
-
- public override void Flush()
- {
- foreach (var outputBufferPosition in _nativeWrapper.StepwiseFlush(_streamWriteHelper.CompressedBufferInfo))
- {
- _streamWriteHelper.WriteBufferToCompressedStream(count: outputBufferPosition);
- }
- _compressedStream.Flush();
- _flushed = true;
- }
-
- public override int Read(byte[] outputBytes, int outputOffset, int count) // Decompress
- {
- if (!CanRead) throw new InvalidDataException("Read is not accessible.");
-
- var uncompressedOutputBuffer = new BufferInfo(outputBytes, outputOffset);
-
- using (var operationContext = _nativeWrapper.InitializeOperationContext(
- _streamReadHelper.CompressedBufferInfo,
- uncompressedOutputBuffer)) // operation result
- {
- var totalUncompressedBytesProcessed = 0; // the result size
- var remainingCount = count;
-
- while (remainingCount > 0)
- {
- var currentDataPosition = _streamReadHelper.ReadCompressedStreamToBufferIfAvailable(
- recommendedCompressedSize: _nativeWrapper.RecommendedInputSize,
- out int remainingCompressedBufferSize);
-
- // decompress input to output
- _nativeWrapper.Decompress(
- operationContext,
- compressedOffset: currentDataPosition,
- inputCompressedSize: remainingCompressedBufferSize,
- inputUncompressedSize: remainingCount,
- out int compressedBytesProcessed,
- out int uncompressedBytesProcessed);
-
- if (!_streamReadHelper.TryPrepareDataForNextAttempt(
- compressedBytesProcessed,
- uncompressedBytesProcessed))
- {
- break;
- }
-
- totalUncompressedBytesProcessed += uncompressedBytesProcessed;
- remainingCount -= uncompressedBytesProcessed;
- }
-
- return totalUncompressedBytesProcessed;
- }
- }
-
- public override void Write(byte[] inputBytes, int inputOffset, int count) // Compress
- {
- if (!CanWrite) throw new InvalidDataException("Write is not accessible.");
-
- var uncompressedInputInfo = new BufferInfo(inputBytes, inputOffset);
-
- using (var operationContext = _nativeWrapper.InitializeOperationContext(
- _streamWriteHelper.CompressedBufferInfo, // operation result
- uncompressedInputInfo))
- {
- var remainingCount = count;
-
- while (remainingCount > 0)
- {
- var currentAttemptSize = Math.Min(remainingCount, _nativeWrapper.RecommendedInputSize);
-
- // compress input to output
- _nativeWrapper.Compress(
- operationContext,
- inputCompressedSize: _nativeWrapper.RecommendedOutputSize,
- inputUncompressedSize: currentAttemptSize,
- out var compressedBytesProcessed,
- out var uncompressedBytesProcessed);
-
- _streamWriteHelper.WriteBufferToCompressedStream(count: compressedBytesProcessed);
-
- // calculate progress in input buffer
- remainingCount -= uncompressedBytesProcessed;
- }
- }
- }
-
- public override long Seek(long offset, SeekOrigin origin)
- {
- throw new NotImplementedException();
- }
-
- public override void SetLength(long value)
- {
- throw new NotImplementedException();
- }
-
- // private methods
- private int EnsureCompressionLevelIsValid(Optional compressionLevel)
- {
- if (compressionLevel.HasValue && _compressionMode != CompressionMode.Compress)
- {
- throw new ArgumentException("Compression level can be specified only in Compress mode", nameof(compressionLevel));
- }
-
- if (compressionLevel.HasValue && (compressionLevel.Value <= 0 || compressionLevel.Value > ZstandardNativeWrapper.MaxCompressionLevel))
- {
- throw new ArgumentOutOfRangeException(nameof(compressionLevel));
- }
-
- return compressionLevel.WithDefault(_defaultCompressionLevel);
- }
-
- private CompressionMode EnsureCompressionModeIsValid(CompressionMode compressionMode)
- {
- if (compressionMode != CompressionMode.Compress && compressionMode != CompressionMode.Decompress)
- {
- throw new ArgumentException($"Invalid compression mode {compressionMode}.", nameof(compressionMode));
- }
- return compressionMode;
- }
-
- // nested types
- private class StreamReadHelper
- {
- private readonly byte[] _compressedDataBuffer;
- private readonly Stream _compressedStream;
- private readonly ReadingState _readingState;
-
- public StreamReadHelper(
- Stream compressedStream,
- byte[] compressedBuffer)
- {
- _compressedDataBuffer = Ensure.IsNotNull(compressedBuffer, nameof(compressedBuffer));
- _compressedStream = Ensure.IsNotNull(compressedStream, nameof(compressedStream));
- _readingState = new ReadingState();
- }
-
- public BufferInfo CompressedBufferInfo => new BufferInfo(_compressedDataBuffer, _readingState.DataPosition);
-
- // public methods
- public int ReadCompressedStreamToBufferIfAvailable(
- int recommendedCompressedSize,
- out int remainingSize)
- {
- remainingSize = _readingState.LastReadDataSize - _readingState.DataPosition;
-
- if (remainingSize <= 0 && !_readingState.IsDataDepleted && !_readingState.SkipDataReading)
- {
- var readSize = _compressedStream.Read(_compressedDataBuffer, 0, recommendedCompressedSize);
- UpdateStateAfterReading(readSize, out remainingSize);
- }
-
- return _readingState.DataPosition;
- }
-
- public bool TryPrepareDataForNextAttempt(int compressedBytesProcessed, int uncompressedBytesProcessed)
- {
- if (uncompressedBytesProcessed == 0) // 0 - when a frame is completely decoded and fully flushed
- {
- // the internal buffer is depleted, we're either done
- if (_readingState.IsDataDepleted)
- {
- return false;
- }
-
- // or we need more bytes
- _readingState.SkipDataReading = false;
- }
-
- // 1. calculate progress in compressed(input) buffer
- // 2. save the data position for next Read calls
- _readingState.DataPosition += compressedBytesProcessed;
- return true;
- }
-
- // private methods
- private void UpdateStateAfterReading(int readSize, out int remainingSize)
- {
- _readingState.LastReadDataSize = readSize;
- _readingState.IsDataDepleted = readSize <= 0;
- _readingState.DataPosition = 0;
-
- // skip _compressedStream.Read until the internal buffer is depleted
- // avoids a Read timeout for applications that know the exact number of bytes in the _compressedStream
- _readingState.SkipDataReading = true;
- remainingSize = _readingState.IsDataDepleted ? 0 : _readingState.LastReadDataSize;
- }
-
- // nested types
- private class ReadingState
- {
- ///
- /// Saves a position between different Read calls.
- ///
- public int DataPosition { get; set; }
- ///
- /// Shows whether the last attempt to read data from the stream contained records or no. false if no.
- ///
- public bool IsDataDepleted { get; set; }
- ///
- /// The size of the last fetched data from the stream.
- ///
- public int LastReadDataSize { get; set; }
- ///
- /// Determines whether stream.Read should be skipped until the internal buffer is depleted.
- ///
- public bool SkipDataReading { get; set; }
- }
- }
-
- private class StreamWriteHelper
- {
- private readonly BufferInfo _compressedBufferInfo;
- private readonly Stream _compressedStream;
-
- public StreamWriteHelper(Stream compressedStream, byte[] compressedBuffer)
- {
- _compressedStream = Ensure.IsNotNull(compressedStream, nameof(compressedStream));
- _compressedBufferInfo = new BufferInfo(
- Ensure.IsNotNull(compressedBuffer, nameof(compressedBuffer)),
- offset: 0);
- }
-
- public BufferInfo CompressedBufferInfo => _compressedBufferInfo; // will be implicitly updated via calls of native methods
-
- public void WriteBufferToCompressedStream(int count)
- {
- _compressedStream.Write(
- _compressedBufferInfo.Bytes,
- _compressedBufferInfo.Offset, // 0
- count);
- }
- }
- }
-}
diff --git a/src/MongoDB.Driver.Core/Core/Compression/Zstandard/lib/linux/libzstd.so b/src/MongoDB.Driver.Core/Core/Compression/Zstandard/lib/linux/libzstd.so
deleted file mode 100644
index 8309c49b768..00000000000
Binary files a/src/MongoDB.Driver.Core/Core/Compression/Zstandard/lib/linux/libzstd.so and /dev/null differ
diff --git a/src/MongoDB.Driver.Core/Core/Compression/Zstandard/lib/osx/libzstd.dylib b/src/MongoDB.Driver.Core/Core/Compression/Zstandard/lib/osx/libzstd.dylib
deleted file mode 100644
index 5400d7605ce..00000000000
Binary files a/src/MongoDB.Driver.Core/Core/Compression/Zstandard/lib/osx/libzstd.dylib and /dev/null differ
diff --git a/src/MongoDB.Driver.Core/Core/Compression/Zstandard/lib/win/libzstd.dll b/src/MongoDB.Driver.Core/Core/Compression/Zstandard/lib/win/libzstd.dll
deleted file mode 100644
index e669123c1cd..00000000000
Binary files a/src/MongoDB.Driver.Core/Core/Compression/Zstandard/lib/win/libzstd.dll and /dev/null differ
diff --git a/src/MongoDB.Driver.Core/Core/Compression/ZstandardCompressor.cs b/src/MongoDB.Driver.Core/Core/Compression/ZstandardCompressor.cs
index 6fd7c0865ff..363213e401c 100644
--- a/src/MongoDB.Driver.Core/Core/Compression/ZstandardCompressor.cs
+++ b/src/MongoDB.Driver.Core/Core/Compression/ZstandardCompressor.cs
@@ -13,9 +13,8 @@
* limitations under the License.
*/
+using ZstdSharp;
using System.IO;
-using System.IO.Compression;
-using MongoDB.Driver.Core.Compression.Zstandard;
using MongoDB.Driver.Core.Misc;
namespace MongoDB.Driver.Core.Compression
@@ -37,7 +36,7 @@ public ZstandardCompressor(Optional compressionLevel = default)
public void Compress(Stream input, Stream output)
{
- using (var zstandardStream = new ZstandardStream(output, CompressionMode.Compress, _compressionLevel))
+ using (var zstandardStream = new CompressionStream(output, _compressionLevel))
{
input.EfficientCopyTo(zstandardStream);
zstandardStream.Flush();
@@ -46,7 +45,7 @@ public void Compress(Stream input, Stream output)
public void Decompress(Stream input, Stream output)
{
- using (var zstandardStream = new ZstandardStream(input, CompressionMode.Decompress))
+ using (var zstandardStream = new DecompressionStream(input))
{
zstandardStream.CopyTo(output);
}
diff --git a/src/MongoDB.Driver.Core/Core/Configuration/ClusterBuilder.cs b/src/MongoDB.Driver.Core/Core/Configuration/ClusterBuilder.cs
index 106540e1d2f..ba5af005544 100644
--- a/src/MongoDB.Driver.Core/Core/Configuration/ClusterBuilder.cs
+++ b/src/MongoDB.Driver.Core/Core/Configuration/ClusterBuilder.cs
@@ -23,6 +23,7 @@
using MongoDB.Driver.Core.Connections;
using MongoDB.Driver.Core.Events;
using MongoDB.Driver.Core.Events.Diagnostics;
+using MongoDB.Driver.Core.Logging;
using MongoDB.Driver.Core.Misc;
using MongoDB.Driver.Core.Servers;
@@ -41,7 +42,10 @@ public class ClusterBuilder
private ClusterSettings _clusterSettings;
private ConnectionPoolSettings _connectionPoolSettings;
private ConnectionSettings _connectionSettings;
+ private LoggingSettings _loggingSettings;
+#pragma warning disable CS0618 // Type or member is obsolete
private SdamLoggingSettings _sdamLoggingSettings;
+#pragma warning restore CS0618 // Type or member is obsolete
private ServerSettings _serverSettings;
private SslStreamSettings _sslStreamSettings;
private Func _streamFactoryWrapper;
@@ -54,7 +58,9 @@ public class ClusterBuilder
public ClusterBuilder()
{
_clusterSettings = new ClusterSettings();
+#pragma warning disable CS0618 // Type or member is obsolete
_sdamLoggingSettings = new SdamLoggingSettings(null);
+#pragma warning restore CS0618 // Type or member is obsolete
_serverSettings = new ServerSettings();
_connectionPoolSettings = new ConnectionPoolSettings();
_connectionSettings = new ConnectionSettings();
@@ -113,11 +119,26 @@ public ClusterBuilder ConfigureConnectionPool(Func
+ /// Configures the logging settings.
+ ///
+ /// The logging settings configurator delegate.
+ /// A reconfigured cluster builder.
+ [CLSCompliant(false)]
+ public ClusterBuilder ConfigureLoggingSettings(Func configurator)
+ {
+ Ensure.IsNotNull(configurator, nameof(configurator));
+
+ _loggingSettings = configurator(_loggingSettings);
+ return this;
+ }
+
///
/// Configures the SDAM logging settings.
///
/// The SDAM logging settings configurator delegate.
/// A reconfigured cluster builder.
+ [Obsolete("Use ConfigureLoggingSettings instead.")]
public ClusterBuilder ConfigureSdamLogging(Func configurator)
{
_sdamLoggingSettings = configurator(_sdamLoggingSettings);
@@ -218,7 +239,8 @@ private IClusterFactory CreateClusterFactory()
return new ClusterFactory(
_clusterSettings,
serverFactory,
- _eventAggregator);
+ _eventAggregator,
+ _loggingSettings?.ToInternalLoggerFactory());
}
private IConnectionPoolFactory CreateConnectionPoolFactory()
@@ -229,14 +251,16 @@ private IConnectionPoolFactory CreateConnectionPoolFactory()
_connectionSettings,
streamFactory,
_eventAggregator,
- _clusterSettings.ServerApi);
+ _clusterSettings.ServerApi,
+ _loggingSettings.ToInternalLoggerFactory());
var connectionPoolSettings = _connectionPoolSettings.WithInternal(isPausable: !_connectionSettings.LoadBalanced);
return new ExclusiveConnectionPoolFactory(
connectionPoolSettings,
connectionFactory,
- _eventAggregator);
+ _eventAggregator,
+ _loggingSettings.ToInternalLoggerFactory());
}
private ServerFactory CreateServerFactory()
@@ -258,7 +282,8 @@ private ServerFactory CreateServerFactory()
connectionPoolFactory,
serverMonitorFactory,
_eventAggregator,
- _clusterSettings.ServerApi);
+ _clusterSettings.ServerApi,
+ _loggingSettings.ToInternalLoggerFactory());
}
private IServerMonitorFactory CreateServerMonitorFactory()
@@ -292,13 +317,15 @@ private IServerMonitorFactory CreateServerMonitorFactory()
serverMonitorConnectionSettings,
serverMonitorStreamFactory,
new EventAggregator(),
- _clusterSettings.ServerApi);
+ _clusterSettings.ServerApi,
+ loggerFactory: null);
return new ServerMonitorFactory(
serverMonitorSettings,
serverMonitorConnectionFactory,
_eventAggregator,
- _clusterSettings.ServerApi);
+ _clusterSettings.ServerApi,
+ _loggingSettings.ToInternalLoggerFactory());
}
private IStreamFactory CreateTcpStreamFactory(TcpStreamSettings tcpStreamSettings)
diff --git a/src/MongoDB.Driver.Core/Core/Configuration/LoggingSettings.cs b/src/MongoDB.Driver.Core/Core/Configuration/LoggingSettings.cs
new file mode 100644
index 00000000000..791f9dfd524
--- /dev/null
+++ b/src/MongoDB.Driver.Core/Core/Configuration/LoggingSettings.cs
@@ -0,0 +1,101 @@
+/* Copyright 2010-present MongoDB Inc.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+using System;
+using Microsoft.Extensions.Logging;
+
+namespace MongoDB.Driver.Core.Configuration
+{
+ ///
+ /// Represents the settings for logging.
+ ///
+ public sealed class LoggingSettings : IEquatable
+ {
+ ///
+ /// Gets the logger factory.
+ ///
+ [CLSCompliant(false)]
+ public ILoggerFactory LoggerFactory { get; }
+
+ ///
+ /// Gets the maximum document size in chars
+ ///
+ public int MaxDocumentSize { get; }
+
+ // constructors
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The logger factory.
+ /// The maximum document size in chars.
+ [CLSCompliant(false)]
+ public LoggingSettings(
+ ILoggerFactory loggerFactory = default,
+ Optional maxDocumentSize = default)
+ {
+ LoggerFactory = loggerFactory;
+ MaxDocumentSize = maxDocumentSize.WithDefault(MongoInternalDefaults.Logging.MaxDocumentSize);
+ }
+
+ // public operators
+ ///
+ /// Determines whether two instances are equal.
+ ///
+ /// The LHS.
+ /// The RHS.
+ ///
+ /// true if the left hand side is equal to the right hand side; otherwise, false .
+ ///
+ public static bool operator ==(LoggingSettings lhs, LoggingSettings rhs)
+ {
+ return object.Equals(lhs, rhs); // handles lhs == null correctly
+ }
+
+ ///
+ /// Determines whether two instances are not equal.
+ ///
+ /// The LHS.
+ /// The RHS.
+ ///
+ /// true if the left hand side is not equal to the right hand side; otherwise, false .
+ ///
+ public static bool operator !=(LoggingSettings lhs, LoggingSettings rhs)
+ {
+ return !(lhs == rhs);
+ }
+
+ // public methods
+ ///
+ /// Determines whether the specified is equal to this instance.
+ ///
+ /// The to compare with this instance.
+ ///
+ /// true if the specified is equal to this instance; otherwise, false .
+ ///
+ public bool Equals(LoggingSettings rhs)
+ {
+ return
+ rhs != null &&
+ LoggerFactory == rhs.LoggerFactory &&
+ MaxDocumentSize == rhs.MaxDocumentSize;
+ }
+
+ ///
+ public override bool Equals(object obj) => Equals(obj as LoggingSettings);
+
+ ///
+ public override int GetHashCode() => base.GetHashCode();
+ }
+}
diff --git a/src/MongoDB.Driver.Core/Core/Configuration/SdamLoggingSettings.cs b/src/MongoDB.Driver.Core/Core/Configuration/SdamLoggingSettings.cs
index 5025b8ce604..630a8fe1d27 100644
--- a/src/MongoDB.Driver.Core/Core/Configuration/SdamLoggingSettings.cs
+++ b/src/MongoDB.Driver.Core/Core/Configuration/SdamLoggingSettings.cs
@@ -13,11 +13,14 @@
* limitations under the License.
*/
+using System;
+
namespace MongoDB.Driver.Core.Configuration
{
///
/// Represents settings for SDAM logging.
///
+ [Obsolete("Use MongoClientSettings.LoggerFactory instead.")]
public class SdamLoggingSettings
{
private readonly string _logFilename;
diff --git a/src/MongoDB.Driver.Core/Core/ConnectionPools/ExclusiveConnectionPool.Helpers.cs b/src/MongoDB.Driver.Core/Core/ConnectionPools/ExclusiveConnectionPool.Helpers.cs
index e4e65a9bf31..252b4a15583 100644
--- a/src/MongoDB.Driver.Core/Core/ConnectionPools/ExclusiveConnectionPool.Helpers.cs
+++ b/src/MongoDB.Driver.Core/Core/ConnectionPools/ExclusiveConnectionPool.Helpers.cs
@@ -23,6 +23,7 @@
using MongoDB.Driver.Core.Configuration;
using MongoDB.Driver.Core.Connections;
using MongoDB.Driver.Core.Events;
+using MongoDB.Driver.Core.Logging;
using MongoDB.Driver.Core.Misc;
using MongoDB.Driver.Core.WireProtocol.Messages;
using MongoDB.Driver.Core.WireProtocol.Messages.Encoders;
@@ -282,8 +283,7 @@ private void AcquireWaitQueueSlot()
private void StartCheckingOut()
{
- _pool._checkingOutConnectionEventHandler?
- .Invoke(new ConnectionPoolCheckingOutConnectionEvent(_pool._serverId, EventContext.OperationId));
+ _pool._eventLogger.LogAndPublish(new ConnectionPoolCheckingOutConnectionEvent(_pool._serverId, EventContext.OperationId));
_pool._poolState.ThrowIfNotReady();
@@ -296,8 +296,7 @@ private IConnectionHandle EndCheckingOut(PooledConnection pooledConnection, Stop
var connectionHandle = new AcquiredConnection(_pool, reference);
stopwatch.Stop();
- var checkedOutConnectionEvent = new ConnectionPoolCheckedOutConnectionEvent(connectionHandle.ConnectionId, stopwatch.Elapsed, EventContext.OperationId);
- _pool._checkedOutConnectionEventHandler?.Invoke(checkedOutConnectionEvent);
+ _pool._eventLogger.LogAndPublish(new ConnectionPoolCheckedOutConnectionEvent(connectionHandle.ConnectionId, stopwatch.Elapsed, EventContext.OperationId));
// no need to release the semaphore
_poolQueueWaitResult = SemaphoreSlimSignalable.SemaphoreWaitResult.None;
@@ -331,18 +330,14 @@ private Exception CreateException(Stopwatch stopwatch) =>
private void HandleException(Exception ex)
{
- var handler = _pool._checkingOutConnectionFailedEventHandler;
- if (handler != null)
+ var reason = ex switch
{
- ConnectionCheckOutFailedReason reason;
- switch (ex)
- {
- case ObjectDisposedException _: reason = ConnectionCheckOutFailedReason.PoolClosed; break;
- case TimeoutException _: reason = ConnectionCheckOutFailedReason.Timeout; break;
- default: reason = ConnectionCheckOutFailedReason.ConnectionError; break;
- }
- handler(new ConnectionPoolCheckingOutConnectionFailedEvent(_pool._serverId, ex, EventContext.OperationId, reason));
- }
+ ObjectDisposedException => ConnectionCheckOutFailedReason.PoolClosed,
+ TimeoutException => ConnectionCheckOutFailedReason.Timeout,
+ _ => ConnectionCheckOutFailedReason.ConnectionError
+ };
+
+ _pool._eventLogger.LogAndPublish(new ConnectionPoolCheckingOutConnectionFailedEvent(_pool._serverId, ex, EventContext.OperationId, reason));
}
}
@@ -659,18 +654,14 @@ internal sealed class ListConnectionHolder
private readonly object _lockInUse = new object();
private readonly List _connections;
private readonly List _connectionsInUse;
+ private readonly EventLogger _eventLogger;
- private readonly Action _removingConnectionEventHandler;
- private readonly Action _removedConnectionEventHandler;
-
- public ListConnectionHolder(IEventSubscriber eventSubscriber, SemaphoreSlimSignalable semaphoreSlimSignalable)
+ public ListConnectionHolder(EventLogger eventLogger, SemaphoreSlimSignalable semaphoreSlimSignalable)
{
_semaphoreSlimSignalable = semaphoreSlimSignalable;
_connections = new List();
_connectionsInUse = new List();
-
- eventSubscriber.TryGetEventHandler(out _removingConnectionEventHandler);
- eventSubscriber.TryGetEventHandler(out _removedConnectionEventHandler);
+ _eventLogger = eventLogger;
}
public int Count
@@ -793,20 +784,14 @@ public void Return(PooledConnection connection)
public void RemoveConnection(PooledConnection connection)
{
- if (_removingConnectionEventHandler != null)
- {
- _removingConnectionEventHandler(new ConnectionPoolRemovingConnectionEvent(connection.ConnectionId, EventContext.OperationId));
- }
+ _eventLogger.LogAndPublish(new ConnectionPoolRemovingConnectionEvent(connection.ConnectionId, EventContext.OperationId));
var stopwatch = Stopwatch.StartNew();
UntrackInUseConnection(connection); // no op if connection is not in use
connection.Dispose();
stopwatch.Stop();
- if (_removedConnectionEventHandler != null)
- {
- _removedConnectionEventHandler(new ConnectionPoolRemovedConnectionEvent(connection.ConnectionId, stopwatch.Elapsed, EventContext.OperationId));
- }
+ _eventLogger.LogAndPublish(new ConnectionPoolRemovedConnectionEvent(connection.ConnectionId, stopwatch.Elapsed, EventContext.OperationId));
}
private void SignalOrReset()
@@ -1013,8 +998,7 @@ private async Task CreateOpenedInternalAsync(CancellationToken
private void StartCreating(CancellationToken cancellationToken)
{
- var addingConnectionEvent = new ConnectionPoolAddingConnectionEvent(_pool._serverId, EventContext.OperationId);
- _pool._addingConnectionEventHandler?.Invoke(addingConnectionEvent);
+ _pool._eventLogger.LogAndPublish(new ConnectionPoolAddingConnectionEvent(_pool._serverId, EventContext.OperationId));
cancellationToken.ThrowIfCancellationRequested();
@@ -1029,8 +1013,7 @@ private void FinishCreating(ConnectionDescription description)
{
_stopwatch.Stop();
- var connectionAddedEvent = new ConnectionPoolAddedConnectionEvent(_connection.ConnectionId, _stopwatch.Elapsed, EventContext.OperationId);
- _pool._addedConnectionEventHandler?.Invoke(connectionAddedEvent);
+ _pool._eventLogger.LogAndPublish(new ConnectionPoolAddedConnectionEvent(_connection.ConnectionId, _stopwatch.Elapsed, EventContext.OperationId));
// Only if reached this stage, connection should not be disposed
_disposeConnection = false;
diff --git a/src/MongoDB.Driver.Core/Core/ConnectionPools/ExclusiveConnectionPool.cs b/src/MongoDB.Driver.Core/Core/ConnectionPools/ExclusiveConnectionPool.cs
index 22286867f85..2e947539f4e 100644
--- a/src/MongoDB.Driver.Core/Core/ConnectionPools/ExclusiveConnectionPool.cs
+++ b/src/MongoDB.Driver.Core/Core/ConnectionPools/ExclusiveConnectionPool.cs
@@ -21,6 +21,7 @@
using MongoDB.Driver.Core.Configuration;
using MongoDB.Driver.Core.Connections;
using MongoDB.Driver.Core.Events;
+using MongoDB.Driver.Core.Logging;
using MongoDB.Driver.Core.Misc;
using MongoDB.Driver.Core.Servers;
@@ -44,21 +45,7 @@ internal sealed partial class ExclusiveConnectionPool : IConnectionPool
private readonly SemaphoreSlimSignalable _maxConnectingQueue;
private readonly IConnectionExceptionHandler _connectionExceptionHandler;
- private readonly Action _checkingOutConnectionEventHandler;
- private readonly Action _checkedOutConnectionEventHandler;
- private readonly Action _checkingOutConnectionFailedEventHandler;
- private readonly Action _checkingInConnectionEventHandler;
- private readonly Action _checkedInConnectionEventHandler;
- private readonly Action _addingConnectionEventHandler;
- private readonly Action _addedConnectionEventHandler;
- private readonly Action _openingEventHandler;
- private readonly Action _openedEventHandler;
- private readonly Action _readyEventHandler;
- private readonly Action _closingEventHandler;
- private readonly Action _closedEventHandler;
- private readonly Action _clearingEventHandler;
- private readonly Action _clearedEventHandler;
- private readonly Action _connectionCreatedEventHandler;
+ private readonly EventLogger _eventLogger;
// constructors
public ExclusiveConnectionPool(
@@ -66,46 +53,29 @@ public ExclusiveConnectionPool(
EndPoint endPoint,
ConnectionPoolSettings settings,
IConnectionFactory connectionFactory,
- IEventSubscriber eventSubscriber,
- IConnectionExceptionHandler connectionExceptionHandler)
+ IConnectionExceptionHandler connectionExceptionHandler,
+ EventLogger eventLogger)
{
_serverId = Ensure.IsNotNull(serverId, nameof(serverId));
_endPoint = Ensure.IsNotNull(endPoint, nameof(endPoint));
_settings = Ensure.IsNotNull(settings, nameof(settings));
_connectionFactory = Ensure.IsNotNull(connectionFactory, nameof(connectionFactory));
_connectionExceptionHandler = Ensure.IsNotNull(connectionExceptionHandler, nameof(connectionExceptionHandler));
- Ensure.IsNotNull(eventSubscriber, nameof(eventSubscriber));
+
+ _eventLogger = Ensure.IsNotNull(eventLogger, nameof(eventLogger));
_maintenanceHelper = new MaintenanceHelper(this, _settings.MaintenanceInterval);
_poolState = new PoolState(EndPointHelper.ToString(_endPoint));
_checkOutReasonCounter = new CheckOutReasonCounter();
_maxConnectingQueue = new SemaphoreSlimSignalable(settings.MaxConnecting);
- _connectionHolder = new ListConnectionHolder(eventSubscriber, _maxConnectingQueue);
+ _connectionHolder = new ListConnectionHolder(_eventLogger, _maxConnectingQueue);
_maxConnectionsQueue = new SemaphoreSlimSignalable(settings.MaxConnections);
_serviceStates = new ServiceStates();
#pragma warning disable 618
_waitQueueFreeSlots = settings.WaitQueueSize;
#pragma warning restore 618
-
- eventSubscriber.TryGetEventHandler(out _checkingOutConnectionEventHandler);
- eventSubscriber.TryGetEventHandler(out _checkedOutConnectionEventHandler);
- eventSubscriber.TryGetEventHandler(out _checkingOutConnectionFailedEventHandler);
- eventSubscriber.TryGetEventHandler(out _checkingInConnectionEventHandler);
- eventSubscriber.TryGetEventHandler(out _checkedInConnectionEventHandler);
- eventSubscriber.TryGetEventHandler(out _addingConnectionEventHandler);
- eventSubscriber.TryGetEventHandler(out _addedConnectionEventHandler);
- eventSubscriber.TryGetEventHandler(out _openingEventHandler);
- eventSubscriber.TryGetEventHandler(out _openedEventHandler);
- eventSubscriber.TryGetEventHandler(out _closingEventHandler);
- eventSubscriber.TryGetEventHandler(out _closedEventHandler);
- eventSubscriber.TryGetEventHandler(out _readyEventHandler);
- eventSubscriber.TryGetEventHandler(out _addingConnectionEventHandler);
- eventSubscriber.TryGetEventHandler(out _addedConnectionEventHandler);
- eventSubscriber.TryGetEventHandler(out _clearingEventHandler);
- eventSubscriber.TryGetEventHandler(out _clearedEventHandler);
- eventSubscriber.TryGetEventHandler(out _connectionCreatedEventHandler);
}
// properties
@@ -190,7 +160,7 @@ public void Clear(bool closeInUseConnections = false)
if (_poolState.TransitionState(State.Paused))
{
- _clearingEventHandler?.Invoke(new ConnectionPoolClearingEvent(_serverId, _settings));
+ _eventLogger.LogAndPublish(new ConnectionPoolClearingEvent(_serverId, _settings));
int? maxGenerationToReap = closeInUseConnections ? _generation : null;
_generation++;
@@ -199,7 +169,7 @@ public void Clear(bool closeInUseConnections = false)
_maxConnectionsQueue.Signal();
_maxConnectingQueue.Signal();
- _clearedEventHandler?.Invoke(new ConnectionPoolClearedEvent(_serverId, _settings));
+ _eventLogger.LogAndPublish(new ConnectionPoolClearedEvent(_serverId, _settings));
}
}
}
@@ -214,18 +184,20 @@ public void Clear(ObjectId serviceId)
// generation increment can happen outside lock, as _serviceStates is threadsafe
// and currently we allow dispose to start during generation increment.
- _clearingEventHandler?.Invoke(new ConnectionPoolClearingEvent(_serverId, _settings, serviceId));
+ _eventLogger.LogAndPublish(new ConnectionPoolClearingEvent(_serverId, _settings, serviceId));
_serviceStates.IncrementGeneration(serviceId);
- _clearedEventHandler?.Invoke(new ConnectionPoolClearedEvent(_serverId, _settings, serviceId));
+ _eventLogger.LogAndPublish(new ConnectionPoolClearedEvent(_serverId, _settings, serviceId));
}
private PooledConnection CreateNewConnection()
{
var connection = _connectionFactory.CreateConnection(_serverId, _endPoint);
var pooledConnection = new PooledConnection(this, connection);
- _connectionCreatedEventHandler?.Invoke(new ConnectionCreatedEvent(connection.ConnectionId, connection.Settings, EventContext.OperationId));
+
+ _eventLogger.LogAndPublish(new ConnectionCreatedEvent(connection.ConnectionId, connection.Settings, EventContext.OperationId));
+
return pooledConnection;
}
@@ -235,8 +207,8 @@ public void Initialize()
{
if (_poolState.TransitionState(State.Paused))
{
- _openingEventHandler?.Invoke(new ConnectionPoolOpeningEvent(_serverId, _settings));
- _openedEventHandler?.Invoke(new ConnectionPoolOpenedEvent(_serverId, _settings));
+ _eventLogger.LogAndPublish(new ConnectionPoolOpeningEvent(_serverId, _settings), _connectionFactory.ConnectionSettings);
+ _eventLogger.LogAndPublish(new ConnectionPoolOpenedEvent(_serverId, _settings), _connectionFactory.ConnectionSettings);
}
}
}
@@ -250,7 +222,8 @@ public void SetReady()
if (_poolState.TransitionState(targetState))
{
_maxConnectionsQueue.Reset();
- _readyEventHandler?.Invoke(new ConnectionPoolReadyEvent(_serverId, _settings));
+
+ _eventLogger.LogAndPublish(new ConnectionPoolReadyEvent(_serverId, _settings));
_maintenanceHelper.Start();
}
@@ -268,19 +241,13 @@ public void Dispose()
if (dispose)
{
- if (_closingEventHandler != null)
- {
- _closingEventHandler(new ConnectionPoolClosingEvent(_serverId));
- }
+ _eventLogger.LogAndPublish(new ConnectionPoolClosingEvent(_serverId));
_maintenanceHelper.Dispose();
_connectionHolder.Clear();
_maxConnectionsQueue.Dispose();
_maxConnectingQueue.Dispose();
- if (_closedEventHandler != null)
- {
- _closedEventHandler(new ConnectionPoolClosedEvent(_serverId));
- }
+ _eventLogger.LogAndPublish(new ConnectionPoolClosedEvent(_serverId));
}
}
@@ -305,15 +272,8 @@ internal SemaphoreSlimSignalable.SemaphoreSlimSignalableAwaiter CreateMaxConnect
// private methods
private void ReleaseConnection(PooledConnection connection)
{
- if (_checkingInConnectionEventHandler != null)
- {
- _checkingInConnectionEventHandler(new ConnectionPoolCheckingInConnectionEvent(connection.ConnectionId, EventContext.OperationId));
- }
-
- if (_checkedInConnectionEventHandler != null)
- {
- _checkedInConnectionEventHandler(new ConnectionPoolCheckedInConnectionEvent(connection.ConnectionId, TimeSpan.Zero, EventContext.OperationId));
- }
+ _eventLogger.LogAndPublish(new ConnectionPoolCheckingInConnectionEvent(connection.ConnectionId, EventContext.OperationId));
+ _eventLogger.LogAndPublish(new ConnectionPoolCheckedInConnectionEvent(connection.ConnectionId, TimeSpan.Zero, EventContext.OperationId));
_checkOutReasonCounter.Decrement(connection.CheckOutReason);
diff --git a/src/MongoDB.Driver.Core/Core/ConnectionPools/ExclusiveConnectionPoolFactory.cs b/src/MongoDB.Driver.Core/Core/ConnectionPools/ExclusiveConnectionPoolFactory.cs
index aa6641e9f4d..cd3ffdd733d 100644
--- a/src/MongoDB.Driver.Core/Core/ConnectionPools/ExclusiveConnectionPoolFactory.cs
+++ b/src/MongoDB.Driver.Core/Core/ConnectionPools/ExclusiveConnectionPoolFactory.cs
@@ -14,9 +14,11 @@
*/
using System.Net;
+using Microsoft.Extensions.Logging;
using MongoDB.Driver.Core.Configuration;
using MongoDB.Driver.Core.Connections;
using MongoDB.Driver.Core.Events;
+using MongoDB.Driver.Core.Logging;
using MongoDB.Driver.Core.Misc;
using MongoDB.Driver.Core.Servers;
@@ -28,12 +30,14 @@ internal sealed class ExclusiveConnectionPoolFactory : IConnectionPoolFactory
private readonly IConnectionFactory _connectionFactory;
private readonly IEventSubscriber _eventSubscriber;
private readonly ConnectionPoolSettings _settings;
+ private readonly ILoggerFactory _loggerFactory;
- public ExclusiveConnectionPoolFactory(ConnectionPoolSettings settings, IConnectionFactory connectionFactory, IEventSubscriber eventSubscriber)
+ public ExclusiveConnectionPoolFactory(ConnectionPoolSettings settings, IConnectionFactory connectionFactory, IEventSubscriber eventSubscriber, ILoggerFactory loggerFactory)
{
_settings = Ensure.IsNotNull(settings, nameof(settings));
_connectionFactory = Ensure.IsNotNull(connectionFactory, nameof(connectionFactory));
_eventSubscriber = Ensure.IsNotNull(eventSubscriber, nameof(eventSubscriber));
+ _loggerFactory = loggerFactory;
}
public IConnectionPool CreateConnectionPool(ServerId serverId, EndPoint endPoint, IConnectionExceptionHandler connectionExceptionHandler)
@@ -41,7 +45,7 @@ public IConnectionPool CreateConnectionPool(ServerId serverId, EndPoint endPoint
Ensure.IsNotNull(serverId, nameof(serverId));
Ensure.IsNotNull(endPoint, nameof(endPoint));
- return new ExclusiveConnectionPool(serverId, endPoint, _settings, _connectionFactory, _eventSubscriber, connectionExceptionHandler);
+ return new ExclusiveConnectionPool(serverId, endPoint, _settings, _connectionFactory, connectionExceptionHandler, _loggerFactory.CreateEventLogger(_eventSubscriber));
}
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Connections/BinaryConnection.cs b/src/MongoDB.Driver.Core/Core/Connections/BinaryConnection.cs
index edc6bbc166a..57e8277272e 100644
--- a/src/MongoDB.Driver.Core/Core/Connections/BinaryConnection.cs
+++ b/src/MongoDB.Driver.Core/Core/Connections/BinaryConnection.cs
@@ -22,10 +22,12 @@
using System.Net;
using System.Threading;
using System.Threading.Tasks;
+using Microsoft.Extensions.Logging;
using MongoDB.Bson.IO;
using MongoDB.Driver.Core.Compression;
using MongoDB.Driver.Core.Configuration;
using MongoDB.Driver.Core.Events;
+using MongoDB.Driver.Core.Logging;
using MongoDB.Driver.Core.Misc;
using MongoDB.Driver.Core.Servers;
using MongoDB.Driver.Core.WireProtocol.Messages;
@@ -59,22 +61,16 @@ internal class BinaryConnection : IConnection
private readonly InterlockedInt32 _state;
private Stream _stream;
private readonly IStreamFactory _streamFactory;
-
- private readonly Action _failedEventHandler;
- private readonly Action _closingEventHandler;
- private readonly Action _closedEventHandler;
- private readonly Action _openingEventHandler;
- private readonly Action _openedEventHandler;
- private readonly Action _failedOpeningEventHandler;
- private readonly Action _receivingMessageEventHandler;
- private readonly Action _receivedMessageEventHandler;
- private readonly Action _failedReceivingMessageEventHandler;
- private readonly Action _sendingMessagesEventHandler;
- private readonly Action _sentMessagesEventHandler;
- private readonly Action _failedSendingMessagesEvent;
+ private readonly EventLogger _eventLogger;
// constructors
- public BinaryConnection(ServerId serverId, EndPoint endPoint, ConnectionSettings settings, IStreamFactory streamFactory, IConnectionInitializer connectionInitializer, IEventSubscriber eventSubscriber)
+ public BinaryConnection(ServerId serverId,
+ EndPoint endPoint,
+ ConnectionSettings settings,
+ IStreamFactory streamFactory,
+ IConnectionInitializer connectionInitializer,
+ IEventSubscriber eventSubscriber,
+ ILoggerFactory loggerFactory)
{
Ensure.IsNotNull(serverId, nameof(serverId));
_endPoint = Ensure.IsNotNull(endPoint, nameof(endPoint));
@@ -88,21 +84,9 @@ public BinaryConnection(ServerId serverId, EndPoint endPoint, ConnectionSettings
_sendLock = new SemaphoreSlim(1);
_state = new InterlockedInt32(State.Initial);
- _commandEventHelper = new CommandEventHelper(eventSubscriber);
- eventSubscriber.TryGetEventHandler(out _failedEventHandler);
- eventSubscriber.TryGetEventHandler(out _closingEventHandler);
- eventSubscriber.TryGetEventHandler(out _closedEventHandler);
- eventSubscriber.TryGetEventHandler(out _openingEventHandler);
- eventSubscriber.TryGetEventHandler(out _openedEventHandler);
- eventSubscriber.TryGetEventHandler(out _failedOpeningEventHandler);
- eventSubscriber.TryGetEventHandler(out _receivingMessageEventHandler);
- eventSubscriber.TryGetEventHandler(out _receivedMessageEventHandler);
- eventSubscriber.TryGetEventHandler(out _failedReceivingMessageEventHandler);
- eventSubscriber.TryGetEventHandler(out _sendingMessagesEventHandler);
- eventSubscriber.TryGetEventHandler(out _sentMessagesEventHandler);
- eventSubscriber.TryGetEventHandler(out _failedSendingMessagesEvent);
-
_compressorSource = new CompressorSource(settings.Compressors);
+ _eventLogger = loggerFactory.CreateEventLogger(eventSubscriber);
+ _commandEventHelper = new CommandEventHelper(loggerFactory.CreateEventLogger(eventSubscriber));
}
// properties
@@ -153,6 +137,8 @@ public ConnectionSettings Settings
get { return _settings; }
}
+ private bool IsInitializing => _state.Value == State.Initializing;
+
// methods
private void ConnectionFailed(Exception exception)
{
@@ -168,11 +154,8 @@ private void ConnectionFailed(Exception exception)
if (!_failedEventHasBeenRaised)
{
_failedEventHasBeenRaised = true;
- if (_failedEventHandler != null)
- {
- _failedEventHandler(new ConnectionFailedEvent(_connectionId, exception));
- }
- _commandEventHelper.ConnectionFailed(_connectionId, _description?.ServiceId, exception);
+ _eventLogger.LogAndPublish(new ConnectionFailedEvent(_connectionId, exception));
+ _commandEventHelper.ConnectionFailed(_connectionId, _description?.ServiceId, exception, IsInitializing);
}
}
@@ -188,10 +171,7 @@ private void Dispose(bool disposing)
{
if (disposing)
{
- if (_closingEventHandler != null)
- {
- _closingEventHandler(new ConnectionClosingEvent(_connectionId, EventContext.OperationId));
- }
+ _eventLogger.LogAndPublish(new ConnectionClosingEvent(_connectionId, EventContext.OperationId));
var stopwatch = Stopwatch.StartNew();
_receiveLock.Dispose();
@@ -210,10 +190,7 @@ private void Dispose(bool disposing)
}
stopwatch.Stop();
- if (_closedEventHandler != null)
- {
- _closedEventHandler(new ConnectionClosedEvent(_connectionId, stopwatch.Elapsed, EventContext.OperationId));
- }
+ _eventLogger.LogAndPublish(new ConnectionClosedEvent(_connectionId, stopwatch.Elapsed, EventContext.OperationId));
}
}
}
@@ -843,11 +820,7 @@ public void FailedOpeningConnection(Exception wrappedException)
}
}
- var handler = _connection._failedOpeningEventHandler;
- if (handler != null)
- {
- handler(new ConnectionOpeningFailedEvent(_connection.ConnectionId, _connection._settings, wrappedException, EventContext.OperationId));
- }
+ _connection._eventLogger.LogAndPublish(new ConnectionOpeningFailedEvent(_connection.ConnectionId, _connection._settings, wrappedException, EventContext.OperationId));
}
public void InitializingConnection()
@@ -884,20 +857,12 @@ public void OpenedConnection()
}
}
- var handler = _connection._openedEventHandler;
- if (handler != null)
- {
- handler(new ConnectionOpenedEvent(_connection.ConnectionId, _connection._settings, _stopwatch.Elapsed, EventContext.OperationId));
- }
+ _connection._eventLogger.LogAndPublish(new ConnectionOpenedEvent(_connection.ConnectionId, _connection._settings, _stopwatch.Elapsed, EventContext.OperationId));
}
public void OpeningConnection()
{
- var handler = _connection._openingEventHandler;
- if (handler != null)
- {
- handler(new ConnectionOpeningEvent(_connection.ConnectionId, _connection._settings, EventContext.OperationId));
- }
+ _connection._eventLogger.LogAndPublish(new ConnectionOpeningEvent(_connection.ConnectionId, _connection._settings, EventContext.OperationId));
_stopwatch = Stopwatch.StartNew();
}
@@ -957,37 +922,25 @@ public void FailedReceivingMessage(Exception exception)
{
if (_connection._commandEventHelper.ShouldCallErrorReceiving)
{
- _connection._commandEventHelper.ErrorReceiving(_responseTo, _connection._connectionId, _connection.Description?.ServiceId, exception);
+ _connection._commandEventHelper.ErrorReceiving(_responseTo, _connection._connectionId, _connection.Description?.ServiceId, exception, _connection.IsInitializing);
}
- var handler = _connection._failedReceivingMessageEventHandler;
- if (handler != null)
- {
- handler(new ConnectionReceivingMessageFailedEvent(_connection.ConnectionId, _responseTo, exception, EventContext.OperationId));
- }
+ _connection._eventLogger.LogAndPublish(new ConnectionReceivingMessageFailedEvent(_connection.ConnectionId, _responseTo, exception, EventContext.OperationId));
}
public void ReceivedMessage(IByteBuffer buffer, ResponseMessage message)
{
if (_connection._commandEventHelper.ShouldCallAfterReceiving)
{
- _connection._commandEventHelper.AfterReceiving(message, buffer, _connection._connectionId, _connection.Description?.ServiceId, _messageEncoderSettings);
+ _connection._commandEventHelper.AfterReceiving(message, buffer, _connection._connectionId, _connection.Description?.ServiceId, _messageEncoderSettings, _connection.IsInitializing);
}
- var handler = _connection._receivedMessageEventHandler;
- if (handler != null)
- {
- handler(new ConnectionReceivedMessageEvent(_connection.ConnectionId, _responseTo, buffer.Length, _networkDuration, _deserializationDuration, EventContext.OperationId));
- }
+ _connection._eventLogger.LogAndPublish(new ConnectionReceivedMessageEvent(_connection.ConnectionId, _responseTo, buffer.Length, _networkDuration, _deserializationDuration, EventContext.OperationId));
}
public void ReceivingMessage()
{
- var handler = _connection._receivingMessageEventHandler;
- if (handler != null)
- {
- handler(new ConnectionReceivingMessageEvent(_connection.ConnectionId, _responseTo, EventContext.OperationId));
- }
+ _connection._eventLogger.LogAndPublish(new ConnectionReceivingMessageEvent(_connection.ConnectionId, _responseTo, EventContext.OperationId));
_stopwatch = Stopwatch.StartNew();
}
@@ -1059,32 +1012,24 @@ public IByteBuffer EncodeMessages(CancellationToken cancellationToken, out List<
public void EncodingMessages()
{
- var handler = _connection._sendingMessagesEventHandler;
- if (handler != null)
- {
- handler(new ConnectionSendingMessagesEvent(_connection.ConnectionId, _requestIds.Value, EventContext.OperationId));
- }
+ _connection._eventLogger.LogAndPublish(new ConnectionSendingMessagesEvent(_connection.ConnectionId, _requestIds.Value, EventContext.OperationId));
}
public void FailedSendingMessages(Exception ex)
{
if (_connection._commandEventHelper.ShouldCallErrorSending)
{
- _connection._commandEventHelper.ErrorSending(_messages, _connection._connectionId, _connection._description?.ServiceId, ex);
+ _connection._commandEventHelper.ErrorSending(_messages, _connection._connectionId, _connection._description?.ServiceId, ex, _connection.IsInitializing);
}
- var handler = _connection._failedSendingMessagesEvent;
- if (handler != null)
- {
- handler(new ConnectionSendingMessagesFailedEvent(_connection.ConnectionId, _requestIds.Value, ex, EventContext.OperationId));
- }
+ _connection._eventLogger.LogAndPublish(new ConnectionSendingMessagesFailedEvent(_connection.ConnectionId, _requestIds.Value, ex, EventContext.OperationId));
}
public void SendingMessages(IByteBuffer buffer)
{
if (_connection._commandEventHelper.ShouldCallBeforeSending)
{
- _connection._commandEventHelper.BeforeSending(_messages, _connection.ConnectionId, _connection.Description?.ServiceId, buffer, _messageEncoderSettings, _commandStopwatch);
+ _connection._commandEventHelper.BeforeSending(_messages, _connection.ConnectionId, _connection.Description?.ServiceId, buffer, _messageEncoderSettings, _commandStopwatch, _connection.IsInitializing);
}
_networkStopwatch = Stopwatch.StartNew();
@@ -1097,14 +1042,10 @@ public void SentMessages(int bufferLength)
if (_connection._commandEventHelper.ShouldCallAfterSending)
{
- _connection._commandEventHelper.AfterSending(_messages, _connection._connectionId, _connection.Description?.ServiceId);
+ _connection._commandEventHelper.AfterSending(_messages, _connection._connectionId, _connection.Description?.ServiceId, _connection.IsInitializing);
}
- var handler = _connection._sentMessagesEventHandler;
- if (handler != null)
- {
- handler(new ConnectionSentMessagesEvent(_connection.ConnectionId, _requestIds.Value, bufferLength, networkDuration, _serializationDuration, EventContext.OperationId));
- }
+ _connection._eventLogger.LogAndPublish(new ConnectionSentMessagesEvent(_connection.ConnectionId, _requestIds.Value, bufferLength, networkDuration, _serializationDuration, EventContext.OperationId));
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Connections/BinaryConnectionFactory.cs b/src/MongoDB.Driver.Core/Core/Connections/BinaryConnectionFactory.cs
index 81483ad29fa..1589820d92e 100644
--- a/src/MongoDB.Driver.Core/Core/Connections/BinaryConnectionFactory.cs
+++ b/src/MongoDB.Driver.Core/Core/Connections/BinaryConnectionFactory.cs
@@ -14,6 +14,7 @@
*/
using System.Net;
+using Microsoft.Extensions.Logging;
using MongoDB.Driver.Core.Configuration;
using MongoDB.Driver.Core.Events;
using MongoDB.Driver.Core.Misc;
@@ -29,6 +30,7 @@ internal class BinaryConnectionFactory : IConnectionFactory
// fields
private readonly IConnectionInitializer _connectionInitializer;
private readonly IEventSubscriber _eventSubscriber;
+ private readonly ILoggerFactory _loggerFactory;
private readonly ConnectionSettings _settings;
private readonly IStreamFactory _streamFactory;
@@ -37,20 +39,25 @@ public BinaryConnectionFactory(
ConnectionSettings settings,
IStreamFactory streamFactory,
IEventSubscriber eventSubscriber,
- ServerApi serverApi)
+ ServerApi serverApi,
+ ILoggerFactory loggerFactory)
{
_settings = Ensure.IsNotNull(settings, nameof(settings));
_streamFactory = Ensure.IsNotNull(streamFactory, nameof(streamFactory));
_eventSubscriber = Ensure.IsNotNull(eventSubscriber, nameof(eventSubscriber));
_connectionInitializer = new ConnectionInitializer(settings.ApplicationName, settings.Compressors, serverApi);
+ _loggerFactory = loggerFactory;
}
+ // properties
+ public ConnectionSettings ConnectionSettings => _settings;
+
// methods
public IConnection CreateConnection(ServerId serverId, EndPoint endPoint)
{
Ensure.IsNotNull(serverId, nameof(serverId));
Ensure.IsNotNull(endPoint, nameof(endPoint));
- return new BinaryConnection(serverId, endPoint, _settings, _streamFactory, _connectionInitializer, _eventSubscriber);
+ return new BinaryConnection(serverId, endPoint, _settings, _streamFactory, _connectionInitializer, _eventSubscriber, _loggerFactory);
}
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Connections/CommandEventHelper.cs b/src/MongoDB.Driver.Core/Core/Connections/CommandEventHelper.cs
index 3b3664048a7..806fb192f45 100644
--- a/src/MongoDB.Driver.Core/Core/Connections/CommandEventHelper.cs
+++ b/src/MongoDB.Driver.Core/Core/Connections/CommandEventHelper.cs
@@ -23,6 +23,7 @@
using MongoDB.Bson.IO;
using MongoDB.Bson.Serialization.Serializers;
using MongoDB.Driver.Core.Events;
+using MongoDB.Driver.Core.Logging;
using MongoDB.Driver.Core.Misc;
using MongoDB.Driver.Core.WireProtocol.Messages;
using MongoDB.Driver.Core.WireProtocol.Messages.Encoders;
@@ -32,24 +33,21 @@ namespace MongoDB.Driver.Core.Connections
{
internal class CommandEventHelper
{
- private static readonly string[] __writeConcernIndicators = new[] { "wtimeout", "jnote", "wnote" };
-
+ private readonly EventLogger _eventLogger;
private readonly ConcurrentDictionary _state;
- private readonly Action _startedEvent;
- private readonly Action _succeededEvent;
- private readonly Action _failedEvent;
private readonly bool _shouldProcessRequestMessages;
private readonly bool _shouldTrackState;
+ private readonly bool _shouldTrackFailed;
+ private readonly bool _shouldTrackSucceeded;
- public CommandEventHelper(IEventSubscriber eventSubscriber)
+ public CommandEventHelper(EventLogger eventLogger)
{
- eventSubscriber.TryGetEventHandler(out _startedEvent);
- eventSubscriber.TryGetEventHandler(out _succeededEvent);
- eventSubscriber.TryGetEventHandler(out _failedEvent);
-
- _shouldTrackState = _succeededEvent != null || _failedEvent != null;
- _shouldProcessRequestMessages = _startedEvent != null || _shouldTrackState;
+ _eventLogger = eventLogger;
+ _shouldTrackSucceeded = _eventLogger.IsEventTracked();
+ _shouldTrackFailed = _eventLogger.IsEventTracked();
+ _shouldTrackState = _shouldTrackSucceeded || _shouldTrackFailed;
+ _shouldProcessRequestMessages = _eventLogger.IsEventTracked() || _shouldTrackState;
if (_shouldTrackState)
{
@@ -90,7 +88,8 @@ public void BeforeSending(
ObjectId? serviceId,
IByteBuffer buffer,
MessageEncoderSettings encoderSettings,
- Stopwatch stopwatch)
+ Stopwatch stopwatch,
+ bool skipLogging)
{
using (var stream = new ByteBufferStream(buffer, ownsBuffer: false))
{
@@ -98,12 +97,12 @@ public void BeforeSending(
while (messageQueue.Count > 0)
{
- ProcessRequestMessages(messageQueue, connectionId, serviceId, stream, encoderSettings, stopwatch);
+ ProcessRequestMessages(messageQueue, connectionId, serviceId, stream, encoderSettings, stopwatch, skipLogging);
}
}
}
- public void AfterSending(IEnumerable messages, ConnectionId connectionId, ObjectId? serviceId)
+ public void AfterSending(IEnumerable messages, ConnectionId connectionId, ObjectId? serviceId, bool skipLogging)
{
foreach (var message in messages)
{
@@ -112,26 +111,25 @@ public void AfterSending(IEnumerable messages, ConnectionId conn
state.ExpectedResponseType == ExpectedResponseType.None)
{
state.Stopwatch.Stop();
- if (_succeededEvent != null)
+
+ if (_shouldTrackSucceeded)
{
- var @event = new CommandSucceededEvent(
+ _eventLogger.LogAndPublish(new CommandSucceededEvent(
state.CommandName,
new BsonDocument("ok", 1),
state.OperationId,
message.RequestId,
connectionId,
serviceId,
- state.Stopwatch.Elapsed);
-
- _succeededEvent(@event);
+ state.Stopwatch.Elapsed),
+ skipLogging);
}
-
_state.TryRemove(message.RequestId, out state);
}
}
}
- public void ErrorSending(IEnumerable messages, ConnectionId connectionId, ObjectId? serviceId, Exception exception)
+ public void ErrorSending(IEnumerable messages, ConnectionId connectionId, ObjectId? serviceId, Exception exception, bool skipLogging)
{
foreach (var message in messages)
{
@@ -139,24 +137,20 @@ public void ErrorSending(IEnumerable messages, ConnectionId conn
if (_state.TryRemove(message.RequestId, out state))
{
state.Stopwatch.Stop();
- if (_failedEvent != null)
- {
- var @event = new CommandFailedEvent(
- state.CommandName,
- exception,
- state.OperationId,
- message.RequestId,
- connectionId,
- serviceId,
- state.Stopwatch.Elapsed);
-
- _failedEvent(@event);
- }
+ _eventLogger.LogAndPublish(new CommandFailedEvent(
+ state.CommandName,
+ exception,
+ state.OperationId,
+ message.RequestId,
+ connectionId,
+ serviceId,
+ state.Stopwatch.Elapsed),
+ skipLogging);
}
}
}
- public void AfterReceiving(ResponseMessage message, IByteBuffer buffer, ConnectionId connectionId, ObjectId? serviceId, MessageEncoderSettings encoderSettings)
+ public void AfterReceiving(ResponseMessage message, IByteBuffer buffer, ConnectionId connectionId, ObjectId? serviceId, MessageEncoderSettings encoderSettings, bool skipLogging)
{
CommandState state;
if (!_state.TryRemove(message.ResponseTo, out state))
@@ -167,15 +161,15 @@ public void AfterReceiving(ResponseMessage message, IByteBuffer buffer, Connecti
if (message is CommandResponseMessage)
{
- ProcessCommandResponseMessage(state, (CommandResponseMessage)message, buffer, connectionId, serviceId, encoderSettings);
+ ProcessCommandResponseMessage(state, (CommandResponseMessage)message, buffer, connectionId, serviceId, encoderSettings, skipLogging);
}
else
{
- ProcessReplyMessage(state, message, buffer, connectionId, encoderSettings);
+ ProcessReplyMessage(state, message, buffer, connectionId, encoderSettings, skipLogging);
}
}
- public void ErrorReceiving(int responseTo, ConnectionId connectionId, ObjectId? serviceId, Exception exception)
+ public void ErrorReceiving(int responseTo, ConnectionId connectionId, ObjectId? serviceId, Exception exception, bool skipLogging)
{
CommandState state;
if (!_state.TryRemove(responseTo, out state))
@@ -185,22 +179,21 @@ public void ErrorReceiving(int responseTo, ConnectionId connectionId, ObjectId?
}
state.Stopwatch.Stop();
- if (_failedEvent != null)
- {
- _failedEvent(new CommandFailedEvent(
- state.CommandName,
- exception,
- state.OperationId,
- responseTo,
- connectionId,
- serviceId,
- state.Stopwatch.Elapsed));
- }
+
+ _eventLogger.LogAndPublish(new CommandFailedEvent(
+ state.CommandName,
+ exception,
+ state.OperationId,
+ responseTo,
+ connectionId,
+ serviceId,
+ state.Stopwatch.Elapsed),
+ skipLogging);
}
- public void ConnectionFailed(ConnectionId connectionId, ObjectId? serviceId, Exception exception)
+ public void ConnectionFailed(ConnectionId connectionId, ObjectId? serviceId, Exception exception, bool skipLogging)
{
- if (_failedEvent == null)
+ if (!_shouldTrackFailed)
{
return;
}
@@ -212,37 +205,36 @@ public void ConnectionFailed(ConnectionId connectionId, ObjectId? serviceId, Exc
if (_state.TryRemove(requestId, out state))
{
state.Stopwatch.Stop();
- var @event = new CommandFailedEvent(
+ _eventLogger.LogAndPublish(new CommandFailedEvent(
state.CommandName,
exception,
state.OperationId,
requestId,
connectionId,
serviceId,
- state.Stopwatch.Elapsed);
-
- _failedEvent(@event);
+ state.Stopwatch.Elapsed),
+ skipLogging);
}
}
}
- private void ProcessRequestMessages(Queue messageQueue, ConnectionId connectionId, ObjectId? serviceId, Stream stream, MessageEncoderSettings encoderSettings, Stopwatch stopwatch)
+ private void ProcessRequestMessages(Queue messageQueue, ConnectionId connectionId, ObjectId? serviceId, Stream stream, MessageEncoderSettings encoderSettings, Stopwatch stopwatch, bool skipLogging)
{
var message = messageQueue.Dequeue();
switch (message.MessageType)
{
case MongoDBMessageType.Command:
- ProcessCommandRequestMessage((CommandRequestMessage)message, messageQueue, connectionId, serviceId, new CommandMessageBinaryEncoder(stream, encoderSettings), stopwatch);
+ ProcessCommandRequestMessage((CommandRequestMessage)message, messageQueue, connectionId, serviceId, new CommandMessageBinaryEncoder(stream, encoderSettings), stopwatch, skipLogging);
break;
case MongoDBMessageType.Query:
- ProcessQueryMessage((QueryMessage)message, connectionId, new QueryMessageBinaryEncoder(stream, encoderSettings), stopwatch);
+ ProcessQueryMessage((QueryMessage)message, connectionId, new QueryMessageBinaryEncoder(stream, encoderSettings), stopwatch, skipLogging);
break;
default:
throw new MongoInternalException("Invalid message type.");
}
}
- private void ProcessCommandRequestMessage(CommandRequestMessage originalMessage, Queue messageQueue, ConnectionId connectionId, ObjectId? serviceId, CommandMessageBinaryEncoder encoder, Stopwatch stopwatch)
+ private void ProcessCommandRequestMessage(CommandRequestMessage originalMessage, Queue messageQueue, ConnectionId connectionId, ObjectId? serviceId, CommandMessageBinaryEncoder encoder, Stopwatch stopwatch, bool skipLogging)
{
var requestId = originalMessage.RequestId;
var operationId = EventContext.OperationId;
@@ -272,19 +264,15 @@ private void ProcessCommandRequestMessage(CommandRequestMessage originalMessage,
command = new BsonDocument();
}
- if (_startedEvent != null)
- {
- var @event = new CommandStartedEvent(
- commandName,
- command,
- databaseNamespace,
- operationId,
- requestId,
- connectionId,
- serviceId);
-
- _startedEvent(@event);
- }
+ _eventLogger.LogAndPublish(new CommandStartedEvent(
+ commandName,
+ command,
+ databaseNamespace,
+ operationId,
+ requestId,
+ connectionId,
+ serviceId),
+ skipLogging);
if (_shouldTrackState)
{
@@ -301,7 +289,7 @@ private void ProcessCommandRequestMessage(CommandRequestMessage originalMessage,
}
}
- private void ProcessCommandResponseMessage(CommandState state, CommandResponseMessage message, IByteBuffer buffer, ConnectionId connectionId, ObjectId? serviceId, MessageEncoderSettings encoderSettings)
+ private void ProcessCommandResponseMessage(CommandState state, CommandResponseMessage message, IByteBuffer buffer, ConnectionId connectionId, ObjectId? serviceId, MessageEncoderSettings encoderSettings, bool skipLogging)
{
var wrappedMessage = message.WrappedMessage;
var type0Section = wrappedMessage.Sections.OfType>().Single();
@@ -322,23 +310,21 @@ private void ProcessCommandResponseMessage(CommandState state, CommandResponseMe
if (ok.ToBoolean())
{
- if (_succeededEvent != null)
- {
- _succeededEvent(new CommandSucceededEvent(
- state.CommandName,
- reply,
- state.OperationId,
- message.ResponseTo,
- connectionId,
- serviceId,
- state.Stopwatch.Elapsed));
- }
+ _eventLogger.LogAndPublish(new CommandSucceededEvent(
+ state.CommandName,
+ reply,
+ state.OperationId,
+ message.ResponseTo,
+ connectionId,
+ serviceId,
+ state.Stopwatch.Elapsed),
+ skipLogging);
}
else
{
- if (_failedEvent != null)
+ if (_shouldTrackFailed)
{
- _failedEvent(new CommandFailedEvent(
+ _eventLogger.LogAndPublish(new CommandFailedEvent(
state.CommandName,
new MongoCommandException(
connectionId,
@@ -349,12 +335,13 @@ private void ProcessCommandResponseMessage(CommandState state, CommandResponseMe
message.ResponseTo,
connectionId,
serviceId,
- state.Stopwatch.Elapsed));
+ state.Stopwatch.Elapsed),
+ skipLogging);
}
}
}
- private void ProcessQueryMessage(QueryMessage originalMessage, ConnectionId connectionId, QueryMessageBinaryEncoder encoder, Stopwatch stopwatch)
+ private void ProcessQueryMessage(QueryMessage originalMessage, ConnectionId connectionId, QueryMessageBinaryEncoder encoder, Stopwatch stopwatch, bool skipLogging)
{
var requestId = originalMessage.RequestId;
var operationId = EventContext.OperationId;
@@ -388,18 +375,14 @@ private void ProcessQueryMessage(QueryMessage originalMessage, ConnectionId conn
}
}
- if (_startedEvent != null)
- {
- var @event = new CommandStartedEvent(
- commandName,
- command,
- decodedMessage.CollectionNamespace.DatabaseNamespace,
- operationId,
- requestId,
- connectionId);
-
- _startedEvent(@event);
- }
+ _eventLogger.LogAndPublish(new CommandStartedEvent(
+ commandName,
+ command,
+ decodedMessage.CollectionNamespace.DatabaseNamespace,
+ operationId,
+ requestId,
+ connectionId),
+ skipLogging);
if (_shouldTrackState)
{
@@ -429,7 +412,7 @@ private void ProcessQueryMessage(QueryMessage originalMessage, ConnectionId conn
}
}
- private void ProcessReplyMessage(CommandState state, ResponseMessage message, IByteBuffer buffer, ConnectionId connectionId, MessageEncoderSettings encoderSettings)
+ private void ProcessReplyMessage(CommandState state, ResponseMessage message, IByteBuffer buffer, ConnectionId connectionId, MessageEncoderSettings encoderSettings, bool skipLogging)
{
state.Stopwatch.Stop();
bool disposeOfDocuments = false;
@@ -458,9 +441,10 @@ private void ProcessReplyMessage(CommandState state, ResponseMessage message, IB
{
queryFailureDocument = new BsonDocument();
}
- if (_failedEvent != null)
+
+ if (_shouldTrackFailed)
{
- _failedEvent(new CommandFailedEvent(
+ _eventLogger.LogAndPublish(new CommandFailedEvent(
state.CommandName,
new MongoCommandException(
connectionId,
@@ -470,7 +454,8 @@ private void ProcessReplyMessage(CommandState state, ResponseMessage message, IB
state.OperationId,
replyMessage.ResponseTo,
connectionId,
- state.Stopwatch.Elapsed));
+ state.Stopwatch.Elapsed),
+ skipLogging);
}
}
else
@@ -478,10 +463,10 @@ private void ProcessReplyMessage(CommandState state, ResponseMessage message, IB
switch (state.ExpectedResponseType)
{
case ExpectedResponseType.Command:
- ProcessCommandReplyMessage(state, replyMessage, connectionId);
+ ProcessCommandReplyMessage(state, replyMessage, connectionId, skipLogging);
break;
case ExpectedResponseType.Query:
- ProcessQueryReplyMessage(state, replyMessage, connectionId);
+ ProcessQueryReplyMessage(state, replyMessage, connectionId, skipLogging);
break;
}
}
@@ -495,7 +480,7 @@ private void ProcessReplyMessage(CommandState state, ResponseMessage message, IB
}
}
- private void ProcessCommandReplyMessage(CommandState state, ReplyMessage replyMessage, ConnectionId connectionId)
+ private void ProcessCommandReplyMessage(CommandState state, ReplyMessage replyMessage, ConnectionId connectionId, bool skipLogging)
{
BsonDocument reply = replyMessage.Documents[0];
BsonValue ok;
@@ -513,9 +498,9 @@ private void ProcessCommandReplyMessage(CommandState state, ReplyMessage replyMessage, ConnectionId connectionId)
+ private void ProcessQueryReplyMessage(CommandState state, ReplyMessage replyMessage, ConnectionId connectionId, bool skipLogging)
{
- if (_succeededEvent != null)
+ if (_shouldTrackSucceeded)
{
BsonDocument reply;
if (state.CommandName == "explain")
@@ -565,13 +552,14 @@ private void ProcessQueryReplyMessage(CommandState state, ReplyMessage
{
// fields
private readonly ServerId _serverId;
- private readonly int _localValue;
- private readonly int? _serverValue;
+ private readonly long _localValue;
+ private readonly long? _serverValue;
private readonly int _hashCode;
// constructors
@@ -38,7 +38,7 @@ public sealed class ConnectionId : IEquatable
///
/// The server identifier.
public ConnectionId(ServerId serverId)
- : this(serverId, IdGenerator.GetNextId())
+ : this(serverId, LongIdGenerator.GetNextId())
{
}
@@ -47,7 +47,7 @@ public ConnectionId(ServerId serverId)
///
/// The server identifier.
/// The local value.
- public ConnectionId(ServerId serverId, int localValue)
+ public ConnectionId(ServerId serverId, long localValue)
{
_serverId = Ensure.IsNotNull(serverId, nameof(serverId));
_localValue = Ensure.IsGreaterThanOrEqualToZero(localValue, nameof(localValue));
@@ -57,7 +57,7 @@ public ConnectionId(ServerId serverId, int localValue)
.GetHashCode();
}
- private ConnectionId(ServerId serverId, int localValue, int serverValue)
+ private ConnectionId(ServerId serverId, long localValue, long serverValue)
: this(serverId, localValue)
{
_serverValue = Ensure.IsGreaterThanOrEqualToZero(serverValue, nameof(serverValue));
@@ -81,7 +81,19 @@ public ServerId ServerId
///
/// The local value.
///
+ [Obsolete("Use LongLocalValue instead.")]
public int LocalValue
+ {
+ get { return (int)_localValue; }
+ }
+
+ ///
+ /// Gets the local value.
+ ///
+ ///
+ /// The local value.
+ ///
+ public long LongLocalValue
{
get { return _localValue; }
}
@@ -92,7 +104,19 @@ public int LocalValue
///
/// The server value.
///
+ [Obsolete("Use LongServerValue instead.")]
public int? ServerValue
+ {
+ get { return (int)_serverValue; }
+ }
+
+ ///
+ /// Gets the server value.
+ ///
+ ///
+ /// The server value.
+ ///
+ public long? LongServerValue
{
get { return _serverValue; }
}
@@ -159,7 +183,7 @@ public override string ToString()
///
/// The server value.
/// A ConnectionId.
- public ConnectionId WithServerValue(int serverValue)
+ public ConnectionId WithServerValue(long serverValue)
{
return new ConnectionId(_serverId, _localValue, serverValue);
}
diff --git a/src/MongoDB.Driver.Core/Core/Connections/IConnectionFactory.cs b/src/MongoDB.Driver.Core/Core/Connections/IConnectionFactory.cs
index a26dd5e2527..7e1d7b79f6d 100644
--- a/src/MongoDB.Driver.Core/Core/Connections/IConnectionFactory.cs
+++ b/src/MongoDB.Driver.Core/Core/Connections/IConnectionFactory.cs
@@ -13,13 +13,8 @@
* limitations under the License.
*/
-using System;
-using System.Collections.Generic;
-using System.Linq;
using System.Net;
-using System.Text;
-using System.Threading;
-using System.Threading.Tasks;
+using MongoDB.Driver.Core.Configuration;
using MongoDB.Driver.Core.Servers;
namespace MongoDB.Driver.Core.Connections
@@ -29,6 +24,12 @@ namespace MongoDB.Driver.Core.Connections
///
public interface IConnectionFactory
{
+ // properties
+ ///
+ /// Gets the connection settings.
+ ///
+ ConnectionSettings ConnectionSettings { get; }
+
// methods
///
/// Creates the connection.
diff --git a/src/MongoDB.Driver.Core/Core/Connections/TcpStreamFactory.cs b/src/MongoDB.Driver.Core/Core/Connections/TcpStreamFactory.cs
index 129690377be..da707e65e07 100644
--- a/src/MongoDB.Driver.Core/Core/Connections/TcpStreamFactory.cs
+++ b/src/MongoDB.Driver.Core/Core/Connections/TcpStreamFactory.cs
@@ -259,29 +259,30 @@ private Socket CreateSocket(EndPoint endPoint)
var socket = new Socket(addressFamily, SocketType.Stream, ProtocolType.Tcp);
- // not all platforms support IOControl
try
{
- var keepAliveValues = new KeepAliveValues
+ if (OperatingSystemHelper.CurrentOperatingSystem == OperatingSystemPlatform.Windows)
{
- OnOff = 1,
- KeepAliveTime = 120000, // 120 seconds in milliseconds
- KeepAliveInterval = 10000 // 10 seconds in milliseconds
- };
- socket.IOControl(IOControlCode.KeepAliveValues, keepAliveValues.ToBytes(), null);
- }
- catch (PlatformNotSupportedException)
- {
- // most platforms should support this call to SetSocketOption, but just in case call it in a try/catch also
- try
- {
- socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);
+ // Reviewing the .NET source, Socket.IOControl for IOControlCode.KeepAlivesValue will
+ // throw PlatformNotSupportedException on all platforms except for Windows.
+ // https://github.com/dotnet/runtime/blob/main/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketPal.Unix.cs#L1346
+ var keepAliveValues = new KeepAliveValues
+ {
+ OnOff = 1,
+ KeepAliveTime = 120000, // 120 seconds in milliseconds
+ KeepAliveInterval = 10000 // 10 seconds in milliseconds
+ };
+ socket.IOControl(IOControlCode.KeepAliveValues, keepAliveValues.ToBytes(), null);
}
- catch (PlatformNotSupportedException)
+ else
{
- // ignore PlatformNotSupportedException
+ socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);
}
}
+ catch (PlatformNotSupportedException)
+ {
+ // ignore PlatformNotSupportedException
+ }
return socket;
}
diff --git a/src/MongoDB.Driver.Core/Core/Encryption/EncryptedCollectionHelper.cs b/src/MongoDB.Driver.Core/Core/Encryption/EncryptedCollectionHelper.cs
index 0e66ad36641..7fc13b4a363 100644
--- a/src/MongoDB.Driver.Core/Core/Encryption/EncryptedCollectionHelper.cs
+++ b/src/MongoDB.Driver.Core/Core/Encryption/EncryptedCollectionHelper.cs
@@ -76,6 +76,30 @@ public static BsonDocument GetEffectiveEncryptedFields(CollectionNamespace colle
}
}
+ public static IEnumerable IterateEmptyKeyIds(CollectionNamespace collectionNamespace, BsonDocument encryptedFields)
+ {
+ if (!EncryptedCollectionHelper.TryGetEffectiveEncryptedFields(collectionNamespace, encryptedFields, encryptedFieldsMap: null, out var storedEncryptedFields))
+ {
+ throw new InvalidOperationException("There are no encrypted fields defined for the collection.");
+ }
+
+ if (storedEncryptedFields.TryGetValue("fields", out var fields) && fields is BsonArray fieldsArray)
+ {
+ foreach (var field in fieldsArray.OfType()) // If `F` is not a document element, skip it.
+ {
+ if (field.TryGetElement("keyId", out var keyId) && keyId.Value == BsonNull.Value)
+ {
+ yield return field;
+ }
+ }
+ }
+ }
+
+ public static void ModifyEncryptedFields(BsonDocument fieldDocument, Guid dataKey)
+ {
+ fieldDocument["keyId"] = new BsonBinaryData(dataKey, GuidRepresentation.Standard);
+ }
+
public enum HelperCollectionForEncryption
{
Esc,
diff --git a/src/MongoDB.Driver.Core/Core/Events/ClusterAddedServerEvent.cs b/src/MongoDB.Driver.Core/Core/Events/ClusterAddedServerEvent.cs
index 6ad625d8c91..8f1f3a55696 100644
--- a/src/MongoDB.Driver.Core/Core/Events/ClusterAddedServerEvent.cs
+++ b/src/MongoDB.Driver.Core/Core/Events/ClusterAddedServerEvent.cs
@@ -22,7 +22,7 @@ namespace MongoDB.Driver.Core.Events
///
/// Occurs after a server is added to the cluster.
///
- public struct ClusterAddedServerEvent
+ public struct ClusterAddedServerEvent : IEvent
{
private readonly TimeSpan _duration;
private readonly ServerId _serverId;
@@ -71,5 +71,8 @@ public DateTime Timestamp
{
get { return _timestamp; }
}
+
+ // explicit interface implementations
+ EventType IEvent.Type => EventType.ClusterAddedServer;
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Events/ClusterAddingServerEvent.cs b/src/MongoDB.Driver.Core/Core/Events/ClusterAddingServerEvent.cs
index 2dee3f53c24..ef745521fc3 100644
--- a/src/MongoDB.Driver.Core/Core/Events/ClusterAddingServerEvent.cs
+++ b/src/MongoDB.Driver.Core/Core/Events/ClusterAddingServerEvent.cs
@@ -22,7 +22,7 @@ namespace MongoDB.Driver.Core.Events
///
/// Occurs before a server is added to the cluster.
///
- public struct ClusterAddingServerEvent
+ public struct ClusterAddingServerEvent : IEvent
{
private readonly ClusterId _clusterId;
private readonly EndPoint _endPoint;
@@ -63,5 +63,8 @@ public DateTime Timestamp
{
get { return _timestamp; }
}
+
+ // explicit interface implementations
+ EventType IEvent.Type => EventType.ClusterAddingServer;
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Events/ClusterClosedEvent.cs b/src/MongoDB.Driver.Core/Core/Events/ClusterClosedEvent.cs
index c53049d0abc..71c31192ca5 100644
--- a/src/MongoDB.Driver.Core/Core/Events/ClusterClosedEvent.cs
+++ b/src/MongoDB.Driver.Core/Core/Events/ClusterClosedEvent.cs
@@ -21,7 +21,7 @@ namespace MongoDB.Driver.Core.Events
///
/// Occurs after a cluster is closed.
///
- public struct ClusterClosedEvent
+ public struct ClusterClosedEvent : IEvent
{
private readonly ClusterId _clusterId;
private readonly TimeSpan _duration;
@@ -62,5 +62,8 @@ public DateTime Timestamp
{
get { return _timestamp; }
}
+
+ // explicit interface implementations
+ EventType IEvent.Type => EventType.ClusterClosed;
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Events/ClusterClosingEvent.cs b/src/MongoDB.Driver.Core/Core/Events/ClusterClosingEvent.cs
index e34e466843d..42d36c46c45 100644
--- a/src/MongoDB.Driver.Core/Core/Events/ClusterClosingEvent.cs
+++ b/src/MongoDB.Driver.Core/Core/Events/ClusterClosingEvent.cs
@@ -21,7 +21,7 @@ namespace MongoDB.Driver.Core.Events
///
/// Occurs before a cluster is closed.
///
- public struct ClusterClosingEvent
+ public struct ClusterClosingEvent : IEvent
{
private readonly ClusterId _clusterId;
private readonly DateTime _timestamp;
@@ -51,5 +51,8 @@ public DateTime Timestamp
{
get { return _timestamp; }
}
+
+ // explicit interface implementations
+ EventType IEvent.Type => EventType.ClusterClosing;
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Events/ClusterDescriptionChangedEvent.cs b/src/MongoDB.Driver.Core/Core/Events/ClusterDescriptionChangedEvent.cs
index 981ea686a27..98089aa8fa1 100644
--- a/src/MongoDB.Driver.Core/Core/Events/ClusterDescriptionChangedEvent.cs
+++ b/src/MongoDB.Driver.Core/Core/Events/ClusterDescriptionChangedEvent.cs
@@ -21,7 +21,7 @@ namespace MongoDB.Driver.Core.Events
///
/// Occurs when a cluster has changed.
///
- public struct ClusterDescriptionChangedEvent
+ public struct ClusterDescriptionChangedEvent : IEvent
{
private readonly ClusterDescription _oldDescription;
private readonly ClusterDescription _newDescription;
@@ -70,5 +70,8 @@ public DateTime Timestamp
{
get { return _timestamp; }
}
+
+ // explicit interface implementations
+ EventType IEvent.Type => EventType.ClusterDescriptionChanged;
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Events/ClusterOpenedEvent.cs b/src/MongoDB.Driver.Core/Core/Events/ClusterOpenedEvent.cs
index fe8ab528f14..8bbd4eedb3f 100644
--- a/src/MongoDB.Driver.Core/Core/Events/ClusterOpenedEvent.cs
+++ b/src/MongoDB.Driver.Core/Core/Events/ClusterOpenedEvent.cs
@@ -22,7 +22,7 @@ namespace MongoDB.Driver.Core.Events
///
/// Occurs after a cluster is opened.
///
- public struct ClusterOpenedEvent
+ public struct ClusterOpenedEvent : IEvent
{
private readonly ClusterId _clusterId;
private readonly ClusterSettings _clusterSettings;
@@ -74,5 +74,8 @@ public DateTime Timestamp
{
get { return _timestamp; }
}
+
+ // explicit interface implementations
+ EventType IEvent.Type => EventType.ClusterOpened;
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Events/ClusterOpeningEvent.cs b/src/MongoDB.Driver.Core/Core/Events/ClusterOpeningEvent.cs
index 0e74a7b69c9..285b6535e6a 100644
--- a/src/MongoDB.Driver.Core/Core/Events/ClusterOpeningEvent.cs
+++ b/src/MongoDB.Driver.Core/Core/Events/ClusterOpeningEvent.cs
@@ -22,7 +22,7 @@ namespace MongoDB.Driver.Core.Events
///
/// Occurs before a cluster is opened.
///
- public struct ClusterOpeningEvent
+ public struct ClusterOpeningEvent : IEvent
{
private readonly ClusterId _clusterId;
private readonly ClusterSettings _clusterSettings;
@@ -63,5 +63,8 @@ public DateTime Timestamp
{
get { return _timestamp; }
}
+
+ // explicit interface implementations
+ EventType IEvent.Type => EventType.ClusterOpening;
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Events/ClusterRemovedServerEvent.cs b/src/MongoDB.Driver.Core/Core/Events/ClusterRemovedServerEvent.cs
index 61a2e2e3beb..cc18155e944 100644
--- a/src/MongoDB.Driver.Core/Core/Events/ClusterRemovedServerEvent.cs
+++ b/src/MongoDB.Driver.Core/Core/Events/ClusterRemovedServerEvent.cs
@@ -22,7 +22,7 @@ namespace MongoDB.Driver.Core.Events
///
/// Occurs after a server has been removed from the cluster.
///
- public struct ClusterRemovedServerEvent
+ public struct ClusterRemovedServerEvent : IEvent
{
private readonly TimeSpan _duration;
private readonly string _reason;
@@ -82,5 +82,8 @@ public DateTime Timestamp
{
get { return _timestamp; }
}
+
+ // explicit interface implementations
+ EventType IEvent.Type => EventType.ClusterRemovedServer;
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Events/ClusterRemovingServerEvent.cs b/src/MongoDB.Driver.Core/Core/Events/ClusterRemovingServerEvent.cs
index 67b1e6150b7..2ae31a0f477 100644
--- a/src/MongoDB.Driver.Core/Core/Events/ClusterRemovingServerEvent.cs
+++ b/src/MongoDB.Driver.Core/Core/Events/ClusterRemovingServerEvent.cs
@@ -22,7 +22,7 @@ namespace MongoDB.Driver.Core.Events
///
/// Occurs before a server is removed from the cluster.
///
- public struct ClusterRemovingServerEvent
+ public struct ClusterRemovingServerEvent : IEvent
{
private readonly string _reason;
private readonly ServerId _serverId;
@@ -71,5 +71,8 @@ public DateTime Timestamp
{
get { return _timestamp; }
}
+
+ // explicit interface implementations
+ EventType IEvent.Type => EventType.ClusterRemovingServer;
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Events/ClusterSelectedServerEvent.cs b/src/MongoDB.Driver.Core/Core/Events/ClusterSelectedServerEvent.cs
index 415a6ad1c2c..e4b36a6687b 100644
--- a/src/MongoDB.Driver.Core/Core/Events/ClusterSelectedServerEvent.cs
+++ b/src/MongoDB.Driver.Core/Core/Events/ClusterSelectedServerEvent.cs
@@ -23,7 +23,7 @@ namespace MongoDB.Driver.Core.Events
///
/// Occurs after a server is selected.
///
- public struct ClusterSelectedServerEvent
+ public struct ClusterSelectedServerEvent : IEvent
{
private readonly ClusterDescription _clusterDescription;
private readonly TimeSpan _duration;
@@ -105,5 +105,8 @@ public DateTime Timestamp
{
get { return _timestamp; }
}
+
+ // explicit interface implementations
+ EventType IEvent.Type => EventType.ClusterSelectedServer;
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Events/ClusterSelectingServerEvent.cs b/src/MongoDB.Driver.Core/Core/Events/ClusterSelectingServerEvent.cs
index e2473c0da29..1505106d6a0 100644
--- a/src/MongoDB.Driver.Core/Core/Events/ClusterSelectingServerEvent.cs
+++ b/src/MongoDB.Driver.Core/Core/Events/ClusterSelectingServerEvent.cs
@@ -22,7 +22,7 @@ namespace MongoDB.Driver.Core.Events
///
/// Occurs before a server is selected.
///
- public struct ClusterSelectingServerEvent
+ public struct ClusterSelectingServerEvent : IEvent
{
private readonly ClusterDescription _clusterDescription;
private readonly long? _operationId;
@@ -82,5 +82,8 @@ public DateTime Timestamp
{
get { return _timestamp; }
}
+
+ // explicit interface implementations
+ EventType IEvent.Type => EventType.ClusterSelectingServer;
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Events/ClusterSelectingServerFailedEvent.cs b/src/MongoDB.Driver.Core/Core/Events/ClusterSelectingServerFailedEvent.cs
index 3dc2b37c7d1..e4d5deb7a5b 100644
--- a/src/MongoDB.Driver.Core/Core/Events/ClusterSelectingServerFailedEvent.cs
+++ b/src/MongoDB.Driver.Core/Core/Events/ClusterSelectingServerFailedEvent.cs
@@ -22,7 +22,7 @@ namespace MongoDB.Driver.Core.Events
///
/// Occurs when selecting a server fails.
///
- public struct ClusterSelectingServerFailedEvent
+ public struct ClusterSelectingServerFailedEvent : IEvent
{
private readonly ClusterDescription _clusterDescription;
private readonly Exception _exception;
@@ -93,5 +93,8 @@ public DateTime Timestamp
{
get { return _timestamp; }
}
+
+ // explicit interface implementations
+ EventType IEvent.Type => EventType.ClusterSelectingServerFailed;
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Events/CommandFailedEvent.cs b/src/MongoDB.Driver.Core/Core/Events/CommandFailedEvent.cs
index c7c679ecbac..543aabea698 100644
--- a/src/MongoDB.Driver.Core/Core/Events/CommandFailedEvent.cs
+++ b/src/MongoDB.Driver.Core/Core/Events/CommandFailedEvent.cs
@@ -23,7 +23,7 @@ namespace MongoDB.Driver.Core.Events
///
/// Occurs when a command has failed.
///
- public struct CommandFailedEvent
+ public struct CommandFailedEvent : IEvent
{
private readonly string _commandName;
private readonly ConnectionId _connectionId;
@@ -133,5 +133,8 @@ public DateTime Timestamp
{
get { return _timestamp; }
}
+
+ // explicit interface implementations
+ EventType IEvent.Type => EventType.CommandFailed;
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Events/CommandStartedEvent.cs b/src/MongoDB.Driver.Core/Core/Events/CommandStartedEvent.cs
index ac7a5bffa60..1ef3b2db977 100644
--- a/src/MongoDB.Driver.Core/Core/Events/CommandStartedEvent.cs
+++ b/src/MongoDB.Driver.Core/Core/Events/CommandStartedEvent.cs
@@ -23,7 +23,7 @@ namespace MongoDB.Driver.Core.Events
///
/// Occurs when a command has started.
///
- public struct CommandStartedEvent
+ public struct CommandStartedEvent : IEvent
{
private readonly BsonDocument _command;
private readonly string _commandName;
@@ -133,5 +133,8 @@ public DateTime Timestamp
{
get { return _timestamp; }
}
+
+ // explicit interface implementations
+ EventType IEvent.Type => EventType.CommandStarted;
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Events/CommandSucceededEvent.cs b/src/MongoDB.Driver.Core/Core/Events/CommandSucceededEvent.cs
index 60e493435a2..ea967a0ffc3 100644
--- a/src/MongoDB.Driver.Core/Core/Events/CommandSucceededEvent.cs
+++ b/src/MongoDB.Driver.Core/Core/Events/CommandSucceededEvent.cs
@@ -23,7 +23,7 @@ namespace MongoDB.Driver.Core.Events
///
/// Occurs when a command has succeeded.
///
- public struct CommandSucceededEvent
+ public struct CommandSucceededEvent : IEvent
{
private readonly string _commandName;
private readonly ConnectionId _connectionId;
@@ -133,5 +133,8 @@ public DateTime Timestamp
{
get { return _timestamp; }
}
+
+ // explicit interface implementations
+ EventType IEvent.Type => EventType.CommandSucceeded;
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Events/ConnectionClosedEvent.cs b/src/MongoDB.Driver.Core/Core/Events/ConnectionClosedEvent.cs
index 02501959b8d..ef8bf3d2b88 100644
--- a/src/MongoDB.Driver.Core/Core/Events/ConnectionClosedEvent.cs
+++ b/src/MongoDB.Driver.Core/Core/Events/ConnectionClosedEvent.cs
@@ -23,7 +23,7 @@ namespace MongoDB.Driver.Core.Events
///
/// Occurs after a connection is closed.
///
- public struct ConnectionClosedEvent
+ public struct ConnectionClosedEvent : IEvent
{
private readonly ConnectionId _connectionId;
private readonly TimeSpan _duration;
@@ -91,5 +91,8 @@ public DateTime Timestamp
{
get { return _timestamp; }
}
+
+ // explicit interface implementations
+ EventType IEvent.Type => EventType.ConnectionClosed;
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Events/ConnectionClosingEvent.cs b/src/MongoDB.Driver.Core/Core/Events/ConnectionClosingEvent.cs
index 9e7b5bb3a5b..90fef002025 100644
--- a/src/MongoDB.Driver.Core/Core/Events/ConnectionClosingEvent.cs
+++ b/src/MongoDB.Driver.Core/Core/Events/ConnectionClosingEvent.cs
@@ -23,7 +23,7 @@ namespace MongoDB.Driver.Core.Events
///
/// Occurs before a connection is closed.
///
- public struct ConnectionClosingEvent
+ public struct ConnectionClosingEvent : IEvent
{
private readonly ConnectionId _connectionId;
private readonly long? _operationId;
@@ -80,5 +80,8 @@ public DateTime Timestamp
{
get { return _timestamp; }
}
+
+ // explicit interface implementations
+ EventType IEvent.Type => EventType.ConnectionClosing;
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Events/ConnectionCreatedEvent.cs b/src/MongoDB.Driver.Core/Core/Events/ConnectionCreatedEvent.cs
index 5d441b39e64..ed87ee91fd8 100644
--- a/src/MongoDB.Driver.Core/Core/Events/ConnectionCreatedEvent.cs
+++ b/src/MongoDB.Driver.Core/Core/Events/ConnectionCreatedEvent.cs
@@ -22,9 +22,9 @@
namespace MongoDB.Driver.Core.Events
{
///
- /// Occurs when a connection is created..
+ /// Occurs when a connection is created.
///
- public struct ConnectionCreatedEvent
+ public struct ConnectionCreatedEvent : IEvent
{
private readonly ConnectionId _connectionId;
private readonly ConnectionSettings _connectionSettings;
@@ -92,5 +92,8 @@ public DateTime Timestamp
{
get { return _timestamp; }
}
+
+ // explicit interface implementations
+ EventType IEvent.Type => EventType.ConnectionCreated;
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Events/ConnectionFailedEvent.cs b/src/MongoDB.Driver.Core/Core/Events/ConnectionFailedEvent.cs
index 762fadfb912..00dfd5a902a 100644
--- a/src/MongoDB.Driver.Core/Core/Events/ConnectionFailedEvent.cs
+++ b/src/MongoDB.Driver.Core/Core/Events/ConnectionFailedEvent.cs
@@ -23,7 +23,7 @@ namespace MongoDB.Driver.Core.Events
///
/// Occurs when a connection fails.
///
- public struct ConnectionFailedEvent
+ public struct ConnectionFailedEvent : IEvent
{
private readonly ConnectionId _connectionId;
private readonly Exception _exception;
@@ -83,5 +83,8 @@ public DateTime Timestamp
{
get { return _timestamp; }
}
+
+ // explicit interface implementations
+ EventType IEvent.Type => EventType.ConnectionFailed;
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Events/ConnectionOpenedEvent.cs b/src/MongoDB.Driver.Core/Core/Events/ConnectionOpenedEvent.cs
index 6ab52aa5985..52c97aabd64 100644
--- a/src/MongoDB.Driver.Core/Core/Events/ConnectionOpenedEvent.cs
+++ b/src/MongoDB.Driver.Core/Core/Events/ConnectionOpenedEvent.cs
@@ -24,7 +24,7 @@ namespace MongoDB.Driver.Core.Events
///
/// Occurs after a connection is opened.
///
- public struct ConnectionOpenedEvent
+ public struct ConnectionOpenedEvent : IEvent
{
private readonly ConnectionId _connectionId;
private readonly ConnectionSettings _connectionSettings;
@@ -103,5 +103,8 @@ public DateTime Timestamp
{
get { return _timestamp; }
}
+
+ // explicit interface implementations
+ EventType IEvent.Type => EventType.ConnectionOpened;
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Events/ConnectionOpeningEvent.cs b/src/MongoDB.Driver.Core/Core/Events/ConnectionOpeningEvent.cs
index d179688f072..6df5adbe674 100644
--- a/src/MongoDB.Driver.Core/Core/Events/ConnectionOpeningEvent.cs
+++ b/src/MongoDB.Driver.Core/Core/Events/ConnectionOpeningEvent.cs
@@ -24,7 +24,7 @@ namespace MongoDB.Driver.Core.Events
///
/// Occurs before a connection is opened.
///
- public struct ConnectionOpeningEvent
+ public struct ConnectionOpeningEvent : IEvent
{
private readonly ConnectionId _connectionId;
private readonly ConnectionSettings _connectionSettings;
@@ -92,5 +92,8 @@ public DateTime Timestamp
{
get { return _timestamp; }
}
+
+ // explicit interface implementations
+ EventType IEvent.Type => EventType.ConnectionOpening;
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Events/ConnectionOpeningFailedEvent.cs b/src/MongoDB.Driver.Core/Core/Events/ConnectionOpeningFailedEvent.cs
index fa657045e36..0bbc921c28e 100644
--- a/src/MongoDB.Driver.Core/Core/Events/ConnectionOpeningFailedEvent.cs
+++ b/src/MongoDB.Driver.Core/Core/Events/ConnectionOpeningFailedEvent.cs
@@ -24,7 +24,7 @@ namespace MongoDB.Driver.Core.Events
///
/// Occurs when a connection fails to open.
///
- public struct ConnectionOpeningFailedEvent
+ public struct ConnectionOpeningFailedEvent : IEvent
{
private readonly ConnectionId _connectionId;
private readonly ConnectionSettings _connectionSettings;
@@ -103,5 +103,8 @@ public DateTime Timestamp
{
get { return _timestamp; }
}
+
+ // explicit interface implementations
+ EventType IEvent.Type => EventType.ConnectionOpeningFailed;
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolAddedConnectionEvent.cs b/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolAddedConnectionEvent.cs
index 053618e9be1..7119ef054dd 100644
--- a/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolAddedConnectionEvent.cs
+++ b/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolAddedConnectionEvent.cs
@@ -23,7 +23,7 @@ namespace MongoDB.Driver.Core.Events
///
/// Occurs after a connection is added to the pool.
///
- public struct ConnectionPoolAddedConnectionEvent
+ public struct ConnectionPoolAddedConnectionEvent : IEvent
{
private readonly ConnectionId _connectionId;
private readonly TimeSpan _duration;
@@ -91,5 +91,8 @@ public DateTime Timestamp
{
get { return _timestamp; }
}
+
+ // explicit interface implementations
+ EventType IEvent.Type => EventType.ConnectionPoolAddedConnection;
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolAddingConnectionEvent.cs b/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolAddingConnectionEvent.cs
index ce35f9ebad5..5736be28faa 100644
--- a/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolAddingConnectionEvent.cs
+++ b/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolAddingConnectionEvent.cs
@@ -22,7 +22,7 @@ namespace MongoDB.Driver.Core.Events
///
/// Occurs before a connection is added to the pool.
///
- public struct ConnectionPoolAddingConnectionEvent
+ public struct ConnectionPoolAddingConnectionEvent : IEvent
{
private readonly long? _operationId;
private readonly ServerId _serverId;
@@ -71,5 +71,8 @@ public DateTime Timestamp
{
get { return _timestamp; }
}
+
+ // explicit interface implementations
+ EventType IEvent.Type => EventType.ConnectionPoolAddingConnection;
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolCheckedInConnectionEvent.cs b/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolCheckedInConnectionEvent.cs
index 4fee6a901e8..19994e78fec 100644
--- a/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolCheckedInConnectionEvent.cs
+++ b/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolCheckedInConnectionEvent.cs
@@ -23,7 +23,7 @@ namespace MongoDB.Driver.Core.Events
///
/// Occurs after a connection is checked in to the pool.
///
- public struct ConnectionPoolCheckedInConnectionEvent
+ public struct ConnectionPoolCheckedInConnectionEvent : IEvent
{
private readonly ConnectionId _connectionId;
private readonly TimeSpan _duration;
@@ -91,5 +91,8 @@ public DateTime Timestamp
{
get { return _timestamp; }
}
+
+ // explicit interface implementations
+ EventType IEvent.Type => EventType.ConnectionPoolCheckedInConnection;
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolCheckedOutConnectionEvent.cs b/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolCheckedOutConnectionEvent.cs
index 925dcdc7b9b..e21236ccf72 100644
--- a/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolCheckedOutConnectionEvent.cs
+++ b/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolCheckedOutConnectionEvent.cs
@@ -23,7 +23,7 @@ namespace MongoDB.Driver.Core.Events
///
/// Occurs after a connection is checked out of the pool.
///
- public struct ConnectionPoolCheckedOutConnectionEvent
+ public struct ConnectionPoolCheckedOutConnectionEvent : IEvent
{
private readonly ConnectionId _connectionId;
private readonly TimeSpan _duration;
@@ -91,5 +91,8 @@ public DateTime Timestamp
{
get { return _timestamp; }
}
+
+ // explicit interface implementations
+ EventType IEvent.Type => EventType.ConnectionPoolCheckedOutConnection;
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolCheckingInConnectionEvent.cs b/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolCheckingInConnectionEvent.cs
index 3d88bb54a0f..b9237abbfd4 100644
--- a/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolCheckingInConnectionEvent.cs
+++ b/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolCheckingInConnectionEvent.cs
@@ -23,7 +23,7 @@ namespace MongoDB.Driver.Core.Events
///
/// Occurs before a connection is checked in to the pool.
///
- public struct ConnectionPoolCheckingInConnectionEvent
+ public struct ConnectionPoolCheckingInConnectionEvent : IEvent
{
private readonly ConnectionId _connectionId;
private readonly long? _operationId;
@@ -80,5 +80,8 @@ public DateTime Timestamp
{
get { return _timestamp; }
}
+
+ // explicit interface implementations
+ EventType IEvent.Type => EventType.ConnectionPoolCheckingInConnection;
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolCheckingOutConnectionEvent.cs b/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolCheckingOutConnectionEvent.cs
index 520bf76820e..381f27c2640 100644
--- a/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolCheckingOutConnectionEvent.cs
+++ b/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolCheckingOutConnectionEvent.cs
@@ -20,9 +20,9 @@
namespace MongoDB.Driver.Core.Events
{
///
- /// Occurs before a connection is checking out of the pool.
+ /// Occurs before a connection is checked out of the pool.
///
- public struct ConnectionPoolCheckingOutConnectionEvent
+ public struct ConnectionPoolCheckingOutConnectionEvent : IEvent
{
private readonly long? _operationId;
private readonly ServerId _serverId;
@@ -71,5 +71,8 @@ public DateTime Timestamp
{
get { return _timestamp; }
}
+
+ // explicit interface implementations
+ EventType IEvent.Type => EventType.ConnectionPoolCheckingOutConnection;
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolCheckingOutConnectionFailedEvent.cs b/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolCheckingOutConnectionFailedEvent.cs
index 7cedfaf7ce8..9f7cea41b44 100644
--- a/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolCheckingOutConnectionFailedEvent.cs
+++ b/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolCheckingOutConnectionFailedEvent.cs
@@ -22,7 +22,7 @@ namespace MongoDB.Driver.Core.Events
///
/// Occurs when a connection could not be checked out of the pool.
///
- public struct ConnectionPoolCheckingOutConnectionFailedEvent
+ public struct ConnectionPoolCheckingOutConnectionFailedEvent : IEvent
{
private readonly ConnectionCheckOutFailedReason _reason;
private readonly ServerId _serverId;
@@ -97,5 +97,8 @@ public DateTime Timestamp
{
get { return _timestamp; }
}
+
+ // explicit interface implementations
+ EventType IEvent.Type => EventType.ConnectionPoolCheckingOutConnectionFailed;
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolClearedEvent.cs b/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolClearedEvent.cs
index eda4749abd5..79cc2ab4069 100644
--- a/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolClearedEvent.cs
+++ b/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolClearedEvent.cs
@@ -25,7 +25,7 @@ namespace MongoDB.Driver.Core.Events
///
/// Occurs after the pool is cleared.
///
- public struct ConnectionPoolClearedEvent
+ public struct ConnectionPoolClearedEvent : IEvent
{
private readonly ConnectionPoolSettings _connectionPoolSettings;
private readonly ServerId _serverId;
@@ -95,5 +95,8 @@ public DateTime Timestamp
{
get { return _timestamp; }
}
+
+ // explicit interface implementations
+ EventType IEvent.Type => EventType.ConnectionPoolCleared;
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolClearingEvent.cs b/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolClearingEvent.cs
index 026ed59cd8f..e5638d401db 100644
--- a/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolClearingEvent.cs
+++ b/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolClearingEvent.cs
@@ -25,7 +25,7 @@ namespace MongoDB.Driver.Core.Events
///
/// Occurs when the pool is about to be cleared.
///
- public struct ConnectionPoolClearingEvent
+ public struct ConnectionPoolClearingEvent : IEvent
{
private readonly ConnectionPoolSettings _connectionPoolSettings;
private readonly ObjectId? _serviceId;
@@ -95,5 +95,8 @@ public DateTime Timestamp
{
get { return _timestamp; }
}
+
+ // explicit interface implementations
+ EventType IEvent.Type => EventType.ConnectionPoolClearing;
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolClosedEvent.cs b/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolClosedEvent.cs
index 5052fab7b9e..96757acd0b6 100644
--- a/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolClosedEvent.cs
+++ b/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolClosedEvent.cs
@@ -22,7 +22,7 @@ namespace MongoDB.Driver.Core.Events
///
/// Occurs after the pool is closed.
///
- public struct ConnectionPoolClosedEvent
+ public struct ConnectionPoolClosedEvent : IEvent
{
private readonly ServerId _serverId;
private readonly DateTime _timestamp;
@@ -60,5 +60,8 @@ public DateTime Timestamp
{
get { return _timestamp; }
}
+
+ // explicit interface implementations
+ EventType IEvent.Type => EventType.ConnectionPoolClosed;
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolClosingEvent.cs b/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolClosingEvent.cs
index 454ff7a722f..2ca0b5b8b2e 100644
--- a/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolClosingEvent.cs
+++ b/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolClosingEvent.cs
@@ -22,7 +22,7 @@ namespace MongoDB.Driver.Core.Events
///
/// Occurs before the pool is closed.
///
- public struct ConnectionPoolClosingEvent
+ public struct ConnectionPoolClosingEvent : IEvent
{
private readonly ServerId _serverId;
private readonly DateTime _timestamp;
@@ -60,5 +60,8 @@ public DateTime Timestamp
{
get { return _timestamp; }
}
+
+ // explicit interface implementations
+ EventType IEvent.Type => EventType.ConnectionPoolClosing;
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolOpenedEvent.cs b/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolOpenedEvent.cs
index c334e6282f9..5fbe76379f6 100644
--- a/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolOpenedEvent.cs
+++ b/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolOpenedEvent.cs
@@ -23,7 +23,7 @@ namespace MongoDB.Driver.Core.Events
///
/// Occurs after the pool is opened.
///
- public struct ConnectionPoolOpenedEvent
+ public struct ConnectionPoolOpenedEvent : IEvent
{
private readonly ConnectionPoolSettings _connectionPoolSettings;
private readonly ServerId _serverId;
@@ -72,5 +72,8 @@ public DateTime Timestamp
{
get { return _timestamp; }
}
+
+ // explicit interface implementations
+ EventType IEvent.Type => EventType.ConnectionPoolOpened;
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolOpeningEvent.cs b/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolOpeningEvent.cs
index 2b8ea3b8468..13e04ba7e39 100644
--- a/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolOpeningEvent.cs
+++ b/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolOpeningEvent.cs
@@ -23,7 +23,7 @@ namespace MongoDB.Driver.Core.Events
///
/// Occurs before the pool is opened.
///
- public struct ConnectionPoolOpeningEvent
+ public struct ConnectionPoolOpeningEvent : IEvent
{
private readonly ConnectionPoolSettings _connectionPoolSettings;
private readonly ServerId _serverId;
@@ -72,5 +72,8 @@ public DateTime Timestamp
{
get { return _timestamp; }
}
+
+ // explicit interface implementations
+ EventType IEvent.Type => EventType.ConnectionPoolOpening;
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolReadyEvent.cs b/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolReadyEvent.cs
index e51cb5f687d..dad9d2ce650 100644
--- a/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolReadyEvent.cs
+++ b/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolReadyEvent.cs
@@ -22,7 +22,7 @@ namespace MongoDB.Driver.Core.Events
///
/// Occurs after the pool is opened.
///
- public struct ConnectionPoolReadyEvent
+ public struct ConnectionPoolReadyEvent : IEvent
{
private readonly ServerId _serverId;
private readonly ConnectionPoolSettings _connectionPoolSettings;
@@ -61,5 +61,8 @@ public ServerId ServerId
{
get { return _serverId; }
}
+
+ // explicit interface implementations
+ EventType IEvent.Type => EventType.ConnectionPoolReady;
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolRemovedConnectionEvent.cs b/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolRemovedConnectionEvent.cs
index 7410413d31c..48378bac66f 100644
--- a/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolRemovedConnectionEvent.cs
+++ b/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolRemovedConnectionEvent.cs
@@ -23,7 +23,7 @@ namespace MongoDB.Driver.Core.Events
///
/// Occurs after a connection is removed from the pool.
///
- public struct ConnectionPoolRemovedConnectionEvent
+ public struct ConnectionPoolRemovedConnectionEvent : IEvent
{
private readonly ConnectionId _connectionId;
private readonly TimeSpan _duration;
@@ -91,5 +91,8 @@ public DateTime Timestamp
{
get { return _timestamp; }
}
+
+ // explicit interface implementations
+ EventType IEvent.Type => EventType.ConnectionPoolRemovedConnection;
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolRemovingConnectionEvent.cs b/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolRemovingConnectionEvent.cs
index cdd442f445a..a7dbeece38b 100644
--- a/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolRemovingConnectionEvent.cs
+++ b/src/MongoDB.Driver.Core/Core/Events/ConnectionPoolRemovingConnectionEvent.cs
@@ -23,7 +23,7 @@ namespace MongoDB.Driver.Core.Events
///
/// Occurs before a connection is removed from the pool.
///
- public struct ConnectionPoolRemovingConnectionEvent
+ public struct ConnectionPoolRemovingConnectionEvent : IEvent
{
private readonly ConnectionId _connectionId;
private readonly long? _operationId;
@@ -80,5 +80,8 @@ public DateTime Timestamp
{
get { return _timestamp; }
}
+
+ // explicit interface implementations
+ EventType IEvent.Type => EventType.ConnectionPoolRemovingConnection;
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Events/ConnectionReceivedMessageEvent.cs b/src/MongoDB.Driver.Core/Core/Events/ConnectionReceivedMessageEvent.cs
index b5b8689c392..7a342c6a740 100644
--- a/src/MongoDB.Driver.Core/Core/Events/ConnectionReceivedMessageEvent.cs
+++ b/src/MongoDB.Driver.Core/Core/Events/ConnectionReceivedMessageEvent.cs
@@ -23,7 +23,7 @@ namespace MongoDB.Driver.Core.Events
///
/// Occurs after a message is received.
///
- public struct ConnectionReceivedMessageEvent
+ public struct ConnectionReceivedMessageEvent : IEvent
{
private readonly ConnectionId _connectionId;
private readonly TimeSpan _deserializationDuration;
@@ -132,5 +132,8 @@ public DateTime Timestamp
{
get { return _timestamp; }
}
+
+ // explicit interface implementations
+ EventType IEvent.Type => EventType.ConnectionReceivedMessage;
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Events/ConnectionReceivingMessageEvent.cs b/src/MongoDB.Driver.Core/Core/Events/ConnectionReceivingMessageEvent.cs
index e0fd121c5ab..f3f986b17e7 100644
--- a/src/MongoDB.Driver.Core/Core/Events/ConnectionReceivingMessageEvent.cs
+++ b/src/MongoDB.Driver.Core/Core/Events/ConnectionReceivingMessageEvent.cs
@@ -23,7 +23,7 @@ namespace MongoDB.Driver.Core.Events
///
/// Occurs before a message is received.
///
- public struct ConnectionReceivingMessageEvent
+ public struct ConnectionReceivingMessageEvent : IEvent
{
private readonly ConnectionId _connectionId;
private readonly long? _operationId;
@@ -91,5 +91,8 @@ public DateTime Timestamp
{
get { return _timestamp; }
}
+
+ // explicit interface implementations
+ EventType IEvent.Type => EventType.ConnectionReceivingMessage;
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Events/ConnectionReceivingMessageFailedEvent.cs b/src/MongoDB.Driver.Core/Core/Events/ConnectionReceivingMessageFailedEvent.cs
index 97d7e322d8f..aac7061a1a0 100644
--- a/src/MongoDB.Driver.Core/Core/Events/ConnectionReceivingMessageFailedEvent.cs
+++ b/src/MongoDB.Driver.Core/Core/Events/ConnectionReceivingMessageFailedEvent.cs
@@ -23,7 +23,7 @@ namespace MongoDB.Driver.Core.Events
///
/// Occurs when a message was unable to be received.
///
- public struct ConnectionReceivingMessageFailedEvent
+ public struct ConnectionReceivingMessageFailedEvent : IEvent
{
private readonly ConnectionId _connectionId;
private readonly Exception _exception;
@@ -102,5 +102,8 @@ public DateTime Timestamp
{
get { return _timestamp; }
}
+
+ // explicit interface implementations
+ EventType IEvent.Type => EventType.ConnectionReceivingMessageFailed;
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Events/ConnectionSendingMessagesEvent.cs b/src/MongoDB.Driver.Core/Core/Events/ConnectionSendingMessagesEvent.cs
index 4d1d45a3927..1e80c9a8e66 100644
--- a/src/MongoDB.Driver.Core/Core/Events/ConnectionSendingMessagesEvent.cs
+++ b/src/MongoDB.Driver.Core/Core/Events/ConnectionSendingMessagesEvent.cs
@@ -24,7 +24,7 @@ namespace MongoDB.Driver.Core.Events
///
/// Occurs before a message is sent.
///
- public struct ConnectionSendingMessagesEvent
+ public struct ConnectionSendingMessagesEvent : IEvent
{
private readonly ConnectionId _connectionId;
private readonly long? _operationId;
@@ -92,5 +92,8 @@ public DateTime Timestamp
{
get { return _timestamp; }
}
+
+ // explicit interface implementations
+ EventType IEvent.Type => EventType.ConnectionSendingMessages;
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Events/ConnectionSendingMessagesFailedEvent.cs b/src/MongoDB.Driver.Core/Core/Events/ConnectionSendingMessagesFailedEvent.cs
index daa76ab32b2..2fb5aab05df 100644
--- a/src/MongoDB.Driver.Core/Core/Events/ConnectionSendingMessagesFailedEvent.cs
+++ b/src/MongoDB.Driver.Core/Core/Events/ConnectionSendingMessagesFailedEvent.cs
@@ -24,7 +24,7 @@ namespace MongoDB.Driver.Core.Events
///
/// Occurs when a message could not be sent.
///
- public struct ConnectionSendingMessagesFailedEvent
+ public struct ConnectionSendingMessagesFailedEvent : IEvent
{
private readonly ConnectionId _connectionId;
private readonly Exception _exception;
@@ -103,5 +103,8 @@ public DateTime Timestamp
{
get { return _timestamp; }
}
+
+ // explicit interface implementations
+ EventType IEvent.Type => EventType.ConnectionSendingMessagesFailed;
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Events/ConnectionSentMessagesEvent.cs b/src/MongoDB.Driver.Core/Core/Events/ConnectionSentMessagesEvent.cs
index 1cd7603bf60..a5e3608b9c9 100644
--- a/src/MongoDB.Driver.Core/Core/Events/ConnectionSentMessagesEvent.cs
+++ b/src/MongoDB.Driver.Core/Core/Events/ConnectionSentMessagesEvent.cs
@@ -24,7 +24,7 @@ namespace MongoDB.Driver.Core.Events
///
/// Occurs after a message has been sent.
///
- public struct ConnectionSentMessagesEvent
+ public struct ConnectionSentMessagesEvent : IEvent
{
private readonly ConnectionId _connectionId;
private readonly TimeSpan _networkDuration;
@@ -133,5 +133,8 @@ public DateTime Timestamp
{
get { return _timestamp; }
}
+
+ // explicit interface implementations
+ EventType IEvent.Type => EventType.ConnectionSentMessages;
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Events/Diagnostics/TraceSourceEventHelper.cs b/src/MongoDB.Driver.Core/Core/Events/Diagnostics/TraceSourceEventHelper.cs
index d85338080b2..406738c8b09 100644
--- a/src/MongoDB.Driver.Core/Core/Events/Diagnostics/TraceSourceEventHelper.cs
+++ b/src/MongoDB.Driver.Core/Core/Events/Diagnostics/TraceSourceEventHelper.cs
@@ -50,11 +50,11 @@ public static string Label(ClusterId clusterId)
public static string Format(ConnectionId id)
{
- if (id.ServerValue.HasValue)
+ if (id.LongServerValue.HasValue)
{
- return id.LocalValue.ToString() + "-" + id.ServerValue.Value.ToString();
+ return id.LongLocalValue.ToString() + "-" + id.LongServerValue.Value.ToString();
}
- return id.LocalValue.ToString();
+ return id.LongLocalValue.ToString();
}
public static string Format(ServerId serverId)
diff --git a/src/MongoDB.Driver.Core/Core/Events/EventPublisher.cs b/src/MongoDB.Driver.Core/Core/Events/EventPublisher.cs
new file mode 100644
index 00000000000..042bc15db07
--- /dev/null
+++ b/src/MongoDB.Driver.Core/Core/Events/EventPublisher.cs
@@ -0,0 +1,60 @@
+/* Copyright 2010-present MongoDB Inc.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+using System;
+using MongoDB.Driver.Core.Misc;
+
+namespace MongoDB.Driver.Core.Events
+{
+ internal sealed class EventPublisher
+ {
+ private static readonly Delegate __eventHandlerNull = new Action(() => { });
+ private static readonly int __eventTypesCount = Enum.GetValues(typeof(EventType)).Length;
+
+ private readonly Delegate[] _eventHandlers;
+ private readonly IEventSubscriber _eventSubscriber;
+
+ public EventPublisher(IEventSubscriber eventSubscriber)
+ {
+ _eventSubscriber = Ensure.IsNotNull(eventSubscriber, nameof(eventSubscriber));
+ _eventHandlers = new Delegate[__eventTypesCount];
+ }
+
+ public bool IsEventTracked() where TEvent : IEvent
+ {
+ _eventSubscriber.TryGetEventHandler(out var handler);
+ return handler != null;
+ }
+
+ public void Publish(TEvent @event) where TEvent : IEvent
+ {
+ var eventType = (int)@event.Type;
+ var eventHandler = _eventHandlers[eventType];
+
+ if (eventHandler == null)
+ {
+ _eventSubscriber.TryGetEventHandler(out var registeredHandler);
+ eventHandler = registeredHandler ?? __eventHandlerNull;
+ _eventHandlers[eventType] = eventHandler;
+ }
+
+ if (eventHandler != __eventHandlerNull)
+ {
+ var action = (Action)eventHandler;
+ action(@event);
+ }
+ }
+ }
+}
diff --git a/src/MongoDB.Driver.Core/Core/Events/EventType.cs b/src/MongoDB.Driver.Core/Core/Events/EventType.cs
new file mode 100644
index 00000000000..065dad8542a
--- /dev/null
+++ b/src/MongoDB.Driver.Core/Core/Events/EventType.cs
@@ -0,0 +1,74 @@
+/* Copyright 2010-present MongoDB Inc.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+namespace MongoDB.Driver.Core.Events
+{
+ internal enum EventType
+ {
+ ClusterAddedServer = 0,
+ ClusterAddingServer,
+ ClusterClosed,
+ ClusterClosing,
+ ClusterDescriptionChanged,
+ ClusterOpened,
+ ClusterOpening,
+ ClusterRemovedServer,
+ ClusterRemovingServer,
+ ClusterSelectedServer,
+ ClusterSelectingServer,
+ ClusterSelectingServerFailed,
+ CommandFailed,
+ CommandStarted,
+ CommandSucceeded,
+ ConnectionClosed,
+ ConnectionClosing,
+ ConnectionCreated,
+ ConnectionFailed,
+ ConnectionOpened,
+ ConnectionOpening,
+ ConnectionOpeningFailed,
+ ConnectionPoolAddedConnection,
+ ConnectionPoolAddingConnection,
+ ConnectionPoolCheckedInConnection,
+ ConnectionPoolCheckedOutConnection,
+ ConnectionPoolCheckingInConnection,
+ ConnectionPoolCheckingOutConnection,
+ ConnectionPoolCheckingOutConnectionFailed,
+ ConnectionPoolCleared,
+ ConnectionPoolClearing,
+ ConnectionPoolClosed,
+ ConnectionPoolClosing,
+ ConnectionPoolOpened,
+ ConnectionPoolOpening,
+ ConnectionPoolReady,
+ ConnectionPoolRemovedConnection,
+ ConnectionPoolRemovingConnection,
+ ConnectionReceivedMessage,
+ ConnectionReceivingMessage,
+ ConnectionReceivingMessageFailed,
+ ConnectionSendingMessages,
+ ConnectionSendingMessagesFailed,
+ ConnectionSentMessages,
+ SdamInformation,
+ ServerClosed,
+ ServerClosing,
+ ServerDescriptionChanged,
+ ServerHeartbeatFailed,
+ ServerHeartbeatStarted,
+ ServerHeartbeatSucceeded,
+ ServerOpened,
+ ServerOpening
+ }
+}
diff --git a/tests/MongoDB.Driver.Core.TestHelpers/Logging/ILoggerFactory.cs b/src/MongoDB.Driver.Core/Core/Events/IEvent.cs
similarity index 74%
rename from tests/MongoDB.Driver.Core.TestHelpers/Logging/ILoggerFactory.cs
rename to src/MongoDB.Driver.Core/Core/Events/IEvent.cs
index 4e457ed4f48..af3167dd312 100644
--- a/tests/MongoDB.Driver.Core.TestHelpers/Logging/ILoggerFactory.cs
+++ b/src/MongoDB.Driver.Core/Core/Events/IEvent.cs
@@ -1,4 +1,4 @@
-/* Copyright 2021-present MongoDB Inc.
+/* Copyright 2010-present MongoDB Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -13,10 +13,10 @@
* limitations under the License.
*/
-namespace MongoDB.Driver.Core.TestHelpers.Logging
+namespace MongoDB.Driver.Core.Events
{
- public interface ILoggerFactory
+ internal interface IEvent
{
- public ILogger CreateLogger();
+ public EventType Type { get; }
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Events/SdamInformationEvent.cs b/src/MongoDB.Driver.Core/Core/Events/SdamInformationEvent.cs
index 2e54678811c..7fd83fb11e7 100644
--- a/src/MongoDB.Driver.Core/Core/Events/SdamInformationEvent.cs
+++ b/src/MongoDB.Driver.Core/Core/Events/SdamInformationEvent.cs
@@ -14,46 +14,83 @@
*/
using System;
+using MongoDB.Driver.Core.Misc;
namespace MongoDB.Driver.Core.Events
{
///
- /// An informational event used for logging Server Discovery and Monitoring (SDAM) events.
+ /// An informational event used for logging Server Discovery and Monitoring (SDAM) events.
///
- public struct SdamInformationEvent
+ public struct SdamInformationEvent : IEvent
{
- private readonly Lazy _message;
+ private readonly object _arg0;
+ private readonly object[] _args;
+ private readonly int _argsCount;
+
+ private readonly string _messageFormat;
private readonly DateTime _timestamp;
+ private string _formattedMessage;
+
///
/// Initializes a new instance of the struct.
///
- /// Function that creates the message to log.
- public SdamInformationEvent(Func createMessage)
- : this(new Lazy(createMessage))
+ /// Message format.
+ /// Message argument.
+ public SdamInformationEvent(string messageFormat, object arg0) :
+ this(messageFormat, 1, arg0, null)
{
}
///
/// Initializes a new instance of the struct.
///
- /// The message to log.
- public SdamInformationEvent(Lazy message)
+ /// Message format.
+ /// Message arguments.
+ public SdamInformationEvent(string messageFormat, params object[] args) :
+ this(messageFormat, -1, null, args)
+ {
+ }
+
+ private SdamInformationEvent(string messageFormat, int argsCount, object arg0, params object[] args)
{
- _message = message;
+ _args = args;
+ _arg0 = arg0;
+ _argsCount = argsCount;
+ _messageFormat = Ensure.IsNotNull(messageFormat, nameof(messageFormat));
_timestamp = DateTime.UtcNow;
+ _formattedMessage = null;
}
///
/// Gets the message.
///
- public string Message => _message.Value;
+ public string Message
+ {
+ get
+ {
+ if (_formattedMessage == null)
+ {
+ _formattedMessage = _argsCount switch
+ {
+ -1 => string.Format(_messageFormat, _args),
+ 1 => string.Format(_messageFormat, _arg0),
+ _ => throw new InvalidOperationException($"Not supported argument count {_argsCount}")
+ };
+ }
+
+ return _formattedMessage;
+ }
+ }
///
/// Gets the timestamp.
///
public DateTime Timestamp => _timestamp;
+ // explicit interface implementations
+ EventType IEvent.Type => EventType.SdamInformation;
+
///
public override string ToString()
{
diff --git a/src/MongoDB.Driver.Core/Core/Events/ServerClosedEvent.cs b/src/MongoDB.Driver.Core/Core/Events/ServerClosedEvent.cs
index 0cf12c29bc5..d5bde2cfcd4 100644
--- a/src/MongoDB.Driver.Core/Core/Events/ServerClosedEvent.cs
+++ b/src/MongoDB.Driver.Core/Core/Events/ServerClosedEvent.cs
@@ -22,7 +22,7 @@ namespace MongoDB.Driver.Core.Events
///
/// Occurs after a server is closed.
///
- public struct ServerClosedEvent
+ public struct ServerClosedEvent : IEvent
{
private readonly ServerId _serverId;
private readonly TimeSpan _duration;
@@ -71,5 +71,8 @@ public DateTime Timestamp
{
get { return _timestamp; }
}
+
+ // explicit interface implementations
+ EventType IEvent.Type => EventType.ServerClosed;
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Events/ServerClosingEvent.cs b/src/MongoDB.Driver.Core/Core/Events/ServerClosingEvent.cs
index fa1a016d8a0..938ce6e12ae 100644
--- a/src/MongoDB.Driver.Core/Core/Events/ServerClosingEvent.cs
+++ b/src/MongoDB.Driver.Core/Core/Events/ServerClosingEvent.cs
@@ -22,7 +22,7 @@ namespace MongoDB.Driver.Core.Events
///
/// Occurs before a server is closed.
///
- public struct ServerClosingEvent
+ public struct ServerClosingEvent : IEvent
{
private readonly ServerId _serverId;
private readonly DateTime _timestamp;
@@ -60,5 +60,8 @@ public DateTime Timestamp
{
get { return _timestamp; }
}
+
+ // explicit interface implementations
+ EventType IEvent.Type => EventType.ServerClosing;
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Events/ServerDescriptionChangedEvent.cs b/src/MongoDB.Driver.Core/Core/Events/ServerDescriptionChangedEvent.cs
index 0be8d342972..3cccc301a1d 100644
--- a/src/MongoDB.Driver.Core/Core/Events/ServerDescriptionChangedEvent.cs
+++ b/src/MongoDB.Driver.Core/Core/Events/ServerDescriptionChangedEvent.cs
@@ -22,7 +22,7 @@ namespace MongoDB.Driver.Core.Events
///
/// Occurs after a server's description has changed.
///
- public struct ServerDescriptionChangedEvent
+ public struct ServerDescriptionChangedEvent : IEvent
{
private readonly ServerDescription _oldDescription;
private readonly ServerDescription _newDescription;
@@ -79,5 +79,8 @@ public DateTime Timestamp
{
get { return _timestamp; }
}
+
+ // explicit interface implementations
+ EventType IEvent.Type => EventType.ServerDescriptionChanged;
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Events/ServerHeartbeatFailedEvent.cs b/src/MongoDB.Driver.Core/Core/Events/ServerHeartbeatFailedEvent.cs
index 729ae402b59..cf468fb6c6f 100644
--- a/src/MongoDB.Driver.Core/Core/Events/ServerHeartbeatFailedEvent.cs
+++ b/src/MongoDB.Driver.Core/Core/Events/ServerHeartbeatFailedEvent.cs
@@ -23,7 +23,7 @@ namespace MongoDB.Driver.Core.Events
///
/// Occurs when a heartbeat failed.
///
- public struct ServerHeartbeatFailedEvent
+ public struct ServerHeartbeatFailedEvent : IEvent
{
private readonly bool _awaited;
private readonly ConnectionId _connectionId;
@@ -88,5 +88,8 @@ public DateTime Timestamp
{
get { return _timestamp; }
}
+
+ // explicit interface implementations
+ EventType IEvent.Type => EventType.ServerHeartbeatFailed;
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Events/ServerHeartbeatStartedEvent.cs b/src/MongoDB.Driver.Core/Core/Events/ServerHeartbeatStartedEvent.cs
index abc115ba76d..c6f08c9bd14 100644
--- a/src/MongoDB.Driver.Core/Core/Events/ServerHeartbeatStartedEvent.cs
+++ b/src/MongoDB.Driver.Core/Core/Events/ServerHeartbeatStartedEvent.cs
@@ -21,9 +21,9 @@
namespace MongoDB.Driver.Core.Events
{
///
- /// Occurs when a heartbeat succeeded.
+ /// Occurs before heartbeat is issued.
///
- public struct ServerHeartbeatStartedEvent
+ public struct ServerHeartbeatStartedEvent : IEvent
{
private readonly bool _awaited;
private readonly ConnectionId _connectionId;
@@ -77,5 +77,8 @@ public DateTime Timestamp
{
get { return _timestamp; }
}
+
+ // explicit interface implementations
+ EventType IEvent.Type => EventType.ServerHeartbeatStarted;
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Events/ServerHeartbeatSucceededEvent.cs b/src/MongoDB.Driver.Core/Core/Events/ServerHeartbeatSucceededEvent.cs
index 35e8c9b067b..f614bc86817 100644
--- a/src/MongoDB.Driver.Core/Core/Events/ServerHeartbeatSucceededEvent.cs
+++ b/src/MongoDB.Driver.Core/Core/Events/ServerHeartbeatSucceededEvent.cs
@@ -21,9 +21,9 @@
namespace MongoDB.Driver.Core.Events
{
///
- /// Occurs before heartbeat is issued.
+ /// Occurs when a heartbeat succeeded.
///
- public struct ServerHeartbeatSucceededEvent
+ public struct ServerHeartbeatSucceededEvent : IEvent
{
private readonly bool _awaited;
private readonly ConnectionId _connectionId;
@@ -88,5 +88,8 @@ public DateTime Timestamp
{
get { return _timestamp; }
}
+
+ // explicit interface implementations
+ EventType IEvent.Type => EventType.ServerHeartbeatSucceeded;
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Events/ServerOpenedEvent.cs b/src/MongoDB.Driver.Core/Core/Events/ServerOpenedEvent.cs
index f8db67c7252..8c2d9cd258f 100644
--- a/src/MongoDB.Driver.Core/Core/Events/ServerOpenedEvent.cs
+++ b/src/MongoDB.Driver.Core/Core/Events/ServerOpenedEvent.cs
@@ -23,7 +23,7 @@ namespace MongoDB.Driver.Core.Events
///
/// Occurs after a server is opened.
///
- public struct ServerOpenedEvent
+ public struct ServerOpenedEvent : IEvent
{
private readonly TimeSpan _duration;
private readonly ServerId _serverId;
@@ -83,5 +83,8 @@ public DateTime Timestamp
{
get { return _timestamp; }
}
+
+ // explicit interface implementations
+ EventType IEvent.Type => EventType.ServerOpened;
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Events/ServerOpeningEvent.cs b/src/MongoDB.Driver.Core/Core/Events/ServerOpeningEvent.cs
index 46ae01bb88b..83c62a99a37 100644
--- a/src/MongoDB.Driver.Core/Core/Events/ServerOpeningEvent.cs
+++ b/src/MongoDB.Driver.Core/Core/Events/ServerOpeningEvent.cs
@@ -23,7 +23,7 @@ namespace MongoDB.Driver.Core.Events
///
/// Occurs before a server is opened.
///
- public struct ServerOpeningEvent
+ public struct ServerOpeningEvent : IEvent
{
private readonly ServerId _serverId;
private readonly ServerSettings _serverSettings;
@@ -72,5 +72,8 @@ public DateTime Timestamp
{
get { return _timestamp; }
}
+
+ // explicit interface implementations
+ EventType IEvent.Type => EventType.ServerOpening;
}
}
diff --git a/src/MongoDB.Driver.Core/Core/NativeLibraryLoader/ILibraryLocator.cs b/src/MongoDB.Driver.Core/Core/Logging/EventLogFormattingOptions.cs
similarity index 60%
rename from src/MongoDB.Driver.Core/Core/NativeLibraryLoader/ILibraryLocator.cs
rename to src/MongoDB.Driver.Core/Core/Logging/EventLogFormattingOptions.cs
index 0ac8b7645f1..6a3a9a930ca 100644
--- a/src/MongoDB.Driver.Core/Core/NativeLibraryLoader/ILibraryLocator.cs
+++ b/src/MongoDB.Driver.Core/Core/Logging/EventLogFormattingOptions.cs
@@ -1,4 +1,4 @@
-/* Copyright 2019-present MongoDB Inc.
+/* Copyright 2010-present MongoDB Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -15,12 +15,15 @@
using MongoDB.Driver.Core.Misc;
-namespace MongoDB.Driver.Core.NativeLibraryLoader
+namespace MongoDB.Driver.Core.Logging
{
- internal interface ILibraryLocator
+ internal sealed class EventLogFormattingOptions
{
- bool IsX32ModeSupported { get; }
- string LibraryName { get; }
- string GetLibraryAbsolutePath(OperatingSystemPlatform currentPlatform);
+ public int MaxDocumentSize { get; }
+
+ public EventLogFormattingOptions(int maxCommandDocumentSize)
+ {
+ MaxDocumentSize = Ensure.IsGreaterThanOrEqualToZero(maxCommandDocumentSize, nameof(maxCommandDocumentSize));
+ }
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Logging/EventLogger.cs b/src/MongoDB.Driver.Core/Core/Logging/EventLogger.cs
new file mode 100644
index 00000000000..52ae6515259
--- /dev/null
+++ b/src/MongoDB.Driver.Core/Core/Logging/EventLogger.cs
@@ -0,0 +1,96 @@
+/* Copyright 2010-present MongoDB Inc.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+using System;
+using Microsoft.Extensions.Logging;
+using MongoDB.Driver.Core.Events;
+
+namespace MongoDB.Driver.Core.Logging
+{
+ internal sealed class EventLogger where T : LogCategories.EventCategory
+ {
+ private readonly EventPublisher _eventPublisher;
+ private readonly ILogger _logger;
+ private readonly EventLogFormattingOptions _eventLogFormattingOptions;
+
+ public static EventLogger Empty { get; } = new EventLogger(null, null);
+
+ public EventLogger(IEventSubscriber eventSubscriber, ILogger logger, EventLogFormattingOptions eventLogFormattingOptions = null)
+ {
+ _logger = logger;
+ _eventPublisher = eventSubscriber != null ? new EventPublisher(eventSubscriber) : null;
+ _eventLogFormattingOptions = eventLogFormattingOptions ?? new EventLogFormattingOptions(0);
+ }
+
+ public ILogger Logger => _logger;
+
+ public bool IsEventTracked() where TEvent : struct, IEvent =>
+ Logger?.IsEnabled(GetEventVerbosity()) == true ||
+ _eventPublisher?.IsEventTracked() == true;
+
+ private LogLevel GetEventVerbosity() where TEvent : struct, IEvent =>
+ StructuredLogTemplateProviders.GetTemplateProvider(new TEvent().Type).LogLevel;
+
+ public void LogAndPublish(TEvent @event, bool skipLogging = false) where TEvent : struct, IEvent
+ => LogAndPublish(null, @event, skipLogging);
+
+ public void LogAndPublish(Exception exception, TEvent @event, bool skipLogging = false) where TEvent : struct, IEvent
+ {
+ if (!skipLogging)
+ {
+ var eventTemplateProvider = StructuredLogTemplateProviders.GetTemplateProvider(@event.Type);
+
+ if (_logger?.IsEnabled(eventTemplateProvider.LogLevel) == true)
+ {
+ var @params = eventTemplateProvider.GetParams(@event, _eventLogFormattingOptions);
+ var template = eventTemplateProvider.GetTemplate(@event);
+
+ Log(eventTemplateProvider.LogLevel, template, exception, @params);
+ }
+ }
+
+ _eventPublisher?.Publish(@event);
+ }
+
+ public void LogAndPublish(TEvent @event, TArg arg) where TEvent : struct, IEvent
+ {
+ var eventTemplateProvider = StructuredLogTemplateProviders.GetTemplateProvider(@event.Type);
+
+ if (_logger?.IsEnabled(eventTemplateProvider.LogLevel) == true)
+ {
+ var @params = eventTemplateProvider.GetParams(@event, _eventLogFormattingOptions, arg);
+ var template = eventTemplateProvider.GetTemplate(@event);
+
+ Log(eventTemplateProvider.LogLevel, template, exception: null, @params);
+ }
+
+ _eventPublisher?.Publish(@event);
+ }
+
+ private void Log(LogLevel logLevel, string template, Exception exception, object[] @params)
+ {
+ switch (logLevel)
+ {
+ case LogLevel.Trace: _logger.LogTrace(exception, template, @params); break;
+ case LogLevel.Debug: _logger.LogDebug(exception, template, @params); break;
+ case LogLevel.Information: _logger.LogInformation(exception, template, @params); break;
+ case LogLevel.Warning: _logger.LogWarning(exception, template, @params); break;
+ case LogLevel.Error: _logger.LogError(exception, template, @params); break;
+ case LogLevel.Critical: _logger.LogCritical(exception, template, @params); break;
+ default: throw new ArgumentOutOfRangeException(nameof(logLevel), logLevel, "Unsupported log level.");
+ }
+ }
+ }
+}
diff --git a/src/MongoDB.Driver.Core/Core/Logging/LogCategories.cs b/src/MongoDB.Driver.Core/Core/Logging/LogCategories.cs
new file mode 100644
index 00000000000..2647d6ed5d4
--- /dev/null
+++ b/src/MongoDB.Driver.Core/Core/Logging/LogCategories.cs
@@ -0,0 +1,30 @@
+/* Copyright 2010-present MongoDB Inc.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+namespace MongoDB.Driver.Core.Logging
+{
+ internal static class LogCategories
+ {
+ public abstract class EventCategory { }
+
+ public sealed class Command : EventCategory { }
+
+ public sealed class Connection : EventCategory { }
+
+ public sealed class SDAM : EventCategory { }
+
+ public sealed class ServerSelection : EventCategory { }
+ }
+}
diff --git a/src/MongoDB.Driver.Core/Core/Logging/LogCategoryHelper.cs b/src/MongoDB.Driver.Core/Core/Logging/LogCategoryHelper.cs
new file mode 100644
index 00000000000..e24e960713f
--- /dev/null
+++ b/src/MongoDB.Driver.Core/Core/Logging/LogCategoryHelper.cs
@@ -0,0 +1,86 @@
+/* Copyright 2010-present MongoDB Inc.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+using System;
+using System.Collections.Concurrent;
+using System.Collections.Generic;
+using System.Linq;
+using MongoDB.Driver.Core.Misc;
+
+namespace MongoDB.Driver.Core.Logging
+{
+ internal static class LogCategoryHelper
+ {
+ private static readonly IDictionary __catergories = new ConcurrentDictionary();
+
+ private static readonly string[] __driverNamespaces = new []
+ {
+ "MongoDB.Bson",
+ "MongoDB.Driver",
+ "MongoDB.Driver.Core"
+ };
+
+ private static readonly string[] __driverTestsNamespaces = new[]
+ {
+ "MongoDB.Bson.Tests",
+ "MongoDB.Bson.TestHelpers",
+ "MongoDB.Driver.Tests",
+ "MongoDB.Driver.TestHelpers",
+ "MongoDB.Driver.Core.Tests",
+ "MongoDB.Driver.Core.TestHelpers"
+ };
+
+ private static readonly string __specCategoryPrefix = typeof(LogCategories).FullName;
+
+ private const string PrefixSpec = "MongoDB";
+ private const string PrefixInternal = "MongoDB.Internal";
+ private const string PrefixTests = "MongoDB.Tests";
+
+ public static string DecorateCategoryName(string categoryName)
+ {
+ Ensure.IsNotNullOrEmpty(categoryName, nameof(categoryName));
+
+ var prefixOverride = categoryName switch
+ {
+ _ when categoryName.StartsWith(__specCategoryPrefix) => PrefixSpec,
+ _ when __driverTestsNamespaces.Any(n => categoryName.StartsWith(n)) => PrefixTests,
+ _ when __driverNamespaces.Any(n => categoryName.StartsWith(n)) => PrefixInternal,
+ _ => null,
+ };
+
+ var result = categoryName;
+
+ if (prefixOverride != null)
+ {
+ var pathComponents = categoryName.Split('.');
+ result = $"{prefixOverride}.{pathComponents.Last()}";
+ }
+
+ return result;
+ }
+
+ public static string GetCategoryName() where T : LogCategories.EventCategory
+ {
+ var type = typeof(T);
+ if (!__catergories.TryGetValue(type, out var result))
+ {
+ result = DecorateCategoryName(type.FullName.Replace('+', '.'));
+ __catergories.Add(type, result);
+ }
+
+ return result;
+ }
+ }
+}
diff --git a/src/MongoDB.Driver.Core/Core/Logging/LoggerExtensions.cs b/src/MongoDB.Driver.Core/Core/Logging/LoggerExtensions.cs
new file mode 100644
index 00000000000..53ec7a56644
--- /dev/null
+++ b/src/MongoDB.Driver.Core/Core/Logging/LoggerExtensions.cs
@@ -0,0 +1,66 @@
+/* Copyright 2010-present MongoDB Inc.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+using Microsoft.Extensions.Logging;
+using MongoDB.Driver.Core.Clusters;
+using MongoDB.Driver.Core.Events;
+using MongoDB.Driver.Core.Servers;
+using static MongoDB.Driver.Core.Logging.StructuredLogTemplateProviders;
+
+namespace MongoDB.Driver.Core.Logging
+{
+ internal static class LoggerExtensions
+ {
+ public static EventLogger ToEventLogger(this ILogger logger, IEventSubscriber eventSubscriber)
+ where T : LogCategories.EventCategory =>
+ new EventLogger(eventSubscriber, logger);
+
+ public static EventLogger ToEventLogger(this IEventSubscriber eventSubscriber)
+ where T : LogCategories.EventCategory =>
+ new EventLogger(eventSubscriber, null);
+
+ public static void LogDebug(this ILogger logger, ClusterId clusterId, string message)
+ {
+ if (logger.IsEnabled(LogLevel.Debug))
+ {
+ logger.LogDebug(ClusterId_Message, GetParams(clusterId, message));
+ }
+ }
+
+ public static void LogDebug(this ILogger logger, string format, ClusterId clusterId, string message, object arg1)
+ {
+ if (logger.IsEnabled(LogLevel.Debug))
+ {
+ logger.LogDebug(format, GetParams(clusterId, message, arg1));
+ }
+ }
+
+ public static void LogDebug(this ILogger logger, ServerId serverId, string message)
+ {
+ if (logger.IsEnabled(LogLevel.Debug))
+ {
+ logger.LogDebug(ServerId_Message, GetParams(serverId, message));
+ }
+ }
+
+ public static void LogDebug(this ILogger logger, string format, ServerId serverId, string message, object arg1)
+ {
+ if (logger.IsEnabled(LogLevel.Debug))
+ {
+ logger.LogDebug(format, GetParams(serverId, message, arg1));
+ }
+ }
+ }
+}
diff --git a/src/MongoDB.Driver.Core/Core/Logging/LoggerFactoryCategoryDecorator.cs b/src/MongoDB.Driver.Core/Core/Logging/LoggerFactoryCategoryDecorator.cs
new file mode 100644
index 00000000000..33e88f56732
--- /dev/null
+++ b/src/MongoDB.Driver.Core/Core/Logging/LoggerFactoryCategoryDecorator.cs
@@ -0,0 +1,42 @@
+/* Copyright 2010-present MongoDB Inc.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+using Microsoft.Extensions.Logging;
+using MongoDB.Driver.Core.Configuration;
+using MongoDB.Driver.Core.Misc;
+
+namespace MongoDB.Driver.Core.Logging
+{
+ internal sealed class LoggerFactoryCategoryDecorator : ILoggerFactory
+ {
+ private readonly ILoggerFactory _loggerFactory;
+ private readonly LoggingSettings _loggingSettings;
+
+ public LoggerFactoryCategoryDecorator(ILoggerFactory loggerFactory, LoggingSettings loggingSettings)
+ {
+ _loggerFactory = Ensure.IsNotNull(loggerFactory, nameof(loggerFactory));
+ _loggingSettings = Ensure.IsNotNull(loggingSettings, nameof(loggingSettings));
+ }
+
+ public LoggingSettings LoggingSettings => _loggingSettings;
+
+ public void AddProvider(ILoggerProvider provider) => _loggerFactory.AddProvider(provider);
+
+ public ILogger CreateLogger(string categoryName) =>
+ _loggerFactory.CreateLogger(LogCategoryHelper.DecorateCategoryName(categoryName));
+
+ public void Dispose() => _loggerFactory.Dispose();
+ }
+}
diff --git a/src/MongoDB.Driver.Core/Core/Logging/LoggerFactoryExtensions.cs b/src/MongoDB.Driver.Core/Core/Logging/LoggerFactoryExtensions.cs
new file mode 100644
index 00000000000..14ac08dfbe4
--- /dev/null
+++ b/src/MongoDB.Driver.Core/Core/Logging/LoggerFactoryExtensions.cs
@@ -0,0 +1,32 @@
+/* Copyright 2010-present MongoDB Inc.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+using Microsoft.Extensions.Logging;
+using MongoDB.Driver.Core.Events;
+
+namespace MongoDB.Driver.Core.Logging
+{
+ internal static class LoggerFactoryExtensions
+ {
+ public static EventLogger CreateEventLogger(this ILoggerFactory loggerFactory, IEventSubscriber eventSubscriber)
+ where T : LogCategories.EventCategory
+ {
+ var loggingSettings = (loggerFactory as LoggerFactoryCategoryDecorator)?.LoggingSettings;
+ var eventLogFormattingOptions = loggingSettings != null ? new EventLogFormattingOptions(loggingSettings.MaxDocumentSize) : null;
+
+ return new EventLogger(eventSubscriber, loggerFactory?.CreateLogger(), eventLogFormattingOptions);
+ }
+ }
+}
diff --git a/src/MongoDB.Driver.Core/Core/Logging/LoggingSettingsExtensions.cs b/src/MongoDB.Driver.Core/Core/Logging/LoggingSettingsExtensions.cs
new file mode 100644
index 00000000000..43fcf34816c
--- /dev/null
+++ b/src/MongoDB.Driver.Core/Core/Logging/LoggingSettingsExtensions.cs
@@ -0,0 +1,37 @@
+/* Copyright 2010-present MongoDB Inc.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+using Microsoft.Extensions.Logging;
+using MongoDB.Driver.Core.Configuration;
+
+namespace MongoDB.Driver.Core.Logging
+{
+ internal static class LoggingSettingsExtensions
+ {
+ public static ILoggerFactory ToInternalLoggerFactory(this LoggingSettings loggingSettings) =>
+ loggingSettings?.LoggerFactory switch
+ {
+ _ when loggingSettings?.LoggerFactory != null => new LoggerFactoryCategoryDecorator(loggingSettings.LoggerFactory, loggingSettings),
+ _ => null
+ };
+
+ public static ILogger CreateLogger(this LoggingSettings loggingSettings) =>
+ loggingSettings?.LoggerFactory switch
+ {
+ _ when loggingSettings?.LoggerFactory != null => new LoggerFactoryCategoryDecorator(loggingSettings.LoggerFactory, loggingSettings).CreateLogger(),
+ _ => null
+ };
+ }
+}
diff --git a/src/MongoDB.Driver.Core/Core/Logging/StructuredLogTemplateProviders.cs b/src/MongoDB.Driver.Core/Core/Logging/StructuredLogTemplateProviders.cs
new file mode 100644
index 00000000000..371e0ee63c2
--- /dev/null
+++ b/src/MongoDB.Driver.Core/Core/Logging/StructuredLogTemplateProviders.cs
@@ -0,0 +1,229 @@
+/* Copyright 2010-present MongoDB Inc.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+using System;
+using System.Linq;
+using System.Net;
+using Microsoft.Extensions.Logging;
+using MongoDB.Driver.Core.Clusters;
+using MongoDB.Driver.Core.Connections;
+using MongoDB.Driver.Core.Events;
+using MongoDB.Driver.Core.Misc;
+using MongoDB.Driver.Core.Servers;
+
+namespace MongoDB.Driver.Core.Logging
+{
+ internal static partial class StructuredLogTemplateProviders
+ {
+ public const string ClusterId = nameof(ClusterId);
+ public const string Command = nameof(Command);
+ public const string CommandName = nameof(CommandName);
+ public const string DatabaseName = nameof(DatabaseName);
+ public const string Description = nameof(Description);
+ public const string DriverConnectionId = nameof(DriverConnectionId);
+ public const string DurationMS = nameof(DurationMS);
+ public const string Failure = nameof(Failure);
+ public const string Error = nameof(Error);
+ public const string MaxConnecting = nameof(MaxConnecting);
+ public const string MaxIdleTimeMS = nameof(MaxIdleTimeMS);
+ public const string MaxPoolSize = nameof(MaxPoolSize);
+ public const string Message = nameof(Message);
+ public const string MinPoolSize = nameof(MinPoolSize);
+ public const string OperationId = nameof(OperationId);
+ public const string RequestId = nameof(RequestId);
+ public const string Reply = nameof(Reply);
+ public const string Reason = nameof(Reason);
+ public const string ServerHost = nameof(ServerHost);
+ public const string ServerPort = nameof(ServerPort);
+ public const string ServerConnectionId = nameof(ServerConnectionId);
+ public const string ServiceId = nameof(ServiceId);
+ public const string SharedLibraryVersion = nameof(SharedLibraryVersion);
+ public const string WaitQueueTimeoutMS = nameof(WaitQueueTimeoutMS);
+ public const string WaitQueueSize = nameof(WaitQueueSize);
+
+ public const string ClusterId_Message = $"{{{ClusterId}}} {{{Message}}}";
+ public const string DriverConnectionId_Message = $"{{{DriverConnectionId}}} {{{Message}}}";
+ public const string ServerId_Message = $"{{{ClusterId}}} {{{ServerHost}}} {{{ServerPort}}} {{{Message}}}";
+ public const string ServerId_Message_Description = $"{{{ClusterId}}} {{{ServerHost}}} {{{ServerPort}}} {{{Message}}} {{{Description}}}";
+ public const string ClusterId_Message_SharedLibraryVersion = $"{{{ClusterId}}} {{{Message}}} {{{SharedLibraryVersion}}}";
+
+ private readonly static LogTemplateProvider[] __eventTemplateProviders;
+
+ static StructuredLogTemplateProviders()
+ {
+ var eventTypesCount = Enum.GetValues(typeof(EventType)).Length;
+ __eventTemplateProviders = new LogTemplateProvider[eventTypesCount];
+
+ AddClusterTemplates();
+ AddCmapTemplates();
+ AddCommandTemplates();
+ AddConnectionTemplates();
+ AddSdamTemplates();
+ }
+
+ public static LogTemplateProvider GetTemplateProvider(EventType eventType) => __eventTemplateProviders[(int)eventType];
+
+ public static object[] GetParams(ClusterId clusterId, object arg1)
+ {
+ return new object[] { clusterId.Value, arg1 };
+ }
+
+ public static object[] GetParams(ClusterId clusterId, object arg1, object arg2)
+ {
+ return new object[] { clusterId.Value, arg1, arg2 };
+ }
+
+ public static object[] GetParams(ClusterId clusterId, EndPoint endPoint, object arg1)
+ {
+ var (host, port) = endPoint.GetHostAndPort();
+
+ return new object[] { clusterId.Value, host, port, arg1 };
+ }
+
+ public static object[] GetParams(ServerId serverId, object arg1)
+ {
+ var (host, port) = serverId.EndPoint.GetHostAndPort();
+
+ return new object[] { serverId.ClusterId.Value, host, port, arg1 };
+ }
+
+ public static object[] GetParams(ServerId serverId, object arg1, object arg2)
+ {
+ var (host, port) = serverId.EndPoint.GetHostAndPort();
+
+ return new object[] { serverId.ClusterId.Value, host, port, arg1, arg2 };
+ }
+
+ public static object[] GetParams(ServerId serverId, object arg1, object arg2, object arg3)
+ {
+ var (host, port) = serverId.EndPoint.GetHostAndPort();
+
+ return new object[] { serverId.ClusterId.Value, host, port, arg1, arg2, arg3 };
+ }
+
+ public static object[] GetParams(ServerId serverId, object arg1, object arg2, object arg3, object arg4, object arg5, object arg6)
+ {
+ var (host, port) = serverId.EndPoint.GetHostAndPort();
+
+ return new object[] { serverId.ClusterId.Value, host, port, arg1, arg2, arg3, arg4, arg5, arg6 };
+ }
+
+ public static object[] GetParams(ServerId serverId, object arg1, object arg2, object arg3, object arg4, object arg5, object arg6, object arg7)
+ {
+ var (host, port) = serverId.EndPoint.GetHostAndPort();
+
+ return new object[] { serverId.ClusterId.Value, host, port, arg1, arg2, arg3, arg4, arg5, arg6, arg7 };
+ }
+
+ public static object[] GetParams(ConnectionId connectionId, object arg1)
+ {
+ var (host, port) = connectionId.ServerId.EndPoint.GetHostAndPort();
+
+ return new object[] { connectionId.ServerId.ClusterId.Value, connectionId.LongLocalValue, host, port, arg1};
+ }
+
+ public static object[] GetParams(ConnectionId connectionId, object arg1, object arg2)
+ {
+ var (host, port) = connectionId.ServerId.EndPoint.GetHostAndPort();
+
+ return new object[] { connectionId.ServerId.ClusterId.Value, connectionId.LongLocalValue, host, port, arg1, arg2 };
+ }
+
+ public static object[] GetParamsOmitNull(ConnectionId connectionId, object arg1, object arg2, object arg3, object arg4, object arg5, object arg6, object arg7, object ommitableParam)
+ {
+ var (host, port) = connectionId.ServerId.EndPoint.GetHostAndPort();
+
+ if (ommitableParam == null)
+ return new object[] { connectionId.ServerId.ClusterId.Value, connectionId.LongLocalValue, host, port, arg1, arg2, arg3, arg4, arg5, arg6, arg7, };
+ else
+ return new object[] { connectionId.ServerId.ClusterId.Value, connectionId.LongLocalValue, host, port, arg1, arg2, arg3, arg4, arg5, arg6, arg7, ommitableParam };
+ }
+
+ private static void AddTemplateProvider(LogLevel logLevel, string template, Func extractor) where TEvent : struct, IEvent =>
+ AddTemplateProvider(new LogTemplateProvider(
+ logLevel,
+ new[] { template },
+ extractor));
+
+ private static void AddTemplateProvider(LogLevel logLevel, string[] templates, Func extractor, Func templateExtractor) where TEvent : struct, IEvent =>
+ AddTemplateProvider(new LogTemplateProvider(
+ logLevel,
+ templates,
+ extractor,
+ templateExtractor));
+
+ private static void AddTemplate(LogLevel logLevel, string template, Func extractor) where TEvent : struct, IEvent =>
+ AddTemplateProvider(new LogTemplateProvider(
+ logLevel,
+ new[] { template },
+ extractor));
+
+ private static void AddTemplateProvider(LogTemplateProvider templateProvider) where TEvent : struct, IEvent
+ {
+ var index = (int)(new TEvent().Type);
+
+ if (__eventTemplateProviders[index] != null)
+ {
+ throw new InvalidOperationException($"Template already registered for {typeof(TEvent)} event.");
+ }
+
+ __eventTemplateProviders[index] = templateProvider;
+ }
+
+ private static string Concat(params string[] parameters) =>
+ string.Join(" ", parameters.Select(p => $"{{{p}}}"));
+
+ private static string Concat(string[] parameters, params string[] additionalParameters) =>
+ string.Join(" ", parameters.Concat(additionalParameters).Select(p => $"{{{p}}}"));
+
+ private static string FormatException(Exception exception, EventLogFormattingOptions eventLogFormattingOptions)
+ {
+ if (exception == null)
+ {
+ return null;
+ }
+
+ return TruncateIfNeeded(exception.ToString(), eventLogFormattingOptions.MaxDocumentSize);
+ }
+
+ private static string TruncateIfNeeded(string str, int length) =>
+ str.Length > length ? str.Substring(0, length) + "..." : str;
+
+ internal sealed class LogTemplateProvider
+ {
+ public LogLevel LogLevel { get; }
+ public string[] Templates { get; }
+ public Delegate ParametersExtractor { get; }
+ public Delegate TemplateExtractor { get; }
+
+ public LogTemplateProvider(LogLevel logLevel, string[] templates, Delegate parametersExtractor, Delegate templateExtractor = null)
+ {
+ LogLevel = logLevel;
+ Templates = templates;
+ ParametersExtractor = parametersExtractor;
+ TemplateExtractor = templateExtractor;
+ }
+
+ public string GetTemplate(TEvent @event) where TEvent : struct, IEvent =>
+ TemplateExtractor != null ? ((Func)TemplateExtractor)(@event, this) : Templates.First();
+
+ public object[] GetParams(TEvent @event, EventLogFormattingOptions eventLogFormattingOptions) where TEvent : struct, IEvent =>
+ (ParametersExtractor as Func)(@event, eventLogFormattingOptions);
+
+ public object[] GetParams(TEvent @event, EventLogFormattingOptions eventLogFormattingOptions, TArg arg) where TEvent : struct, IEvent =>
+ (ParametersExtractor as Func)(@event, eventLogFormattingOptions, arg);
+ }
+ }
+}
diff --git a/src/MongoDB.Driver.Core/Core/Logging/StructuredLogTemplateProvidersCluster.cs b/src/MongoDB.Driver.Core/Core/Logging/StructuredLogTemplateProvidersCluster.cs
new file mode 100644
index 00000000000..395acc9f3ab
--- /dev/null
+++ b/src/MongoDB.Driver.Core/Core/Logging/StructuredLogTemplateProvidersCluster.cs
@@ -0,0 +1,94 @@
+/* Copyright 2010-present MongoDB Inc.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+using Microsoft.Extensions.Logging;
+using MongoDB.Driver.Core.Events;
+
+namespace MongoDB.Driver.Core.Logging
+{
+ internal static partial class StructuredLogTemplateProviders
+ {
+ private static string[] __clusterCommonParams = new[]
+ {
+ ClusterId,
+ Message,
+ };
+
+ private static string ClusterCommonParams(params string[] @params) => Concat(__clusterCommonParams, @params);
+
+ private static void AddClusterTemplates()
+ {
+ AddTemplateProvider(
+ LogLevel.Debug,
+ ClusterCommonParams(),
+ (e, _) => GetParams(e.ClusterId, "Description changed"));
+
+ AddTemplateProvider(
+ LogLevel.Debug,
+ ClusterCommonParams(),
+ (e, _) => GetParams(e.ClusterId, "Selecting server"));
+
+ AddTemplateProvider(
+ LogLevel.Debug,
+ ClusterCommonParams(),
+ (e, _) => GetParams(e.ClusterId, "Selected server"));
+
+ AddTemplateProvider(
+ LogLevel.Debug,
+ ClusterCommonParams(),
+ (e, _) => GetParams(e.ClusterId, "Selecting server failed"));
+
+ AddTemplateProvider(
+ LogLevel.Debug,
+ ClusterCommonParams(),
+ (e, _) => GetParams(e.ClusterId, "Cluster closing"));
+
+ AddTemplateProvider(
+ LogLevel.Debug,
+ ClusterCommonParams(),
+ (e, _) => GetParams(e.ClusterId, "Cluster closed"));
+
+ AddTemplateProvider(
+ LogLevel.Debug,
+ ClusterCommonParams(),
+ (e, _) => GetParams(e.ClusterId, "Cluster opening"));
+
+ AddTemplateProvider(
+ LogLevel.Debug,
+ ClusterCommonParams(),
+ (e, _) => GetParams(e.ClusterId, "Cluster opened"));
+
+ AddTemplateProvider(
+ LogLevel.Debug,
+ CmapCommonParams(),
+ (e, _) => GetParams(e.ClusterId, e.EndPoint, "Adding server"));
+
+ AddTemplateProvider(
+ LogLevel.Debug,
+ CmapCommonParams(),
+ (e, _) => GetParams(e.ServerId, "Added server"));
+
+ AddTemplateProvider(
+ LogLevel.Debug,
+ CmapCommonParams(),
+ (e, _) => GetParams(e.ServerId, "Removing server"));
+
+ AddTemplateProvider(
+ LogLevel.Debug,
+ CmapCommonParams(),
+ (e, _) => GetParams(e.ServerId, "Removed server"));
+ }
+ }
+}
diff --git a/src/MongoDB.Driver.Core/Core/Logging/StructuredLogTemplateProvidersCmap.cs b/src/MongoDB.Driver.Core/Core/Logging/StructuredLogTemplateProvidersCmap.cs
new file mode 100644
index 00000000000..4b9ac28fedc
--- /dev/null
+++ b/src/MongoDB.Driver.Core/Core/Logging/StructuredLogTemplateProvidersCmap.cs
@@ -0,0 +1,144 @@
+/* Copyright 2010-present MongoDB Inc.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+using Microsoft.Extensions.Logging;
+using MongoDB.Driver.Core.Configuration;
+using MongoDB.Driver.Core.Events;
+
+namespace MongoDB.Driver.Core.Logging
+{
+ internal static partial class StructuredLogTemplateProviders
+ {
+ private static string[] __cmapCommonParams = new[]
+ {
+ ClusterId,
+ ServerHost,
+ ServerPort,
+ Message,
+ };
+
+ private static string CmapCommonParams(params string[] @params) => Concat(__cmapCommonParams, @params);
+
+ private static void AddCmapTemplates()
+ {
+ AddTemplateProvider(
+ LogLevel.Debug,
+ CmapCommonParams(),
+ (e, _) => GetParams(e.ServerId, "Connection adding"));
+
+ AddTemplateProvider(
+ LogLevel.Debug,
+ ConnectionCommonParams(),
+ (e, _) => GetParams(e.ConnectionId, "Connection checking in"));
+
+ AddTemplateProvider(
+ LogLevel.Debug,
+ ConnectionCommonParams(),
+ (e, _) => GetParams(e.ConnectionId, "Connection checked in"));
+
+ AddTemplateProvider(
+ LogLevel.Debug,
+ CmapCommonParams(),
+ (e, _) => GetParams(e.ServerId, "Connection checkout started"));
+
+ AddTemplateProvider(
+ LogLevel.Debug,
+ ConnectionCommonParams(),
+ (e, _) => GetParams(e.ConnectionId, "Connection checked out"));
+
+ AddTemplateProvider(
+ LogLevel.Debug,
+ CmapCommonParams(Reason, Error),
+ (e, o) => GetParams(
+ e.ServerId,
+ "Connection checkout failed",
+ GetCheckoutFailedReason(e.Reason),
+ FormatException(e.Exception, o)));
+
+ AddTemplateProvider(
+ LogLevel.Debug,
+ CmapCommonParams(),
+ (e, _) => GetParams(e.ServerId, "Connection removing"));
+
+ AddTemplateProvider(
+ LogLevel.Debug,
+ CmapCommonParams(),
+ (e, _) => GetParams(e.ServerId, "Connection removed"));
+
+#pragma warning disable CS0618 // Type or member is obsolete
+ AddTemplate(
+ LogLevel.Debug,
+ CmapCommonParams(MaxIdleTimeMS, MinPoolSize, MaxPoolSize, MaxConnecting, WaitQueueTimeoutMS, WaitQueueSize),
+ (e, _, s) => GetParams(
+ e.ServerId,
+ "Connection pool opening",
+ s.MaxIdleTime.TotalMilliseconds,
+ e.ConnectionPoolSettings.MinConnections,
+ e.ConnectionPoolSettings.MaxConnections,
+ e.ConnectionPoolSettings.MaxConnecting,
+ e.ConnectionPoolSettings.WaitQueueTimeout.TotalMilliseconds,
+ e.ConnectionPoolSettings.WaitQueueSize));
+
+ AddTemplate(
+ LogLevel.Debug,
+ CmapCommonParams(MaxIdleTimeMS, MinPoolSize, MaxPoolSize, MaxConnecting, WaitQueueTimeoutMS, WaitQueueSize),
+ (e, _, s) => GetParams(
+ e.ServerId,
+ "Connection pool created",
+ s.MaxIdleTime.TotalMilliseconds,
+ e.ConnectionPoolSettings.MinConnections,
+ e.ConnectionPoolSettings.MaxConnections,
+ e.ConnectionPoolSettings.MaxConnecting,
+ e.ConnectionPoolSettings.WaitQueueTimeout.TotalMilliseconds,
+ e.ConnectionPoolSettings.WaitQueueSize));
+
+#pragma warning restore CS0618 // Type or member is obsolete
+
+ AddTemplateProvider(
+ LogLevel.Debug,
+ CmapCommonParams(),
+ (e, _) => GetParams(e.ServerId, "Connection pool ready"));
+
+ AddTemplateProvider(
+ LogLevel.Debug,
+ CmapCommonParams(ServiceId),
+ (e, _) => GetParams(e.ServerId, "Connection pool clearing", e.ServiceId));
+
+ AddTemplateProvider(
+ LogLevel.Debug,
+ CmapCommonParams(ServiceId),
+ (e, _) => GetParams(e.ServerId, "Connection pool cleared", e.ServiceId));
+
+ AddTemplateProvider(
+ LogLevel.Debug,
+ CmapCommonParams(),
+ (e, _) => GetParams(e.ServerId, "Connection pool closing"));
+
+ AddTemplateProvider(
+ LogLevel.Debug,
+ CmapCommonParams(),
+ (e, _) => GetParams(e.ServerId, "Connection pool closed"));
+ }
+
+ private static string GetCheckoutFailedReason(ConnectionCheckOutFailedReason connectionCheckOutFailedReason) =>
+ connectionCheckOutFailedReason switch
+ {
+ ConnectionCheckOutFailedReason.ConnectionError => "An error occurred while trying to establish a new connection",
+ ConnectionCheckOutFailedReason.PoolClosed => "Connection pool was closed",
+ ConnectionCheckOutFailedReason.Timeout => "Wait queue timeout elapsed without a connection becoming available",
+ _ => null
+ };
+ }
+}
diff --git a/src/MongoDB.Driver.Core/Core/Logging/StructuredLogTemplateProvidersCommand.cs b/src/MongoDB.Driver.Core/Core/Logging/StructuredLogTemplateProvidersCommand.cs
new file mode 100644
index 00000000000..6df6b8a73ea
--- /dev/null
+++ b/src/MongoDB.Driver.Core/Core/Logging/StructuredLogTemplateProvidersCommand.cs
@@ -0,0 +1,116 @@
+/* Copyright 2010-present MongoDB Inc.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+using System;
+using System.Linq;
+using Microsoft.Extensions.Logging;
+using MongoDB.Bson;
+using MongoDB.Driver.Core.Events;
+
+namespace MongoDB.Driver.Core.Logging
+{
+ internal static partial class StructuredLogTemplateProviders
+ {
+ private static string[] __commandCommonParams = new[]
+ {
+ ClusterId,
+ DriverConnectionId,
+ ServerHost,
+ ServerPort,
+ ServerConnectionId,
+ RequestId,
+ OperationId,
+ Message,
+ CommandName
+ };
+
+ private static string[] CommandCommonParams(params string[] @params) => new[]
+ {
+ Concat(__commandCommonParams, @params),
+ Concat(__commandCommonParams, @params.Concat(new[] { ServiceId }).ToArray())
+ };
+
+ private static void AddCommandTemplates()
+ {
+ AddTemplateProvider(
+ LogLevel.Debug,
+ CommandCommonParams(DatabaseName, Command),
+ (e, o) => GetParamsOmitNull(
+ e.ConnectionId,
+ e.ConnectionId.LongServerValue,
+ e.RequestId,
+ e.OperationId,
+ "Command started",
+ e.CommandName,
+ e.DatabaseNamespace.DatabaseName,
+ CommandDocumentToString(e.Command, o),
+ ommitableParam: e.ServiceId),
+ (e, s) => e.ServiceId == null ? s.Templates[0] : s.Templates[1]);
+
+ AddTemplateProvider(
+ LogLevel.Debug,
+ CommandCommonParams(DurationMS, Reply),
+ (e, o) => GetParamsOmitNull(
+ e.ConnectionId,
+ e.ConnectionId.LongServerValue,
+ e.RequestId,
+ e.OperationId,
+ "Command succeeded",
+ e.CommandName,
+ e.Duration.TotalMilliseconds,
+ CommandDocumentToString(e.Reply, o),
+ ommitableParam: e.ServiceId),
+ (e, s) => e.ServiceId == null ? s.Templates[0] : s.Templates[1]);
+
+ AddTemplateProvider(
+ LogLevel.Debug,
+ CommandCommonParams(DurationMS, Failure),
+ (e, o) => GetParamsOmitNull(
+ e.ConnectionId,
+ e.ConnectionId.LongServerValue,
+ e.RequestId,
+ e.OperationId,
+ "Command failed",
+ e.CommandName,
+ e.Duration.TotalMilliseconds,
+ FormatCommandException(e.Failure, o),
+ ommitableParam: e.ServiceId),
+ (e, s) => e.ServiceId == null ? s.Templates[0] : s.Templates[1]);
+ }
+
+ private static string CommandDocumentToString(BsonDocument document, EventLogFormattingOptions eventLogFormattingOptions)
+ {
+ if (document == null)
+ {
+ return null;
+ }
+
+ return TruncateIfNeeded(document.ToString(), eventLogFormattingOptions.MaxDocumentSize);
+ }
+
+ private static string FormatCommandException(Exception exception, EventLogFormattingOptions eventLogFormattingOptions)
+ {
+ if (exception == null)
+ {
+ return null;
+ }
+
+ var serverResult = (exception as MongoCommandException)?.Result;
+ var result = serverResult != null ? $"{exception} server reply: {serverResult}" : exception.ToString();
+
+ return TruncateIfNeeded(result, eventLogFormattingOptions.MaxDocumentSize);
+ }
+ }
+}
diff --git a/src/MongoDB.Driver.Core/Core/Logging/StructuredLogTemplateProvidersConnection.cs b/src/MongoDB.Driver.Core/Core/Logging/StructuredLogTemplateProvidersConnection.cs
new file mode 100644
index 00000000000..716c0d7e1ac
--- /dev/null
+++ b/src/MongoDB.Driver.Core/Core/Logging/StructuredLogTemplateProvidersConnection.cs
@@ -0,0 +1,107 @@
+/* Copyright 2010-present MongoDB Inc.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+using Microsoft.Extensions.Logging;
+using MongoDB.Driver.Core.Events;
+
+namespace MongoDB.Driver.Core.Logging
+{
+ internal static partial class StructuredLogTemplateProviders
+ {
+ private static string[] __connectionCommonParams = new[]
+ {
+ ClusterId,
+ DriverConnectionId,
+ ServerHost,
+ ServerPort,
+ Message,
+ };
+
+ private static string ConnectionCommonParams(params string[] @params) => Concat(__connectionCommonParams, @params);
+
+ private static void AddConnectionTemplates()
+ {
+ AddTemplateProvider(
+ LogLevel.Debug,
+ ConnectionCommonParams(),
+ (e, _) => GetParams(e.ConnectionId, "Connection added"));
+
+ AddTemplateProvider(
+ LogLevel.Debug,
+ ConnectionCommonParams(),
+ (e, _) => GetParams(e.ConnectionId, "Connection ready"));
+
+ AddTemplateProvider(
+ LogLevel.Debug,
+ ConnectionCommonParams(),
+ (e, _) => GetParams(e.ConnectionId, "Connection opening"));
+
+ AddTemplateProvider(
+ LogLevel.Debug,
+ ConnectionCommonParams(Reason),
+ (e, _) => GetParams(e.ConnectionId, "Connection opening failed", e.Exception?.ToString()));
+
+ AddTemplateProvider(
+ LogLevel.Debug,
+ ConnectionCommonParams(),
+ (e, _) => GetParams(e.ConnectionId, "Connection created"));
+
+ AddTemplateProvider(
+ LogLevel.Debug,
+ ConnectionCommonParams(Reason),
+ (e, _) => GetParams(e.ConnectionId, "Connection failed", e.Exception?.ToString()));
+
+ AddTemplateProvider(
+ LogLevel.Debug,
+ ConnectionCommonParams(Reason),
+ (e, _) => GetParams(e.ConnectionId, "Connection closing", "Unknown"));
+
+ AddTemplateProvider(
+ LogLevel.Debug,
+ ConnectionCommonParams(Reason),
+ (e, _) => GetParams(e.ConnectionId, "Connection closed", "Unknown"));
+
+ AddTemplateProvider(
+ LogLevel.Trace,
+ ConnectionCommonParams(),
+ (e, _) => GetParams(e.ConnectionId, "Received"));
+
+ AddTemplateProvider(
+ LogLevel.Trace,
+ ConnectionCommonParams(),
+ (e, _) => GetParams(e.ConnectionId, "Receiving"));
+
+ AddTemplateProvider(
+ LogLevel.Trace,
+ ConnectionCommonParams(Reason),
+ (e, _) => GetParams(e.ConnectionId, "Receiving failed", e.Exception?.ToString()));
+
+ AddTemplateProvider(
+ LogLevel.Trace,
+ ConnectionCommonParams(),
+ (e, _) => GetParams(e.ConnectionId, "Sending"));
+
+ AddTemplateProvider(
+ LogLevel.Trace,
+ ConnectionCommonParams(Reason),
+ (e, _) => GetParams(e.ConnectionId, "Sending failed", e.Exception?.ToString()));
+
+ AddTemplateProvider(
+ LogLevel.Trace,
+ ConnectionCommonParams(),
+ (e, _) => GetParams(e.ConnectionId, "Sent"));
+ }
+ }
+}
diff --git a/src/MongoDB.Driver.Core/Core/Logging/StructuredLogTemplateProvidersSdam.cs b/src/MongoDB.Driver.Core/Core/Logging/StructuredLogTemplateProvidersSdam.cs
new file mode 100644
index 00000000000..b0f71c89fc0
--- /dev/null
+++ b/src/MongoDB.Driver.Core/Core/Logging/StructuredLogTemplateProvidersSdam.cs
@@ -0,0 +1,82 @@
+/* Copyright 2010-present MongoDB Inc.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+using Microsoft.Extensions.Logging;
+using MongoDB.Driver.Core.Events;
+
+namespace MongoDB.Driver.Core.Logging
+{
+ internal static partial class StructuredLogTemplateProviders
+ {
+ private static string[] __sdamCommonParams = new[]
+ {
+ ClusterId,
+ DriverConnectionId,
+ ServerHost,
+ ServerPort,
+ Message,
+ };
+
+ private static string SdamCommonParams(params string[] @params) => Concat(__sdamCommonParams, @params);
+
+ private static void AddSdamTemplates()
+ {
+ AddTemplateProvider(
+ LogLevel.Debug,
+ SdamCommonParams(),
+ (e, _) => GetParams(e.ConnectionId, "Heartbeat started"));
+
+ AddTemplateProvider(
+ LogLevel.Debug,
+ SdamCommonParams(),
+ (e, _) => GetParams(e.ConnectionId, "Heartbeat succeeded"));
+
+ AddTemplateProvider(
+ LogLevel.Debug,
+ SdamCommonParams(),
+ (e, _) => GetParams(e.ConnectionId, "Heartbeat failed"));
+
+ AddTemplateProvider(
+ LogLevel.Debug,
+ Concat(new[] { Message }),
+ (e, _) => new[] { e.Message });
+
+ AddTemplateProvider(
+ LogLevel.Debug,
+ CmapCommonParams(),
+ (e, _) => GetParams(e.ServerId, "Server opening"));
+
+ AddTemplateProvider(
+ LogLevel.Debug,
+ CmapCommonParams(),
+ (e, _) => GetParams(e.ServerId, "Server opened"));
+
+ AddTemplateProvider(
+ LogLevel.Debug,
+ CmapCommonParams(),
+ (e, _) => GetParams(e.ServerId, "Server closing"));
+
+ AddTemplateProvider(
+ LogLevel.Debug,
+ CmapCommonParams(),
+ (e, _) => GetParams(e.ServerId, "Server closed"));
+
+ AddTemplateProvider(
+ LogLevel.Debug,
+ CmapCommonParams(Description),
+ (e, _) => GetParams(e.ServerId, "Description changed", e.NewDescription));
+ }
+ }
+}
diff --git a/src/MongoDB.Driver.Core/Core/Misc/EndPointHelper.cs b/src/MongoDB.Driver.Core/Core/Misc/EndPointHelper.cs
index 1da0831bc39..7d99df91a52 100644
--- a/src/MongoDB.Driver.Core/Core/Misc/EndPointHelper.cs
+++ b/src/MongoDB.Driver.Core/Core/Misc/EndPointHelper.cs
@@ -157,6 +157,9 @@ public static EndPoint Parse(string value)
return endPoint;
}
+ internal static (string Host, int Port) GetHostAndPort(this EndPoint endPoint) =>
+ (endPoint is DnsEndPoint dnsEndPoint) ? (dnsEndPoint.Host, dnsEndPoint.Port) : default;
+
///
/// Returns a that represents the end point.
///
diff --git a/src/MongoDB.Driver.Core/Core/Misc/Ensure.cs b/src/MongoDB.Driver.Core/Core/Misc/Ensure.cs
index 9d9def7ebe4..10560a1cbd7 100644
--- a/src/MongoDB.Driver.Core/Core/Misc/Ensure.cs
+++ b/src/MongoDB.Driver.Core/Core/Misc/Ensure.cs
@@ -27,6 +27,22 @@ namespace MongoDB.Driver.Core.Misc
[DebuggerStepThrough]
public static class Ensure
{
+ ///
+ /// Ensures that the value of a parameter is not null.
+ ///
+ /// Type type of the value.
+ /// The value of the parameter.
+ /// The name of the parameter.
+ /// The value of the parameter.
+ public static Nullable HasValue(Nullable value, string paramName) where T : struct
+ {
+ if (!value.HasValue)
+ {
+ throw new ArgumentException("The Nullable parameter must have a value.", paramName);
+ }
+ return value;
+ }
+
///
/// Ensures that the value of a parameter is between a minimum and a maximum value.
///
@@ -65,34 +81,36 @@ public static T IsEqualTo(T value, T comparand, string paramName)
}
///
- /// Ensures that the value of a parameter is greater than or equal to a comparand.
+ /// Ensures that the value of a parameter is greater than a comparand.
///
/// Type type of the value.
/// The value of the parameter.
/// The comparand.
/// The name of the parameter.
/// The value of the parameter.
- public static T IsGreaterThanOrEqualTo(T value, T comparand, string paramName) where T : IComparable
+ public static T IsGreaterThan(T value, T comparand, string paramName) where T : IComparable
{
- if (value.CompareTo(comparand) < 0)
+ if (value.CompareTo(comparand) <= 0)
{
- var message = string.Format("Value is not greater than or equal to {1}: {0}.", value, comparand);
+ var message = $"Value is not greater than {comparand}: {value}.";
throw new ArgumentOutOfRangeException(paramName, message);
}
return value;
}
///
- /// Ensures that the value of a parameter is greater than or equal to zero.
+ /// Ensures that the value of a parameter is greater than or equal to a comparand.
///
+ /// Type type of the value.
/// The value of the parameter.
+ /// The comparand.
/// The name of the parameter.
/// The value of the parameter.
- public static int IsGreaterThanOrEqualToZero(int value, string paramName)
+ public static T IsGreaterThanOrEqualTo(T value, T comparand, string paramName) where T : IComparable
{
- if (value < 0)
+ if (value.CompareTo(comparand) < 0)
{
- var message = string.Format("Value is not greater than or equal to 0: {0}.", value);
+ var message = string.Format("Value is not greater than or equal to {1}: {0}.", value, comparand);
throw new ArgumentOutOfRangeException(paramName, message);
}
return value;
@@ -104,15 +122,8 @@ public static int IsGreaterThanOrEqualToZero(int value, string paramName)
/// The value of the parameter.
/// The name of the parameter.
/// The value of the parameter.
- public static long IsGreaterThanOrEqualToZero(long value, string paramName)
- {
- if (value < 0)
- {
- var message = string.Format("Value is not greater than or equal to 0: {0}.", value);
- throw new ArgumentOutOfRangeException(paramName, message);
- }
- return value;
- }
+ public static int IsGreaterThanOrEqualToZero(int value, string paramName) =>
+ IsGreaterThanOrEqualTo(value, 0, paramName);
///
/// Ensures that the value of a parameter is greater than or equal to zero.
@@ -120,15 +131,17 @@ public static long IsGreaterThanOrEqualToZero(long value, string paramName)
/// The value of the parameter.
/// The name of the parameter.
/// The value of the parameter.
- public static TimeSpan IsGreaterThanOrEqualToZero(TimeSpan value, string paramName)
- {
- if (value < TimeSpan.Zero)
- {
- var message = string.Format("Value is not greater than or equal to zero: {0}.", TimeSpanParser.ToString(value));
- throw new ArgumentOutOfRangeException(paramName, message);
- }
- return value;
- }
+ public static long IsGreaterThanOrEqualToZero(long value, string paramName) =>
+ IsGreaterThanOrEqualTo(value, 0, paramName);
+
+ ///
+ /// Ensures that the value of a parameter is greater than or equal to zero.
+ ///
+ /// The value of the parameter.
+ /// The name of the parameter.
+ /// The value of the parameter.
+ public static TimeSpan IsGreaterThanOrEqualToZero(TimeSpan value, string paramName) =>
+ IsGreaterThanOrEqualTo(value, TimeSpan.Zero, paramName);
///
/// Ensures that the value of a parameter is greater than zero.
@@ -136,15 +149,8 @@ public static TimeSpan IsGreaterThanOrEqualToZero(TimeSpan value, string paramNa
/// The value of the parameter.
/// The name of the parameter.
/// The value of the parameter.
- public static int IsGreaterThanZero(int value, string paramName)
- {
- if (value <= 0)
- {
- var message = string.Format("Value is not greater than zero: {0}.", value);
- throw new ArgumentOutOfRangeException(paramName, message);
- }
- return value;
- }
+ public static int IsGreaterThanZero(int value, string paramName) =>
+ IsGreaterThan(value, 0, paramName);
///
/// Ensures that the value of a parameter is greater than zero.
@@ -152,15 +158,8 @@ public static int IsGreaterThanZero(int value, string paramName)
/// The value of the parameter.
/// The name of the parameter.
/// The value of the parameter.
- public static long IsGreaterThanZero(long value, string paramName)
- {
- if (value <= 0)
- {
- var message = string.Format("Value is not greater than zero: {0}.", value);
- throw new ArgumentOutOfRangeException(paramName, message);
- }
- return value;
- }
+ public static long IsGreaterThanZero(long value, string paramName) =>
+ IsGreaterThan(value, 0, paramName);
///
/// Ensures that the value of a parameter is greater than zero.
@@ -168,15 +167,17 @@ public static long IsGreaterThanZero(long value, string paramName)
/// The value of the parameter.
/// The name of the parameter.
/// The value of the parameter.
- public static TimeSpan IsGreaterThanZero(TimeSpan value, string paramName)
- {
- if (value <= TimeSpan.Zero)
- {
- var message = string.Format("Value is not greater than zero: {0}.", value);
- throw new ArgumentOutOfRangeException(paramName, message);
- }
- return value;
- }
+ public static double IsGreaterThanZero(double value, string paramName) =>
+ IsGreaterThan(value, 0, paramName);
+
+ ///
+ /// Ensures that the value of a parameter is greater than zero.
+ ///
+ /// The value of the parameter.
+ /// The name of the parameter.
+ /// The value of the parameter.
+ public static TimeSpan IsGreaterThanZero(TimeSpan value, string paramName) =>
+ IsGreaterThan(value, TimeSpan.Zero, paramName);
///
/// Ensures that the value of a parameter is infinite or greater than or equal to zero.
@@ -247,22 +248,6 @@ public static IEnumerable IsNotNullAndDoesNotContainAnyNulls(IEnumerable
- /// Ensures that the value of a parameter is not null.
- ///
- /// Type type of the value.
- /// The value of the parameter.
- /// The name of the parameter.
- /// The value of the parameter.
- public static Nullable HasValue(Nullable value, string paramName) where T : struct
- {
- if (!value.HasValue)
- {
- throw new ArgumentException("The Nullable parameter must have a value.", paramName);
- }
- return value;
- }
-
///
/// Ensures that the value of a parameter is not null or empty.
///
@@ -298,6 +283,24 @@ public static T IsNull(T value, string paramName) where T : class
return value;
}
+ ///
+ /// Ensures that the value of a parameter is null or is between a minimum and a maximum value.
+ ///
+ /// Type type of the value.
+ /// The value of the parameter.
+ /// The minimum value.
+ /// The maximum value.
+ /// The name of the parameter.
+ /// The value of the parameter.
+ public static T? IsNullOrBetween(T? value, T min, T max, string paramName) where T : struct, IComparable
+ {
+ if (value != null)
+ {
+ IsBetween(value.Value, min, max, paramName);
+ }
+ return value;
+ }
+
///
/// Ensures that the value of a parameter is null or greater than or equal to zero.
///
diff --git a/src/MongoDB.Driver.Core/Core/Misc/EnvironmentVariableProvider.cs b/src/MongoDB.Driver.Core/Core/Misc/EnvironmentVariableProvider.cs
new file mode 100644
index 00000000000..d0d8eb83341
--- /dev/null
+++ b/src/MongoDB.Driver.Core/Core/Misc/EnvironmentVariableProvider.cs
@@ -0,0 +1,32 @@
+/* Copyright 2010-present MongoDB Inc.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+using System;
+
+namespace MongoDB.Driver.Core.Misc
+{
+ internal interface IEnvironmentVariableProvider
+ {
+ string GetEnvironmentVariable(string name);
+ }
+
+ internal class EnvironmentVariableProvider : IEnvironmentVariableProvider
+ {
+ private static readonly IEnvironmentVariableProvider __instance = new EnvironmentVariableProvider();
+ public static IEnvironmentVariableProvider Instance => __instance;
+
+ public string GetEnvironmentVariable(string name) => Environment.GetEnvironmentVariable(name);
+ }
+}
diff --git a/src/MongoDB.Driver.Core/Core/Misc/Feature.cs b/src/MongoDB.Driver.Core/Core/Misc/Feature.cs
index 62dd73f40ee..9fb626e26ca 100644
--- a/src/MongoDB.Driver.Core/Core/Misc/Feature.cs
+++ b/src/MongoDB.Driver.Core/Core/Misc/Feature.cs
@@ -57,10 +57,12 @@ public class Feature
private static readonly Feature __createIndexCommitQuorum = new Feature("CreateIndexCommitQuorum", WireVersion.Server44);
private static readonly Feature __createIndexesCommand = new Feature("CreateIndexesCommand", WireVersion.Server26);
private static readonly Feature __createIndexesUsingInsertOperations = new Feature("CreateIndexesUsingInsertOperations", WireVersion.Zero, WireVersion.Server42);
+ private static readonly Feature __csfleRangeAlgorithm = new Feature("CsfleRangeAlgorithm", WireVersion.Server62);
private static readonly Feature __csfle2 = new Feature("Csfle2", WireVersion.Server60);
private static readonly Feature __currentOpCommand = new Feature("CurrentOpCommand", WireVersion.Server32);
private static readonly Feature __dateOperatorsNewIn50 = new Feature("DateOperatorsNewIn50", WireVersion.Server50);
private static readonly Feature __densifyStage = new Feature("DensifyStage", WireVersion.Server51);
+ private static readonly Feature __documentsStage = new Feature("DocumentsStage", WireVersion.Server51);
private static readonly Feature __documentValidation = new Feature("DocumentValidation", WireVersion.Server32);
private static readonly Feature __directConnectionSetting = new Feature("DirectConnectionSetting", WireVersion.Server44);
private static readonly Feature __eval = new Feature("Eval", WireVersion.Zero, WireVersion.Server42);
@@ -73,6 +75,7 @@ public class Feature
private static readonly Feature __findAllowDiskUse = new Feature("FindAllowDiskUse", WireVersion.Server44);
private static readonly Feature __findAndModifyWriteConcern = new Feature("FindAndModifyWriteConcern", WireVersion.Server32);
private static readonly Feature __findCommand = new Feature("FindCommand", WireVersion.Server32);
+ private static readonly Feature __findProjectionExpressions = new Feature("FindProjectionExpressions", WireVersion.Server44);
private static readonly Feature __geoNearCommand = new Feature("GeoNearCommand", WireVersion.Zero, WireVersion.Server42);
private static readonly Feature __getField = new Feature("GetField", WireVersion.Server50);
private static readonly Feature __getMoreComment = new Feature("GetMoreComment", WireVersion.Server44);
@@ -115,7 +118,10 @@ public class Feature
private static readonly Feature __speculativeAuthentication = new Feature("SpeculativeAuthentication", WireVersion.Server44);
private static readonly Feature __streamingHello = new Feature("StreamingHello", WireVersion.Server44);
private static readonly Feature __tailableCursor = new Feature("TailableCursor", WireVersion.Server32);
+ private static readonly Feature __toConversionOperators = new Feature("ToConversionOperators", WireVersion.Server40);
+ private static readonly Feature __trigOperators = new Feature("TrigOperators", WireVersion.Server42);
private static readonly Feature __transactions = new Feature("Transactions", WireVersion.Server40);
+ private static readonly Feature __updateWithAggregationPipeline = new Feature("UpdateWithAggregationPipeline", WireVersion.Server42);
private static readonly Feature __userManagementCommands = new Feature("UserManagementCommands", WireVersion.Server26);
private static readonly Feature __views = new Feature("Views", WireVersion.Server34);
private static readonly Feature __wildcardIndexes = new Feature("WildcardIndexes", WireVersion.Server42);
@@ -312,6 +318,11 @@ public class Feature
///
public static Feature CreateIndexesUsingInsertOperations => __createIndexesUsingInsertOperations;
+ ///
+ /// Gets the csfle range algorithm feature.
+ ///
+ public static Feature CsfleRangeAlgorithm => __csfleRangeAlgorithm;
+
///
/// Gets the client side field level encryption 2 feature.
///
@@ -333,6 +344,11 @@ public class Feature
///
public static Feature DensifyStage => __densifyStage;
+ ///
+ /// Gets the documents stage feature.
+ ///
+ public static Feature DocumentsStage => __documentsStage;
+
///
/// Gets the document validation feature.
///
@@ -400,6 +416,11 @@ public class Feature
[Obsolete("This property will be removed in a later release.")]
public static Feature FindCommand => __findCommand;
+ ///
+ /// Gets the find projection expressions feature.
+ ///
+ public static Feature FindProjectionExpressions => __findProjectionExpressions;
+
///
/// Gets the geoNear command feature.
///
@@ -640,17 +661,32 @@ public class Feature
[Obsolete("This property will be removed in a later release.")]
public static Feature TailableCursor => __tailableCursor;
+ ///
+ /// Gets the $toXyz conversion operators feature ($toDouble etc.).
+ ///
+ public static Feature ToConversionOperators => __toConversionOperators;
+
///
/// Gets the transactions feature.
///
public static Feature Transactions => __transactions;
+ ///
+ /// Gets the trig operators feature.
+ ///
+ public static Feature TrigOperators => __trigOperators;
+
///
/// Gets the user management commands feature.
///
[Obsolete("This property will be removed in a later release.")]
public static Feature UserManagementCommands => __userManagementCommands;
+ ///
+ /// Gets the update with aggregation pipeline feature.
+ ///
+ public static Feature UpdateWithAggregationPipeline => __updateWithAggregationPipeline;
+
///
/// Gets the views feature.
///
diff --git a/src/MongoDB.Driver.Core/Core/Misc/IDictionaryExtensions.cs b/src/MongoDB.Driver.Core/Core/Misc/IDictionaryExtensions.cs
new file mode 100644
index 00000000000..9a99976f2d9
--- /dev/null
+++ b/src/MongoDB.Driver.Core/Core/Misc/IDictionaryExtensions.cs
@@ -0,0 +1,30 @@
+/* Copyright 2010-present MongoDB Inc.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+using System.Collections.Generic;
+
+namespace MongoDB.Driver.Core
+{
+ internal static class IDictionaryExtensions
+ {
+ public static void AddRange(this IDictionary dictionary, IEnumerable> values)
+ {
+ foreach (var p in values)
+ {
+ dictionary.Add(p);
+ }
+ }
+ }
+}
diff --git a/src/MongoDB.Driver.Core/Core/Misc/OperatingSystemHelper.cs b/src/MongoDB.Driver.Core/Core/Misc/OperatingSystemHelper.cs
index 326e2b435d7..bd70290b0f3 100644
--- a/src/MongoDB.Driver.Core/Core/Misc/OperatingSystemHelper.cs
+++ b/src/MongoDB.Driver.Core/Core/Misc/OperatingSystemHelper.cs
@@ -1,4 +1,4 @@
-/* Copyright 2020-present MongoDB Inc.
+/* Copyright 2010-present MongoDB Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -27,30 +27,32 @@ internal enum OperatingSystemPlatform
internal static class OperatingSystemHelper
{
- public static OperatingSystemPlatform CurrentOperatingSystem
+ public static OperatingSystemPlatform CurrentOperatingSystem => __currentOperatingSystem.Value;
+
+ private static readonly Lazy __currentOperatingSystem = new Lazy(DetermineOperatingSystemPlatform);
+
+ private static OperatingSystemPlatform DetermineOperatingSystemPlatform()
{
- get
- {
#if NET472
- return OperatingSystemPlatform.Windows;
+ return OperatingSystemPlatform.Windows;
#else
- if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
- {
- return OperatingSystemPlatform.MacOS;
- }
- else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
- {
- return OperatingSystemPlatform.Linux;
- }
- else if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
- {
- return OperatingSystemPlatform.Windows;
- }
-
- // should not be reached. If we're here, then there is a bug in the library
+ if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
+ {
+ return OperatingSystemPlatform.Linux;
+ }
+ else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
+ {
+ return OperatingSystemPlatform.MacOS;
+ }
+ else if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
+ {
+ return OperatingSystemPlatform.Windows;
+ }
+ else
+ {
throw new PlatformNotSupportedException($"Unsupported platform '{RuntimeInformation.OSDescription}'.");
-#endif
}
+#endif
}
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Misc/WireVersion.cs b/src/MongoDB.Driver.Core/Core/Misc/WireVersion.cs
index 4ad2fabce9f..b3440a1f3ea 100644
--- a/src/MongoDB.Driver.Core/Core/Misc/WireVersion.cs
+++ b/src/MongoDB.Driver.Core/Core/Misc/WireVersion.cs
@@ -88,6 +88,14 @@ internal static class WireVersion
/// Wire version 17.
///
public const int Server60 = 17;
+ ///
+ /// Wire version 18.
+ ///
+ public const int Server61 = 18;
+ ///
+ /// Wire version 19.
+ ///
+ public const int Server62 = 19;
#region static
private static List __knownWireVersions = new()
@@ -114,10 +122,12 @@ internal static class WireVersion
new WireVersionInfo(wireVersion: 14, major: 5, minor: 1),
new WireVersionInfo(wireVersion: 15, major: 5, minor: 2),
new WireVersionInfo(wireVersion: 16, major: 5, minor: 3),
- new WireVersionInfo(wireVersion: 17, major: 6, minor: 0)
+ new WireVersionInfo(wireVersion: 17, major: 6, minor: 0),
+ new WireVersionInfo(wireVersion: 18, major: 6, minor: 1),
+ new WireVersionInfo(wireVersion: 19, major: 6, minor: 2)
};
- private static Range __supportedWireVersionRange = CreateSupportedWireVersionRange(minWireVersion: 6, maxWireVersion: 17);
+ private static Range __supportedWireVersionRange = CreateSupportedWireVersionRange(minWireVersion: 6, maxWireVersion: 19);
private static Range CreateSupportedWireVersionRange(int minWireVersion, int maxWireVersion)
{
diff --git a/src/MongoDB.Driver.Core/Core/NativeLibraryLoader/DarwinLibraryLoader.cs b/src/MongoDB.Driver.Core/Core/NativeLibraryLoader/DarwinLibraryLoader.cs
deleted file mode 100644
index 5e1fd71a13c..00000000000
--- a/src/MongoDB.Driver.Core/Core/NativeLibraryLoader/DarwinLibraryLoader.cs
+++ /dev/null
@@ -1,66 +0,0 @@
-/* Copyright 2019-present MongoDB Inc.
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-using System;
-using System.IO;
-using System.Runtime.InteropServices;
-using MongoDB.Driver.Core.Misc;
-
-namespace MongoDB.Driver.Core.NativeLibraryLoader
-{
- internal class DarwinLibraryLoader : INativeLibraryLoader
- {
- // See dlfcn.h
- // #define RTLD_LAZY 0x1
- // #define RTLD_NOW 0x2
- // #define RTLD_LOCAL 0x4
- // #define RTLD_GLOBAL 0x8
- private const int RTLD_GLOBAL = 0x8;
- private const int RTLD_NOW = 0x2;
-
- private readonly IntPtr _handle;
-
- public DarwinLibraryLoader(string path)
- {
- Ensure.IsNotNullOrEmpty(path, nameof(path));
-
- _handle = NativeMethods.dlopen(path, RTLD_GLOBAL | RTLD_NOW);
- if (_handle == IntPtr.Zero)
- {
- throw new FileNotFoundException(path);
- }
- }
-
- // public methods
- public IntPtr GetFunctionPointer(string name)
- {
- Ensure.IsNotNullOrEmpty(name, nameof(name));
-
- return NativeMethods.dlsym(_handle, name);
- }
-
- // nested types
- private static class NativeMethods
- {
-#pragma warning disable CA2101 // Specify marshaling for P/Invoke string arguments
- [DllImport("libdl", CharSet = CharSet.Ansi)]
- public static extern IntPtr dlopen(string filename, int flags);
-
- [DllImport("libdl", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
- public static extern IntPtr dlsym(IntPtr handle, string symbol);
-#pragma warning restore CA2101 // Specify marshaling for P/Invoke string arguments
- }
- }
-}
diff --git a/src/MongoDB.Driver.Core/Core/NativeLibraryLoader/LibraryLoader.cs b/src/MongoDB.Driver.Core/Core/NativeLibraryLoader/LibraryLoader.cs
deleted file mode 100644
index 2503223507f..00000000000
--- a/src/MongoDB.Driver.Core/Core/NativeLibraryLoader/LibraryLoader.cs
+++ /dev/null
@@ -1,79 +0,0 @@
-/* Copyright 2019-present MongoDB Inc.
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-using System;
-using System.Runtime.InteropServices;
-using MongoDB.Driver.Core.Misc;
-
-namespace MongoDB.Driver.Core.NativeLibraryLoader
-{
- internal class LibraryLoader
- {
- private readonly INativeLibraryLoader _nativeLoader;
-
- public LibraryLoader(ILibraryLocator libraryLocator)
- {
- Ensure.IsNotNull(libraryLocator, nameof(libraryLocator));
- if (!libraryLocator.IsX32ModeSupported)
- {
- ThrowIfNot64BitProcess(libraryLocator);
- }
- _nativeLoader = CreateNativeLoader(libraryLocator);
- }
-
- // public methods
- public T GetDelegate(string name)
- {
- IntPtr ptr = _nativeLoader.GetFunctionPointer(name);
- if (ptr == IntPtr.Zero)
- {
- throw new TypeLoadException($"The function {name} was not found.");
- }
-
- return Marshal.GetDelegateForFunctionPointer(ptr);
- }
-
- // private methods
- private INativeLibraryLoader CreateNativeLoader(ILibraryLocator libraryLocator)
- {
- var currentPlatform = OperatingSystemHelper.CurrentOperatingSystem;
- var absolutePath = libraryLocator.GetLibraryAbsolutePath(currentPlatform);
- return CreateNativeLoader(currentPlatform, absolutePath, libraryLocator.LibraryName);
- }
-
- private INativeLibraryLoader CreateNativeLoader(OperatingSystemPlatform currentPlatform, string libraryPath, string libraryName)
- {
- switch (currentPlatform)
- {
- case OperatingSystemPlatform.Linux:
- return new LinuxLibraryLoader(libraryPath);
- case OperatingSystemPlatform.MacOS:
- return new DarwinLibraryLoader(libraryPath);
- case OperatingSystemPlatform.Windows:
- return new WindowsLibraryLoader(libraryPath);
- default:
- throw new PlatformNotSupportedException($"Error loading library {libraryName}: Unexpected platform {currentPlatform}.");
- }
- }
-
- private void ThrowIfNot64BitProcess(ILibraryLocator libraryLocator)
- {
- if (!Environment.Is64BitProcess)
- {
- throw new PlatformNotSupportedException($"{libraryLocator.LibraryName} can be loaded only in a 64-bit process.");
- }
- }
- }
-}
diff --git a/src/MongoDB.Driver.Core/Core/NativeLibraryLoader/LinuxLibraryLoader.cs b/src/MongoDB.Driver.Core/Core/NativeLibraryLoader/LinuxLibraryLoader.cs
deleted file mode 100644
index ab78644d148..00000000000
--- a/src/MongoDB.Driver.Core/Core/NativeLibraryLoader/LinuxLibraryLoader.cs
+++ /dev/null
@@ -1,65 +0,0 @@
-/* Copyright 2019-present MongoDB Inc.
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-using System;
-using System.IO;
-using System.Runtime.InteropServices;
-using MongoDB.Driver.Core.Misc;
-
-namespace MongoDB.Driver.Core.NativeLibraryLoader
-{
- internal class LinuxLibraryLoader : INativeLibraryLoader
- {
- // See dlfcn.h
- // #define RTLD_LAZY 0x1
- // #define RTLD_NOW 0x2
- // #define RTLD_LOCAL 0x4
- // #define RTLD_GLOBAL 0x100
- private const int RTLD_GLOBAL = 0x100;
- private const int RTLD_NOW = 0x2;
-
- private readonly IntPtr _handle;
-
- public LinuxLibraryLoader(string path)
- {
- Ensure.IsNotNullOrEmpty(path, nameof(path));
-
- _handle = NativeMethods.dlopen(path, RTLD_GLOBAL | RTLD_NOW);
- if (_handle == IntPtr.Zero)
- {
- throw new FileNotFoundException(path);
- }
- }
-
- // public methods
- public IntPtr GetFunctionPointer(string name)
- {
- Ensure.IsNotNullOrEmpty(name, nameof(name));
-
- return NativeMethods.dlsym(_handle, name);
- }
-
- // nested types
- private static class NativeMethods
- {
-#pragma warning disable CA2101 // Specify marshaling for P/Invoke string arguments
- [DllImport("libdl", CharSet = CharSet.Ansi)]
- public static extern IntPtr dlopen(string filename, int flags);
- [DllImport("libdl", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
- public static extern IntPtr dlsym(IntPtr handle, string symbol);
-#pragma warning restore CA2101 // Specify marshaling for P/Invoke string arguments
- }
- }
-}
diff --git a/src/MongoDB.Driver.Core/Core/NativeLibraryLoader/PinnedBuffer.cs b/src/MongoDB.Driver.Core/Core/NativeLibraryLoader/PinnedBuffer.cs
deleted file mode 100644
index 911ec574330..00000000000
--- a/src/MongoDB.Driver.Core/Core/NativeLibraryLoader/PinnedBuffer.cs
+++ /dev/null
@@ -1,49 +0,0 @@
-/* Copyright 2019–present MongoDB Inc.
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-using System;
-using System.Runtime.InteropServices;
-
-namespace MongoDB.Driver.Core.NativeLibraryLoader
-{
- internal class PinnedBuffer : IDisposable
- {
- private GCHandle _handle; // not readonly to prevent a temporary copy from being created when calling Free
- private readonly IntPtr _intPtr;
-
- public PinnedBuffer(byte[] bytes, int offset)
- {
- // The array must be pinned by using a GCHandle before it is passed to UnsafeAddrOfPinnedArrayElement.
- // For maximum performance, this method does not validate the array passed to it; this can result in unexpected behavior.
- _handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
- _intPtr = Marshal.UnsafeAddrOfPinnedArrayElement(bytes, offset);
- }
-
- public IntPtr IntPtr => _intPtr;
-
- // public methods
- public void Dispose()
- {
- try
- {
- _handle.Free();
- }
- catch
- {
- // ignore exceptions
- }
- }
- }
-}
diff --git a/src/MongoDB.Driver.Core/Core/NativeLibraryLoader/RelativeLibraryLocatorBase.cs b/src/MongoDB.Driver.Core/Core/NativeLibraryLoader/RelativeLibraryLocatorBase.cs
deleted file mode 100644
index 761a4bdef58..00000000000
--- a/src/MongoDB.Driver.Core/Core/NativeLibraryLoader/RelativeLibraryLocatorBase.cs
+++ /dev/null
@@ -1,88 +0,0 @@
-/* Copyright 2019-present MongoDB Inc.
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-using System;
-using System.IO;
-using System.Reflection;
-using MongoDB.Driver.Core.Misc;
-
-namespace MongoDB.Driver.Core.NativeLibraryLoader
-{
- internal abstract class RelativeLibraryLocatorBase : ILibraryLocator
- {
- // public properties
- public virtual bool IsX32ModeSupported => false;
-
- public abstract string LibraryName { get; }
-
- // public methods
- public string GetBaseAssemblyDirectory()
- {
- var baseAssemblyPathUri = GetBaseAssemblyUri();
- var uri = new Uri(baseAssemblyPathUri);
- var absoluteAssemblyPath = Uri.UnescapeDataString(uri.AbsolutePath);
- return Path.GetDirectoryName(absoluteAssemblyPath);
- }
-
- public virtual string GetBaseAssemblyUri() => typeof(RelativeLibraryLocatorBase).GetTypeInfo().Assembly.CodeBase;
-
- public string GetLibraryAbsolutePath(OperatingSystemPlatform currentPlatform)
- {
- var relativePath = GetLibraryDirectoryRelativePath(currentPlatform);
- var libraryName = GetLibraryFileName(currentPlatform);
- return GetAbsolutePath(relativePath, libraryName);
- }
-
- public virtual string GetLibraryDirectoryRelativePath(OperatingSystemPlatform currentPlatform)
- {
- var rid = GetCurrentPlatformRuntimeIdentifier(currentPlatform);
- return Path.Combine("runtimes", rid, "native");
- }
-
- public abstract string GetLibraryFileName(OperatingSystemPlatform currentPlatform);
-
- public virtual string GetCurrentPlatformRuntimeIdentifier(OperatingSystemPlatform currentPlatform)
- => currentPlatform switch
- {
- OperatingSystemPlatform.Windows => "win",
- OperatingSystemPlatform.Linux => "linux",
- OperatingSystemPlatform.MacOS => "osx",
- _ => $"The provided platform {currentPlatform} is not currently supported.",
- };
-
- // private methods
- private string GetAbsolutePath(string relativeLibraryDirectoryPath, string libraryName)
- {
- var libraryBasePath = GetBaseAssemblyDirectory();
-
- var absolutePathsToCheck = new[]
- {
- Path.Combine(libraryBasePath, libraryName), // look in the current assembly folder
- Path.Combine(libraryBasePath, "..", "..", relativeLibraryDirectoryPath, libraryName), // with step back on two folders
- Path.Combine(libraryBasePath, relativeLibraryDirectoryPath, libraryName)
- };
-
- foreach (var absolutePath in absolutePathsToCheck)
- {
- if (File.Exists(absolutePath))
- {
- return absolutePath;
- }
- }
-
- throw new FileNotFoundException($"Could not find library {libraryName}. Checked {string.Join(";", absolutePathsToCheck)}.");
- }
- }
-}
diff --git a/src/MongoDB.Driver.Core/Core/NativeLibraryLoader/WindowsLibraryLoader.cs b/src/MongoDB.Driver.Core/Core/NativeLibraryLoader/WindowsLibraryLoader.cs
deleted file mode 100644
index a9849c2f68b..00000000000
--- a/src/MongoDB.Driver.Core/Core/NativeLibraryLoader/WindowsLibraryLoader.cs
+++ /dev/null
@@ -1,71 +0,0 @@
-/* Copyright 2019-present MongoDB Inc.
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-using System;
-using System.Runtime.InteropServices;
-using MongoDB.Driver.Core.Misc;
-using MongoDB.Libmongocrypt;
-
-namespace MongoDB.Driver.Core.NativeLibraryLoader
-{
- internal class WindowsLibraryLoader : INativeLibraryLoader
- {
- private readonly IntPtr _handle;
-
- public WindowsLibraryLoader(string path)
- {
- Ensure.IsNotNullOrEmpty(path, nameof(path));
-
- _handle = NativeMethods.LoadLibrary(path);
- if (_handle == IntPtr.Zero)
- {
- var gle = Marshal.GetLastWin32Error();
-
- // error code 193 indicates that a 64-bit OS has tried to load a 32-bit dll
- // https://docs.microsoft.com/en-us/windows/win32/debug/system-error-codes--0-499-
- throw new LibraryLoadingException($"Error loading library: {path}. Windows Error code: {gle}.");
- }
- }
-
- // public methods
- public IntPtr GetFunctionPointer(string name)
- {
- Ensure.IsNotNullOrEmpty(name, nameof(name));
-
- var ptr = NativeMethods.GetProcAddress(_handle, name);
- if (ptr == null)
- {
- var gle = Marshal.GetLastWin32Error();
- throw new TypeLoadException($"Error loading function: {name}. Windows Error code: {gle}.");
- }
-
- return ptr;
- }
-
- // nested types
- private static class NativeMethods
- {
-#pragma warning disable CA2101
- [DllImport("kernel32", SetLastError = true, CharSet = CharSet.Ansi)]
- public static extern IntPtr LoadLibrary([MarshalAs(UnmanagedType.LPStr)]string lpFileName);
-#pragma warning restore CA2101
-
-#pragma warning disable CA2101
- [DllImport("kernel32", CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true)]
- public static extern IntPtr GetProcAddress(IntPtr hModule, string procName);
-#pragma warning restore CA2101
- }
- }
-}
diff --git a/src/MongoDB.Driver.Core/Core/Servers/DefaultServer.cs b/src/MongoDB.Driver.Core/Core/Servers/DefaultServer.cs
index 76050194c00..e41d94a8ad2 100644
--- a/src/MongoDB.Driver.Core/Core/Servers/DefaultServer.cs
+++ b/src/MongoDB.Driver.Core/Core/Servers/DefaultServer.cs
@@ -19,12 +19,13 @@
using System.Linq;
using System.Net;
using System.Net.Sockets;
+using Microsoft.Extensions.Logging;
using MongoDB.Bson;
using MongoDB.Driver.Core.Clusters;
using MongoDB.Driver.Core.Configuration;
using MongoDB.Driver.Core.ConnectionPools;
using MongoDB.Driver.Core.Connections;
-using MongoDB.Driver.Core.Events;
+using MongoDB.Driver.Core.Logging;
using MongoDB.Driver.Core.Misc;
namespace MongoDB.Driver.Core.Servers
@@ -58,8 +59,8 @@ public DefaultServer(
EndPoint endPoint,
IConnectionPoolFactory connectionPoolFactory,
IServerMonitorFactory monitorFactory,
- IEventSubscriber eventSubscriber,
- ServerApi serverApi)
+ ServerApi serverApi,
+ EventLogger eventLogger)
: base(
clusterId,
clusterClock,
@@ -69,8 +70,8 @@ public DefaultServer(
settings,
endPoint,
connectionPoolFactory,
- eventSubscriber,
- serverApi)
+ serverApi,
+ eventLogger)
{
_monitor = Ensure.IsNotNull(monitorFactory, nameof(monitorFactory)).Create(ServerId, endPoint);
_baseDescription = _currentDescription = new ServerDescription(ServerId, endPoint, reasonChanged: "ServerInitialDescription", heartbeatInterval: settings.HeartbeatInterval);
@@ -171,6 +172,16 @@ protected override void Invalidate(string reasonInvalidated, bool clearConnectio
$"InvalidatedBecause:{reasonInvalidated}",
lastUpdateTimestamp: DateTime.UtcNow,
topologyVersion: topologyVersion);
+
+ var (host, port) = ServerId.EndPoint.GetHostAndPort();
+ EventLogger.Logger?.LogDebug(
+ StructuredLogTemplateProviders.ServerId_Message_Description,
+ ServerId.ClusterId.Value,
+ host,
+ port,
+ newDescription,
+ "Invalidating description");
+
SetDescription(newDescription, clearConnectionPool);
// TODO: make the heartbeat request conditional so we adhere to this part of the spec
// > Network error when reading or writing: ... Clients MUST NOT request an immediate check of the server;
diff --git a/src/MongoDB.Driver.Core/Core/Servers/LoadBalancedServer.cs b/src/MongoDB.Driver.Core/Core/Servers/LoadBalancedServer.cs
index 4d2e994228a..458c5400de9 100644
--- a/src/MongoDB.Driver.Core/Core/Servers/LoadBalancedServer.cs
+++ b/src/MongoDB.Driver.Core/Core/Servers/LoadBalancedServer.cs
@@ -16,11 +16,13 @@
using System;
using System.Net;
using System.Threading;
+using Microsoft.Extensions.Logging;
using MongoDB.Driver.Core.Clusters;
using MongoDB.Driver.Core.Configuration;
using MongoDB.Driver.Core.ConnectionPools;
using MongoDB.Driver.Core.Connections;
using MongoDB.Driver.Core.Events;
+using MongoDB.Driver.Core.Logging;
namespace MongoDB.Driver.Core.Servers
{
@@ -36,8 +38,8 @@ public LoadBalancedServer(
ServerSettings serverSettings,
EndPoint endPoint,
IConnectionPoolFactory connectionPoolFactory,
- IEventSubscriber eventSubscriber,
- ServerApi serverApi)
+ ServerApi serverApi,
+ EventLogger eventLogger)
: base(
clusterId,
clusterClock,
@@ -49,8 +51,8 @@ public LoadBalancedServer(
serverSettings,
endPoint,
connectionPoolFactory,
- eventSubscriber,
- serverApi)
+ serverApi,
+ eventLogger)
{
_baseDescription = _currentDescription = new ServerDescription(ServerId, endPoint, reasonChanged: "ServerInitialDescription");
}
diff --git a/src/MongoDB.Driver.Core/Core/Servers/RoundTripTimeMonitor.cs b/src/MongoDB.Driver.Core/Core/Servers/RoundTripTimeMonitor.cs
index 499f9bad24c..f7471e46584 100644
--- a/src/MongoDB.Driver.Core/Core/Servers/RoundTripTimeMonitor.cs
+++ b/src/MongoDB.Driver.Core/Core/Servers/RoundTripTimeMonitor.cs
@@ -17,7 +17,9 @@
using System.Diagnostics;
using System.Net;
using System.Threading;
+using Microsoft.Extensions.Logging;
using MongoDB.Driver.Core.Connections;
+using MongoDB.Driver.Core.Logging;
using MongoDB.Driver.Core.Misc;
namespace MongoDB.Driver.Core.Servers
@@ -44,13 +46,15 @@ internal sealed class RoundTripTimeMonitor : IRoundTripTimeMonitor
private Thread _roundTripTimeMonitorThread;
private readonly ServerApi _serverApi;
private readonly ServerId _serverId;
+ private readonly ILogger _logger;
public RoundTripTimeMonitor(
IConnectionFactory connectionFactory,
ServerId serverId,
EndPoint endpoint,
TimeSpan heartbeatInterval,
- ServerApi serverApi)
+ ServerApi serverApi,
+ ILogger logger)
{
_connectionFactory = Ensure.IsNotNull(connectionFactory, nameof(connectionFactory));
_serverId = Ensure.IsNotNull(serverId, nameof(serverId));
@@ -59,6 +63,8 @@ public RoundTripTimeMonitor(
_serverApi = serverApi;
_cancellationTokenSource = new CancellationTokenSource();
_cancellationToken = _cancellationTokenSource.Token;
+
+ _logger = logger;
}
public TimeSpan Average
@@ -77,11 +83,15 @@ public void Dispose()
{
if (!_disposed)
{
+ _logger?.LogDebug(_serverId, "Disposing");
+
_disposed = true;
_cancellationTokenSource.Cancel();
_cancellationTokenSource.Dispose();
try { _roundTripTimeConnection?.Dispose(); } catch { }
+
+ _logger?.LogDebug(_serverId, "Disposed");
}
}
@@ -106,6 +116,8 @@ void ThreadStart()
// private methods
private void MonitorServer()
{
+ _logger?.LogDebug(_serverId, "Monitoring started");
+
var helloOk = false;
while (!_cancellationToken.IsCancellationRequested)
{
@@ -127,7 +139,7 @@ private void MonitorServer()
helloOk = helloResult.HelloOk;
}
}
- catch (Exception)
+ catch (Exception ex)
{
IConnection toDispose;
lock (_lock)
@@ -135,7 +147,10 @@ private void MonitorServer()
toDispose = _roundTripTimeConnection;
_roundTripTimeConnection = null;
}
+ var connectionId = toDispose?.ConnectionId;
toDispose?.Dispose();
+
+ _logger?.LogDebug(ex, StructuredLogTemplateProviders.DriverConnectionId_Message, connectionId?.LongLocalValue, "Monitoring exception");
}
ThreadHelper.Sleep(_heartbeatInterval, _cancellationToken);
}
diff --git a/src/MongoDB.Driver.Core/Core/Servers/Server.cs b/src/MongoDB.Driver.Core/Core/Servers/Server.cs
index 3b16ad2741b..478f5677a48 100644
--- a/src/MongoDB.Driver.Core/Core/Servers/Server.cs
+++ b/src/MongoDB.Driver.Core/Core/Servers/Server.cs
@@ -28,6 +28,7 @@
using MongoDB.Driver.Core.ConnectionPools;
using MongoDB.Driver.Core.Connections;
using MongoDB.Driver.Core.Events;
+using MongoDB.Driver.Core.Logging;
using MongoDB.Driver.Core.Misc;
using MongoDB.Driver.Core.WireProtocol;
using MongoDB.Driver.Core.WireProtocol.Messages;
@@ -53,15 +54,10 @@ internal abstract class Server : IClusterableServer, IConnectionExceptionHandler
private readonly ServerSettings _settings;
private readonly InterlockedInt32 _state;
private readonly ServerApi _serverApi;
+ private readonly EventLogger _eventLogger;
private int _outstandingOperationsCount;
- private readonly Action _openingEventHandler;
- private readonly Action _openedEventHandler;
- private readonly Action _closingEventHandler;
- private readonly Action _closedEventHandler;
- private readonly Action _descriptionChangedEventHandler;
-
// constructors
public Server(
ClusterId clusterId,
@@ -74,8 +70,8 @@ public Server(
ServerSettings settings,
EndPoint endPoint,
IConnectionPoolFactory connectionPoolFactory,
- IEventSubscriber eventSubscriber,
- ServerApi serverApi)
+ ServerApi serverApi,
+ EventLogger eventLogger)
{
ClusterConnectionModeHelper.EnsureConnectionModeValuesAreValid(clusterConnectionMode, connectionModeSwitch, directConnection);
@@ -85,7 +81,6 @@ public Server(
_directConnection = directConnection;
_settings = Ensure.IsNotNull(settings, nameof(settings));
_endPoint = Ensure.IsNotNull(endPoint, nameof(endPoint));
- Ensure.IsNotNull(eventSubscriber, nameof(eventSubscriber));
_serverId = new ServerId(clusterId, endPoint);
_connectionPool = Ensure.IsNotNull(connectionPoolFactory, nameof(connectionPoolFactory)).CreateConnectionPool(_serverId, endPoint, this);
@@ -93,11 +88,7 @@ public Server(
_serverApi = serverApi;
_outstandingOperationsCount = 0;
- eventSubscriber.TryGetEventHandler(out _openingEventHandler);
- eventSubscriber.TryGetEventHandler(out _openedEventHandler);
- eventSubscriber.TryGetEventHandler(out _closingEventHandler);
- eventSubscriber.TryGetEventHandler(out _closedEventHandler);
- eventSubscriber.TryGetEventHandler(out _descriptionChangedEventHandler);
+ _eventLogger = Ensure.IsNotNull(eventLogger, nameof(eventLogger));
}
// events
@@ -110,6 +101,7 @@ public Server(
public EndPoint EndPoint => _endPoint;
public bool IsInitialized => _state.Value != State.Initial;
public ServerId ServerId => _serverId;
+ protected EventLogger EventLogger => _eventLogger;
int IClusterableServer.OutstandingOperationsCount => Interlocked.CompareExchange(ref _outstandingOperationsCount, 0, 0);
@@ -118,10 +110,7 @@ public void Dispose()
{
if (_state.TryChange(State.Disposed))
{
- if (_closingEventHandler != null)
- {
- _closingEventHandler(new ServerClosingEvent(_serverId));
- }
+ _eventLogger.LogAndPublish(new ServerClosingEvent(_serverId));
var stopwatch = Stopwatch.StartNew();
@@ -130,10 +119,7 @@ public void Dispose()
_connectionPool.Dispose();
stopwatch.Stop();
- if (_closedEventHandler != null)
- {
- _closedEventHandler(new ServerClosedEvent(_serverId, stopwatch.Elapsed));
- }
+ _eventLogger.LogAndPublish(new ServerClosedEvent(_serverId, stopwatch.Elapsed));
}
}
@@ -181,20 +167,14 @@ public void Initialize()
{
if (_state.TryChange(State.Initial, State.Open))
{
- if (_openingEventHandler != null)
- {
- _openingEventHandler(new ServerOpeningEvent(_serverId, _settings));
- }
+ _eventLogger.LogAndPublish(new ServerOpeningEvent(_serverId, _settings));
var stopwatch = Stopwatch.StartNew();
_connectionPool.Initialize();
InitializeSubClass();
stopwatch.Stop();
- if (_openedEventHandler != null)
- {
- _openedEventHandler(new ServerOpenedEvent(_serverId, _settings, stopwatch.Elapsed));
- }
+ _eventLogger.LogAndPublish(new ServerOpenedEvent(_serverId, _settings, stopwatch.Elapsed));
}
}
@@ -242,10 +222,9 @@ protected bool IsDirectConnection()
protected void TriggerServerDescriptionChanged(object sender, ServerDescriptionChangedEventArgs e)
{
- var shouldServerDescriptionChangedEventBePublished = !e.OldServerDescription.SdamEquals(e.NewServerDescription);
- if (shouldServerDescriptionChangedEventBePublished && _descriptionChangedEventHandler != null)
+ if (!e.OldServerDescription.SdamEquals(e.NewServerDescription))
{
- _descriptionChangedEventHandler(new ServerDescriptionChangedEvent(e.OldServerDescription, e.NewServerDescription));
+ _eventLogger.LogAndPublish(new ServerDescriptionChangedEvent(e.OldServerDescription, e.NewServerDescription));
}
var handler = DescriptionChanged;
diff --git a/src/MongoDB.Driver.Core/Core/Servers/ServerFactory.cs b/src/MongoDB.Driver.Core/Core/Servers/ServerFactory.cs
index 0dc29ab5eed..b8925339c52 100644
--- a/src/MongoDB.Driver.Core/Core/Servers/ServerFactory.cs
+++ b/src/MongoDB.Driver.Core/Core/Servers/ServerFactory.cs
@@ -14,10 +14,12 @@
*/
using System.Net;
+using Microsoft.Extensions.Logging;
using MongoDB.Driver.Core.Clusters;
using MongoDB.Driver.Core.Configuration;
using MongoDB.Driver.Core.ConnectionPools;
using MongoDB.Driver.Core.Events;
+using MongoDB.Driver.Core.Logging;
using MongoDB.Driver.Core.Misc;
namespace MongoDB.Driver.Core.Servers
@@ -35,6 +37,7 @@ internal class ServerFactory : IClusterableServerFactory
private readonly IEventSubscriber _eventSubscriber;
private readonly ServerApi _serverApi;
private readonly ServerSettings _settings;
+ private readonly ILoggerFactory _loggerFactory;
// constructors
public ServerFactory(
@@ -47,7 +50,8 @@ public ServerFactory(
IConnectionPoolFactory connectionPoolFactory,
IServerMonitorFactory serverMonitoryFactory,
IEventSubscriber eventSubscriber,
- ServerApi serverApi)
+ ServerApi serverApi,
+ ILoggerFactory loggerFactory)
{
ClusterConnectionModeHelper.EnsureConnectionModeValuesAreValid(clusterConnectionMode, connectionModeSwitch, directConnection);
@@ -59,6 +63,7 @@ public ServerFactory(
_serverMonitorFactory = Ensure.IsNotNull(serverMonitoryFactory, nameof(serverMonitoryFactory));
_eventSubscriber = Ensure.IsNotNull(eventSubscriber, nameof(eventSubscriber));
_serverApi = serverApi; // can be null
+ _loggerFactory = loggerFactory;
}
// methods
@@ -73,8 +78,8 @@ public IClusterableServer CreateServer(ClusterType clusterType, ClusterId cluste
_settings,
endPoint,
_connectionPoolFactory,
- _eventSubscriber,
- _serverApi),
+ _serverApi,
+ _loggerFactory.CreateEventLogger(_eventSubscriber)),
_ =>
new DefaultServer(
@@ -87,8 +92,8 @@ public IClusterableServer CreateServer(ClusterType clusterType, ClusterId cluste
endPoint,
_connectionPoolFactory,
_serverMonitorFactory,
- _eventSubscriber,
- _serverApi)
+ _serverApi,
+ _loggerFactory.CreateEventLogger(_eventSubscriber))
};
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Servers/ServerMonitor.cs b/src/MongoDB.Driver.Core/Core/Servers/ServerMonitor.cs
index 79afe1566e8..3f07c6ae7d9 100644
--- a/src/MongoDB.Driver.Core/Core/Servers/ServerMonitor.cs
+++ b/src/MongoDB.Driver.Core/Core/Servers/ServerMonitor.cs
@@ -17,9 +17,11 @@
using System.Diagnostics;
using System.Net;
using System.Threading;
+using Microsoft.Extensions.Logging;
using MongoDB.Bson;
using MongoDB.Driver.Core.Connections;
using MongoDB.Driver.Core.Events;
+using MongoDB.Driver.Core.Logging;
using MongoDB.Driver.Core.Misc;
using MongoDB.Driver.Core.WireProtocol;
@@ -35,6 +37,8 @@ internal sealed class ServerMonitor : IServerMonitor
private readonly EndPoint _endPoint;
private HeartbeatDelay _heartbeatDelay;
private readonly object _lock = new object();
+ private readonly EventLogger _eventLoggerSdam;
+ private readonly ILogger _logger;
private readonly CancellationToken _monitorCancellationToken; // used to cancel the entire monitor
private readonly CancellationTokenSource _monitorCancellationTokenSource; // used to cancel the entire monitor
private readonly IRoundTripTimeMonitor _roundTripTimeMonitor;
@@ -45,11 +49,6 @@ internal sealed class ServerMonitor : IServerMonitor
private Thread _serverMonitorThread;
- private readonly Action _heartbeatStartedEventHandler;
- private readonly Action _heartbeatSucceededEventHandler;
- private readonly Action _heartbeatFailedEventHandler;
- private readonly Action _sdamInformationEventHandler;
-
public event EventHandler DescriptionChanged;
public ServerMonitor(
@@ -58,7 +57,8 @@ public ServerMonitor(
IConnectionFactory connectionFactory,
ServerMonitorSettings serverMonitorSettings,
IEventSubscriber eventSubscriber,
- ServerApi serverApi)
+ ServerApi serverApi,
+ ILoggerFactory loggerFactory)
: this(
serverId,
endPoint,
@@ -70,8 +70,10 @@ public ServerMonitor(
serverId,
endPoint,
Ensure.IsNotNull(serverMonitorSettings, nameof(serverMonitorSettings)).HeartbeatInterval,
- serverApi),
- serverApi)
+ serverApi,
+ loggerFactory?.CreateLogger()),
+ serverApi,
+ loggerFactory)
{
}
@@ -82,7 +84,8 @@ public ServerMonitor(
ServerMonitorSettings serverMonitorSettings,
IEventSubscriber eventSubscriber,
IRoundTripTimeMonitor roundTripTimeMonitor,
- ServerApi serverApi)
+ ServerApi serverApi,
+ ILoggerFactory loggerFactory)
{
_monitorCancellationTokenSource = new CancellationTokenSource();
_serverId = Ensure.IsNotNull(serverId, nameof(serverId));
@@ -95,14 +98,13 @@ public ServerMonitor(
_roundTripTimeMonitor = Ensure.IsNotNull(roundTripTimeMonitor, nameof(roundTripTimeMonitor));
_state = new InterlockedInt32(State.Initial);
- eventSubscriber.TryGetEventHandler(out _heartbeatStartedEventHandler);
- eventSubscriber.TryGetEventHandler(out _heartbeatSucceededEventHandler);
- eventSubscriber.TryGetEventHandler(out _heartbeatFailedEventHandler);
- eventSubscriber.TryGetEventHandler(out _sdamInformationEventHandler);
_serverApi = serverApi;
_monitorCancellationToken = _monitorCancellationTokenSource.Token;
_heartbeatCancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(_monitorCancellationToken);
+
+ _logger = loggerFactory?.CreateLogger();
+ _eventLoggerSdam = loggerFactory.CreateEventLogger(eventSubscriber);
}
public ServerDescription Description => Interlocked.CompareExchange(ref _currentDescription, null, null);
@@ -133,6 +135,8 @@ public void Dispose()
{
if (_state.TryChange(State.Disposed))
{
+ _logger?.LogDebug(_serverId, "Disposing");
+
_monitorCancellationTokenSource.Cancel();
_monitorCancellationTokenSource.Dispose();
if (_connection != null)
@@ -140,6 +144,8 @@ public void Dispose()
_connection.Dispose();
}
_roundTripTimeMonitor.Dispose();
+
+ _logger?.LogDebug(_serverId, "Disposed");
}
}
@@ -147,9 +153,13 @@ public void Initialize()
{
if (_state.TryChange(State.Initial, State.Open))
{
+ _logger?.LogDebug(_serverId, "Initializing");
+
_roundTripTimeMonitor.Start();
_serverMonitorThread = new Thread(new ParameterizedThreadStart(ThreadStart)) { IsBackground = true };
_serverMonitorThread.Start(_monitorCancellationToken);
+
+ _logger?.LogDebug(_serverId, "Initialized");
}
void ThreadStart(object monitorCancellationToken)
@@ -237,22 +247,10 @@ private void MonitorServer(CancellationToken monitorCancellationToken)
catch (Exception unexpectedException)
{
// if we catch an exception here it's because of a bug in the driver (but we need to defend ourselves against that)
-
- var handler = _sdamInformationEventHandler;
- if (handler != null)
- {
- try
- {
- handler.Invoke(new SdamInformationEvent(() =>
- string.Format(
- "Unexpected exception in ServerMonitor.MonitorServer: {0}",
- unexpectedException.ToString())));
- }
- catch
- {
- // ignore any exceptions thrown by the handler (note: event handlers aren't supposed to throw exceptions)
- }
- }
+ _eventLoggerSdam.LogAndPublish(new SdamInformationEvent(
+ "Unexpected exception in ServerMonitor.MonitorServer: {0}",
+ unexpectedException),
+ unexpectedException);
// since an unexpected exception was thrown set the server description to Unknown (with the unexpected exception)
try
@@ -427,10 +425,8 @@ private HelloResult GetHelloResult(
CancellationToken cancellationToken)
{
cancellationToken.ThrowIfCancellationRequested();
- if (_heartbeatStartedEventHandler != null)
- {
- _heartbeatStartedEventHandler(new ServerHeartbeatStartedEvent(connection.ConnectionId, connection.Description.HelloResult.TopologyVersion != null));
- }
+
+ _eventLoggerSdam.LogAndPublish(new ServerHeartbeatStartedEvent(connection.ConnectionId, connection.Description.HelloResult.TopologyVersion != null));
try
{
@@ -438,19 +434,14 @@ private HelloResult GetHelloResult(
var helloResult = HelloHelper.GetResult(connection, helloProtocol, cancellationToken);
stopwatch.Stop();
- if (_heartbeatSucceededEventHandler != null)
- {
- _heartbeatSucceededEventHandler(new ServerHeartbeatSucceededEvent(connection.ConnectionId, stopwatch.Elapsed, connection.Description.HelloResult.TopologyVersion != null));
- }
+ _eventLoggerSdam.LogAndPublish(new ServerHeartbeatSucceededEvent(connection.ConnectionId, stopwatch.Elapsed, connection.Description.HelloResult.TopologyVersion != null));
return helloResult;
}
catch (Exception ex)
{
- if (_heartbeatFailedEventHandler != null)
- {
- _heartbeatFailedEventHandler(new ServerHeartbeatFailedEvent(connection.ConnectionId, ex, connection.Description.HelloResult.TopologyVersion != null));
- }
+ _eventLoggerSdam.LogAndPublish(new ServerHeartbeatFailedEvent(connection.ConnectionId, ex, connection.Description.HelloResult.TopologyVersion != null));
+
throw;
}
}
diff --git a/src/MongoDB.Driver.Core/Core/Servers/ServerMonitorFactory.cs b/src/MongoDB.Driver.Core/Core/Servers/ServerMonitorFactory.cs
index 1f08841fa04..81babd21467 100644
--- a/src/MongoDB.Driver.Core/Core/Servers/ServerMonitorFactory.cs
+++ b/src/MongoDB.Driver.Core/Core/Servers/ServerMonitorFactory.cs
@@ -14,6 +14,7 @@
*/
using System.Net;
+using Microsoft.Extensions.Logging;
using MongoDB.Driver.Core.Connections;
using MongoDB.Driver.Core.Events;
using MongoDB.Driver.Core.Misc;
@@ -24,6 +25,7 @@ internal class ServerMonitorFactory : IServerMonitorFactory
{
private readonly IConnectionFactory _connectionFactory;
private readonly IEventSubscriber _eventSubscriber;
+ private readonly ILoggerFactory _loggerFactory;
private readonly ServerMonitorSettings _serverMonitorSettings;
private readonly ServerApi _serverApi;
@@ -31,18 +33,20 @@ public ServerMonitorFactory(
ServerMonitorSettings serverMonitorSettings,
IConnectionFactory connectionFactory,
IEventSubscriber eventSubscriber,
- ServerApi serverApi)
+ ServerApi serverApi,
+ ILoggerFactory loggerFactory)
{
_serverMonitorSettings = Ensure.IsNotNull(serverMonitorSettings, nameof(serverMonitorSettings));
_connectionFactory = Ensure.IsNotNull(connectionFactory, nameof(connectionFactory));
_eventSubscriber = Ensure.IsNotNull(eventSubscriber, nameof(eventSubscriber));
_serverApi = serverApi;
+ _loggerFactory = loggerFactory;
}
///
public IServerMonitor Create(ServerId serverId, EndPoint endPoint)
{
- return new ServerMonitor(serverId, endPoint, _connectionFactory, _serverMonitorSettings, _eventSubscriber, _serverApi);
+ return new ServerMonitor(serverId, endPoint, _connectionFactory, _serverMonitorSettings, _eventSubscriber, _serverApi, _loggerFactory);
}
}
}
diff --git a/src/MongoDB.Driver.Core/MongoCursorNotFoundException.cs b/src/MongoDB.Driver.Core/MongoCursorNotFoundException.cs
index ff6c5ded58d..b7af5fb82d2 100644
--- a/src/MongoDB.Driver.Core/MongoCursorNotFoundException.cs
+++ b/src/MongoDB.Driver.Core/MongoCursorNotFoundException.cs
@@ -35,7 +35,7 @@ private static string FormatMessage(ConnectionId connectionId, long cursorId)
"Cursor {0} not found on server {1} using connection {2}.",
cursorId,
EndPointHelper.ToString(connectionId.ServerId.EndPoint),
- connectionId.ServerValue);
+ connectionId.LongServerValue);
}
#endregion
diff --git a/src/MongoDB.Driver.Core/MongoDB.Driver.Core.csproj b/src/MongoDB.Driver.Core/MongoDB.Driver.Core.csproj
index b0ee192a6c0..c45a6823ac0 100644
--- a/src/MongoDB.Driver.Core/MongoDB.Driver.Core.csproj
+++ b/src/MongoDB.Driver.Core/MongoDB.Driver.Core.csproj
@@ -1,51 +1,16 @@
- true
- true
- true
-
-
- netstandard2.0;netstandard2.1;net472
- netstandard2.0;netstandard2.1
- 9
- true
-
..\..\MongoDB.ruleset
MongoDB.Driver.Core
MongoDB.Driver.Core
- MongoDB Inc.
- Copyright © 2010-present MongoDB Inc.
Official MongoDB supported Driver Core library. See https://www.mongodb.com/docs/drivers/csharp/ for more details.
- MongoDB Inc.
- packageIcon.png
- true
Core Component of the Official MongoDB .NET Driver.
- https://www.mongodb.com/docs/drivers/csharp/
- License.txt
- mongodb;mongo;nosql
- en-US
- true
- snupkg
- true
-
-
-
-
-
-
-
- 0.0.0-local
- TRACE
-
-
-
- true
MongoDB.Driver
@@ -53,137 +18,15 @@
NU5100
-
-
- runtimes/win/native
- runtimes/linux/native
- runtimes/osx/native
-
-
-
-
- Core/Compression/Snappy/lib/win
- Core/Compression/Snappy/lib/linux
- Core/Compression/Snappy/lib/osx
-
-
-
-
-
-
-
- true
- $(CompressionWinRuntimesPath)
-
-
-
-
- true
- $(CompressionLinuxRuntimesPath)
-
-
-
-
- true
- $(CompressionOsxRuntimesPath)
-
-
-
-
-
-
-
-
-
- PreserveNewest
- %(FileName)%(Extension)
-
-
-
-
- PreserveNewest
- %(FileName)%(Extension)
-
-
-
-
- PreserveNewest
- %(FileName)%(Extension)
-
-
-
-
-
- Core/Compression/Zstandard/lib/win
- Core/Compression/Zstandard/lib/linux
- Core/Compression/Zstandard/lib/osx
-
-
-
-
-
-
-
- true
- $(CompressionWinRuntimesPath)
-
-
-
-
- true
- $(CompressionLinuxRuntimesPath)
-
-
-
-
- true
- $(CompressionOsxRuntimesPath)
-
-
-
-
-
-
-
-
-
- PreserveNewest
- %(FileName)%(Extension)
-
-
-
-
- PreserveNewest
- %(FileName)%(Extension)
-
-
-
-
- PreserveNewest
- %(FileName)%(Extension)
-
-
-
-
-
-
-
-
- true
- build
-
-
-
+
-
-
+
+
+
+
-
- all
- runtime; build; native; contentfiles; analyzers
-
@@ -200,9 +43,7 @@
-
-
diff --git a/src/MongoDB.Driver.Core/MongoDB.Driver.Core.targets b/src/MongoDB.Driver.Core/MongoDB.Driver.Core.targets
deleted file mode 100644
index f0397a0ad47..00000000000
--- a/src/MongoDB.Driver.Core/MongoDB.Driver.Core.targets
+++ /dev/null
@@ -1,35 +0,0 @@
-
-
-
-
- runtimes/win/native
- runtimes/linux/native
- runtimes/osx/native
-
-
-
-
-
-
-
- PreserveNewest
- %(FileName)%(Extension)
-
-
-
-
-
-
- PreserveNewest
- %(FileName)%(Extension)
-
-
-
-
-
-
- PreserveNewest
- %(FileName)%(Extension)
-
-
-
diff --git a/src/MongoDB.Driver.Core/MongoInternalDefaults.cs b/src/MongoDB.Driver.Core/MongoInternalDefaults.cs
index 43e69374426..2ae113b5cca 100644
--- a/src/MongoDB.Driver.Core/MongoInternalDefaults.cs
+++ b/src/MongoDB.Driver.Core/MongoInternalDefaults.cs
@@ -17,6 +17,11 @@ namespace MongoDB.Driver
{
internal static class MongoInternalDefaults
{
+ public static class Logging
+ {
+ public const int MaxDocumentSize = 1000;
+ }
+
public static class ConnectionPool
{
public const int MaxConnecting = 2;
diff --git a/src/MongoDB.Driver.Core/Properties/AssemblyInfo.cs b/src/MongoDB.Driver.Core/Properties/AssemblyInfo.cs
index 526c3b1bfe9..9ff4bda3868 100644
--- a/src/MongoDB.Driver.Core/Properties/AssemblyInfo.cs
+++ b/src/MongoDB.Driver.Core/Properties/AssemblyInfo.cs
@@ -26,6 +26,7 @@
[assembly: Preserve(AllMembers = true)]
[assembly: InternalsVisibleTo("MongoDB.Driver")]
+[assembly: InternalsVisibleTo("MongoDB.Driver.TestHelpers")]
[assembly: InternalsVisibleTo("MongoDB.Driver.Legacy")]
[assembly: InternalsVisibleTo("MongoDB.Driver.Core.FunctionalTests")]
[assembly: InternalsVisibleTo("MongoDB.Driver.Core.TestHelpers")]
diff --git a/src/MongoDB.Driver.GridFS/GridFSDownloadStreamBase.cs b/src/MongoDB.Driver.GridFS/GridFSDownloadStreamBase.cs
index 668e1ff6ad2..4e2089eb4eb 100644
--- a/src/MongoDB.Driver.GridFS/GridFSDownloadStreamBase.cs
+++ b/src/MongoDB.Driver.GridFS/GridFSDownloadStreamBase.cs
@@ -100,12 +100,13 @@ public override void Close(CancellationToken cancellationToken)
public override void Flush()
{
- throw new NotSupportedException();
+ // CSHARP-4377: Flush on read-only stream should be a NOP
}
public override Task FlushAsync(CancellationToken cancellationToken)
{
- throw new NotSupportedException();
+ // CSHARP-4377: Flush on read-only stream should be a NOP
+ return Task.CompletedTask;
}
public override void SetLength(long value)
diff --git a/src/MongoDB.Driver.GridFS/MongoDB.Driver.GridFS.csproj b/src/MongoDB.Driver.GridFS/MongoDB.Driver.GridFS.csproj
index eb07c7da513..3ad6a159c19 100644
--- a/src/MongoDB.Driver.GridFS/MongoDB.Driver.GridFS.csproj
+++ b/src/MongoDB.Driver.GridFS/MongoDB.Driver.GridFS.csproj
@@ -1,69 +1,21 @@
-
- true
-
- netstandard2.0;netstandard2.1;net472
- netstandard2.0;netstandard2.1
- 9
- true
-
..\..\MongoDB.ruleset
MongoDB.Driver.GridFS
MongoDB.Driver.GridFS
- MongoDB Inc.
- Copyright © 2010-present MongoDB Inc.
Official MongoDB supported driver for MongoDB GridFS implementation. See https://www.mongodb.com/docs/drivers/csharp/ for more details.
- MongoDB Inc.
- packageIcon.png
- true
GridFS Component of the Official MongoDB .NET Driver.
- https://www.mongodb.com/docs/drivers/csharp/
- License.txt
- mongodb;mongo;nosql;gridfs
- en-US
- true
- snupkg
- true
-
-
-
- 0.0.0-local
-
-
-
- TRACE
+ $(PackageTags);gridfs
-
-
-
-
-
- true
-
-
-
-
-
- all
- runtime; build; native; contentfiles; analyzers
-
-
-
-
-
-
-
-
diff --git a/src/MongoDB.Driver.Legacy/MongoDB.Driver.Legacy.csproj b/src/MongoDB.Driver.Legacy/MongoDB.Driver.Legacy.csproj
index 45513eba927..7d38736a63b 100644
--- a/src/MongoDB.Driver.Legacy/MongoDB.Driver.Legacy.csproj
+++ b/src/MongoDB.Driver.Legacy/MongoDB.Driver.Legacy.csproj
@@ -1,55 +1,19 @@
-
- true
-
- netstandard2.0;netstandard2.1;net472
- netstandard2.0;netstandard2.1
- 9
- true
-
..\..\MongoDBLegacy.ruleset
MongoDB.Driver.Legacy
MongoDB.Driver.Legacy
- MongoDB Inc.
- Copyright © 2010-present MongoDB Inc.
Legacy MongoDB supported driver for MongoDB. See https://www.mongodb.com/docs/drivers/csharp/ for more details.
- MongoDB Inc.
mongocsharpdriver
- packageIcon.png
- true
This package contains the legacy driver. The new driver's package name is MongoDB.Driver
- https://www.mongodb.com/docs/drivers/csharp/
- License.txt
- en-US
- true
- snupkg
- true
-
-
-
- 0.0.0-local
-
-
-
- all
- runtime; build; native; contentfiles; analyzers
-
-
-
- TRACE
-
-
-
- true
MongoDB.Driver
@@ -59,9 +23,4 @@
-
-
-
-
-
diff --git a/src/MongoDB.Driver.Legacy/MongoServerSettings.cs b/src/MongoDB.Driver.Legacy/MongoServerSettings.cs
index 129cafc85e8..71c4e9bdd43 100644
--- a/src/MongoDB.Driver.Legacy/MongoServerSettings.cs
+++ b/src/MongoDB.Driver.Legacy/MongoServerSettings.cs
@@ -565,12 +565,13 @@ public ConnectionStringScheme Scheme
///
/// Gets or set the name of the SDAM log file. Null turns logging off. stdout will log to console.
///
+ [Obsolete("Use MongoClientSettings.LoggerFactory instead.")]
public string SdamLogFilename
{
get { return _sdamLogFilename; }
set
{
- if (_isFrozen) { throw new InvalidOperationException("MongoClientSettings is frozen."); }
+ if (_isFrozen) { throw new InvalidOperationException("MongoServerSettings is frozen."); }
_sdamLogFilename = value;
}
}
@@ -821,7 +822,9 @@ public static MongoServerSettings FromClientSettings(MongoClientSettings clientS
serverSettings.RetryWrites = clientSettings.RetryWrites;
serverSettings.LocalThreshold = clientSettings.LocalThreshold;
serverSettings.Scheme = clientSettings.Scheme;
+#pragma warning disable CS0618 // Type or member is obsolete
serverSettings.SdamLogFilename = clientSettings.SdamLogFilename;
+#pragma warning restore CS0618 // Type or member is obsolete
serverSettings.Servers = new List(clientSettings.Servers);
serverSettings.ServerSelectionTimeout = clientSettings.ServerSelectionTimeout;
serverSettings.SocketTimeout = clientSettings.SocketTimeout;
@@ -897,7 +900,9 @@ public static MongoServerSettings FromUrl(MongoUrl url)
serverSettings.RetryWrites = url.RetryWrites ?? true;
serverSettings.LocalThreshold = url.LocalThreshold;
serverSettings.Scheme = url.Scheme;
+#pragma warning disable CS0618 // Type or member is obsolete
serverSettings.SdamLogFilename = null; // SdamLogFilename must be provided in code
+#pragma warning restore CS0618 // Type or member is obsolete
serverSettings.Servers = new List(url.Servers);
serverSettings.ServerSelectionTimeout = url.ServerSelectionTimeout;
serverSettings.SocketTimeout = url.SocketTimeout;
@@ -1204,6 +1209,7 @@ internal ClusterKey ToClusterKey()
_ipv6,
loadBalanced: false, // not supported for legacy, so turn it off
_localThreshold,
+ loggingSettings: null,
maxConnecting: MongoInternalDefaults.ConnectionPool.MaxConnecting,
_maxConnectionIdleTime,
_maxConnectionLifeTime,
diff --git a/src/MongoDB.Driver/AggregateBucketAutoResultIdSerializer.cs b/src/MongoDB.Driver/AggregateBucketAutoResultIdSerializer.cs
new file mode 100644
index 00000000000..7185dbdd45d
--- /dev/null
+++ b/src/MongoDB.Driver/AggregateBucketAutoResultIdSerializer.cs
@@ -0,0 +1,103 @@
+/* Copyright 2010-present MongoDB Inc.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+using MongoDB.Bson;
+using MongoDB.Bson.IO;
+using MongoDB.Bson.Serialization;
+using MongoDB.Bson.Serialization.Serializers;
+using MongoDB.Driver.Core.Misc;
+
+namespace MongoDB.Driver
+{
+ ///
+ /// Static factory class for AggregateBucketAutoResultIdSerializer.
+ ///
+ public static class AggregateBucketAutoResultIdSerializer
+ {
+ ///
+ /// Creates an instance of AggregateBucketAutoResultIdSerializer.
+ ///
+ /// The value type.
+ /// The value serializer.
+ /// A AggregateBucketAutoResultIdSerializer.
+ public static IBsonSerializer> Create(IBsonSerializer valueSerializer)
+ {
+ return new AggregateBucketAutoResultIdSerializer(valueSerializer);
+ }
+ }
+
+ ///
+ /// A serializer for AggregateBucketAutoResultId.
+ ///
+ /// The type of the values.
+ public class AggregateBucketAutoResultIdSerializer : ClassSerializerBase>, IBsonDocumentSerializer
+ {
+ private readonly IBsonSerializer _valueSerializer;
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The value serializer.
+ public AggregateBucketAutoResultIdSerializer(IBsonSerializer valueSerializer)
+ {
+ _valueSerializer = Ensure.IsNotNull(valueSerializer, nameof(valueSerializer));
+ }
+
+ ///
+ protected override AggregateBucketAutoResultId DeserializeValue(BsonDeserializationContext context, BsonDeserializationArgs args)
+ {
+ var reader = context.Reader;
+ reader.ReadStartDocument();
+ TValue min = default;
+ TValue max = default;
+ while (reader.ReadBsonType() != 0)
+ {
+ var name = reader.ReadName();
+ switch (name)
+ {
+ case "min": min = _valueSerializer.Deserialize(context); break;
+ case "max": max = _valueSerializer.Deserialize(context); break;
+ default: throw new BsonSerializationException($"Invalid element name for AggregateBucketAutoResultId: {name}.");
+ }
+ }
+ reader.ReadEndDocument();
+ return new AggregateBucketAutoResultId(min, max);
+ }
+
+ ///
+ protected override void SerializeValue(BsonSerializationContext context, BsonSerializationArgs args, AggregateBucketAutoResultId value)
+ {
+ var writer = context.Writer;
+ writer.WriteStartDocument();
+ writer.WriteName("min");
+ _valueSerializer.Serialize(context, value.Min);
+ writer.WriteName("max");
+ _valueSerializer.Serialize(context, value.Max);
+ writer.WriteEndDocument();
+ }
+
+ ///
+ public bool TryGetMemberSerializationInfo(string memberName, out BsonSerializationInfo serializationInfo)
+ {
+ serializationInfo = memberName switch
+ {
+ "Min" => new BsonSerializationInfo("min", _valueSerializer, _valueSerializer.ValueType),
+ "Max" => new BsonSerializationInfo("max", _valueSerializer, _valueSerializer.ValueType),
+ _ => null
+ };
+ return serializationInfo != null;
+ }
+ }
+}
diff --git a/src/MongoDB.Driver/AggregateExpressionDefinition.cs b/src/MongoDB.Driver/AggregateExpressionDefinition.cs
index 7bc36877946..aff5764d911 100644
--- a/src/MongoDB.Driver/AggregateExpressionDefinition.cs
+++ b/src/MongoDB.Driver/AggregateExpressionDefinition.cs
@@ -14,11 +14,13 @@
*/
using System;
+using System.Collections.Generic;
using System.Linq.Expressions;
using MongoDB.Bson;
using MongoDB.Bson.Serialization;
using MongoDB.Driver.Core.Misc;
using MongoDB.Driver.Linq;
+using MongoDB.Driver.Linq.Linq3Implementation.Misc;
using MongoDB.Driver.Linq.Linq3Implementation.Translators;
namespace MongoDB.Driver
@@ -147,4 +149,38 @@ public override BsonValue Render(IBsonSerializer sourceSerializer, IBso
return linqProvider.GetAdapter().TranslateExpressionToAggregateExpression(_expression, sourceSerializer, serializerRegistry, _translationOptions, contextData);
}
}
+
+ ///
+ /// An aggregate expression for the $documents stage.
+ ///
+ /// The type of the documents.
+ ///
+ public sealed class DocumentsAggregateExpressionDefinition : AggregateExpressionDefinition>
+ {
+ // private fields
+ private readonly IReadOnlyList _documents;
+ private readonly IBsonSerializer _documentSerializer;
+
+ // constructors
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The documents.
+ /// The document serializer.
+ public DocumentsAggregateExpressionDefinition(
+ IEnumerable documents,
+ IBsonSerializer documentSerializer = null)
+ {
+ _documents = Ensure.IsNotNull(documents, nameof(documents)).AsReadOnlyList();
+ _documentSerializer = documentSerializer; // can be null
+ }
+
+ // public methods
+ ///
+ public override BsonValue Render(IBsonSerializer sourceSerializer, IBsonSerializerRegistry serializerRegistry, LinqProvider linqProvider)
+ {
+ var documentSerializer = _documentSerializer ?? serializerRegistry.GetSerializer();
+ return SerializationHelper.SerializeValues(documentSerializer, _documents);
+ }
+ }
}
diff --git a/src/MongoDB.Driver/AggregateFluent.cs b/src/MongoDB.Driver/AggregateFluent.cs
index 6479c61822c..f4732d3fc69 100644
--- a/src/MongoDB.Driver/AggregateFluent.cs
+++ b/src/MongoDB.Driver/AggregateFluent.cs
@@ -13,13 +13,14 @@
* limitations under the License.
*/
-using MongoDB.Bson;
-using MongoDB.Bson.Serialization;
-using MongoDB.Driver.Core.Misc;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
+using MongoDB.Bson;
+using MongoDB.Bson.Serialization;
+using MongoDB.Driver.Core.Misc;
+using MongoDB.Driver.Search;
namespace MongoDB.Driver
{
@@ -146,7 +147,7 @@ public override IAggregateFluent Group(ProjectionDefinit
return WithPipeline(_pipeline.Group(group));
}
- public override IAggregateFluent Limit(int limit)
+ public override IAggregateFluent Limit(long limit)
{
return WithPipeline(_pipeline.Limit(limit));
}
@@ -238,6 +239,24 @@ public override IAggregateFluent ReplaceWith(AggregateEx
return WithPipeline(_pipeline.ReplaceWith(newRoot));
}
+ public override IAggregateFluent Search(
+ SearchDefinition searchDefinition,
+ SearchHighlightOptions highlight = null,
+ string indexName = null,
+ SearchCountOptions count = null,
+ bool returnStoredSource = false)
+ {
+ return WithPipeline(_pipeline.Search(searchDefinition, highlight, indexName, count, returnStoredSource));
+ }
+
+ public override IAggregateFluent SearchMeta(
+ SearchDefinition searchDefinition,
+ string indexName = null,
+ SearchCountOptions count = null)
+ {
+ return WithPipeline(_pipeline.SearchMeta(searchDefinition, indexName, count));
+ }
+
public override IAggregateFluent SetWindowFields(
AggregateExpressionDefinition, TWindowFields> output)
{
@@ -259,7 +278,7 @@ public override IAggregateFluent SetWindowFields