package org.sef4j.callstack.stattree.changes;
import java.util.Map;
import org.junit.Assert;
import org.junit.Test;
import org.sef4j.callstack.stats.PerfStats;
import org.sef4j.callstack.stattree.changes.BasicStatPropTreeValueProvider;
import org.sef4j.core.helpers.proptree.model.PropTreeNode;
public class BasicStatPropTreeValueProviderTest {
private PropTreeNode rootNode = PropTreeNode.newRoot();
private PropTreeNode fooNode = rootNode.getOrCreateChild("foo");
private PropTreeNode fooBarNode = fooNode.getOrCreateChild("bar");
// private CallTreeNode fooBarBazNode = fooBarNode.getOrCreateChild("baz");
private PerfStats fooStats = fooNode.getOrCreateProp("stats", PerfStats.FACTORY);
private PerfStats fooBarStats = fooBarNode.getOrCreateProp("stats", PerfStats.FACTORY);
// private PerfStats fooBarBazStats = fooBarBazNode.getStats();
private BasicStatPropTreeValueProvider sut = new BasicStatPropTreeValueProvider(rootNode);
@Test
public void testMarkAndCollectChanges_fooAdd1_chg_fooAdd2_chg_fooRemove1_chg_fooRemove2() {
// Prepare
long startTime1 = 123L;
fooStats.addPending(startTime1);
// Perform
Map<Object, PerfStats> changes = sut.markAndCollectChanges();
// Post-check
Assert.assertEquals(0, changes.size());
// Prepare
long startTime2 = 234L;
fooStats.addPending(startTime2);
// Perform
changes = sut.markAndCollectChanges();
// Post-check
Assert.assertEquals(0, changes.size());
// Prepare
// Perform
changes = sut.markAndCollectChanges();
// Post-check
Assert.assertEquals(0, changes.size());
// Prepare
long elapsedTime1 = 1L;
long endTime1 = startTime1 + elapsedTime1;
fooStats.incrAndRemovePending(startTime1, startTime1, startTime1,
endTime1, endTime1, endTime1);
// Perform
changes = sut.markAndCollectChanges();
// Post-check
Assert.assertEquals(1, changes.size());
PerfStats fooChange = changes.get("foo");
Assert.assertNotNull(fooChange);
assertStats(1, elapsedTime1, fooChange);
// Prepare
long elapsedTime2 = 234L;
long endTime2 = startTime2 + elapsedTime2;
fooStats.incrAndRemovePending(startTime2, startTime2, startTime2,
endTime2, endTime2, endTime2);
// Perform
changes = sut.markAndCollectChanges();
// Post-check
Assert.assertEquals(1, changes.size());
fooChange = changes.get("foo");
Assert.assertNotNull(fooChange);
assertStats(2, elapsedTime1+elapsedTime2, fooChange);
}
@Test
public void testMarkAndCollectChanges_fooAdd1_fooAdd2_chg_fooRemove1_chg_fooRemove2() {
// Prepare
long startTime1 = 123L;
fooStats.addPending(startTime1);
long startTime2 = 234L;
fooStats.addPending(startTime2);
// Perform
Map<Object, PerfStats> changes = sut.markAndCollectChanges();
// Post-check
Assert.assertEquals(0, changes.size());
// Prepare
long elapsedTime1 = 1L;
long endTime1 = startTime1 + elapsedTime1;
fooStats.incrAndRemovePending(startTime1, startTime1, startTime1,
endTime1, endTime1, endTime1);
// Perform
changes = sut.markAndCollectChanges();
// Post-check
Assert.assertEquals(1, changes.size());
PerfStats fooChange = changes.get("foo");
Assert.assertNotNull(fooChange);
assertStats(1, elapsedTime1, fooChange);
// Prepare
long elapsedTime2 = 234L;
long endTime2 = startTime2 + elapsedTime2;
fooStats.incrAndRemovePending(startTime2, startTime2, startTime2,
endTime2, endTime2, endTime2);
// Perform
changes = sut.markAndCollectChanges();
// Post-check
Assert.assertEquals(1, changes.size());
fooChange = changes.get("foo");
Assert.assertNotNull(fooChange);
assertStats(2, elapsedTime1+elapsedTime2, fooChange);
}
@Test
public void testMarkAndCollectChanges_fooAdd1_barAdd1_fooAdd2_chg_fooBarRemove1_chg_fooRemove2_chg() {
// Prepare
// fooAdd1_barAdd1_fooAdd2
long startTime1 = 123L;
fooStats.addPending(startTime1);
long startTimeBar1 = 124L;
fooBarStats.addPending(startTimeBar1);
long startTime2 = 234L;
fooStats.addPending(startTime2);
// src status= 1->foo/bar, 2->foo
// Perform
Map<Object, PerfStats> changes = sut.markAndCollectChanges();
// Post-check
Assert.assertEquals(0, changes.size());
// Prepare fooBarRemove1_chg
long fooBarElapsedTime1 = 1L;
long fooBarEndTime1 = startTime1 + fooBarElapsedTime1;
fooBarStats.incrAndRemovePending(startTime1, startTime1, startTime1,
fooBarEndTime1, fooBarEndTime1, fooBarEndTime1);
// Perform
changes = sut.markAndCollectChanges();
// Post-check
Assert.assertEquals(1, changes.size());
PerfStats fooBarChange = changes.get("foo/bar");
assertStats(1, fooBarElapsedTime1, fooBarChange);
// Prepare fooRemove2_chg
long elapsedTime2 = 234L;
long endTime2 = startTime2 + elapsedTime2;
fooStats.incrAndRemovePending(startTime2, startTime2, startTime2,
endTime2, endTime2, endTime2);
// Perform
changes = sut.markAndCollectChanges();
// Post-check
Assert.assertEquals(1, changes.size());
PerfStats fooChange = changes.get("foo");
assertStats(1, elapsedTime2, fooChange);
// Prepare fooRemove1_chg
long elapsedTime1 = 123L;
long endTime1 = startTime1 + elapsedTime1;
fooStats.incrAndRemovePending(startTime1, startTime1, startTime1,
endTime1, endTime1, endTime1);
// Perform
changes = sut.markAndCollectChanges();
// Post-check
Assert.assertEquals(1, changes.size());
fooChange = changes.get("foo");
assertStats(2, elapsedTime1+elapsedTime2, fooChange);
}
@Test
public void testMarkAndCollectChanges_fooAdd1_barAdd1_fooAdd2_chg_fooBarRemove1_fooRemove2_fooRemove1_chg() {
// Prepare
// fooAdd1_barAdd1_fooAdd2_chg
long startTime1 = 123L;
fooStats.addPending(startTime1);
long startTimeBar1 = 124L;
fooBarStats.addPending(startTimeBar1);
long startTime2 = 234L;
fooStats.addPending(startTime2);
// src status= 1->foo/bar, 2->foo
// Perform
Map<Object, PerfStats> changes = sut.markAndCollectChanges();
// Post-check
Assert.assertEquals(0, changes.size());
// Prepare fooBarRemove1_fooRemove2_fooRemove1_chg
long fooBarElapsedTime1 = 1L;
long fooBarEndTime1 = startTime1 + fooBarElapsedTime1;
fooBarStats.incrAndRemovePending(startTime1, startTime1, startTime1,
fooBarEndTime1, fooBarEndTime1, fooBarEndTime1);
long fooElapsedTime1 = 1L;
long fooEndTime1 = startTime1 + fooElapsedTime1;
fooStats.incrAndRemovePending(startTime1, startTime1, startTime1,
fooEndTime1, fooEndTime1, fooEndTime1);
long fooElapsedTime2 = 234L;
long fooEndTime2 = startTime2 + fooElapsedTime2;
fooStats.incrAndRemovePending(startTime2, startTime2, startTime2,
fooEndTime2, fooEndTime2, fooEndTime2);
// 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());
PerfStats fooChange = changes.get("foo");
Assert.assertNotNull(fooChange);
PerfStats fooBarChange = changes.get("foo/bar");
Assert.assertNotNull(fooBarChange);
assertStats(2, fooElapsedTime1+fooElapsedTime2, fooChange);
assertStats(1, fooBarElapsedTime1, fooBarChange);
}
private static void assertStats(int expectedCount, long expectedSumElapsedTime, PerfStats actual) {
Assert.assertEquals(expectedCount, actual.getElapsedTimeStats().cumulatedCount());
Assert.assertEquals(expectedSumElapsedTime, actual.getElapsedTimeStats().cumulatedSum());
}
}