public void A_UnfoldResourceAsyncSource_must_unfold_data_from_a_resource() { var createPromise = new TaskCompletionSource <Done>(); var closePromise = new TaskCompletionSource <Done>(); var values = Enumerable.Range(0, 1000).ToList(); var resource = new ResourceDummy <int>(values, createPromise.Task, closeFuture: closePromise.Task); var probe = this.CreateSubscriberProbe <int>(); Source.UnfoldResourceAsync( () => resource.Create(), r => r.Read(), close: r => r.Close()) .RunWith(Sink.FromSubscriber(probe), Materializer); probe.Request(1); _ = resource.Created.Result; probe.ExpectNoMsg(TimeSpan.FromMilliseconds(200)); createPromise.SetResult(Done.Instance); values.ForEach(i => { _ = resource.FirstElementRead.Result; probe.ExpectNext().ShouldBe(i); probe.Request(1); }); resource.Closed.Wait(); closePromise.SetResult(Done.Instance); probe.ExpectComplete(); }
public void A_UnfoldResourceAsyncSource_must_close_resource_successfully_right_after_open() { this.AssertAllStagesStopped(() => { var probe = this.CreateSubscriberProbe <int>(); var firtRead = new TaskCompletionSource <Done>(); var resource = new ResourceDummy <int>(new[] { 1 }, firstReadFuture: firtRead.Task); Source.UnfoldResourceAsync( create: () => resource.Create(), read: reader => reader.Read(), close: reader => reader.Close()) .RunWith(Sink.FromSubscriber(probe), Materializer); probe.Request(1L); _ = resource.FirstElementRead.Result; // we cancel before we complete first read (racy) probe.Cancel(); Thread.Sleep(100); firtRead.SetResult(Done.Instance); resource.Closed.Wait(); }, Materializer); }