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;

Reply via email to