예제 #1
0
        public void Get_database_settings(
            string connectionString,
            string w,
            bool journal,
            ReadConcernLevel?readConcernLevel,
            ReadPreferenceMode readPreference,
            GuidRepresentation guidRepresentation)
        {
            var settings = MongoDbEventStore <object> .GetDefaultDatabaseSettings(connectionString);

            if (string.IsNullOrEmpty(w))
            {
                Assert.Null(settings.WriteConcern.W);
            }
            else
            {
                Assert.Equal(w, settings.WriteConcern.W.ToString());
            }

            Assert.Equal(journal, settings.WriteConcern.Journal);

            if (readConcernLevel != null)
            {
                Assert.Equal(readConcernLevel, settings.ReadConcern.Level);
            }
            else
            {
                Assert.Null(settings.ReadConcern.Level);
            }

            Assert.Equal(readPreference, settings.ReadPreference.ReadPreferenceMode);
            Assert.Equal(guidRepresentation, settings.GuidRepresentation);
        }
        // constructors
        /// <summary>
        /// Initializes a new instance of the <see cref="ReadPreference" /> class.
        /// </summary>
        /// <param name="mode">The read preference mode.</param>
        /// <param name="tagSets">The tag sets.</param>
        /// <param name="maxStaleness">The maximum staleness.</param>
        public ReadPreference(
            ReadPreferenceMode mode,
            IEnumerable <TagSet> tagSets = null,
            TimeSpan?maxStaleness        = null)
        {
            var tagSetsArray = tagSets == null ? __emptyTagSetsArray : tagSets.ToArray();

            if (tagSetsArray.Length > 0)
            {
                Ensure.That(mode != ReadPreferenceMode.Primary, "TagSets cannot be used with ReadPreferenceMode Primary.", nameof(tagSets));
            }

            if (maxStaleness.HasValue)
            {
                Ensure.IsInfiniteOrGreaterThanZero(maxStaleness.Value, nameof(maxStaleness));
                if (maxStaleness.Value > TimeSpan.Zero)
                {
                    Ensure.That(maxStaleness.Value.Ticks % TimeSpan.TicksPerMillisecond == 0, "MaxStaleness must not have fractional seconds.", nameof(maxStaleness));
                }
                Ensure.That(mode != ReadPreferenceMode.Primary, "MaxStaleness cannot be used with ReadPreferenceMode Primary.", nameof(maxStaleness));
            }

            _mode         = mode;
            _tagSets      = tagSetsArray;
            _maxStaleness = maxStaleness;
        }
 /// <summary>
 /// Initializes a new instance of the ReadPreference class.
 /// </summary>
 /// <param name="readPreferenceMode">The read preference mode.</param>
 /// <param name="tagSets">The tag sets.</param>
 public ReadPreference(ReadPreferenceMode readPreferenceMode, IEnumerable <ReplicaSetTagSet> tagSets)
 {
     _readPreferenceMode = readPreferenceMode;
     if (tagSets != null)
     {
         _tagSets         = new List <ReplicaSetTagSet>(tagSets);
         _tagSetsReadOnly = _tagSets.AsReadOnly();
     }
 }
예제 #4
0
 /// <summary>
 /// Initializes a new instance of the ReadPreference class.
 /// </summary>
 /// <param name="readPreference">A read preference</param>
 public ReadPreference(ReadPreference readPreference)
 {
     _readPreferenceMode = readPreference._readPreferenceMode;
     if (readPreference._tagSets != null)
     {
         _tagSets         = new List <ReplicaSetTagSet>(readPreference._tagSets);
         _tagSetsReadOnly = _tagSets.AsReadOnly();
     }
 }
예제 #5
0
        public void Execute_should_call_channel_Command_with_unwrapped_command_when_wrapping_is_not_necessary(
            ServerType serverType,
            ReadPreferenceMode readPreferenceMode,
            bool async)
        {
            var subject           = CreateSubject <BsonDocument>();
            var readPreference    = new ReadPreference(readPreferenceMode);
            var serverDescription = CreateServerDescription(serverType);
            var mockChannel       = CreateMockChannel();
            var channelSource     = CreateMockChannelSource(serverDescription, mockChannel.Object).Object;
            var binding           = CreateMockReadBinding(readPreference, channelSource).Object;
            var cancellationToken = new CancellationTokenSource().Token;

            BsonDocument result;

            if (async)
            {
                result = subject.ExecuteAsync(binding, cancellationToken).GetAwaiter().GetResult();

                mockChannel.Verify(
                    c => c.CommandAsync(
                        binding.Session,
                        readPreference,
                        subject.DatabaseNamespace,
                        subject.Command,
                        null, // commandPayloads
                        subject.CommandValidator,
                        null, // additionalOptions
                        null, // postWriteAction
                        CommandResponseHandling.Return,
                        subject.ResultSerializer,
                        subject.MessageEncoderSettings,
                        cancellationToken),
                    Times.Once);
            }
            else
            {
                result = subject.Execute(binding, cancellationToken);

                mockChannel.Verify(
                    c => c.Command(
                        binding.Session,
                        readPreference,
                        subject.DatabaseNamespace,
                        subject.Command,
                        null, // commandPayloads
                        subject.CommandValidator,
                        null, // additionalOptions
                        null, // postWriteAction
                        CommandResponseHandling.Return,
                        subject.ResultSerializer,
                        subject.MessageEncoderSettings,
                        cancellationToken),
                    Times.Once);
            }
        }
예제 #6
0
        public void ToString_should_return_expected_result(
            [Values(ReadPreferenceMode.Primary, ReadPreferenceMode.Secondary)]
            ReadPreferenceMode mode)
        {
            var subject = new ReadPreference(mode);

            var result = subject.ToString();

            result.Should().Be($"{{ Mode : {mode} }}");
        }
        public ReadPreference(ReadPreferenceMode mode, IEnumerable <TagSet> tagSets)
        {
            Ensure.IsNotNull(tagSets, "tagSets");
            if (mode == ReadPreferenceMode.Primary && tagSets.Count() > 0)
            {
                throw new ArgumentException("TagSets cannot be used with ReadPreferenceMode Primary.", "tagSets");
            }

            _mode    = mode;
            _tagSets = tagSets.ToList();
        }
예제 #8
0
        public void Equals_should_compare_mode_fields(
            [Values(ReadPreferenceMode.Primary, ReadPreferenceMode.Secondary)]
            ReadPreferenceMode lhsMode,
            [Values(ReadPreferenceMode.Primary, ReadPreferenceMode.Secondary)]
            ReadPreferenceMode rhsMode)
        {
            var lhs = new ReadPreference(lhsMode);
            var rhs = new ReadPreference(rhsMode);

            Equals_Act_and_Assert(lhs, rhs, lhsMode.Equals(rhsMode));
        }
        // public static methods
        /// <summary>
        /// Creates a new ReadPreference instance from a BsonDocument.
        /// </summary>
        /// <param name="document">The document.</param>
        /// <returns>A ReadPreference.</returns>
        public static ReadPreference FromBsonDocument(BsonDocument document)
        {
            ReadPreferenceMode  mode         = ReadPreferenceMode.Primary;
            TimeSpan?           maxStaleness = null;
            List <TagSet>       tagSets      = null;
            ReadPreferenceHedge hedge        = null;

            foreach (var element in document)
            {
                switch (element.Name)
                {
                case "mode":
                    mode = (ReadPreferenceMode)Enum.Parse(typeof(ReadPreferenceMode), element.Value.AsString, ignoreCase: true);
                    break;

                case "tags":
                    tagSets = new List <TagSet>();
                    foreach (var tagsDocument in element.Value.AsBsonArray.Cast <BsonDocument>())
                    {
                        var tags = new List <Tag>();
                        foreach (var tagElement in tagsDocument)
                        {
                            var tag = new Tag(tagElement.Name, tagElement.Value.AsString);
                            tags.Add(tag);
                        }
                        var tagSet = new TagSet(tags);
                        tagSets.Add(tagSet);
                    }
                    break;

                case "maxStaleness":
                    maxStaleness = element.Value.BsonType switch
                    {
                        BsonType.String => TimeSpanParser.Parse(element.Value.AsString),
                        _ => TimeSpan.FromSeconds(element.Value.ToDouble())
                    };
                    break;

                case "maxStalenessSeconds":
                    maxStaleness = TimeSpan.FromSeconds(element.Value.ToDouble());
                    break;

                case "hedge":
                    var hedgeEnabled = element.Value.AsBsonDocument["enabled"].AsBoolean;
                    hedge = new ReadPreferenceHedge(hedgeEnabled);
                    break;

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

            return(new ReadPreference(mode, tagSets, maxStaleness, hedge));
        }
예제 #10
0
        // constructors
        /// <summary>
        /// Initializes a new instance of the <see cref="ReadPreference"/> class.
        /// </summary>
        /// <param name="mode">The read preference mode.</param>
        /// <param name="tagSets">The tag sets.</param>
        public ReadPreference(
            Optional <ReadPreferenceMode> mode       = default(Optional <ReadPreferenceMode>),
            Optional <IEnumerable <TagSet> > tagSets = default(Optional <IEnumerable <TagSet> >))
        {
            _mode    = mode.WithDefault(ReadPreferenceMode.Primary);
            _tagSets = Ensure.IsNotNull(tagSets.WithDefault(Enumerable.Empty <TagSet>()), "tagSets").ToList();

            if (_mode == ReadPreferenceMode.Primary && _tagSets.Count() > 0)
            {
                throw new ArgumentException("TagSets cannot be used with ReadPreferenceMode Primary.", "tagSets");
            }
        }
예제 #11
0
        // constructors
        /// <summary>
        /// Initializes a new instance of the <see cref="ReadPreference"/> class.
        /// </summary>
        /// <param name="mode">The read preference mode.</param>
        /// <param name="tagSets">The tag sets.</param>
        public ReadPreference(
            ReadPreferenceMode mode,
            IEnumerable <TagSet> tagSets = null)
        {
            _mode    = mode;
            _tagSets = (tagSets ?? Enumerable.Empty <TagSet>()).ToList();

            if (_mode == ReadPreferenceMode.Primary && _tagSets.Count() > 0)
            {
                throw new ArgumentException("TagSets cannot be used with ReadPreferenceMode Primary.", "tagSets");
            }
        }
예제 #12
0
        public void With_mode_should_return_expected_result(
            [Values(ReadPreferenceMode.Primary, ReadPreferenceMode.Secondary)]
            ReadPreferenceMode originalMode,
            [Values(ReadPreferenceMode.Primary, ReadPreferenceMode.Secondary)]
            ReadPreferenceMode mode)
        {
            var subject = new ReadPreference(originalMode);

            var result = subject.With(mode);

            result.ReadPreferenceMode.Should().Be(mode);
            result.With(originalMode).Should().Be(subject);
        }
예제 #13
0
        public void CreateCommand_should_return_expected_result_when_readPreference_is_provided(
            [Values(ReadPreferenceMode.PrimaryPreferred, ReadPreferenceMode.Secondary)]
            ReadPreferenceMode value)
        {
            var subject           = new FindCommandOperation <BsonDocument>(_collectionNamespace, BsonDocumentSerializer.Instance, _messageEncoderSettings);
            var readPreference    = new ReadPreference(value);
            var reflector         = new Reflector(subject);
            var serverDescription = CreateServerDescription(type: ServerType.ShardRouter);

            var result = reflector.CreateCommand(serverDescription, readPreference);

            var mode          = value.ToString();
            var camelCaseMode = char.ToLower(mode[0]) + mode.Substring(1);

            result.Should().Be($"{{ find : '{_collectionNamespace.CollectionName}', readPreference : {{ mode : '{camelCaseMode}' }} }}");
        }
예제 #14
0
        public void Execute_should_call_channel_Command_with_unwrapped_command_when_wrapping_is_not_necessary(
            ServerType serverType,
            ReadPreferenceMode readPreferenceMode,
            bool slaveOk,
            bool async)
        {
            var subject           = CreateSubject <BsonDocument>();
            var readPreference    = new ReadPreference(readPreferenceMode);
            var serverDescription = CreateServerDescription(serverType);
            var channel           = CreateFakeChannel();
            var channelSource     = CreateFakeChannelSource(serverDescription, channel);
            var binding           = CreateFakeReadBinding(readPreference, channelSource);
            var cancellationToken = new CancellationTokenSource().Token;

            BsonDocument result;

            if (async)
            {
                result = subject.ExecuteAsync(binding, cancellationToken).GetAwaiter().GetResult();

                channel.Received(1).CommandAsync(
                    subject.DatabaseNamespace,
                    subject.Command,
                    subject.CommandValidator,
                    Arg.Is <Func <CommandResponseHandling> >(f => f() == CommandResponseHandling.Return),
                    slaveOk,
                    subject.ResultSerializer,
                    subject.MessageEncoderSettings,
                    cancellationToken);
            }
            else
            {
                result = subject.Execute(binding, cancellationToken);

                channel.Received(1).Command(
                    subject.DatabaseNamespace,
                    subject.Command,
                    subject.CommandValidator,
                    Arg.Is <Func <CommandResponseHandling> >(f => f() == CommandResponseHandling.Return),
                    slaveOk,
                    subject.ResultSerializer,
                    subject.MessageEncoderSettings,
                    cancellationToken);
            }
        }
예제 #15
0
        // public static methods
        /// <summary>
        /// Creates a new ReadPreference instance from a BsonDocument.
        /// </summary>
        /// <param name="document">The document.</param>
        /// <returns>A ReadPreference.</returns>
        public static ReadPreference FromBsonDocument(BsonDocument document)
        {
            ReadPreferenceMode mode = ReadPreferenceMode.Primary;

            foreach (var element in document)
            {
                switch (element.Name)
                {
                case "mode":
                    mode = (ReadPreferenceMode)Enum.Parse(typeof(ReadPreferenceMode), element.Value.AsString, ignoreCase: true);
                    break;

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

            return(new ReadPreference(mode));
        }
예제 #16
0
        // constructors
        /// <summary>
        /// Initializes a new instance of the <see cref="ReadPreference" /> class.
        /// </summary>
        /// <param name="mode">The read preference mode.</param>
        /// <param name="tagSets">The tag sets.</param>
        /// <param name="maxStaleness">The maximum staleness.</param>
        public ReadPreference(
            ReadPreferenceMode mode,
            IEnumerable <TagSet> tagSets = null,
            TimeSpan?maxStaleness        = null)
        {
            var tagSetsArray = tagSets == null ? __emptyTagSetsArray : tagSets.ToArray();

            if (tagSetsArray.Length > 0)
            {
                Ensure.That(mode != ReadPreferenceMode.Primary, "TagSets cannot be used with ReadPreferenceMode Primary.", nameof(tagSets));
            }

            if (maxStaleness.HasValue)
            {
                Ensure.IsInfiniteOrGreaterThanOrEqualToZero(maxStaleness.Value, nameof(maxStaleness));
                Ensure.That(mode != ReadPreferenceMode.Primary, "MaxStaleness cannot be used with ReadPreferenceMode Primary.", nameof(maxStaleness));
            }

            _mode         = mode;
            _tagSets      = tagSetsArray;
            _maxStaleness = maxStaleness;
        }
예제 #17
0
 /// <summary>
 /// Returns a new instance of ReadPreference with some values changed.
 /// </summary>
 /// <param name="mode">The read preference mode.</param>
 /// <returns>A new instance of ReadPreference.</returns>
 public ReadPreference With(ReadPreferenceMode mode)
 {
     return(new ReadPreference(mode, _tagSets));
 }
예제 #18
0
 // constructors
 public ReadPreference(ReadPreferenceMode mode)
 {
     _mode = mode;
     _tagSets = __noTagSets;
 }
        public void When_readPreference_is_specified(string connectionString, ReadPreferenceMode readPreference)
        {
            var subject = new ConnectionString(connectionString);

            subject.ReadPreference.Should().Be(readPreference);
        }
 /// <summary>
 /// Returns a new instance of ReadPreference with some values changed.
 /// </summary>
 /// <param name="mode">The read preference mode.</param>
 /// <returns>A new instance of ReadPreference.</returns>
 public ReadPreference With(ReadPreferenceMode mode)
 {
     return(new ReadPreference(mode, _tagSets, _maxStaleness));
 }
예제 #21
0
 public ReadPreference(ReadPreferenceMode mode, IEnumerable<TagSet> tagSets)
 {
     _mode = mode;
     _tagSets = Ensure.IsNotNull(tagSets, "tagSets").ToList();
 }
        public void TestReadPreference(ReadPreferenceMode? mode, string formatString, string[] values)
        {
            ReadPreference readPreference = null;
            if (mode != null) { readPreference = new ReadPreference(mode.Value); }
            var built = new MongoUrlBuilder { Server = _localhost, ReadPreference = readPreference };

            var canonicalConnectionString = string.Format(formatString, values[0]);
            foreach (var builder in EnumerateBuiltAndParsedBuilders(built, formatString, values))
            {
                Assert.AreEqual(readPreference, builder.ReadPreference);
                Assert.AreEqual(canonicalConnectionString, builder.ToString());
            }
        }
예제 #23
0
        public void When_readPreference_is_specified(string connectionString, ReadPreferenceMode readPreference)
        {
            var subject = new ConnectionString(connectionString);

            subject.ReadPreference.Should().Be(readPreference);
        }
        public void TestSlaveOk_AfterReadPreference(ReadPreferenceMode mode, bool slaveOk)
        {
            var readPreference = new ReadPreference { ReadPreferenceMode = mode };
            var builder = new MongoUrlBuilder { Server = _localhost, ReadPreference = readPreference };
#pragma warning disable 618
            Assert.Throws<InvalidOperationException>(() => { builder.SlaveOk = slaveOk; });
#pragma warning restore
        }
예제 #25
0
        public void FromBsonDocument_should_parse_mode(string document, ReadPreferenceMode expectedMode)
        {
            var result = ReadPreference.FromBsonDocument(BsonDocument.Parse(document));

            result.ReadPreferenceMode.Should().Be(expectedMode);
        }
예제 #26
0
 // methods
 public ReadPreference WithMode(ReadPreferenceMode value)
 {
     return (_mode == value) ? this : new ReadPreference(value, _tagSets);
 }
예제 #27
0
 // constructors
 public ReadPreference(ReadPreferenceMode mode)
 {
     _mode    = mode;
     _tagSets = __noTagSets;
 }
예제 #28
0
 // methods
 public ReadPreference WithMode(ReadPreferenceMode value)
 {
     return((_mode == value) ? this : new ReadPreference(value, _tagSets));
 }
예제 #29
0
 public ReadPreference(ReadPreferenceMode mode, IEnumerable <TagSet> tagSets)
 {
     _mode    = mode;
     _tagSets = Ensure.IsNotNull(tagSets, "tagSets").ToList();
 }
        public void TestReadPreference_AfterSlaveOk(bool slaveOk, ReadPreferenceMode mode)
        {
            var readPreference = new ReadPreference { ReadPreferenceMode = mode };
            var builder = new MongoUrlBuilder { Server = _localhost };
#pragma warning disable 618
            builder.SlaveOk = slaveOk;
#pragma warning restore
            builder.ReadPreference = null;
            Assert.Throws<InvalidOperationException>(() => { builder.ReadPreference = readPreference; });
        }
예제 #31
0
 // constructors
 /// <summary>
 /// Initializes a new instance of the ReadPreference class.
 /// </summary>
 public ReadPreference()
 {
     _readPreferenceMode = ReadPreferenceMode.Primary;
 }
        public void TestSlaveOk_ForReadPreference(ReadPreferenceMode? mode, bool slaveOk)
        {
            var readPreference = (mode == null) ? null : new ReadPreference { ReadPreferenceMode = mode.Value };
            var builder = new MongoUrlBuilder { Server = _localhost, ReadPreference = readPreference };
#pragma warning disable 618
            Assert.AreEqual(slaveOk, builder.SlaveOk);
#pragma warning restore
        }
예제 #33
0
 /// <summary>
 /// Initializes a new instance of the ReadPreference class.
 /// </summary>
 /// <param name="readPreferenceMode">The read preference mode.</param>
 public ReadPreference(ReadPreferenceMode readPreferenceMode)
     : this(readPreferenceMode, null)
 {
 }
 public void TestSlaveOk(string url, ReadPreferenceMode mode)
 {
     var builder = new MongoUrlBuilder(url);
     Assert.AreEqual(mode, builder.ReadPreference.ReadPreferenceMode);
 }
예제 #35
0
 /// <summary>
 /// Initializes a new instance of the ReadPreference class.
 /// </summary>
 /// <param name="readPreferenceMode">The read preference mode.</param>
 public ReadPreference(ReadPreferenceMode readPreferenceMode)
 {
     _readPreferenceMode = readPreferenceMode;
 }