From 7ce66cb5ca4192b70218fb051b6df892404baa0a Mon Sep 17 00:00:00 2001 From: mczaplicka Date: Wed, 8 Jul 2020 13:27:19 +0200 Subject: [PATCH 1/7] ftt: added conditions to check on the function output --- .../FunctionizerTestingToolController.java | 2 +- .../model/ReportEntryKey.java | 4 +- .../model/TestCaseResult.java | 3 +- .../service/provider/AWSLambdaService.java | 32 ++++++++----- .../provider/AzureFunctionsService.java | 43 +++++++++--------- .../provider/TestPreparationService.java | 14 +++--- .../service/test/FunctionizerReportData.java | 13 ++---- .../commons/model/testing/Condition.java | 22 +++++++++ .../commons/model/testing/TestCase.java | 3 +- .../TestConfigurationValidationService.java | 45 ++++++++++++------- 10 files changed, 114 insertions(+), 67 deletions(-) create mode 100644 melodic-commons/src/main/java/eu/passage/upperware/commons/model/testing/Condition.java diff --git a/functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/FunctionizerTestingToolController.java b/functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/FunctionizerTestingToolController.java index 24afed031..33164b2dc 100644 --- a/functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/FunctionizerTestingToolController.java +++ b/functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/FunctionizerTestingToolController.java @@ -15,7 +15,7 @@ import org.springframework.web.bind.annotation.*; @AllArgsConstructor(onConstructor = @__(@Autowired)) public class FunctionizerTestingToolController { - private TestRunner testRunner; + private final TestRunner testRunner; @RequestMapping("/") @ResponseStatus(HttpStatus.OK) diff --git a/functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/model/ReportEntryKey.java b/functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/model/ReportEntryKey.java index 71b8d9995..14981724d 100644 --- a/functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/model/ReportEntryKey.java +++ b/functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/model/ReportEntryKey.java @@ -2,7 +2,9 @@ package eu.functionizer.functionizertestingtool.model; public class ReportEntryKey { public final static String EVENT = "event"; - public final static String EXPECTED_OUTPUT = "expectedOutput"; + public final static String EXPECTED_VALUE = "expectedValue"; + public final static String CONDITION = "condition"; + public final static String ACTUAL_OUTPUT = "actualOutput"; public final static String IGNORED = "ignored"; public final static String ROOT = "root"; public final static String STAGE = "stage"; diff --git a/functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/model/TestCaseResult.java b/functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/model/TestCaseResult.java index ef3c65b9e..7091c86b9 100644 --- a/functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/model/TestCaseResult.java +++ b/functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/model/TestCaseResult.java @@ -5,8 +5,9 @@ import lombok.Data; @Data public class TestCaseResult { private String event; - private String expectedOutput; private String actualOutput; + private String condition; + private String expectedValue; private String message; private TestResultEnum result; private double duration; diff --git a/functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/service/provider/AWSLambdaService.java b/functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/service/provider/AWSLambdaService.java index 9b2d7aa30..29ede107f 100644 --- a/functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/service/provider/AWSLambdaService.java +++ b/functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/service/provider/AWSLambdaService.java @@ -9,6 +9,7 @@ import com.amazonaws.services.lambda.model.InvokeRequest; import com.amazonaws.services.lambda.model.InvokeResult; import eu.functionizer.functionizertestingtool.model.ReportEntryKey; import eu.functionizer.functionizertestingtool.service.test.Stage; +import eu.passage.upperware.commons.model.testing.Condition; import eu.passage.upperware.commons.model.testing.FunctionTestConfiguration; import eu.passage.upperware.commons.model.testing.TestCase; import lombok.extern.slf4j.Slf4j; @@ -21,7 +22,7 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; -import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.junit.jupiter.api.DynamicTest.dynamicTest; @@ -89,37 +90,42 @@ public class AWSLambdaService extends TestPreparationService { log.debug( "Creating test case: event={}, expected output={}", testCase.getEvent(), - testCase.getExpectedOutput() + testCase.getExpectedValue() ); String displayName = createTestCaseDisplayName( functionName, testCase.getEvent(), - testCase.getExpectedOutput() + testCase.getCondition().name(), + testCase.getExpectedValue() ); - Map reportEntry = createReportEntry(displayName); - reportEntry.put(ReportEntryKey.EVENT, testCase.getEvent()); - reportEntry.put(ReportEntryKey.EXPECTED_OUTPUT, testCase.getExpectedOutput()); - testReporter.publishEntry(reportEntry); - return dynamicTest( displayName, () -> executeAWSLambdaTestCase( + displayName, awsLambdaClient, awsLambdaFunctionName, testCase.getEvent(), - testCase.getExpectedOutput() + testCase.getCondition(), + testCase.getExpectedValue() ) ); } public static void executeAWSLambdaTestCase( + String displayName, AWSLambda awsLambda, String functionName, String event, - String expectedOutput + Condition condition, + String expectedValue ) { + Map reportEntry = createReportEntry(displayName); + reportEntry.put(ReportEntryKey.EVENT, event); + reportEntry.put(ReportEntryKey.CONDITION, condition.name()); + reportEntry.put(ReportEntryKey.EXPECTED_VALUE, expectedValue); + InvokeRequest invokeRequest = new InvokeRequest() .withFunctionName(functionName) .withPayload(event); @@ -128,8 +134,11 @@ public class AWSLambdaService extends TestPreparationService { InvokeResult result = awsLambda.invoke(invokeRequest); String resultString = new String(result.getPayload().array(), StandardCharsets.UTF_8); if (Arrays.asList(200, 202, 204).contains(result.getStatusCode())) { - assertEquals(expectedOutput, resultString); + reportEntry.put(ReportEntryKey.ACTUAL_OUTPUT, resultString); + testReporter.publishEntry(reportEntry); + assertTrue(condition.getMethod().apply(resultString, expectedValue)); } else { + testReporter.publishEntry(reportEntry); fail(String.format( "Received status code %s. Reason: %s", result.getStatusCode(), @@ -137,6 +146,7 @@ public class AWSLambdaService extends TestPreparationService { )); } } catch (Exception e) { + testReporter.publishEntry(reportEntry); fail(String.format( "An exception while fetching response from AWS Lambda Client occurred. Cause: %s", e.getMessage() diff --git a/functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/service/provider/AzureFunctionsService.java b/functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/service/provider/AzureFunctionsService.java index 34453b198..22911bd1d 100644 --- a/functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/service/provider/AzureFunctionsService.java +++ b/functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/service/provider/AzureFunctionsService.java @@ -5,15 +5,13 @@ import com.microsoft.azure.credentials.ApplicationTokenCredentials; import com.microsoft.azure.management.Azure; import com.microsoft.azure.management.appservice.FunctionApp; import eu.functionizer.functionizertestingtool.model.ReportEntryKey; -import eu.functionizer.functionizertestingtool.service.test.ServerlessFunctionTestFactory; import eu.functionizer.functionizertestingtool.service.test.Stage; +import eu.passage.upperware.commons.model.testing.Condition; import eu.passage.upperware.commons.model.testing.FunctionTestConfiguration; import eu.passage.upperware.commons.model.testing.TestCase; -import io.github.cloudiator.rest.model.Function; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.DynamicNode; import org.junit.jupiter.api.DynamicTest; -import org.junit.jupiter.api.TestReporter; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; @@ -27,7 +25,7 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; -import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.junit.jupiter.api.DynamicTest.dynamicTest; @@ -134,8 +132,7 @@ public class AzureFunctionsService extends TestPreparationService { configuration.getFunctionName(), azureFunctionEndpoint, functionKey, - testCase, - testReporter + testCase )) .collect(Collectors.toList()); @@ -146,51 +143,57 @@ public class AzureFunctionsService extends TestPreparationService { String functionName, String azureFunctionEndpoint, String functionKey, - TestCase testCase, - TestReporter testReporter + TestCase testCase ) { log.debug( - "Creating test case: event={}, expected output={}", + "Creating test case: event={}, condition={} expected output={}", testCase.getEvent(), - testCase.getExpectedOutput() + testCase.getCondition().name(), + testCase.getExpectedValue() ); String displayName = createTestCaseDisplayName( functionName, testCase.getEvent(), - testCase.getExpectedOutput() + testCase.getCondition().name(), + testCase.getExpectedValue() ); - Map reportEntry = createReportEntry(displayName); - reportEntry.put(ReportEntryKey.EVENT, testCase.getEvent()); - reportEntry.put(ReportEntryKey.EXPECTED_OUTPUT, testCase.getExpectedOutput()); - testReporter.publishEntry(reportEntry); - return dynamicTest( displayName, () -> executeAzureTestCase( + displayName, azureFunctionEndpoint, functionKey, testCase.getEvent(), - testCase.getExpectedOutput() + testCase.getCondition(), + testCase.getExpectedValue() ) ); } private static void executeAzureTestCase( + String displayName, String endpoint, String functionKey, String event, - String expectedOutput + Condition condition, + String expectedValue ) { - Stage stage = Stage.TEST_EXECUTION; + Map reportEntry = createReportEntry(displayName); + reportEntry.put(ReportEntryKey.EVENT, event); + reportEntry.put(ReportEntryKey.CONDITION, condition.name()); + reportEntry.put(ReportEntryKey.EXPECTED_VALUE, expectedValue); try { String response = AzureFunctionsService.invokeFunction( endpoint, functionKey, event ); - assertEquals(expectedOutput, response); + reportEntry.put(ReportEntryKey.ACTUAL_OUTPUT, response); + testReporter.publishEntry(reportEntry); + assertTrue(condition.getMethod().apply(response, expectedValue)); } catch (Exception e) { + testReporter.publishEntry(reportEntry); fail(String.format( "An exception while fetching response from AWS Lambda Client occurred. Cause: %s", e.getMessage() diff --git a/functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/service/provider/TestPreparationService.java b/functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/service/provider/TestPreparationService.java index 6e7e26967..0effc0c8c 100644 --- a/functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/service/provider/TestPreparationService.java +++ b/functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/service/provider/TestPreparationService.java @@ -22,13 +22,15 @@ public class TestPreparationService { static String createTestCaseDisplayName( String functionName, String input, - String expectedOutput + String condition, + String expected ) { return String.format( - "Function %s invoked with %s should return %s", + "Output of %s invoked with %s %s %s", functionName, input, - expectedOutput + condition, + expected ); } @@ -56,11 +58,13 @@ public class TestPreparationService { String testCaseDisplayName = createTestCaseDisplayName( configuration.getFunctionName(), testCase.getEvent(), - testCase.getExpectedOutput() + testCase.getCondition().name(), + testCase.getExpectedValue() ); Map reportEntry = createReportEntry(testCaseDisplayName); reportEntry.put(ReportEntryKey.EVENT, testCase.getEvent()); - reportEntry.put(ReportEntryKey.EXPECTED_OUTPUT, testCase.getExpectedOutput()); + reportEntry.put(ReportEntryKey.CONDITION, testCase.getCondition().name()); + reportEntry.put(ReportEntryKey.EXPECTED_VALUE, testCase.getExpectedValue()); reportEntry.put(ReportEntryKey.IGNORED, "true"); testReporter.publishEntry(reportEntry); functionNode.add(dynamicTest(testCaseDisplayName, () -> fail("Test case ignored"))); diff --git a/functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/service/test/FunctionizerReportData.java b/functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/service/test/FunctionizerReportData.java index 471105000..1bf581e7e 100644 --- a/functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/service/test/FunctionizerReportData.java +++ b/functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/service/test/FunctionizerReportData.java @@ -1,7 +1,6 @@ package eu.functionizer.functionizertestingtool.service.test; import eu.functionizer.functionizertestingtool.model.*; -import org.junit.ComparisonFailure; import org.junit.platform.commons.util.ExceptionUtils; import org.junit.platform.engine.TestExecutionResult; import org.junit.platform.engine.reporting.ReportEntry; @@ -194,18 +193,12 @@ public class FunctionizerReportData { testCaseResult.setResult(TestResultEnum.IGNORED); } testCaseResult.setEvent(reportEntry.get(ReportEntryKey.EVENT)); - testCaseResult.setExpectedOutput(reportEntry.get(ReportEntryKey.EXPECTED_OUTPUT)); - testCaseResult.setActualOutput(reportEntry.get(ReportEntryKey.EXPECTED_OUTPUT)); + testCaseResult.setExpectedValue(reportEntry.get(ReportEntryKey.EXPECTED_VALUE)); + testCaseResult.setCondition(reportEntry.get(ReportEntryKey.CONDITION)); + testCaseResult.setActualOutput(reportEntry.get(ReportEntryKey.ACTUAL_OUTPUT)); result.getThrowable().ifPresent(error -> { testCaseResult.setMessage(error.getMessage()); - if (error instanceof ComparisonFailure) { - ComparisonFailure comparisonFailure = (ComparisonFailure) error; - testCaseResult.setExpectedOutput(comparisonFailure.getExpected()); - testCaseResult.setActualOutput(comparisonFailure.getActual()); - } else { - testCaseResult.setActualOutput(null); - } }); functionTestResult.addTestCaseResult(testCaseResult); } diff --git a/melodic-commons/src/main/java/eu/passage/upperware/commons/model/testing/Condition.java b/melodic-commons/src/main/java/eu/passage/upperware/commons/model/testing/Condition.java new file mode 100644 index 000000000..abb2c8b84 --- /dev/null +++ b/melodic-commons/src/main/java/eu/passage/upperware/commons/model/testing/Condition.java @@ -0,0 +1,22 @@ +package eu.passage.upperware.commons.model.testing; + +import lombok.Getter; + +import java.util.function.BiFunction; + +@Getter +public enum Condition { + EQUALS(String::equals), + STARTS_WITH(String::startsWith), + ENDS_WITH(String::endsWith), + CONTAINS_SUBSTRING(String::contains), + EQUALS_IGNORE_CASE(String::equalsIgnoreCase), + MATCHES_REGEX(String::matches); + + private final BiFunction method; + + + Condition(BiFunction method) { + this.method = method; + } +} diff --git a/melodic-commons/src/main/java/eu/passage/upperware/commons/model/testing/TestCase.java b/melodic-commons/src/main/java/eu/passage/upperware/commons/model/testing/TestCase.java index 29b152555..04699e519 100644 --- a/melodic-commons/src/main/java/eu/passage/upperware/commons/model/testing/TestCase.java +++ b/melodic-commons/src/main/java/eu/passage/upperware/commons/model/testing/TestCase.java @@ -6,6 +6,7 @@ import lombok.Data; public class TestCase { private String functionName; private String event; - private String expectedOutput; + private Condition Condition; + private String expectedValue; private String region; } diff --git a/melodic-commons/src/main/java/eu/passage/upperware/commons/service/testing/TestConfigurationValidationService.java b/melodic-commons/src/main/java/eu/passage/upperware/commons/service/testing/TestConfigurationValidationService.java index e0b8bc037..729cb5bd3 100644 --- a/melodic-commons/src/main/java/eu/passage/upperware/commons/service/testing/TestConfigurationValidationService.java +++ b/melodic-commons/src/main/java/eu/passage/upperware/commons/service/testing/TestConfigurationValidationService.java @@ -1,10 +1,11 @@ package eu.passage.upperware.commons.service.testing; +import eu.passage.upperware.commons.model.testing.Condition; import eu.passage.upperware.commons.model.testing.FunctionTestConfiguration; import eu.passage.upperware.commons.model.testing.TestCase; import eu.passage.upperware.commons.model.testing.TestConfiguration; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.tuple.Pair; +import org.apache.commons.lang3.tuple.Triple; import java.util.HashSet; import java.util.List; @@ -35,19 +36,27 @@ public class TestConfigurationValidationService { public static class NotUniqueTestCaseException extends Exception { String functionName; String event; - String expectedOutput; + Condition condition; + String expected; String message; - NotUniqueTestCaseException(String functionName, String event, String expectedOutput) { + NotUniqueTestCaseException( + String functionName, + String event, + Condition condition, + String expected + ) { this.functionName = functionName; this.event = event; - this.expectedOutput = expectedOutput; + this.condition = condition; + this.expected = expected; this.message = String.format( - "The pair of event = '%s' and expected output = '%s'" + + "The triplet of event = '%s', comparison = %s, expected output = '%s'" + " appears in more than one test case of function '%s'." + - " Please adjust the test cases to be unique", + " Please adjust the test cases to be unique.", this.event, - this.expectedOutput, + this.condition, + this.expected, this.functionName ); } @@ -89,23 +98,25 @@ public class TestConfigurationValidationService { public static void checkTestCasesUniqueness( List testCases, String functionName ) throws NotUniqueTestCaseException { - List> eventsExpectedOutputs = testCases + List> testCaseTriplets = testCases .stream() - .map(testCase -> Pair.of(testCase.getEvent(), testCase.getExpectedOutput())) + .map(testCase -> Triple.of(testCase.getEvent(), testCase.getCondition(), testCase.getExpectedValue())) .collect(Collectors.toList()); - Set> uniquePairs = new HashSet<>(); - for (Pair eventExpectedOutput : eventsExpectedOutputs) { - if (!uniquePairs.add(eventExpectedOutput)) { + Set> uniqueTriplets = new HashSet<>(); + for (Triple testCaseTriplet : testCaseTriplets) { + if (!uniqueTriplets.add(testCaseTriplet)) { log.error( - "Function '{}' has more than one test case with event '{}' and expected output '{}'", + "Function '{}' has more than one test case with the event-predicate-expected triplet: ('{}', {}, '{}').", functionName, - eventExpectedOutput.getKey(), - eventExpectedOutput.getValue() + testCaseTriplet.getLeft(), + testCaseTriplet.getMiddle(), + testCaseTriplet.getRight() ); throw new NotUniqueTestCaseException( functionName, - eventExpectedOutput.getKey(), - eventExpectedOutput.getValue() + testCaseTriplet.getLeft(), + testCaseTriplet.getMiddle(), + testCaseTriplet.getRight() ); } } -- GitLab From 04e2bcfdfe9c802762b5e892a6703b65c6ae6859 Mon Sep 17 00:00:00 2001 From: mczaplicka Date: Tue, 14 Jul 2020 12:10:42 +0200 Subject: [PATCH 2/7] ftt: moved test result classes to commons to determine response entity in gui backend --- .../FunctionizerTestingToolController.java | 2 +- .../functionizertestingtool/service/TestRunner.java | 2 +- .../service/test/FunctionizerReportData.java | 4 ++++ .../functionizertestingtool/service/test/Stage.java | 2 -- .../testingtool/FunctionizerTestingToolApi.java | 4 +++- .../testingtool/FunctionizerTestingToolClientApi.java | 9 +++++---- .../guibackend/controller/testing/TestingController.java | 3 ++- melodic-commons/pom.xml | 4 ++++ .../commons/model/testing}/FunctionTestResult.java | 4 +++- .../commons/model/testing}/FunctionizerTestResult.java | 2 +- .../upperware/commons/model/testing}/TestCaseResult.java | 4 +++- .../upperware/commons/model/testing}/TestResultEnum.java | 2 +- 12 files changed, 28 insertions(+), 14 deletions(-) rename {functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/model => melodic-commons/src/main/java/eu/passage/upperware/commons/model/testing}/FunctionTestResult.java (95%) rename {functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/model => melodic-commons/src/main/java/eu/passage/upperware/commons/model/testing}/FunctionizerTestResult.java (90%) rename {functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/model => melodic-commons/src/main/java/eu/passage/upperware/commons/model/testing}/TestCaseResult.java (76%) rename {functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/model => melodic-commons/src/main/java/eu/passage/upperware/commons/model/testing}/TestResultEnum.java (88%) diff --git a/functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/FunctionizerTestingToolController.java b/functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/FunctionizerTestingToolController.java index 33164b2dc..1c2183c56 100644 --- a/functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/FunctionizerTestingToolController.java +++ b/functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/FunctionizerTestingToolController.java @@ -1,7 +1,7 @@ package eu.functionizer.functionizertestingtool; -import eu.functionizer.functionizertestingtool.model.FunctionizerTestResult; +import eu.passage.upperware.commons.model.testing.FunctionizerTestResult; import eu.functionizer.functionizertestingtool.service.TestRunner; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; diff --git a/functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/service/TestRunner.java b/functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/service/TestRunner.java index 89a62839c..8cc143c73 100644 --- a/functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/service/TestRunner.java +++ b/functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/service/TestRunner.java @@ -1,6 +1,6 @@ package eu.functionizer.functionizertestingtool.service; -import eu.functionizer.functionizertestingtool.model.FunctionizerTestResult; +import eu.passage.upperware.commons.model.testing.FunctionizerTestResult; import eu.functionizer.functionizertestingtool.service.test.FunctionizerReportData; import eu.functionizer.functionizertestingtool.service.test.FunctionizerTestListener; import eu.functionizer.functionizertestingtool.service.test.ServerlessFunctionTestFactory; diff --git a/functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/service/test/FunctionizerReportData.java b/functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/service/test/FunctionizerReportData.java index 1bf581e7e..66b8b5e29 100644 --- a/functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/service/test/FunctionizerReportData.java +++ b/functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/service/test/FunctionizerReportData.java @@ -1,6 +1,10 @@ package eu.functionizer.functionizertestingtool.service.test; import eu.functionizer.functionizertestingtool.model.*; +import eu.passage.upperware.commons.model.testing.FunctionTestResult; +import eu.passage.upperware.commons.model.testing.FunctionizerTestResult; +import eu.passage.upperware.commons.model.testing.TestCaseResult; +import eu.passage.upperware.commons.model.testing.TestResultEnum; import org.junit.platform.commons.util.ExceptionUtils; import org.junit.platform.engine.TestExecutionResult; import org.junit.platform.engine.reporting.ReportEntry; diff --git a/functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/service/test/Stage.java b/functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/service/test/Stage.java index 25a12ea98..0140236c2 100644 --- a/functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/service/test/Stage.java +++ b/functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/service/test/Stage.java @@ -9,8 +9,6 @@ public enum Stage { BUILD_AZURE_CLIENT("BUILD AZURE CLIENT"), BUILD_AWS_LAMBDA_CLIENT("BUILD AWS LAMBDA CLIENT"), GET_AZURE_FUNCTION_KEY("GET AZURE FUNCTION KEY"), - TEST_EXECUTION("TEST CASE EXECUTION"), - AWS_INVOKE("INVOKE AWS LAMBDA FUNCTION"), END("COLLECTING TESTS FINISH"); private final String name; diff --git a/gui-backend/src/main/java/eu/melodic/upperware/guibackend/communication/testingtool/FunctionizerTestingToolApi.java b/gui-backend/src/main/java/eu/melodic/upperware/guibackend/communication/testingtool/FunctionizerTestingToolApi.java index d2bd68cff..ad02a25c1 100644 --- a/gui-backend/src/main/java/eu/melodic/upperware/guibackend/communication/testingtool/FunctionizerTestingToolApi.java +++ b/gui-backend/src/main/java/eu/melodic/upperware/guibackend/communication/testingtool/FunctionizerTestingToolApi.java @@ -1,5 +1,7 @@ package eu.melodic.upperware.guibackend.communication.testingtool; +import eu.passage.upperware.commons.model.testing.FunctionizerTestResult; + public interface FunctionizerTestingToolApi { - Object runTests(String token); + FunctionizerTestResult runTests(String token); } diff --git a/gui-backend/src/main/java/eu/melodic/upperware/guibackend/communication/testingtool/FunctionizerTestingToolClientApi.java b/gui-backend/src/main/java/eu/melodic/upperware/guibackend/communication/testingtool/FunctionizerTestingToolClientApi.java index 8d04ce47e..3dd916578 100644 --- a/gui-backend/src/main/java/eu/melodic/upperware/guibackend/communication/testingtool/FunctionizerTestingToolClientApi.java +++ b/gui-backend/src/main/java/eu/melodic/upperware/guibackend/communication/testingtool/FunctionizerTestingToolClientApi.java @@ -3,6 +3,7 @@ package eu.melodic.upperware.guibackend.communication.testingtool; import eu.melodic.upperware.guibackend.communication.commons.RestCommunicationService; import eu.melodic.upperware.guibackend.communication.commons.ServiceName; import eu.melodic.upperware.guibackend.properties.GuiBackendProperties; +import eu.passage.upperware.commons.model.testing.FunctionizerTestResult; import org.springframework.core.ParameterizedTypeReference; import org.springframework.http.HttpEntity; import org.springframework.http.HttpMethod; @@ -22,13 +23,13 @@ public class FunctionizerTestingToolClientApi extends RestCommunicationService i } @Override - public Object runTests(String token) { + public FunctionizerTestResult runTests(String token) { String requestUrl = guiBackendProperties.getFunctionizerTestingTool().getUrl() + "/test"; - ParameterizedTypeReference responseType = - new ParameterizedTypeReference() { + ParameterizedTypeReference responseType = + new ParameterizedTypeReference() { }; HttpEntity request = createEmptyHttpEntityWithAuthorizationHeader(token); - ResponseEntity response = getResponse( + ResponseEntity response = getResponse( requestUrl, responseType, request, diff --git a/gui-backend/src/main/java/eu/melodic/upperware/guibackend/controller/testing/TestingController.java b/gui-backend/src/main/java/eu/melodic/upperware/guibackend/controller/testing/TestingController.java index db47da5f2..e51d9777f 100644 --- a/gui-backend/src/main/java/eu/melodic/upperware/guibackend/controller/testing/TestingController.java +++ b/gui-backend/src/main/java/eu/melodic/upperware/guibackend/controller/testing/TestingController.java @@ -3,6 +3,7 @@ package eu.melodic.upperware.guibackend.controller.testing; import eu.melodic.upperware.guibackend.communication.testingtool.FunctionizerTestingToolApi; import eu.melodic.upperware.guibackend.controller.testing.response.UploadTestConfigResponse; import eu.melodic.upperware.guibackend.service.testing.TestingService; +import eu.passage.upperware.commons.model.testing.FunctionizerTestResult; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpHeaders; @@ -34,7 +35,7 @@ public class TestingController { @PostMapping(value = "/run") @ResponseStatus(HttpStatus.OK) - public Object runTests(@RequestHeader(value = HttpHeaders.AUTHORIZATION) String token) { + public FunctionizerTestResult runTests(@RequestHeader(value = HttpHeaders.AUTHORIZATION) String token) { return functionizerTestApi.runTests(token); } } diff --git a/melodic-commons/pom.xml b/melodic-commons/pom.xml index aa9322aae..736e3f624 100644 --- a/melodic-commons/pom.xml +++ b/melodic-commons/pom.xml @@ -84,6 +84,10 @@ 1.9.13 compile + + org.junit.platform + junit-platform-engine + diff --git a/functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/model/FunctionTestResult.java b/melodic-commons/src/main/java/eu/passage/upperware/commons/model/testing/FunctionTestResult.java similarity index 95% rename from functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/model/FunctionTestResult.java rename to melodic-commons/src/main/java/eu/passage/upperware/commons/model/testing/FunctionTestResult.java index 6e83036b0..ba98e2728 100644 --- a/functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/model/FunctionTestResult.java +++ b/melodic-commons/src/main/java/eu/passage/upperware/commons/model/testing/FunctionTestResult.java @@ -1,4 +1,4 @@ -package eu.functionizer.functionizertestingtool.model; +package eu.passage.upperware.commons.model.testing; import lombok.Data; @@ -18,6 +18,8 @@ public class FunctionTestResult { private String failedAtStage; private String message; + public FunctionTestResult() {} + public FunctionTestResult(String functionName) { this.functionName = functionName; this.testCaseResults = new ArrayList<>(); diff --git a/functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/model/FunctionizerTestResult.java b/melodic-commons/src/main/java/eu/passage/upperware/commons/model/testing/FunctionizerTestResult.java similarity index 90% rename from functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/model/FunctionizerTestResult.java rename to melodic-commons/src/main/java/eu/passage/upperware/commons/model/testing/FunctionizerTestResult.java index 8dbd9978d..513b978c5 100644 --- a/functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/model/FunctionizerTestResult.java +++ b/melodic-commons/src/main/java/eu/passage/upperware/commons/model/testing/FunctionizerTestResult.java @@ -1,4 +1,4 @@ -package eu.functionizer.functionizertestingtool.model; +package eu.passage.upperware.commons.model.testing; import lombok.Data; diff --git a/functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/model/TestCaseResult.java b/melodic-commons/src/main/java/eu/passage/upperware/commons/model/testing/TestCaseResult.java similarity index 76% rename from functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/model/TestCaseResult.java rename to melodic-commons/src/main/java/eu/passage/upperware/commons/model/testing/TestCaseResult.java index 7091c86b9..09db7c6ad 100644 --- a/functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/model/TestCaseResult.java +++ b/melodic-commons/src/main/java/eu/passage/upperware/commons/model/testing/TestCaseResult.java @@ -1,4 +1,4 @@ -package eu.functionizer.functionizertestingtool.model; +package eu.passage.upperware.commons.model.testing; import lombok.Data; @@ -11,4 +11,6 @@ public class TestCaseResult { private String message; private TestResultEnum result; private double duration; + + public TestCaseResult() {} } diff --git a/functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/model/TestResultEnum.java b/melodic-commons/src/main/java/eu/passage/upperware/commons/model/testing/TestResultEnum.java similarity index 88% rename from functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/model/TestResultEnum.java rename to melodic-commons/src/main/java/eu/passage/upperware/commons/model/testing/TestResultEnum.java index 4a2100edb..3be5b6212 100644 --- a/functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/model/TestResultEnum.java +++ b/melodic-commons/src/main/java/eu/passage/upperware/commons/model/testing/TestResultEnum.java @@ -1,4 +1,4 @@ -package eu.functionizer.functionizertestingtool.model; +package eu.passage.upperware.commons.model.testing; import org.junit.platform.engine.TestExecutionResult; -- GitLab From b943618f7008cb33209883e1813c320614e0875f Mon Sep 17 00:00:00 2001 From: mczaplicka Date: Wed, 15 Jul 2020 16:33:08 +0200 Subject: [PATCH 3/7] ftt: add xmi validation for software component names uniqueness on gui backend --- .../guibackend/service/cdo/CdoService.java | 41 ++++++++++++++++++- .../service/deployment/DeploymentService.java | 2 + 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/gui-backend/src/main/java/eu/melodic/upperware/guibackend/service/cdo/CdoService.java b/gui-backend/src/main/java/eu/melodic/upperware/guibackend/service/cdo/CdoService.java index c12acb897..51ab65315 100644 --- a/gui-backend/src/main/java/eu/melodic/upperware/guibackend/service/cdo/CdoService.java +++ b/gui-backend/src/main/java/eu/melodic/upperware/guibackend/service/cdo/CdoService.java @@ -2,6 +2,7 @@ package eu.melodic.upperware.guibackend.service.cdo; import camel.core.CamelModel; import camel.core.NamedElement; +import camel.deployment.impl.DeploymentTypeModelImpl; import camel.requirement.OptimisationRequirement; import camel.requirement.RequirementModel; import camel.requirement.impl.OptimisationRequirementImpl; @@ -32,8 +33,11 @@ import org.springframework.web.server.ResponseStatusException; import java.io.File; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; import java.util.stream.Collectors; +import java.util.stream.Stream; @Service @Slf4j @@ -43,7 +47,7 @@ public class CdoService { private CpModelMapper cpModelMapper; private GuiBackendProperties guiBackendProperties; - public boolean storeFileInCdo(String cdoName, File file) { + public boolean storeFileInCdo(String cdoName, File file) throws Exception { log.info("Storing Model {} into CDO with validationEnabled = {}", cdoName, guiBackendProperties.getCdoUploader().isValidationEnabled()); EObject model = null; @@ -55,12 +59,47 @@ public class CdoService { return false; } + log.info("Checking model's software components name uniqueness"); + String duplicateName = validateServerlessComponentNameUniqueness(model); + if (duplicateName != null) { + client.closeSession(); + log.error("Software component's name '{}' " + + "is used in more than one component.", + duplicateName + ); + throw new Exception( + String.format( + "Software component's name '%s' is used in more than one component." + + " Modify the file to have unique software component names and try again.", + duplicateName + ) + ); + } + log.info("Validation passed"); + + boolean successfullyStored = client.storeModel(model, cdoName, guiBackendProperties.getCdoUploader().isValidationEnabled()); log.info("Successfully stored of model {} in CDO = {}", cdoName, successfullyStored); client.closeSession(); return successfullyStored; } + private String validateServerlessComponentNameUniqueness(EObject model) { + CamelModel camelModel = (CamelModel) model; + DeploymentTypeModelImpl depModel = (DeploymentTypeModelImpl) camelModel.getDeploymentModels().get(0); + List names = depModel.getSoftwareComponents() + .stream() + .map(NamedElement::getName) + .collect(Collectors.toList()); + Set uniqueNames = new HashSet<>(); + for (String name : names) { + if (!uniqueNames.add(name)) { + return name; + } + } + return null; + } + public boolean deleteXmi(String cdoName) { log.info("Deleting model {} from CDO", cdoName); CDOClient client = getCdoClient(); diff --git a/gui-backend/src/main/java/eu/melodic/upperware/guibackend/service/deployment/DeploymentService.java b/gui-backend/src/main/java/eu/melodic/upperware/guibackend/service/deployment/DeploymentService.java index 5e1ccdc96..827373863 100644 --- a/gui-backend/src/main/java/eu/melodic/upperware/guibackend/service/deployment/DeploymentService.java +++ b/gui-backend/src/main/java/eu/melodic/upperware/guibackend/service/deployment/DeploymentService.java @@ -91,6 +91,8 @@ public class DeploymentService { } catch (IllegalStateException e) { log.error("Error by uploading xmi file:", e); throw new ResponseStatusException(HttpStatus.BAD_REQUEST, String.format("Problem by uploading your %s file. CDO repository is in pending state. Please try again.", uploadXmiRequest.getResource().getFilename())); + } catch (Exception e) { + throw new ResponseStatusException(HttpStatus.BAD_REQUEST, e.getMessage()); } } -- GitLab From f614a319fb34e2c9d30fe23710543c522cf72dc4 Mon Sep 17 00:00:00 2001 From: mczaplicka Date: Thu, 16 Jul 2020 17:49:11 +0200 Subject: [PATCH 4/7] ftt: unified REST API paths for test config related methods + added DELETE test config method --- .../controller/testing/TestingController.java | 25 +++++-- .../response/TestConfigurationResponse.java | 12 ++++ .../response/UploadTestConfigResponse.java | 12 ---- .../service/testing/TestingService.java | 69 ++++++++++++++++--- 4 files changed, 90 insertions(+), 28 deletions(-) create mode 100644 gui-backend/src/main/java/eu/melodic/upperware/guibackend/controller/testing/response/TestConfigurationResponse.java delete mode 100644 gui-backend/src/main/java/eu/melodic/upperware/guibackend/controller/testing/response/UploadTestConfigResponse.java diff --git a/gui-backend/src/main/java/eu/melodic/upperware/guibackend/controller/testing/TestingController.java b/gui-backend/src/main/java/eu/melodic/upperware/guibackend/controller/testing/TestingController.java index e51d9777f..e1360c1b7 100644 --- a/gui-backend/src/main/java/eu/melodic/upperware/guibackend/controller/testing/TestingController.java +++ b/gui-backend/src/main/java/eu/melodic/upperware/guibackend/controller/testing/TestingController.java @@ -1,7 +1,7 @@ package eu.melodic.upperware.guibackend.controller.testing; import eu.melodic.upperware.guibackend.communication.testingtool.FunctionizerTestingToolApi; -import eu.melodic.upperware.guibackend.controller.testing.response.UploadTestConfigResponse; +import eu.melodic.upperware.guibackend.controller.testing.response.TestConfigurationResponse; import eu.melodic.upperware.guibackend.service.testing.TestingService; import eu.passage.upperware.commons.model.testing.FunctionizerTestResult; import lombok.AllArgsConstructor; @@ -20,22 +20,35 @@ public class TestingController { TestingService testingService; FunctionizerTestingToolApi functionizerTestApi; - @PostMapping(value = "/upload", consumes = {"multipart/form-data"}) + @PostMapping(value = "/config", consumes = {"multipart/form-data"}) @ResponseStatus(HttpStatus.CREATED) - public UploadTestConfigResponse uploadTestConfigFile(@RequestParam("file") MultipartFile file) { + public TestConfigurationResponse uploadTestConfigFile(@RequestParam("file") MultipartFile file) { String originalName = file.getResource().getFilename(); log.info( "POST request for upload test configuration file with name: {}", originalName ); - String fileName = testingService.uploadTestConfig(file); - log.info("File {} successfully uploaded.", originalName); - return testingService.createUploadTestConfigResponse(fileName); + return testingService.uploadTestConfig(file); + } + + @GetMapping(value = "/config") + @ResponseStatus(HttpStatus.OK) + public TestConfigurationResponse getTestConfigResponse() { + log.info("GET request for the test configuration"); + return testingService.getTestConfiguration(); + } + + @DeleteMapping(value = "/config") + @ResponseStatus(HttpStatus.OK) + public void deleteTestConfigFile() { + log.info("DELETE request for deleting the test configuration file"); + testingService.removeTestConfigFile(); } @PostMapping(value = "/run") @ResponseStatus(HttpStatus.OK) public FunctionizerTestResult runTests(@RequestHeader(value = HttpHeaders.AUTHORIZATION) String token) { + log.info("POST request for running the tests"); return functionizerTestApi.runTests(token); } } diff --git a/gui-backend/src/main/java/eu/melodic/upperware/guibackend/controller/testing/response/TestConfigurationResponse.java b/gui-backend/src/main/java/eu/melodic/upperware/guibackend/controller/testing/response/TestConfigurationResponse.java new file mode 100644 index 000000000..651df4997 --- /dev/null +++ b/gui-backend/src/main/java/eu/melodic/upperware/guibackend/controller/testing/response/TestConfigurationResponse.java @@ -0,0 +1,12 @@ +package eu.melodic.upperware.guibackend.controller.testing.response; + +import eu.passage.upperware.commons.model.testing.TestConfiguration; +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class TestConfigurationResponse { + private String path; + private TestConfiguration configuration; +} diff --git a/gui-backend/src/main/java/eu/melodic/upperware/guibackend/controller/testing/response/UploadTestConfigResponse.java b/gui-backend/src/main/java/eu/melodic/upperware/guibackend/controller/testing/response/UploadTestConfigResponse.java deleted file mode 100644 index d16aa9cf1..000000000 --- a/gui-backend/src/main/java/eu/melodic/upperware/guibackend/controller/testing/response/UploadTestConfigResponse.java +++ /dev/null @@ -1,12 +0,0 @@ -package eu.melodic.upperware.guibackend.controller.testing.response; - -import lombok.*; - -@Getter -@Setter -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class UploadTestConfigResponse { - private String testConfigFilePath; -} diff --git a/gui-backend/src/main/java/eu/melodic/upperware/guibackend/service/testing/TestingService.java b/gui-backend/src/main/java/eu/melodic/upperware/guibackend/service/testing/TestingService.java index aa3e7a715..cbad19c11 100644 --- a/gui-backend/src/main/java/eu/melodic/upperware/guibackend/service/testing/TestingService.java +++ b/gui-backend/src/main/java/eu/melodic/upperware/guibackend/service/testing/TestingService.java @@ -1,6 +1,6 @@ package eu.melodic.upperware.guibackend.service.testing; -import eu.melodic.upperware.guibackend.controller.testing.response.UploadTestConfigResponse; +import eu.melodic.upperware.guibackend.controller.testing.response.TestConfigurationResponse; import eu.passage.upperware.commons.MelodicConstants; import eu.passage.upperware.commons.model.testing.FunctionTestConfiguration; import eu.passage.upperware.commons.model.testing.TestConfiguration; @@ -29,7 +29,7 @@ import static eu.passage.upperware.commons.service.testing.TestConfigurationVali public class TestingService { private final static String CONFIG_FILE_PATH = MelodicConstants.TEST_CONFIG_FILE_DIR + "/tests.yml"; - public String uploadTestConfig(MultipartFile uploadFileRequest) { + public TestConfigurationResponse uploadTestConfig(MultipartFile uploadFileRequest) { try { if (uploadFileRequest.getOriginalFilename() == null) { throw new ResponseStatusException( @@ -42,15 +42,17 @@ public class TestingService { if (!newFile.exists()) { newFile.getParentFile().mkdirs(); } - validate(uploadFileRequest.getInputStream()); + TestConfiguration configuration = loadAndValidateTestConfiguration( + uploadFileRequest.getInputStream() + ); uploadFileRequest.transferTo(newFile); log.info( - "File {} will be stored under path: {}", + "File {} successfully stored under path: {}", uploadFileRequest.getResource().getFilename(), CONFIG_FILE_PATH ); - return CONFIG_FILE_PATH; + return createTestConfigResponse(configuration); } catch (IOException | IllegalStateException e) { log.error("Error by uploading test configuration file:", e); @@ -63,21 +65,67 @@ public class TestingService { log.error("Error by uploading test configuration file:", e); throw new ResponseStatusException( HttpStatus.BAD_REQUEST, - String.format("Problem by uploading your %s file. CDO repository not working. Please try again.", + String.format( + "Problem by uploading your %s file. CDO repository not working." + + " Please try again.", uploadFileRequest.getResource().getFilename() )); } } - public UploadTestConfigResponse createUploadTestConfigResponse(String fileName) { - return new UploadTestConfigResponse(fileName); + public TestConfigurationResponse getTestConfiguration() { + File configFile = new File(CONFIG_FILE_PATH); + InputStream ymlFileInputStream; + try { + ymlFileInputStream = new FileInputStream(configFile); + } catch (FileNotFoundException e) { + throw new ResponseStatusException( + HttpStatus.NOT_FOUND, + "Test configuration file not found on server." + ); + } + TestConfiguration testConfiguration = loadTestConfiguration(ymlFileInputStream); + return createTestConfigResponse(testConfiguration); + } + + public void removeTestConfigFile() { + File configFile = new File(CONFIG_FILE_PATH); + if (!configFile.exists()) { + log.info("No file to delete. Ending"); + return; + } + if (configFile.delete()) { + log.info("Successfully removed file {}", configFile.getName()); + } else { + log.error("Error while deleting test configuration file."); + throw new ResponseStatusException( + HttpStatus.BAD_REQUEST, + String.format("Could not remove file %s.", configFile.getName()) + ); + } + } + + public TestConfigurationResponse createTestConfigResponse(TestConfiguration configuration) { + return new TestConfigurationResponse(CONFIG_FILE_PATH, configuration); } - private void validate(InputStream ymlFileInputStream) throws ResponseStatusException { + private TestConfiguration loadTestConfiguration(InputStream ymlFileInputStream) { Yaml yaml = new Yaml(new Constructor(TestConfiguration.class)); + try { + return yaml.load(ymlFileInputStream); + } catch (ConstructorException e) { + String errorMessage = "The file has a bad format and could not be parsed."; + log.error(errorMessage); + throw new ResponseStatusException(HttpStatus.BAD_REQUEST, errorMessage); + } + } + + private TestConfiguration loadAndValidateTestConfiguration( + InputStream ymlFileInputStream + ) throws ResponseStatusException { TestConfiguration configuration; try { - configuration = yaml.load(ymlFileInputStream); + configuration = loadTestConfiguration(ymlFileInputStream); log.info("Checking uniqueness of function names"); checkFunctionNamesUniqueness(configuration.getTests()); @@ -98,5 +146,6 @@ public class TestingService { ) { throw new ResponseStatusException(HttpStatus.BAD_REQUEST, e.getMessage()); } + return configuration; } } -- GitLab From 8e277cd3a7d7830661c5040c4167fb92a8f5c56b Mon Sep 17 00:00:00 2001 From: mczaplicka Date: Tue, 21 Jul 2020 16:51:43 +0200 Subject: [PATCH 5/7] ftt: fix the issue with cloudiator-related beans --- .../melodic/upperware/guibackend/ApplicationContext.java | 8 ++++++++ .../upperware/commons/cloudiator/CloudiatorClientApi.java | 5 +---- .../upperware/commons/cloudiator/QueueInspector.java | 6 +----- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/gui-backend/src/main/java/eu/melodic/upperware/guibackend/ApplicationContext.java b/gui-backend/src/main/java/eu/melodic/upperware/guibackend/ApplicationContext.java index 7b77406c2..2b1a3da8f 100644 --- a/gui-backend/src/main/java/eu/melodic/upperware/guibackend/ApplicationContext.java +++ b/gui-backend/src/main/java/eu/melodic/upperware/guibackend/ApplicationContext.java @@ -76,6 +76,14 @@ public class ApplicationContext { return new MonitoringApi(apiClient); } + @Bean + public QueueInspector queueInspector( + QueueApi queueApi, + CloudiatorProperties cloudiatorProperties + ) { + return new QueueInspector(queueApi, cloudiatorProperties); + } + @Bean public CloudiatorApi cloudiatorApi( CloudApi cloudApi, diff --git a/melodic-commons/src/main/java/eu/passage/upperware/commons/cloudiator/CloudiatorClientApi.java b/melodic-commons/src/main/java/eu/passage/upperware/commons/cloudiator/CloudiatorClientApi.java index e4fda2b91..9606a5a13 100644 --- a/melodic-commons/src/main/java/eu/passage/upperware/commons/cloudiator/CloudiatorClientApi.java +++ b/melodic-commons/src/main/java/eu/passage/upperware/commons/cloudiator/CloudiatorClientApi.java @@ -7,9 +7,7 @@ import io.github.cloudiator.rest.model.*; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.ListUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; -import org.springframework.stereotype.Service; import org.springframework.web.server.ResponseStatusException; import javax.ws.rs.NotFoundException; @@ -17,8 +15,7 @@ import java.util.List; import java.util.stream.Collectors; @Slf4j -@Service -@AllArgsConstructor(onConstructor = @__({@Autowired})) +@AllArgsConstructor public class CloudiatorClientApi implements CloudiatorApi { private CloudApi cloudApi; diff --git a/melodic-commons/src/main/java/eu/passage/upperware/commons/cloudiator/QueueInspector.java b/melodic-commons/src/main/java/eu/passage/upperware/commons/cloudiator/QueueInspector.java index 2fad9481d..6987ad94f 100644 --- a/melodic-commons/src/main/java/eu/passage/upperware/commons/cloudiator/QueueInspector.java +++ b/melodic-commons/src/main/java/eu/passage/upperware/commons/cloudiator/QueueInspector.java @@ -1,20 +1,16 @@ package eu.passage.upperware.commons.cloudiator; -import eu.passage.upperware.commons.cloudiator.CloudiatorProperties; import io.github.cloudiator.rest.ApiException; import io.github.cloudiator.rest.api.QueueApi; import io.github.cloudiator.rest.model.Queue; import io.github.cloudiator.rest.model.QueueStatus; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; -import org.springframework.stereotype.Service; import org.springframework.web.server.ResponseStatusException; @Slf4j -@Service -@AllArgsConstructor(onConstructor = @__({@Autowired})) +@AllArgsConstructor public class QueueInspector { private QueueApi queueApi; -- GitLab From 1b16526c33de7a6ac3a89f4366b6744075e76c2d Mon Sep 17 00:00:00 2001 From: mczaplicka Date: Thu, 23 Jul 2020 14:47:08 +0200 Subject: [PATCH 6/7] ftt: log message adjustment --- .../service/provider/AWSLambdaService.java | 3 ++- .../service/provider/AzureFunctionsService.java | 2 +- .../service/testing/TestConfigurationValidationService.java | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/service/provider/AWSLambdaService.java b/functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/service/provider/AWSLambdaService.java index 29ede107f..d7280b7a0 100644 --- a/functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/service/provider/AWSLambdaService.java +++ b/functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/service/provider/AWSLambdaService.java @@ -88,8 +88,9 @@ public class AWSLambdaService extends TestPreparationService { TestCase testCase ) { log.debug( - "Creating test case: event={}, expected output={}", + "Creating test case: event={}, condition={}, expected value={}", testCase.getEvent(), + testCase.getCondition().name(), testCase.getExpectedValue() ); diff --git a/functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/service/provider/AzureFunctionsService.java b/functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/service/provider/AzureFunctionsService.java index 22911bd1d..932805f72 100644 --- a/functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/service/provider/AzureFunctionsService.java +++ b/functionizer-testing-tool/src/main/java/eu/functionizer/functionizertestingtool/service/provider/AzureFunctionsService.java @@ -146,7 +146,7 @@ public class AzureFunctionsService extends TestPreparationService { TestCase testCase ) { log.debug( - "Creating test case: event={}, condition={} expected output={}", + "Creating test case: event={}, condition={} expected value={}", testCase.getEvent(), testCase.getCondition().name(), testCase.getExpectedValue() diff --git a/melodic-commons/src/main/java/eu/passage/upperware/commons/service/testing/TestConfigurationValidationService.java b/melodic-commons/src/main/java/eu/passage/upperware/commons/service/testing/TestConfigurationValidationService.java index 729cb5bd3..cbe057d4a 100644 --- a/melodic-commons/src/main/java/eu/passage/upperware/commons/service/testing/TestConfigurationValidationService.java +++ b/melodic-commons/src/main/java/eu/passage/upperware/commons/service/testing/TestConfigurationValidationService.java @@ -51,7 +51,7 @@ public class TestConfigurationValidationService { this.condition = condition; this.expected = expected; this.message = String.format( - "The triplet of event = '%s', comparison = %s, expected output = '%s'" + + "The triplet of event = '%s', condition = %s, expected value = '%s'" + " appears in more than one test case of function '%s'." + " Please adjust the test cases to be unique.", this.event, -- GitLab From 1afef236da9958ddde3af1fd2c2055a3904728f9 Mon Sep 17 00:00:00 2001 From: mczaplicka Date: Mon, 27 Jul 2020 10:21:10 +0200 Subject: [PATCH 7/7] ftt: review adjustments --- .../guibackend/service/cdo/CdoService.java | 1 - .../service/testing/TestingService.java | 23 ++++++++----------- .../model/testing/FunctionTestResult.java | 4 ++-- .../commons/model/testing/TestCase.java | 2 +- 4 files changed, 12 insertions(+), 18 deletions(-) diff --git a/gui-backend/src/main/java/eu/melodic/upperware/guibackend/service/cdo/CdoService.java b/gui-backend/src/main/java/eu/melodic/upperware/guibackend/service/cdo/CdoService.java index 51ab65315..43858d6b8 100644 --- a/gui-backend/src/main/java/eu/melodic/upperware/guibackend/service/cdo/CdoService.java +++ b/gui-backend/src/main/java/eu/melodic/upperware/guibackend/service/cdo/CdoService.java @@ -37,7 +37,6 @@ import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.stream.Collectors; -import java.util.stream.Stream; @Service @Slf4j diff --git a/gui-backend/src/main/java/eu/melodic/upperware/guibackend/service/testing/TestingService.java b/gui-backend/src/main/java/eu/melodic/upperware/guibackend/service/testing/TestingService.java index cbad19c11..b759b4dcc 100644 --- a/gui-backend/src/main/java/eu/melodic/upperware/guibackend/service/testing/TestingService.java +++ b/gui-backend/src/main/java/eu/melodic/upperware/guibackend/service/testing/TestingService.java @@ -7,7 +7,6 @@ import eu.passage.upperware.commons.model.testing.TestConfiguration; import eu.passage.upperware.commons.service.testing.TestConfigurationValidationService; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.eclipse.net4j.connector.ConnectorException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; @@ -17,7 +16,12 @@ import org.yaml.snakeyaml.Yaml; import org.yaml.snakeyaml.constructor.Constructor; import org.yaml.snakeyaml.constructor.ConstructorException; -import java.io.*; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.InputStream; +import java.io.IOException; import static eu.passage.upperware.commons.service.testing.TestConfigurationValidationService.checkFunctionNamesUniqueness; import static eu.passage.upperware.commons.service.testing.TestConfigurationValidationService.checkTestCasesUniqueness; @@ -61,15 +65,6 @@ public class TestingService { String.format("Problem by uploading your %s file. Please try again.", uploadFileRequest.getResource().getFilename() )); - } catch (ConnectorException e) { - log.error("Error by uploading test configuration file:", e); - throw new ResponseStatusException( - HttpStatus.BAD_REQUEST, - String.format( - "Problem by uploading your %s file. CDO repository not working." + - " Please try again.", - uploadFileRequest.getResource().getFilename() - )); } } @@ -105,7 +100,7 @@ public class TestingService { } } - public TestConfigurationResponse createTestConfigResponse(TestConfiguration configuration) { + private TestConfigurationResponse createTestConfigResponse(TestConfiguration configuration) { return new TestConfigurationResponse(CONFIG_FILE_PATH, configuration); } @@ -114,7 +109,7 @@ public class TestingService { try { return yaml.load(ymlFileInputStream); } catch (ConstructorException e) { - String errorMessage = "The file has a bad format and could not be parsed."; + String errorMessage = "The file has a bad structure and could not be parsed."; log.error(errorMessage); throw new ResponseStatusException(HttpStatus.BAD_REQUEST, errorMessage); } @@ -137,7 +132,7 @@ public class TestingService { ); } } catch (ConstructorException e) { - String errorMessage = "The file has a bad format and could not be parsed."; + String errorMessage = "The file has a bad structure and could not be parsed."; log.error(errorMessage); throw new ResponseStatusException(HttpStatus.BAD_REQUEST, errorMessage); } catch ( diff --git a/melodic-commons/src/main/java/eu/passage/upperware/commons/model/testing/FunctionTestResult.java b/melodic-commons/src/main/java/eu/passage/upperware/commons/model/testing/FunctionTestResult.java index ba98e2728..759b8293e 100644 --- a/melodic-commons/src/main/java/eu/passage/upperware/commons/model/testing/FunctionTestResult.java +++ b/melodic-commons/src/main/java/eu/passage/upperware/commons/model/testing/FunctionTestResult.java @@ -1,12 +1,14 @@ package eu.passage.upperware.commons.model.testing; import lombok.Data; +import lombok.NoArgsConstructor; import java.util.ArrayList; import java.util.List; @Data +@NoArgsConstructor public class FunctionTestResult { private String functionName; private double duration; @@ -18,8 +20,6 @@ public class FunctionTestResult { private String failedAtStage; private String message; - public FunctionTestResult() {} - public FunctionTestResult(String functionName) { this.functionName = functionName; this.testCaseResults = new ArrayList<>(); diff --git a/melodic-commons/src/main/java/eu/passage/upperware/commons/model/testing/TestCase.java b/melodic-commons/src/main/java/eu/passage/upperware/commons/model/testing/TestCase.java index 04699e519..b2e014a36 100644 --- a/melodic-commons/src/main/java/eu/passage/upperware/commons/model/testing/TestCase.java +++ b/melodic-commons/src/main/java/eu/passage/upperware/commons/model/testing/TestCase.java @@ -6,7 +6,7 @@ import lombok.Data; public class TestCase { private String functionName; private String event; - private Condition Condition; + private Condition condition; private String expectedValue; private String region; } -- GitLab