/* * Copyright 2002-2007 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.springframework.aop.target.dynamic; import junit.framework.TestCase; /** * @author Rob Harrop */ public class RefreshableTargetSourceTests extends TestCase { /** * Test what happens when checking for refresh but not refreshing object. */ public void testRefreshCheckWithNonRefresh() throws Exception { CountingRefreshableTargetSource ts = new CountingRefreshableTargetSource(); ts.setRefreshCheckDelay(0); Object a = ts.getTarget(); Thread.sleep(1); Object b = ts.getTarget(); assertEquals("Should be one call to freshTarget to get initial target", 1, ts.getCallCount()); assertSame("Returned objects should be the same - no refresh should occur", a, b); } /** * Test what happens when checking for refresh and refresh occurs. */ public void testRefreshCheckWithRefresh() throws Exception { CountingRefreshableTargetSource ts = new CountingRefreshableTargetSource(true); ts.setRefreshCheckDelay(0); Object a = ts.getTarget(); Thread.sleep(100); Object b = ts.getTarget(); assertEquals("Should have called freshTarget twice", 2, ts.getCallCount()); assertNotSame("Should be different objects", a, b); } /** * Test what happens when no refresh occurs. */ public void testWithNoRefreshCheck() throws Exception { CountingRefreshableTargetSource ts = new CountingRefreshableTargetSource(true); ts.setRefreshCheckDelay(-1); Object a = ts.getTarget(); Object b = ts.getTarget(); assertEquals("Refresh target should only be called once", 1, ts.getCallCount()); assertSame("Objects should be the same - refresh check delay not elapsed", a, b); } public void testRefreshOverTime() throws Exception { CountingRefreshableTargetSource ts = new CountingRefreshableTargetSource(true); ts.setRefreshCheckDelay(100); Object a = ts.getTarget(); Object b = ts.getTarget(); assertEquals("Objects should be same", a, b); Thread.sleep(50); Object c = ts.getTarget(); assertEquals("A and C should be same", a, c); Thread.sleep(60); Object d = ts.getTarget(); assertNotNull("D should not be null", d); assertFalse("A and D should not be equal", a.equals(d)); Object e = ts.getTarget(); assertEquals("D and E should be equal", d, e); Thread.sleep(110); Object f = ts.getTarget(); assertFalse("E and F should be different", e.equals(f)); } private static class CountingRefreshableTargetSource extends AbstractRefreshableTargetSource { private int callCount; private boolean requiresRefresh; public CountingRefreshableTargetSource() { } public CountingRefreshableTargetSource(boolean requiresRefresh) { this.requiresRefresh = requiresRefresh; } protected Object freshTarget() { this.callCount++; return new Object(); } public int getCallCount() { return this.callCount; } protected boolean requiresRefresh() { return this.requiresRefresh; } } }