Search in sources :

Example 1 with TestResult

use of org.finos.legend.engine.test.runner.shared.TestResult in project legend-engine by finos.

the class ServiceTestRunner method executeTestAsserts.

@Prometheus(name = "service test execute", doc = "Execution duration summary within service test execution")
private RichServiceTestResult executeTestAsserts(SingleExecutionPlan executionPlan, List<TestContainer> asserts, RichIterable<? extends String> sqlStatements, Scope scope) throws IOException {
    long start = System.currentTimeMillis();
    if (ExecutionNodeTDSResultHelper.isResultTDS(executionPlan.rootExecutionNode) || (executionPlan.rootExecutionNode.isResultPrimitiveType() && "String".equals(executionPlan.rootExecutionNode.getDataTypeResultType()))) {
        // Java
        String packageName = "org.finos.legend.tests.generated";
        String className = "TestSuite";
        String javaCode = ServiceTestGenerationHelper.generateJavaForAsserts(asserts, this.service, this.pureModel, packageName, className);
        Class<?> assertsClass;
        RichServiceTestResult testRun;
        try {
            assertsClass = compileJavaForAsserts(packageName, className, javaCode);
        } catch (JavaCompileException e) {
            MetricsHandler.incrementErrorCount("test_execute", 0);
            throw new RuntimeException("Error compiling test asserts for " + this.service.getPath(), e);
        }
        scope.span().log("Java asserts generated and compiled");
        TestExecutionScope execScope = null;
        try {
            // Setup test database if needed
            if (sqlStatements != null) {
                execScope = TestExecutionScope.setupTestServer(sqlStatements, scope);
            }
            // Run tests
            Map<String, TestResult> results = Maps.mutable.empty();
            Map<String, Exception> assertExceptions = Maps.mutable.empty();
            for (Pair<TestContainer, Integer> tc : LazyIterate.zipWithIndex(asserts)) {
                // Build Param Map
                Map<String, Result> parameters = Maps.mutable.empty();
                if (this.service.execution instanceof PureExecution) {
                    parameters = ListIterate.zip(((PureExecution) this.service.execution).func.parameters, tc.getOne().parametersValues).toMap(p -> p.getOne().name, p -> // Condition evoked in case of studio-flow
                    p.getTwo() instanceof Collection ? new ConstantResult(ListIterate.collect(((Collection) p.getTwo()).values, v -> v.accept(new ValueSpecificationToResultVisitor()).getValue())) : // Condition evoked in case of pureIDE-flow
                    p.getTwo() instanceof PureList ? new ConstantResult(ListIterate.collect(((PureList) p.getTwo()).values, v -> v.accept(new ValueSpecificationToResultVisitor()).getValue())) : p.getTwo().accept(new ValueSpecificationToResultVisitor()));
                }
                // Execute Plan
                ExecutionState testExecutionState = new ExecutionState(parameters, Lists.mutable.withAll(executionPlan.templateFunctions), Lists.mutable.with(new RelationalStoreExecutionState(new RelationalStoreState(execScope == null ? -1 : execScope.getPort())), new InMemoryStoreExecutionState(new InMemoryStoreState()), new ServiceStoreExecutionState(new ServiceStoreState())));
                Result result = this.executor.execute(executionPlan, testExecutionState, null, null);
                org.finos.legend.pure.m3.coreinstance.meta.pure.mapping.Result<Object> pureResult = result.accept(new ResultToPureResultVisitor());
                // Execute Assert
                String testName = ServiceTestGenerationHelper.getAssertMethodName(tc.getTwo());
                scope.span().setTag(testName, resultToString(pureResult, this.pureModel.getExecutionSupport()));
                TestResult testResult;
                try {
                    Boolean assertResult = (Boolean) assertsClass.getMethod(testName, org.finos.legend.pure.m3.coreinstance.meta.pure.mapping.Result.class, ExecutionSupport.class).invoke(null, pureResult, pureModel.getExecutionSupport());
                    testResult = assertResult ? TestResult.SUCCESS : TestResult.FAILURE;
                    scope.span().setTag(testName + "_assert", assertResult);
                } catch (Exception e) {
                    StringWriter out = new StringWriter();
                    PrintWriter writer = new PrintWriter(out);
                    e.printStackTrace(writer);
                    e.printStackTrace();
                    testResult = TestResult.ERROR;
                    assertExceptions.put(testName, e);
                    scope.span().setTag(testName + "_assert", out.toString());
                }
                results.put(testName, testResult);
            }
            testRun = new RichServiceTestResult(service.getPath(), results, assertExceptions, null, executionPlan, javaCode);
            scope.span().log("Finished running tests " + results);
            MetricsHandler.observeServerOperation("test_execute", metricsContext, start, System.currentTimeMillis());
        } catch (Exception e) {
            LOGGER.error("Error running tests", e);
            MetricsHandler.incrementErrorCount("test_execute", 0);
            throw (e instanceof RuntimeException) ? (RuntimeException) e : new RuntimeException(e);
        } finally {
            if (execScope != null) {
                execScope.close();
            }
            MetricsHandler.observe("service test execute", start, System.currentTimeMillis());
        }
        return testRun;
    } else {
        return new RichServiceTestResult(this.service.getPath(), Collections.emptyMap(), Collections.emptyMap(), null, executionPlan, "");
    }
}
Also used : ServiceStoreState(org.finos.legend.engine.plan.execution.stores.service.plugin.ServiceStoreState) KeyedSingleExecutionTest(org.finos.legend.engine.protocol.pure.v1.model.packageableElement.service.KeyedSingleExecutionTest) MultiExecutionTest(org.finos.legend.engine.protocol.pure.v1.model.packageableElement.service.MultiExecutionTest) ExecutionNodeTDSResultHelper(org.finos.legend.engine.plan.execution.nodes.helpers.ExecutionNodeTDSResultHelper) LoggerFactory(org.slf4j.LoggerFactory) TestResult(org.finos.legend.engine.test.runner.shared.TestResult) Runtime(org.finos.legend.engine.protocol.pure.v1.model.packageableElement.runtime.Runtime) Root_meta_legend_service_metamodel_Service(org.finos.legend.pure.generated.Root_meta_legend_service_metamodel_Service) MutableList(org.eclipse.collections.api.list.MutableList) Maps(org.eclipse.collections.api.factory.Maps) EngineRuntime(org.finos.legend.engine.protocol.pure.v1.model.packageableElement.runtime.EngineRuntime) RichIterable(org.eclipse.collections.api.RichIterable) PlanExecutor(org.finos.legend.engine.plan.execution.PlanExecutor) PureModelContextData(org.finos.legend.engine.protocol.pure.v1.model.context.PureModelContextData) Map(java.util.Map) ConstantResult(org.finos.legend.engine.plan.execution.result.ConstantResult) LegacyRuntime(org.finos.legend.engine.protocol.pure.v1.model.packageableElement.runtime.LegacyRuntime) Root_meta_legend_service_metamodel_SingleExecutionTest(org.finos.legend.pure.generated.Root_meta_legend_service_metamodel_SingleExecutionTest) ServiceStoreExecutionState(org.finos.legend.engine.plan.execution.stores.service.plugin.ServiceStoreExecutionState) PlanTransformer(org.finos.legend.engine.plan.generation.transformers.PlanTransformer) PrintWriter(java.io.PrintWriter) PureModel(org.finos.legend.engine.language.pure.compiler.toPureGraph.PureModel) ServiceExecutionExtension(org.finos.legend.engine.language.pure.dsl.service.generation.extension.ServiceExecutionExtension) Prometheus(org.finos.legend.engine.shared.core.operational.prometheus.Prometheus) SingleExecutionPlan(org.finos.legend.engine.protocol.pure.v1.model.executionPlan.SingleExecutionPlan) ServiceLoader(java.util.ServiceLoader) Iterate(org.eclipse.collections.impl.utility.Iterate) InMemoryStoreExecutionState(org.finos.legend.engine.plan.execution.stores.inMemory.plugin.InMemoryStoreExecutionState) Root_meta_pure_router_extension_RouterExtension(org.finos.legend.pure.generated.Root_meta_pure_router_extension_RouterExtension) Objects(java.util.Objects) ServiceTest(org.finos.legend.engine.protocol.pure.v1.model.packageableElement.service.ServiceTest) RelationalDatabaseConnection(org.finos.legend.engine.protocol.pure.v1.model.packageableElement.store.relational.connection.RelationalDatabaseConnection) List(java.util.List) JavaCompileException(org.finos.legend.engine.shared.javaCompiler.JavaCompileException) PackageableElement(org.finos.legend.pure.m3.coreinstance.meta.pure.metamodel.PackageableElement) SingleExecutionTest(org.finos.legend.engine.protocol.pure.v1.model.packageableElement.service.SingleExecutionTest) Service(org.finos.legend.engine.protocol.pure.v1.model.packageableElement.service.Service) ObjectMapperFactory(org.finos.legend.engine.shared.core.ObjectMapperFactory) TestContainer(org.finos.legend.engine.protocol.pure.v1.model.packageableElement.service.TestContainer) Optional(java.util.Optional) Scope(io.opentracing.Scope) PureList(org.finos.legend.engine.protocol.pure.v1.model.valueSpecification.raw.PureList) InMemoryStoreState(org.finos.legend.engine.plan.execution.stores.inMemory.plugin.InMemoryStoreState) Assert(org.finos.legend.engine.shared.core.operational.Assert) ExecutionState(org.finos.legend.engine.plan.execution.nodes.state.ExecutionState) KeyedExecutionParameter(org.finos.legend.engine.protocol.pure.v1.model.packageableElement.service.KeyedExecutionParameter) Lists(org.eclipse.collections.api.factory.Lists) TestExecutionScope(org.finos.legend.engine.plan.execution.stores.relational.TestExecutionScope) PlanPlatform(org.finos.legend.engine.plan.platform.PlanPlatform) MutableMap(org.eclipse.collections.api.map.MutableMap) ServicePlanGenerator(org.finos.legend.engine.language.pure.dsl.service.generation.ServicePlanGenerator) JavaHelper(org.finos.legend.engine.plan.execution.nodes.helpers.platform.JavaHelper) Pair(org.eclipse.collections.api.tuple.Pair) MetricsHandler(org.finos.legend.engine.shared.core.operational.prometheus.MetricsHandler) Execution(org.finos.legend.engine.protocol.pure.v1.model.packageableElement.service.Execution) Result(org.finos.legend.engine.plan.execution.result.Result) RelationalStoreExecutionState(org.finos.legend.engine.plan.execution.stores.relational.plugin.RelationalStoreExecutionState) Logger(org.slf4j.Logger) StringWriter(java.io.StringWriter) ObjectMapper(com.fasterxml.jackson.databind.ObjectMapper) EngineJavaCompiler(org.finos.legend.engine.shared.javaCompiler.EngineJavaCompiler) GlobalTracer(io.opentracing.util.GlobalTracer) IOException(java.io.IOException) RelationalStoreState(org.finos.legend.engine.plan.execution.stores.relational.plugin.RelationalStoreState) ListIterate(org.eclipse.collections.impl.utility.ListIterate) Collection(org.finos.legend.engine.protocol.pure.v1.model.valueSpecification.raw.Collection) PureMultiExecution(org.finos.legend.engine.protocol.pure.v1.model.packageableElement.service.PureMultiExecution) ExecutionSupport(org.finos.legend.pure.m3.execution.ExecutionSupport) LazyIterate(org.eclipse.collections.impl.utility.LazyIterate) PureSingleExecution(org.finos.legend.engine.protocol.pure.v1.model.packageableElement.service.PureSingleExecution) ExecutionPlan(org.finos.legend.engine.protocol.pure.v1.model.executionPlan.ExecutionPlan) LocalH2DatasourceSpecification(org.finos.legend.engine.protocol.pure.v1.model.packageableElement.store.relational.connection.specification.LocalH2DatasourceSpecification) PureExecution(org.finos.legend.engine.protocol.pure.v1.model.packageableElement.service.PureExecution) Class(java.lang.Class) StringJavaSource(org.finos.legend.engine.shared.javaCompiler.StringJavaSource) Collections(java.util.Collections) org.finos.legend.pure.generated.core_relational_relational_helperFunctions_helperFunctions(org.finos.legend.pure.generated.core_relational_relational_helperFunctions_helperFunctions) ServiceStoreExecutionState(org.finos.legend.engine.plan.execution.stores.service.plugin.ServiceStoreExecutionState) InMemoryStoreExecutionState(org.finos.legend.engine.plan.execution.stores.inMemory.plugin.InMemoryStoreExecutionState) ExecutionState(org.finos.legend.engine.plan.execution.nodes.state.ExecutionState) RelationalStoreExecutionState(org.finos.legend.engine.plan.execution.stores.relational.plugin.RelationalStoreExecutionState) RelationalStoreExecutionState(org.finos.legend.engine.plan.execution.stores.relational.plugin.RelationalStoreExecutionState) InMemoryStoreExecutionState(org.finos.legend.engine.plan.execution.stores.inMemory.plugin.InMemoryStoreExecutionState) PureList(org.finos.legend.engine.protocol.pure.v1.model.valueSpecification.raw.PureList) TestResult(org.finos.legend.engine.test.runner.shared.TestResult) ConstantResult(org.finos.legend.engine.plan.execution.result.ConstantResult) Result(org.finos.legend.engine.plan.execution.result.Result) StringWriter(java.io.StringWriter) PrintWriter(java.io.PrintWriter) InMemoryStoreState(org.finos.legend.engine.plan.execution.stores.inMemory.plugin.InMemoryStoreState) TestContainer(org.finos.legend.engine.protocol.pure.v1.model.packageableElement.service.TestContainer) TestExecutionScope(org.finos.legend.engine.plan.execution.stores.relational.TestExecutionScope) ConstantResult(org.finos.legend.engine.plan.execution.result.ConstantResult) JavaCompileException(org.finos.legend.engine.shared.javaCompiler.JavaCompileException) TestResult(org.finos.legend.engine.test.runner.shared.TestResult) JavaCompileException(org.finos.legend.engine.shared.javaCompiler.JavaCompileException) IOException(java.io.IOException) ServiceStoreExecutionState(org.finos.legend.engine.plan.execution.stores.service.plugin.ServiceStoreExecutionState) ServiceStoreState(org.finos.legend.engine.plan.execution.stores.service.plugin.ServiceStoreState) Collection(org.finos.legend.engine.protocol.pure.v1.model.valueSpecification.raw.Collection) RelationalStoreState(org.finos.legend.engine.plan.execution.stores.relational.plugin.RelationalStoreState) PureExecution(org.finos.legend.engine.protocol.pure.v1.model.packageableElement.service.PureExecution) Prometheus(org.finos.legend.engine.shared.core.operational.prometheus.Prometheus)

Aggregations

ObjectMapper (com.fasterxml.jackson.databind.ObjectMapper)1 Scope (io.opentracing.Scope)1 GlobalTracer (io.opentracing.util.GlobalTracer)1 IOException (java.io.IOException)1 PrintWriter (java.io.PrintWriter)1 StringWriter (java.io.StringWriter)1 Class (java.lang.Class)1 Collections (java.util.Collections)1 List (java.util.List)1 Map (java.util.Map)1 Objects (java.util.Objects)1 Optional (java.util.Optional)1 ServiceLoader (java.util.ServiceLoader)1 RichIterable (org.eclipse.collections.api.RichIterable)1 Lists (org.eclipse.collections.api.factory.Lists)1 Maps (org.eclipse.collections.api.factory.Maps)1 MutableList (org.eclipse.collections.api.list.MutableList)1 MutableMap (org.eclipse.collections.api.map.MutableMap)1 Pair (org.eclipse.collections.api.tuple.Pair)1 Iterate (org.eclipse.collections.impl.utility.Iterate)1