Skip to content

Commit

Permalink
Script tests fixes so they are skipped when ECMAScript is not available.
Browse files Browse the repository at this point in the history
  • Loading branch information
virgo47 committed Sep 27, 2021
1 parent 9b6d550 commit 5c22752
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 33 deletions.
Original file line number Diff line number Diff line change
@@ -1,31 +1,28 @@
/*
* Copyright (c) 2010-2019 Evolveum and contributors
* Copyright (C) 2010-2021 Evolveum and contributors
*
* This work is dual-licensed under the Apache License 2.0
* and European Union Public License. See LICENSE file for details.
*/
package com.evolveum.midpoint.model.common.expression.script;

import java.util.Collection;

import javax.xml.bind.JAXBElement;
import javax.xml.namespace.QName;

import com.evolveum.midpoint.common.LocalizationService;
import com.evolveum.midpoint.prism.PrismContext;

import com.evolveum.midpoint.schema.SchemaConstantsGenerated;

import com.google.common.annotations.VisibleForTesting;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.evolveum.midpoint.common.LocalizationService;
import com.evolveum.midpoint.prism.ItemDefinition;
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.PrismValue;
import com.evolveum.midpoint.prism.crypto.Protector;
import com.evolveum.midpoint.repo.common.expression.AbstractAutowiredExpressionEvaluatorFactory;
import com.evolveum.midpoint.repo.common.expression.ExpressionEvaluator;
import com.evolveum.midpoint.repo.common.expression.ExpressionFactory;
import com.evolveum.midpoint.schema.SchemaConstantsGenerated;
import com.evolveum.midpoint.schema.expression.ExpressionProfile;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.security.api.SecurityContextManager;
Expand Down Expand Up @@ -66,7 +63,7 @@ public QName getElementName() {
}

@Override
public <V extends PrismValue,D extends ItemDefinition> ExpressionEvaluator<V> createEvaluator(Collection<JAXBElement<?>> evaluatorElements,
public <V extends PrismValue, D extends ItemDefinition> ExpressionEvaluator<V> createEvaluator(Collection<JAXBElement<?>> evaluatorElements,
D outputDefinition, ExpressionProfile expressionProfile, ExpressionFactory expressionFactory, String contextDescription, Task task, OperationResult result) throws SchemaException, SecurityViolationException {

// TODO is output definition required to be non-null here, or it can be null?
Expand All @@ -79,4 +76,8 @@ public <V extends PrismValue,D extends ItemDefinition> ExpressionEvaluator<V> cr
return new ScriptExpressionEvaluator<>(ELEMENT_NAME, evaluatorBean, outputDefinition, protector, prismContext,
scriptExpression, securityContextManager, localizationService);
}

public ScriptExpressionFactory getScriptExpressionFactory() {
return scriptExpressionFactory;
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2013-2019 Evolveum and contributors
* Copyright (C) 2013-2021 Evolveum and contributors
*
* This work is dual-licensed under the Apache License 2.0
* and European Union Public License. See LICENSE file for details.
Expand All @@ -15,21 +15,27 @@
import javax.xml.namespace.QName;

import org.testng.AssertJUnit;
import org.testng.SkipException;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import org.xml.sax.SAXException;

import com.evolveum.midpoint.common.Clock;
import com.evolveum.midpoint.model.common.AbstractModelCommonTest;
import com.evolveum.midpoint.model.common.ConstantsManager;
import com.evolveum.midpoint.model.common.expression.script.ScriptExpressionEvaluatorFactory;
import com.evolveum.midpoint.prism.*;
import com.evolveum.midpoint.prism.crypto.Protector;
import com.evolveum.midpoint.prism.delta.PrismValueDeltaSetTriple;
import com.evolveum.midpoint.prism.util.PrismTestUtil;
import com.evolveum.midpoint.repo.common.DirectoryFileObjectResolver;
import com.evolveum.midpoint.repo.common.ObjectResolver;
import com.evolveum.midpoint.repo.common.expression.*;
import com.evolveum.midpoint.repo.common.expression.Expression;
import com.evolveum.midpoint.repo.common.expression.ExpressionEvaluationContext;
import com.evolveum.midpoint.repo.common.expression.ExpressionFactory;
import com.evolveum.midpoint.repo.common.expression.Source;
import com.evolveum.midpoint.schema.MidPointPrismContextFactory;
import com.evolveum.midpoint.schema.SchemaConstantsGenerated;
import com.evolveum.midpoint.schema.constants.ExpressionConstants;
import com.evolveum.midpoint.schema.constants.MidPointConstants;
import com.evolveum.midpoint.schema.expression.ExpressionProfile;
Expand Down Expand Up @@ -104,7 +110,8 @@ public void setup() throws SchemaException, SAXException, IOException {
Protector protector = ExpressionTestUtil.createInitializedProtector(prismContext);
Clock clock = new Clock();
constantsManager = new ConstantsManager();
expressionFactory = ExpressionTestUtil.createInitializedExpressionFactory(resolver, protector, prismContext, clock, null, null);
expressionFactory = ExpressionTestUtil.createInitializedExpressionFactory(
resolver, protector, prismContext, clock, null, null);

expressionProfile = compileExpressionProfile(getExpressionProfileName());
System.out.println("Using expression profile: " + expressionProfile);
Expand Down Expand Up @@ -152,8 +159,8 @@ public void test110Path() throws Exception {
ExpressionEvaluationContext expressionContext = new ExpressionEvaluationContext(sources, variables, getTestNameShort(), null);

// WHEN
PrismValueDeltaSetTriple<PrismPropertyValue<String>> outputTriple = evaluatePropertyExpression(expressionType, PrimitiveType.STRING, expressionContext,
result);
PrismValueDeltaSetTriple<PrismPropertyValue<String>> outputTriple =
evaluatePropertyExpression(expressionType, PrimitiveType.STRING, expressionContext, result);

// THEN
assertOutputTriple(outputTriple)
Expand Down Expand Up @@ -297,7 +304,8 @@ public void test154ScriptGroovySystemDeny() throws Exception {

@Test
public void test160ScriptJavaScript() throws Exception {
// GIVEN
skipIfEcmaScriptEngineNotSupported();
given();
OperationResult result = createOperationResult();

rememberScriptExecutionCount();
Expand All @@ -307,11 +315,11 @@ public void test160ScriptJavaScript() throws Exception {
VariablesMap variables = prepareBasicVariables();
ExpressionEvaluationContext expressionContext = new ExpressionEvaluationContext(sources, variables, getTestNameShort(), null);

// WHEN
when();
PrismValueDeltaSetTriple<PrismPropertyValue<String>> outputTriple =
evaluatePropertyExpression(expressionType, PrimitiveType.STRING, expressionContext, result);

// THEN
then();
assertOutputTriple(outputTriple)
.assertEmptyMinus()
.assertEmptyPlus()
Expand Down Expand Up @@ -368,7 +376,8 @@ protected ExpressionType parseExpression(File file) throws SchemaException, IOEx
}

protected Source<PrismPropertyValue<String>, PrismPropertyDefinition<String>> prepareStringSource() throws SchemaException {
PrismPropertyDefinition<String> propDef = prismContext.definitionFactory().createPropertyDefinition(ExpressionConstants.VAR_INPUT_QNAME, PrimitiveType.STRING.getQname());
PrismPropertyDefinition<String> propDef = prismContext.definitionFactory()
.createPropertyDefinition(ExpressionConstants.VAR_INPUT_QNAME, PrimitiveType.STRING.getQname());
PrismProperty<String> inputProp = prismContext.itemFactory().createProperty(ExpressionConstants.VAR_INPUT_QNAME, propDef);
PrismPropertyValue<String> pval = prismContext.itemFactory().createPropertyValue(INPUT_VALUE);
inputProp.add(pval);
Expand All @@ -393,25 +402,29 @@ protected VariablesMap prepareBasicVariables() throws SchemaException, IOExcepti
protected <V extends PrismValue, D extends ItemDefinition> PrismValueDeltaSetTriple<V> evaluateExpression(
ExpressionType expressionType, D outputDefinition, ExpressionEvaluationContext expressionContext,
OperationResult result)
throws SchemaException, ObjectNotFoundException, SecurityViolationException, ExpressionEvaluationException, CommunicationException, ConfigurationException {
throws SchemaException, ObjectNotFoundException, SecurityViolationException,
ExpressionEvaluationException, CommunicationException, ConfigurationException {
Expression<V, D> expression = expressionFactory.makeExpression(expressionType, outputDefinition, getExpressionProfile(),
expressionContext.getContextDescription(), expressionContext.getTask(), result);
logger.debug("Starting evaluation of expression: {}", expression);
return expression.evaluate(expressionContext, result);
}

protected <T> PrismValueDeltaSetTriple<PrismPropertyValue<T>> evaluatePropertyExpression(
ExpressionType expressionType, QName outputType, ExpressionEvaluationContext expressionContext, OperationResult result)
throws SchemaException, ObjectNotFoundException, SecurityViolationException, ExpressionEvaluationException, CommunicationException, ConfigurationException {
ExpressionType expressionType, QName outputType,
ExpressionEvaluationContext expressionContext, OperationResult result)
throws SchemaException, ObjectNotFoundException, SecurityViolationException,
ExpressionEvaluationException, CommunicationException, ConfigurationException {
PrismPropertyDefinition<T> outputDefinition = prismContext.definitionFactory().createPropertyDefinition(
ExpressionConstants.OUTPUT_ELEMENT_NAME, outputType);
return evaluateExpression(expressionType, outputDefinition, expressionContext, result);
}

protected <T> PrismValueDeltaSetTriple<PrismPropertyValue<T>> evaluatePropertyExpression(
ExpressionType expressionType, PrimitiveType outputType, ExpressionEvaluationContext expressionContext,
OperationResult result)
throws SchemaException, ObjectNotFoundException, SecurityViolationException, ExpressionEvaluationException, CommunicationException, ConfigurationException {
ExpressionType expressionType, PrimitiveType outputType,
ExpressionEvaluationContext expressionContext, OperationResult result)
throws SchemaException, ObjectNotFoundException, SecurityViolationException,
ExpressionEvaluationException, CommunicationException, ConfigurationException {
return evaluatePropertyExpression(expressionType, outputType.getQname(), expressionContext, result);
}

Expand Down Expand Up @@ -512,4 +525,17 @@ protected <V extends PrismValue> PrismValueDeltaSetTripleAsserter<V, Void> asser
asserter.display();
return asserter;
}

/**
* Newer JDK is not shipped with JavaScript/ECMAScript engine, we want to skip related tests.
*/
protected void skipIfEcmaScriptEngineNotSupported() {
ScriptExpressionEvaluatorFactory evaluatorFactory = (ScriptExpressionEvaluatorFactory)
expressionFactory.getEvaluatorFactory(SchemaConstantsGenerated.C_SCRIPT);
if (!evaluatorFactory.getScriptExpressionFactory().getEvaluators()
.containsKey("http://midpoint.evolveum.com/xml/ns/public/expression/language#ECMAScript")) {
display("Script engine for ECMAScript missing, skipping the tests.");
throw new SkipException("Script engine not available");
}
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2010-2019 Evolveum and contributors
* Copyright (C) 2010-2021 Evolveum and contributors
*
* This work is dual-licensed under the Apache License 2.0
* and European Union Public License. See LICENSE file for details.
Expand All @@ -17,6 +17,7 @@
import javax.xml.namespace.QName;

import org.testng.AssertJUnit;
import org.testng.SkipException;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.Test;
Expand All @@ -33,14 +34,14 @@
import com.evolveum.midpoint.prism.util.PrismTestUtil;
import com.evolveum.midpoint.repo.common.DirectoryFileObjectResolver;
import com.evolveum.midpoint.repo.common.ObjectResolver;
import com.evolveum.midpoint.schema.expression.VariablesMap;
import com.evolveum.midpoint.schema.AccessDecision;
import com.evolveum.midpoint.schema.MidPointPrismContextFactory;
import com.evolveum.midpoint.schema.constants.ExpressionConstants;
import com.evolveum.midpoint.schema.constants.MidPointConstants;
import com.evolveum.midpoint.schema.expression.ExpressionEvaluatorProfile;
import com.evolveum.midpoint.schema.expression.ExpressionProfile;
import com.evolveum.midpoint.schema.expression.ScriptExpressionProfile;
import com.evolveum.midpoint.schema.expression.VariablesMap;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.schema.util.MiscSchemaUtil;
import com.evolveum.midpoint.test.util.InfraTestMixin;
Expand Down Expand Up @@ -90,6 +91,11 @@ public void setupFactory() {
scriptExpressionfactory.setFunctions(functions);
localizationService = LocalizationTestUtil.getLocalizationService();
evaluator = createEvaluator(prismContext, protector);
if (!evaluator.isInitialized()) {
display("Script engine for " + evaluator.getLanguageName() + " missing, skipping the tests.");
throw new SkipException("Script engine not available");
}

String languageUrl = evaluator.getLanguageUrl();
display("Expression test for " + evaluator.getLanguageName() + ": registering " + evaluator + " with URL " + languageUrl);
scriptExpressionfactory.registerEvaluator(languageUrl, evaluator);
Expand Down Expand Up @@ -300,11 +306,9 @@ private <T> List<PrismPropertyValue<T>> evaluateExpression(
context.setResult(result);

List<PrismPropertyValue<T>> resultValues = scriptExpression.evaluate(context);
if (resultValues != null) {
for (PrismPropertyValue<T> resultVal : resultValues) {
if (resultVal.getParent() != null) {
AssertJUnit.fail("Result value " + resultVal + " from expression " + scriptExpression + " has parent");
}
for (PrismPropertyValue<T> resultVal : resultValues) {
if (resultVal.getParent() != null) {
AssertJUnit.fail("Result value " + resultVal + " from expression " + scriptExpression + " has parent");
}
}
return resultValues;
Expand Down Expand Up @@ -387,8 +391,8 @@ protected void evaluateAndAssertStringScalarExpressionRestricted(
}
}

private void evaluateAndAssertStringListExpression(String fileName, String testName,
VariablesMap variables, String... expectedValues)
private void evaluateAndAssertStringListExpression(
String fileName, String testName, VariablesMap variables, String... expectedValues)
throws ObjectNotFoundException, CommunicationException, SecurityViolationException,
SchemaException, IOException, ExpressionEvaluationException, ConfigurationException {
List<PrismPropertyValue<String>> expressionResultList =
Expand Down
2 changes: 1 addition & 1 deletion model/model-common/testng-unit.xml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
</test> -->
<test name="ExpressionConstruction" preserve-order="false">
<classes>
<!--<class name="com.evolveum.midpoint.model.common.expression.script.TestJavaScriptExpressions" />-->
<class name="com.evolveum.midpoint.model.common.expression.script.TestJavaScriptExpressions" />
<class name="com.evolveum.midpoint.model.common.expression.script.TestGroovyExpressions" />
<class name="com.evolveum.midpoint.model.common.expression.script.TestGroovyExpressionsSandbox" />
<class name="com.evolveum.midpoint.model.common.expression.script.TestPythonExpressions" />
Expand Down

0 comments on commit 5c22752

Please sign in to comment.