package org.dcache.services.info.base;
import org.junit.Before;
import org.junit.Test;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import static org.junit.Assert.*;
public class StateUpdateTests {
private static final String NEW_STRING_VALUE = "new string";
private static final StatePath NEW_STRING_PATH = new StatePath( "aStringMetric");
private static final StatePath NEW_INTEGER_PATH = StatePath.parsePath( "aBranch.anInteger");
private static final long MORTAL_METRIC_DURATION = 60;
StateUpdate _update = new StateUpdate();
@Before
public void setUp()
{
_update.appendUpdate( NEW_STRING_PATH, new StringStateValue( NEW_STRING_VALUE, MORTAL_METRIC_DURATION));
_update.appendUpdate( NEW_INTEGER_PATH, new IntegerStateValue( 42, MORTAL_METRIC_DURATION));
}
@Test
public void testCount() {
assertSame( "Wrong number of entries", 2, _update.count());
}
@Test
public void testEmptyCount() {
assertSame( "Wrong number of entries", 0, new StateUpdate().count());
}
@Test
public void testAppendUpdate() {
_update.appendUpdate( NEW_INTEGER_PATH.parentPath().newChild("anotherInteger"), new IntegerStateValue( 39, MORTAL_METRIC_DURATION));
assertSame( "count not updated", 3, _update.count());
}
@Test
public void testAppendUpdateCollectionImmortal() {
StatePath basePath = StatePath.parsePath( "aa.bb");
Set<String> items = new HashSet<>();
items.add( "item1");
items.add( "item2");
items.add( "item3");
_update.appendUpdateCollection( basePath, items, true);
for( String item : items) {
assertTrue(_update.hasUpdate(basePath
.newChild(item), new StateComposite()));
}
}
@Test
public void testAppendUpdateCollectionEphemeral() {
StatePath basePath = StatePath.parsePath( "aa.bb");
Set<String> items = new HashSet<>();
items.add( "item1");
items.add( "item2");
items.add( "item3");
_update.appendUpdateCollection( basePath, items, true);
for( String item : items) {
assertTrue(_update
.hasUpdate(basePath.newChild(item), new StateComposite()));
}
}
@Test
public void testAppendUpdateCollectionMortal() {
StatePath basePath = StatePath.parsePath( "aa.bb");
List<String> items = new LinkedList<>();
items.add( "item1");
items.add( "item2");
items.add( "item3");
_update.appendUpdateCollection( basePath, items, 10);
for( String item : items) {
assertTrue(_update
.hasUpdate(basePath.newChild(item), new StateComposite()));
}
}
@Test
public void testUpdateTransition() throws BadStatePathException {
StateTransition transition = new StateTransition();
StateComposite _root = new StateComposite();
_update.updateTransition( _root, transition);
StateChangeSet rootScs = transition.getStateChangeSet( null);
assertTrue( "missing root string", rootScs.childIsNew( NEW_STRING_PATH.getLastElement()));
StateChangeSet newBranchScs = transition.getStateChangeSet( NEW_INTEGER_PATH.parentPath());
assertTrue( "missing branch metric", newBranchScs.childIsNew( NEW_INTEGER_PATH.getLastElement()));
}
@Test(expected=BadStatePathException.class)
public void testAddBadPath() throws BadStatePathException {
StateTransition transition = new StateTransition();
StateComposite _root = new StateComposite();
// We will attempt to add aStringMetric.anotherMetric; we anticipate this failing
_update.appendUpdate( NEW_STRING_PATH.newChild("anotherMetric") , new StringStateValue( "foo", MORTAL_METRIC_DURATION));
_update.updateTransition( _root, transition);
}
@Test
public void testHasUpdateNull() {
StateComponent newComponent = new StringStateValue( "a string value");
assertFalse( "check hasUpdate with null StatePath", _update.hasUpdate( null, newComponent));
assertFalse( "check hasUpdate with null StateValue", _update.hasUpdate( NEW_STRING_PATH, null));
}
@Test
public void testHasUpdateSameItem() {
StateComponent newComponent = new StringStateValue( "a string value");
_update.appendUpdate( NEW_STRING_PATH, newComponent);
assertTrue( "check same component", _update.hasUpdate( NEW_STRING_PATH, newComponent));
}
@Test
public void testHasUpdateEqualItem() {
String metricValue = "a string value";
StateComponent newComponent1 = new StringStateValue( metricValue);
StateComponent newComponent2 = new StringStateValue( metricValue);
_update.appendUpdate( NEW_STRING_PATH, newComponent1);
assertTrue( "check same component", _update.hasUpdate( NEW_STRING_PATH, newComponent2));
}
@Test
public void testHasUpdateNotEqualItem() {
StateComponent newComponent1 = new StringStateValue( "a string value");
StateComponent newComponent2 = new StringStateValue( "a different string value");
_update.appendUpdate( NEW_STRING_PATH, newComponent1);
assertFalse( "check different value", _update.hasUpdate( NEW_STRING_PATH, newComponent2));
}
@Test
public void testHasUpdateSubPath() {
StateComponent newComponent = new StringStateValue( "a string value");
_update.appendUpdate( NEW_STRING_PATH, newComponent);
assertFalse( "check component with sub path", _update.hasUpdate( NEW_STRING_PATH.newChild( "sub-element"), newComponent));
}
@Test
public void testHasUpdateSuperPath() {
StateComponent newComponent = new StringStateValue( "a string value");
_update.appendUpdate( NEW_STRING_PATH.newChild( "sub-element"), newComponent);
assertFalse( "check component with super path", _update.hasUpdate( NEW_STRING_PATH, newComponent));
}
@Test
public void testHasUpdateDifferentPath() {
StateComponent newComponent = new StringStateValue( "a string value");
_update.appendUpdate( NEW_STRING_PATH, newComponent);
assertFalse( "check component with different path", _update.hasUpdate( StatePath.parsePath( "element1.element2"), newComponent));
}
@Test
public void testHasUpdateComposite() {
StateComponent newComponent = new StateComposite();
StatePath newComponentPath = StatePath.parsePath( "aa.bb");
_update.appendUpdate( newComponentPath, newComponent);
assertTrue( "check composite with same path", _update.hasUpdate( newComponentPath, newComponent));
}
@Test
public void testDebugInfo() {
String info = _update.debugInfo();
assertFalse( "length zero", info.length() == 0);
}
}