public void TestPreconfigured()
        {
            //The idea here is to simulate a setup where are the
            //resources are pre-declared outside the Unicast messaging
            //framework.
            using (IConnection conn = _builder.CreateConnection()) {
                IModel ch = conn.CreateModel();

                //declare exchanges
                DeclareExchange(ch, "in", "fanout");
                DeclareExchange(ch, "out", "direct");

                //declare queue and binding for relay
                DeclareQueue(ch, "relay");
                BindQueue(ch, "relay", "in", "");

                //declare queue and binding for two participants
                DeclareQueue(ch, "foo");
                BindQueue(ch, "foo", "out", "foo");
                DeclareQueue(ch, "bar");
                BindQueue(ch, "bar", "out", "bar");
            }
            //set up participants, send some messages
            MessagingClosure dummy = delegate(IMessaging m) {
                return(delegate(IModel channel) { });
            };

            TestRelayedHelper(dummy, dummy, _builder);
        }
        public void TestRelayed()
        {
            MessagingClosure senderSetup = delegate(IMessaging m) {
                return(delegate(IModel channel) {
                    DeclareExchange(channel, m.ExchangeName, "fanout");
                });
            };
            MessagingClosure receiverSetup = delegate(IMessaging m) {
                return(delegate(IModel channel) {
                    DeclareExchange(channel, "out", "direct");
                    DeclareQueue(channel, m.QueueName);
                    BindQueue(channel, m.QueueName, "out", m.QueueName);
                });
            };

            TestRelayedHelper(senderSetup, receiverSetup, _builder);
        }
        protected void TestRelayedHelper(MessagingClosure senderSetup,
                                         MessagingClosure receiverSetup,
                                         ConnectionBuilder builder)
        {
            using (IConnector conn = Factory.CreateConnector(builder),
                   relayConn = Factory.CreateConnector(builder)) {
                //create relay
                IMessaging relay = Factory.CreateMessaging();
                relay.Connector    = relayConn;
                relay.Identity     = "relay";
                relay.ExchangeName = "out";
                relay.SetupSender += delegate(IModel channel) {
                    DeclareExchange(channel, relay.ExchangeName, "direct");
                };
                relay.SetupReceiver += delegate(IModel channel) {
                    DeclareExchange(channel, "in", "fanout");
                    DeclareQueue(channel, relay.QueueName);
                    BindQueue(channel, relay.QueueName, "in", "");
                };
                relay.Init();

                //run relay
                new System.Threading.Thread
                    (delegate() {
                    //receive messages and pass it on
                    IReceivedMessage r;
                    try {
                        while (true)
                        {
                            r = relay.Receive();
                            relay.Send(r);
                            relay.Ack(r);
                        }
                    }
                    catch (EndOfStreamException) {
                    }
                    catch (AlreadyClosedException) {
                    }
                    catch (OperationInterruptedException) {
                    }
                }).Start();

                //create two parties
                IMessaging foo = Factory.CreateMessaging();
                foo.Connector      = conn;
                foo.Identity       = "foo";
                foo.SetupSender   += senderSetup(foo);
                foo.SetupReceiver += receiverSetup(foo);
                foo.ExchangeName   = "in";
                foo.Sent          += TestHelper.Sent;
                foo.Init();
                IMessaging bar = Factory.CreateMessaging();
                bar.Connector      = conn;
                bar.Identity       = "bar";
                bar.SetupSender   += senderSetup(bar);
                bar.SetupReceiver += receiverSetup(bar);
                bar.ExchangeName   = "in";
                bar.Sent          += TestHelper.Sent;
                bar.Init();

                //send message from foo to bar
                IMessage mf = foo.CreateMessage();
                mf.Body = TestHelper.Encode("message1");
                mf.To   = "bar";
                foo.Send(mf);

                //receive message at bar and reply
                IReceivedMessage rb = bar.Receive();
                TestHelper.LogMessage("recv", bar, rb);
                IMessage mb = bar.CreateReply(rb);
                mb.Body = TestHelper.Encode("message2");
                bar.Send(mb);
                bar.Ack(rb);

                //receive reply at foo
                IReceivedMessage rf = foo.Receive();
                TestHelper.LogMessage("recv", foo, rf);
                foo.Ack(rf);
            }
        }