TestEnvironment.java 5.88 KB
Newer Older
1 2 3 4 5
package mvd.jester;

import java.lang.reflect.Constructor;
import java.util.HashSet;
import java.util.Set;
6
import mvd.jester.info.SchedulingInfo;
7
import mvd.jester.model.SystemSetup;
8
import mvd.jester.priority.PriorityManager;
9 10 11 12 13 14 15 16 17 18 19
import mvd.jester.simulator.AbstractSimulator;
import mvd.jester.tests.AbstractTest;

/**
 * TestEnvironment
 */
public class TestEnvironment {

    private final long numberOfTaskSets;
    private final SystemSetup systemSetup;
    private final SystemSetup.Builder builder;
20 21 22
    private final Set<Constructor<? extends AbstractTest>> abstractTests;
    private final Set<Constructor<? extends AbstractSimulator>> abstractSimulators;
    private final Set<PriorityManager> schedulingAlgorithms;
23 24 25

    public TestEnvironment(SystemSetup.Builder builder, long numberOfTaskSets) {
        this.numberOfTaskSets = numberOfTaskSets;
26 27 28
        this.abstractTests = new HashSet<>();
        this.abstractSimulators = new HashSet<>();
        this.schedulingAlgorithms = new HashSet<>();
29 30 31 32 33

        this.builder = builder;
        this.systemSetup = builder.build();
    }

34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
    public TestEnvironment registerSchedulingAlgorithm(PriorityManager priorityManager) {
        schedulingAlgorithms.add(priorityManager);

        return this;
    }

    public TestEnvironment registerTest(Class<? extends AbstractTest> abstractTest) {
        try {
            abstractTests.add(abstractTest.getConstructor(SystemSetup.class));
        } catch (Exception e) {
            System.out.println("Missing constructor for abstract test!");
        }

        return this;
    }

    public TestEnvironment registerSimulator(Class<? extends AbstractSimulator> abstractSimulator) {
        try {
            abstractSimulators.add(abstractSimulator.getConstructor(SystemSetup.class));
        } catch (Exception e) {
            System.out.println("Missing constructor for abstract simulator!");
        }

        return this;
    }

60 61 62
    public TestEnvironment registerTestPair(Class<? extends AbstractTest> abstractTest,
            Class<? extends AbstractSimulator> abstractSimulator) {
        try {
63 64 65 66 67 68
            abstractTests.add(abstractTest.getConstructor(SystemSetup.class));
        } catch (Exception e) {
            System.out.println("Missing constructor for abstract test!");
        }
        try {
            abstractSimulators.add(abstractSimulator.getConstructor(SystemSetup.class));
69
        } catch (Exception e) {
70
            System.out.println("Missing constructor for abstract simulator!");
71 72 73 74 75 76
        }

        return this;
    }

    public void runTests() {
77 78
        Set<ResultCollector<AbstractTest>> abstractTestInstances = new HashSet<>();
        Set<ResultCollector<AbstractSimulator>> abstractSimulatorInstances = new HashSet<>();
79

Michael Schmid committed
80 81 82
        for (PriorityManager pm : schedulingAlgorithms) {
            for (Constructor<? extends AbstractTest> c : abstractTests) {
                try {
83 84 85 86
                    if (pm.hasTest(c.getDeclaringClass())) {
                        abstractTestInstances.add(new ResultCollector<AbstractTest>(pm,
                                c.newInstance(this.systemSetup)));
                    }
Michael Schmid committed
87 88
                } catch (Exception e) {
                    System.out.println("Could not instantiate object of AbstractTest!");
89
                    throw new RuntimeException("Could not instantiate object of AbstractTest!");
Michael Schmid committed
90
                }
91 92
            }

Michael Schmid committed
93 94
            for (Constructor<? extends AbstractSimulator> c : abstractSimulators) {
                try {
95 96 97 98
                    if (pm.hasSimulator(c.getDeclaringClass())) {
                        abstractSimulatorInstances.add(new ResultCollector<AbstractSimulator>(pm,
                                c.newInstance(this.systemSetup)));
                    }
Michael Schmid committed
99 100
                } catch (Exception e) {
                    System.out.println("Could not instantiate object of AbstractSimulator!");
101 102
                    throw new RuntimeException(
                            "Could not instantiate object of AbstractSimulator!");
Michael Schmid committed
103
                }
104 105 106
            }
        }

107 108 109 110 111 112 113 114 115 116 117 118
        long checkedTasksets = 0;

        while (checkedTasksets < numberOfTaskSets) {
            builder.rebuild(this.systemSetup);

            double utilization = this.systemSetup.getUtilization();

            while (utilization <= this.systemSetup.getNumberOfProcessors()
                    && checkedTasksets < numberOfTaskSets) {
                checkedTasksets++;

                if (checkedTasksets % 100 == 0) {
119 120
                    System.out.print(Math.round((double) checkedTasksets / numberOfTaskSets * 100)
                            + "% of " + numberOfTaskSets + " tasksets tested!\r");
121 122
                }

123
                for (ResultCollector<AbstractTest> testInstance : abstractTestInstances) {
Michael Schmid committed
124
                    PriorityManager priorityManager = testInstance.getPriorityManager();
125
                    AbstractTest abstractTest = testInstance.getAbstractValue();
126

127 128 129
                    SchedulingInfo schedulingInfo =
                            abstractTest.runSchedulabilityCheck(priorityManager);
                    testInstance.addResult(schedulingInfo);
Michael Schmid committed
130 131
                }

132
                for (ResultCollector<AbstractSimulator> simulatorInstance : abstractSimulatorInstances) {
Michael Schmid committed
133
                    PriorityManager priorityManager = simulatorInstance.getPriorityManager();
134
                    AbstractSimulator abstractSimulator = simulatorInstance.getAbstractValue();
135

136 137 138
                    SchedulingInfo schedulingInfo =
                            abstractSimulator.runSimulation(priorityManager);
                    simulatorInstance.addResult(schedulingInfo);
139
                }
Michael Schmid committed
140

141 142 143 144 145
                builder.addTask(systemSetup);

                utilization = this.systemSetup.getUtilization();
            }
        }
146 147
        System.out.println("");
        ResultLogger resultLogger = new ResultLogger(systemSetup.getNumberOfProcessors());
148

149
        resultLogger.logTests(abstractTestInstances);
150 151 152
    }

}
Michael Schmid committed
153 154