public async Task <string> ExecuteAsync(string sessionId, Stream assemblyStream, bool includePerformance, CancellationToken cancellationToken) { var startMarker = Guid.NewGuid(); var endMarker = Guid.NewGuid(); var executeCommand = new ExecuteCommand( ((MemoryStream)assemblyStream).ToArray(), startMarker, endMarker, includePerformance ); var stdin = new MemoryStream(); Serializer.SerializeWithLengthPrefix(stdin, executeCommand, PrefixStyle.Base128); stdin.Seek(0, SeekOrigin.Begin); var stdout = new MemoryStream(); var savedConsoleOut = Console.Out; Console.SetOut(new StreamWriter(stdout) { AutoFlush = true }); try { Program.Run(stdin, stdout); } finally { Console.SetOut(savedConsoleOut); } stdout.Seek(0, SeekOrigin.Begin); var stdoutReader = new StdoutReader(); var outputResult = await stdoutReader.ReadOutputAsync( new MultiplexedStream(stdout, multiplexed : false), new byte[stdout.Length], Encoding.UTF8.GetBytes(startMarker.ToString()), Encoding.UTF8.GetBytes(endMarker.ToString()), cancellationToken ); return(Encoding.UTF8.GetString(outputResult.Output.Span)); }
public async Task ReadOutputAsync_DetectsOutputBoundariesCorrectly(string[] segments, string expectedOutput) { var reader = new StdoutReader(); var inputStream = new Utf8SegmentedAsyncStream(segments); var outputBuffer = new byte[10240]; using var cancellationTokenSource = new CancellationTokenSource( Debugger.IsAttached ? TimeSpan.FromMinutes(15) : TimeSpan.FromSeconds(30) ); var result = await reader.ReadOutputAsync( new MultiplexedStream(inputStream, multiplexed : false), outputBuffer, Encoding.UTF8.GetBytes("START"), Encoding.UTF8.GetBytes("END"), cancellationTokenSource.Token ); Assert.Equal(expectedOutput, Encoding.UTF8.GetString(result.Output.Span)); Assert.True(result.IsOutputReadSuccess); }