diff --git a/core/java/src/net/i2p/stat/Rate.java b/core/java/src/net/i2p/stat/Rate.java index 26778cd07..e37f9db9f 100644 --- a/core/java/src/net/i2p/stat/Rate.java +++ b/core/java/src/net/i2p/stat/Rate.java @@ -533,10 +533,13 @@ public class Rate { if ((obj == null) || !(obj instanceof Rate)) return false; if (obj == this) return true; Rate r = (Rate) obj; - return _period == r.getPeriod() && _creationDate == r.getCreationDate() && - // do this the easy way to avoid NPEs. - // Alternative: compare name and group name (very carefully to avoid NPEs) - _stat == r._stat; + if (_period != r.getPeriod() || _creationDate != r.getCreationDate()) + return false; + if (_stat == null && r._stat == null) + return true; + if (_stat != null && r._stat != null) + return _stat.nameGroupDescEquals(r._stat); + return false; } /** diff --git a/core/java/src/net/i2p/stat/RateStat.java b/core/java/src/net/i2p/stat/RateStat.java index a9fe94b80..512fd6402 100644 --- a/core/java/src/net/i2p/stat/RateStat.java +++ b/core/java/src/net/i2p/stat/RateStat.java @@ -166,13 +166,16 @@ public class RateStat { if (obj == this) return true; RateStat rs = (RateStat) obj; - if (DataHelper.eq(getGroupName(), rs.getGroupName()) && DataHelper.eq(getDescription(), rs.getDescription()) - && DataHelper.eq(getName(), rs.getName())) { + if (nameGroupDescEquals(rs)) return deepEquals(this._rates, rs._rates); - } return false; } + + boolean nameGroupDescEquals(RateStat rs) { + return DataHelper.eq(getGroupName(), rs.getGroupName()) && DataHelper.eq(getDescription(), rs.getDescription()) + && DataHelper.eq(getName(), rs.getName()); + } public void store(OutputStream out, String prefix) throws IOException { StringBuilder buf = new StringBuilder(1024); diff --git a/core/java/test/junit/net/i2p/stat/RateStatTest.java b/core/java/test/junit/net/i2p/stat/RateStatTest.java index fe02a9b08..67a4ad233 100644 --- a/core/java/test/junit/net/i2p/stat/RateStatTest.java +++ b/core/java/test/junit/net/i2p/stat/RateStatTest.java @@ -2,34 +2,55 @@ package net.i2p.stat; import java.util.Properties; +import org.junit.Test; + import junit.framework.TestCase; public class RateStatTest extends TestCase { + + @Test + public void testNoRates() throws Exception { + final long emptyArray[] = new long[0]; + try { + new RateStat("test", "test RateStat getters etc", "tests", emptyArray); + fail("created a rate stat with no periods"); + } catch (IllegalArgumentException expected){} + } + + @Test public void testGettersEtc() throws Exception{ - long emptyArray[] = new long[0]; - RateStat rs = new RateStat("test", "test RateStat getters etc", "tests", emptyArray); + final long periods[] = new long[]{10}; + RateStat rs = new RateStat("test", "test RateStat getters etc", "tests", periods); // Test basic getters assertEquals("test", rs.getName()); assertEquals("tests", rs.getGroupName()); assertEquals("test RateStat getters etc", rs.getDescription()); - // There should be no periods, so other getters should return defaults - // TODO: Fix this so it checks that the array is empty rather than comparing objects - //assertEquals(rs.getPeriods(), emptyArray); + // There should be no data, so other getters should return defaults assertEquals(0.0, rs.getLifetimeAverageValue()); assertEquals(0, rs.getLifetimeEventCount()); assertNull(rs.getRate(2000)); + } + + @SuppressWarnings("deprecation") + @Test + public void testAddingAndRemovingThrows() throws Exception { + final long periods[] = new long[]{10}; + RateStat rs = new RateStat("test", "test RateStat getters etc", "tests", periods); - // Test adding and removing a period - assertFalse(rs.containsRate(1000)); - rs.addRate(1000); - assertTrue(rs.containsRate(1000)); - rs.removeRate(1000); - assertFalse(rs.containsRate(1000)); + try { + rs.addRate(1000); + fail("adding periods should not be supported"); + } catch (UnsupportedOperationException expected){} + try { + rs.removeRate(10); + fail("removing periods should not be supported"); + } catch (UnsupportedOperationException expected){} } + @Test public void testRateStat() throws Exception{ RateStat rs = new RateStat("moo", "moo moo moo", "cow trueisms", new long[] { 60 * 1000, 60 * 60 * 1000, 24 * 60 * 60 * 1000}); diff --git a/core/java/test/junit/net/i2p/stat/RateTest.java b/core/java/test/junit/net/i2p/stat/RateTest.java index 82235a785..45d9278a8 100644 --- a/core/java/test/junit/net/i2p/stat/RateTest.java +++ b/core/java/test/junit/net/i2p/stat/RateTest.java @@ -3,10 +3,14 @@ package net.i2p.stat; import java.io.ByteArrayInputStream; import java.util.Properties; +import org.junit.Test; + import junit.framework.TestCase; public class RateTest extends TestCase { + + @Test public void testRate() throws Exception{ Rate rate = new Rate(5000); for (int i = 0; i < 50; i++) {