Package com.sun.sgs.test.impl.kernel

Source Code of com.sun.sgs.test.impl.kernel.TestTaskSchedulerImpl

/*
* Copyright 2007-2010 Sun Microsystems, Inc.
*
* This file is part of Project Darkstar Server.
*
* Project Darkstar Server is free software: you can redistribute it
* and/or modify it under the terms of the GNU General Public License
* version 2 as published by the Free Software Foundation and
* distributed hereunder to you.
*
* Project Darkstar Server is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program.  If not, see <http://www.gnu.org/licenses/>.
*
* --
*/

package com.sun.sgs.test.impl.kernel;

import com.sun.sgs.auth.Identity;

import com.sun.sgs.impl.kernel.StandardProperties;
import com.sun.sgs.kernel.KernelRunnable;
import com.sun.sgs.kernel.NodeType;
import com.sun.sgs.kernel.RecurringTaskHandle;
import com.sun.sgs.kernel.TaskQueue;
import com.sun.sgs.kernel.TaskReservation;
import com.sun.sgs.kernel.TaskScheduler;

import com.sun.sgs.impl.kernel.TestTransactionSchedulerImpl.DependentTask;

import com.sun.sgs.test.util.SgsTestNode;
import com.sun.sgs.test.util.TestAbstractKernelRunnable;
import com.sun.sgs.tools.test.FilteredNameRunner;

import java.util.Properties;

import java.util.concurrent.atomic.AtomicInteger;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import static org.junit.Assert.*;

import org.junit.runner.RunWith;


/** Basic tests for the TaskScheduler interface. */
@RunWith(FilteredNameRunner.class)
public class TestTaskSchedulerImpl {

    private SgsTestNode serverNode = null;
    private TaskScheduler taskScheduler;
    private Identity taskOwner;

    // an empty task that does nothing
    private static final KernelRunnable testTask =
        new TestAbstractKernelRunnable() {
            public void run() throws Exception {}
        };

    // a counter used in some task test
    private volatile int taskCount;

    public TestTaskSchedulerImpl() {}

    /** Per-test initialization */
    @Before public void startup() throws Exception {
        taskCount = 0;
        Properties properties =
            SgsTestNode.getDefaultProperties("TestTaskSchedulerImpl",
               null, null);
        properties.setProperty(StandardProperties.NODE_TYPE,
                               NodeType.coreServerNode.name());
        serverNode = new SgsTestNode("TestTaskSchedulerImpl", null, properties);
        taskScheduler = serverNode.getSystemRegistry().
            getComponent(TaskScheduler.class);
        taskOwner = serverNode.getProxy().getCurrentOwner();
    }

    /** Per-test shutdown */
    @After public void shutdown() throws Exception {
        if (serverNode != null)
            serverNode.shutdown(true);
    }

    /**
     * Task reservation tests.
     */

    @Test public void reserveTask() throws Exception {
        taskScheduler.reserveTask(testTask, taskOwner);
    }

    @Test public void reserveTaskDelayed() throws Exception {
        taskScheduler.reserveTask(testTask, taskOwner,
          System.currentTimeMillis() + 100);
    }

    @Test public void reserveTasks() throws Exception {
        taskScheduler.reserveTask(testTask, taskOwner);
        taskScheduler.reserveTask(testTask, taskOwner);
        taskScheduler.reserveTask(testTask, taskOwner);
        taskScheduler.reserveTask(testTask, taskOwner);
        taskScheduler.reserveTask(testTask, taskOwner);
        taskScheduler.reserveTask(testTask, taskOwner);
    }

    @Test public void reserveTasksDelayed() throws Exception {
        long time = System.currentTimeMillis() + 100;
        taskScheduler.reserveTask(testTask, taskOwner, time);
        taskScheduler.reserveTask(testTask, taskOwner, time);
        taskScheduler.reserveTask(testTask, taskOwner, time);
        taskScheduler.reserveTask(testTask, taskOwner, time);
        taskScheduler.reserveTask(testTask, taskOwner, time);
        taskScheduler.reserveTask(testTask, taskOwner, time);
    }

    @Test (expected=NullPointerException.class)
        public void reserveTaskNull() throws Exception {
        taskScheduler.reserveTask(null, taskOwner);
    }

    @Test (expected=NullPointerException.class)
        public void reserveTaskNullOwner() throws Exception {
        taskScheduler.reserveTask(testTask, null);
    }

    @Test (expected=NullPointerException.class)
        public void reserveTaskDelayedNull() throws Exception {
        taskScheduler.reserveTask(null, taskOwner, System.currentTimeMillis());
    }

    @Test (expected=NullPointerException.class)
        public void reserveTaskDelayedNullOwner() throws Exception {
        taskScheduler.reserveTask(testTask, null, System.currentTimeMillis());
    }

    @Test public void reserveTaskDelayedTimepassed() throws Exception {
        taskScheduler.reserveTask(testTask, taskOwner,
                                  System.currentTimeMillis() - 50);
    }

    @Test public void useReservedTask() throws Exception {
        TaskReservation reservation =
            taskScheduler.reserveTask(new IncrementRunner(), taskOwner);
        reservation.use();
        Thread.sleep(200L);
        assertEquals(1, taskCount);
    }

    @Test public void useReservedTaskDelayed() throws Exception {
        TaskReservation reservation =
            taskScheduler.reserveTask(new IncrementRunner(), taskOwner,
                                      System.currentTimeMillis() + 50);
        reservation.use();
        Thread.sleep(300L);
        assertEquals(1, taskCount);
    }

    @Test public void cancelReservedTask() throws Exception {
        TaskReservation reservation =
            taskScheduler.reserveTask(new IncrementRunner(), taskOwner);
        reservation.cancel();
        Thread.sleep(200L);
        assertEquals(0, taskCount);
    }

    @Test public void cancelReservedTaskDelayed() throws Exception {
        TaskReservation reservation =
            taskScheduler.reserveTask(new IncrementRunner(), taskOwner,
                                      System.currentTimeMillis() + 50);
        reservation.cancel();
        Thread.sleep(300L);
        assertEquals(0, taskCount);
    }

    @Test (expected=IllegalStateException.class)
        public void reuseReservedTask() throws Exception {
        TaskReservation reservation =
            taskScheduler.reserveTask(testTask, taskOwner);
        reservation.use();
        reservation.use();
    }

    @Test (expected=IllegalStateException.class)
        public void reuseReservedTaskDelayed() throws Exception {
        TaskReservation reservation =
            taskScheduler.reserveTask(testTask, taskOwner,
                                      System.currentTimeMillis() + 50);
        reservation.use();
        reservation.use();
    }

    @Test (expected=IllegalStateException.class)
        public void recancelReservedTask() throws Exception {
        TaskReservation reservation =
            taskScheduler.reserveTask(testTask, taskOwner);
        reservation.cancel();
        reservation.cancel();
    }

    @Test (expected=IllegalStateException.class)
        public void recancelReservedTaskDelayed() throws Exception {
        TaskReservation reservation =
            taskScheduler.reserveTask(testTask, taskOwner,
                                      System.currentTimeMillis() + 50);
        reservation.cancel();
        reservation.cancel();
    }

    @Test (expected=IllegalStateException.class)
        public void cancelAfterUseReservedTask() throws Exception {
        TaskReservation reservation =
            taskScheduler.reserveTask(testTask, taskOwner);
        reservation.use();
        reservation.cancel();
    }

    @Test (expected=IllegalStateException.class)
        public void cancelAfterUseReservedTaskDelayed() throws Exception {
        TaskReservation reservation =
            taskScheduler.reserveTask(testTask, taskOwner,
                                      System.currentTimeMillis() + 50);
        reservation.use();
        reservation.cancel();
    }

    @Test (expected=IllegalStateException.class)
        public void useAfterCancelReservedTask() throws Exception {
        TaskReservation reservation =
            taskScheduler.reserveTask(testTask, taskOwner);
        reservation.cancel();
        reservation.use();
    }

    @Test (expected=IllegalStateException.class)
        public void useAfterCancelReservedTaskDelayed() throws Exception {
        TaskReservation reservation =
            taskScheduler.reserveTask(testTask, taskOwner,
                                      System.currentTimeMillis() + 50);
        reservation.cancel();
        reservation.use();
    }

    /**
     * Task scheduling tests.
     */

    @Test public void scheduleTask() throws Exception {
        taskScheduler.scheduleTask(new IncrementRunner(), taskOwner);
        Thread.sleep(200L);
        assertEquals(1, taskCount);
    }

    @Test public void scheduleTaskDelayed() throws Exception {
        taskScheduler.scheduleTask(new IncrementRunner(), taskOwner,
                                   System.currentTimeMillis() + 50);
        Thread.sleep(300L);
        assertEquals(1, taskCount);
    }

    @Test public void scheduleTasks() throws Exception {
        taskScheduler.scheduleTask(new IncrementRunner(), taskOwner);
        taskScheduler.scheduleTask(new IncrementRunner(), taskOwner);
        taskScheduler.scheduleTask(new IncrementRunner(), taskOwner);
        taskScheduler.scheduleTask(new IncrementRunner(), taskOwner);
        taskScheduler.scheduleTask(new IncrementRunner(), taskOwner);
        taskScheduler.scheduleTask(new IncrementRunner(), taskOwner);
        Thread.sleep(400L);
        assertEquals(6, taskCount);
    }

    @Test public void scheduleTasksDelayed() throws Exception {
        long time = System.currentTimeMillis() + 50;
        taskScheduler.scheduleTask(new IncrementRunner(), taskOwner, time);
        taskScheduler.scheduleTask(new IncrementRunner(), taskOwner, time);
        taskScheduler.scheduleTask(new IncrementRunner(), taskOwner, time);
        taskScheduler.scheduleTask(new IncrementRunner(), taskOwner, time);
        taskScheduler.scheduleTask(new IncrementRunner(), taskOwner, time);
        taskScheduler.scheduleTask(new IncrementRunner(), taskOwner, time);
        Thread.sleep(1000L);
        assertEquals(6, taskCount);
    }

    @Test (expected=NullPointerException.class)
        public void scheduleTaskNull() throws Exception {
        taskScheduler.scheduleTask(null, taskOwner);
    }

    @Test (expected=NullPointerException.class)
        public void scheduleTaskOwnerNull() throws Exception {
        taskScheduler.scheduleTask(testTask, null);
    }

    @Test (expected=NullPointerException.class)
        public void scheduleTaskDelayedNull() throws Exception {
        taskScheduler.scheduleTask(null, taskOwner, System.currentTimeMillis());
    }

    @Test (expected=NullPointerException.class)
        public void scheduleTaskDelayedOwnerNull() throws Exception {
        taskScheduler.scheduleTask(testTask, null, System.currentTimeMillis());
    }

    /**
     * Recurring task scheduling tests.
     */

    @Test public void scheduleTaskRecurring() throws Exception {
        taskScheduler.scheduleRecurringTask(testTask, taskOwner,
                                            System.currentTimeMillis(), 50);
    }

    @Test (expected=NullPointerException.class)
        public void scheduleTaskRecurringNull() throws Exception {
        taskScheduler.scheduleRecurringTask(null, taskOwner,
                                            System.currentTimeMillis(), 50);
    }

    @Test (expected=NullPointerException.class)
        public void scheduleTaskRecurringNullOwner() throws Exception {
        taskScheduler.scheduleRecurringTask(testTask, null,
                                            System.currentTimeMillis(), 50);
    }

    @Test (expected=IllegalArgumentException.class)
        public void scheduleTaskRecurringIllegalPeriod() throws Exception {
        taskScheduler.scheduleRecurringTask(testTask, taskOwner,
                                            System.currentTimeMillis(), -1);
    }

    @Test public void cancelAfterStartRecurringTask() throws Exception {
        RecurringTaskHandle handle =
            taskScheduler.scheduleRecurringTask(new IncrementRunner(),
                                                taskOwner,
                                                System.currentTimeMillis() + 50,
                                                50);
        handle.start();
        handle.cancel();
        Thread.sleep(200L);
        assertEquals(0, taskCount);
    }

    @Test public void startSleepAndCancelRecurringTask() throws Exception {
        RecurringTaskHandle handle =
            taskScheduler.scheduleRecurringTask(new IncrementRunner(),
                                                taskOwner,
                                                System.currentTimeMillis(),
                                                200);
        handle.start();
        Thread.sleep(300L);
        assertEquals(2, taskCount);
        handle.cancel();
        Thread.sleep(200L);
        assertEquals(2, taskCount);
    }

    @Test public void cancelRecurringTask() throws Exception {
        RecurringTaskHandle handle =
            taskScheduler.scheduleRecurringTask(new IncrementRunner(),
                                                taskOwner,
                                                System.currentTimeMillis(),
                                                50);
        handle.cancel();
        Thread.sleep(100L);
        assertEquals(0, taskCount);
    }

    @Test (expected=IllegalStateException.class)
        public void restartRecurringTask() throws Exception {
        RecurringTaskHandle handle =
            taskScheduler.scheduleRecurringTask(testTask, taskOwner,
                                                System.currentTimeMillis(),
                                                100);
        handle.start();
        try {
            handle.start();
        } finally {
            handle.cancel();
        }
    }

    @Test (expected=IllegalStateException.class)
        public void recancelRecurringTask() throws Exception {
        RecurringTaskHandle handle =
            taskScheduler.scheduleRecurringTask(testTask, taskOwner,
                                                System.currentTimeMillis(),
                                                100);
        handle.cancel();
        handle.cancel();
    }

    @Test (expected=IllegalStateException.class)
        public void startAfterCancelRecurringTask() throws Exception {
        RecurringTaskHandle handle =
            taskScheduler.scheduleRecurringTask(testTask, taskOwner,
                                                System.currentTimeMillis(),
                                                100);
        handle.cancel();
        handle.start();
    }

    /**
     * Test createTaskQueue.
     */

    @Test public void scheduleQueuedTasks() throws Exception {
        TaskQueue queue = taskScheduler.createTaskQueue();
        AtomicInteger runCount = new AtomicInteger(0);
        for (int i = 0; i < 10; i++)
            queue.addTask(new DependentTask(runCount), taskOwner);
        Thread.sleep(500L);
        assertEquals(10, runCount.get());
    }

    @Test (expected=NullPointerException.class)
        public void scheduleQueuedTasksNull() throws Exception {
        TaskQueue queue = taskScheduler.createTaskQueue();
        queue.addTask(null, taskOwner);
    }

    @Test (expected=NullPointerException.class)
        public void scheduleQueuedTasksOwnerNull() throws Exception {
        TaskQueue queue = taskScheduler.createTaskQueue();
        queue.addTask(new DependentTask(null), null);
    }

    /**
     * Utility classes.
     */

    private class IncrementRunner extends TestAbstractKernelRunnable {
        public void run() {
            taskCount++;
        }
    }
}
TOP

Related Classes of com.sun.sgs.test.impl.kernel.TestTaskSchedulerImpl

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.