Commit ee696b09 authored by Karsten Loesing's avatar Karsten Loesing
Browse files

Add support for six new key-value pairs added by OnionPerf.

OnionPerf adds six new key-value pairs to the .tpf format that
Torperf/CollecTor did not produce: ENDPOINTLOCAL, ENDPOINTPROXY,
ENDPOINTREMOTE, HOSTNAMELOCAL, HOSTNAMEREMOTE, and SOURCEADDRESS.

We should add support for these keys to metrics-lib, so that we can
start using their values.

Implements #22122.
parent 8f69d784
......@@ -3,6 +3,7 @@
# Medium changes
- Fix a bug where unrecognized lines in extra-info descriptors
below crypto blocks were silently skipped.
- Add support for six new key-value pairs added by OnionPerf.
# Changes in version 1.6.0 - 2017-02-17
......
......@@ -211,5 +211,67 @@ public interface TorperfResult extends Descriptor {
* @since 1.0.0
*/
public int getUsedBy();
/**
* Return the hostname, IP address, and port that the TGen client used to
* connect to the local tor SOCKS port, formatted as
* <code>hostname:ip:port</code>, which may be <code>"NULL:0.0.0.0:0"</code>
* if TGen was not able to find this information or <code>null</code> if the
* OnionPerf line didn't contain this information.
*
* @since 1.7.0
*/
public String getEndpointLocal();
/**
* Return the hostname, IP address, and port that the TGen client used to
* connect to the SOCKS proxy server that tor runs, formatted as
* <code>hostname:ip:port</code>, which may be <code>"NULL:0.0.0.0:0"</code>
* if TGen was not able to find this information or <code>null</code> if the
* OnionPerf line didn't contain this information.
*
* @since 1.7.0
*/
public String getEndpointProxy();
/**
* Return the hostname, IP address, and port that the TGen client used to
* connect to the remote server, formatted as <code>hostname:ip:port</code>,
* which may be <code>"NULL:0.0.0.0:0"</code> if TGen was not able to find
* this information or <code>null</code> if the OnionPerf line didn't contain
* this information.
*
* @since 1.7.0
*/
public String getEndpointRemote();
/**
* Return the client machine hostname, which may be <code>"(NULL)"</code> if
* the TGen client was not able to find this information or <code>null</code>
* if the OnionPerf line didn't contain this information.
*
* @since 1.7.0
*/
public String getHostnameLocal();
/**
* Return the server machine hostname, which may be <code>"(NULL)"</code> if
* the TGen server was not able to find this information or <code>null</code>
* if the OnionPerf line didn't contain this information.
*
* @since 1.7.0
*/
public String getHostnameRemote();
/**
* Return the public IP address of the OnionPerf host obtained by connecting
* to well-known servers and finding the IP address in the result, which may
* be <code>"unknown"</code> if OnionPerf was not able to find this
* information or <code>null</code> if the OnionPerf line didn't contain this
* information.
*
* @since 1.7.0
*/
public String getSourceAddress();
}
......@@ -147,6 +147,24 @@ public class TorperfResultImpl extends DescriptorImpl
case "USED_BY":
this.parseUsedBy(value, keyValue, line);
break;
case "ENDPOINTLOCAL":
this.parseEndpointLocal(value, keyValue, line);
break;
case "ENDPOINTPROXY":
this.parseEndpointProxy(value, keyValue, line);
break;
case "ENDPOINTREMOTE":
this.parseEndpointRemote(value, keyValue, line);
break;
case "HOSTNAMELOCAL":
this.parseHostnameLocal(value, keyValue, line);
break;
case "HOSTNAMEREMOTE":
this.parseHostnameRemote(value, keyValue, line);
break;
case "SOURCEADDRESS":
this.parseSourceAddress(value, keyValue, line);
break;
default:
if (key.startsWith("DATAPERC")) {
this.parseDataPercentile(value, keyValue, line);
......@@ -359,6 +377,30 @@ public class TorperfResultImpl extends DescriptorImpl
this.usedBy = this.parseInt(value, keyValue, line);
}
private void parseEndpointLocal(String value, String keyValue, String line) {
this.endpointLocal = value;
}
private void parseEndpointProxy(String value, String keyValue, String line) {
this.endpointProxy = value;
}
private void parseEndpointRemote(String value, String keyValue, String line) {
this.endpointRemote = value;
}
private void parseHostnameLocal(String value, String keyValue, String line) {
this.hostnameLocal = value;
}
private void parseHostnameRemote(String value, String keyValue, String line) {
this.hostnameRemote = value;
}
private void parseSourceAddress(String value, String keyValue, String line) {
this.sourceAddress = value;
}
private long parseTimestamp(String value, String keyValue, String line)
throws DescriptorParseException {
long timestamp = -1L;
......@@ -570,5 +612,47 @@ public class TorperfResultImpl extends DescriptorImpl
public int getUsedBy() {
return this.usedBy;
}
private String endpointLocal;
@Override
public String getEndpointLocal() {
return this.endpointLocal;
}
private String endpointProxy;
@Override
public String getEndpointProxy() {
return this.endpointProxy;
}
private String endpointRemote;
@Override
public String getEndpointRemote() {
return this.endpointRemote;
}
private String hostnameLocal;
@Override
public String getHostnameLocal() {
return this.hostnameLocal;
}
private String hostnameRemote;
@Override
public String getHostnameRemote() {
return this.hostnameRemote;
}
private String sourceAddress;
@Override
public String getSourceAddress() {
return this.sourceAddress;
}
}
......@@ -5,8 +5,10 @@ package org.torproject.descriptor.impl;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import org.torproject.descriptor.Descriptor;
import org.torproject.descriptor.DescriptorParseException;
import org.junit.Test;
......@@ -95,5 +97,45 @@ public class TorperfResultImplTest {
assertEquals("DATAPERMILLE",
torperfResult.getUnrecognizedKeys().firstKey());
}
private static final String input2 =
"BUILDTIMES=0.490000009537,0.610000133514,0.75 CIRC_ID=8522 "
+ "CONNECT=1493397365.14 DATACOMPLETE=1493397368.13 "
+ "DATAPERC0=1493397367.67 DATAPERC10=1493397367.81 "
+ "DATAPERC100=1493397368.13 DATAPERC20=1493397367.87 "
+ "DATAPERC30=1493397367.87 DATAPERC40=1493397367.90 "
+ "DATAPERC50=1493397367.91 DATAPERC60=1493397367.97 "
+ "DATAPERC70=1493397367.97 DATAPERC80=1493397367.99 "
+ "DATAPERC90=1493397367.99 DATAREQUEST=1493397367.33 "
+ "DATARESPONSE=1493397367.67 DIDTIMEOUT=0 "
+ "ENDPOINTLOCAL=localhost:127.0.0.1:42436 "
+ "ENDPOINTPROXY=localhost:127.0.0.1:52265 "
+ "ENDPOINTREMOTE=4jocm7xwo4ltrvzp.onion:0.0.0.0:80 FILESIZE=51200 "
+ "HOSTNAMELOCAL=op-us HOSTNAMEREMOTE=op-us LAUNCH=1493396168.1 "
+ "NEGOTIATE=1493397365.14 "
+ "PATH=$F69BED36177ED727706512BA6A97755025EEA0FB,"
+ "$91D23D8A539B83D2FB56AA67ECD4D75CC093AC55,"
+ "$4DD902046E7155BBE79C34EE6D53BF7408B98CE4 QUANTILE=0.8 "
+ "READBYTES=51269 REQUEST=1493397365.14 RESPONSE=1493397367.32 "
+ "SOCKET=1493397365.14 SOURCE=op-us SOURCEADDRESS=199.119.112.144 "
+ "START=1493397365.14 TIMEOUT=1500 USED_AT=1493397368.14 "
+ "USED_BY=17429 WRITEBYTES=54";
@Test()
public void testEndpointsHostnamesSourceAddress()
throws DescriptorParseException {
List<Descriptor> result = TorperfResultImpl.parseTorperfResults(
input2.getBytes(), true);
assertEquals(1, result.size());
TorperfResultImpl torperfResult = (TorperfResultImpl) result.get(0);
assertNull(torperfResult.getUnrecognizedKeys());
assertEquals("localhost:127.0.0.1:42436", torperfResult.getEndpointLocal());
assertEquals("localhost:127.0.0.1:52265", torperfResult.getEndpointProxy());
assertEquals("4jocm7xwo4ltrvzp.onion:0.0.0.0:80",
torperfResult.getEndpointRemote());
assertEquals("op-us", torperfResult.getHostnameLocal());
assertEquals("op-us", torperfResult.getHostnameRemote());
assertEquals("199.119.112.144", torperfResult.getSourceAddress());
}
}
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment