public async Task CancelPendingFlushLostOfCancellationsNoDataLost()
        {
            var writeSize         = 16;
            var singleWriteStream = new SingleWriteStream();

            MemoryStream = singleWriteStream;
            Writer       = new StreamPipeWriter(MemoryStream, minimumSegmentSize: writeSize);

            for (var i = 0; i < 10; i++)
            {
                FlushResult flushResult  = new FlushResult();
                var         expectedData = Encoding.ASCII.GetBytes(new string('a', writeSize));

                var tcs = new TaskCompletionSource <int>(TaskCreationOptions.RunContinuationsAsynchronously);

                var task = Task.Run(async() =>
                {
                    try
                    {
                        // Create two Segments
                        // First one will succeed to write, other one will hang.
                        for (var j = 0; j < 2; j++)
                        {
                            Writer.Write(expectedData);
                        }

                        var flushTask = Writer.FlushAsync();
                        tcs.SetResult(0);
                        flushResult = await flushTask;
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                        throw ex;
                    }
                });

                await tcs.Task;

                Writer.CancelPendingFlush();

                await task;

                Assert.True(flushResult.IsCanceled);
            }

            // Only half of the data was written because every other flush failed.
            Assert.Equal(16 * 10, ReadWithoutFlush().Length);

            // Start allowing all writes to make read succeed.
            singleWriteStream.AllowAllWrites = true;

            Assert.Equal(16 * 10 * 2, Read().Length);
        }
示例#2
0
        public async Task CanAdvanceWithPartialConsumptionOfFirstSegment(int firstWriteLength)
        {
            Writer = new StreamPipeWriter(Stream, MinimumSegmentSize, new TestMemoryPool(maxBufferSize: 20000));
            await Writer.WriteAsync(Encoding.ASCII.GetBytes("a"));

            var memory = Writer.GetMemory(firstWriteLength);

            Writer.Advance(firstWriteLength);

            memory = Writer.GetMemory();
            Writer.Advance(memory.Length);

            await Writer.FlushAsync();

            Assert.Equal(firstWriteLength + memory.Length + 1, Read().Length);
        }
示例#3
0
        public async Task CanSerializeBodyRequestCorrectly()
        {
            var stream = new MemoryStream();

            using (var streamPipeWriter = new StreamPipeWriter(stream))
            {
                TextAnalysis.WriteRequest(streamPipeWriter, "This is a body of text\n with a new line");

                await streamPipeWriter.FlushAsync();
            }
            stream.Flush();
            stream.Seek(0, SeekOrigin.Begin);
            var text = new StreamReader(stream, Encoding.UTF8).ReadToEnd();

            text.ShouldBe(@"{""documents"":[{""language"":""en"",""id"":""doc"",""text"":""This is a body of text\n with a new line""}]}");
        }
示例#4
0
        public async Task <IReadOnlyCollection <string> > Suggest(string url, string title, string body, string[] skipTags)
        {
            var document = $"{title}\n{body}".Trim();

            if (string.IsNullOrWhiteSpace(document))
            {
                return new string[] { }
            }
            ;

            var request    = new HttpRequestMessage(HttpMethod.Post, "https://westeurope.api.cognitive.microsoft.com/text/analytics/v2.0/entities");
            var bodyStream = new MemoryStream();

            using (var streamPipeWriter = new StreamPipeWriter(bodyStream))
            {
                WriteRequest(streamPipeWriter, document);

                await streamPipeWriter.FlushAsync();
            }
            bodyStream.Seek(0, SeekOrigin.Begin);
            request.Content = new StreamContent(bodyStream)
            {
                Headers = { { "Content-Type", MediaTypeNames.Application.Json } }
            };

            var response = await client.SendAsync(request);

            if (!response.IsSuccessStatusCode)
            {
                throw new InvalidOperationException(response.ReasonPhrase + "\n" + await response.Content.ReadAsStringAsync());
                return(new string[] { });
            }

            var responseDoc = await JsonDocument.ParseAsync(await response.Content.ReadAsStreamAsync());

            var doc = responseDoc.RootElement.GetProperty("documents")
                      .EnumerateArray()
                      .First(d => d.GetProperty("id").GetString() == _singleDocId);

            return(doc.GetProperty("entities")
                   .EnumerateArray()
                   .Select(entity => (name: entity.GetProperty("name").GetString(),
                                      matchCount: entity.GetProperty("matches").EnumerateArray().Count()))
                   .OrderByDescending(k => k.matchCount)
                   .Select(k => k.name.ToLowerInvariant().Replace(" ", "-"))
                   .ToArray());
        }