コード例 #1
0
        public void Counter_ThrowsArgumentException_WhenPathIsEmpty(string path)
        {
            var mockedInvoker = new Mock <ISubdocInvoker>();
            var builder       = new MutateInBuilder <dynamic>(mockedInvoker.Object, () => new DefaultSerializer(), "thekey");

            Assert.Throws <ArgumentException>(() => builder.Counter(path, 0, false));
        }
コード例 #2
0
 public SubArrayInsert(MutateInBuilder <T> builder, string key, IVBucket vBucket, ITypeTranscoder transcoder, uint timeout)
     : base(builder, key, vBucket, transcoder, SequenceGenerator.GetNext(), timeout)
 {
     CurrentSpec = builder.FirstSpec();
     Path        = CurrentSpec.Path;
     Cas         = builder.Cas;
 }
コード例 #3
0
        public void ArrayInsert_Single_For_Xattr_Sets_Correct_Flag()
        {
            const SubdocPathFlags pathFlags = SubdocPathFlags.Xattr;
            const SubdocDocFlags  docFlags  = SubdocDocFlags.InsertDocument;

            var mockResult = new Mock <IDocumentFragment <dynamic> >();

            var mockedInvoker = new Mock <ISubdocInvoker>();

            mockedInvoker.Setup(x => x.Invoke(It.IsAny <MutateInBuilder <dynamic> >()))
            .Returns(mockResult.Object);

            var mutateBuilder = new MutateInBuilder <dynamic>(mockedInvoker.Object, () => new DefaultSerializer(), "mykey");

            var result = mutateBuilder.ArrayInsert("path", 1, pathFlags, docFlags)
                         .Execute();

            Assert.AreSame(mockResult.Object, result);
            mockedInvoker.Verify(
                invoker => invoker.Invoke(It.Is <MutateInBuilder <dynamic> >(
                                              builder =>
                                              builder.FirstSpec().OpCode == OperationCode.SubArrayInsert &&
                                              builder.FirstSpec().Path == "path" &&
                                              builder.FirstSpec().PathFlags == pathFlags &&
                                              builder.FirstSpec().DocFlags == docFlags &&
                                              (int)builder.FirstSpec().Value == 1
                                              )
                                          ), Times.Once
                );
        }
コード例 #4
0
        public void ArrayAddUnique_DoesNotThrowsArgumentException_WhenPathIsEmpty(string path)
        {
            var mockedInvoker = new Mock<ISubdocInvoker>();
            var builder = new MutateInBuilder<dynamic>(mockedInvoker.Object, () => new DefaultSerializer(), "thekey");

            builder.ArrayAddUnique(path, 0);
        }
コード例 #5
0
        public void ArrayInsert_Multiple_For_Xattr_Sets_Correct_Flag(SubdocMutateFlags flags, byte expected)
        {
            var mockResult = new Mock <IDocumentFragment <dynamic> >();

            var mockedInvoker = new Mock <ISubdocInvoker>();

            mockedInvoker.Setup(x => x.Invoke(It.IsAny <MutateInBuilder <dynamic> >()))
            .Returns(mockResult.Object);

            var mutateBuilder = new MutateInBuilder <dynamic>(mockedInvoker.Object, () => new DefaultSerializer(), "mykey");

            var value  = new object[] { 1, 2, 3 };
            var result = mutateBuilder.ArrayInsert("path", flags, value)
                         .Execute();

            Assert.AreSame(mockResult.Object, result);
            mockedInvoker.Verify(
                invoker => invoker.Invoke(It.Is <MutateInBuilder <dynamic> >(
                                              builder =>
                                              builder.FirstSpec().OpCode == OperationCode.SubArrayInsert &&
                                              builder.FirstSpec().Path == "path" &&
                                              builder.FirstSpec().Flags == expected &&
                                              builder.FirstSpec().Value == value
                                              )
                                          ), Times.Once
                );
        }
コード例 #6
0
        public void Replace_ThrowsArgumentException_WhenPathIsEmpty(string path)
        {
            var mockedInvoker = new Mock <ISubdocInvoker>();
            var builder       = new MutateInBuilder <dynamic>(mockedInvoker.Object, () => new DefaultSerializer(), "thekey");

            builder.Replace(path, "somevalue");
        }
コード例 #7
0
        public void ArrayPrepend_DoesNotThrowArgumentException_WhenPathIsEmpty(string path)
        {
            var mockedInvoker = new Mock <ISubdocInvoker>();
            var builder       = new MutateInBuilder <dynamic>(mockedInvoker.Object, () => new DefaultSerializer(), "thekey");

            builder.ArrayPrepend(path, 0, false);
        }
コード例 #8
0
        public void ArrayInsert_ThrowsArgumentException_WhenPathIsEmpty(string path)
        {
            var mockedInvoker = new Mock <ISubdocInvoker>();
            var builder       = new MutateInBuilder <dynamic>(mockedInvoker.Object, () => new DefaultSerializer(), "thekey");

            builder.ArrayInsert(path, 0);
        }
コード例 #9
0
        public void Maintain_Exsiting_Subdoc_Array_Signatures()
        {
            var mockedInvoker = new Mock <ISubdocInvoker>();
            var builder       = new MutateInBuilder <dynamic>(mockedInvoker.Object, () => new DefaultSerializer(), "thekey");

            builder.ArrayAppend(1);
            builder.ArrayAppend(1, false);
            builder.ArrayAppend("key", 1);
            builder.ArrayAppend("key", 1, false); // doesn't work with bools but other data types work
            //builder.ArrayAppend("key", 1, 2, 3); // already conflicted with (bool, params) & (string, bool, params)
            builder.ArrayAppend("key", true, 1, 2, 3);

            builder.ArrayPrepend(1);
            builder.ArrayPrepend(1, false);
            builder.ArrayPrepend("key", 1);
            builder.ArrayPrepend("key", 1, false); // doesn't work with bools but other data types work
            //builder.ArrayPrepend("key", 1, 2, 3); // already conflicted with (bool, params) & (string, bool, params)
            builder.ArrayPrepend("key", true, 1, 2, 3);

            builder.ArrayInsert("key", 1);
            builder.ArrayInsert("key", 1, false);
            builder.ArrayInsert("key", 1, 2, 3);
            builder.ArrayInsert("key", true, 1, 2, 3);

            builder.ArrayAddUnique(1);
            builder.ArrayAddUnique(1, false);
            builder.ArrayAddUnique("key", 1);
            builder.ArrayAddUnique("key", 1, false);
        }
コード例 #10
0
        public void Counter_ThrowsArgumentException_WhenPathIsEmpty(string path)
        {
            var mockedInvoker = new Mock<ISubdocInvoker>();
            var builder = new MutateInBuilder<dynamic>(mockedInvoker.Object, () => new DefaultSerializer(), "thekey");

            Assert.Throws<ArgumentException>(() => builder.Counter(path, 0, false));
        }
コード例 #11
0
        public void MultiMutation_WillRetry_IfHasCas()
        {
            var mockedInvoker = new Mock<ISubdocInvoker>();
            var builder = new MutateInBuilder<dynamic>(mockedInvoker.Object, () => new DefaultSerializer(), "thekey");

            builder.Remove("somepath");
            var op = new MultiMutation<dynamic>("thekey", builder, new Mock<IVBucket>().Object,
                new Mock<ITypeTranscoder>().Object, 10){Cas = 100};

            Assert.IsTrue(op.CanRetry());
        }
コード例 #12
0
        public void SubDocDelete_WillNotRetry_IfCasIsZero()
        {
            var mockedInvoker = new Mock<ISubdocInvoker>();
            var builder = new MutateInBuilder<dynamic>(mockedInvoker.Object, () => new DefaultSerializer(), "thekey");

            builder.Remove("somepath");
            var op = new SubDocDelete<dynamic>(builder, "thekey", new Mock<IVBucket>().Object,
                new Mock<ITypeTranscoder>().Object, 10)
            { Cas = 0 };

            Assert.IsFalse(op.CanRetry());
        }
コード例 #13
0
        public async Task <IMutateInResult> MutateInAsync(string id, IEnumerable <MutateInSpec> specs, MutateInOptions?options = null)
        {
            //sanity check for deferred bootstrapping errors
            _bucket.ThrowIfBootStrapFailed();

            options ??= new MutateInOptions();
            // convert new style specs into old style builder
            var builder = new MutateInBuilder <byte[]>(null, null, id, specs);

            //resolve StoreSemantics to SubdocDocFlags
            var docFlags = SubdocDocFlags.None;

            switch (options.StoreSemanticsValue)
            {
            case StoreSemantics.Replace:
                break;

            case StoreSemantics.Upsert:
                docFlags |= SubdocDocFlags.UpsertDocument;
                break;

            case StoreSemantics.Insert:
                docFlags |= SubdocDocFlags.InsertDocument;
                break;

            case StoreSemantics.AccessDeleted:
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            using var rootSpan = RootSpan(OperationNames.MultiMutationSubdocMutate);
            using var mutation = new MultiMutation <byte[]>
                  {
                      Key             = id,
                      BucketName      = _bucket.Name,
                      Builder         = builder,
                      Cid             = Cid,
                      CName           = Name,
                      Expires         = options.ExpiryValue.ToTtl(),
                      DurabilityLevel = options.DurabilityLevel,
                      Transcoder      = _transcoder,
                      DocFlags        = docFlags,
                      Span            = rootSpan
                  };

            await RetryUntilTimeoutOrSuccessAsync(options.TokenValue, options.TimeoutValue, mutation).ConfigureAwait(false);

            return(new MutateInResult(mutation.GetCommandValues(), mutation.Cas, mutation.MutationToken,
                                      options.SerializerValue ?? _transcoder.Serializer));
        }
コード例 #14
0
        public void SubDocDelete_WillNotRetry_IfCasIsZero()
        {
            var mockedInvoker = new Mock <ISubdocInvoker>();
            var builder       = new MutateInBuilder <dynamic>(mockedInvoker.Object, () => new DefaultSerializer(), "thekey");

            builder.Remove("somepath");
            var op = new SubDocDelete <dynamic>(builder, "thekey", new Mock <IVBucket>().Object,
                                                new Mock <ITypeTranscoder>().Object, 10)
            {
                Cas = 0
            };

            Assert.IsFalse(op.CanRetry());
        }
コード例 #15
0
        public void MultiMutation_WillRetry_IfHasCas()
        {
            var mockedInvoker = new Mock <ISubdocInvoker>();
            var builder       = new MutateInBuilder <dynamic>(mockedInvoker.Object, () => new DefaultSerializer(), "thekey");

            builder.Remove("somepath");
            var op = new MultiMutation <dynamic>("thekey", builder, new Mock <IVBucket>().Object,
                                                 new Mock <ITypeTranscoder>().Object, 10)
            {
                Cas = 100
            };

            Assert.IsTrue(op.CanRetry());
        }
コード例 #16
0
        public void When_Cloned_Expires_Is_Copied()
        {
            var invoker = new Mock<ISubdocInvoker>();
            var builder = new MutateInBuilder<dynamic>(invoker.Object, () => new DefaultSerializer(), "key",
                new List<OperationSpec> { new OperationSpec() });

            var op = new SubCounter<dynamic>(builder, "key", null, new DefaultTranscoder(), 0)
            {
                Expires = 10
            };

            Assert.AreEqual(10, op.Expires);
            var cloned = op.Clone() as SubCounter<dynamic>;
            Assert.AreEqual(10, cloned.Expires);
        }
コード例 #17
0
        public async Task <IMutationResult> MutateIn(string id, IEnumerable <OperationSpec> specs, MutateInOptions options)
        {
            // convert new style specs into old style builder
            var builder = new MutateInBuilder <byte[]>(null, null, id, specs);

            var mutation = new MultiMutation <byte[]>
            {
                Key             = id,
                Builder         = builder,
                Cid             = Cid,
                DurabilityLevel = options._DurabilityLevel
            };

            await ExecuteOp(mutation, options._Token, options._Timeout);

            return(new MutationResult(mutation.Cas, null, mutation.MutationToken));
        }
コード例 #18
0
        public void MultiMutate_Clone()
        {
            var mockedInvoker = new Mock <ISubdocInvoker>();
            var builder       = new MutateInBuilder <dynamic>(mockedInvoker.Object, () => new DefaultSerializer(), "thekey");

            builder.Remove("somepath");
            builder.ArrayPrepend("pathone", 10);
            var op = new MultiMutation <dynamic>("thekey", builder, new Mock <IVBucket>().Object,
                                                 new Mock <ITypeTranscoder>().Object, 10)
            {
                Cas = 100
            };

            var cloned = (MultiMutation <dynamic>)op.Clone();

            Assert.AreEqual(op, cloned);
        }
コード例 #19
0
        public async Task <IMutateInResult> MutateInAsync(string id, IEnumerable <MutateInSpec> specs, MutateInOptions?options = null)
        {
            //sanity check for deferred bootstrapping errors
            _bucket.ThrowIfBootStrapFailed();

            options ??= new MutateInOptions();
            // convert new style specs into old style builder
            var builder = new MutateInBuilder <byte[]>(null, null, id, specs);

            //resolve StoreSemantics to SubdocDocFlags
            var docFlags = SubdocDocFlags.None;

            switch (options.StoreSemanticsValue)
            {
            case StoreSemantics.Replace:
                break;

            case StoreSemantics.Upsert:
                docFlags |= SubdocDocFlags.UpsertDocument;
                break;

            case StoreSemantics.Insert:
                docFlags |= SubdocDocFlags.InsertDocument;
                break;

            case StoreSemantics.AccessDeleted:
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            using var mutation = new MultiMutation <byte[]>
                  {
                      Key             = id,
                      Builder         = builder,
                      Cid             = Cid,
                      DurabilityLevel = options.DurabilityLevel,
                      Transcoder      = _transcoder,
                      DocFlags        = docFlags
                  };
            await _bucket.SendAsync(mutation, options.TokenValue, options.TimeoutValue);

            return(new MutateInResult(mutation.Cas, mutation.MutationToken, mutation.GetCommandValues()));
        }
コード例 #20
0
        public async Task <IMutationResult> MutateInAsync(string id, IEnumerable <OperationSpec> specs, MutateInOptions options = null)
        {
            options = options ?? new MutateInOptions();
            // convert new style specs into old style builder
            var builder = new MutateInBuilder <byte[]>(null, null, id, specs);

            //resolve StoreSemantics to SubdocDocFlags
            var docFlags = SubdocDocFlags.None;

            switch (options.StoreSemantics)
            {
            case StoreSemantics.Replace:
                break;

            case StoreSemantics.Upsert:
                docFlags |= SubdocDocFlags.UpsertDocument;
                break;

            case StoreSemantics.Insert:
                docFlags |= SubdocDocFlags.InsertDocument;
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            using (var mutation = new MultiMutation <byte[]>
            {
                Key = id,
                Builder = builder,
                Cid = Cid,
                DurabilityLevel = options.DurabilityLevel,
                Transcoder = _transcoder,
                DocFlags = docFlags
            })
            {
                await _bucket.SendAsync(mutation, options.Token, options.Timeout);

                return(new MutationResult(mutation.Cas, null, mutation.MutationToken));
            }
        }
コード例 #21
0
 public MultiMutation(string key, MutateInBuilder <T> mutateInBuilder, IVBucket vBucket, ITypeTranscoder transcoder, uint timeout)
     : base(key, vBucket, transcoder, timeout)
 {
     _builder = mutateInBuilder;
     Cas      = _builder.Cas;
 }
コード例 #22
0
 public FakeMultiMutationOperation(string key, MutateInBuilder <T> mutateInBuilder, IVBucket vBucket, ITypeTranscoder transcoder, uint timeout)
     : base(key, mutateInBuilder, vBucket, transcoder, timeout)
 {
 }
コード例 #23
0
        public void MultiMutate_Clone()
        {
            var mockedInvoker = new Mock<ISubdocInvoker>();
            var builder = new MutateInBuilder<dynamic>(mockedInvoker.Object, () => new DefaultSerializer(), "thekey");

            builder.Remove("somepath");
            builder.ArrayPrepend("pathone", 10);
            var op = new MultiMutation<dynamic>("thekey", builder, new Mock<IVBucket>().Object,
                new Mock<ITypeTranscoder>().Object, 10)
            { Cas = 100 };

            var cloned = (MultiMutation<dynamic>) op.Clone();
            Assert.AreEqual(op, cloned);
        }
コード例 #24
0
 public SubDocDelete(MutateInBuilder <T> builder, string key, T value, IVBucket vBucket, ITypeTranscoder transcoder, uint timeout)
     : base(builder, key, value, vBucket, transcoder, SequenceGenerator.GetNext(), timeout)
 {
     CurrentSpec = builder.FirstSpec();
     Path        = CurrentSpec.Path;
 }
コード例 #25
0
        public async Task <IMutateInResult> MutateInAsync(string id, IEnumerable <MutateInSpec> specs, MutateInOptions?options = null)
        {
            //sanity check for deferred bootstrapping errors
            _bucket.ThrowIfBootStrapFailed();

            options ??= MutateInOptions.Default;
            // convert new style specs into old style builder
            var builder = new MutateInBuilder <byte[]>(null, null, id, specs);

            //resolve StoreSemantics to SubdocDocFlags
            var docFlags = SubdocDocFlags.None;

            switch (options.StoreSemanticsValue)
            {
            case StoreSemantics.Replace:
                break;

            case StoreSemantics.Upsert:
                docFlags |= SubdocDocFlags.UpsertDocument;
                break;

            case StoreSemantics.Insert:
                docFlags |= SubdocDocFlags.InsertDocument;
                break;

            case StoreSemantics.AccessDeleted:
                docFlags |= SubdocDocFlags.AccessDeleted;
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            if (options.CreateAsDeletedValue)
            {
                if (!_bucket.BucketConfig?.BucketCapabilities.Contains(BucketCapabilities.CREATE_AS_DELETED) == true)
                {
                    throw new FeatureNotAvailableException(nameof(BucketCapabilities.CREATE_AS_DELETED));
                }

                docFlags |= SubdocDocFlags.CreateAsDeleted;
            }

            if (options.AccessDeletedValue)
            {
                docFlags |= SubdocDocFlags.AccessDeleted;
            }

            using var rootSpan = RootSpan(OperationNames.MultiMutationSubdocMutate);
            using var mutation = new MultiMutation <byte[]>
                  {
                      Key             = id,
                      BucketName      = _bucket.Name,
                      Builder         = builder,
                      Cas             = options.CasValue,
                      Cid             = Cid,
                      CName           = Name,
                      Expires         = options.ExpiryValue.ToTtl(),
                      DurabilityLevel = options.DurabilityLevel,
                      DocFlags        = docFlags,
                      Span            = rootSpan
                  };
            _operationConfigurator.Configure(mutation, options);

            using var cts = CreateRetryTimeoutCancellationTokenSource(options, mutation);
            await _bucket.RetryAsync(mutation, cts.Token).ConfigureAwait(false);

            return(new MutateInResult(mutation.GetCommandValues(), mutation.Cas, mutation.MutationToken,
                                      options.SerializerValue ?? mutation.Transcoder.Serializer));
        }