@@ -1625,6 +1625,68 @@ public void TestTopologyRecoveryConsumerExceptionHandler()
16251625 }
16261626 }
16271627
1628+ [ Test ]
1629+ public void TestBindingRecovery_GH1035 ( )
1630+ {
1631+ var waitSpan = TimeSpan . FromSeconds ( 35 ) ; // Note: conn recovery waits 30 secs
1632+ const string routingKey = "unused" ;
1633+ byte [ ] body = Encoding . UTF8 . GetBytes ( Guid . NewGuid ( ) . ToString ( ) ) ;
1634+
1635+ using ( var receivedMessageEvent = new AutoResetEvent ( initialState : false ) )
1636+ {
1637+
1638+ void MessageReceived ( object sender , BasicDeliverEventArgs e )
1639+ {
1640+ receivedMessageEvent . Set ( ) ;
1641+ }
1642+
1643+ string exchangeName = $ "ex-gh-1035-{ Guid . NewGuid ( ) } ";
1644+ string queueName = $ "q-gh-1035-{ Guid . NewGuid ( ) } ";
1645+
1646+ Model . ExchangeDeclare ( exchange : exchangeName ,
1647+ type : "fanout" , durable : false , autoDelete : true ,
1648+ arguments : null ) ;
1649+
1650+ RabbitMQ . Client . QueueDeclareOk q0 = Model . QueueDeclare ( queue : queueName , exclusive : true ) ;
1651+ Assert . AreEqual ( queueName , q0 . QueueName ) ;
1652+
1653+ Model . QueueBind ( queue : queueName , exchange : exchangeName , routingKey : routingKey ) ;
1654+
1655+ Model . Dispose ( ) ;
1656+
1657+ Model = Conn . CreateModel ( ) ;
1658+
1659+ Model . ExchangeDeclare ( exchange : exchangeName ,
1660+ type : "fanout" , durable : false , autoDelete : true ,
1661+ arguments : null ) ;
1662+
1663+ RabbitMQ . Client . QueueDeclareOk q1 = Model . QueueDeclare ( queue : queueName , exclusive : true ) ;
1664+ Assert . AreEqual ( queueName , q1 . QueueName ) ;
1665+
1666+ Model . QueueBind ( queue : queueName , exchange : exchangeName , routingKey : routingKey ) ;
1667+
1668+ var c = new EventingBasicConsumer ( Model ) ;
1669+ c . Received += MessageReceived ;
1670+ Model . BasicConsume ( queue : queueName , autoAck : true , consumer : c ) ;
1671+
1672+ using ( IModel pubCh = Conn . CreateModel ( ) )
1673+ {
1674+ pubCh . BasicPublish ( exchange : exchangeName , routingKey : routingKey , body : body ) ;
1675+ }
1676+
1677+ Assert . True ( receivedMessageEvent . WaitOne ( waitSpan ) ) ;
1678+
1679+ CloseAndWaitForRecovery ( ) ;
1680+
1681+ using ( IModel pubCh = Conn . CreateModel ( ) )
1682+ {
1683+ pubCh . BasicPublish ( exchange : exchangeName , routingKey : "unused" , body : body ) ;
1684+ }
1685+
1686+ Assert . True ( receivedMessageEvent . WaitOne ( waitSpan ) ) ;
1687+ }
1688+ }
1689+
16281690 internal bool SendAndConsumeMessage ( string queue , string exchange , string routingKey )
16291691 {
16301692 using ( var ch = Conn . CreateModel ( ) )
0 commit comments