Ejemplo n.º 1
0
        public IConnection Create(string connectionId, IChannelStream stream)
        {
            var jsonSerialiser = new TinyJsonSerializer();
            var taskLauncher   = new TaskLauncherNet35();

            var channelMessageStream     = new ChannelMessageStream(stream);
            var channelMessageSerializer = new ChannelMessageSerializer();
            var channelMessageWriter     = new ChannelMessageWriter(channelMessageStream, channelMessageSerializer);

            var rpcMessageEncoder = new RpcMessageEncoder(jsonSerialiser);
            var rpcMessageWriter  = new RpcMessageWriter(channelMessageWriter, rpcMessageEncoder);
            var rpcMessageBroker  = new RpcMessageBroker(rpcMessageWriter);
            var delegateProvider  = new DuplexDelegateProvider(m_DelegateCollection, rpcMessageBroker);
            var rpcRequestHandler = new RpcRequestHandler(delegateProvider, jsonSerialiser);

            var rpcResponseMessageHandler = new RpcResponseChannelMessageHandler(rpcMessageBroker, rpcMessageEncoder);
            var rpcRequestMessageHandler  = new RpcRequestChannelMessageHandler(rpcRequestHandler, rpcMessageEncoder, rpcMessageWriter);
            var pipeline             = new ChannelMessagePipeline(new IChannelMessageHandler[] { rpcResponseMessageHandler, rpcRequestMessageHandler });
            var channelMessageReader = new ChannelMessageReader(channelMessageStream, channelMessageSerializer, pipeline, taskLauncher);

            var connection = new Connection(
                connectionId,
                rpcMessageBroker,
                disconnectReporters: new IDisconnectReporter[] { stream },
                disposeChain: new IDisposable[] { channelMessageReader, rpcMessageBroker });

            rpcRequestHandler.OwningConnection = connection;
            channelMessageReader.Start();

            return(connection);
        }
Ejemplo n.º 2
0
        public void Broker_matches_messages_on_queryId()
        {
            var writer = MockRepository.GenerateStub <IRpcMessageWriter>();
            var broker = new RpcMessageBroker(writer);

            var queryId = Guid.NewGuid().ToString();

            var request  = new RpcRequest(queryId, "Interface", "Method", new[] { "arg" });
            var response = new RpcResponse(queryId, "ReturnValue");

            using (var token = new RequestToken())
            {
                broker.BeginRequest(request, token);
                broker.HandleInbound(response);

                var handled = token.Completed.WaitOne(0);
                Assert.True(handled, "The request should have been marked as handled");
                Assert.AreEqual("ReturnValue", token.Response.ReturnValue);
            }
        }
Ejemplo n.º 3
0
        public void Broker_does_not_match_unrelated_queries()
        {
            var writer = MockRepository.GenerateStub <IRpcMessageWriter>();
            var broker = new RpcMessageBroker(writer);

            var queryId1 = Guid.NewGuid().ToString();
            var queryId2 = Guid.NewGuid().ToString();

            var request  = new RpcRequest(queryId1, "Interface", "Method", new[] { "arg" });
            var response = new RpcResponse(queryId2, "ReturnValue");

            using (var token = new RequestToken())
            {
                broker.BeginRequest(request, token);
                broker.HandleInbound(response);

                var handled = token.Completed.WaitOne(0);
                Assert.False(handled, "The request should not have been marked as handled");
                Assert.Null(token.Response, "No response should have been set");
            }
        }
Ejemplo n.º 4
0
        public void Send_unblocks_on_query_resolution()
        {
            var writer  = MockRepository.GenerateStub <IRpcMessageWriter>();
            var broker  = new RpcMessageBroker(writer);
            var queryId = Guid.NewGuid().ToString();

            var request  = new RpcRequest(queryId, "Interface", "Method", new[] { "arg" });
            var response = new RpcResponse(queryId, "ReturnValue");

            RpcResponse returnedResponse = null;
            Thread      sendTask;

            // Call Send() and ensure the request obejct was passed to the underlying message writer
            // before simulating the inbound response.
            using (var requestSent = new ManualResetEvent(false))
            {
                // ReSharper disable once AccessToDisposedClosure
                writer.Stub(w => w.Write(request)).WhenCalled(call => { requestSent.Set(); });
                Action sendFunc = () => { returnedResponse = broker.Send(request); };
                sendTask = new Thread(new ThreadStart(sendFunc));
                sendTask.Start();
                Assert.True(requestSent.WaitOne(2000),
                            "Timed out waiting for Send() to pass the request to the underlying message writer");
            }

            // Broker receives the response...
            broker.HandleInbound(response);

            // ...which should unlock .Send()
            var timedOut = !sendTask.Join(2000);

            Assert.False(timedOut, "The broker.Send() should have unblocked.");
            Assert.NotNull(returnedResponse, "Send should have returned the RpcResponse");
            Assert.AreEqual(returnedResponse.QueryId, response.QueryId);
            Assert.AreEqual(returnedResponse.ReturnValue, response.ReturnValue);
        }