Revision: 16638
Author: oleg.kulikoff
Date: Wed Jan 19 06:55:29 2011
Log: Issue 2208 : Added unit tests
http://code.google.com/p/mobicents/source/detail?r=16638
Added:
/trunk/servers/media/scheduler/src/test/java/org/mobicents/media/server/scheduler/PeriodicTask.java
/trunk/servers/media/scheduler/src/test/java/org/mobicents/media/server/scheduler/SchedulerTest.java
/trunk/servers/media/scheduler/src/test/java/org/mobicents/media/server/scheduler/TestDevice.java
Modified:
/trunk/servers/media/scheduler
/trunk/servers/media/scheduler/src/main/java/org/mobicents/media/server/scheduler/Scheduler.java
/trunk/servers/media/scheduler/src/main/java/org/mobicents/media/server/scheduler/TaskQueue.java
/trunk/servers/media/scheduler/src/test/java/org/mobicents/media/server/scheduler/TaskQueueTest.java
=======================================
--- /dev/null
+++
/trunk/servers/media/scheduler/src/test/java/org/mobicents/media/server/scheduler/PeriodicTask.java
Wed Jan 19 06:55:29 2011
@@ -0,0 +1,82 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+package org.mobicents.media.server.scheduler;
+
+/**
+ *
+ * @author kulikov
+ */
+public class PeriodicTask implements Task {
+
+ private Scheduler scheduler;
+ private long priority;
+ private long deadLine;
+ private long period;
+
+ private volatile boolean isActive = true;
+ private long deviation;
+ private volatile int count;
+
+ public PeriodicTask(Scheduler scheduler, long priority, long period) {
+ this.scheduler = scheduler;
+ this.priority = priority;
+ this.period = period;
+ }
+
+ public long getPriority() {
+ return this.priority;
+ }
+
+ public void setPriority(long priority) {
+ this.priority = priority;
+ }
+
+ public boolean isActive() {
+ return this.isActive;
+ }
+
+ public long getDeadLine() {
+ return this.deadLine;
+ }
+
+ public void setDeadLine(long d) {
+ this.deadLine = d;
+ }
+
+ public long getDuration() {
+ return 0;
+ }
+
+ public long perform() {
+ count++;
+ long dev = Math.abs(scheduler.getClock().getTime() - deadLine);
+
+ if (dev > deviation) {
+ this.deviation = dev;
+ }
+
+ if (this.isActive) {
+ this.deadLine += period;
+ scheduler.submit(this);
+ }
+ return 0;
+ }
+
+ public void cancel() {
+ this.isActive = true;
+ }
+
+ public void reject() {
+ }
+
+ public int getCount() {
+ return count;
+ }
+
+ public long maxDeviation() {
+ return this.deviation;
+ }
+}
=======================================
--- /dev/null
+++
/trunk/servers/media/scheduler/src/test/java/org/mobicents/media/server/scheduler/SchedulerTest.java
Wed Jan 19 06:55:29 2011
@@ -0,0 +1,72 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+package org.mobicents.media.server.scheduler;
+
+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 SchedulerTest {
+
+ private Clock clock = new DefaultClock();
+ private Scheduler scheduler;
+
+ public SchedulerTest() {
+ }
+
+ @BeforeClass
+ public static void setUpClass() throws Exception {
+ }
+
+ @AfterClass
+ public static void tearDownClass() throws Exception {
+ }
+
+ @Before
+ public void setUp() {
+ scheduler = new Scheduler(4);
+ scheduler.setClock(clock);
+ scheduler.start();
+ }
+
+ @After
+ public void tearDown() {
+ scheduler.stop();
+ }
+
+ /**
+ * Test of setClock method, of class Scheduler.
+ */
+ @Test
+ public void testDeviation() throws InterruptedException {
+ long period = 20000000L;
+ long tolerance = 3000000L;
+
+ TestDevice d1 = new TestDevice();
+ scheduler.register(d1);
+
+ PeriodicTask t1 = new PeriodicTask(scheduler, 0, period);
+
+ t1.setDeadLine(clock.getTime() + period);
+ scheduler.submit(t1);
+
+ Thread.sleep(10000);
+
+ System.out.println("count=" + d1.getCount());
+ System.out.println("deviation=" + d1.getMaxJitter());
+
+ assertFalse("Task was not executed", t1.getCount() == 0);
+ assertTrue("Max jitter exceeded", d1.getMaxJitter() < tolerance);
+ }
+
+}
=======================================
--- /dev/null
+++
/trunk/servers/media/scheduler/src/test/java/org/mobicents/media/server/scheduler/TestDevice.java
Wed Jan 19 06:55:29 2011
@@ -0,0 +1,47 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+package org.mobicents.media.server.scheduler;
+
+import org.mobicents.media.server.scheduler.io.Periphery;
+
+/**
+ *
+ * @author kulikov
+ */
+public class TestDevice implements Periphery {
+
+ private final static long period = 20000000L;
+ private long next;
+ private long maxJitter;
+
+ private long count = 0;
+ public long poll(long timestamp) {
+ count++;
+ if (next == 0) {
+ next = timestamp + period;
+ return 0;
+ }
+
+ if (timestamp >= next) {
+ System.out.println(System.currentTimeMillis() + " r/w");
+ next += period;
+ long j = Math.abs(timestamp - next);
+ if (this.maxJitter < j) this.maxJitter = j;
+
+ return Math.abs(timestamp - next);
+ }
+
+ return 0;
+ }
+
+ public long getMaxJitter() {
+ return this.maxJitter - period;
+ }
+
+ public long getCount() {
+ return count;
+ }
+}
=======================================
---
/trunk/servers/media/scheduler/src/main/java/org/mobicents/media/server/scheduler/Scheduler.java
Wed Jan 19 03:56:07 2011
+++
/trunk/servers/media/scheduler/src/main/java/org/mobicents/media/server/scheduler/Scheduler.java
Wed Jan 19 06:55:29 2011
@@ -60,6 +60,8 @@
* Creates new instance of scheduler.
*/
public Scheduler(int cpuNum) {
+ priorityDistributor = new PriorityDistributor(this);
+
//preset for 500 devices/connections
periphery = new ArrayList(500);
ioThread = new Thread(this, "Scheduler[IO]");
@@ -129,6 +131,9 @@
public void start() {
this.isActive = true;
ioThread.start();
+ for (int i = 0; i < cpuThread.length; i++) {
+ cpuThread[i].start();
+ }
}
/**
@@ -140,13 +145,13 @@
cpuThread[i].shutdown();
}
taskQueue.clear();
+ periphery.clear();
}
/**
* IO bound executor.
*/
public void run() {
- Periphery p = null;
while (this.isActive) {
int n = periphery.size();
//TODO: the fixed linear list structure may be not enought
efficient
=======================================
---
/trunk/servers/media/scheduler/src/main/java/org/mobicents/media/server/scheduler/TaskQueue.java
Wed Jan 19 03:56:07 2011
+++
/trunk/servers/media/scheduler/src/main/java/org/mobicents/media/server/scheduler/TaskQueue.java
Wed Jan 19 06:55:29 2011
@@ -110,7 +110,7 @@
public Task poll() {
lock.lock();
try {
- return list.remove(0);
+ return list.isEmpty()? null : list.remove(0);
} finally {
lock.unlock();
}
=======================================
---
/trunk/servers/media/scheduler/src/test/java/org/mobicents/media/server/scheduler/TaskQueueTest.java
Wed Jan 19 03:56:07 2011
+++
/trunk/servers/media/scheduler/src/test/java/org/mobicents/media/server/scheduler/TaskQueueTest.java
Wed Jan 19 06:55:29 2011
@@ -5,7 +5,6 @@
package org.mobicents.media.server.scheduler;
-import org.mobicents.media.server.*;
import java.util.Random;
import org.junit.After;
import org.junit.AfterClass;