blob: 24f7cd95bf7ea20bbfc185750cdffba49058b185 [file] [log] [blame]
/********************************************************************************
* Copyright (c) 2015-2020 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.boundary;
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 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.Attribute;
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.query.ComparisonOperator;
import org.eclipse.mdm.api.base.query.Filter;
import org.eclipse.mdm.api.base.search.ContextState;
import org.eclipse.mdm.api.dflt.ApplicationContext;
import org.eclipse.mdm.api.dflt.model.Pool;
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.Node;
import org.eclipse.mdm.nodeprovider.entity.NodeLevel;
import org.eclipse.mdm.nodeprovider.entity.NodeProvider;
import org.eclipse.mdm.nodeprovider.entity.NodeProviderRoot;
import org.eclipse.mdm.nodeprovider.utils.SerializationUtil;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
import org.mockito.Mockito;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.collect.ImmutableMap;
@Ignore
//FIXME 15.07.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 NodeProviderServiceTest {
/*
* 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 Logger LOGGER = LoggerFactory.getLogger(NodeProviderServiceTest.class);
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;
private static ApplicationContext context2;
@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);
Map<String, String> connectionParameters2 = new HashMap<>();
connectionParameters2.put(PARAM_NAMESERVICE, String.format(NAME_SERVICE, nameServiceHost, 2807));
connectionParameters2.put(PARAM_SERVICENAME, "CRASHDEMO" + ".ASAM-ODS");
connectionParameters2.put(PARAM_USER, USER);
connectionParameters2.put(PARAM_PASSWORD, PASSWORD);
context2 = new ODSContextFactory().connect(connectionParameters2);
}
@AfterClass
public static void tearDownAfterClass() throws ConnectionException {
if (context != null) {
context.close();
}
if (context2 != null) {
context2.close();
}
}
// @Test
// public void testJson() throws IOException {
// ConnectorService connectorService = Mockito.mock(ConnectorService.class);
// Mockito.when(connectorService.getContexts()).thenReturn(Arrays.asList(context, context2));
//
// GenericNodeProvider np = new GenericNodeProvider(connectorService, ContextState.MEASURED);
//
// NodeProviderRoot npr = new NodeProviderRoot();
// npr.setId("generic_measured");
// npr.setName("Generic Measured");
// npr.getContexts().put("*", np.createStructure(context, ContextState.MEASURED));
//
// String json = NodeLevelUtil.serialize(npr);
//
// System.out.println(json);
//
// NodeProviderRoot readNpr = NodeLevelUtil.deserialize(connectorService, json);
//
// System.out.println(readNpr);
// }
@Test
public void testRoot() {
ModelManager mm = context.getModelManager().get();
EntityType project = mm.getEntityType("Project");
EntityType vehicle = mm.getEntityType("vehicle");
Attribute model = vehicle.getAttribute("model");
EntityType test = mm.getEntityType("Test");
ConnectorService connectorService = Mockito.mock(ConnectorService.class);
Mockito.when(connectorService.getContexts()).thenReturn(Arrays.asList(context, context2));
NodeProviderService repo = new NodeProviderService(connectorService);
NodeProvider nodeProvider = repo.getNodeProvider("generic");
List<Node> roots = nodeProvider.getRoots();
assertThat(roots).containsExactly(new Node("NVHDEMO", "Environment", "1", "Id", Filter.and(), "MDM-NVH"));
List<Node> level1 = nodeProvider
.getChildren(roots.stream().filter(n -> "MDM-NVH".equals(n.getLabel())).findFirst().get());
assertThat(level1).containsExactly(
new Node("NVHDEMO", "Project", "1", "Id", Filter.and().id(project, "5"), "PMV 2PV"),
new Node("NVHDEMO", "Project", "2", "Id", Filter.and().id(project, "4"), "PMV Model P"),
new Node("NVHDEMO", "Project", "3", "Id", Filter.and().id(project, "3"), "PMV Summit"));
List<Node> level2 = nodeProvider.getChildren(getNodeWithLabel(level1, "PMV Summit"));
assertThat(level2).containsExactly(new Node("NVHDEMO", "vehicle", "NO_ID", "Id",
Filter.and().id(project, "3").add(ComparisonOperator.EQUAL.create(model, "Model P")), "Model P"),
new Node("NVHDEMO", "vehicle", "NO_ID", "Id",
Filter.and().id(project, "3").add(ComparisonOperator.EQUAL.create(model, "Summit")), "Summit"));
List<Node> level3 = nodeProvider.getChildren(getNodeWithLabel(level2, "Model P"));
System.out.println(level3);
Filter parent = Filter.and().id(project, "3").add(ComparisonOperator.EQUAL.create(model, "Model P"));
assertThat(level3).isEmpty();
level3 = nodeProvider.getChildren(getNodeWithLabel(level2, "Summit"));
System.out.println(level3);
parent = Filter.and().id(project, "3").add(ComparisonOperator.EQUAL.create(model, "Summit"));
assertThat(level3).containsExactly(
new Node("NVHDEMO", "Test", "1", "Id", parent.copy().id(test, "4"), "PBN_UNECE_R51_20140213130501"));
}
@Test
public void testTests() {
ModelManager mm = context.getModelManager().get();
EntityType project = mm.getEntityType("Project");
EntityType vehicle = mm.getEntityType("vehicle");
Attribute model = vehicle.getAttribute("model");
EntityType test = mm.getEntityType("Test");
ConnectorService connectorService = Mockito.mock(ConnectorService.class);
Mockito.when(connectorService.getContexts()).thenReturn(Arrays.asList(context));
NodeProviderService repo = new NodeProviderService(connectorService);
NodeProvider nodeProvider = repo.getNodeProvider("generic");
List<Node> envs = nodeProvider.getRoots();
List<Node> projects = nodeProvider.getChildren(envs.get(0));
List<Node> vehicleModels = nodeProvider.getChildren(getNodeWithLabel(projects, "PMV Summit"));
List<Node> tests = nodeProvider.getChildren(getNodeWithLabel(vehicleModels, "Summit"));
System.out.println(tests);
Filter parent = Filter.and().id(project, "3").add(ComparisonOperator.EQUAL.create(model, "Summit"));
assertThat(tests).containsExactly(new Node("NVHDEMO", "Test", "1", "Id", parent.copy().id(test, "4"),
"PBN_UNECE_R51_20140213130501")/*
* , new Node("NVHDEMO", "Test", "2",
* parent.copy().id(ContextState.ORDERED, test, "13"),
* "PBN_UNECE_R51_20140314170907")
*/);
}
@Test
public void testTests2() {
ModelManager mm = context.getModelManager().get();
EntityType project = mm.getEntityType("Project");
EntityType vehicle = mm.getEntityType("vehicle");
Attribute model = vehicle.getAttribute("model");
EntityType test = mm.getEntityType("Test");
ConnectorService connectorService = Mockito.mock(ConnectorService.class);
Mockito.when(connectorService.getContexts()).thenReturn(Arrays.asList(context));
NodeProviderService repo = new NodeProviderService(connectorService);
NodeProvider nodeProvider = repo.getNodeProvider("generic");
List<Node> envs = nodeProvider.getRoots();
List<Node> projects = nodeProvider.getChildren(envs.get(0));
List<Node> vehicleModels = nodeProvider.getChildren(getNodeWithLabel(projects, "PMV Model P"));
List<Node> tests = nodeProvider.getChildren(getNodeWithLabel(vehicleModels, "Model P"));
System.out.println(tests);
Filter parent = Filter.and().id(project, "4").add(ComparisonOperator.EQUAL.create(model, "Model P"));
assertThat(tests).containsExactly(
new Node("NVHDEMO", "Test", "1", "Id", parent.copy().id(test, "13"), "PBN_UNECE_R51_20140314170907"));
}
private Node getNodeWithLabel(List<Node> nodes, String label) {
return nodes.stream().filter(p -> label.equalsIgnoreCase(p.getLabel())).findAny().get();
}
@Test
public void test() {
NodeLevel nl = createStructure(context, ContextState.MEASURED);
NodeProviderRoot npr = new NodeProviderRoot();
npr.setId("generic_measured");
npr.setName("Measured");
npr.setContexts(ImmutableMap.of("*", nl));
System.out.println(SerializationUtil.serializeNodeProviderRoot(npr));
}
private NodeLevel createStructure(ApplicationContext context, ContextState contextState) {
ModelManager modelManager = context.getModelManager().get();
NodeLevel env = new NodeLevel(modelManager.getEntityType(Environment.class));
NodeLevel project = new NodeLevel(modelManager.getEntityType(Project.class));
EntityType vehicle = modelManager.getEntityType("vehicle");
NodeLevel vehicleModel = new NodeLevel(vehicle, vehicle.getAttribute("model"), vehicle.getAttribute("model"));
vehicleModel.setVirtual(true);
vehicleModel.setContextState(contextState);
NodeLevel test = new NodeLevel(modelManager.getEntityType(org.eclipse.mdm.api.base.model.Test.class));
env.setChild(project);
project.setChild(vehicleModel);
vehicleModel.setChild(test);
NodeLevel testStep = new NodeLevel(modelManager.getEntityType(TestStep.class));
NodeLevel measurement = new NodeLevel(modelManager.getEntityType(Measurement.class));
NodeLevel channelGroup = new NodeLevel(modelManager.getEntityType(ChannelGroup.class));
NodeLevel channel = new NodeLevel(modelManager.getEntityType(Channel.class));
test.setChild(testStep);
testStep.setChild(measurement);
measurement.setChild(channelGroup);
channelGroup.setChild(channel);
return env;
}
private NodeLevel createStructureDefault(ApplicationContext context) {
ModelManager modelManager = context.getModelManager().get();
NodeLevel env = new NodeLevel(modelManager.getEntityType(Environment.class));
NodeLevel project = new NodeLevel(modelManager.getEntityType(Project.class));
NodeLevel pool = new NodeLevel(modelManager.getEntityType(Pool.class));
NodeLevel test = new NodeLevel(modelManager.getEntityType(org.eclipse.mdm.api.base.model.Test.class));
NodeLevel testStep = new NodeLevel(modelManager.getEntityType(TestStep.class));
NodeLevel measurement = new NodeLevel(modelManager.getEntityType(Measurement.class));
NodeLevel channelGroup = new NodeLevel(modelManager.getEntityType(ChannelGroup.class));
NodeLevel channel = new NodeLevel(modelManager.getEntityType(Channel.class));
env.setChild(project);
project.setChild(pool);
pool.setChild(test);
test.setChild(testStep);
testStep.setChild(measurement);
measurement.setChild(channelGroup);
channelGroup.setChild(channel);
return env;
}
}