// Copyright (c) 2007-Present Pivotal Software, Inc. All rights reserved. // // This software, the RabbitMQ Java client library, is triple-licensed under the // Mozilla Public License 1.1 ("MPL"), the GNU General Public License version 2 // ("GPL") and the Apache License version 2 ("ASL"). For the MPL, please see // LICENSE-MPL-RabbitMQ. For the GPL, please see LICENSE-GPL2. For the ASL, // please see LICENSE-APACHE2. // // This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, // either express or implied. See the LICENSE file for specific language governing // rights and limitations of this software. // // If you have any questions regarding licensing, please contact us at // info@rabbitmq.com. package com.rabbitmq.client.test; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; import org.junit.After; import org.junit.Before; import org.junit.Test; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import static org.junit.Assert.*; public class ChannelNumberAllocationTests { static final int CHANNEL_COUNT = 100; static final Comparator<Channel> COMPARATOR = new Comparator<Channel>(){ public int compare(Channel x, Channel y){ if(x.getChannelNumber() < y.getChannelNumber()) return -1; if(x.getChannelNumber() == y.getChannelNumber()) return 0; return 1; } }; Connection connection; @Before public void setUp() throws Exception{ connection = TestUtils.connectionFactory().newConnection(); } @After public void tearDown() throws Exception{ connection.close(); connection = null; } @Test public void allocateInOrder() throws Exception{ for(int i = 1; i <= CHANNEL_COUNT; i++) assertEquals(i, connection.createChannel().getChannelNumber()); } @Test public void allocateAfterFreeingLast() throws Exception{ Channel ch = connection.createChannel(); assertEquals(1, ch.getChannelNumber()); ch.close(); ch = connection.createChannel(); assertEquals(1, ch.getChannelNumber()); } @Test public void allocateAfterFreeingMany() throws Exception{ List<Channel> channels = new ArrayList<Channel>(); for(int i = 1; i <= CHANNEL_COUNT; i++) channels.add(connection.createChannel()); for(Channel channel : channels){ channel.close(); } channels = new ArrayList<Channel>(); for(int i = 1; i <= CHANNEL_COUNT; i++) channels.add(connection.createChannel()); // In the current implementation the allocated numbers need not be increasing Collections.sort(channels, COMPARATOR); assertEquals("Didn't create the right number of channels!", CHANNEL_COUNT, channels.size()); for(int i = 1; i < CHANNEL_COUNT; ++i) { assertTrue("Channel numbers should be distinct." , channels.get(i-1).getChannelNumber() < channels.get(i).getChannelNumber() ); } } @Test public void allocateAfterManualAssign() throws Exception{ connection.createChannel(10); for(int i = 0; i < 20; i++) assertTrue(10 != connection.createChannel().getChannelNumber()); } @Test public void manualAllocationDoesntBreakThings() throws Exception{ connection.createChannel((1 << 16) - 1); Channel ch = connection.createChannel(); assertNotNull(ch); } @Test public void reuseManuallyAllocatedChannelNumber1() throws Exception{ connection.createChannel(1).close(); assertNotNull(connection.createChannel(1)); } @Test public void reuseManuallyAllocatedChannelNumber2() throws Exception{ connection.createChannel(2).close(); assertNotNull(connection.createChannel(3)); } @Test public void reserveOnBoundaries() throws Exception{ assertNotNull(connection.createChannel(3)); assertNotNull(connection.createChannel(4)); assertNotNull(connection.createChannel(2)); assertNotNull(connection.createChannel(5)); assertNotNull(connection.createChannel(1)); } }