commit cd2fb43d1511568ee33a3b674bed79f84e397de4 Author: Karsten Loesing karsten.loesing@gmx.net Date: Thu Apr 26 08:47:41 2012 +0200
Order exit-stats numerically, not alphanumerically. --- .../descriptor/impl/ExtraInfoDescriptorImpl.java | 45 +++++++++++++++---- .../impl/ExtraInfoDescriptorImplTest.java | 37 +++++++++++++--- 2 files changed, 66 insertions(+), 16 deletions(-)
diff --git a/src/org/torproject/descriptor/impl/ExtraInfoDescriptorImpl.java b/src/org/torproject/descriptor/impl/ExtraInfoDescriptorImpl.java index 763c9bf..3520934 100644 --- a/src/org/torproject/descriptor/impl/ExtraInfoDescriptorImpl.java +++ b/src/org/torproject/descriptor/impl/ExtraInfoDescriptorImpl.java @@ -5,6 +5,7 @@ package org.torproject.descriptor.impl; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.Arrays; +import java.util.Comparator; import java.util.HashSet; import java.util.List; import java.util.Scanner; @@ -448,20 +449,48 @@ public class ExtraInfoDescriptorImpl extends DescriptorImpl private void parseExitKibibytesWrittenLine(String line, String lineNoOpt, String[] partsNoOpt) throws DescriptorParseException { - this.exitKibibytesWritten = ParseHelper. - parseCommaSeparatedKeyValueList(line, partsNoOpt, 1, 0); + this.exitKibibytesWritten = this.sortByPorts(ParseHelper. + parseCommaSeparatedKeyValueList(line, partsNoOpt, 1, 0)); }
private void parseExitKibibytesReadLine(String line, String lineNoOpt, String[] partsNoOpt) throws DescriptorParseException { - this.exitKibibytesRead = ParseHelper.parseCommaSeparatedKeyValueList( - line, partsNoOpt, 1, 0); + this.exitKibibytesRead = this.sortByPorts(ParseHelper. + parseCommaSeparatedKeyValueList(line, partsNoOpt, 1, 0)); }
private void parseExitStreamsOpenedLine(String line, String lineNoOpt, String[] partsNoOpt) throws DescriptorParseException { - this.exitStreamsOpened = ParseHelper.parseCommaSeparatedKeyValueList( - line, partsNoOpt, 1, 0); + this.exitStreamsOpened = this.sortByPorts(ParseHelper. + parseCommaSeparatedKeyValueList(line, partsNoOpt, 1, 0)); + } + + private SortedMap<String, Integer> sortByPorts( + SortedMap<String, Integer> naturalOrder) { + SortedMap<String, Integer> byPortNumber = + new TreeMap<String, Integer>(new Comparator<String>() { + public int compare(String arg0, String arg1) { + int port0 = 0, port1 = 0; + try { + port1 = Integer.parseInt(arg1); + } catch (NumberFormatException e) { + return -1; + } + try { + port0 = Integer.parseInt(arg0); + } catch (NumberFormatException e) { + return 1; + } + if (port0 < port1) { + return -1; + } else if (port0 > port1) { + return 1; + } else { + return 0; + } + }}); + byPortNumber.putAll(naturalOrder); + return byPortNumber; }
private void parseBridgeStatsEndLine(String line, String lineNoOpt, @@ -722,10 +751,6 @@ public class ExtraInfoDescriptorImpl extends DescriptorImpl return this.exitStatsIntervalLength; }
- /* TODO Add custom comparators to the maps returned by all three - * exit-stats methods to sort keys alphanumerically, not - * alphabetically. */ - private SortedMap<String, Integer> exitKibibytesWritten; public SortedMap<String, Integer> getExitKibibytesWritten() { return this.exitKibibytesWritten == null ? null : diff --git a/test/org/torproject/descriptor/impl/ExtraInfoDescriptorImplTest.java b/test/org/torproject/descriptor/impl/ExtraInfoDescriptorImplTest.java index 1eab3b9..ae1b87a 100644 --- a/test/org/torproject/descriptor/impl/ExtraInfoDescriptorImplTest.java +++ b/test/org/torproject/descriptor/impl/ExtraInfoDescriptorImplTest.java @@ -3,16 +3,13 @@ package org.torproject.descriptor.impl;
import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue;
import java.util.ArrayList; import java.util.List; +import java.util.Map;
import org.junit.Test; -import org.torproject.descriptor.BandwidthHistory; import org.torproject.descriptor.ExtraInfoDescriptor;
/* Test parsing of extra-info descriptors. */ @@ -801,8 +798,36 @@ public class ExtraInfoDescriptorImplTest {
@Test() public void testExitStatsValid() throws DescriptorParseException { - ExitStatsBuilder.createWithDefaultLines(); - /* TODO Check stats parts. */ + ExtraInfoDescriptor descriptor = ExitStatsBuilder. + createWithDefaultLines(); + assertEquals(1328925579000L, descriptor.getExitStatsEndMillis()); + assertEquals(86400L, descriptor.getExitStatsIntervalLength()); + String[] ports = new String[] { "25", "80", "443", "49755", + "52563", "52596", "57528", "60912", "61351", "64811", "other" }; + int[] writtenValues = new int[] { 74647, 31370, 20577, 23, 12, 1111, + 4, 11, 6, 3365, 2592}; + int i = 0; + for (Map.Entry<String, Integer> e : + descriptor.getExitKibibytesWritten().entrySet()) { + assertEquals(ports[i], e.getKey()); + assertEquals(writtenValues[i++], e.getValue().intValue()); + } + int[] readValues = new int[] { 35562, 1254256, 110279, 9396, 1911, + 648, 1188, 1427, 1824, 14, 3054 }; + i = 0; + for (Map.Entry<String, Integer> e : + descriptor.getExitKibibytesRead().entrySet()) { + assertEquals(ports[i], e.getKey()); + assertEquals(readValues[i++], e.getValue().intValue()); + } + int[] streamsValues = new int[] { 369748, 64212, 151660, 4, 4, 4, 4, + 4, 4, 4, 1212 }; + i = 0; + for (Map.Entry<String, Integer> e : + descriptor.getExitStreamsOpened().entrySet()) { + assertEquals(ports[i], e.getKey()); + assertEquals(streamsValues[i++], e.getValue().intValue()); + } }
/* TODO Add tests for invalid exit stats. */
tor-commits@lists.torproject.org