blob: d480d196df6216029df1b0a48ba09a3d66a63209 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2021 Contributors to the Eclipse Foundation
*
* See the NOTICE file(s) distributed with this work for additional
* information regarding copyright ownership.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* SPDX-License-Identifier: EPL-2.0
*******************************************************************************/
package org.eclipse.mdm.nodeprovider.control;
import static java.util.stream.Collectors.toList;
import static org.assertj.core.api.Assertions.assertThat;
import static org.eclipse.mdm.api.odsadapter.ODSContextFactory.PARAM_NAMESERVICE;
import static org.eclipse.mdm.api.odsadapter.ODSContextFactory.PARAM_PASSWORD;
import static org.eclipse.mdm.api.odsadapter.ODSContextFactory.PARAM_SERVICENAME;
import static org.eclipse.mdm.api.odsadapter.ODSContextFactory.PARAM_USER;
import static org.mockito.ArgumentMatchers.any;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.mdm.api.base.ConnectionException;
import org.eclipse.mdm.api.base.adapter.EntityType;
import org.eclipse.mdm.api.base.adapter.ModelManager;
import org.eclipse.mdm.api.base.model.Channel;
import org.eclipse.mdm.api.base.model.ChannelGroup;
import org.eclipse.mdm.api.base.model.Environment;
import org.eclipse.mdm.api.base.model.Measurement;
import org.eclipse.mdm.api.base.model.TestStep;
import org.eclipse.mdm.api.base.search.ContextState;
import org.eclipse.mdm.api.dflt.ApplicationContext;
import org.eclipse.mdm.api.dflt.model.Project;
import org.eclipse.mdm.api.odsadapter.ODSContextFactory;
import org.eclipse.mdm.connector.boundary.ConnectorService;
import org.eclipse.mdm.nodeprovider.entity.NodeLevel;
import org.eclipse.mdm.nodeprovider.entity.NodeProviderRoot;
import org.eclipse.mdm.nodeprovider.entity.SortAttribute;
import org.eclipse.mdm.nodeprovider.utils.SerializationUtil;
import org.eclipse.mdm.protobuf.Mdm.Node;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
import org.mockito.Mockito;
import com.google.common.collect.ImmutableMap;
import junit.framework.AssertionFailedError;
@Ignore
//FIXME 25.11.2020: this test needs a running ODS Server, that is not suitable for continous build in Jenkins.
//Comment this in for local tests only.
public class GenericNodeProviderTest {
/*
* ATTENTION: ==========
*
* To run this test make sure the target service is running a MDM default model
* and any database constraint which enforces a relation of Test to a parent
* entity is deactivated!
*/
private static final String NAME_SERVICE = "corbaloc::1.2@%s:%s/NameService";
private static final String USER = "sa";
private static final String PASSWORD = "sa";
private static ApplicationContext context;
@BeforeClass
public static void setUpBeforeClass() throws ConnectionException {
String nameServiceHost = System.getProperty("host");
String nameServicePort = System.getProperty("port");
String serviceName = System.getProperty("service");
if (nameServiceHost == null || nameServiceHost.isEmpty()) {
throw new IllegalArgumentException("name service host is unknown: define system property 'host'");
}
nameServicePort = nameServicePort == null || nameServicePort.isEmpty() ? String.valueOf(2809) : nameServicePort;
if (nameServicePort == null || nameServicePort.isEmpty()) {
throw new IllegalArgumentException("name service port is unknown: define system property 'port'");
}
if (serviceName == null || serviceName.isEmpty()) {
throw new IllegalArgumentException("service name is unknown: define system property 'service'");
}
Map<String, String> connectionParameters = new HashMap<>();
connectionParameters.put(PARAM_NAMESERVICE, String.format(NAME_SERVICE, nameServiceHost, nameServicePort));
connectionParameters.put(PARAM_SERVICENAME, serviceName + ".ASAM-ODS");
connectionParameters.put(PARAM_USER, USER);
connectionParameters.put(PARAM_PASSWORD, PASSWORD);
context = new ODSContextFactory().connect(connectionParameters);
}
@AfterClass
public static void tearDownAfterClass() throws ConnectionException {
if (context != null) {
context.close();
}
}
private NodeProviderRoot getNodeProviderRoot() {
NodeLevel nl = createStructure(context, ContextState.MEASURED);
NodeProviderRoot npr = new NodeProviderRoot();
npr.setId("generic_measured");
npr.setName("Measured");
npr.setContexts(ImmutableMap.of("*", nl));
return npr;
}
private GenericNodeProvider getGenericNodeProvider(NodeProviderRoot npr) {
ConnectorService connectorService = Mockito.mock(ConnectorService.class);
Mockito.when(connectorService.getContexts()).thenReturn(Arrays.asList(context));
Mockito.when(connectorService.getContextByName(any())).thenReturn(context);
MDMExpressionLanguageService elService = Mockito.mock(MDMExpressionLanguageService.class);
return new GenericNodeProvider(connectorService, npr, elService);
}
@Test
public void testGetRoots() {
GenericNodeProvider np = getGenericNodeProvider(getNodeProviderRoot());
assertThat(np.getRoots())
.containsExactly(SerializationUtil.createNode("NVHDEMO", "Environment", "1", "Id", "", "MDM-NVH"));
}
@Test
public void testGetChildren() {
GenericNodeProvider np = getGenericNodeProvider(getNodeProviderRoot());
List<Node> roots = np.getRoots();
List<Node> projects = np.getChildren(roots.get(0));
assertThat(projects).containsExactly(
SerializationUtil.createNode("NVHDEMO", "Project", "5", "Id", "Project.Id eq \"5\"", "PMV 2PV"),
SerializationUtil.createNode("NVHDEMO", "Project", "4", "Id", "Project.Id eq \"4\"", "PMV Model P"),
SerializationUtil.createNode("NVHDEMO", "Project", "3", "Id", "Project.Id eq \"3\"", "PMV Summit"));
List<Node> vehicleTypes = np.getChildren(findNodeWithLabel(projects, "PMV Summit"));
assertThat(vehicleTypes).containsExactly(
SerializationUtil.createNode("NVHDEMO", "vehicle", "Model P", "model",
"Project.Id eq \"3\" and vehicle.model eq \"Model P\"", "Model P"),
SerializationUtil.createNode("NVHDEMO", "vehicle", "Summit", "model",
"Project.Id eq \"3\" and vehicle.model eq \"Summit\"", "Summit"));
List<Node> tests = np.getChildren(findNodeWithLabel(vehicleTypes, "Summit"));
assertThat(tests).containsExactly(SerializationUtil.createNode("NVHDEMO", "Test", "4", "Id",
"Project.Id eq \"3\" and vehicle.model eq \"Summit\" and Test.Id eq \"4\"",
"PBN_UNECE_R51_20140213130501"));
List<Node> testSteps = np.getChildren(findNodeWithLabel(tests, "PBN_UNECE_R51_20140213130501"));
assertThat(testSteps).containsExactly(SerializationUtil.createNode("NVHDEMO", "TestStep", "11", "Id",
"Project.Id eq \"3\" and vehicle.model eq \"Summit\" and Test.Id eq \"4\" and TestStep.Id eq \"11\"",
"PBN_UNECE_R51_Left_Acc_50"),
SerializationUtil.createNode("NVHDEMO", "TestStep", "10", "Id",
"Project.Id eq \"3\" and vehicle.model eq \"Summit\" and Test.Id eq \"4\" and TestStep.Id eq \"10\"",
"PBN_UNECE_R51_Left_Steady_50"),
SerializationUtil.createNode("NVHDEMO", "TestStep", "13", "Id",
"Project.Id eq \"3\" and vehicle.model eq \"Summit\" and Test.Id eq \"4\" and TestStep.Id eq \"13\"",
"PBN_UNECE_R51_Right_Acc_50"),
SerializationUtil.createNode("NVHDEMO", "TestStep", "12", "Id",
"Project.Id eq \"3\" and vehicle.model eq \"Summit\" and Test.Id eq \"4\" and TestStep.Id eq \"12\"",
"PBN_UNECE_R51_Right_Steady_50"));
List<Node> measurements = np.getChildren(findNodeWithLabel(testSteps, "PBN_UNECE_R51_Left_Acc_50"));
assertThat(measurements).containsExactly(SerializationUtil.createNode("NVHDEMO", "Measurement", "175", "Id",
"Project.Id eq \"3\" and vehicle.model eq \"Summit\" and Test.Id eq \"4\" and TestStep.Id eq \"11\" and Measurement.Id eq \"175\"",
"Channel"),
SerializationUtil.createNode("NVHDEMO", "Measurement", "176", "Id",
"Project.Id eq \"3\" and vehicle.model eq \"Summit\" and Test.Id eq \"4\" and TestStep.Id eq \"11\" and Measurement.Id eq \"176\"",
"Document"),
SerializationUtil.createNode("NVHDEMO", "Measurement", "177", "Id",
"Project.Id eq \"3\" and vehicle.model eq \"Summit\" and Test.Id eq \"4\" and TestStep.Id eq \"11\" and Measurement.Id eq \"177\"",
"Photo"));
List<Node> channelGroups = np.getChildren(findNodeWithLabel(measurements, "Channel"));
assertThat(channelGroups).containsExactly(SerializationUtil.createNode("NVHDEMO", "ChannelGroup", "2011", "Id",
"Project.Id eq \"3\" and vehicle.model eq \"Summit\" and Test.Id eq \"4\" and TestStep.Id eq \"11\" and Measurement.Id eq \"175\" and ChannelGroup.Id eq \"2011\"",
"Channel"));
List<Node> channels = np.getChildren(findNodeWithLabel(channelGroups, "Channel"));
assertThat(channels).hasSize(11).startsWith(SerializationUtil.createNode("NVHDEMO", "Channel", "8498", "Id",
"Project.Id eq \"3\" and vehicle.model eq \"Summit\" and Test.Id eq \"4\" and TestStep.Id eq \"11\" and Measurement.Id eq \"175\" and ChannelGroup.Id eq \"2011\" and Channel.Id eq \"8498\"",
"CHANNEL01"));
}
private Node findNodeWithLabel(List<Node> nodes, String label) {
return nodes.stream().filter(n -> n.getLabel().equals(label)).findFirst().orElseThrow(
() -> new AssertionFailedError("Node node with label " + label + " found in " + nodes + "."));
}
@Test
public void testGetParentNodeEnvironment() {
NodeProviderRoot npr = getNodeProviderRoot();
GenericNodeProvider np = getGenericNodeProvider(npr);
NodeLevel nlEnvironment = npr.getNodeLevel(context, "Environment", null);
assertThat(np.loadParentNode(context,
SerializationUtil.createNode("NVHDEMO", "Environment", "1", "Id", "", "MDM-NVH"), nlEnvironment))
.isNull();
}
@Test
public void testGetParentNodeProject() {
NodeProviderRoot npr = getNodeProviderRoot();
GenericNodeProvider np = getGenericNodeProvider(npr);
NodeLevel nlProject = npr.getNodeLevel(context, "Project", null);
assertThat(
np.loadParentNode(context,
SerializationUtil.createNode("NVHDEMO", "Project", "3", "Id", "Project.Id eq \"3\"",
"PMV Summit"),
nlProject))
.isEqualTo(SerializationUtil.createNode("NVHDEMO", "Environment", "1", "Id",
"Project.Id eq \"3\"", "MDM-NVH"));
}
@Test
public void testGetParentNodeVehicle() {
NodeProviderRoot npr = getNodeProviderRoot();
GenericNodeProvider np = getGenericNodeProvider(npr);
NodeLevel nlVehicle = npr.getNodeLevel(context, "vehicle", "model");
assertThat(np.loadParentNode(context,
SerializationUtil.createNode("NVHDEMO", "vehicle", "Summit", "model", "vehicle.model eq \"Summit\"",
"Summit"),
nlVehicle))
.isEqualTo(SerializationUtil.createNode("NVHDEMO", "Project", "3", "Id",
"vehicle.model eq \"Summit\" and Project.Id eq \"3\"", "PMV Summit"));
}
@Test
public void testGetParentNodeTest() {
NodeProviderRoot npr = getNodeProviderRoot();
GenericNodeProvider np = getGenericNodeProvider(npr);
NodeLevel nlTest = npr.getNodeLevel(context, "Test", null);
assertThat(np.loadParentNode(context,
SerializationUtil.createNode("NVHDEMO", "Test", "4", "Id", "Test.Id eq \"4\"", ""), nlTest))
.isEqualTo(SerializationUtil.createNode("NVHDEMO", "vehicle", "Summit", "model",
"Test.Id eq \"4\" and vehicle.model eq \"Summit\"", "Summit"));
}
@Test
public void testGetParentNodeTestStep() {
NodeProviderRoot npr = getNodeProviderRoot();
GenericNodeProvider np = getGenericNodeProvider(npr);
NodeLevel nlTestStep = npr.getNodeLevel(context, "TestStep", null);
assertThat(np.loadParentNode(context,
SerializationUtil.createNode("NVHDEMO", "TestStep", "11", "Id", "TestStep.Id eq \"11\"", ""),
nlTestStep))
.isEqualTo(SerializationUtil.createNode("NVHDEMO", "Test", "4", "Id",
"TestStep.Id eq \"11\" and Test.Id eq \"4\"", "PBN_UNECE_R51_20140213130501"));
}
@Test
public void testGetTreePathEnvironment() {
GenericNodeProvider np = getGenericNodeProvider(getNodeProviderRoot());
assertThat(np.getTreePath(SerializationUtil.createNode("NVHDEMO", "Environment", "1", "Id", "", "MDM-NVH")))
.containsExactly(SerializationUtil.createNode("NVHDEMO", "Environment", "1", "Id", "", "MDM-NVH"));
}
@Test
public void testGetTreePathProject() {
GenericNodeProvider np = getGenericNodeProvider(getNodeProviderRoot());
assertThat(np.getTreePath(SerializationUtil.createNode("NVHDEMO", "Project", "3", "Id", "", "PMV Summit")))
.containsExactly(SerializationUtil.createNode("NVHDEMO", "Environment", "1", "Id", "", "MDM-NVH"),
SerializationUtil.createNode("NVHDEMO", "Project", "3", "Id", "Project.Id eq \"3\"",
"PMV Summit"));
}
@Test
public void testGetTreePathVehicle() {
GenericNodeProvider np = getGenericNodeProvider(getNodeProviderRoot());
assertThat(np.getTreePath(SerializationUtil.createNode("NVHDEMO", "vehicle", "Summit", "model", "", "Summit")))
.containsExactly(SerializationUtil.createNode("NVHDEMO", "Environment", "1", "Id", "", "MDM-NVH"),
SerializationUtil.createNode("NVHDEMO", "Project", "3", "Id", "Project.Id eq \"3\"",
"PMV Summit"),
SerializationUtil.createNode("NVHDEMO", "vehicle", "Summit", "model",
"Project.Id eq \"3\" and vehicle.model eq \"Summit\"", "Summit"));
}
@Test
public void testGetTreePathTest() {
GenericNodeProvider np = getGenericNodeProvider(getNodeProviderRoot());
assertThat(np.getTreePath(SerializationUtil.createNode("NVHDEMO", "Test", "4", "", "", ""))).containsExactly(
SerializationUtil.createNode("NVHDEMO", "Environment", "1", "Id", "", "MDM-NVH"),
SerializationUtil.createNode("NVHDEMO", "Project", "3", "Id", "Project.Id eq \"3\"", "PMV Summit"),
SerializationUtil.createNode("NVHDEMO", "vehicle", "Summit", "model",
"Project.Id eq \"3\" and vehicle.model eq \"Summit\"", "Summit"),
SerializationUtil.createNode("NVHDEMO", "Test", "4", "Id",
"Project.Id eq \"3\" and vehicle.model eq \"Summit\" and Test.Id eq \"4\"",
"PBN_UNECE_R51_20140213130501"));
}
@Test
public void testGetTreePathTestStep() {
GenericNodeProvider np = getGenericNodeProvider(getNodeProviderRoot());
assertThat(np.getTreePath(SerializationUtil.createNode("NVHDEMO", "TestStep", "11", "Id", "", "Name")))
.containsExactly(SerializationUtil.createNode("NVHDEMO", "Environment", "1", "Id", "", "MDM-NVH"),
SerializationUtil.createNode("NVHDEMO", "Project", "3", "Id", "Project.Id eq \"3\"",
"PMV Summit"),
SerializationUtil.createNode("NVHDEMO", "vehicle", "Summit", "model",
"Project.Id eq \"3\" and vehicle.model eq \"Summit\"", "Summit"),
SerializationUtil.createNode("NVHDEMO", "Test", "4", "Id",
"Project.Id eq \"3\" and vehicle.model eq \"Summit\" and Test.Id eq \"4\"",
"PBN_UNECE_R51_20140213130501"),
SerializationUtil.createNode("NVHDEMO", "TestStep", "11", "Id",
"Project.Id eq \"3\" and vehicle.model eq \"Summit\" and Test.Id eq \"4\" and TestStep.Id eq \"11\"",
"PBN_UNECE_R51_Left_Acc_50"));
}
private static NodeLevel createStructure(ApplicationContext context, ContextState contextState) {
ModelManager modelManager = context.getModelManager().get();
EntityType etEnv = modelManager.getEntityType(Environment.class);
NodeLevel env = new NodeLevel(etEnv);
env.getOrderAttributes().addAll(env.getLabelAttributes().stream().map(SortAttribute::new).collect(toList()));
NodeLevel project = new NodeLevel(modelManager.getEntityType(Project.class));
project.getOrderAttributes().addAll(project.getLabelAttributes().stream().map(SortAttribute::new).collect(toList()));
EntityType vehicle = modelManager.getEntityType("vehicle");
NodeLevel vehicleModel = new NodeLevel(vehicle, vehicle.getAttribute("model"), vehicle.getAttribute("model"));
vehicleModel.setVirtual(true);
vehicleModel.setContextState(contextState);
vehicleModel.getOrderAttributes().addAll(vehicleModel.getLabelAttributes().stream().map(SortAttribute::new).collect(toList()));
NodeLevel test = new NodeLevel(modelManager.getEntityType(org.eclipse.mdm.api.base.model.Test.class));
test.getOrderAttributes().addAll(test.getLabelAttributes().stream().map(SortAttribute::new).collect(toList()));
NodeLevel testStep = new NodeLevel(modelManager.getEntityType(TestStep.class));
testStep.getOrderAttributes().addAll(testStep.getLabelAttributes().stream().map(SortAttribute::new).collect(toList()));
NodeLevel measurement = new NodeLevel(modelManager.getEntityType(Measurement.class));
measurement.getOrderAttributes().addAll(measurement.getLabelAttributes().stream().map(SortAttribute::new).collect(toList()));
NodeLevel channelGroup = new NodeLevel(modelManager.getEntityType(ChannelGroup.class));
channelGroup.getOrderAttributes().addAll(channelGroup.getLabelAttributes().stream().map(SortAttribute::new).collect(toList()));
NodeLevel channel = new NodeLevel(modelManager.getEntityType(Channel.class));
channel.getOrderAttributes().addAll(channel.getLabelAttributes().stream().map(SortAttribute::new).collect(toList()));
env.setChild(project);
project.setChild(vehicleModel);
vehicleModel.setChild(test);
test.setChild(testStep);
testStep.setChild(measurement);
measurement.setChild(channelGroup);
channelGroup.setChild(channel);
return env;
}
}