/*******************************************************************************
* This file is part of OpenNMS(R).
*
* Copyright (C) 2010-2011 The OpenNMS Group, Inc.
* OpenNMS(R) is Copyright (C) 1999-2011 The OpenNMS Group, Inc.
*
* OpenNMS(R) is a registered trademark of The OpenNMS Group, Inc.
*
* OpenNMS(R) 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, either version 3 of the License,
* or (at your option) any later version.
*
* OpenNMS(R) 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 OpenNMS(R). If not, see:
* http://www.gnu.org/licenses/
*
* For more information contact:
* OpenNMS(R) Licensing <license@opennms.org>
* http://www.opennms.org/
* http://www.opennms.com/
*******************************************************************************/
package org.opennms.util.ilr;
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;
import static org.junit.Assume.*;
import java.util.Date;
import java.util.concurrent.TimeUnit;
import org.hamcrest.Description;
import org.hamcrest.Matcher;
import org.junit.Test;
import org.junit.experimental.theories.DataPoints;
import org.junit.experimental.theories.Theories;
import org.junit.experimental.theories.Theory;
import org.junit.internal.matchers.TypeSafeMatcher;
import org.junit.runner.RunWith;
import org.opennms.util.ilr.BaseLogMessage;
import org.opennms.util.ilr.Duration;
/**
* Duration
*
* @author brozow
*/
@RunWith(Theories.class)
public class DurationTest {
static Date timestamp(String dateString) {
return BaseLogMessage.parseTimestamp(dateString);
}
@DataPoints
public static Date[] dataPoints = new Date[]{
timestamp("2010-05-26 12:12:40,000"),
timestamp("2010-05-26 12:12:40,001"),
// duplicate on purpuse
timestamp("2010-05-26 12:12:40,001"),
timestamp("2010-05-26 12:12:40,010"),
timestamp("2010-05-26 12:12:40,100"),
timestamp("2010-05-26 12:12:41,000"),
timestamp("2010-05-26 12:12:50,000"),
timestamp("2010-05-26 12:13:40,000"),
timestamp("2010-05-26 12:22:40,000"),
timestamp("2010-05-26 13:12:40,000"),
timestamp("2010-05-26 22:12:40,000"),
timestamp("2010-05-27 12:12:40,000"),
timestamp("2010-06-26 12:12:40,000"),
timestamp("2011-05-26 12:12:40,000"),
timestamp("2020-05-26 12:12:40,000"),
timestamp("2110-05-26 12:12:40,000"),
timestamp("3010-05-26 12:12:40,000"),
};
public static class ToStringData {
long m_duration;
TimeUnit m_units;
String m_expectedString;
public ToStringData(long duration, TimeUnit units, String expectedString) {
m_duration = duration;
m_units = units;
m_expectedString = expectedString;
}
public long duration() { return m_duration; }
public TimeUnit units() { return m_units; }
public String expectedString() { return m_expectedString; }
}
@DataPoints
public static ToStringData[] toStringData = new ToStringData[]{
new ToStringData(0, TimeUnit.MILLISECONDS, "0ms"),
new ToStringData(1, TimeUnit.MILLISECONDS, "1ms"),
new ToStringData(1, TimeUnit.SECONDS, "1s"),
new ToStringData(60, TimeUnit.SECONDS, "1m"),
new ToStringData(3600, TimeUnit.SECONDS, "1h"),
new ToStringData(3600*24, TimeUnit.SECONDS, "1d"),
new ToStringData(62, TimeUnit.SECONDS, "1m2s"),
new ToStringData(62000, TimeUnit.MILLISECONDS, "1m2s"),
new ToStringData(62003, TimeUnit.MILLISECONDS, "1m2s3ms"),
new ToStringData(60003, TimeUnit.MILLISECONDS, "1m0s3ms"),
new ToStringData(3600*24*3+1, TimeUnit.SECONDS, "3d0h0m1s"),
};
@Theory
public void testToString(ToStringData data) {
Duration d = new Duration(data.duration(), data.units());
assertThat(d.toString(), is(data.expectedString()));
}
@Theory
public void testStartAndEndSame(Date time) {
Duration d = new Duration(time, time);
assertThat(d.millis(), is(0L));
}
@Test
public void testSimpleCompare() {
Duration d1 = new Duration(100);
Duration d2 = new Duration(200);
assertThat(sign(d1.compareTo(d2)), is(-1));
assertThat(sign(d2.compareTo(d1)), is(1));
assertThat(d1.compareTo(d1), is(0));
assertThat(d2.compareTo(d2), is(0));
}
@Theory
public void testCompareTo(Date s1, Date e1, Date s2, Date e2) {
assumeThat(!s1.after(e1), is(true));
assumeThat(!s2.after(e2), is(true));
Duration d1 = new Duration(s1, e1);
Duration d2 = new Duration(s2, e2);
assertThat(d1.compareTo(d2)<0, is(d1.millis()<d2.millis()));
assertThat(d1.compareTo(d2)==0, is(d1.millis()==d2.millis()));
assertThat(d1.compareTo(d2)>0, is(d1.millis()>d2.millis()));
}
@Theory
public void testCreate(Date startTime, Date endTime) {
assumeThat(startTime.before(endTime), is(true));
Duration d = new Duration(startTime, endTime);
assertThat(d.millis(), is(endTime.getTime() - startTime.getTime()));
}
@Theory
public void testCreateWithInvalidDates(Date startTime, Date endTime) {
assumeThat(startTime.after(endTime), is(true));
try {
new Duration(startTime, endTime);
fail("Expected an exception");
} catch (IllegalArgumentException e) {
} catch (Throwable t) {
fail("Unexpected Throwable "+t);
}
}
@Test(expected=IllegalArgumentException.class)
public void testWithNullStartDate() {
new Duration(null, new Date());
}
@Test(expected=IllegalArgumentException.class)
public void testWithNullEndDate() {
new Duration(new Date(), null);
}
@Test(expected=IllegalArgumentException.class)
public void testWithNullTimeUnit() {
new Duration(1, null);
}
Matcher<Integer> isLessThan(final int val) {
return new TypeSafeMatcher<Integer>() {
@Override
public boolean matchesSafely(Integer item) {
return item < val;
}
public void describeTo(Description descr) {
descr.appendText("an integer less than ").appendValue(val);
}
};
}
Matcher<Integer> isGreaterThan(final int val) {
return new TypeSafeMatcher<Integer>() {
@Override
public boolean matchesSafely(Integer item) {
return item > val;
}
public void describeTo(Description descr) {
descr.appendText("an integer greater than ").appendValue(val);
}
};
}
int sign(long num) {
return num < 0 ? -1 : num > 0 ? 1 : 0;
}
}