Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Simulizar 172 #88

Draft
wants to merge 14 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package org.palladiosimulator.simulizar.test.commons.di.components;

import org.palladiosimulator.simulizar.di.component.core.SimuLizarRootComponent;
import org.palladiosimulator.simulizar.di.component.core.SimuLizarRuntimeComponent;
import org.palladiosimulator.simulizar.di.component.dependency.QUALComponent;
import org.palladiosimulator.simulizar.di.component.dependency.SimEngineComponent;
import org.palladiosimulator.simulizar.di.component.dependency.SimuComFrameworkComponent;
import org.palladiosimulator.simulizar.di.modules.component.core.SimuLizarRuntimeModule;
import org.palladiosimulator.simulizar.di.modules.component.extensions.ExtensionComponentsModule;
import org.palladiosimulator.simulizar.di.modules.scoped.runtime.LegacyRuntimeStateAccessorAdapterModule;
import org.palladiosimulator.simulizar.di.modules.stateless.core.RuntimeComponentFactoriesModule;
import org.palladiosimulator.simulizar.scopes.SimulationRuntimeScope;
import org.palladiosimulator.simulizar.test.commons.di.components.TestSimuLizarRuntimeComponent.TestSimulizarRuntimeModule;

import dagger.Binds;
import dagger.Component;

@Component(dependencies = { SimuLizarRootComponent.class, SimuComFrameworkComponent.class, QUALComponent.class,
SimEngineComponent.class }, modules = { TestSimulizarRuntimeModule.class })
@SimulationRuntimeScope
public interface TestSimuLizarRuntimeComponent extends SimuLizarRuntimeComponent {



@Component.Factory
public interface Factory extends SimuLizarRuntimeComponent.Factory {

}

@dagger.Module(includes = { SimuLizarRuntimeModule.class, LegacyRuntimeStateAccessorAdapterModule.class })
public interface TestSimulizarRuntimeModule {
@Binds SimuLizarRuntimeComponent bindRuntimeComponent(TestSimuLizarRuntimeComponent component);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import java.util.function.Supplier;

import org.junit.jupiter.api.extension.ExtensionContext;
import org.palladiosimulator.simulizar.di.component.core.SimuLizarRuntimeComponent;
import org.palladiosimulator.simulizar.di.component.dependency.SimEngineComponent.Factory;
import org.palladiosimulator.simulizar.di.extension.ExtensionComponent;
import org.palladiosimulator.simulizar.di.modules.component.extensions.ExtensionComponentsModule;
Expand All @@ -17,6 +18,7 @@
import org.palladiosimulator.simulizar.test.commons.annotation.UseSimuLizarExtension;
import org.palladiosimulator.simulizar.test.commons.di.components.DaggerTestSimEngineComponent;
import org.palladiosimulator.simulizar.test.commons.di.components.DaggerTestSimuLizarRootComponent;
import org.palladiosimulator.simulizar.test.commons.di.components.DaggerTestSimuLizarRuntimeComponent;
import org.palladiosimulator.simulizar.test.commons.di.components.TestSimuLizarRootComponent.TestConfigurationModule;
import org.palladiosimulator.simulizar.test.commons.extension.SimuLizarTestExtensionCommons;

Expand Down Expand Up @@ -49,26 +51,29 @@ public IJob get() {
for (var extension : extensions) {
var extCls = extension.value();
try {
var factory = (ExtensionComponent.Factory) extCls.getMethod("factory").invoke(null);
var factory = (ExtensionComponent.Factory) extCls.getMethod("factory")
.invoke(null);
extensionFactories.add(factory);

} catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException
| InvocationTargetException e) {
throw new RuntimeException(
"Could not create extension factory. Make sure to reference the Dagger generated component class");
}
}
var component = DaggerTestSimuLizarRootComponent.factory()
.create(configuration,
new RootComponentFactoriesModule() {
@Override
public Factory providesSimEngineComponentFactory() {
return DaggerTestSimEngineComponent.factory();
}
},
new ExtensionComponentsModule(extensionFactories, ImmutableSet.of()),
new MDSDBlackboardProvidingModule(blackboard),
new TestConfigurationModule() {
.create(configuration, new RootComponentFactoriesModule() {
@Override
public Factory providesSimEngineComponentFactory() {
return DaggerTestSimEngineComponent.factory();
}

@Override
public SimuLizarRuntimeComponent.Factory providesRuntimeComponentFactory() {
return DaggerTestSimuLizarRuntimeComponent.factory();
}
}, new ExtensionComponentsModule(extensionFactories, ImmutableSet.of()),
new MDSDBlackboardProvidingModule(blackboard), new TestConfigurationModule() {
@Override
public boolean activateModelLoading() {
return false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@ Require-Bundle: org.eclipse.xtext.xbase.lib,
org.palladiosimulator.examples.package;bundle-version="4.3.0",
org.palladiosimulator.simulizar.test.commons;bundle-version="5.1.0",
org.palladiosimulator.simulizar.events,
org.palladiosimulator.simulizar.monitorrepository.feedthrough;bundle-version="5.1.0"
org.palladiosimulator.simulizar.monitorrepository.feedthrough;bundle-version="5.1.0",
org.palladiosimulator.simulizar.action.repository;bundle-version="5.1.0"
Import-Package: com.google.common.util.concurrent.internal;version="1.0.1",
net.bytebuddy.dynamic.loading;version="1.6.0",
org.hamcrest;version="2.2.0",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
package org.palladiosimulator.simulizar.simulation.tests;

import static org.hamcrest.Matchers.closeTo;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;

import java.util.List;

import javax.measure.Measure;
import javax.measure.quantity.Duration;
import javax.measure.unit.SI;

import org.junit.jupiter.api.Test;
import org.palladiosimulator.edp2.models.ExperimentData.ExperimentRun;
import org.palladiosimulator.metricspec.constants.MetricDescriptionConstants;
import org.palladiosimulator.pcm.usagemodel.UsageScenario;
import org.palladiosimulator.simulizar.launcher.SimulizarConstants;
import org.palladiosimulator.simulizar.reconfiguration.qvto.DaggerQVTOReconfigurationComponent;
import org.palladiosimulator.simulizar.test.commons.annotation.LoadPCMInstanceFromBundle;
import org.palladiosimulator.simulizar.test.commons.annotation.RunSimuLizar;
import org.palladiosimulator.simulizar.test.commons.annotation.SetConfigProperty;
import org.palladiosimulator.simulizar.test.commons.annotation.SimulationConfig;
import org.palladiosimulator.simulizar.test.commons.annotation.UseSimuLizarExtension;
import org.palladiosimulator.simulizar.test.commons.util.MeasurementTestUtils;

import de.uka.ipd.sdq.workflow.jobs.JobFailedException;
import de.uka.ipd.sdq.workflow.jobs.UserCanceledException;
import tools.mdsd.junit5utils.annotations.PluginTestOnly;

@PluginTestOnly
class QVTOExecutionTest {

/**
* Tests the execution of a simple qvto reconfiguration. The reconfiguration changes the Usage
* Model's Population Parameter from 1 -> 2 In the beginning until the 2000s Simulation Time is
* reached, Population == 1 Between 2000s and 4000s Population == 2 After 4000 until the end of
* the simulation the Population is 1 again. This results into two consecutive measurements
* between 2000 and 4000. The ThinkTime is 99.0, which results into one measurement every 100s.
* The responseTime itself doesn't change due to the reconfiguration. Only the amount of
* measurements every 100s changes from 1 -> 2 -> 1
*/
@Test
@LoadPCMInstanceFromBundle(bundleName = "org.palladiosimulator.simulizar.tests", basePath = "testmodels/transformationQVTTest", modelFiles = {
"default.allocation", "default.usagemodel", "default.repository", "defaultMonitor.monitorrepository" })
@UseSimuLizarExtension(DaggerQVTOReconfigurationComponent.class)
@SimulationConfig(maxMeasurements = "100")
@SetConfigProperty(id = SimulizarConstants.RECONFIGURATION_RULES_FOLDER, value = "platform:/plugin/org.palladiosimulator.simulizar.tests/testmodels/transformationQVTTest/reconfigurations")
@RunSimuLizar
void testQVTOPopulationReconfiguration(UsageScenario scenario, ExperimentRun expRun)
throws JobFailedException, UserCanceledException {
var measurement = MeasurementTestUtils.getMeasurementOfAt(expRun.getMeasurement(),
MetricDescriptionConstants.RESPONSE_TIME_METRIC_TUPLE, scenario);
assertTrue(measurement.isPresent());

List<Measure<?, Duration>> responseTimeMeasurements = MeasurementTestUtils
.allMeasurementsOfMetric(measurement.get(), MetricDescriptionConstants.RESPONSE_TIME_METRIC);
List<Measure<?, Duration>> timeMeasurements = MeasurementTestUtils.allMeasurementsOfMetric(measurement.get(),
MetricDescriptionConstants.POINT_IN_TIME_METRIC);
assertEquals(responseTimeMeasurements.size(), timeMeasurements.size());

double expectedMeasurementTime = 1.0;

for (int i = 0; i < 100; i++) {
if (i < 20) {
assertEquals(expectedMeasurementTime, timeMeasurements.get(i)
.doubleValue(SI.SECOND), 0.001);
expectedMeasurementTime += 100.0;
}
if (i >= 20 && i <= 60) {
assertEquals(expectedMeasurementTime, timeMeasurements.get(i)
.doubleValue(SI.SECOND), 0.001);
expectedMeasurementTime += 1.0;
System.out.println("expectedMeaurementTime: " + expectedMeasurementTime);
System.out.println("Measurement: " + timeMeasurements.get(i)
.doubleValue(SI.SECOND));
assertEquals(expectedMeasurementTime, timeMeasurements.get(i + 1)
.doubleValue(SI.SECOND), 0.001);
expectedMeasurementTime += 99.0;
i++;
}
// From here as the second phase with Population = 2.0 ends with value 4002,
// The following measurements are off by 1.0s
if (i > 61) {
assertEquals(expectedMeasurementTime + 1.0, timeMeasurements.get(i)
.doubleValue(SI.SECOND), 0.001);
expectedMeasurementTime += 100.0;
}
}
// Check whether all the response time stay at 1.0
MeasurementTestUtils.allDoubleMeasurementValuesMatch(measurement.get(),
MetricDescriptionConstants.RESPONSE_TIME_METRIC, SI.SECOND, closeTo(1.0, 0.001));
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
package org.palladiosimulator.simulizar.simulation.tests;

import static org.hamcrest.Matchers.closeTo;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.palladiosimulator.simulizar.test.commons.hamcrest.Matchers.asDoubleIn;

import java.util.List;

import javax.measure.Measure;
import javax.measure.quantity.Duration;
import javax.measure.quantity.Quantity;
import javax.measure.unit.SI;
import javax.measure.unit.Unit;

import org.hamcrest.Matcher;
import org.junit.jupiter.api.Test;
import org.palladiosimulator.edp2.models.ExperimentData.ExperimentRun;
import org.palladiosimulator.edp2.models.ExperimentData.Measurement;
import org.palladiosimulator.metricspec.BaseMetricDescription;
import org.palladiosimulator.metricspec.constants.MetricDescriptionConstants;
import org.palladiosimulator.pcm.usagemodel.UsageScenario;
import org.palladiosimulator.simulizar.launcher.SimulizarConstants;
import org.palladiosimulator.simulizar.test.commons.annotation.LoadPCMInstanceFromBundle;
import org.palladiosimulator.simulizar.test.commons.annotation.RunSimuLizar;
import org.palladiosimulator.simulizar.test.commons.annotation.SetConfigProperty;
import org.palladiosimulator.simulizar.test.commons.annotation.SimulationConfig;
import org.palladiosimulator.simulizar.test.commons.util.MeasurementTestUtils;

import de.uka.ipd.sdq.workflow.jobs.JobFailedException;
import de.uka.ipd.sdq.workflow.jobs.UserCanceledException;
import tools.mdsd.junit5utils.annotations.PluginTestOnly;

@PluginTestOnly
class UsageevolutionTest {

/**
* Tests Usageevolution with a simple deterministic example. This test only tests the correct
* responste time evolution.
*/
@Test
@LoadPCMInstanceFromBundle(bundleName = "org.palladiosimulator.simulizar.tests", basePath = "testmodels/usageevolutionTest", modelFiles = {
"default.allocation", "default.usagemodel", "default.repository", "default.usageevolution" })
@SimulationConfig(maxMeasurements = "100")
@RunSimuLizar
void testUsageevolutionResponseTimeVariation(UsageScenario scenario, ExperimentRun expRun)
throws JobFailedException, UserCanceledException {
var measurement = MeasurementTestUtils.getMeasurementOfAt(expRun.getMeasurement(),
MetricDescriptionConstants.RESPONSE_TIME_METRIC_TUPLE, scenario);
assertTrue(measurement.isPresent());

List<Measure<?, Duration>> responseTimeMeasurements = MeasurementTestUtils
.allMeasurementsOfMetric(measurement.get(), MetricDescriptionConstants.RESPONSE_TIME_METRIC);
List<Measure<?, Duration>> timeMeasurements = MeasurementTestUtils.allMeasurementsOfMetric(measurement.get(),
MetricDescriptionConstants.POINT_IN_TIME_METRIC);
assertEquals(responseTimeMeasurements.size(), timeMeasurements.size());

// The simulated test scenario evolves response time and user amount.
// Population is 1 and Think Time is 99.0
// It evolves in 3 stages.
// Stage 1: 2000s with constant 1.0 20 measurements in 20 timesteps
// Stage 2: 2000s with constant 2.0 (Leads to Response Time 4.0 as both values evolve)
// 40 Measurements in 20 Timesteps (two parallel)
// Stage 3: 6000s with constant 1.0 40 measurements in 40 timesteps
// It is important to know, that this constant evolves the user requests from 1 to 2 aswell
// as the response time.
// ^
// | ...[20]...
// |
// |
// |...[20].. ....[40].....
// ---------------------------------------->
// Number in Brackets means total 20 measuring Points
// In Stage 2 every Point is representing two measurements as both values evolved to 2 they
// have the exact same
// resonse time at the same point in time.
for (int i = 0; i < 100; i++) {
if ((i < 20)) {
assertEquals(responseTimeMeasurements.get(i)
.doubleValue(SI.SECOND), 1.0, 0.001);
}
if (i >= 20 && i < 60) {
assertEquals(responseTimeMeasurements.get(i)
.doubleValue(SI.SECOND), 4.0, 0.001);
}
if (i >= 60) {
assertEquals(responseTimeMeasurements.get(i)
.doubleValue(SI.SECOND), 1.0, 0.001);
}

// Test Measurement Time Stamps
assertEquals((Double) timeMeasurements.get(19)
.doubleValue(SI.SECOND), 1901.0, 0.001);
assertEquals((Double) timeMeasurements.get(20)
.doubleValue(SI.SECOND), 2004.0, 0.001);
assertEquals((Double) timeMeasurements.get(21)
.doubleValue(SI.SECOND), 2004.0, 0.001);
assertEquals((Double) timeMeasurements.get(22)
.doubleValue(SI.SECOND), 2107.0, 0.001);
// Section 1 -> Section 2 matching evolution of response time
assertEquals((Double) responseTimeMeasurements.get(19)
.doubleValue(SI.SECOND), 1.0, 0.001);
assertEquals((Double) responseTimeMeasurements.get(20)
.doubleValue(SI.SECOND), 4.0, 0.001);
assertEquals((Double) responseTimeMeasurements.get(21)
.doubleValue(SI.SECOND), 4.0, 0.001);
assertEquals((Double) responseTimeMeasurements.get(22)
.doubleValue(SI.SECOND), 4.0, 0.001);
// Stage 2 -> Stage 3 same as above but with Section 3 only having 1 user again.
assertEquals((Double) timeMeasurements.get(59)
.doubleValue(SI.SECOND), 3961.0, 0.001);
assertEquals((Double) timeMeasurements.get(60)
.doubleValue(SI.SECOND), 4061.0, 0.001);
assertEquals((Double) timeMeasurements.get(61)
.doubleValue(SI.SECOND), 4161.0, 0.001);
assertEquals((Double) responseTimeMeasurements.get(59)
.doubleValue(SI.SECOND), 4.0, 0.001);
assertEquals((Double) responseTimeMeasurements.get(60)
.doubleValue(SI.SECOND), 1.0, 0.001);
assertEquals((Double) responseTimeMeasurements.get(61)
.doubleValue(SI.SECOND), 1.0, 0.001);
}
}

/**
* Tests how the values behave if the usageevolution model is not loaded. This means it is
* tested, whether no evolution happens without usage evolution.
*/
@Test
@LoadPCMInstanceFromBundle(bundleName = "org.palladiosimulator.simulizar.tests", basePath = "testmodels/usageevolutionTest", modelFiles = {
"default.allocation", "default.usagemodel", "default.repository" })
@SimulationConfig(maxMeasurements = "100")
@RunSimuLizar
void testNoEvolutionWithoutUsageEvolution(UsageScenario scenario, ExperimentRun expRun)
throws JobFailedException, UserCanceledException {
var measurement = MeasurementTestUtils.getMeasurementOfAt(expRun.getMeasurement(),
MetricDescriptionConstants.RESPONSE_TIME_METRIC_TUPLE, scenario);
assertTrue(measurement.isPresent());

List<Measure<?, Duration>> responseTimeMeasurements = MeasurementTestUtils
.allMeasurementsOfMetric(measurement.get(), MetricDescriptionConstants.RESPONSE_TIME_METRIC);
List<Measure<?, Duration>> timeMeasurements = MeasurementTestUtils.allMeasurementsOfMetric(measurement.get(),
MetricDescriptionConstants.POINT_IN_TIME_METRIC);
assertEquals(responseTimeMeasurements.size(), timeMeasurements.size());
// No Evolution means, that the response time stays the same for the all measurements at 1.0
MeasurementTestUtils.allDoubleMeasurementValuesMatch(measurement.get(),
MetricDescriptionConstants.RESPONSE_TIME_METRIC, SI.SECOND, closeTo(1.0, 0.001));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>transformationQVTTest</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
</buildSpec>
<natures>
<nature>org.eclipse.sirius.nature.modelingproject</nature>
</natures>
</projectDescription>
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<resourceenvironment:ResourceEnvironment xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:resourceenvironment="http://palladiosimulator.org/PalladioComponentModel/ResourceEnvironment/5.2">
<resourceContainer_ResourceEnvironment id="_B0aZ0CHdEd6lJo4DCALHMw" entityName="appserver">
<activeResourceSpecifications_ResourceContainer id="_ssJ0QYr-EeG0c6Q1F-wA1Q">
<schedulingPolicy href="pathmap://PCM_MODELS/Palladio.resourcetype#ProcessorSharing"/>
<activeResourceType_ActiveResourceSpecification href="pathmap://PCM_MODELS/Palladio.resourcetype#_oro4gG3fEdy4YaaT-RYrLQ"/>
<processingRate_ProcessingResourceSpecification specification="1"/>
</activeResourceSpecifications_ResourceContainer>
</resourceContainer_ResourceEnvironment>
</resourceenvironment:ResourceEnvironment>
Loading