public unsafe void Test() { var counter = Substitute.For <IStructSizeCounter>(); const int aSize = 64; counter.GetSize(typeof(A)).Returns(aSize); const int envelopeSize = 4; counter.GetSize(typeof(Envelope)).Returns(envelopeSize); var buffer = Substitute.For <IRingBuffer>(); buffer.Write(0, new ByteChunk()).ReturnsForAnyArgs(true); const int messageId = 5; var asm = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("AnythingForTests"), AssemblyBuilderAccess.Run); var main = asm.DefineDynamicModule("main"); var writer = MessageWriterBuilder.Build(counter, l => messageId, new[] { typeof(A) }, main); var e = new Envelope(new ActorId(1)); var a = new A(); Assert.True(writer.Write(ref e, ref a, buffer)); var call = buffer.ReceivedCalls().Single(); var args = call.GetArguments(); Assert.AreEqual("Write", call.GetMethodInfo().Name); Assert.AreEqual(messageId, args[0]); Assert.AreEqual(new ByteChunk((byte *)&a, aSize), args[1]); }
public void ApplyCommonSettingsUsesODataServerBehavior() { var testSubject = new ODataMessageWriterSettings(); testSubject.EnableDefaultBehavior(); MessageWriterBuilder.ApplyCommonSettings(testSubject, new Uri("http://www.example.com"), VersionUtil.Version4Dot0, this.dataServiceSimulator, this.responseMessageSimulator); testSubject.WriterBehavior.ShouldHave().AllProperties().EqualTo(ODataWriterBehavior.CreateODataServerBehavior()); }
public void CreatedSettingsUseDefaultQuotas() { var settings = MessageWriterBuilder.CreateMessageWriterSettings(); settings.MessageQuotas.MaxReceivedMessageSize.Should().Be(long.MaxValue); settings.MessageQuotas.MaxPartsPerBatch = int.MaxValue; settings.MessageQuotas.MaxOperationsPerChangeset = int.MaxValue; settings.MessageQuotas.MaxNestingDepth = int.MaxValue; }
public void VersionShouldBeConvertedAndSet() { var testSubject = new ODataMessageWriterSettings { Version = ODataVersion.V4 }; MessageWriterBuilder.ApplyCommonSettings(testSubject, new Uri("http://www.example.com"), VersionUtil.Version4Dot0, this.dataServiceSimulator, this.responseMessageSimulator); testSubject.Version.Should().Be(ODataVersion.V4); }
public void ServiceUriShouldBeSetAsBase() { Uri serviceUri = new Uri("http://www.example.com"); var testSubject = new ODataMessageWriterSettings { BaseUri = null }; MessageWriterBuilder.ApplyCommonSettings(testSubject, serviceUri, VersionUtil.Version4Dot0, this.dataServiceSimulator, this.responseMessageSimulator); testSubject.BaseUri.Should().BeSameAs(serviceUri); }
public unsafe void Actors() { using (var buffer = new ManyToOneRingBuffer(new UnsafeBuffer(1024.Megabytes() + RingBufferDescriptor.TrailerLength))) { var someBytes = stackalloc byte[1]; buffer.Write(5, new ByteChunk(someBytes, 1)); buffer.Read((a, b) => { }, 1); var module = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("ActorsTestsDynAssembly"), AssemblyBuilderAccess.Run).DefineDynamicModule("main"); var counter = new StructSizeCounter(); var registry = new ActorRegistry(new[] { Tuple.Create(new ActorDescriptor(new Handler()), (IRingBuffer)buffer, new ActorId(1)) }); var writer = MessageWriterBuilder.Build(counter, registry.GetMessageTypeId, new[] { typeof(A) }, module); var bus = new Bus(new ActorId(2), registry, 20, writer); var msg = new A(); bus.Publish(ref msg); // publication is prepared do it var howMany = 200000000; var oneMiliion = 1000000; using (var scheduler = new RoundRobinThreadAffinedTaskScheduler(4)) { var wait = new ManualResetEventSlim(); var t = new CancellationToken(); var p1 = CreateProducer(wait, t, howMany, bus, scheduler); var p2 = CreateProducer(wait, t, howMany, bus, scheduler); var producentCount = 2; var totalMessageCount = howMany * producentCount; var worker = new Worker(totalMessageCount, wait, buffer, t); var consumer = Task.Factory.StartNew(worker.DoWhile, t, TaskCreationOptions.LongRunning, scheduler); GC.Collect(2, GCCollectionMode.Forced); var sw = Stopwatch.StartNew(); wait.Set(); Task.WaitAll(p1, p2, consumer); sw.Stop(); Console.WriteLine( $"{howMany} messages written by each of {producentCount} producers and consumed in {sw.Elapsed}"); Console.WriteLine( $"One million in {TimeSpan.FromMilliseconds(sw.Elapsed.TotalMilliseconds*oneMiliion/totalMessageCount)}"); } } }
public void ApplyCommonSettingsShouldDisableMessageStreamDisposalForTopLevel() { // AstoriaResponseMessage is only used for representing top-level responses, not individual parts of a batched response. var topLevelResponseMessage = new AstoriaResponseMessage(this.host); var testSubject = new ODataMessageWriterSettings { EnableMessageStreamDisposal = true }; MessageWriterBuilder.ApplyCommonSettings(testSubject, new Uri("http://www.example.com"), VersionUtil.Version4Dot0, this.dataServiceSimulator, topLevelResponseMessage); testSubject.EnableMessageStreamDisposal.Should().BeFalse(); }
public void ApplyCommonSettingsShouldNotDisableMessageStreamDisposalForNonTopLevel() { // AstoriaResponseMessage is only used for representing top-level responses, not individual parts of a batched response. // For this test, its enough to just pass the test implementation of the response contract. var nonTopLevelResponseMessage = this.responseMessageSimulator; var testSubject = new ODataMessageWriterSettings { EnableMessageStreamDisposal = false }; MessageWriterBuilder.ApplyCommonSettings(testSubject, new Uri("http://www.example.com"), VersionUtil.Version4Dot0, this.dataServiceSimulator, nonTopLevelResponseMessage); testSubject.EnableMessageStreamDisposal.Should().BeTrue(); }
private MessageWriterBuilder ForNormalRequest(RequestDescription requestDescription) { this.dataServiceSimulator.OperationContext.InitializeAndCacheHeaders(this.dataServiceSimulator); this.dataServiceSimulator.OperationContext.RequestMessage.CacheHeaders(); this.dataServiceSimulator.OperationContext.RequestMessage.InitializeRequestVersionHeaders(VersionUtil.Version4Dot0); requestDescription.ParseExpandAndSelect(this.dataServiceSimulator); requestDescription.DetermineWhetherResponseBodyOrETagShouldBeWritten(HttpVerbs.GET); requestDescription.DetermineWhetherResponseBodyShouldBeWritten(HttpVerbs.GET); requestDescription.DetermineResponseFormat(this.dataServiceSimulator); var testSubject = MessageWriterBuilder.ForNormalRequest(this.dataServiceSimulator, requestDescription, this.responseMessageSimulator, new EdmModel()); return(testSubject); }
public unsafe void Setup() { _buffer = new ManyToOneRingBuffer(new UnsafeBuffer(1024.Megabytes() + RingBufferDescriptor.TrailerLength)); var someBytes = stackalloc byte[1]; _buffer.Write(5, new ByteChunk(someBytes, 1)); _buffer.Read((a, b) => { }, 1); var module = AppDomain.CurrentDomain.DefineDynamicAssembly( new AssemblyName("ActorsTestsDynAssembly"), AssemblyBuilderAccess.Run).DefineDynamicModule("main"); var counter = new StructSizeCounter(); var registry = new ActorRegistry( new[] { Tuple.Create(new ActorDescriptor(new Handler()), (IRingBuffer)_buffer, new ActorId(1)) }); var writer = MessageWriterBuilder.Build(counter, registry.GetMessageTypeId, new[] { typeof(A) }, module); _bus = new Bus(new ActorId(2), registry, 20, writer); }
public void CreatedSettingsShouldHaveCheckCharactersTurnedOff() { var settings = MessageWriterBuilder.CreateMessageWriterSettings(); settings.EnableCharactersCheck.Should().BeFalse(); }
public Context Start(Action <Exception> exceptionAction = null) { var module = AppDomain.CurrentDomain.DefineDynamicAssembly( new AssemblyName("RampUp_MessageWriter_" + Guid.NewGuid()), AssemblyBuilderAccess.Run).DefineDynamicModule("main"); InitMessageTypesDictionary(); var writer = MessageWriterBuilder.Build(_counter, GetMessageId, _messageTypes.ToArray(), module); var runners = _registrations.Select(f => f()).ToList(); if (_featureActors.Count > 0) { runners.Add(BuildRunner(_featureActors, new Bus())); } var registry = CreateRegistry(runners); foreach (var kvp in _runnerBusMap) { var index = runners.FindIndex(r => ReferenceEquals(r, kvp.Key)); kvp.Value.Init(GetId(index), registry, ThrowAfterNTrials, writer); } var source = new CancellationTokenSource(); var end = new ManualResetEventSlim(); var ctx = new Context(source, end, new Bus(new ActorId(0), registry, ThrowAfterNTrials, writer)); var token = source.Token; _scheduler = new RoundRobinThreadAffinedTaskScheduler(runners.Count); var factory = new TaskFactory(_scheduler); var runningTasks = runners.Select(runner => { return(factory.StartNew(() => { try { while (token.IsCancellationRequested == false) { BatchInfo info; runner.SpinOnce(out info); } } catch (TaskCanceledException) { } catch (Exception) { source.Cancel(); throw; } }, token)); }).ToArray(); // ReSharper disable once MethodSupportsCancellation Task.WhenAll(runningTasks).ContinueWith(t => { _scheduler.Dispose(); foreach (var buffer in _buffers) { buffer.Dispose(); } ctx.Exception = t.Exception; if (t.Exception != null) { exceptionAction?.Invoke(t.Exception); } end.Set(); }); return(ctx); }
public void CreatedSettingsShouldHaveIndentTurnedOff() { var settings = MessageWriterBuilder.CreateMessageWriterSettings(); settings.Indent.Should().BeFalse(); }