gnunet-svn
[Top][All Lists]
Advanced

[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);




reply via email to

[Prev in Thread] Current Thread [Next in Thread]