Changeset e01c443


Ignore:
Timestamp:
Feb 10, 2017 7:17:43 PM (4 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
e29e3e2
Parents:
2d8f0c2
Message:

Test: Add random delay and drop options to LocalClientManager?
Return failure codes from LCM to client (ticket #1939)

Files:
2 edited

Legend:

Unmodified
Added
Removed
  • core/java/build.xml

    r2d8f0c2 re01c443  
    224224             only the build/obj directory.
    225225          -->
    226         <jar destfile="./build/i2ptest.jar" basedir="./build/obj" includes="**/*.class **/test.data **/baseDblPrecmp **/basePrecmp" />
     226        <jar destfile="./build/i2ptest.jar" basedir="./build/obj" >
     227            <fileset dir="./build/obj" includes="**/*.class **/test.data **/baseDblPrecmp **/basePrecmp" />
     228            <!-- the getopt translation files -->
     229            <fileset dir="src" includes="${translation.includes}" />
     230        </jar>
    227231    </target>
    228232    <!-- preparation of code coverage tool of choice -->
  • router/java/test/junit/net/i2p/router/client/LocalClientManager.java

    r2d8f0c2 re01c443  
    99 */
    1010
     11import gnu.getopt.Getopt;
     12
    1113import net.i2p.data.Destination;
    1214import net.i2p.data.Payload;
     
    1517import net.i2p.router.RouterContext;
    1618import net.i2p.util.I2PThread;
     19import net.i2p.util.SimpleTimer2;
    1720
    1821/**
     
    2629 */
    2730class LocalClientManager extends ClientManager {
     31    private static int dropX1000 = 0, jitter = 0, latency = 0;
    2832
    2933    /**
     
    4650    /**
    4751     * Local only
    48      * TODO: add simulated delay and random drops to test streaming.
     52     * TODO: we could have per-destination delay/drop parameters in the client options
    4953     *
    5054     * @param flags ignored for local
     
    5761        ClientConnectionRunner runner = getRunner(toDest);
    5862        if (runner != null) {
    59             runner.receiveMessage(toDest, fromDest, payload);
    60             if (sender != null)
    61                 sender.updateMessageDeliveryStatus(fromDest, msgId, messageNonce, MessageStatusMessage.STATUS_SEND_SUCCESS_LOCAL);
     63            if (dropX1000 > 0) {
     64                if (100 * 1000 * _ctx.random().nextFloat() < dropX1000) {
     65                    System.out.println("Message " + msgId + " DROPPED randomly");
     66                    if (sender != null) {
     67                        // pretend success
     68                        sender.updateMessageDeliveryStatus(fromDest, msgId, messageNonce, MessageStatusMessage.STATUS_SEND_GUARANTEED_SUCCESS);
     69                    }
     70                }
     71            }
     72            if (latency > 0 || jitter > 0) {
     73                int delay = latency;
     74                if (jitter > 0)
     75                    delay += (int) (jitter * _ctx.random().nextGaussian());
     76                if (delay > 0) {
     77                    System.out.println("Message " + msgId + " DELAYED " + delay + " ms");
     78                    DelayedSend ds = new DelayedSend(_ctx, sender, runner, fromDest, toDest, payload, msgId, messageNonce);
     79                    ds.schedule(delay);
     80                    return;
     81                }
     82            }
     83            boolean ok = runner.receiveMessage(toDest, fromDest, payload);
     84            if (sender != null) {
     85                int rc = ok ? MessageStatusMessage.STATUS_SEND_SUCCESS_LOCAL : MessageStatusMessage.STATUS_SEND_FAILURE_LOCAL;
     86                sender.updateMessageDeliveryStatus(fromDest, msgId, messageNonce, rc);
     87            }
    6288        } else {
    6389            // remote.  ignore.
     
    6894    }
    6995
     96    private static class DelayedSend extends SimpleTimer2.TimedEvent {
     97        private final ClientConnectionRunner s, r;
     98        private final Destination fd, td;
     99        private final Payload pl;
     100        private final MessageId id;
     101        private final long nonce;
     102
     103        public DelayedSend(RouterContext ctx, ClientConnectionRunner sender, ClientConnectionRunner runner,
     104                           Destination fromDest, Destination toDest, Payload payload,
     105                           MessageId msgId, long messageNonce) {
     106            super(ctx.simpleTimer2());
     107            s = sender; r = runner; fd = fromDest;
     108            td = toDest; pl = payload;
     109            id = msgId; nonce = messageNonce;
     110        }
     111
     112        public void timeReached() {
     113            boolean ok = r.receiveMessage(td, fd, pl);
     114            if (s != null) {
     115                int rc = ok ? MessageStatusMessage.STATUS_SEND_SUCCESS_LOCAL : MessageStatusMessage.STATUS_SEND_FAILURE_LOCAL;
     116                s.updateMessageDeliveryStatus(fd, id, nonce, rc);
     117            }
     118        }
     119    }
     120
    70121    public static void main(String args[]) {
     122        int dropX1000 = 0, jitter = 0, latency = 0;
     123        boolean error = false;
     124        Getopt g = new Getopt("router", args, "d:j:l:");
     125        try {
     126            int c;
     127            while ((c = g.getopt()) != -1) {
     128                switch (c) {
     129
     130                    case 'd':
     131                        dropX1000 = (int) (1000 * Double.parseDouble(g.getOptarg()));
     132                        if (dropX1000 < 0 || dropX1000 >= 100 * 1000)
     133                            error = true;
     134                        break;
     135
     136                    case 'j':
     137                        jitter = Integer.parseInt(g.getOptarg());
     138                        if (jitter < 0)
     139                            error = true;
     140                        break;
     141
     142                    case 'l':
     143                        latency = Integer.parseInt(g.getOptarg());
     144                        if (latency < 0)
     145                            error = true;
     146                        break;
     147
     148                    default:
     149                        error = true;
     150                }
     151            }
     152        } catch (RuntimeException e) {
     153            e.printStackTrace();
     154            error = true;
     155        }
     156        if (error || args.length - g.getOptind() > 0) {
     157            usage();
     158            System.exit(1);
     159        }
     160
    71161        RouterContext ctx = new RouterContext(null);
    72162        int port = ClientManagerFacadeImpl.DEFAULT_PORT;
    73         ClientManager mgr = new LocalClientManager(ctx, port);
     163        LocalClientManager mgr = new LocalClientManager(ctx, port);
     164        mgr.dropX1000 = dropX1000;
     165        mgr.jitter = jitter;
     166        mgr.latency = latency;
    74167        mgr.start();
    75168        System.out.println("Listening on port " + port);
     
    77170        System.out.println("Done listening on port " + port);
    78171    }
     172
     173    private static void usage() {
     174        System.err.println("usage: LocalClientManager\n" +
     175                           "         [-d droppercent] // 0.0 - 99.99999 (default 0)\n" +
     176                           "         [-j jitter]      // (integer ms for 1 std. deviation, default 0)\n" +
     177                           "         [-l latency]     // (integer ms, default 0)");
     178    }
    79179}
Note: See TracChangeset for help on using the changeset viewer.