package org.simpleframework.common.lease; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.TimeUnit; import org.simpleframework.common.lease.Cleaner; import org.simpleframework.common.lease.Contract; import org.simpleframework.common.lease.ContractController; import org.simpleframework.common.lease.ContractLease; import org.simpleframework.common.lease.ContractMaintainer; import org.simpleframework.common.lease.Expiration; import org.simpleframework.common.lease.Lease; public class LeaseTest extends TimeTestCase { private static int ITERATIONS = 10000; static { String value = System.getProperty("iterations"); if (value != null) { ITERATIONS = Integer.parseInt(value); } } public void testLease() throws Exception { final BlockingQueue<Integer> clean = new LinkedBlockingQueue<Integer>(); Cleaner<Integer> cleaner = new Cleaner<Integer>() { public void clean(Integer key) { clean.offer(key); } }; Map<Integer, Contract> table = new ConcurrentHashMap<Integer, Contract>(); List<Lease> list = new ArrayList<Lease>(); ContractController controller = new ContractMaintainer(cleaner); for (int i = 0; i < ITERATIONS; i++) { long random = (long) (Math.random() * 1000) + 1000L; Contract<Integer> contract = new Expiration(i, random, TimeUnit.MILLISECONDS); Lease lease = new ContractLease(controller, contract); table.put(i, contract); list.add(lease); controller.issue(contract); } for (int i = 0; i < ITERATIONS; i++) { long random = (long) (Math.random() * 1000); try { list.get(i).renew(random, TimeUnit.MILLISECONDS); } catch (Exception e) { continue; // e.printStackTrace(); } } for (int i = 0; i < ITERATIONS; i++) { try { System.err.println("delay: " + list.get(i).getExpiry(TimeUnit.MILLISECONDS)); } catch (Exception e) { continue; // e.printStackTrace(); } } System.err.println("clean: " + clean.size()); for (int i = 0; i < ITERATIONS; i++) { Integer index = clean.take(); Contract contract = table.get(index); // assertLessThanOrEqual(-4000, // contract.getDelay(TimeUnit.MILLISECONDS)); System.err.println(String.format("index=[%s] delay=[%s]", index, contract.getDelay(TimeUnit.MILLISECONDS))); } } public static void main(String[] list) throws Exception { new LeaseTest().testLease(); } }