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)); }
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; }
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 ); }
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); }
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 ); }
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"); }
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); }
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); }
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); }
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)); }
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()); }
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()); }
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)); }
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()); }
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()); }
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); }
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)); }
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); }
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())); }
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)); } }
public MultiMutation(string key, MutateInBuilder <T> mutateInBuilder, IVBucket vBucket, ITypeTranscoder transcoder, uint timeout) : base(key, vBucket, transcoder, timeout) { _builder = mutateInBuilder; Cas = _builder.Cas; }
public FakeMultiMutationOperation(string key, MutateInBuilder <T> mutateInBuilder, IVBucket vBucket, ITypeTranscoder transcoder, uint timeout) : base(key, mutateInBuilder, vBucket, transcoder, timeout) { }
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); }
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; }
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)); }