Revision: 16652
Author: oleg.kulikoff
Date: Fri Jan 21 00:39:06 2011
Log: Issue 2208 : Added missrate test
http://code.google.com/p/mobicents/source/detail?r=16652
Added:
/trunk/servers/media/scheduler/src/test/java/org/mobicents/media/server/scheduler/MissrateTest.java
Modified:
/trunk/servers/media/scheduler/src/test/java/org/mobicents/media/server/scheduler/NetworkChannel.java
/trunk/servers/media/scheduler/src/test/java/org/mobicents/media/server/scheduler/PeriodicTask.java
=======================================
--- /dev/null
+++
/trunk/servers/media/scheduler/src/test/java/org/mobicents/media/server/scheduler/MissrateTest.java
Fri Jan 21 00:39:06 2011
@@ -0,0 +1,90 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+package org.mobicents.media.server.scheduler;
+
+import java.util.Random;
+import java.io.IOException;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import static org.junit.Assert.*;
+
+/**
+ *
+ * @author kulikov
+ */
+public class MissrateTest {
+
+ private final static int N = 1000;
+
+ private Clock clock = new DefaultClock();
+ private Scheduler scheduler;
+
+ private NetworkChannel networkChannel;
+ private PeriodicTask[] taskset;
+
+ private Random random = new Random(1000);
+
+ public MissrateTest() {
+ }
+
+ @BeforeClass
+ public static void setUpClass() throws Exception {
+ }
+
+ @AfterClass
+ public static void tearDownClass() throws Exception {
+ }
+
+ @Before
+ public void setUp() throws IOException {
+ scheduler = new Scheduler(3);
+
+ scheduler.setClock(clock);
+
+ networkChannel = new NetworkChannel();
+ scheduler.register(networkChannel);
+
+ scheduler.start();
+ }
+
+ @After
+ public void tearDown() {
+ if (networkChannel != null) {
+ networkChannel.close();
+ }
+ scheduler.stop();
+ }
+
+ /**
+ * Test of setClock method, of class Scheduler.
+ */
+ @Test
+ public void testSingleIO() throws InterruptedException {
+ long period = 20000000L;
+ long tolerance = 3000000L;
+
+ taskset = new PeriodicTask[N];
+ for (int i = 0; i < taskset.length; i++) {
+ taskset[i] = new PeriodicTask(scheduler, 0, period);
+ taskset[i].setTolerance(tolerance);
+ taskset[i].setDeadLine(clock.getTime() + period +
random.nextInt() * 1000000);
+ scheduler.submit(taskset[i]);
+ }
+
+ Thread.sleep(10000);
+
+ scheduler.stop();
+
+ for (int i = 0; i < taskset.length; i++) {
+ System.out.println("missrate=" + taskset[i].getMissRate() + "
total passes=" + taskset[i].getCount() +
+ " dev=" + taskset[i].maxDeviation() + " ratio=" +
((taskset[i].getCount() -
taskset[i].getMissRate())/(double)taskset[i].getCount()));
+ }
+ }
+
+}
=======================================
---
/trunk/servers/media/scheduler/src/test/java/org/mobicents/media/server/scheduler/NetworkChannel.java
Thu Jan 20 23:08:59 2011
+++
/trunk/servers/media/scheduler/src/test/java/org/mobicents/media/server/scheduler/NetworkChannel.java
Fri Jan 21 00:39:06 2011
@@ -28,10 +28,14 @@
private final static long period = 20000000L;
private volatile long next;
- private long maxJitter;
private long count = 0;
+ private int missrate;
+ private long tolerance;
+
+ private long maxJitter;
+
public NetworkChannel() throws IOException {
provider = SelectorProvider.provider();
selector = provider.openSelector();
@@ -62,13 +66,21 @@
} catch (IOException e) {
}
+ //simulates send operation
if (timestamp >= next) {
-// System.out.println(String.format("%d (%s) r/w", timestamp,
Thread.currentThread().getName()));
+ //plan next "send"
next += period;
+
+ //calculate current drift
long j = Math.abs(timestamp - next);
+
+ //update max jitter if drift exeedes max jitter registered
if (this.maxJitter < j) this.maxJitter = j;
- return Math.abs(timestamp - next);
+ //if max jitter exeededs its limit increment missrate countor
+ if (this.maxJitter > tolerance) missrate++;
+
+ return 0;
}
return 0;
@@ -81,6 +93,14 @@
public long getCount() {
return count;
}
+
+ public void setTolerance(long tolerance) {
+ this.tolerance = tolerance;
+ }
+
+ public int getMissRate() {
+ return missrate;
+ }
public void close() {
try {
=======================================
---
/trunk/servers/media/scheduler/src/test/java/org/mobicents/media/server/scheduler/PeriodicTask.java
Thu Jan 20 23:08:59 2011
+++
/trunk/servers/media/scheduler/src/test/java/org/mobicents/media/server/scheduler/PeriodicTask.java
Fri Jan 21 00:39:06 2011
@@ -23,6 +23,9 @@
private boolean first = true;
private long lastTime;
+ private int missrate;
+ private long tolerance;
+
public PeriodicTask(Scheduler scheduler, long priority, long period) {
this.scheduler = scheduler;
this.priority = priority;
@@ -66,6 +69,12 @@
if (dev > deviation) {
this.deviation = dev;
}
+
+ //increment missrate countor if deviation exeedes limit
+ if (dev > tolerance) {
+ missrate++;
+ }
+
lastTime = scheduler.getClock().getTime();
}
@@ -92,4 +101,13 @@
return this.deviation;
}
-}
+ public void setTolerance(long tolerance) {
+ this.tolerance = tolerance;
+ }
+
+ public int getMissRate() {
+ return missrate;
+ }
+
+
+}