/*
Copyright (C) SYSTAP, LLC DBA Blazegraph 2006-2016. All rights reserved.
Contact:
SYSTAP, LLC DBA Blazegraph
2501 Calvert ST NW #106
Washington, DC 20008
licenses@blazegraph.com
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/*
* Created on Mar 22, 2009
*/
package com.bigdata.counters.store;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringWriter;
import java.util.concurrent.TimeUnit;
import javax.xml.parsers.ParserConfigurationException;
import junit.framework.TestCase2;
import org.xml.sax.SAXException;
import com.bigdata.counters.CounterSet;
import com.bigdata.counters.DefaultInstrumentFactory;
import com.bigdata.counters.History;
import com.bigdata.counters.HistoryInstrument;
import com.bigdata.counters.ICounter;
import com.bigdata.counters.IHistoryEntry;
import com.bigdata.counters.Instrument;
import com.bigdata.counters.PeriodEnum;
import com.bigdata.counters.History.SampleIterator;
/**
* @author <a href="mailto:thompsonbry@users.sourceforge.net">Bryan Thompson</a>
* @version $Id$
*/
public class TestCounterSetBTree extends TestCase2 {
/**
*
*/
public TestCounterSetBTree() {
}
/**
* @param arg0
*/
public TestCounterSetBTree(String arg0) {
super(arg0);
}
/**
* FIXME work through unit tests for writing counters and for querying for
* the use cases covered by the httpd interface.
*/
public void test1() {
final CounterSetBTree fixture = CounterSetBTree.createTransient();
final long fromTime = System.currentTimeMillis();
// root (name := "").
final CounterSet root = new CounterSet();
// make a child.
final CounterSet bigdata = root.makePath("www.bigdata.com");
// make a child of a child using a relative path
final ICounter memory = bigdata.addCounter("memory",
new Instrument<Long>() {
public void sample() {
setValue(Runtime.getRuntime().freeMemory());
}
});
// make a child of a child using an absolute path.
final ICounter disk = root.addCounter("/www.bigdata.com/disk",
new Instrument<Long>() {
public void sample() {
setValue(new File(".").getUsableSpace());
// try {
// setValue(FileSystemUtils.freeSpaceKb(".")
// * Bytes.kilobyte);
// } catch(IOException ex) {
// log.error(ex,ex);
// }
}
});
if (log.isInfoEnabled())
log.info(root.asXML(null/* filter */));
fixture.writeHistory(root.getCounters(null/* filter */));
/*
* Note: The toTime needs to be ONE (1) minute beyond the time of
* interest since the minutes come first in the key.
*/
final long toTime = fromTime + TimeUnit.MINUTES.toMillis(1);
final CounterSet tmp = fixture.rangeIterator(fromTime, toTime,
TimeUnit.MINUTES, null/* filter */, 0/* depth */);
if (log.isInfoEnabled())
log.info(tmp.asXML(null/* filter */));
/*
* FIXME verify same data.
*
* @todo verify with filter.
*
* @todo verify path is decoded.
*
* @todo examine when lots of counters with lots of values for each (~60
* to a minute).
*
* @todo generalize the units for the aggregation when reading back from
* the index.
*/
}
/**
* Unit test reads some known data from a local test resource.
*
* @throws SAXException
* @throws ParserConfigurationException
* @throws IOException
*/
public void test_XML() throws IOException, ParserConfigurationException,
SAXException {
final CounterSetBTree fixture = CounterSetBTree.createTransient();
final CounterSet expected = new CounterSet();
final InputStream is = getClass().getResourceAsStream(
"counters-test0.xml");
assertNotNull("Could not locate resource", is);
try {
/*
* Note: This will throw a runtime exception if a source file
* contains more than 60 minutes worth of history data.
*/
expected
.readXML(is, new DefaultInstrumentFactory(60/* nslots */,
PeriodEnum.Minutes, false/* overwrite */), null/* filter */);
} finally {
is.close();
}
if (log.isInfoEnabled()) {
final StringWriter w = new StringWriter();
expected.asXML(w, null/* filter */);
log.info("expected:\n" + w);
}
if (log.isInfoEnabled())
log.info("Writing counters on store.");
fixture.writeHistory(expected.getCounters(null/* filter */));
final CounterSet actual = fixture
.rangeIterator(0L/* fromTime */, 0L/* toTime */,
TimeUnit.MINUTES, null/* filter */, 0/* depth */);
if (log.isInfoEnabled()) {
final StringWriter w = new StringWriter();
actual.asXML(w, null/* filter */);
log.info("actual:\n" + w);
}
final String path = "/blade10.dpp2.org/CPU/% Processor Time";
assertNotNull(path, expected.getPath(path));
assertNotNull(path, actual.getPath(path));
assertTrue(expected.getPath(path) instanceof ICounter);
assertTrue(actual.getPath(path) instanceof ICounter);
assertTrue(((ICounter) expected.getPath(path)).getInstrument() instanceof HistoryInstrument);
assertTrue(((ICounter) actual.getPath(path)).getInstrument() instanceof HistoryInstrument);
final History<Double> expectedHistory = ((HistoryInstrument<Double>) ((ICounter) expected
.getPath(path)).getInstrument()).getHistory();
final History<Double> actualHistory = ((HistoryInstrument<Double>) ((ICounter) actual
.getPath(path)).getInstrument()).getHistory();
assertSameHistory(expectedHistory, actualHistory);
}
protected static void assertSameHistory(final History expected,
final History actual) {
assertEquals("period", expected.getPeriod(), actual.getPeriod());
/*
* Note: Can't compare capacity since they are allocated by different
* sections of the code for different purposes.
*/
// assertEquals("capacity", expected.capacity(), actual.capacity());
assertEquals("size", expected.size(), actual.size());
assertEquals("valueType", expected.getValueType(), actual
.getValueType());
final SampleIterator esitr = expected.iterator();
final SampleIterator asitr = actual.iterator();
assertEquals("firstSampleTime", esitr.getFirstSampleTime(), asitr
.getFirstSampleTime());
assertEquals("lastSampleTime", esitr.getLastSampleTime(), asitr
.getLastSampleTime());
while (esitr.hasNext()) {
final IHistoryEntry eEntry = esitr.next();
assert (asitr.hasNext());
final IHistoryEntry aEntry = asitr.next();
/*
* Note: Can't compare total of the #of samples in a slot or the
* count of the #of samples in a slot since those data are not
* serialized in the XML representation.
*/
// assertEquals("total", eEntry.getTotal(), aEntry.getTotal());
//
// assertEquals("count", eEntry.getCount(), aEntry.getCount());
assertEquals("average", eEntry.getValue(), aEntry.getValue());
}
assertFalse("Actual visits too many entries.", asitr.hasNext());
}
}