blob: 0899635d9c804a4249b129d239aa2e49b296cfad [file] [log] [blame]
/*****************************************************************************
*
* Copyright (c) 2016 CEA LIST.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* CEA LIST Initial API and implementation
*
*****************************************************************************/
package org.eclipse.papyrus.moka.fmi.test;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.ecore.xmi.XMLResource;
import org.eclipse.papyrus.moka.fmi.fmi2uml.FMI2UML;
import org.eclipse.papyrus.moka.fmi.fmiprofile.CS_FMU;
import org.eclipse.papyrus.moka.fmi.fmiprofile.FMIProfilePackage;
import org.eclipse.papyrus.moka.fmi.fmu.FMUParser;
import org.eclipse.papyrus.moka.fmi.fmu.FMUResource;
import org.eclipse.papyrus.moka.fmi.fmumetamodel.AbstractFile;
import org.eclipse.papyrus.moka.fmi.fmumetamodel.ArchiveToUnzipInFMU;
import org.eclipse.papyrus.moka.fmi.fmumetamodel.FMUBundle;
import org.eclipse.papyrus.moka.fmi.fmumetamodel.JavaFileProxy;
import org.eclipse.papyrus.moka.fmi.modeldescription.FmiModelDescriptionType;
import org.eclipse.papyrus.moka.fmi.profile.util.FMIProfileUtil;
import org.eclipse.papyrus.moka.fmi.util.FMUResourceUtil;
import org.eclipse.uml2.uml.Class;
import org.eclipse.uml2.uml.Model;
import org.eclipse.uml2.uml.Stereotype;
import org.eclipse.uml2.uml.UMLFactory;
import org.junit.Test;
public class TestFMI {
private static final String SUBARCHIVE_FOLDER_NAME = "subArchive";
private static String testFMUPath = "resources/PV.fmu";
private static String testArchiveToAddPath = "resources/subResources.zip";
@Test
public void testFMUHandler(){
URL bundleFMUUrl =FileLocator.find(Platform.getBundle(Activator.bundleID),new Path(testFMUPath), null);
try {
URL fileFMUURL = FileLocator.toFileURL(bundleFMUUrl);
FMUParser handler = new FMUParser(fileFMUURL.getFile());
assertTrue(handler.getModelDescription() instanceof FmiModelDescriptionType);
File fmuTmpFolder = handler.getFMUFolder();
assertNotNull(fmuTmpFolder);
assertTrue(fmuTmpFolder.exists());
//we the model description is reparsed after unzip in tmp folder we check it's ok
assertTrue(handler.getModelDescription() instanceof FmiModelDescriptionType);
assertNotNull(handler.getCosimulationLibrary());
assertTrue(handler.getCosimulationLibrary().exists());
FMUParser newHandler = new FMUParser(fmuTmpFolder.getAbsolutePath());
checkFMUHandlerFromFolder(newHandler);
File fmuFolder = handler.getFMUFolder();
newHandler.clean();
assertFalse(fmuFolder.exists());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void checkFMUHandlerFromFolder(FMUParser handler) {
File fmuFolder;
try {
fmuFolder = handler.getFMUFolder();
assertNotNull(fmuFolder);
assertTrue(fmuFolder.exists());
//we the model description is reparsed after unzip in tmp folder we check it's ok
assertTrue(handler.getModelDescription() instanceof FmiModelDescriptionType);
assertNotNull(handler.getCosimulationLibrary());
assertTrue(handler.getCosimulationLibrary().exists());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Test
public void testFMUResource(){
Resource res = loadFMUResource();
assertTrue(res instanceof FMUResource);
assertFalse(res.getContents().isEmpty());
assertTrue(res.getContents().get(0) instanceof FMUBundle);
FMUResource fmuRes = (FMUResource) res;
assertTrue(fmuRes.getFmuParser() instanceof FMUParser);
FMUParser handler = fmuRes.getFmuParser();
checkFMUHandlerFromFolder(handler);
try {
File fmuFolder = handler.getFMUFolder();
res.unload();
assertFalse(fmuFolder.exists());
} catch (IOException e) {
fail();
e.printStackTrace();
}
}
@Test
public void testSaveFMUResource() throws IOException{
Resource res = loadFMUResource();
ResourceSet resSet = new ResourceSetImpl();
FMUBundle bundle = (FMUBundle) res.getContents().get(0);
URL archiveToAddURL =FileLocator.toFileURL(FileLocator.find(Platform.getBundle(Activator.bundleID),new Path(testArchiveToAddPath), null));
File archiveToAddFile =new File(archiveToAddURL.getFile());
ArchiveToUnzipInFMU archiveToAdd = FMUResourceUtil.createArchiveToUnzipInFMU(archiveToAddFile, SUBARCHIVE_FOLDER_NAME);
bundle.getResourcesFiles().add(archiveToAdd);
File tmpFile = File.createTempFile("testSaveFMU", ".fmu");
//tmpFile.deleteOnExit();
URI fmuFileURI =URI.createFileURI(tmpFile.getAbsolutePath()) ;
Resource savedFMUResource = resSet.createResource(fmuFileURI);
savedFMUResource.getContents().add(bundle);
savedFMUResource.save(null);
ResourceSet newResSet = new ResourceSetImpl();
Resource reloadedResource = newResSet.getResource(fmuFileURI, true);
assertTrue( reloadedResource.getContents().get(0) instanceof FMUBundle);
FMUBundle reloadedBundle = (FMUBundle) reloadedResource.getContents().get(0);
assertFalse(reloadedBundle.getWin64Files().isEmpty());
assertTrue(reloadedBundle.getResourcesFiles().size() == 4);
for (AbstractFile resourceFile : reloadedBundle.getResourcesFiles()){
assertTrue (resourceFile instanceof JavaFileProxy);
JavaFileProxy proxy =(JavaFileProxy)resourceFile;
assertTrue(proxy.getFile() != null);
if (proxy.getFile().getName().equals("testEmptySubFolder")){
assertTrue(proxy.getFile().isDirectory());
assertTrue(proxy.getFile().listFiles().length==0);
}else if (proxy.getFile().getName().equals("testSubFolder")){
assertTrue(proxy.getFile().isDirectory());
assertTrue(proxy.getFile().listFiles().length==2);
for (File subFile : proxy.getFile().listFiles()){
if (subFile.getName().equals("testEmptySubFolder")){
assertTrue(proxy.getFile().isDirectory());
assertTrue(proxy.getFile().listFiles().length==0);
}
}
}else if (proxy.getFile().getName().equals(SUBARCHIVE_FOLDER_NAME)){
assertTrue(proxy.getFile().listFiles().length == 3);
}
}
assertTrue(reloadedBundle.getRootFiles().size() ==1);
assertTrue(reloadedBundle.getRootFiles().get(0).getName().equals("binaries/testFileThatShouldNotBeThere.txt"));
}
private Resource loadFMUResource() {
URI testFMUURI = URI.createPlatformPluginURI("/"+ Activator.bundleID+"/"+testFMUPath, true);
ResourceSet resSet = new ResourceSetImpl();
Resource res = resSet.getResource(testFMUURI, true);
return res;
}
@Test
public void testFMIProfile(){
FMUResource fmuRes = (FMUResource) loadFMUResource();
ResourceSet resSet = fmuRes.getResourceSet();
try {
File tmpFile = File.createTempFile("fmuModel", ".uml");
tmpFile.deleteOnExit();
URI umlFileURI =URI.createFileURI(tmpFile.getAbsolutePath()) ;
Resource umlResource = resSet.createResource(umlFileURI);
Model umlModel = UMLFactory.eINSTANCE.createModel();
umlModel.setName("testModel");
umlResource.getContents().add(umlModel);
Class fmuClass = FMI2UML.getFMUClass((FMUBundle) fmuRes.getContents().get(0), umlModel);
assertNotNull(fmuClass);
String expectedClassName = fmuRes.getFmuParser().getModelDescription().getCoSimulation().get(0).getModelIdentifier();
assertTrue(fmuClass.getName().equals(expectedClassName));
Stereotype csFMUStereo = FMIProfileUtil.getStereotype(umlModel, FMIProfileUtil.CS_FMU_STEREO_NAME, FMIProfilePackage.eINSTANCE);
EObject application = fmuClass.getStereotypeApplication(csFMUStereo);
assertTrue(application instanceof CS_FMU);
CS_FMU csFMU = (CS_FMU) application;
assertTrue(csFMU.getModelDescription() == fmuRes.getFmuParser().getModelDescription());
Map<Object, Object> options = new HashMap<>();
options.put(XMLResource.OPTION_SAVE_TYPE_INFORMATION, true);
umlResource.save(options);
fmuRes.unload();
umlResource.unload();
resSet = new ResourceSetImpl();
umlResource = resSet.getResource(umlFileURI, true);
assertFalse(umlResource.getContents().isEmpty());
assertTrue(umlResource.getContents().get(0) instanceof Model);
umlModel = (Model) umlResource.getContents().get(0);
assertTrue(umlModel.getOwnedType(expectedClassName) instanceof Class);
Class umlClass = (Class) umlModel.getOwnedType(expectedClassName) ;
csFMUStereo = umlClass.getAppliedStereotype(FMIProfileUtil.CS_FMU_STEREO_QUALIFIED_NAME);
assertTrue(csFMUStereo == FMIProfileUtil.getStereotype(umlModel, FMIProfileUtil.CS_FMU_STEREO_NAME, FMIProfilePackage.eINSTANCE));
csFMU = (CS_FMU) umlClass.getStereotypeApplication(csFMUStereo);
assertTrue(csFMU.getModelDescription() != null);
assertTrue(csFMU.getModelDescription().eResource() instanceof FMUResource);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}