Exemple #1
0
            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);
        }