[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r23734 - in gnunet-java: . src/org/gnunet/construct src/org
From: |
gnunet |
Subject: |
[GNUnet-SVN] r23734 - in gnunet-java: . src/org/gnunet/construct src/org/gnunet/mesh src/org/gnunet/util test/org/gnunet test/org/gnunet/mesh test/org/gnunet/statistics |
Date: |
Mon, 10 Sep 2012 12:37:09 +0200 |
Author: dold
Date: 2012-09-10 12:37:09 +0200 (Mon, 10 Sep 2012)
New Revision: 23734
Added:
gnunet-java/src/org/gnunet/mesh/ConnectPeerByTypeMessage.java
gnunet-java/src/org/gnunet/mesh/PeerAdd.java
gnunet-java/src/org/gnunet/util/HelperProcess.java
gnunet-java/test/org/gnunet/mesh/
gnunet-java/test/org/gnunet/mesh/MeshTest.java
Modified:
gnunet-java/ISSUES
gnunet-java/build.gradle
gnunet-java/src/org/gnunet/construct/MsgMap.txt
gnunet-java/src/org/gnunet/mesh/ClientConnectMessage.java
gnunet-java/src/org/gnunet/mesh/ConnectHandler.java
gnunet-java/src/org/gnunet/mesh/Mesh.java
gnunet-java/src/org/gnunet/mesh/TunnelCreateMessage.java
gnunet-java/src/org/gnunet/util/Connection.java
gnunet-java/src/org/gnunet/util/Program.java
gnunet-java/test/org/gnunet/statistics/StatisticsTest.java
Log:
work on mesh, added support for cobertura to build.gradle
Modified: gnunet-java/ISSUES
===================================================================
--- gnunet-java/ISSUES 2012-09-09 22:24:50 UTC (rev 23733)
+++ gnunet-java/ISSUES 2012-09-10 10:37:09 UTC (rev 23734)
@@ -182,3 +182,45 @@
* should GNUnet-java also implement it?
RE: maybe, but certainly not yet, stream is still to experimental anyway
+
+------------------------------------------------------------------------------------------------------
+
+* build system: the gradle build script now works with cobertura!
+
+
+* while I'm still confused with all the details, I somewhat see where to start
implementing it with GNUnet
+ * "posting" / the "bulletin board" sounds a lot like the DHT
+ * I remember you talking about librarys for SMC which are only available for
java. which are these?
+
+* sometimes it would be nice to get the log of a service when testing it
+ * there was a wrong comment in mesh.h regarding the size of application types
=> failed assertion would be useful
+ * eventually started service manually (with gnunet-testing-run-service) and
supplied temporary config file to test case
+ * not very nice
+ * do you have any ideas on how to realize this?
+ * probably easiest to direct log to file
+
+
+* why does mesh_api.c use data structures from mesh_protocol.h? why are fields
like ttl involved? (mesh_api.c:1366)
+
+* occurred during testing (at first i thought it was my fault / a bug in
gnunet-java):
+ * when connecting a client to the tunnel with connect_by_type the owner of
the tunnel gets notified
+ * but the client who is added does *not* get a inbound tunnel notification
+ * ... until someone sends a message to him. this is nowhere documented.
+
+* sending/receiving in mesh is kind of complicated (ACKs / windows)
+ * why is there the need for three different kinds of messages for traffic?
+ * to oritin
+ * unicast
+ * multicast
+ * why does the packet id have to be set in these messages?
+
+* does the RootTunnel extends Tunnel hierarchy make sense?
+
+=> there is a lot of "bad stuff" in mesh
+(the comments and code talk about completely different stuff, see e.g. mesh.h)
+
+i really wanted to make more progress but working with mesh is *absolutely*
frustrating!
+
+* regarding arm:
+ * I understand that it's not wise to kill non-cooperating services after a
timeout
+ * but shouldn't arm respond to CTRL+C in those cases? bug? intentional /
related to signal handling?
\ No newline at end of file
Modified: gnunet-java/build.gradle
===================================================================
--- gnunet-java/build.gradle 2012-09-09 22:24:50 UTC (rev 23733)
+++ gnunet-java/build.gradle 2012-09-10 10:37:09 UTC (rev 23734)
@@ -1,9 +1,10 @@
-
/*
in-progess buildfile for gradle (http://gradle.org/)
problems with gradle: no direct support for cobertura
*/
+import groovy.io.FileType
+
apply plugin: 'java'
buildDir = "$projectDir/build-gradle"
@@ -27,3 +28,39 @@
}
}
}
+
+
+task(instrument, dependsOn: 'classes', type: JavaExec) {
+ inputs.dir compileJava.destinationDir
+ outputs.dir (new File("$buildDir/classes_instrumented"))
+
+ classpath = files("$projectDir/cobertura/cobertura.jar",
+ "$projectDir/cobertura/lib/*")
+ main = 'net.sourceforge.cobertura.instrument.Main'
+
+ List<String> myArgs = []
+ myArgs.addAll(["--datafile", "$projectDir/coverage.data"])
+ myArgs.addAll(["--destination", "$buildDir/classes_instrumented"])
+ compileJava.destinationDir.eachFileRecurse (FileType.FILES) { file ->
+ myArgs.add(file.absolutePath)
+ }
+ args = myArgs
+}
+
+task(testCoverage, dependsOn: ['instrument', 'cleanTest'], type: Test) {
+ classpath = files("$buildDir/classes_instrumented",
+ "$projectDir/cobertura/cobertura.jar",
+ project.sourceSets.test.runtimeClasspath)
+ systemProperties =
["net.sourceforge.cobertura.datafile":"$projectDir/coverage.data"]
+}
+
+task(reportCoverage, dependsOn: ['testCoverage'], type: JavaExec) {
+ classpath = files("$projectDir/cobertura/cobertura.jar",
+ "$projectDir/cobertura/lib/*")
+ main = 'net.sourceforge.cobertura.reporting.Main'
+ List<String> myArgs = []
+ myArgs.addAll(["--datafile", "$projectDir/coverage.data"])
+ myArgs.addAll(["--destination", "$projectDir/coverage-report"])
+ myArgs.add("$projectDir/src/")
+ args = myArgs
+}
Modified: gnunet-java/src/org/gnunet/construct/MsgMap.txt
===================================================================
--- gnunet-java/src/org/gnunet/construct/MsgMap.txt 2012-09-09 22:24:50 UTC
(rev 23733)
+++ gnunet-java/src/org/gnunet/construct/MsgMap.txt 2012-09-10 10:37:09 UTC
(rev 23734)
@@ -1,8 +1,9 @@
org.gnunet.util.Resolver$Address|0=org.gnunet.util.Resolver$TextualAddress
org.gnunet.util.Resolver$Address|1=org.gnunet.util.Resolver$NumericAddress
+org.gnunet.util.GnunetMessage$Body|275=org.gnunet.mesh.PeerAdd
org.gnunet.util.GnunetMessage$Body|68=org.gnunet.core.DisconnectNotifyMessage
+org.gnunet.util.GnunetMessage$Body|274=org.gnunet.mesh.TunnelDestroyMessage
org.gnunet.util.GnunetMessage$Body|1=org.gnunet.util.TestMessage
-org.gnunet.util.GnunetMessage$Body|274=org.gnunet.mesh.TunnelDestroyMessage
org.gnunet.util.GnunetMessage$Body|273=org.gnunet.mesh.TunnelCreateMessage
org.gnunet.util.GnunetMessage$Body|70=org.gnunet.core.NotifyInboundTrafficMessage
org.gnunet.util.GnunetMessage$Body|71=org.gnunet.core.NotifyOutboundTrafficMessage
@@ -12,6 +13,7 @@
org.gnunet.util.GnunetMessage$Body|5=org.gnunet.util.Resolver$ResolverResponse
org.gnunet.util.GnunetMessage$Body|65=org.gnunet.core.InitReplyMessage
org.gnunet.util.GnunetMessage$Body|143=org.gnunet.dht.ClientGetMessage
+org.gnunet.util.GnunetMessage$Body|277=org.gnunet.mesh.ConnectPeerByTypeMessage
org.gnunet.util.GnunetMessage$Body|142=org.gnunet.dht.ClientPutMessage
org.gnunet.util.GnunetMessage$Body|67=org.gnunet.core.ConnectNotifyMessage
org.gnunet.util.GnunetMessage$Body|76=org.gnunet.core.SendMessage
@@ -35,4 +37,4 @@
org.gnunet.util.GnunetMessage$Body|168=org.gnunet.statistics.SetMessage
org.gnunet.util.GnunetMessage$Body|173=org.gnunet.statistics.WatchResponseMessage
org.gnunet.util.GnunetMessage$Body|172=org.gnunet.statistics.WatchMessage
-# generated 2012/08/22 15:06:49
+# generated 2012/09/10 00:26:15
Modified: gnunet-java/src/org/gnunet/mesh/ClientConnectMessage.java
===================================================================
--- gnunet-java/src/org/gnunet/mesh/ClientConnectMessage.java 2012-09-09
22:24:50 UTC (rev 23733)
+++ gnunet-java/src/org/gnunet/mesh/ClientConnectMessage.java 2012-09-10
10:37:09 UTC (rev 23734)
@@ -14,7 +14,7 @@
public int applications_length;
@UInt16
public int types_length;
- @VariableSizeIntegerArray(lengthField = "applications_length", signed =
false, bitSize = 16)
+ @VariableSizeIntegerArray(lengthField = "applications_length", signed =
false, bitSize = 32)
public int[] apps_list;
@VariableSizeIntegerArray(lengthField = "types_length", signed = false,
bitSize = 16)
public int[] types_list;
Modified: gnunet-java/src/org/gnunet/mesh/ConnectHandler.java
===================================================================
--- gnunet-java/src/org/gnunet/mesh/ConnectHandler.java 2012-09-09 22:24:50 UTC
(rev 23733)
+++ gnunet-java/src/org/gnunet/mesh/ConnectHandler.java 2012-09-10 10:37:09 UTC
(rev 23734)
@@ -1,9 +1,13 @@
package org.gnunet.mesh;
+import org.gnunet.peerinfo.PeerInfo;
+import org.gnunet.util.PeerIdentity;
+
/**
* ...
*
* @author Florian Dold
*/
-public class ConnectHandler {
+public interface ConnectHandler {
+ public void onConnect(Mesh.Tunnel tunnel, PeerIdentity peer);
}
Added: gnunet-java/src/org/gnunet/mesh/ConnectPeerByTypeMessage.java
===================================================================
--- gnunet-java/src/org/gnunet/mesh/ConnectPeerByTypeMessage.java
(rev 0)
+++ gnunet-java/src/org/gnunet/mesh/ConnectPeerByTypeMessage.java
2012-09-10 10:37:09 UTC (rev 23734)
@@ -0,0 +1,18 @@
+package org.gnunet.mesh;
+
+import org.gnunet.construct.UInt32;
+import org.gnunet.construct.UnionCase;
+import org.gnunet.util.GnunetMessage;
+/**
+ * ...
+ *
+ * @author Florian Dold
+ */
address@hidden(277)
+public class ConnectPeerByTypeMessage implements GnunetMessage.Body {
+ @UInt32
+ public int tunnelId;
+
+ @UInt32
+ public int applicationType;
+}
Modified: gnunet-java/src/org/gnunet/mesh/Mesh.java
===================================================================
--- gnunet-java/src/org/gnunet/mesh/Mesh.java 2012-09-09 22:24:50 UTC (rev
23733)
+++ gnunet-java/src/org/gnunet/mesh/Mesh.java 2012-09-10 10:37:09 UTC (rev
23734)
@@ -20,17 +20,30 @@
package org.gnunet.mesh;
+import com.google.common.collect.Maps;
import org.gnunet.requests.Request;
import org.gnunet.requests.RequestQueue;
import org.gnunet.util.*;
import org.grothoff.Runabout;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import java.util.Map;
+
/**
*
*
* @author Florian Dold
*/
public class Mesh {
+ private static final Logger logger = LoggerFactory
+ .getLogger(Mesh.class);
+
+ private static final int INITIAL_WINDOW_SIZE = 8;
+ private static final int ACK_THRESHOLD = INITIAL_WINDOW_SIZE / 2;
+
+
+
private RequestQueue requestQueue;
private TunnelEndHandler tunnelEndHandler;
private Runabout messageReceiver;
@@ -40,8 +53,27 @@
private int nextTunnelId = 0x80000000;
+ Map<Integer, RootTunnel> rootTunnelMap = Maps.newTreeMap();
+
public class RootTunnel extends Tunnel {
+
+
+ public DisconnectHandler disconnectHandler;
+ public ConnectHandler connectHandler;
+
+ class ConnectByTypeRequest extends Request {
+ int appType;
+ @Override
+ public void transmit(Connection.MessageSink sink) {
+ ConnectPeerByTypeMessage m = new ConnectPeerByTypeMessage();
+ m.applicationType = appType;
+ m.tunnelId = tunnelId;
+ sink.send(m);
+ }
+ }
+
+
public void addPeer(PeerIdentity peerIdentity) {
}
@@ -74,7 +106,9 @@
* (MESH should discover peer in proximity handling
this type)
*/
public void requestConnectByType (int appType) {
-
+ ConnectByTypeRequest r = new ConnectByTypeRequest();
+ r.appType = appType;
+ requestQueue.add(r);
}
/**
@@ -113,8 +147,13 @@
}
public class Tunnel {
- int tunnel_id;
+ int tunnelId;
+ int nextSentPacketId = 0;
+ int maxSentPacketId = INITIAL_WINDOW_SIZE - 1;
+ int lastRecvPacketId = -1;
+ int maxRecvPacketId = 0;
+
/**
* Ask the mesh to call "notify" once it is ready to transmit the
* given number of bytes to the specified tunnel or target.
@@ -145,15 +184,20 @@
public class ClientConnectRequest extends Request {
-
@Override
public void transmit(Connection.MessageSink sink) {
ClientConnectMessage ccm = new ClientConnectMessage();
ccm.applications_length = applications.length;
ccm.apps_list = applications;
- int[] types =
RunaboutUtil.getRunaboutMessageTypes(messageReceiver);
+ int[] types;
+ if (messageReceiver != null) {
+ types = RunaboutUtil.getRunaboutMessageTypes(messageReceiver);
+ } else {
+ types = new int[0];
+ }
ccm.types_list = types;
ccm.types_length = types.length;
+
sink.send(ccm);
}
}
@@ -168,13 +212,23 @@
@Override
public void transmit(Connection.MessageSink sink) {
TunnelCreateMessage tcm = new TunnelCreateMessage();
- tcm.tunnel_id = tunnel.tunnel_id;
+ tcm.tunnel_id = tunnel.tunnelId;
sink.send(tcm);
}
}
private class MeshMessageReceiver extends RunaboutMessageReceiver {
+ public void visit(PeerAdd b) {
+ RootTunnel r = rootTunnelMap.get(b.tunnelId);
+ if (r == null) {
+ logger.warn("server got confused with tunnel IDs, ignoring
message");
+ return;
+ }
+ if (r.connectHandler != null) {
+ r.connectHandler.onConnect(r, b.peer);
+ }
+ }
@Override
public void handleError() {
@@ -204,7 +258,10 @@
*/
public RootTunnel createTunnel(ConnectHandler connectHandler,
DisconnectHandler disconnectHandler) {
RootTunnel tunnel = new RootTunnel();
- tunnel.tunnel_id = nextTunnelId++;
+ tunnel.connectHandler = connectHandler;
+ tunnel.disconnectHandler = disconnectHandler;
+ tunnel.tunnelId = nextTunnelId++;
+ rootTunnelMap.put(tunnel.tunnelId, tunnel);
tunnel.registerWithService();
return tunnel;
}
Added: gnunet-java/src/org/gnunet/mesh/PeerAdd.java
===================================================================
--- gnunet-java/src/org/gnunet/mesh/PeerAdd.java
(rev 0)
+++ gnunet-java/src/org/gnunet/mesh/PeerAdd.java 2012-09-10 10:37:09 UTC
(rev 23734)
@@ -0,0 +1,23 @@
+package org.gnunet.mesh;
+
+import org.gnunet.construct.NestedMessage;
+import org.gnunet.construct.UInt32;
+import org.gnunet.construct.UnionCase;
+import org.gnunet.util.GnunetMessage;
+import org.gnunet.util.PeerIdentity;
+
+/**
+ * Message used for two things (bad!)
+ * (1) client->server: request that a certain peer is added to a tunnel
+ * (2) server->client: notify the client that a new peer has joined the tunnel
+ *
+ * @author Florian Dold
+ */
address@hidden(275)
+public class PeerAdd implements GnunetMessage.Body {
+ @UInt32
+ public int tunnelId;
+
+ @NestedMessage
+ public PeerIdentity peer;
+}
Modified: gnunet-java/src/org/gnunet/mesh/TunnelCreateMessage.java
===================================================================
--- gnunet-java/src/org/gnunet/mesh/TunnelCreateMessage.java 2012-09-09
22:24:50 UTC (rev 23733)
+++ gnunet-java/src/org/gnunet/mesh/TunnelCreateMessage.java 2012-09-10
10:37:09 UTC (rev 23734)
@@ -23,6 +23,8 @@
/**
* Only present if sent from server to client (purpose b)
*/
+ /*
@NestedMessage(optional = true)
public PeerIdentity otherEnd;
+ */
}
Modified: gnunet-java/src/org/gnunet/util/Connection.java
===================================================================
--- gnunet-java/src/org/gnunet/util/Connection.java 2012-09-09 22:24:50 UTC
(rev 23733)
+++ gnunet-java/src/org/gnunet/util/Connection.java 2012-09-10 10:37:09 UTC
(rev 23734)
@@ -190,6 +190,10 @@
recvBuffer.position());
connectionChannel.close();
connectionChannel = null;
+ if (Connection.this.currentTransmitHelper != null) {
+ Connection.this.currentTransmitHelper.cancel();
+ Connection.this.currentTransmitHelper = null;
+ }
try {
receiver.handleError();
} finally {
@@ -286,6 +290,10 @@
@Override
public void run(Scheduler.RunContext ctx) {
this.transmitTask = null;
+ if (connectionChannel == null) {
+ logger.error("could not write to channel (null)");
+ return;
+ }
try {
int n = connectionChannel.write(transmitBuffer);
logger.debug("connectionChannel has written " + n + " bytes to
" + connectionChannel.socket().toString());
Added: gnunet-java/src/org/gnunet/util/HelperProcess.java
===================================================================
--- gnunet-java/src/org/gnunet/util/HelperProcess.java
(rev 0)
+++ gnunet-java/src/org/gnunet/util/HelperProcess.java 2012-09-10 10:37:09 UTC
(rev 23734)
@@ -0,0 +1,21 @@
+package org.gnunet.util;
+
+/**
+ * A helper process is a process that can be started, shut down and
communicated with asynchronously.
+ *
+ * @author Florian Dold
+ */
+public class HelperProcess {
+
+ public void HelperProcess(String name, String... args) {
+
+ }
+
+ public void readLine() {
+
+ }
+
+ public void write(String s) {
+
+ }
+}
Modified: gnunet-java/src/org/gnunet/util/Program.java
===================================================================
--- gnunet-java/src/org/gnunet/util/Program.java 2012-09-09 22:24:50 UTC
(rev 23733)
+++ gnunet-java/src/org/gnunet/util/Program.java 2012-09-10 10:37:09 UTC
(rev 23734)
@@ -142,6 +142,15 @@
}
}
+ public static void configureLogging(String logLevel) {
+ configureLogging(logLevel, null);
+ }
+
+ public static void configureLogging() {
+ configureLogging(null, null);
+ }
+
+
/**
* Override to display a different help text on "-h/--help"
*
Added: gnunet-java/test/org/gnunet/mesh/MeshTest.java
===================================================================
--- gnunet-java/test/org/gnunet/mesh/MeshTest.java
(rev 0)
+++ gnunet-java/test/org/gnunet/mesh/MeshTest.java 2012-09-10 10:37:09 UTC
(rev 23734)
@@ -0,0 +1,74 @@
+package org.gnunet.mesh;
+
+import junit.framework.Assert;
+import org.gnunet.construct.Construct;
+import org.gnunet.testing.TestingSubsystem;
+import org.gnunet.util.*;
+import org.grothoff.Runabout;
+import org.junit.Test;
+
+/**
+ * ...
+ *
+ * @author Florian Dold
+ */
+public class MeshTest {
+
+ @Test
+ public void test_dummy() {
+
+ }
+
+ public void test_mesh_connect() {
+ Program.configureLogging();
+
+ final TestingSubsystem ts = new TestingSubsystem("mesh");
+ Configuration cfg = ts.getConfiguration();
+
+ final Wrapper<Boolean> gotInbound = new Wrapper<Boolean>();
+
+ InboundTunnelHandler inbound = new InboundTunnelHandler() {
+ @Override
+ public void onInboundTunnel(Mesh.Tunnel tunnel, PeerIdentity
initiator) {
+ gotInbound.set(true);
+ }
+ };
+
+ Runabout r = new Runabout() {
+ public void visit(TestMessage m) {
+
+ }
+ };
+
+ Mesh m1 = new Mesh(cfg, null, null, r, 1);
+ Mesh m2 = new Mesh(cfg, inbound, null, r, 1);
+
+ final Mesh.RootTunnel tunnel = m1.createTunnel(new ConnectHandler() {
+ @Override
+ public void onConnect(Mesh.Tunnel tunnel, PeerIdentity peer) {
+ System.out.println("peer added to tunnel");
+ tunnel.notifyTransmitReady(RelativeTime.FOREVER, peer, 4, new
MessageTransmitter() {
+ @Override
+ public void transmit(Connection.MessageSink sink) {
+ sink.send(new TestMessage());
+ }
+
+ @Override
+ public void handleError() {
+ Assert.fail();
+ }
+ });
+ }
+ }, null);
+
+ Scheduler.addDelayed(RelativeTime.SECOND, new Scheduler.Task() {
+ @Override
+ public void run(Scheduler.RunContext ctx) {
+ tunnel.requestConnectByType(1);
+ }
+ });
+
+
+ Scheduler.run();
+ }
+}
Modified: gnunet-java/test/org/gnunet/statistics/StatisticsTest.java
===================================================================
--- gnunet-java/test/org/gnunet/statistics/StatisticsTest.java 2012-09-09
22:24:50 UTC (rev 23733)
+++ gnunet-java/test/org/gnunet/statistics/StatisticsTest.java 2012-09-10
10:37:09 UTC (rev 23734)
@@ -34,7 +34,7 @@
public void assertStatisticsGet(AssertionList assertions, Statistics stat,
final String subsystem,
final String name,
final long expectedValue, final Next next)
{
-
+ Program.configureLogging();
final Assertion getAssertion = assertions.create("get %s:%s -> %s",
subsystem, name, expectedValue);
final Assertion contAssertion = assertions.create("cont");
stat.get(RelativeTime.FOREVER, subsystem, name, new
StatisticsReceiver() {
@@ -61,7 +61,7 @@
@Test(timeout = 1000)
public void test_simple() {
- Program.configureLogging("DEBUG", null);
+ Program.configureLogging();
final TestingSubsystem ts = new TestingSubsystem("statistics");
final Statistics stat = new Statistics(ts.getConfiguration());
@@ -95,6 +95,7 @@
@Test(timeout = 1000)
public void test_statistics_get_set() {
+ Program.configureLogging();
final TestingSubsystem ts = new TestingSubsystem("statistics");
final AssertionList assertions = new AssertionList();
@@ -147,6 +148,7 @@
@Test(timeout = 1000)
public void test_watch() {
+ Program.configureLogging();
final TestingSubsystem ts = new TestingSubsystem("statistics");
final Wrapper<Integer> updates = new Wrapper<Integer>(0);
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r23734 - in gnunet-java: . src/org/gnunet/construct src/org/gnunet/mesh src/org/gnunet/util test/org/gnunet test/org/gnunet/mesh test/org/gnunet/statistics,
gnunet <=