diff --git a/README.md b/README.md index 7d6b563..5f608c5 100644 --- a/README.md +++ b/README.md @@ -368,7 +368,12 @@ When this method is called, each time a database or collection is requested with * A randomly named database is provided to your code. When you dispose of the `IServiceProvider`, the related resources are destroyed. We leverage internal caching to avoid running multiple instances of MongoDB servers concurrently, opting instead to reuse a single instance. This method allows you to run multiple concurrent tests, each with their own MongoDB database. If your test runner crashes, the MongoDB process will be terminated, preventing orphaned processes from consuming unnecessary resources. - + +Available environment variables: +- `WORKLEAP_EXTENSIONS_MONGO_EPHEMERAL_BINARYDIRECTORY`: Specify the path of the MongoDB binaries +- `WORKLEAP_EXTENSIONS_MONGO_EPHEMERAL_DATADIRECTORY`: Specify the path to store data +- `WORKLEAP_EXTENSIONS_MONGO_EPHEMERAL_CONNECTIONTIMEOUT`: Specify the timeout to connect to the database +- `WORKLEAP_EXTENSIONS_MONGO_EPHEMERAL_USESINGLENODEREPLICASET`: Configure the replicaset ## Included Roslyn analyzers diff --git a/src/Workleap.Extensions.Mongo.Ephemeral/ReusableMongoRunner.cs b/src/Workleap.Extensions.Mongo.Ephemeral/ReusableMongoRunner.cs index bc27bfe..9d89bce 100644 --- a/src/Workleap.Extensions.Mongo.Ephemeral/ReusableMongoRunner.cs +++ b/src/Workleap.Extensions.Mongo.Ephemeral/ReusableMongoRunner.cs @@ -1,3 +1,4 @@ +using System.Globalization; using EphemeralMongo; namespace Workleap.Extensions.Mongo.Ephemeral; @@ -33,12 +34,43 @@ public void Rent(Guid renter) // The lock and use count prevent multiple instances of local mongod processes for a same named MongoClient // that would degrade the overall performance. - this._runner ??= MongoRunner.Run(new MongoRunnerOptions + var options = new MongoRunnerOptions { UseSingleNodeReplicaSet = true, KillMongoProcessesWhenCurrentProcessExits = true, - }); + }; + var binaryDirectory = Environment.GetEnvironmentVariable("WORKLEAP_EXTENSIONS_MONGO_EPHEMERAL_BINARYDIRECTORY")?.Trim(); + if (!string.IsNullOrEmpty(binaryDirectory)) + { + options.BinaryDirectory = binaryDirectory; + } + + var dataDirectory = Environment.GetEnvironmentVariable("WORKLEAP_EXTENSIONS_MONGO_EPHEMERAL_DATADIRECTORY")?.Trim(); + if (!string.IsNullOrEmpty(dataDirectory)) + { + options.DataDirectory = dataDirectory; + } + + var additionalArguments = Environment.GetEnvironmentVariable("WORKLEAP_EXTENSIONS_MONGO_EPHEMERAL_ADDITIONALARGUMENTS")?.Trim(); + if (!string.IsNullOrEmpty(additionalArguments)) + { + options.AdditionalArguments = additionalArguments; + } + + var connectionTimeout = Environment.GetEnvironmentVariable("WORKLEAP_EXTENSIONS_MONGO_EPHEMERAL_CONNECTIONTIMEOUT")?.Trim(); + if (TimeSpan.TryParse(connectionTimeout, CultureInfo.InvariantCulture, out var parsedConnectionTimeout)) + { + options.ConnectionTimeout = parsedConnectionTimeout; + } + + var useSingleNodeReplicaSet = Environment.GetEnvironmentVariable("WORKLEAP_EXTENSIONS_MONGO_EPHEMERAL_USESINGLENODEREPLICASET")?.Trim(); + if (bool.TryParse(useSingleNodeReplicaSet, out var parsedUseSingleNodeReplicaSet)) + { + options.UseSingleNodeReplicaSet = parsedUseSingleNodeReplicaSet; + } + + this._runner ??= MongoRunner.Run(options); this._useCount++; this._connectionString = this._runner.ConnectionString; this._renters.Add(renter);