Ejemplo n.º 1
0
        private void ValidateReadConcern(BsonDocument definition)
        {
            Exception   parseException = null;
            ReadConcern readConcern    = null;

            try
            {
                readConcern = ReadConcern.FromBsonDocument((BsonDocument)definition["readConcern"]);
            }
            catch (Exception ex)
            {
                parseException = ex;
            }

            if (parseException == null)
            {
                if (!(bool)definition["valid"])
                {
                    throw new AssertionException($"Should be invalid: {definition["readConcern"]}.");
                }

                var expectedDocument = (BsonDocument)definition["readConcernDocument"];
                var document         = readConcern.ToBsonDocument();
                document.Should().Be(expectedDocument);

                readConcern.IsServerDefault.Should().Be((bool)definition["isServerDefault"]);
            }
            else
            {
                if ((bool)definition["valid"])
                {
                    throw new AssertionException($"Should be valid: {definition["readConcern"]}.");
                }
            }
        }
        private TransactionOptions ParseTransactionOptions(BsonDocument document)
        {
            ReadConcern    readConcern     = null;
            ReadPreference readPreference  = null;
            WriteConcern   writeConcern    = null;
            TimeSpan?      maxCommitTimeMS = null;

            foreach (var element in document)
            {
                switch (element.Name)
                {
                case "readConcern":
                    readConcern = ReadConcern.FromBsonDocument(element.Value.AsBsonDocument);
                    break;

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

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

                case "maxCommitTimeMS":
                    maxCommitTimeMS = TimeSpan.FromMilliseconds(element.Value.ToInt32());
                    break;

                default:
                    throw new ArgumentException($"Invalid field: {element.Name}.");
                }
            }

            return(new TransactionOptions(readConcern, readPreference, writeConcern, maxCommitTimeMS));
        }
Ejemplo n.º 3
0
        private void AssertValid(ConnectionString connectionString, BsonDocument definition)
        {
            if (!definition["valid"].ToBoolean())
            {
                throw new AssertionException($"The connection string '{definition["uri"]}' should be invalid.");
            }

            BsonValue readConcernValue;

            if (definition.TryGetValue("readConcern", out readConcernValue))
            {
                var readConcern = ReadConcern.FromBsonDocument((BsonDocument)readConcernValue);

                connectionString.ReadConcernLevel.Should().Be(readConcern.Level);
            }

            BsonValue writeConcernValue;

            if (definition.TryGetValue("writeConcern", out writeConcernValue))
            {
                var writeConcern = WriteConcern.FromBsonDocument(MassageWriteConcernDocument((BsonDocument)writeConcernValue));

                connectionString.W.Should().Be(writeConcern.W);
                connectionString.WTimeout.Should().Be(writeConcern.WTimeout);
                connectionString.Journal.Should().Be(writeConcern.Journal);
                connectionString.FSync.Should().Be(writeConcern.FSync);
            }
        }
Ejemplo n.º 4
0
        private TransactionOptions ParseTransactionOptions(BsonDocument document)
        {
            ReadConcern    readConcern    = null;
            ReadPreference readPreference = null;
            WriteConcern   writeConcern   = null;

            foreach (var element in document)
            {
                switch (element.Name)
                {
                case "readConcern":
                    readConcern = ReadConcern.FromBsonDocument(element.Value.AsBsonDocument);
                    break;

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

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

                default:
                    throw new ArgumentException($"Invalid field: {element.Name}.");
                }
            }

            return(new TransactionOptions(readConcern, readPreference, writeConcern));
        }
Ejemplo n.º 5
0
        // private methods
        private TransactionOptions ParseTransactionOptions(BsonDocument document)
        {
            JsonDrivenHelper.EnsureAllFieldsAreValid(document, "readConcern", "readPreference", "writeConcern", "maxCommitTimeMS");

            var options = new TransactionOptions();

            if (document.Contains("readConcern"))
            {
                options = options.With(readConcern: ReadConcern.FromBsonDocument(document["readConcern"].AsBsonDocument));
            }

            if (document.Contains("readPreference"))
            {
                options = options.With(readPreference: ReadPreference.FromBsonDocument(document["readPreference"].AsBsonDocument));
            }

            if (document.Contains("writeConcern"))
            {
                options = options.With(writeConcern: WriteConcern.FromBsonDocument(document["writeConcern"].AsBsonDocument));
            }

            if (document.Contains("maxCommitTimeMS"))
            {
                options = options.With(maxCommitTime: TimeSpan.FromMilliseconds(document["maxCommitTimeMS"].ToInt32()));
            }

            return(options);
        }
Ejemplo n.º 6
0
        protected override void SetArgument(string name, BsonValue value)
        {
            switch (name)
            {
            case "command":
                _command = value.AsBsonDocument;
                return;

            case "databaseOptions":
                if (value.AsBsonDocument.TryGetValue("readConcern", out var readConcernValue))
                {
                    _readConcern = ReadConcern.FromBsonDocument(readConcernValue.AsBsonDocument);
                }
                return;

            case "readPreference":
                _readPreference = ReadPreference.FromBsonDocument(value.AsBsonDocument);
                return;

            case "session":
                _session = (IClientSessionHandle)_objectMap[value.AsString];
                return;
            }

            base.SetArgument(name, value);
        }
        private void ParseDatabaseOptions(BsonDocument document)
        {
            JsonDrivenHelper.EnsureAllFieldsAreValid(document, "readConcern", "readPreference", "writeConcern");

            var database = _collection.Database;

            if (document.Contains("readConcern"))
            {
                var readConcern = ReadConcern.FromBsonDocument(document["readConcern"].AsBsonDocument);
                database = database.WithReadConcern(readConcern);
            }

            if (document.Contains("readPreference"))
            {
                var readPreference = ReadPreference.FromBsonDocument(document["readPreference"].AsBsonDocument);
                database = database.WithReadPreference(readPreference);
            }

            if (document.Contains("writeConcern"))
            {
                var writeConcern = WriteConcern.FromBsonDocument(document["writeConcern"].AsBsonDocument);
                database = database.WithWriteConcern(writeConcern);
            }

            // update _collection to be associated with the reconfigured database
            _collection = database.GetCollection <BsonDocument>(
                _collection.CollectionNamespace.CollectionName,
                _collection.Settings);
        }
Ejemplo n.º 8
0
        private IMongoCollection <BsonDocument> CreateCollection(BsonDocument entity, Dictionary <string, IMongoDatabase> databases)
        {
            string                  collectionName = null;
            IMongoDatabase          database       = null;
            MongoCollectionSettings settings       = null;

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

                case "database":
                    var databaseId = entity["database"].AsString;
                    database = databases[databaseId];
                    break;

                case "collectionName":
                    collectionName = entity["collectionName"].AsString;
                    break;

                case "collectionOptions":
                    settings = new MongoCollectionSettings();
                    foreach (var option in element.Value.AsBsonDocument)
                    {
                        switch (option.Name)
                        {
                        case "readConcern":
                            settings.ReadConcern = ReadConcern.FromBsonDocument(option.Value.AsBsonDocument);
                            break;

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

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

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

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

            return(database.GetCollection <BsonDocument>(collectionName, settings));
        }
        public void GetReadConcernForCommand_should_consider_session_supported_when_logicalSessionTimeoutMinutes_is_null_and_load_balanced_mode()
        {
            var session = CreateSession(
                isInTransaction: false,
                isCausallyConsistent: true,
                operationTime: new BsonTimestamp(1234));
            var connectionDescription = CreateConnectionDescription(logicalSessionTimeoutMinutes: false, serviceId: true);
            var readConcern           = ReadConcern.FromBsonDocument(BsonDocument.Parse("{}"));

            var result = ReadConcernHelper.GetReadConcernForCommand(session, connectionDescription, readConcern);

            result.Should().Be(new BsonDocument("afterClusterTime", new BsonTimestamp(1234)));
        }
Ejemplo n.º 10
0
        // private methods
        private void SetOptions(BsonDocument document)
        {
            JsonDrivenHelper.EnsureAllFieldsAreValid(document, "readConcern", "writeConcern");

            if (document.Contains("readConcern"))
            {
                _options = _options.With(readConcern: ReadConcern.FromBsonDocument(document["readConcern"].AsBsonDocument));
            }

            if (document.Contains("writeConcern"))
            {
                _options = _options.With(writeConcern: WriteConcern.FromBsonDocument(document["writeConcern"].AsBsonDocument));
            }
        }
        public void CreateCommand_should_return_expected_result_when_readConcern_is_provided(
            [Values("{level: 'local'}", "{level: 'majority'}")]
            string readConcernJson)
        {
            var subject = new FindCommandOperation <BsonDocument>(_collectionNamespace, BsonDocumentSerializer.Instance, _messageEncoderSettings);

            subject.ReadConcern = ReadConcern.FromBsonDocument(BsonDocument.Parse(readConcernJson));
            var reflector         = new Reflector(subject);
            var serverDescription = CreateServerDescription();

            var result = reflector.CreateCommand(serverDescription);

            result.Should().Be($"{{ find : '{_collectionNamespace.CollectionName}', readConcern : {readConcernJson} }}");
        }
Ejemplo n.º 12
0
        private void ParseCollectionOptions(MongoCollectionSettings settings, BsonDocument collectionOptions)
        {
            foreach (var collectionOption in collectionOptions.Elements)
            {
                switch (collectionOption.Name)
                {
                case "readConcern":
                    settings.ReadConcern = ReadConcern.FromBsonDocument(collectionOption.Value.AsBsonDocument);
                    break;

                default:
                    throw new FormatException($"Unexpected collection option: {collectionOption.Name}");
                }
            }
        }
Ejemplo n.º 13
0
        public void GetReadConcernForCommand_should_return_expected_result(
            bool isInTransaction,
            bool isCausallyConsistent,
            int?operationTime,
            string readConcernJson,
            string expectedResult)
        {
            var session = CreateSession(
                isInTransaction: isInTransaction,
                isCausallyConsistent: isCausallyConsistent,
                operationTime: operationTime.HasValue ? new BsonTimestamp(operationTime.Value) : null);
            var connectionDescription = CreateConnectionDescription(areSessionsSupported: true);
            var readConcern           = ReadConcern.FromBsonDocument(BsonDocument.Parse(readConcernJson));

            var result = ReadConcernHelper.GetReadConcernForCommand(session, connectionDescription, readConcern);

            result.Should().Be(expectedResult);
        }
        public void GetReadConcernForFirstCommandInTransaction_should_return_expected_result(
            bool isCausallyConsistent,
            int?operationTime,
            string readConcernJson,
            string expectedResult)
        {
            var readConcern        = ReadConcern.FromBsonDocument(BsonDocument.Parse(readConcernJson));
            var transactionOptions = new TransactionOptions(readConcern);
            var transaction        = new CoreTransaction(1, transactionOptions);
            var session            = CreateSession(
                currentTransaction: transaction,
                isCausallyConsistent: isCausallyConsistent,
                operationTime: operationTime.HasValue ? new BsonTimestamp(operationTime.Value) : null);
            var connectionDescription = CreateConnectionDescription(logicalSessionTimeoutMinutes: true);

            var result = ReadConcernHelper.GetReadConcernForFirstCommandInTransaction(session, connectionDescription);

            result.Should().Be(expectedResult);
        }
        // private methods
        private void ParseCollectionOptions(BsonDocument document)
        {
            JsonDrivenHelper.EnsureAllFieldsAreValid(document, "readConcern", "readPreference", "writeConcern");

            if (document.Contains("readConcern"))
            {
                var readConcern = ReadConcern.FromBsonDocument(document["readConcern"].AsBsonDocument);
                _collection = _collection.WithReadConcern(readConcern);
            }

            if (document.Contains("readPreference"))
            {
                var readPreference = ReadPreference.FromBsonDocument(document["readPreference"].AsBsonDocument);
                _collection = _collection.WithReadPreference(readPreference);
            }

            if (document.Contains("writeConcern"))
            {
                var writeConcern = WriteConcern.FromBsonDocument(document["writeConcern"].AsBsonDocument);
                _collection = _collection.WithWriteConcern(writeConcern);
            }
        }
        // private methods
        private void SetOptions(BsonDocument document)
        {
            JsonDrivenHelper.EnsureAllFieldsAreValid(document, "readConcern", "readPreference", "writeConcern");

            var options = new TransactionOptions();

            if (document.Contains("readConcern"))
            {
                options = options.With(readConcern: ReadConcern.FromBsonDocument(document["readConcern"].AsBsonDocument));
            }

            if (document.Contains("readPreference"))
            {
                options = options.With(readPreference: ReadPreference.FromBsonDocument(document["readPreference"].AsBsonDocument));
            }

            if (document.Contains("writeConcern"))
            {
                options = options.With(writeConcern: WriteConcern.FromBsonDocument(document["writeConcern"].AsBsonDocument));
            }

            _options = options;
        }
Ejemplo n.º 17
0
        public UnifiedWithTransactionOperation Build(string targetSessionId, BsonDocument arguments)
        {
            var session = _entityMap.GetSession(targetSessionId);

            BsonArray          operations = null;
            TransactionOptions options    = null;

            foreach (var argument in arguments)
            {
                switch (argument.Name)
                {
                case "callback":
                    operations = argument.Value.AsBsonArray;
                    break;

                case "readConcern":
                    options = options ?? new TransactionOptions();
                    options = options.With(readConcern: ReadConcern.FromBsonDocument(argument.Value.AsBsonDocument));
                    break;

                case "readPreference":
                    options = options ?? new TransactionOptions();
                    options = options.With(readPreference: ReadPreference.FromBsonDocument(argument.Value.AsBsonDocument));
                    break;

                case "writeConcern":
                    options = options ?? new TransactionOptions();
                    options = options.With(writeConcern: WriteConcern.FromBsonDocument(argument.Value.AsBsonDocument));
                    break;

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

            return(new UnifiedWithTransactionOperation(session, operations, options));
        }
Ejemplo n.º 18
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 "snapshot":
                            options.Snapshot = option.Value.ToBoolean();
                            break;

                        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($"Invalid session option argument name: '{option.Name}'.");
                        }
                    }
                    break;

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

            var session = client.StartSession(options);

            return(session);
        }