package org.dcache.services.info.base;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.assertTrue;
/**
* A set of tests to verify that MalleableStateTransition behaves as
* expected.
* <p>
* Please note: these tests depend heavily on {@link TestStateExhibitor}.
*/
public class MalleableStateTransitionTests {
private static final StatePath METRIC_PARENT_PATH = StatePath.parsePath( "aa.bb");
private static final StatePath METRIC_PATH = METRIC_PARENT_PATH.newChild( "metric");
private static final StateValue METRIC_VALUE = new StringStateValue(
"a string value");
MalleableStateTransition _transition;
TestStateExhibitor _exhibitor;
VerifyingVisitor _visitor;
@Before
public void setUp()
{
_transition = new MalleableStateTransition();
_exhibitor = new TestStateExhibitor();
_visitor = new VerifyingVisitor();
}
@Test
public void testAddSingleMetric() {
_transition.updateTransitionForNewMetric( METRIC_PATH, METRIC_VALUE, 0);
_visitor.addExpectedMetric( METRIC_PATH, METRIC_VALUE);
assertVisitorSatisfied();
}
@Test
public void testAddMetricToRoot() {
StatePath path = new StatePath("new-metric");
_transition.updateTransitionForNewMetric( path, METRIC_VALUE, 0);
_visitor.addExpectedMetric( path, METRIC_VALUE);
assertVisitorSatisfied();
}
@Test
public void testAddTwoMetricsSameBranch() {
StateValue metricValue1 = new StringStateValue( "some string value");
StatePath metricPath2 = METRIC_PARENT_PATH.newChild( "metric2");
StateValue metricValue2 = new StringStateValue(
"some other string value");
_transition.updateTransitionForNewMetric( METRIC_PATH, metricValue1, 0);
_transition.updateTransitionForNewMetric(
metricPath2,
metricValue2,
METRIC_PARENT_PATH._elements.size());
_visitor.addExpectedMetric( METRIC_PATH, metricValue1);
_visitor.addExpectedMetric( metricPath2, metricValue2);
assertVisitorSatisfied();
}
@Test
public void testAddTwoMetricsDifferentBranches() {
StatePath commonPath = StatePath.parsePath( "aa");
StatePath metricPath1 = commonPath.newChild( StatePath.parsePath( "branch1.metric"));
StateValue metricValue1 = new StringStateValue( "some string value");
StatePath metricPath2 = commonPath.newChild( StatePath.parsePath( "branch2.metric"));
StateValue metricValue2 = new StringStateValue(
"some other string value");
_transition.updateTransitionForNewMetric( metricPath1, metricValue1, 0);
_transition.updateTransitionForNewMetric( metricPath2, metricValue2,
commonPath._elements.size());
_visitor.addExpectedMetric( metricPath1, metricValue1);
_visitor.addExpectedMetric( metricPath2, metricValue2);
assertVisitorSatisfied();
}
@Test
public void testAddSingleBranch() {
_transition.updateTransitionForNewBranch( METRIC_PARENT_PATH, 0);
_visitor.addExpectedBranch( METRIC_PARENT_PATH);
assertVisitorSatisfied();
}
@Test
public void testAddTwoBranches() {
StatePath branchPath1 = METRIC_PARENT_PATH.newChild( "branch1");
StatePath branchPath2 = METRIC_PARENT_PATH.newChild( "branch2");
_transition.updateTransitionForNewBranch( branchPath1, 0);
_transition.updateTransitionForNewBranch(
branchPath2,
METRIC_PARENT_PATH._elements.size());
_visitor.addExpectedBranch( branchPath1);
_visitor.addExpectedBranch( branchPath2);
assertVisitorSatisfied();
}
@Test
public void testUpdateMetric() {
_exhibitor.addMetric( METRIC_PATH,
new StringStateValue( "the old string value"));
StateValue metricValue = new StringStateValue( "a new string value");
_transition.updateTransitionForNewMetric( METRIC_PATH, metricValue,
METRIC_PATH._elements.size());
_visitor.addExpectedMetric( METRIC_PATH, metricValue);
assertVisitorSatisfied();
}
@Test
public void testRemoveMetric() {
_exhibitor.addMetric( METRIC_PATH, METRIC_VALUE);
_transition.updateTransitionForRemovingElement( METRIC_PATH);
// the branches leading up to the metric will remain
_visitor.addExpectedBranch( METRIC_PARENT_PATH);
assertVisitorSatisfied();
}
@Test
public void testRemoveBranchAndMetric() {
_exhibitor.addMetric( METRIC_PATH, METRIC_VALUE);
_transition.updateTransitionForRemovingElement( METRIC_PARENT_PATH);
// the branches leading up to the metric-branch will remain
_visitor.addExpectedBranch( METRIC_PARENT_PATH.parentPath());
assertVisitorSatisfied();
}
@Test
public void testChangeBranchToMetric() {
_exhibitor.addBranch( METRIC_PATH);
StateValue metricValue = new StringStateValue("some value");
_transition.updateTransitionForNewMetric( METRIC_PATH, metricValue, 3);
_visitor.addExpectedMetric( METRIC_PATH, metricValue);
assertVisitorSatisfied();
}
@Test
public void testChangeMetricToBranch() {
_exhibitor.addMetric( METRIC_PATH, METRIC_VALUE);
_transition.updateTransitionChangingMetricToBranch( METRIC_PATH, 3);
_visitor.addExpectedBranch( METRIC_PATH);
assertVisitorSatisfied();
}
@Test
public void testChangeMetricToBranchWithSubbranch() {
_exhibitor.addMetric( METRIC_PATH, METRIC_VALUE);
_transition.updateTransitionChangingMetricToBranch( METRIC_PATH, 3);
StatePath branchPath = METRIC_PATH.newChild("sub-branch");
_transition.updateTransitionForNewBranch( branchPath, 3);
_visitor.addExpectedBranch( branchPath);
assertVisitorSatisfied();
}
/**
* A handy wrapper to check that the {@link VerifyingVisitor} is
* satisfied with the {@link TestStateExhibitor} when visiting with the
* current MalleableStateTransition.
*/
private void assertVisitorSatisfied() {
StateExhibitor futureState = new PostTransitionStateExhibitor( _exhibitor, _transition);
futureState.visitState( _visitor);
assertTrue( "visitor satisfied", _visitor.satisfied());
}
}