/// <summary>
 /// Throws if the read concern value is not the server default and read concern is not supported.
 /// </summary>
 /// <param name="serverVersion">The server version.</param>
 /// <param name="value">The value.</param>
 public void ThrowIfNotSupported(SemanticVersion serverVersion, ReadConcern value)
 {
     if (!value.IsServerDefault && !base.IsSupported(serverVersion))
     {
         throw new MongoClientException($"Server version {serverVersion} does not support read concern.");
     }
 }
        public void ToBsonDocument_should_return_expected_result(ReadConcernLevel? level, string json)
        {
            var subject = new ReadConcern(level);
            var result = subject.ToBsonDocument();

            result.Should().Be(json);
        }
        public void Constructor_with_level_should_initialize_instance(
            [Values(ReadConcernLevel.Local, ReadConcernLevel.Majority, null)]
            ReadConcernLevel? level)
        {
            var result = new ReadConcern(level);

            result.Level.Should().Be(level);
        }
 /// <summary>
 /// Initializes a new instance of the <see cref="GridFSBucketOptions"/> class.
 /// </summary>
 /// <param name="other">The other <see cref="ImmutableGridFSBucketOptions"/> from which to copy the values.</param>
 public GridFSBucketOptions(ImmutableGridFSBucketOptions other)
 {
     Ensure.IsNotNull(other, nameof(other));
     _bucketName = other.BucketName;
     _chunkSizeBytes = other.ChunkSizeBytes;
     _readConcern = other.ReadConcern;
     _readPreference = other.ReadPreference;
     _writeConcern = other.WriteConcern;
 }
        public void CreateCommand_should_create_the_correct_command(
            [Values("3.0.0", "3.2.0")] string serverVersionString,
            [Values(null, ReadConcernLevel.Local, ReadConcernLevel.Majority)] ReadConcernLevel? readConcernLevel)
        {
            var serverVersion = SemanticVersion.Parse(serverVersionString);
            var filter = new BsonDocument("x", 1);
            var limit = 10;
            var maxDistance = 30;
            var maxTime = TimeSpan.FromMilliseconds(50);
            var near = new BsonArray { 10, 20 };
            var readConcern = new ReadConcern(readConcernLevel);
            var subject = new GeoSearchOperation<BsonDocument>(_collectionNamespace, near, BsonDocumentSerializer.Instance, _messageEncoderSettings)
            {
                Search = filter,
                Limit = limit,
                MaxDistance = maxDistance,
                MaxTime = maxTime,
                ReadConcern = readConcern
            };

            if (!readConcern.IsServerDefault && !Feature.ReadConcern.IsSupported(serverVersion))
            {
                var exception = Record.Exception(() => subject.CreateCommand(serverVersion));

                exception.Should().BeOfType<MongoClientException>();
            }
            else
            {
                var result = subject.CreateCommand(serverVersion);

                var expectedResult = new BsonDocument
                {
                    { "geoSearch", _collectionNamespace.CollectionName },
                    { "near", near },
                    { "limit", limit },
                    { "maxDistance", maxDistance },
                    { "search", filter },
                    { "maxTimeMS", maxTime.TotalMilliseconds },
                    { "readConcern", () => readConcern.ToBsonDocument(), !readConcern.IsServerDefault }
                };
                result.Should().Be(expectedResult);

            }
        }
示例#6
0
 public IMongoCollection <TDocument> WithReadConcern(ReadConcern readConcern)
 {
     throw new NotImplementedException();
 }
示例#7
0
        private void CreateClient(BsonDocument entity, out DisposableMongoClient client, out EventCapturer eventCapturer)
        {
            var eventTypesToCapture = new List <string>();
            var commandNamesToSkip  = new List <string>
            {
                "authenticate",
                "buildInfo",
                "configureFailPoint",
                "getLastError",
                "getnonce",
                "isMaster",
                "saslContinue",
                "saslStart"
            };

            var readConcern             = ReadConcern.Default;
            var retryReads              = true;
            var retryWrites             = true;
            var useMultipleShardRouters = false;
            var writeConcern            = WriteConcern.Acknowledged;

            foreach (var element in entity)
            {
                switch (element.Name)
                {
                case "id":
                    // handled on higher level
                    break;

                case "useMultipleMongoses":
                    useMultipleShardRouters = element.Value.AsBoolean;
                    break;

                case "observeEvents":
                    eventTypesToCapture.AddRange(element.Value.AsBsonArray.Select(x => x.AsString));
                    break;

                case "ignoreCommandMonitoringEvents":
                    commandNamesToSkip.AddRange(element.Value.AsBsonArray.Select(x => x.AsString));
                    break;

                case "uriOptions":
                    foreach (var option in element.Value.AsBsonDocument)
                    {
                        switch (option.Name)
                        {
                        case "retryWrites":
                            retryWrites = option.Value.AsBoolean;
                            break;

                        case "retryReads":
                            retryReads = option.Value.AsBoolean;
                            break;

                        case "readConcernLevel":
                            var levelValue = option.Value.AsString;
                            var level      = (ReadConcernLevel)Enum.Parse(typeof(ReadConcernLevel), levelValue, true);
                            readConcern = new ReadConcern(level);
                            break;

                        case "w":
                            writeConcern = new WriteConcern(option.Value.AsInt32);
                            break;

                        default:
                            throw new FormatException($"Unrecognized client uriOption name: '{option.Name}'.");
                        }
                    }
                    break;

                default:
                    throw new FormatException($"Unrecognized client entity field: '{element.Name}'.");
                }
            }

            eventCapturer = null;
            if (eventTypesToCapture.Count > 0)
            {
                eventCapturer = new EventCapturer();
                foreach (var eventTypeToCapture in eventTypesToCapture)
                {
                    switch (eventTypeToCapture)
                    {
                    case "commandStartedEvent":
                        eventCapturer = eventCapturer.Capture <CommandStartedEvent>(x => !commandNamesToSkip.Contains(x.CommandName));
                        break;

                    case "commandSucceededEvent":
                        eventCapturer = eventCapturer.Capture <CommandSucceededEvent>(x => !commandNamesToSkip.Contains(x.CommandName));
                        break;

                    case "commandFailedEvent":
                        eventCapturer = eventCapturer.Capture <CommandFailedEvent>(x => !commandNamesToSkip.Contains(x.CommandName));
                        break;

                    default:
                        throw new FormatException($"Invalid event name: {eventTypeToCapture}.");
                    }
                }
            }

            var localEventCapturer = eventCapturer; // copy value of eventCapturer ref variable to a local variable (to avoid error CS1628)

            client = DriverTestConfiguration.CreateDisposableClient(
                settings =>
            {
                settings.RetryReads        = retryReads;
                settings.RetryWrites       = retryWrites;
                settings.ReadConcern       = readConcern;
                settings.WriteConcern      = writeConcern;
                settings.HeartbeatInterval = TimeSpan.FromMilliseconds(5);     // the default value for spec tests
                if (localEventCapturer != null)
                {
                    settings.ClusterConfigurator = c => c.Subscribe(localEventCapturer);
                }
            },
                useMultipleShardRouters);
        }
        public void TestWithReadConcern()
        {
            var originalReadConcern = new ReadConcern(ReadConcernLevel.Linearizable);
            var subject = __server.WithReadConcern(originalReadConcern);
            var newReadConcern = new ReadConcern(ReadConcernLevel.Majority);

            var result = subject.WithReadConcern(newReadConcern);

            subject.Settings.ReadConcern.Should().BeSameAs(originalReadConcern);
            result.Settings.ReadConcern.Should().BeSameAs(newReadConcern);
            result.WithReadConcern(originalReadConcern).Settings.Should().Be(subject.Settings);
        }
示例#9
0
 public abstract IMongoDatabase WithReadConcern(ReadConcern readConcern);
        public void Execute_should_return_expected_result_when_ReadConcern_is_set(
            [Values(null, ReadConcernLevel.Local)]
            ReadConcernLevel? level,
            [Values(false, true)]
            bool async)
        {
            RequireServer.Check().Supports(Feature.Aggregate, Feature.ReadConcern);
            EnsureTestData();
            var readConcern = new ReadConcern(level);
            var subject = new AggregateOperation<BsonDocument>(_collectionNamespace, __pipeline, __resultSerializer, _messageEncoderSettings)
            {
                ReadConcern = readConcern
            };

            var cursor = ExecuteOperation(subject, async);
            var result = ReadCursorToEnd(cursor, async);

            result.Should().NotBeNull();
            result.Should().HaveCount(1);
        }
示例#11
0
 public FileDocumentTypeBuilder <T> WithReadConcern(ReadConcern readConcern)
 {
     ReadConcern = readConcern;
     _apply(this);
     return(this);
 }
        public void CreateCommand_should_include_read_concern_when_appropriate(
            [Values(null, ReadConcernLevel.Local, ReadConcernLevel.Majority)] ReadConcernLevel? readConcernLevel)
        {
            var readConcern = new ReadConcern(readConcernLevel);
            var mapFunction = "function() { emit(this.x, this.v); }";
            var reduceFunction = "function(key, values) { var sum = 0; for (var i = 0; i < values.length; i++) { sum += values[i]; }; return sum; }";
            var subject = new MapReduceLegacyOperation(_collectionNamespace, mapFunction, reduceFunction, _messageEncoderSettings)
            {
                ReadConcern = readConcern
            };

            var command = subject.CreateCommand(new SemanticVersion(3, 2, 0));

            if (readConcern.IsServerDefault)
            {
                command.Contains("readConcern").Should().BeFalse();
            }
            else
            {
                command["readConcern"].Should().Be(readConcern.ToBsonDocument());
            }
        }
示例#13
0
 public IMongoClient WithReadConcern(ReadConcern readConcern)
 {
     return(this);
 }
示例#14
0
        private (DisposableMongoClient Client, Dictionary <string, EventCapturer> ClientEventCapturers) CreateClient(BsonDocument entity)
        {
            string appName = null;
            var    clientEventCapturers       = new Dictionary <string, EventCapturer>();
            string clientId                   = null;
            var    commandNamesToSkipInEvents = new List <string>();
            List <(string Key, IEnumerable <string> Events, List <string> CommandNotToCapture)> eventTypesToCapture = new ();
            bool?    loadBalanced             = null;
            int?     maxPoolSize              = null;
            bool?    observeSensitiveCommands = null;
            var      readConcern              = ReadConcern.Default;
            var      retryReads              = true;
            var      retryWrites             = true;
            var      useMultipleShardRouters = false;
            TimeSpan?waitQueueTimeout        = null;
            var      writeConcern            = WriteConcern.Acknowledged;
            var      serverApi = CoreTestConfiguration.ServerApi;

            foreach (var element in entity)
            {
                switch (element.Name)
                {
                case "id":
                    clientId = element.Value.AsString;
                    break;

                case "uriOptions":
                    foreach (var option in element.Value.AsBsonDocument)
                    {
                        switch (option.Name)
                        {
                        case "appname":
                            appName = option.Value.ToString();
                            break;

                        case "loadBalanced":
                            loadBalanced = option.Value.ToBoolean();
                            break;

                        case "maxPoolSize":
                            maxPoolSize = option.Value.ToInt32();
                            break;

                        case "retryWrites":
                            retryWrites = option.Value.AsBoolean;
                            break;

                        case "retryReads":
                            retryReads = option.Value.AsBoolean;
                            break;

                        case "readConcernLevel":
                            var levelValue = option.Value.AsString;
                            var level      = (ReadConcernLevel)Enum.Parse(typeof(ReadConcernLevel), levelValue, true);
                            readConcern = new ReadConcern(level);
                            break;

                        case "w":
                            writeConcern = new WriteConcern(option.Value.AsInt32);
                            break;

                        case "waitQueueTimeoutMS":
                            waitQueueTimeout = TimeSpan.FromMilliseconds(option.Value.ToInt32());
                            break;

                        default:
                            throw new FormatException($"Invalid client uriOption argument name: '{option.Name}'.");
                        }
                    }
                    break;

                case "useMultipleMongoses":
                    useMultipleShardRouters = element.Value.AsBoolean;
                    RequireServer.Check().MultipleMongosesIfSharded(required: useMultipleShardRouters);
                    break;

                case "observeEvents":
                    var observeEvents = element.Value.AsBsonArray.Select(x => x.AsString);
                    eventTypesToCapture.Add(
                        (Key: Ensure.IsNotNull(clientId, nameof(clientId)),
                         Events: observeEvents,
                         CommandNotToCapture: commandNamesToSkipInEvents));
                    break;

                case "observeSensitiveCommands":
                    observeSensitiveCommands = element.Value.AsBoolean;
                    break;

                case "ignoreCommandMonitoringEvents":
                    commandNamesToSkipInEvents.AddRange(element.Value.AsBsonArray.Select(x => x.AsString));
                    break;

                case "serverApi":
                    ServerApiVersion serverApiVersion           = null;
                    bool?            serverApiStrict            = null;
                    bool?            serverApiDeprecationErrors = null;
                    foreach (var option in element.Value.AsBsonDocument)
                    {
                        switch (option.Name)
                        {
                        case "version":
                            var serverApiVersionString = option.Value.AsString;
                            switch (serverApiVersionString)
                            {
                            case "1":
                                serverApiVersion = ServerApiVersion.V1;
                                break;

                            default:
                                throw new FormatException($"Invalid serverApi version: '{serverApiVersionString}'.");
                            }
                            break;

                        case "strict":
                            serverApiStrict = option.Value.AsBoolean;
                            break;

                        case "deprecationErrors":
                            serverApiDeprecationErrors = option.Value.AsBoolean;
                            break;

                        default:
                            throw new FormatException($"Invalid client serverApi argument name: '{option.Name}'.");
                        }
                    }
                    if (serverApiVersion != null)
                    {
                        serverApi = new ServerApi(serverApiVersion, serverApiStrict, serverApiDeprecationErrors);
                    }
                    break;

                case "storeEventsAsEntities":
                    var eventsBatches = element.Value.AsBsonArray;
                    foreach (var batch in eventsBatches.Cast <BsonDocument>())
                    {
                        var id     = batch["id"].AsString;
                        var events = batch["events"].AsBsonArray.Select(e => e.AsString);
                        eventTypesToCapture.Add((id, events, CommandNotToCapture: null));
                    }
                    break;

                default:
                    throw new FormatException($"Invalid client argument name: '{element.Name}'.");
                }
            }

            // Regardless of whether events are observed, we still need to track some info about the pool in order to implement
            // the assertNumberConnectionsCheckedOut operation
            if (eventTypesToCapture.Count == 0)
            {
                eventTypesToCapture.Add(
                    (Key: Ensure.IsNotNull(clientId, nameof(clientId)),
                     Events: new[] { "connectionCheckedInEvent", "connectionCheckedOutEvent" },
                     CommandNotToCapture: commandNamesToSkipInEvents));
            }

            var defaultCommandNamesToSkip = new List <string>
            {
                "buildInfo",
                "configureFailPoint",
                "getLastError",
                OppressiveLanguageConstants.LegacyHelloCommandName,  // skip handshake events, should be reconsidered in the scope of CSHARP-3823
                "hello"
            };

            if (!observeSensitiveCommands.GetValueOrDefault())
            {
                defaultCommandNamesToSkip.AddRange(new[]
                {
                    "authenticate",
                    "getnonce",
                    "saslContinue",
                    "saslStart"
                });
            }

            foreach (var eventsDetails in eventTypesToCapture)
            {
                var commandNamesNotToCapture = Enumerable.Concat(eventsDetails.CommandNotToCapture ?? Enumerable.Empty <string>(), defaultCommandNamesToSkip);
                var formatter     = _eventFormatters.ContainsKey(eventsDetails.Key) ? _eventFormatters[eventsDetails.Key] : null;
                var eventCapturer = CreateEventCapturer(eventsDetails.Events, commandNamesNotToCapture, formatter);
                clientEventCapturers.Add(eventsDetails.Key, eventCapturer);
            }

            var eventCapturers = clientEventCapturers.Select(c => c.Value).ToArray();
            var client         = DriverTestConfiguration.CreateDisposableClient(
                settings =>
            {
                settings.ApplicationName       = appName;
                settings.LoadBalanced          = loadBalanced.GetValueOrDefault(defaultValue: settings.LoadBalanced);
                settings.MaxConnectionPoolSize = maxPoolSize.GetValueOrDefault(defaultValue: settings.MaxConnectionPoolSize);
                settings.RetryReads            = retryReads;
                settings.RetryWrites           = retryWrites;
                settings.ReadConcern           = readConcern;
                settings.WaitQueueTimeout      = waitQueueTimeout.GetValueOrDefault(defaultValue: settings.WaitQueueTimeout);
                settings.WriteConcern          = writeConcern;
                settings.HeartbeatInterval     = TimeSpan.FromMilliseconds(5); // the default value for spec tests
                settings.ServerApi             = serverApi;
                if (eventCapturers.Length > 0)
                {
                    settings.ClusterConfigurator = c =>
                    {
                        foreach (var eventCapturer in eventCapturers)
                        {
                            c.Subscribe(eventCapturer);
                        }
                    };
                }
            },
                _loggerFactory.CreateLogger <DisposableMongoClient>(),
                useMultipleShardRouters);

            return(client, clientEventCapturers);
        }
示例#15
0
        private IClientSessionHandle CreateSession(BsonDocument entity, Dictionary <string, DisposableMongoClient> clients)
        {
            IMongoClient         client  = null;
            ClientSessionOptions options = null;

            foreach (var element in entity)
            {
                switch (element.Name)
                {
                case "id":
                    // handled on higher level
                    break;

                case "client":
                    var clientId = element.Value.AsString;
                    client = clients[clientId];
                    break;

                case "sessionOptions":
                    options = new ClientSessionOptions();
                    foreach (var option in element.Value.AsBsonDocument)
                    {
                        switch (option.Name)
                        {
                        case "causalConsistency":
                            options.CausalConsistency = option.Value.ToBoolean();
                            break;

                        case "defaultTransactionOptions":
                            ReadConcern    readConcern    = null;
                            ReadPreference readPreference = null;
                            WriteConcern   writeConcern   = null;
                            foreach (var transactionOption in option.Value.AsBsonDocument)
                            {
                                switch (transactionOption.Name)
                                {
                                case "readConcern":
                                    readConcern = ReadConcern.FromBsonDocument(transactionOption.Value.AsBsonDocument);
                                    break;

                                case "readPreference":
                                    readPreference = ReadPreference.FromBsonDocument(transactionOption.Value.AsBsonDocument);
                                    break;

                                case "writeConcern":
                                    writeConcern = WriteConcern.FromBsonDocument(transactionOption.Value.AsBsonDocument);
                                    break;

                                default:
                                    throw new FormatException($"Invalid session transaction option: '{transactionOption.Name}'.");
                                }
                            }
                            options.DefaultTransactionOptions = new TransactionOptions(readConcern, readPreference, writeConcern);
                            break;

                        default:
                            throw new FormatException($"Unrecognized session option: '{option.Name}'.");
                        }
                    }
                    break;

                default:
                    throw new FormatException($"Unrecognized database entity field: '{element.Name}'.");
                }
            }

            var session = client.StartSession(options);

            return(session);
        }
示例#16
0
        private (DisposableMongoClient Client, Dictionary <string, EventCapturer> ClientEventCapturers) CreateClient(BsonDocument entity)
        {
            var    clientEventCapturers       = new Dictionary <string, EventCapturer>();
            string clientId                   = null;
            var    commandNamesToSkipInEvents = new List <string>();
            List <(string Key, IEnumerable <string> Events, List <string> CommandNotToCapture)> eventTypesToCapture = new ();
            var       readConcern             = ReadConcern.Default;
            var       retryReads              = true;
            var       retryWrites             = true;
            var       useMultipleShardRouters = false;
            var       writeConcern            = WriteConcern.Acknowledged;
            ServerApi serverApi = null;

            foreach (var element in entity)
            {
                switch (element.Name)
                {
                case "id":
                    clientId = element.Value.AsString;
                    break;

                case "uriOptions":
                    foreach (var option in element.Value.AsBsonDocument)
                    {
                        switch (option.Name)
                        {
                        case "retryWrites":
                            retryWrites = option.Value.AsBoolean;
                            break;

                        case "retryReads":
                            retryReads = option.Value.AsBoolean;
                            break;

                        case "readConcernLevel":
                            var levelValue = option.Value.AsString;
                            var level      = (ReadConcernLevel)Enum.Parse(typeof(ReadConcernLevel), levelValue, true);
                            readConcern = new ReadConcern(level);
                            break;

                        case "w":
                            writeConcern = new WriteConcern(option.Value.AsInt32);
                            break;

                        default:
                            throw new FormatException($"Unrecognized client uriOption name: '{option.Name}'.");
                        }
                    }
                    break;

                case "useMultipleMongoses":
                    useMultipleShardRouters = element.Value.AsBoolean;
                    break;

                case "observeEvents":
                    var observeEvents = element.Value.AsBsonArray.Select(x => x.AsString);
                    eventTypesToCapture.Add(
                        (Key: Ensure.IsNotNull(clientId, nameof(clientId)),
                         Events: observeEvents,
                         CommandNotToCapture: commandNamesToSkipInEvents));
                    break;

                case "ignoreCommandMonitoringEvents":
                    commandNamesToSkipInEvents.AddRange(element.Value.AsBsonArray.Select(x => x.AsString));
                    break;

                case "serverApi":
                    ServerApiVersion serverApiVersion           = null;
                    bool?            serverApiStrict            = null;
                    bool?            serverApiDeprecationErrors = null;
                    foreach (var option in element.Value.AsBsonDocument)
                    {
                        switch (option.Name)
                        {
                        case "version":
                            var serverApiVersionString = option.Value.AsString;
                            switch (serverApiVersionString)
                            {
                            case "1":
                                serverApiVersion = ServerApiVersion.V1;
                                break;

                            default:
                                throw new FormatException($"Unrecognized serverApi version: '{serverApiVersionString}'.");
                            }
                            break;

                        case "strict":
                            serverApiStrict = option.Value.AsBoolean;
                            break;

                        case "deprecationErrors":
                            serverApiDeprecationErrors = option.Value.AsBoolean;
                            break;

                        default:
                            throw new FormatException($"Unrecognized client serverApi option name: '{option.Name}'.");
                        }
                    }
                    if (serverApiVersion != null)
                    {
                        serverApi = new ServerApi(serverApiVersion, serverApiStrict, serverApiDeprecationErrors);
                    }
                    break;

                case "storeEventsAsEntities":
                    var eventsBatches = element.Value.AsBsonArray;
                    foreach (var batch in eventsBatches.Cast <BsonDocument>())
                    {
                        var id     = batch["id"].AsString;
                        var events = batch["events"].AsBsonArray.Select(e => e.AsString);
                        eventTypesToCapture.Add((id, events, CommandNotToCapture: null));
                    }
                    break;

                default:
                    throw new FormatException($"Unrecognized client entity field: '{element.Name}'.");
                }
            }

            if (eventTypesToCapture.Count > 0)
            {
                var defaultCommandNamesToSkip = new List <string>
                {
                    "authenticate",
                    "buildInfo",
                    "configureFailPoint",
                    "getLastError",
                    "getnonce",
                    "isMaster",
                    "saslContinue",
                    "saslStart"
                };

                foreach (var eventsDetails in eventTypesToCapture)
                {
                    var commandNamesNotToCapture = Enumerable.Concat(eventsDetails.CommandNotToCapture ?? Enumerable.Empty <string>(), defaultCommandNamesToSkip);
                    var formatter     = _eventFormatters.ContainsKey(eventsDetails.Key) ? _eventFormatters[eventsDetails.Key] : null;
                    var eventCapturer = CreateEventCapturer(eventsDetails.Events, commandNamesNotToCapture, formatter);
                    clientEventCapturers.Add(eventsDetails.Key, eventCapturer);
                }
            }

            var eventCapturers = clientEventCapturers.Select(c => c.Value).ToArray();
            var client         = DriverTestConfiguration.CreateDisposableClient(
                settings =>
            {
                settings.RetryReads        = retryReads;
                settings.RetryWrites       = retryWrites;
                settings.ReadConcern       = readConcern;
                settings.WriteConcern      = writeConcern;
                settings.HeartbeatInterval = TimeSpan.FromMilliseconds(5);     // the default value for spec tests
                settings.ServerApi         = serverApi;
                if (eventCapturers.Length > 0)
                {
                    settings.ClusterConfigurator = c =>
                    {
                        foreach (var eventCapturer in eventCapturers)
                        {
                            c.Subscribe(eventCapturer);
                        }
                    };
                }
            },
                useMultipleShardRouters);

            return(client, clientEventCapturers);
        }
示例#17
0
 public virtual IMongoCollection <TVal> WithReadConcern(ReadConcern readConcern) => throw new NotImplementedException();
示例#18
0
 public IMongoClient WithReadConcern(ReadConcern readConcern)
 {
     return(_client.WithReadConcern(readConcern));
 }
        public void WithReadConcern_should_return_expected_result()
        {
            var originalReadConcern = new ReadConcern(ReadConcernLevel.Linearizable);
            var subject = new MongoClient().WithReadConcern(originalReadConcern);
            var newReadConcern = new ReadConcern(ReadConcernLevel.Majority);

            var result = subject.WithReadConcern(newReadConcern);

            subject.Settings.ReadConcern.Should().BeSameAs(originalReadConcern);
            result.Settings.ReadConcern.Should().BeSameAs(newReadConcern);
            result.WithReadConcern(originalReadConcern).Settings.Should().Be(subject.Settings);
        }
示例#20
0
 public override IMongoDatabase WithReadConcern(ReadConcern readConcern)
 {
     throw new NotImplementedException();
 }
 /// <inheritdoc/>
 public IMongoDatabase WithReadConcern(ReadConcern readConcern)
 {
     return(_configuration.Database.WithReadConcern(readConcern));
 }
        public void With_should_return_same_instance_when_all_values_are_equal()
        {
            var subject = new ReadConcern(ReadConcernLevel.Local);

            var result = subject.With(ReadConcernLevel.Local);

            result.Should().BeSameAs(subject);
        }
示例#23
0
 public IMongoClient WithReadConcern(ReadConcern readConcern)
 {
     throw new NotImplementedException();
 }
示例#24
0
 public IMongoCollection <AnimatedImage> WithReadConcern(ReadConcern readConcern)
 {
     throw new NotImplementedException();
 }
示例#25
0
 public IMongoDatabase WithReadConcern(ReadConcern readConcern)
 {
     return(_database.WithReadConcern(readConcern));
 }
        public void Execute_should_throw_when_ReadConcern_is_set_but_not_supported(
            [Values(false, true)]
            bool async)
        {
            RequireServer.Check().Supports(Feature.Aggregate).DoesNotSupport(Feature.ReadConcern);
            var readConcern = new ReadConcern(ReadConcernLevel.Linearizable);
            var subject = new AggregateOperation<BsonDocument>(_collectionNamespace, __pipeline, __resultSerializer, _messageEncoderSettings)
            {
                ReadConcern = readConcern
            };

            var exception = Record.Exception(() => ExecuteOperation(subject, async));

            exception.Should().BeOfType<MongoClientException>();
        }
示例#27
0
 public SessionBehaviorBuilder <T> WithReadConcern(ReadConcern readConcern)
 {
     ReadConcern = readConcern;
     _apply(this);
     return(this);
 }
        public void ReadConcern_get_and_set_should_work(
            [Values(ReadConcernLevel.Linearizable, ReadConcernLevel.Local)]
            ReadConcernLevel level)
        {
            var subject = new FindCommandOperation<BsonDocument>(_collectionNamespace, BsonDocumentSerializer.Instance, _messageEncoderSettings);
            var value = new ReadConcern(level);

            subject.ReadConcern = value;
            var result = subject.ReadConcern;

            result.Should().Be(value);
        }
示例#29
0
 public IMongoClient WithReadConcern(ReadConcern readConcern)
 {
     return(((IMongoClient)Client).WithReadConcern(readConcern));
 }
 public IMongoClient WithReadConcern(ReadConcern readConcern) => _mongoClient.WithReadConcern(readConcern);
 /// <inheritdoc />
 public virtual IMongoClient WithReadConcern(ReadConcern readConcern)
 {
     throw new NotImplementedException();
 }
        // private static methods
        private static BsonDocument ToBsonDocument(ICoreSession session, ConnectionDescription connectionDescription, ReadConcern readConcern)
        {
            // causal consistency
            var shouldSendAfterClusterTime = AreSessionsSupported(connectionDescription) && session.IsCausallyConsistent && session.OperationTime != null;
            var shouldSendReadConcern      = !readConcern.IsServerDefault || shouldSendAfterClusterTime;

            if (shouldSendReadConcern)
            {
                var readConcernDocument = readConcern.ToBsonDocument();
                if (shouldSendAfterClusterTime)
                {
                    readConcernDocument.Add("afterClusterTime", session.OperationTime);
                }
                return(readConcernDocument);
            }

            return(null);
        }
示例#33
0
 public virtual IMongoClient WithReadConcern(ReadConcern readConcern) => throw new NotImplementedException();
示例#34
0
 /// <inheritdoc/>
 public IMongoCollection <T> WithReadConcern(ReadConcern readConcern)
 {
     throw new System.NotImplementedException();
 }
示例#35
0
 /// <inheritdoc/>
 public IMongoCollection <T> WithReadConcern(ReadConcern readConcern)
 {
     return(_actualCollection.WithReadConcern(readConcern));
 }
 public abstract IMongoCollection <TDocument> WithReadConcern(ReadConcern readConcern);
示例#37
0
 public abstract IMongoClient WithReadConcern(ReadConcern readConcern);
示例#38
0
 public IMongoCollection <TModel> WithReadConcern(ReadConcern readConcern)
 {
     return(_collection.WithReadConcern(readConcern));
 }
示例#39
0
 public IMongoCollection <TModel> WithReadConcern(ReadConcern readConcern) => _collection.WithReadConcern(readConcern);
示例#40
0
 public IMongoClient WithReadConcern(ReadConcern readConcern)
 {
     return(wrapped.WithReadConcern(readConcern));
 }
示例#41
0
 /// <inheritdoc/>
 public IMongoDatabase WithReadConcern(ReadConcern readConcern)
 {
     throw new System.NotImplementedException();
 }
示例#42
0
 public static BsonDocument GetReadConcernForCommand(ICoreSession session, ConnectionDescription connectionDescription, ReadConcern readConcern)
 {
     return(session.IsInTransaction ? null : ToBsonDocument(session, connectionDescription, readConcern));
 }
 public IMongoCollection <T> WithReadConcern(ReadConcern readConcern) =>
 _base.WithReadConcern(readConcern);
        public void With_should_return_new_instance_when_level_is_not_the_same()
        {
            var subject = new ReadConcern(null);

            var result = subject.With(ReadConcernLevel.Majority);

            result.Should().NotBeSameAs(subject);
            result.Level.Should().Be(ReadConcernLevel.Majority);
        }
        public void ReadConcern_get_and_set_should_work()
        {
            var subject = new AggregateOperation<BsonDocument>(_collectionNamespace, __pipeline, __resultSerializer, _messageEncoderSettings);
            var value = new ReadConcern(ReadConcernLevel.Linearizable);

            subject.ReadConcern = value;
            var result = subject.ReadConcern;

            result.Should().BeSameAs(value);
        }
        public void With_should_return_same_instance_when_no_values_are_provided()
        {
            var subject = new ReadConcern();

            var result = subject.With();

            result.Should().BeSameAs(subject);
        }
        public void CreateCommand_should_return_the_expected_result_when_ReadConcern_is_set(
            [Values(null, ReadConcernLevel.Linearizable)]
            ReadConcernLevel? level)
        {
            var readConcern = new ReadConcern(level);
            var subject = new AggregateOperation<BsonDocument>(_collectionNamespace, __pipeline, __resultSerializer, _messageEncoderSettings)
            {
                ReadConcern = readConcern
            };

            var result = subject.CreateCommand(Feature.ReadConcern.FirstSupportedVersion);

            var expectedResult = new BsonDocument
            {
                { "aggregate", _collectionNamespace.CollectionName },
                { "pipeline", new BsonArray(__pipeline) },
                { "readConcern", () => readConcern.ToBsonDocument(), level != null },
                { "cursor", new BsonDocument() }
            };
            result.Should().Be(expectedResult);
        }
 /// <inheritdoc/>
 public override IMongoClient WithReadConcern(ReadConcern readConcern)
 {
     Ensure.IsNotNull(readConcern, nameof(readConcern));
     var newSettings = Settings.Clone();
     newSettings.ReadConcern = readConcern;
     return new MongoClient(_operationExecutor, newSettings);
 }
        public void CreateCommand_should_return_expected_result_when_ReadConcern_is_set(
            [Values(null, ReadConcernLevel.Linearizable, ReadConcernLevel.Local)]
            ReadConcernLevel? level)
        {
            var readConcern = new ReadConcern(level);
            var subject = new GeoNearOperation<BsonDocument>(_collectionNamespace, _near, _resultSerializer, _messageEncoderSettings)
            {
                ReadConcern = readConcern
            };

            var result = subject.CreateCommand(Feature.ReadConcern.FirstSupportedVersion);

            var expectedResult = new BsonDocument
            {
                { "geoNear", _collectionNamespace.CollectionName },
                { "near", new BsonArray { 1, 2 } },
                { "readConcern", () => readConcern.ToBsonDocument(), !readConcern.IsServerDefault }
            };
            result.Should().Be(expectedResult);
        }