blob: 2724d132e1f160403910419d30df3021357b4721 [file] [log] [blame]
/*******************************************************************************
* Copyright (C) 2021 the Eclipse BaSyx Authors
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
******************************************************************************/
package org.eclipse.basyx.examples.snippets.submodel;
import static org.junit.Assert.assertEquals;
import java.util.Arrays;
import java.util.Collections;
import java.util.function.Function;
import org.eclipse.basyx.aas.metamodel.map.descriptor.SubmodelDescriptor;
import org.eclipse.basyx.aas.registration.proxy.AASRegistryProxy;
import org.eclipse.basyx.components.configuration.BaSyxContextConfiguration;
import org.eclipse.basyx.components.servlet.submodel.SubmodelServlet;
import org.eclipse.basyx.examples.snippets.AbstractSnippetTest;
import org.eclipse.basyx.examples.support.ExampleComponentBuilder;
import org.eclipse.basyx.submodel.metamodel.api.identifier.IIdentifier;
import org.eclipse.basyx.submodel.metamodel.api.identifier.IdentifierType;
import org.eclipse.basyx.submodel.metamodel.map.SubModel;
import org.eclipse.basyx.submodel.metamodel.map.identifier.Identifier;
import org.eclipse.basyx.submodel.metamodel.map.submodelelement.dataelement.property.Property;
import org.eclipse.basyx.submodel.metamodel.map.submodelelement.operation.Operation;
import org.eclipse.basyx.submodel.metamodel.map.submodelelement.operation.OperationVariable;
import org.eclipse.basyx.vab.protocol.http.server.AASHTTPServer;
import org.eclipse.basyx.vab.protocol.http.server.BaSyxContext;
import org.junit.After;
import org.junit.Test;
/**
* Test for the ExecuteOperation snippet
*
* @author conradi
*
*/
public class TestExecuteOperation extends AbstractSnippetTest {
private static final String NEW_SM_ID_SHORT = "smIdShort_New";
private static final String NEW_SM_ID = "smId_New";
private static final String OPERATION_ID = "operation";
private static final Object[] PARAMETERS = {2, 3};
private static final int EXPECTED_RESULT = 5;
private AASHTTPServer server;
@After
public void shutdownServer() {
server.shutdown();
}
@Test
public void testExecuteOperation() throws Exception {
SubModel submodel = ExampleComponentBuilder.buildExampleSubmodel(NEW_SM_ID_SHORT, NEW_SM_ID);
// Add an Operation which calculates the sum of the two parameters
Operation operation = new Operation((Function<Object[], Object>) v -> {
return (int) v[0] + (int) v[1];
});
OperationVariable a = new OperationVariable(new Property("a", 1));
OperationVariable b = new OperationVariable(new Property("b", 2));
OperationVariable r = new OperationVariable(new Property("r", 3));
operation.setInputVariables(Arrays.asList(a, b));
operation.setOutputVariables(Collections.singletonList(r));
operation.setIdShort(OPERATION_ID);
submodel.addSubModelElement(operation);
// Startup a Server hosting this Submodel
provideSubmodel(submodel);
// Get the Identifiers of the AAS and Submodel
IIdentifier aasIdentifier = new Identifier(IdentifierType.CUSTOM, AAS_ID);
IIdentifier smIdentifier = new Identifier(IdentifierType.CUSTOM, NEW_SM_ID);
// Execute the Operation and get the result
Object result = ExecuteOperation.executeOperation(OPERATION_ID, PARAMETERS, smIdentifier, aasIdentifier, registryComponent.getRegistryPath());
// Check if the result is the expected value
assertEquals(EXPECTED_RESULT, result);
}
/**
* Starts a new server hosting a given Submodel
* This is necessary as an Operation can not be transfered to a server via serialization
*
* @param submodel the Submodel to be hosted
*/
private void provideSubmodel(SubModel submodel) {
// Create a BaSyxConetxt for port 8082 with an empty endpoint
BaSyxContextConfiguration contextConfig = new BaSyxContextConfiguration(8082, "");
BaSyxContext context = contextConfig.createBaSyxContext();
// Create a new SubmodelServlet containing the submodel
SubmodelServlet smServlet = new SubmodelServlet(submodel);
// Add the SubmodelServlet mapping to the context at the path "/submodel"
context.addServletMapping("/submodel/*", smServlet);
// Create and start a HTTP server with the context created above
server = new AASHTTPServer(context);
server.start();
IIdentifier aasIdentifier = new Identifier(IdentifierType.CUSTOM, AAS_ID);
SubmodelDescriptor descriptor = new SubmodelDescriptor(submodel, "http://localhost:8082/submodel");
// Register the new Submodel
AASRegistryProxy registry = new AASRegistryProxy(registryComponent.getRegistryPath());
registry.register(aasIdentifier, descriptor);
}
}