// 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.impl; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import java.util.ArrayList; import java.util.List; import org.junit.Test; /** * Unit tests for {@link WorkPool} */ public class WorkPoolTests { private final WorkPool<String, Object> pool = new WorkPool<String, Object>(); /** * Test unknown key tolerated silently * @throws Exception untested */ @Test public void unknownKey() throws Exception{ assertFalse(this.pool.addWorkItem("test", new Object())); } /** * Test add work and remove work * @throws Exception untested */ @Test public void basicInOut() throws Exception { Object one = new Object(); Object two = new Object(); this.pool.registerKey("test"); assertTrue(this.pool.addWorkItem("test", one)); assertFalse(this.pool.addWorkItem("test", two)); List<Object> workList = new ArrayList<Object>(16); String key = this.pool.nextWorkBlock(workList, 1); assertEquals("test", key); assertEquals(1, workList.size()); assertEquals(one, workList.get(0)); assertTrue("Should be made ready", this.pool.finishWorkBlock(key)); workList.clear(); key = this.pool.nextWorkBlock(workList, 1); assertEquals("Work client key wrong", "test", key); assertEquals("Wrong work delivered", two, workList.get(0)); assertFalse("Should not be made ready after this.", this.pool.finishWorkBlock(key)); assertNull("Shouldn't be more work", this.pool.nextWorkBlock(workList, 1)); } /** * Test add work when work in progress. * @throws Exception untested */ @Test public void workInWhileInProgress() throws Exception { Object one = new Object(); Object two = new Object(); this.pool.registerKey("test"); assertTrue(this.pool.addWorkItem("test", one)); List<Object> workList = new ArrayList<Object>(16); String key = this.pool.nextWorkBlock(workList, 1); assertEquals("test", key); assertEquals(1, workList.size()); assertEquals(one, workList.get(0)); assertFalse(this.pool.addWorkItem("test", two)); assertTrue(this.pool.finishWorkBlock(key)); workList.clear(); key = this.pool.nextWorkBlock(workList, 1); assertEquals("test", key); assertEquals(1, workList.size()); assertEquals(two, workList.get(0)); } /** * Test multiple work keys. * @throws Exception untested */ @Test public void interleavingKeys() throws Exception { Object one = new Object(); Object two = new Object(); Object three = new Object(); this.pool.registerKey("test1"); this.pool.registerKey("test2"); assertTrue(this.pool.addWorkItem("test1", one)); assertTrue(this.pool.addWorkItem("test2", two)); assertFalse(this.pool.addWorkItem("test1", three)); List<Object> workList = new ArrayList<Object>(16); String key = this.pool.nextWorkBlock(workList, 3); assertEquals("test1", key); assertEquals(2, workList.size()); assertEquals(one, workList.get(0)); assertEquals(three, workList.get(1)); workList.clear(); key = this.pool.nextWorkBlock(workList, 2); assertEquals("test2", key); assertEquals(1, workList.size()); assertEquals(two, workList.get(0)); } /** * Test removal of key (with work) * @throws Exception untested */ @Test public void unregisterKey() throws Exception { Object one = new Object(); Object two = new Object(); Object three = new Object(); this.pool.registerKey("test1"); this.pool.registerKey("test2"); assertTrue(this.pool.addWorkItem("test1", one)); assertTrue(this.pool.addWorkItem("test2", two)); assertFalse(this.pool.addWorkItem("test1", three)); this.pool.unregisterKey("test1"); List<Object> workList = new ArrayList<Object>(16); String key = this.pool.nextWorkBlock(workList, 3); assertEquals("test2", key); assertEquals(1, workList.size()); assertEquals(two, workList.get(0)); } /** * Test removal of all keys (with work). * @throws Exception untested */ @Test public void unregisterAllKeys() throws Exception { Object one = new Object(); Object two = new Object(); Object three = new Object(); this.pool.registerKey("test1"); this.pool.registerKey("test2"); assertTrue(this.pool.addWorkItem("test1", one)); assertTrue(this.pool.addWorkItem("test2", two)); assertFalse(this.pool.addWorkItem("test1", three)); this.pool.unregisterAllKeys(); List<Object> workList = new ArrayList<Object>(16); assertNull(this.pool.nextWorkBlock(workList, 1)); } }