// 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.utility; import org.junit.Test; import java.util.HashSet; import java.util.Iterator; import java.util.Random; import java.util.Set; import static org.junit.Assert.*; public class IntAllocatorTests { private static final int TEST_ITERATIONS = 50000; private static final int HI_RANGE = 100000; private static final int LO_RANGE = 100; private final IntAllocator iAll = new IntAllocator(LO_RANGE, HI_RANGE); private final Random rand = new Random(70608L); @Test public void reserveAndFree() throws Exception { Set<Integer> set = new HashSet<Integer>(); for (int i = 0; i < TEST_ITERATIONS; ++i) { int trial = getTrial(rand); if (set.contains(trial)) { iAll.free(trial); set.remove(trial); } else { assertTrue("Did not reserve free integer " + trial, iAll.reserve(trial)); set.add(trial); } } for (int trial : set) { assertFalse("Integer " + trial + " not allocated!", iAll.reserve(trial)); } } @Test public void allocateAndFree() throws Exception { Set<Integer> set = new HashSet<Integer>(); for (int i=0; i < TEST_ITERATIONS; ++i) { if (getBool(rand)) { int trial = iAll.allocate(); assertFalse("Already allocated " + trial, set.contains(trial)); set.add(trial); } else { if (!set.isEmpty()) { int trial = extractOne(set); assertFalse("Allocator agreed to reserve " + trial, iAll.reserve(trial)); iAll.free(trial); } } } for (int trial : set) { assertFalse("Integer " + trial + " should be allocated!", iAll.reserve(trial)); } } @Test public void testToString() throws Exception { IntAllocator ibs = new IntAllocator(LO_RANGE, HI_RANGE); assertEquals("IntAllocator{allocated = []}", ibs.toString()); ibs.allocate(); assertEquals("IntAllocator{allocated = [100]}", ibs.toString()); for(int i = 200; i<211; i=i+4) { ibs.reserve(i); ibs.reserve(i+1); ibs.reserve(i+2); } assertEquals("IntAllocator{allocated = [100, 200..202, 204..206, 208..210]}" , ibs.toString()); } private static int extractOne(Set<Integer> set) { Iterator<Integer> iter = set.iterator(); int trial = iter.next(); iter.remove(); return trial; } private static int getTrial(Random rand) { return rand.nextInt(HI_RANGE-LO_RANGE+1) + LO_RANGE; } private static boolean getBool(Random rand) { return rand.nextBoolean(); } }