TestEnvironment.java 6.66 KB
Newer Older
1 2 3 4 5 6 7
package mvd.jester;

import java.lang.reflect.Constructor;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
8
import com.google.common.collect.HashBasedTable;
9
import com.google.common.collect.Table;
10
import mvd.jester.info.SchedulingInfo;
11
import mvd.jester.model.SystemSetup;
12
import mvd.jester.priority.PriorityManager;
13 14 15 16 17 18 19 20 21 22 23
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;
24 25 26
    private final Set<Constructor<? extends AbstractTest>> abstractTests;
    private final Set<Constructor<? extends AbstractSimulator>> abstractSimulators;
    private final Set<PriorityManager> schedulingAlgorithms;
27 28 29

    public TestEnvironment(SystemSetup.Builder builder, long numberOfTaskSets) {
        this.numberOfTaskSets = numberOfTaskSets;
30 31 32
        this.abstractTests = new HashSet<>();
        this.abstractSimulators = new HashSet<>();
        this.schedulingAlgorithms = new HashSet<>();
33 34 35 36 37

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

38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
    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;
    }

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

        return this;
    }

    public void runTests() {
81 82
        Set<Pair<AbstractTest>> abstractTestInstances = new HashSet<>();
        Set<Pair<AbstractSimulator>> abstractSimulatorInstances = new HashSet<>();
83

84
        Map<Long, Long> totalNumberOfTasksets = new HashMap<>();
85

86 87 88
        Table<Long, Pair<AbstractTest>, Set<SchedulingInfo>> testResults = HashBasedTable.create();
        Table<Long, Pair<AbstractSimulator>, Set<SchedulingInfo>> simulatorResults =
                HashBasedTable.create();
89

Michael Schmid committed
90 91 92
        for (PriorityManager pm : schedulingAlgorithms) {
            for (Constructor<? extends AbstractTest> c : abstractTests) {
                try {
93 94
                    abstractTestInstances
                            .add(new Pair<AbstractTest>(pm, c.newInstance(this.systemSetup)));
Michael Schmid committed
95 96 97
                } catch (Exception e) {
                    System.out.println("Could not instantiate object of AbstractTest!");
                }
98 99
            }

Michael Schmid committed
100 101 102
            for (Constructor<? extends AbstractSimulator> c : abstractSimulators) {
                try {
                    abstractSimulatorInstances
103
                            .add(new Pair<AbstractSimulator>(pm, c.newInstance(this.systemSetup)));
Michael Schmid committed
104 105 106
                } catch (Exception e) {
                    System.out.println("Could not instantiate object of AbstractSimulator!");
                }
107 108 109
            }
        }

110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
        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) {
                    System.out.println(checkedTasksets + " bereits geschafft");
                }

                long roundedUtilization = (long) (utilization * 10);
126

127
                totalNumberOfTasksets.compute(roundedUtilization, (k, v) -> v == null ? 1 : v + 1);
128

129
                for (Pair<AbstractTest> testInstance : abstractTestInstances) {
Michael Schmid committed
130
                    PriorityManager priorityManager = testInstance.getPriorityManager();
131
                    AbstractTest abstractTest = testInstance.getAbstractValue();
Michael Schmid committed
132
                    if (!testResults.contains(roundedUtilization, testInstance)) {
133
                        testResults.put(roundedUtilization, testInstance, new HashSet<>());
134
                    }
135

136 137 138 139
                    if (priorityManager.hasTest(abstractTest)) {
                        SchedulingInfo schedulingInfo =
                                abstractTest.runSchedulabilityCheck(priorityManager);
                        testResults.get(roundedUtilization, testInstance).add(schedulingInfo);
Michael Schmid committed
140 141 142
                    }
                }

143
                for (Pair<AbstractSimulator> simulatorInstance : abstractSimulatorInstances) {
Michael Schmid committed
144
                    PriorityManager priorityManager = simulatorInstance.getPriorityManager();
145
                    AbstractSimulator abstractSimulator = simulatorInstance.getAbstractValue();
Michael Schmid committed
146
                    if (!simulatorResults.contains(roundedUtilization, simulatorInstance)) {
147 148
                        simulatorResults.put(roundedUtilization, simulatorInstance,
                                new HashSet<>());
149
                    }
150

151 152 153 154 155
                    if (priorityManager.hasSimulator(abstractSimulator)) {
                        SchedulingInfo schedulingInfo =
                                abstractSimulator.runSimulation(priorityManager);
                        simulatorResults.get(roundedUtilization, simulatorInstance)
                                .add(schedulingInfo);
Michael Schmid committed
156
                    }
157
                }
Michael Schmid committed
158

159 160 161 162 163 164
                builder.addTask(systemSetup);

                utilization = this.systemSetup.getUtilization();
            }
        }

165 166
        ResultCollector resultCollector = new ResultCollector(testResults, simulatorResults,
                totalNumberOfTasksets, systemSetup.getNumberOfProcessors());
167

168
        resultCollector.logAll();
169 170 171
    }

}
Michael Schmid committed
172 173