package org.sef4j.callstack.stattree.changes;
import java.util.Map;
import org.junit.Assert;
import org.junit.Test;
import org.sef4j.callstack.stats.PendingPerfCount;
import org.sef4j.callstack.stats.PerfStats;
import org.sef4j.callstack.stattree.changes.PendingCountPropTreeValueProvider;
import org.sef4j.core.helpers.proptree.model.PropTreeNode;
public class PendingCountPropTreeValueProviderTest {
private PropTreeNode rootNode = PropTreeNode.newRoot();
private PropTreeNode fooNode = rootNode.getOrCreateChild("foo");
private PropTreeNode fooBarNode = fooNode.getOrCreateChild("bar");
// private CallTreeNode fooBarBazNode = fooBarNode.getOrCreateChild("baz");
private PendingPerfCount fooPendings = fooNode.getOrCreateProp("stats", PerfStats.FACTORY).getPendingCounts();
private PendingPerfCount fooBarPendings = fooBarNode.getOrCreateProp("stats", PerfStats.FACTORY).getPendingCounts();
// private PendingPerfCount fooBarBazPendings = fooBarBazNode.getStats().getPendingCounts();
private PendingCountPropTreeValueProvider sut = new PendingCountPropTreeValueProvider(rootNode);
@Test
public void testMarkAndCollectChanges_fooAdd1_chg_fooAdd2_chg_fooRemove1_chg_fooRemove2() {
// Prepare
long startTime1 = 123L;
fooPendings.addPending(startTime1);
// Perform
Map<?,PendingPerfCount> changes = sut.markAndCollectChanges();
// Post-check
Assert.assertEquals(1, changes.size());
PendingPerfCount fooChange = changes.get("foo");
Assert.assertNotNull(fooChange);
assertPendingCounts(1, startTime1, fooChange);
// Prepare
// Perform
changes = sut.markAndCollectChanges();
// Post-check
Assert.assertEquals(0, changes.size());
// Prepare
long startTime2 = 234L;
fooPendings.addPending(startTime2);
// Perform
changes = sut.markAndCollectChanges();
// Post-check
Assert.assertEquals(1, changes.size());
fooChange = changes.get("foo");
Assert.assertNotNull(fooChange);
assertPendingCounts(2, startTime1+startTime2, fooChange);
// Prepare
// Perform
changes = sut.markAndCollectChanges();
// Post-check
Assert.assertEquals(0, changes.size());
// Prepare
fooPendings.removePending(startTime1);
// Perform
changes = sut.markAndCollectChanges();
// Post-check
Assert.assertEquals(1, changes.size());
fooChange = changes.get("foo");
Assert.assertNotNull(fooChange);
assertPendingCounts(1, startTime2, fooChange);
// Prepare
fooPendings.removePending(startTime2);
// Perform
changes = sut.markAndCollectChanges();
// Post-check
Assert.assertEquals(1, changes.size());
fooChange = changes.get("foo");
Assert.assertNotNull(fooChange);
assertPendingCounts(0, 0, fooChange);
}
@Test
public void testMarkAndCollectChanges_fooAdd1_fooAdd2_chg_fooRemove1_chg_fooRemove2() {
// Prepare
long startTime1 = 123L;
fooPendings.addPending(startTime1);
long startTime2 = 234L;
fooPendings.addPending(startTime2);
// Perform
Map<?,PendingPerfCount> changes = sut.markAndCollectChanges();
// Post-check
Assert.assertEquals(1, changes.size());
PendingPerfCount fooChange = changes.get("foo");
Assert.assertNotNull(fooChange);
assertPendingCounts(2, startTime1+startTime2, fooChange);
// Prepare
// Perform
changes = sut.markAndCollectChanges();
// Post-check
Assert.assertEquals(0, changes.size());
// Prepare
fooPendings.removePending(startTime1);
// Perform
changes = sut.markAndCollectChanges();
// Post-check
Assert.assertEquals(1, changes.size());
fooChange = changes.get("foo");
Assert.assertNotNull(fooChange);
assertPendingCounts(1, startTime2, fooChange);
// Prepare
fooPendings.removePending(startTime2);
// Perform
changes = sut.markAndCollectChanges();
// Post-check
Assert.assertEquals(1, changes.size());
fooChange = changes.get("foo");
Assert.assertNotNull(fooChange);
assertPendingCounts(0, 0, fooChange);
}
@Test
public void testMarkAndCollectChanges_fooAdd1_barAdd1_fooAdd2_chg_fooBarRemove1_chg_fooRemove2_chg() {
// Prepare
// fooAdd1_barAdd1_fooAdd2
long startTime1 = 123L;
fooPendings.addPending(startTime1);
long startTimeBar1 = 124L;
fooBarPendings.addPending(startTimeBar1);
long startTime2 = 234L;
fooPendings.addPending(startTime2);
// src status= 1->foo/bar, 2->foo
// Perform
Map<?,PendingPerfCount> changes = sut.markAndCollectChanges();
// Post-check
Assert.assertEquals(2, changes.size());
PendingPerfCount fooChange = changes.get("foo");
Assert.assertNotNull(fooChange);
assertPendingCounts(2, startTime1+startTime2, fooChange);
PendingPerfCount fooBarChange = changes.get("foo/bar");
Assert.assertNotNull(fooBarChange);
assertPendingCounts(1, startTimeBar1, fooBarChange);
// Prepare redo chg
// Perform
changes = sut.markAndCollectChanges();
// Post-check
Assert.assertEquals(0, changes.size());
// Prepare fooBarRemove1_chg
fooBarPendings.removePending(startTimeBar1);
// Perform
// src status= 1->foo, 2->foo (foo.pendingCount=2, foo/bar.pendingCount=0)
// prev status= 1->foo/bar, 2->foo (foo.pendingCount=2, foo/bar.pendingCount=1)
changes = sut.markAndCollectChanges();
// Post-check
Assert.assertEquals(1, changes.size());
Assert.assertNull(changes.get("foo")); // stil pendingCount=2
fooBarChange = changes.get("foo/bar");
Assert.assertNotNull(fooBarChange);
assertPendingCounts(0, 0, fooBarChange);
// Prepare fooRemove2_chg
fooPendings.removePending(startTime2);
// Perform
// src status= 1->foo (foo.pendingCount=1, foo/bar.pendingCount=0)
// prev status= 1->foo, 2->foo (foo.pendingCount=2, foo/bar.pendingCount=0)
changes = sut.markAndCollectChanges();
// Post-check
Assert.assertEquals(1, changes.size());
Assert.assertNull(changes.get("foo/bar"));
fooChange = changes.get("foo");
Assert.assertNotNull(fooChange);
assertPendingCounts(1, startTime1, fooChange);
}
@Test
public void testMarkAndCollectChanges_fooAdd1_barAdd1_fooAdd2_chg_fooBarRemove1_fooRemove2_fooRemove1_chg() {
// Prepare
// fooAdd1_barAdd1_fooAdd2_chg
long startTime1 = 123L;
fooPendings.addPending(startTime1);
long startTimeBar1 = 124L;
fooBarPendings.addPending(startTimeBar1);
long startTime2 = 234L;
fooPendings.addPending(startTime2);
// src status= 1->foo/bar, 2->foo
// Perform
Map<?, PendingPerfCount> changes = sut.markAndCollectChanges();
// Post-check
Assert.assertEquals(2, changes.size());
PendingPerfCount fooChange = changes.get("foo");
Assert.assertNotNull(fooChange);
assertPendingCounts(2, startTime1+startTime2, fooChange);
PendingPerfCount fooBarChange = changes.get("foo/bar");
Assert.assertNotNull(fooBarChange);
assertPendingCounts(1, startTimeBar1, fooBarChange);
// Prepare redo chg
// Perform
changes = sut.markAndCollectChanges();
// Post-check
Assert.assertEquals(0, changes.size());
// Prepare fooBarRemove1_fooRemove2_fooRemove1_chg
fooBarPendings.removePending(startTimeBar1);
fooPendings.removePending(startTime2);
fooPendings.removePending(startTime1);
// Perform
// src status= (foo.pendingCount=0, foo/bar.pendingCount=0)
// prev status= 1->foo/bar, 2->foo (foo.pendingCount=2, foo/bar.pendingCount=1)
changes = sut.markAndCollectChanges();
// Post-check
Assert.assertEquals(2, changes.size());
fooChange = changes.get("foo");
Assert.assertNotNull(fooChange);
fooBarChange = changes.get("foo/bar");
Assert.assertNotNull(fooBarChange);
assertPendingCounts(0, 0, fooChange);
assertPendingCounts(0, 0, fooBarChange);
}
@Test
public void testMarkAndCollectChanges_withSelfPropExtractor() {
// replace default copy storage... sut = new PendingCountChangeCollector(rootNode);
sut = new PendingCountPropTreeValueProvider(rootNode,
rootNode, // <= store on self node! CallTreeNode.newRoot(),
PendingCountPropTreeValueProvider.DEFAULT_PENDING_SRC_COPY_EXTRACTOR,
PendingCountPropTreeValueProvider.createGetOrCreatePropPendingExtractor("propPending")
);
// Prepare
long startTime1 = 123L;
fooPendings.addPending(startTime1);
// Perform
Map<?, PendingPerfCount> changes = sut.markAndCollectChanges();
// Post-check
Assert.assertEquals(1, changes.size());
PendingPerfCount fooChange = changes.get("foo");
Assert.assertNotNull(fooChange);
assertPendingCounts(1, startTime1, fooChange);
// Prepare
// Perform
changes = sut.markAndCollectChanges();
// Post-check
Assert.assertEquals(0, changes.size());
// Prepare
long startTime2 = 234L;
fooPendings.addPending(startTime2);
// Perform
changes = sut.markAndCollectChanges();
// Post-check
Assert.assertEquals(1, changes.size());
fooChange = changes.get("foo");
Assert.assertNotNull(fooChange);
assertPendingCounts(2, startTime1+startTime2, fooChange);
// Prepare
// Perform
changes = sut.markAndCollectChanges();
// Post-check
Assert.assertEquals(0, changes.size());
// Prepare
fooPendings.removePending(startTime1);
// Perform
changes = sut.markAndCollectChanges();
// Post-check
Assert.assertEquals(1, changes.size());
fooChange = changes.get("foo");
Assert.assertNotNull(fooChange);
assertPendingCounts(1, startTime2, fooChange);
// Prepare
fooPendings.removePending(startTime2);
// Perform
changes = sut.markAndCollectChanges();
// Post-check
Assert.assertEquals(1, changes.size());
fooChange = changes.get("foo");
Assert.assertNotNull(fooChange);
assertPendingCounts(0, 0, fooChange);
}
private static void assertPendingCounts(int expectedCount, long expectedSumStartTime, PendingPerfCount actual) {
Assert.assertEquals(expectedCount, actual.getPendingCount());
Assert.assertEquals(expectedSumStartTime, actual.getPendingSumStartTime());
}
}