public async Task WriteBody_Repeats_Safely() { var bytes = new byte[] { 129, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 16, 21, 240, 165, 234, 46, 107, 0, 0, 3, 0, 0, 0, 0, 0, 2, 49, 48, 4, 0, 0, 0, 0, 0, 2, 45, 53 }; var builder = new MutateInSpecBuilder(); for (int i = 0; i < 10; i++) { builder.Upsert("upsert_" + i, i); } var op = new MultiMutation <byte[]>("thekey", builder.Specs) { Transcoder = new JsonTranscoder() }; op.OperationBuilderPool = new DefaultObjectPool <OperationBuilder>(new OperationBuilderPoolPolicy()); await op.SendAsync(new Mock <IConnection>().Object).ConfigureAwait(false); op.Read(new FakeMemoryOwner <byte>(bytes)); Assert.Equal(10, op.GetCommandValues().Count); op.Reset(); await op.SendAsync(new Mock <IConnection>().Object).ConfigureAwait(false); op.Read(new FakeMemoryOwner <byte>(bytes)); Assert.Equal(10, op.GetCommandValues().Count); var result = new MutateInResult(op.GetCommandValues(), 0, MutationToken.Empty, new DefaultSerializer()); }
public async Task When_Index_Invalid_IndexNotFoundException_Thrown(int index) { var bytes = new byte[] { 129, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 16, 21, 240, 165, 234, 46, 107, 0, 0, 3, 0, 0, 0, 0, 0, 2, 49, 48, 4, 0, 0, 0, 0, 0, 2, 45, 53 }; var specs = new MutateInSpecBuilder().Upsert("name", "mike").Replace("bar", "bar").Insert("bah", 0) .Increment("zzz", 10, true).Decrement("xxx", 5, true).Specs; var op = new MultiMutation <byte[]> { Builder = new MutateInBuilder <byte[]>(null, null, "thekey", specs), Transcoder = new JsonTranscoder() }; op.OperationBuilderPool = new DefaultObjectPool <OperationBuilder>(new OperationBuilderPoolPolicy()); await op.SendAsync(new Mock <IConnection>().Object).ConfigureAwait(false); op.Read(new FakeMemoryOwner <byte>(bytes)); var result = new MutateInResult(op.GetCommandValues(), 0, MutationToken.Empty, new DefaultSerializer()); Assert.Throws <InvalidIndexException>(() => result.ContentAs <string>(index)); }
public async Task When_Result_Contains_Values_AllowRead() { var bytes = new byte[] { 129, 209, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 16, 21, 240, 165, 234, 46, 107, 0, 0, 3, 0, 0, 0, 0, 0, 2, 49, 48, 4, 0, 0, 0, 0, 0, 2, 45, 53 }; var specs = new MutateInSpecBuilder(). Upsert("name", "mike"). Replace("bar", "bar"). Insert("bah", 0). Increment("zzz", 10, true). Decrement("xxx", 5, true).Specs; var op = new MultiMutation <byte[]> { Builder = new MutateInBuilder <byte[]>(null, null, "thekey", specs) }; await op.SendAsync(new Mock <IConnection>().Object).ConfigureAwait(false); await op.ReadAsync(new FakeMemoryOwner <byte>(bytes), null).ConfigureAwait(false); var result = new MutateInResult(op.GetCommandValues(), 0, MutationToken.Empty, new DefaultSerializer()); Assert.Equal(0, result.ContentAs <int>(0)); Assert.Equal(0, result.ContentAs <int>(1)); Assert.Equal(0, result.ContentAs <int>(2)); Assert.Equal(10, result.ContentAs <int>(3)); Assert.Equal(-5, result.ContentAs <int>(4)); }
public async Task Can_MutateIn_Parse_Flexible_Header_Args() { var responsePacket = new byte[] { 0x18, 0xd1, 0x03, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x44, 0x15, 0xfa, 0xc3, 0x29, 0x58, 0x19, 0x00, 0x00, 0x02, 0x00, 0x12, 0x00, 0x00, 0xad, 0x17, 0x52, 0xf2, 0x38, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x31, 0x30, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x2d, 0x35 }; var specs = new MutateInSpecBuilder(). Upsert("name", "mike"). Replace("bar", "bar"). Insert("bah", 0). Increment("zzz", 10, true). Decrement("xxx", 5, true).Specs; var op = new MultiMutation <byte[]> { Builder = new MutateInBuilder <byte[]>(null, null, "thekey", specs) }; await op.SendAsync(new Mock <IConnection>().Object).ConfigureAwait(false); op.Read(new FakeMemoryOwner <byte>(responsePacket)); var result = new MutateInResult(op.GetCommandValues(), 0, MutationToken.Empty, new DefaultSerializer()); Assert.Equal(10, result.ContentAs <int>(3)); Assert.Equal(-5, result.ContentAs <int>(4)); }
public void MutationMacro_Sets_Correct_Flags() { var builder = new MutateInSpecBuilder(); builder.Upsert("", MutationMacro.Cas); Assert.True(builder.Specs.First().PathFlags.HasFlag(SubdocPathFlags.ExpandMacroValues)); Assert.True(builder.Specs.First().PathFlags.HasFlag(SubdocPathFlags.Xattr)); }
public void Remove_WithExpression_AddsSpec() { // Arrange var builder = new MutateInSpecBuilder <MyDoc>(new DefaultSerializer()); // Act builder.Remove(p => p.Prop); // Assert var spec = Assert.Single(builder.Specs); Assert.NotNull(spec); Assert.Equal("`prop`", spec.Path); Assert.Equal(OpCode.SubDelete, spec.OpCode); }
public void MutationMacro_Sets_Correct_Flags() { var builder = new MutateInSpecBuilder(); builder.Upsert("", MutationMacro.Cas); Assert.True(builder.Specs.First().PathFlags.HasFlag(SubdocPathFlags.ExpandMacroValues)); Assert.True(builder.Specs.First().PathFlags.HasFlag(SubdocPathFlags.Xattr)); // NCBC-2601: specifying isXattr: true in combination with MutationMacro resulted in isXattr flipping to false. // MutationMacro is *only* valid with isXattr: true builder.Upsert("foo", MutationMacro.Cas, isXattr: true); // Making this throw an ArgumentException would require changing the method signature from bool to bool?, which // would be a breaking change. We leave it as silently ignoring the false value. builder.Upsert("bar", MutationMacro.Cas, isXattr: false); Assert.True(builder.Specs.TrueForAll(spec => spec.PathFlags.HasFlag(SubdocPathFlags.ExpandMacroValues))); Assert.True(builder.Specs.TrueForAll(spec => spec.PathFlags.HasFlag(SubdocPathFlags.Xattr))); }
public void Replace_WithExpression_AddsSpec() { // Arrange var fakeValue = "abc"; var builder = new MutateInSpecBuilder <MyDoc>(new DefaultSerializer()); // Act builder.Replace(p => p.Prop, fakeValue); // Assert var spec = Assert.Single(builder.Specs); Assert.NotNull(spec); Assert.Equal("`prop`", spec.Path); Assert.Equal(OpCode.SubReplace, spec.OpCode); Assert.Equal(fakeValue, spec.Value); }
public void ArrayInsert_WithExpression_AddsSpec() { // Arrange var fakeValue = "abc"; var builder = new MutateInSpecBuilder <MyDoc>(new DefaultSerializer()); // Act builder.ArrayInsert(p => p.Array[3], fakeValue); // Assert var spec = Assert.Single(builder.Specs); Assert.NotNull(spec); Assert.Equal("`array`[3]", spec.Path); Assert.Equal(OpCode.SubArrayInsert, spec.OpCode); Assert.Equal(fakeValue, spec.Value); }
public void Upsert_WithDynamicExpression_AddsSpec() { // Arrange var fakeValue = "abc"; var builder = new MutateInSpecBuilder <MyDoc>(new DefaultSerializer()); // Act builder.Upsert(p => p.Dynamic, fakeValue, true); // Assert var spec = Assert.Single(builder.Specs); Assert.NotNull(spec); Assert.Equal("`dynamic`", spec.Path); Assert.Equal(OpCode.SubDictUpsert, spec.OpCode); Assert.Equal(fakeValue, spec.Value); Assert.Equal(SubdocPathFlags.CreatePath, spec.PathFlags); }
public void Decrement_WithExpression_AddsSpec() { // Arrange var fakeDelta = 123L; var builder = new MutateInSpecBuilder <MyDoc>(new DefaultSerializer()); // Act builder.Decrement(p => p.Prop, fakeDelta, true); // Assert var spec = Assert.Single(builder.Specs); Assert.NotNull(spec); Assert.Equal("`prop`", spec.Path); Assert.Equal(OpCode.SubCounter, spec.OpCode); Assert.Equal(-fakeDelta, spec.Value); Assert.Equal(SubdocPathFlags.CreatePath, spec.PathFlags); }
public void AddUnique_WithExpression_AddsSpec() { // Arrange var fakeValue = "abc"; var builder = new MutateInSpecBuilder <MyDoc>(new DefaultSerializer()); // Act builder.ArrayAddUnique(p => p.Array, fakeValue, true); // Assert var spec = Assert.Single(builder.Specs); Assert.NotNull(spec); Assert.Equal("`array`", spec.Path); Assert.Equal(OpCode.SubArrayAddUnique, spec.OpCode); Assert.Equal(fakeValue, spec.Value); Assert.Equal(SubdocPathFlags.CreatePath, spec.PathFlags); }