/* * Copyright (c) 2008-2012 EMC Corporation * All Rights Reserved */ package com.emc.storageos.coordinator.client.service; import org.junit.Assert; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.*; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; /** * Work pool unit test */ public class WorkPoolTest extends CoordinatorTestBase { private static final Logger _logger = LoggerFactory.getLogger(WorkPoolTest.class); private static final String _poolName = "testPool"; /** * Test assignment listener */ private class AssignmentListener implements WorkPool.WorkAssignmentListener { private Set<WorkPool.Work> _assigned = new HashSet<WorkPool.Work>(); private CountDownLatch _assignmentCount; public synchronized void setAssignmentLatch(CountDownLatch latch) { _assignmentCount = latch; } @Override public synchronized void assigned(Set<WorkPool.Work> work) { Set<WorkPool.Work> newAssignment = new HashSet<WorkPool.Work>(work); newAssignment.removeAll(_assigned); Iterator<WorkPool.Work> newWorkIt = newAssignment.iterator(); while (newWorkIt.hasNext()) { WorkPool.Work next = newWorkIt.next(); _logger.info("New work {}", next.getId()); _assignmentCount.countDown(); } Set<WorkPool.Work> removedAssignment = new HashSet<WorkPool.Work>(_assigned); removedAssignment.removeAll(work); Iterator<WorkPool.Work> removedAssignmentIt = removedAssignment.iterator(); while (removedAssignmentIt.hasNext()) { WorkPool.Work next = removedAssignmentIt.next(); _logger.info("Removed assignment {}", next.getId()); _assignmentCount.countDown(); } _assigned = work; } public synchronized Set<WorkPool.Work> getWorkItems() { return new HashSet<WorkPool.Work>(_assigned); } } @Test public void testWorkPool() throws Exception { final int totalWorkItemCount = 100; final int totalWorkerCount = 5; CountDownLatch assignmentLatch = new CountDownLatch(totalWorkItemCount); List<WorkPool> workerList = new ArrayList<WorkPool>(); List<AssignmentListener> listeners = new ArrayList<AssignmentListener>(); for (int index = 0; index < totalWorkerCount; index++) { AssignmentListener listener = new AssignmentListener(); listener.setAssignmentLatch(assignmentLatch); listeners.add(listener); workerList.add(connectClient().getWorkPool(_poolName, listener)); } for (int index = 0; index < totalWorkItemCount; index++) { workerList.get(index % totalWorkerCount).addWork(Integer.toString(index)); } Assert.assertTrue(assignmentLatch.await(30, TimeUnit.SECONDS)); assignmentLatch = new CountDownLatch(totalWorkItemCount); for (int index = 0; index < totalWorkerCount; index++) { listeners.get(index).setAssignmentLatch(assignmentLatch); } for (int index = 0; index < totalWorkItemCount; index++) { workerList.get(index % totalWorkerCount).removeWork(Integer.toString(index)); } Assert.assertTrue(assignmentLatch.await(30, TimeUnit.SECONDS)); } }