package org.dcache.services.info.base; import org.junit.Test; import java.util.Date; import java.util.List; import java.util.concurrent.TimeUnit; import static org.junit.Assert.*; public class StateValueTests extends InfoBaseTestHelper { /** The tolerance of time comparisons, in milliseconds. */ private static final long TIME_TOLERANCE = 500; /** Different test times, in seconds */ private static final long EXPIRY_TIMES[] = {-1, 0, 1, 2}; @Test public void testGetExpiryDate() { for( long expTime : EXPIRY_TIMES) { StateValue testVal = newMortalStateValue( expTime); Date expDate = testVal.getExpiryDate(); long expectedTime = System.currentTimeMillis() + TimeUnit.SECONDS.toMillis( expTime < 0 ? 0 : expTime); assertTrue( "time mismatch with getExpiryDate(): " + expDate + " != " + new Date( expectedTime), Math.abs(expDate.getTime() - expectedTime) < TIME_TOLERANCE); } } @Test public void testHasExpired() { for( long expTime : EXPIRY_TIMES) { StateValue testVal = newMortalStateValue( expTime); boolean expectHasExpired = expTime < 1; assertTrue( "hasExpired() for "+ expTime +" returned "+ testVal.hasExpired() +", which is the wrong result", testVal.hasExpired() == expectHasExpired); } } @Test public void testBuildTransition() { StateValue testVal = newEphemeralStateValue(); boolean caughtException = false; try { testVal.buildTransition( new StatePath("path"), new StatePath("childPath"), newEphemeralStateValue(), new StateTransition()); } catch( MetricStatePathException e) { caughtException = true; } assertTrue( "failed to catch MetricStatePathException", caughtException); } @Test public void testBuildRemovalTransition() { StateValue testVal = newEphemeralStateValue(); // Should be a no-op. testVal.buildRemovalTransition( new StatePath( "path"), new StateTransition(), false); } @Test public void testEphemeralValue() { StateValue testVal = newEphemeralStateValue(); assertIsEphemeral( "ephemeral testValue", testVal); } @Test public void testMortalValue() { final long lifetime = 100; StateValue testVal = newMortalStateValue( lifetime); assertIsMortal( "mortal testValue", testVal, lifetime); } @Test public void testImmortalValue() { StateValue testVal = newImmortalStateValue(); assertIsImmortal( "immortal testValue", testVal); } @Test public void testEarliestChild() { StateValue testVal = newEphemeralStateValue(); assertNull( testVal.getEarliestChildExpiryDate()); } @Test public void testApplyTransition() { TestStateValue testVal = newTestStateValue(); StateTransition transition = new StateTransition(); StatePath ourPath = StatePath.parsePath( "aaa.bbb"); testVal.applyTransition( null, transition); // There isn't much to test. assertEquals( "visitor list not zero", testVal.getVisitorInfo().size(), 0); testVal.applyTransition( ourPath, transition); assertEquals( "visitor list not zero", testVal.getVisitorInfo().size(), 0); } @Test public void testAcceptVisitorNoTransitionNullPath() { TestStateValue testVal = newTestStateValue(); StateVisitor visitor = new VerifyingVisitor(); testVal.acceptVisitor( null, visitor); List<TestStateValue.AcceptVisitorInfo> visitorList = testVal.getVisitorInfo(); assertEquals( "unexpected number of visitors", 1, visitorList.size()); TestStateValue.AcceptVisitorInfo avi = visitorList.get( 0); assertNull( "StatePath when visiting", avi.getStatePath()); assertSame( "Unknown StateVisitor", visitor, avi.getVisitor()); } @Test public void testAcceptVisitorNoTransitionRealPath() { TestStateValue testVal = newTestStateValue(); StateVisitor visitor = new VerifyingVisitor(); StatePath path = StatePath.parsePath( "aaa.bbb.cc"); testVal.acceptVisitor( path, visitor); List<TestStateValue.AcceptVisitorInfo> visitorList = testVal.getVisitorInfo(); assertEquals( "unexpected number of visitors", 1, visitorList.size()); TestStateValue.AcceptVisitorInfo avi = visitorList.get( 0); assertEquals( "StatePath when visiting", path, avi.getStatePath()); assertSame( "Unknown StateVisitor", visitor, avi.getVisitor()); } @Test public void testAcceptVisitorNoTransitionNoSkipNullPath() { TestStateValue testVal = newTestStateValue(); StateVisitor visitor = new VerifyingVisitor(); testVal.acceptVisitor( null, null, visitor); List<TestStateValue.AcceptVisitorInfo> visitorList = testVal.getVisitorInfo(); assertEquals( "unexpected number of visitors", 1, visitorList.size()); TestStateValue.AcceptVisitorInfo avi = visitorList.get( 0); assertNull( "StatePath when visiting", avi.getStatePath()); assertSame( "Unknown StateVisitor", visitor, avi.getVisitor()); } @Test public void testAcceptVisitorNoTransitionNoSkipRealPath() { TestStateValue testVal = newTestStateValue(); StateVisitor visitor = new VerifyingVisitor(); StatePath path = StatePath.parsePath( "aa.bb"); testVal.acceptVisitor( path, visitor); List<TestStateValue.AcceptVisitorInfo> visitorList = testVal.getVisitorInfo(); assertEquals( "unexpected number of visitors", 1, visitorList.size()); TestStateValue.AcceptVisitorInfo avi = visitorList.get( 0); assertEquals( "StatePath when visiting", path, avi.getStatePath()); assertSame( "Unknown StateVisitor", visitor, avi.getVisitor()); } /** * This test may look a bit odd: the transition has no effect on the visitor. * What happens is that any effect the transition may have had is dealt with by * the StateComposite immediately before the StateValue. If a StateValue is * called with a StateTransition it is already known that no changes are to take * place to this StateValue from the StateTransition. */ @Test public void testAcceptVisitorTransition() { TestStateValue testVal = newTestStateValue(); StateVisitor visitor = new VerifyingVisitor(); StatePath path = StatePath.parsePath( "aa.bb"); StateTransition transition = new StateTransition(); testVal.acceptVisitor( transition, path, visitor); List<TestStateValue.AcceptVisitorInfo> visitorList = testVal.getVisitorInfo(); assertEquals( "unexpected number of visitors", 1, visitorList.size()); TestStateValue.AcceptVisitorInfo avi = visitorList.get( 0); assertEquals( "StatePath when visiting", path, avi.getStatePath()); assertSame( "Unknown StateVisitor", visitor, avi.getVisitor()); } /** * P R I V A T E F U N C T I O N S */ private TestStateValue newTestStateValue() { return new TestStateValue( false); } private StateValue newEphemeralStateValue() { return new TestStateValue( false); } private StateValue newImmortalStateValue() { return new TestStateValue( true); } private StateValue newMortalStateValue( long lifetime) { return new TestStateValue( lifetime); } }