public SimulatorOutgoingMessage(Guid id, Stream data, Action messageCompletedAction,
                                 NamedPipeCommunicationProtocol communicationProtocol,
                                 ILog log, PipeStream writeStream, byte[] fixedHeader)
     : base(id, data, messageCompletedAction, communicationProtocol, log, writeStream)
 {
     this.messageCompletedAction = messageCompletedAction;
     this.writeStream            = writeStream;
     this.fixedHeader            = fixedHeader;
 }
        protected override async Task <int> Execute(ICommandManager commandManager)
        {
            ExecutionContext context = LifetimeScope.Resolve <ExecutionContext>();

            context.WriteInformation(string.Format(CultureInfo.InvariantCulture, MessageResources.ClientStarting, ServerName));
            using (ICommunicationProtocol protocol = await NamedPipeCommunicationProtocol.Connect(ServerName,
                                                                                                  LifetimeScope.Resolve <StreamFactory>(),
                                                                                                  LifetimeScope.Resolve <ILog>(),
                                                                                                  actAsClient: true)
                                                     .ConfigureAwait(false))
                using (ManualResetEvent serverStoppedEvent = new ManualResetEvent(false))
                {
                    context.WriteInformation(MessageResources.ClientStarted);
                    protocol.CommunicationError += OnError;
                    protocol.MessageReceived    += OnMessageReceived;
                    protocol.Start();

                    Task.Run(ReadConsoleAsync);
                    serverStoppedEvent.WaitOne(-1, true);

                    return(0);

                    void OnError(object sender, EventArgs e)
                    {
                        protocol.CommunicationError -= OnError;
                        context.WriteInformation(MessageResources.ClientServerDisconnectedMessage);
                        serverStoppedEvent.Set();
                    }

                    void OnMessageReceived(object sender, MessageReceivedEventArgs e)
                    {
                        context.WriteInformation(MessageResources.ClientMessageReceived);
                        context.WriteInformation(Encoding.UTF8.GetString(e.Message.ReadToEnd()));
                    }

                    void ReadConsoleAsync()
                    {
                        string serverMessage = Console.ReadLine();

                        if (serverMessage?.Equals("kill", StringComparison.OrdinalIgnoreCase) == true)
                        {
                            serverStoppedEvent.Set();
                        }
                        using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(serverMessage)))
                        {
                            context.WriteInformation(MessageResources.ClientSendingMessage);
                            protocol.SendMessage(stream);
                        }

                        Task.Run(ReadConsoleAsync);
                    }
                }
        }
        public NamedPipeServerProtocolSplitMessagesTest(ITestOutputHelper output)
        {
            NamedPipeServerFeature serverFeature = new NamedPipeServerFeature();

            if (!serverFeature.FeatureEnabled)
            {
                throw new SkipTestException("Disabled named pipe communication");
            }
            streamFactory = PageStreamFactory.CreateDefault(16);
            string serverName = RuntimeInformation.IsOSPlatform(OSPlatform.Windows)
                                    ? Guid.NewGuid().ToByteString()
                                    : $"/tmp/{Guid.NewGuid().ToByteString()}";
            Task <ICommunicationProtocol> creationTask = NamedPipeCommunicationProtocol.Connect(serverName, streamFactory, new LogTracer(output));

            simulator = NamedPipeCommunicationProtocolSimulator.Connect(serverName, streamFactory, new LogTracer(output));
            creationTask.Wait();
            protocol = creationTask.Result;
            protocol.MessageReceived    += OnMessageReceived;
            protocol.CommunicationError += OnCommunicationError;
            protocol.Start();
        }