diff options
| author | Laurent Fasani | 2015-03-02 11:12:13 +0000 |
|---|---|---|
| committer | Laurent Fasani | 2015-03-19 16:35:34 +0000 |
| commit | f780e03d16eb296477df94d058a978af189f724b (patch) | |
| tree | c390c6d93303992d7fe3c812fc75b7859f89d00c | |
| parent | 06869d533750ac258d9a673cbb5a263ba532aef7 (diff) | |
| download | org.eclipse.sirius-f780e03d16eb296477df94d058a978af189f724b.tar.gz org.eclipse.sirius-f780e03d16eb296477df94d058a978af189f724b.tar.xz org.eclipse.sirius-f780e03d16eb296477df94d058a978af189f724b.zip | |
[462213] Test semantic resources and crossReferencer after control
Test impact of controlling and uncontrolling, in session and in session
consuming modified semantic resources.
TODO tag, in SiriusControlAndCrossReferenceInMultiSessionTest, will be
removed with fix of Bug: 461602.
API: org.eclipse.sirius.tests.support.api.SiriusTestCase has been
changed : ResourceURIType enum AND toURI(final String , ResourceURIType
) method added; genericSetUp(final List<URI>, final List<URI> , boolean,
final URI ) method set to protected.
Bug: 462213
Change-Id: I775e40894b3e47aa22f3d1d7a77f6262b8a99d13
Signed-off-by: Laurent Fasani <laurent.fasani@obeo.fr>
10 files changed, 504 insertions, 6 deletions
diff --git a/plugins/org.eclipse.sirius.doc/doc/Release Notes.html b/plugins/org.eclipse.sirius.doc/doc/Release Notes.html index 3f42155ba9..c20e76cdad 100644 --- a/plugins/org.eclipse.sirius.doc/doc/Release Notes.html +++ b/plugins/org.eclipse.sirius.doc/doc/Release Notes.html @@ -464,6 +464,17 @@ <code>org.eclipse.sirius.tests.support.api.ImageComposer</code> has been added to the test API to do assertions on image decorators. </li> </ul> + <ul> + <li>The + <code>SiriusTestCase.ResourceURIType</code> and + <code>SiriusTestCase.toURI(final String, ResourceURIType)</code> have been added to allow choosing the type of URI created(platform or plugin). + </li> + </ul> + <ul> + <li>The + <code>SiriusTestCase.genericSetUp</code> method has been set to protected so that it can be called from concrete test cases. This method allows initializing session. + </li> + </ul> <h4 id="Changesinorg.eclipse.sirius.tests.swtbot.support">Changes in <code>org.eclipse.sirius.tests.swtbot.support</code> </h4> diff --git a/plugins/org.eclipse.sirius.doc/doc/Release Notes.textile b/plugins/org.eclipse.sirius.doc/doc/Release Notes.textile index 4545ca10ab..2a7fc9f52e 100644 --- a/plugins/org.eclipse.sirius.doc/doc/Release Notes.textile +++ b/plugins/org.eclipse.sirius.doc/doc/Release Notes.textile @@ -131,6 +131,10 @@ h4. Changes in @org.eclipse.sirius.tests.junit.support@ * @org.eclipse.sirius.tests.support.api.ImageComposer@ has been added to the test API to do assertions on image decorators. +* The @SiriusTestCase.ResourceURIType@ and @SiriusTestCase.toURI(final String, ResourceURIType)@ have been added to allow choosing the type of URI created(platform or plugin). + +* The @SiriusTestCase.genericSetUp@ method has been set to protected so that it can be called from concrete test cases. This method allows initializing session. + h4. Changes in @org.eclipse.sirius.tests.swtbot.support@ * The methods @org.eclipse.sirius.tests.swtbot.support.api.business.UIPerspective.deleteProject(UIProject)@ and @org.eclipse.sirius.tests.swtbot.support.api.business.UIPerspective.deleteProject(String)@ have been deprecated, @org.eclipse.sirius.tests.support.api.EclipseTestsSupportHelper.setReadOnlyStatus(boolean, IResource...)@ can be used instead. diff --git a/plugins/org.eclipse.sirius.tests.junit.support/src/org/eclipse/sirius/tests/support/api/SiriusTestCase.java b/plugins/org.eclipse.sirius.tests.junit.support/src/org/eclipse/sirius/tests/support/api/SiriusTestCase.java index 42b5d3d8b5..3b552f20e6 100644 --- a/plugins/org.eclipse.sirius.tests.junit.support/src/org/eclipse/sirius/tests/support/api/SiriusTestCase.java +++ b/plugins/org.eclipse.sirius.tests.junit.support/src/org/eclipse/sirius/tests/support/api/SiriusTestCase.java @@ -123,6 +123,21 @@ import com.google.common.collect.Sets; * @author mchauvin */ public abstract class SiriusTestCase extends TestCase { + + /** + * Type of the URI. + */ + public enum ResourceURIType { + /** + * URI of type platform. + */ + RESOURCE_PLATFORM_URI, + /** + * URI of type plugin. + */ + RESOURCE_PLUGIN_URI + } + /** Initialization error message. */ public static final String INIT_ERROR_MSG = "An error occurs during tests initialization"; @@ -224,6 +239,7 @@ public abstract class SiriusTestCase extends TestCase { private final HashMap<String, Object> oldPlatformUIPreferences = new HashMap<String, Object>(); + /** * Overridden to create the project. {@inheritDoc} */ @@ -327,6 +343,31 @@ public abstract class SiriusTestCase extends TestCase { genericSetUp(semanticModelUris, modelerDescUris, true, toURI(representationsModelPath)); } + /** + * Convert path to URI. + * + * @param path + * the path + * @param uriType + * type of the URI to create + * @return the URI + */ + protected URI toURI(final String path, ResourceURIType uriType) { + URI uri = null; + if (path != null) { + String consistentPath = path; + if (!path.startsWith("/")) { + consistentPath = '/' + path; + } + if (uriType.equals(ResourceURIType.RESOURCE_PLATFORM_URI)) { + uri = URI.createPlatformResourceURI(consistentPath, true); + } else if (uriType.equals(ResourceURIType.RESOURCE_PLUGIN_URI)) { + uri = URI.createPlatformPluginURI(consistentPath, true); + } + } + return uri; + } + private URI toURI(final String path) { if (path != null) { URI uri; @@ -334,19 +375,32 @@ public abstract class SiriusTestCase extends TestCase { * if path starts with the temporary project name, then we have a * local resource uri */ - if (path.startsWith(SiriusTestCase.TEMPORARY_PROJECT_NAME)) { - uri = URI.createPlatformResourceURI('/' + path, true); - } else if (path.startsWith('/' + SiriusTestCase.TEMPORARY_PROJECT_NAME)) { - uri = URI.createPlatformResourceURI(path, true); + if (path.startsWith(SiriusTestCase.TEMPORARY_PROJECT_NAME) || (path.startsWith('/' + SiriusTestCase.TEMPORARY_PROJECT_NAME))) { + uri = toURI(path, ResourceURIType.RESOURCE_PLATFORM_URI); } else { - uri = URI.createPlatformPluginURI(path, true); + uri = toURI(path, ResourceURIType.RESOURCE_PLUGIN_URI); } return uri; } return null; } - private void genericSetUp(final List<URI> semanticResourceURIs, final List<URI> modelerResourceURIs, boolean createSession, final URI sessionResourceURI) throws Exception { + /** + * Generic set up. + * + * @param semanticResourceURIs + * the semantic model paths + * @param modelerResourceURIs + * the modeler description paths (PlatformPlugin or + * PlatformResource) + * @param createSession + * force session creation even if it already exists + * @param sessionResourceURI + * the aird path + * @throws Exception + * any exception + */ + protected void genericSetUp(final List<URI> semanticResourceURIs, final List<URI> modelerResourceURIs, boolean createSession, final URI sessionResourceURI) throws Exception { TestsUtil.emptyEventsFromUIThread(); /* Set no ui callbacks for tests */ diff --git a/plugins/org.eclipse.sirius.tests.junit/data/unit/control/multisession/consumer.aird b/plugins/org.eclipse.sirius.tests.junit/data/unit/control/multisession/consumer.aird new file mode 100644 index 0000000000..57deeadae0 --- /dev/null +++ b/plugins/org.eclipse.sirius.tests.junit/data/unit/control/multisession/consumer.aird @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<viewpoint:DAnalysis xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:description="http://www.eclipse.org/sirius/description/1.1.0" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:viewpoint="http://www.eclipse.org/sirius/1.1.0" xsi:schemaLocation="http://www.eclipse.org/sirius/description/1.1.0 http://www.eclipse.org/sirius/1.1.0#//description" xmi:id="_Z3ZyIK1CEeSwz8xtyVIyQQ" selectedViews="_aNUXwK1CEeSwz8xtyVIyQQ" version="8.1.1"> + <models xmi:type="ecore:EPackage" href="consumer.ecore#/"/> + <models xmi:type="ecore:EPackage" href="platform:/resource/SiriusLibrary/lib.ecore#/"/> + <ownedViews xmi:type="viewpoint:DRepresentationContainer" xmi:id="_aNUXwK1CEeSwz8xtyVIyQQ" initialized="true"> + <viewpoint xmi:type="description:Viewpoint" href="platform:/plugin/org.eclipse.sirius.sample.ecore.design/description/ecore.odesign#//@ownedViewpoints[name='Design']"/> + </ownedViews> +</viewpoint:DAnalysis> diff --git a/plugins/org.eclipse.sirius.tests.junit/data/unit/control/multisession/consumer.ecore b/plugins/org.eclipse.sirius.tests.junit/data/unit/control/multisession/consumer.ecore new file mode 100644 index 0000000000..c98e6fab2f --- /dev/null +++ b/plugins/org.eclipse.sirius.tests.junit/data/unit/control/multisession/consumer.ecore @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ecore:EPackage xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="ConsumerRoot"> + <eClassifiers xsi:type="ecore:EClass" name="C1"> + <eStructuralFeatures xsi:type="ecore:EReference" name="toLibrary" eType="ecore:EClass ../SiriusLibrary/lib.ecore#//P1/PC1"/> + </eClassifiers> +</ecore:EPackage> diff --git a/plugins/org.eclipse.sirius.tests.junit/data/unit/control/multisession/lib.aird b/plugins/org.eclipse.sirius.tests.junit/data/unit/control/multisession/lib.aird new file mode 100644 index 0000000000..bbd0f87554 --- /dev/null +++ b/plugins/org.eclipse.sirius.tests.junit/data/unit/control/multisession/lib.aird @@ -0,0 +1,124 @@ +<?xml version="1.0" encoding="UTF-8"?> +<viewpoint:DAnalysis xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:description="http://www.eclipse.org/sirius/description/1.1.0" xmlns:description_1="http://www.eclipse.org/sirius/diagram/description/1.1.0" xmlns:diagram="http://www.eclipse.org/sirius/diagram/1.1.0" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:notation="http://www.eclipse.org/gmf/runtime/1.0.2/notation" xmlns:style="http://www.eclipse.org/sirius/diagram/description/style/1.1.0" xmlns:viewpoint="http://www.eclipse.org/sirius/1.1.0" xsi:schemaLocation="http://www.eclipse.org/sirius/description/1.1.0 http://www.eclipse.org/sirius/1.1.0#//description http://www.eclipse.org/sirius/diagram/description/1.1.0 http://www.eclipse.org/sirius/diagram/1.1.0#//description http://www.eclipse.org/sirius/diagram/description/style/1.1.0 http://www.eclipse.org/sirius/diagram/1.1.0#//description/style" xmi:id="_N9ioMK1CEeSwz8xtyVIyQQ" selectedViews="_Ofe3oK1CEeSwz8xtyVIyQQ" version="8.1.1"> + <models xmi:type="ecore:EPackage" href="lib.ecore#/"/> + <ownedViews xmi:type="viewpoint:DRepresentationContainer" xmi:id="_Ofe3oK1CEeSwz8xtyVIyQQ" initialized="true"> + <ownedRepresentations xmi:type="diagram:DSemanticDiagram" xmi:id="_AAAB4LEJEeSdw8dIR2dJTg" name="libraryRoot package entities"> + <ownedAnnotationEntries xmi:type="description:AnnotationEntry" xmi:id="_AAbfsLEJEeSdw8dIR2dJTg" source="GMF_DIAGRAMS"> + <data xmi:type="notation:Diagram" xmi:id="_AAbfsbEJEeSdw8dIR2dJTg" type="Sirius" element="_AAAB4LEJEeSdw8dIR2dJTg" measurementUnit="Pixel"> + <children xmi:type="notation:Node" xmi:id="_AB3qILEJEeSdw8dIR2dJTg" type="2002" element="_AAAB4bEJEeSdw8dIR2dJTg"> + <children xmi:type="notation:Node" xmi:id="_ACc48LEJEeSdw8dIR2dJTg" type="5006"/> + <children xmi:type="notation:Node" xmi:id="_AChKYLEJEeSdw8dIR2dJTg" type="7001"> + <children xmi:type="notation:Node" xmi:id="_ACxCALEJEeSdw8dIR2dJTg" type="3009" element="_AAAB57EJEeSdw8dIR2dJTg"> + <children xmi:type="notation:Node" xmi:id="_ACxpELEJEeSdw8dIR2dJTg" type="5004"/> + <children xmi:type="notation:Node" xmi:id="_AC16gLEJEeSdw8dIR2dJTg" type="7003"> + <styles xmi:type="notation:SortingStyle" xmi:id="_AC16gbEJEeSdw8dIR2dJTg"/> + <styles xmi:type="notation:FilteringStyle" xmi:id="_AC16grEJEeSdw8dIR2dJTg"/> + </children> + <styles xmi:type="notation:ShapeStyle" xmi:id="_ACxCAbEJEeSdw8dIR2dJTg" fontName="Segoe UI" fontHeight="8"/> + <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ACxCArEJEeSdw8dIR2dJTg"/> + </children> + <children xmi:type="notation:Node" xmi:id="_AC16g7EJEeSdw8dIR2dJTg" type="3009" element="_AAAo8LEJEeSdw8dIR2dJTg"> + <children xmi:type="notation:Node" xmi:id="_AC2hkLEJEeSdw8dIR2dJTg" type="5004"/> + <children xmi:type="notation:Node" xmi:id="_AC2hkbEJEeSdw8dIR2dJTg" type="7003"> + <styles xmi:type="notation:SortingStyle" xmi:id="_AC2hkrEJEeSdw8dIR2dJTg"/> + <styles xmi:type="notation:FilteringStyle" xmi:id="_AC2hk7EJEeSdw8dIR2dJTg"/> + </children> + <styles xmi:type="notation:ShapeStyle" xmi:id="_AC16hLEJEeSdw8dIR2dJTg" fontName="Segoe UI" fontHeight="8"/> + <layoutConstraint xmi:type="notation:Bounds" xmi:id="_AC16hbEJEeSdw8dIR2dJTg"/> + </children> + <styles xmi:type="notation:SortingStyle" xmi:id="_AChKYbEJEeSdw8dIR2dJTg"/> + <styles xmi:type="notation:FilteringStyle" xmi:id="_AChKYrEJEeSdw8dIR2dJTg"/> + </children> + <styles xmi:type="notation:ShapeStyle" xmi:id="_AB3qIbEJEeSdw8dIR2dJTg" fontName="Segoe UI" fontHeight="10"/> + <layoutConstraint xmi:type="notation:Bounds" xmi:id="_AB3qIrEJEeSdw8dIR2dJTg"/> + </children> + <children xmi:type="notation:Node" xmi:id="_ACmp8LEJEeSdw8dIR2dJTg" type="2003" element="_AAAo9rEJEeSdw8dIR2dJTg"> + <children xmi:type="notation:Node" xmi:id="_ACnRALEJEeSdw8dIR2dJTg" type="5007"/> + <children xmi:type="notation:Node" xmi:id="_ACq7YLEJEeSdw8dIR2dJTg" type="7004"> + <styles xmi:type="notation:SortingStyle" xmi:id="_ACq7YbEJEeSdw8dIR2dJTg"/> + <styles xmi:type="notation:FilteringStyle" xmi:id="_ACq7YrEJEeSdw8dIR2dJTg"/> + </children> + <styles xmi:type="notation:ShapeStyle" xmi:id="_ACmp8bEJEeSdw8dIR2dJTg" fontName="Segoe UI" fontHeight="8"/> + <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ACmp8rEJEeSdw8dIR2dJTg"/> + </children> + <children xmi:type="notation:Node" xmi:id="_ACricLEJEeSdw8dIR2dJTg" type="2003" element="_AAAo_LEJEeSdw8dIR2dJTg"> + <children xmi:type="notation:Node" xmi:id="_ACric7EJEeSdw8dIR2dJTg" type="5007"/> + <children xmi:type="notation:Node" xmi:id="_ACsJgLEJEeSdw8dIR2dJTg" type="7004"> + <styles xmi:type="notation:SortingStyle" xmi:id="_ACsJgbEJEeSdw8dIR2dJTg"/> + <styles xmi:type="notation:FilteringStyle" xmi:id="_ACsJgrEJEeSdw8dIR2dJTg"/> + </children> + <styles xmi:type="notation:ShapeStyle" xmi:id="_ACricbEJEeSdw8dIR2dJTg" fontName="Segoe UI" fontHeight="8"/> + <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ACricrEJEeSdw8dIR2dJTg"/> + </children> + <styles xmi:type="notation:DiagramStyle" xmi:id="_AAbfsrEJEeSdw8dIR2dJTg"/> + </data> + </ownedAnnotationEntries> + <ownedDiagramElements xmi:type="diagram:DNodeContainer" xmi:id="_AAAB4bEJEeSdw8dIR2dJTg" name="libraryP1"> + <target xmi:type="ecore:EPackage" href="lib.ecore#//P1"/> + <semanticElements xmi:type="ecore:EPackage" href="lib.ecore#//P1"/> + <ownedStyle xmi:type="diagram:FlatContainerStyle" xmi:id="_AAAB4rEJEeSdw8dIR2dJTg" labelSize="10" backgroundStyle="GradientTopToBottom"> + <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_AAAB47EJEeSdw8dIR2dJTg"/> + <description xmi:type="style:FlatContainerStyleDescription" href="platform:/plugin/org.eclipse.sirius.sample.ecore.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@additionalLayers[name='Package']/@containerMappings[name='Design%20Package']/@style"/> + <borderColor xmi:type="viewpoint:RGBValues" xmi:id="_AAAB5LEJEeSdw8dIR2dJTg"/> + <backgroundColor xmi:type="viewpoint:RGBValues" xmi:id="_AAAB5bEJEeSdw8dIR2dJTg" red="255" green="245" blue="181"/> + <foregroundColor xmi:type="viewpoint:RGBValues" xmi:id="_AAAB5rEJEeSdw8dIR2dJTg" red="255" green="255" blue="255"/> + </ownedStyle> + <actualMapping xmi:type="description_1:ContainerMapping" href="platform:/plugin/org.eclipse.sirius.sample.ecore.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@additionalLayers[name='Package']/@containerMappings[name='Design%20Package']"/> + <ownedDiagramElements xmi:type="diagram:DNodeList" xmi:id="_AAAB57EJEeSdw8dIR2dJTg" name="PC1" tooltipText="libraryP1.PC1"> + <target xmi:type="ecore:EClass" href="lib.ecore#//P1/PC1"/> + <semanticElements xmi:type="ecore:EClass" href="lib.ecore#//P1/PC1"/> + <ownedStyle xmi:type="diagram:FlatContainerStyle" xmi:id="_AAAB6LEJEeSdw8dIR2dJTg" backgroundStyle="GradientTopToBottom"> + <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_AAAB6bEJEeSdw8dIR2dJTg"/> + <description xmi:type="style:FlatContainerStyleDescription" href="platform:/plugin/org.eclipse.sirius.sample.ecore.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@style"/> + <borderColor xmi:type="viewpoint:RGBValues" xmi:id="_AAAB6rEJEeSdw8dIR2dJTg"/> + <backgroundColor xmi:type="viewpoint:RGBValues" xmi:id="_AAAB67EJEeSdw8dIR2dJTg" red="255" green="255" blue="255"/> + <foregroundColor xmi:type="viewpoint:RGBValues" xmi:id="_AAAB7LEJEeSdw8dIR2dJTg" red="209" green="209" blue="209"/> + </ownedStyle> + <actualMapping xmi:type="description_1:ContainerMapping" href="platform:/plugin/org.eclipse.sirius.sample.ecore.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']"/> + </ownedDiagramElements> + <ownedDiagramElements xmi:type="diagram:DNodeList" xmi:id="_AAAo8LEJEeSdw8dIR2dJTg" name="PC2" tooltipText="libraryP1.PC2"> + <target xmi:type="ecore:EClass" href="lib.ecore#//P1/PC2"/> + <semanticElements xmi:type="ecore:EClass" href="lib.ecore#//P1/PC2"/> + <ownedStyle xmi:type="diagram:FlatContainerStyle" xmi:id="_AAAo8bEJEeSdw8dIR2dJTg" backgroundStyle="GradientTopToBottom"> + <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_AAAo8rEJEeSdw8dIR2dJTg"/> + <description xmi:type="style:FlatContainerStyleDescription" href="platform:/plugin/org.eclipse.sirius.sample.ecore.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@style"/> + <borderColor xmi:type="viewpoint:RGBValues" xmi:id="_AAAo87EJEeSdw8dIR2dJTg"/> + <backgroundColor xmi:type="viewpoint:RGBValues" xmi:id="_AAAo9LEJEeSdw8dIR2dJTg" red="255" green="255" blue="255"/> + <foregroundColor xmi:type="viewpoint:RGBValues" xmi:id="_AAAo9bEJEeSdw8dIR2dJTg" red="209" green="209" blue="209"/> + </ownedStyle> + <actualMapping xmi:type="description_1:ContainerMapping" href="platform:/plugin/org.eclipse.sirius.sample.ecore.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']"/> + </ownedDiagramElements> + </ownedDiagramElements> + <ownedDiagramElements xmi:type="diagram:DNodeList" xmi:id="_AAAo9rEJEeSdw8dIR2dJTg" name="RC1" tooltipText="libraryRoot.RC1"> + <target xmi:type="ecore:EClass" href="lib.ecore#//RC1"/> + <semanticElements xmi:type="ecore:EClass" href="lib.ecore#//RC1"/> + <ownedStyle xmi:type="diagram:FlatContainerStyle" xmi:id="_AAAo97EJEeSdw8dIR2dJTg" backgroundStyle="GradientTopToBottom"> + <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_AAAo-LEJEeSdw8dIR2dJTg"/> + <description xmi:type="style:FlatContainerStyleDescription" href="platform:/plugin/org.eclipse.sirius.sample.ecore.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@style"/> + <borderColor xmi:type="viewpoint:RGBValues" xmi:id="_AAAo-bEJEeSdw8dIR2dJTg"/> + <backgroundColor xmi:type="viewpoint:RGBValues" xmi:id="_AAAo-rEJEeSdw8dIR2dJTg" red="255" green="255" blue="255"/> + <foregroundColor xmi:type="viewpoint:RGBValues" xmi:id="_AAAo-7EJEeSdw8dIR2dJTg" red="209" green="209" blue="209"/> + </ownedStyle> + <actualMapping xmi:type="description_1:ContainerMapping" href="platform:/plugin/org.eclipse.sirius.sample.ecore.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']"/> + </ownedDiagramElements> + <ownedDiagramElements xmi:type="diagram:DNodeList" xmi:id="_AAAo_LEJEeSdw8dIR2dJTg" name="RC2" tooltipText="libraryRoot.RC2"> + <target xmi:type="ecore:EClass" href="lib.ecore#//RC2"/> + <semanticElements xmi:type="ecore:EClass" href="lib.ecore#//RC2"/> + <ownedStyle xmi:type="diagram:FlatContainerStyle" xmi:id="_AAAo_bEJEeSdw8dIR2dJTg" backgroundStyle="GradientTopToBottom"> + <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_AAAo_rEJEeSdw8dIR2dJTg"/> + <description xmi:type="style:FlatContainerStyleDescription" href="platform:/plugin/org.eclipse.sirius.sample.ecore.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@style"/> + <borderColor xmi:type="viewpoint:RGBValues" xmi:id="_AAAo_7EJEeSdw8dIR2dJTg"/> + <backgroundColor xmi:type="viewpoint:RGBValues" xmi:id="_AAApALEJEeSdw8dIR2dJTg" red="255" green="255" blue="255"/> + <foregroundColor xmi:type="viewpoint:RGBValues" xmi:id="_AAApAbEJEeSdw8dIR2dJTg" red="209" green="209" blue="209"/> + </ownedStyle> + <actualMapping xmi:type="description_1:ContainerMapping" href="platform:/plugin/org.eclipse.sirius.sample.ecore.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']"/> + </ownedDiagramElements> + <description xmi:type="description_1:DiagramDescription" href="platform:/plugin/org.eclipse.sirius.sample.ecore.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']"/> + <filterVariableHistory xmi:type="diagram:FilterVariableHistory" xmi:id="_AAApArEJEeSdw8dIR2dJTg"/> + <activatedLayers xmi:type="description_1:Layer" href="platform:/plugin/org.eclipse.sirius.sample.ecore.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer"/> + <activatedLayers xmi:type="description_1:AdditionalLayer" href="platform:/plugin/org.eclipse.sirius.sample.ecore.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@additionalLayers[name='Package']"/> + <target xmi:type="ecore:EPackage" href="lib.ecore#/"/> + </ownedRepresentations> + <viewpoint xmi:type="description:Viewpoint" href="platform:/plugin/org.eclipse.sirius.sample.ecore.design/description/ecore.odesign#//@ownedViewpoints[name='Design']"/> + </ownedViews> +</viewpoint:DAnalysis> diff --git a/plugins/org.eclipse.sirius.tests.junit/data/unit/control/multisession/lib.ecore b/plugins/org.eclipse.sirius.tests.junit/data/unit/control/multisession/lib.ecore new file mode 100644 index 0000000000..fa974cf6d7 --- /dev/null +++ b/plugins/org.eclipse.sirius.tests.junit/data/unit/control/multisession/lib.ecore @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ecore:EPackage xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="P0"> + <eClassifiers xsi:type="ecore:EClass" name="RC1"/> + <eClassifiers xsi:type="ecore:EClass" name="RC2"/> + <eSubpackages name="P1"> + <eClassifiers xsi:type="ecore:EClass" name="PC1"/> + <eClassifiers xsi:type="ecore:EClass" name="PC2"/> + </eSubpackages> +</ecore:EPackage> diff --git a/plugins/org.eclipse.sirius.tests.junit/src/org/eclipse/sirius/tests/suite/common/AllCommonPluginTests.java b/plugins/org.eclipse.sirius.tests.junit/src/org/eclipse/sirius/tests/suite/common/AllCommonPluginTests.java index 7ced5fa491..a64a66135d 100644 --- a/plugins/org.eclipse.sirius.tests.junit/src/org/eclipse/sirius/tests/suite/common/AllCommonPluginTests.java +++ b/plugins/org.eclipse.sirius.tests.junit/src/org/eclipse/sirius/tests/suite/common/AllCommonPluginTests.java @@ -52,6 +52,7 @@ import org.eclipse.sirius.tests.unit.api.session.SiriusComparatorTests; import org.eclipse.sirius.tests.unit.api.session.SiriusRegistryListener2Tests; import org.eclipse.sirius.tests.unit.api.session.SiriusRegistryTests; import org.eclipse.sirius.tests.unit.api.session.ViewpointSelectionTests; +import org.eclipse.sirius.tests.unit.api.tools.SiriusControlAndCrossReferenceInMultiSessionTest; import org.eclipse.sirius.tests.unit.api.vsm.edit.SiriusAdapterFactoryRegistryTest; import org.eclipse.sirius.tests.unit.common.EclipseUtilTest; import org.eclipse.sirius.tests.unit.common.EqualityHelperTestCase; @@ -269,6 +270,7 @@ public class AllCommonPluginTests extends TestCase { suite.addTestSuite(SiriusCrossReferenceAdapterTests.class); suite.addTestSuite(SaverTest.class); suite.addTestSuite(XSDSemanticResourceTests.class); + suite.addTestSuite(SiriusControlAndCrossReferenceInMultiSessionTest.class); } /** diff --git a/plugins/org.eclipse.sirius.tests.junit/src/org/eclipse/sirius/tests/unit/api/tools/SiriusControlAndCrossReferenceInMultiSessionTest.java b/plugins/org.eclipse.sirius.tests.junit/src/org/eclipse/sirius/tests/unit/api/tools/SiriusControlAndCrossReferenceInMultiSessionTest.java new file mode 100644 index 0000000000..889d7ee144 --- /dev/null +++ b/plugins/org.eclipse.sirius.tests.junit/src/org/eclipse/sirius/tests/unit/api/tools/SiriusControlAndCrossReferenceInMultiSessionTest.java @@ -0,0 +1,276 @@ +/******************************************************************************* + * Copyright (c) 2015 THALES GLOBAL SERVICES. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Obeo - initial API and implementation + *******************************************************************************/ +package org.eclipse.sirius.tests.unit.api.tools; + +import java.lang.reflect.Method; +import java.util.Collection; +import java.util.Collections; +import java.util.Iterator; + +import org.eclipse.core.runtime.NullProgressMonitor; +import org.eclipse.emf.common.util.EList; +import org.eclipse.emf.common.util.URI; +import org.eclipse.emf.ecore.EClass; +import org.eclipse.emf.ecore.EClassifier; +import org.eclipse.emf.ecore.EPackage; +import org.eclipse.emf.ecore.resource.Resource; +import org.eclipse.emf.ecore.resource.Resource.Factory.Registry; +import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl; +import org.eclipse.emf.ecore.xmi.impl.XMIResourceImpl; +import org.eclipse.emf.transaction.util.TransactionUtil; +import org.eclipse.sirius.business.api.control.SiriusControlCommand; +import org.eclipse.sirius.business.api.control.SiriusUncontrolCommand; +import org.eclipse.sirius.business.api.session.Session; +import org.eclipse.sirius.business.internal.session.danalysis.DAnalysisSessionImpl; +import org.eclipse.sirius.business.internal.session.danalysis.LocalResourceCollector; +import org.eclipse.sirius.tests.SiriusTestsPlugin; +import org.eclipse.sirius.tests.support.api.EclipseTestsSupportHelper; +import org.eclipse.sirius.tests.support.api.SiriusTestCase; +import org.eclipse.sirius.tools.api.command.ICommandFactory; +import org.eclipse.sirius.tools.api.command.ui.UICallBack; +import org.eclipse.sirius.viewpoint.DAnalysis; +import org.eclipse.sirius.viewpoint.DRepresentation; +import org.eclipse.sirius.viewpoint.impl.DAnalysisSessionEObjectImpl; +import org.eclipse.sirius.viewpoint.provider.SiriusEditPlugin; + +import com.google.common.collect.Iterators; +import com.google.common.collect.Lists; +import com.google.common.collect.UnmodifiableIterator; + +/** + * Test semantics resources and crossReferenceAdapter on semantic resources when + * (un)controlling a semantic resource. Test impact in the session itself and in + * an other session consuming the modified resources + * + * @author <a href="mailto:laurent.fasani@obeo.fr">Laurent Fasani</a> + */ +public class SiriusControlAndCrossReferenceInMultiSessionTest extends SiriusTestCase { + + private static final String PATH = "/data/unit/control/multisession/"; + + private static final String CONSUMER_PROJECT = "SiriusConsumer"; + + private static final String SEMANTIC_MODEL_CONSUMER = "consumer.ecore"; + + private static final String AIRD_CONSUMER_1 = "consumer.aird"; + + private static final String LIBRARY_PROJECT = "SiriusLibrary"; + + private static final String SEMANTIC_MODEL_LIB = "lib.ecore"; + + private static final String SEMANTIC_MODEL_LIB_P1 = "lib_P1.ecore"; + + private static final String AIRD_LIB_1 = "lib.aird"; + + UICallBack originalSiriusUICallBack = SiriusEditPlugin.getPlugin().getUiCallback(); + + private Session sessionLibrary; + + @Override + protected void setUp() throws Exception { + + Registry.INSTANCE.getExtensionToFactoryMap().put("ecore", new XMIResourceFactoryImpl() { + @Override + public Resource createResource(URI uri) { + return new XMIResourceImpl(uri) { + @Override + protected boolean useUUIDs() { + return false; + } + }; + } + }); + + // Session library + // P0 + // |_P1 + // ..|_PC1 + // ..|_PC2 + + // Consumer library + // ConsumerRoot + // |_C1 + // ..|_toLibrary -->PC1 + copyFilesToTestProject(SiriusTestsPlugin.PLUGIN_ID, LIBRARY_PROJECT, PATH, Lists.newArrayList(SEMANTIC_MODEL_LIB, AIRD_LIB_1)); + genericSetUp(Collections.singletonList(toURI(LIBRARY_PROJECT + "/" + SEMANTIC_MODEL_LIB, ResourceURIType.RESOURCE_PLATFORM_URI)), Collections.<URI> emptyList(), true, + toURI(LIBRARY_PROJECT + "/" + AIRD_LIB_1, ResourceURIType.RESOURCE_PLATFORM_URI)); + sessionLibrary = session; + + copyFilesToTestProject(SiriusTestsPlugin.PLUGIN_ID, CONSUMER_PROJECT, PATH, Lists.newArrayList(SEMANTIC_MODEL_CONSUMER, AIRD_CONSUMER_1)); + genericSetUp(Collections.singletonList(toURI(CONSUMER_PROJECT + "/" + SEMANTIC_MODEL_CONSUMER, ResourceURIType.RESOURCE_PLATFORM_URI)), Collections.<URI> emptyList(), true, + toURI(CONSUMER_PROJECT + "/" + AIRD_CONSUMER_1, ResourceURIType.RESOURCE_PLATFORM_URI)); + } + + private void copyFilesToTestProject(String pluginID, String projetName, String pluginCommonPath, Collection<String> filePaths) { + EclipseTestsSupportHelper.INSTANCE.createProject(projetName); + for (final String path : filePaths) { + final String pluginFilePath = pluginCommonPath + path; + final String wksPath = projetName + "/" + path; + EclipseTestsSupportHelper.INSTANCE.copyFile(pluginID, pluginFilePath, wksPath); + } + } + + /** + * @throws Exception + */ + public void testControlImpactOnSemanticResource() throws Exception { + // Check test data + EPackage mainPackage = (EPackage) sessionLibrary.getSemanticResources().iterator().next().getContents().get(0); + final EPackage packageToControl = mainPackage.getESubpackages().get(0); + + EPackage mainPackageInConsumer = (EPackage) session.getSemanticResources().iterator().next().getContents().get(0); + EClassifier eTypePC1 = ((EClass) mainPackageInConsumer.getEClassifier("C1")).getEStructuralFeature("toLibrary").getEType(); + assertFalse(eTypePC1.eIsProxy()); + + // check models tag + for (final DAnalysis analysis : ((DAnalysisSessionImpl) session).allAnalyses()) { + assertTrue(analysis.getModels().size() == 2); + } + + // ###################################### + // A - Control the package P1 + URI controlledModelUri = URI.createPlatformResourceURI("/" + LIBRARY_PROJECT + "/" + SEMANTIC_MODEL_LIB_P1, true); + SiriusControlCommand controlCmd = new SiriusControlCommand(packageToControl, controlledModelUri, Collections.<DRepresentation> emptySet(), null, true, new NullProgressMonitor()); + TransactionUtil.getEditingDomain(mainPackage).getCommandStack().execute(controlCmd); + + // --------- Library session checks -------- + // 1 - Check that control occurs on LibraryProject + assertEquals(controlledModelUri, packageToControl.eResource().getURI()); + + EList<Resource> controlledResources = ((DAnalysisSessionEObjectImpl) sessionLibrary).getControlledResources(); + assertEquals("Bad controlled resources size", 1, controlledResources.size()); + Collection<Resource> semanticResources = sessionLibrary.getSemanticResources(); + assertEquals("Bad semantic resources size", 1, semanticResources.size()); + + // check models tag + for (final DAnalysis analysis : ((DAnalysisSessionImpl) sessionLibrary).allAnalyses()) { + assertTrue(analysis.getModels().size() == 1); + } + + // 2 - Check LocalResourceCollector + Resource resourcelib = semanticResources.iterator().next(); + Method method = DAnalysisSessionImpl.class.getDeclaredMethod("collectAllReferencedResources", Resource.class); + method.setAccessible(true); + Collection<Resource> allReferencedResources = (Collection<Resource>) method.invoke(sessionLibrary, resourcelib); + UnmodifiableIterator<LocalResourceCollector> lcrIt = Iterators.filter(resourcelib.getResourceSet().eAdapters().iterator(), LocalResourceCollector.class); + assertTrue("The LocalResourceCollector is not set on resourceSet", lcrIt.hasNext()); + LocalResourceCollector lcr = lcrIt.next(); + assertEquals(0, allReferencedResources.size()); + + // --------- Consumer session checks -------- + // 1 - Check that control occurs on ConsumerProject + EList<Resource> controlledResourcesInConsumer = ((DAnalysisSessionEObjectImpl) session).getControlledResources(); + assertEquals("Bad controlled resources size", 1, controlledResourcesInConsumer.size()); + assertTrue(controlledResourcesInConsumer.get(0).toString().contains(SEMANTIC_MODEL_LIB_P1)); + Collection<Resource> semanticResourcesInConsumer = session.getSemanticResources(); + assertEquals("Bad semantic resources size", 2, semanticResourcesInConsumer.size()); + + mainPackageInConsumer = (EPackage) session.getSemanticResources().iterator().next().getContents().get(0); + eTypePC1 = ((EClass) mainPackageInConsumer.getEClassifier("C1")).getEStructuralFeature("toLibrary").getEType(); + assertFalse(eTypePC1.eIsProxy()); + + Resource eTypePC1Resource = eTypePC1.eResource(); + assertEquals(controlledModelUri, eTypePC1Resource.getURI()); + + // check models tag + for (final DAnalysis analysis : ((DAnalysisSessionImpl) session).allAnalyses()) { + assertTrue(analysis.getModels().size() == 3); + assertTrue(analysis.getModels().get(2).eResource().toString().contains(SEMANTIC_MODEL_LIB_P1)); + } + + // 2 - Check LocalResourceCollector + Iterator<Resource> resItrInConsumer = semanticResourcesInConsumer.iterator(); + Resource resourceConsumer = resItrInConsumer.next(); + Resource resourceLib_P1InConsumer = controlledResourcesInConsumer.get(0); + + Collection<Resource> resReferencedByConsumer = (Collection<Resource>) method.invoke(session, resourceConsumer); + UnmodifiableIterator<LocalResourceCollector> lcrItInconsumer = Iterators.filter(resourceConsumer.getResourceSet().eAdapters().iterator(), LocalResourceCollector.class); + assertTrue("The LocalResourceCollector is not set on resourceSet", lcrItInconsumer.hasNext()); + assertEquals(1, resReferencedByConsumer.size()); + + LocalResourceCollector lcrInConsumer = lcrItInconsumer.next(); + assertTrue(resReferencedByConsumer.iterator().next().getURI().toString().contains(SEMANTIC_MODEL_LIB_P1)); + + Collection<Resource> resReferencingLib = lcrInConsumer.getAllReferencingResources(resourceLib_P1InConsumer); + assertEquals("size of resources referencing " + SEMANTIC_MODEL_LIB_P1, 1, resReferencingLib.size()); + assertTrue(resReferencingLib.iterator().next().getURI().toString().contains(SEMANTIC_MODEL_CONSUMER)); + + // ###################################### + // B - Uncontrol the package + SiriusUncontrolCommand unControlCmd = new SiriusUncontrolCommand(packageToControl, true, true, new NullProgressMonitor()); + TransactionUtil.getEditingDomain(mainPackage).getCommandStack().execute(unControlCmd); + + // --------- Library session checks -------- + // 1 - Check that uncontrol occurs on LibraryProject + URI libModelUri = URI.createPlatformResourceURI("/" + LIBRARY_PROJECT + "/" + SEMANTIC_MODEL_LIB, true); + assertEquals(libModelUri, packageToControl.eResource().getURI()); + + controlledResources = ((DAnalysisSessionEObjectImpl) sessionLibrary).getControlledResources(); + assertEquals("Bad controlled resources size", 0, controlledResources.size()); + semanticResources = sessionLibrary.getSemanticResources(); + assertEquals("Bad semantic resources size", 1, semanticResources.size()); + + // check models tag + for (final DAnalysis analysis : ((DAnalysisSessionImpl) sessionLibrary).allAnalyses()) { + assertTrue(analysis.getModels().size() == 1); + } + + // 2 - Check LocalResourceCollector + resourcelib = semanticResources.iterator().next(); + lcrIt = Iterators.filter(resourcelib.getResourceSet().eAdapters().iterator(), LocalResourceCollector.class); + lcr = lcrIt.next(); + assertEquals("size of resources referenced by " + SEMANTIC_MODEL_LIB, 0, lcr.getAllReferencedResources(resourcelib).size()); + assertEquals("size of resources referencing " + SEMANTIC_MODEL_LIB, 0, lcr.getAllReferencingResources(resourcelib).size()); + + // --------- Consumer session checks -------- + // 1 - Check that uncontrol occurs on ConsumerProject + controlledResourcesInConsumer = ((DAnalysisSessionEObjectImpl) session).getControlledResources(); + assertEquals("Bad controlled resources size", 0, controlledResourcesInConsumer.size()); + semanticResourcesInConsumer = session.getSemanticResources(); + assertEquals("Bad semantic resources size", 2, semanticResourcesInConsumer.size()); + + mainPackageInConsumer = (EPackage) session.getSemanticResources().iterator().next().getContents().get(0); + eTypePC1 = ((EClass) mainPackageInConsumer.getEClassifier("C1")).getEStructuralFeature("toLibrary").getEType(); + // eTypePC1 is proxy because the URI contains the previously controlled + // resource lib_P1 that does not exists anymore + assertTrue(eTypePC1.eIsProxy()); + + eTypePC1Resource = eTypePC1.eResource(); + assertNull(eTypePC1Resource); + + // check models tag + for (final DAnalysis analysis : ((DAnalysisSessionImpl) session).allAnalyses()) { + assertEquals("Incorrect models size", 2, analysis.getModels().size()); + assertTrue(analysis.getModels().get(1).eResource().toString().contains(SEMANTIC_MODEL_LIB)); + } + + // 2 - Check LocalResourceCollector + resItrInConsumer = semanticResourcesInConsumer.iterator(); + resourceConsumer = resItrInConsumer.next(); + Resource resourceLibInConsumer = resItrInConsumer.next(); + + lcrItInconsumer = Iterators.filter(resourceConsumer.getResourceSet().eAdapters().iterator(), LocalResourceCollector.class); + lcrInConsumer = lcrItInconsumer.next(); + resReferencedByConsumer = lcrInConsumer.getAllReferencedResources(resourceConsumer); + assertEquals("size of resources referenced by " + SEMANTIC_MODEL_CONSUMER, 1, resReferencedByConsumer.size()); + // TODO : should be uncomment in 461602 + // assertTrue(resReferencedByConsumer.iterator().next().getURI().toString().contains(SEMANTIC_MODEL_LIB)); + resReferencingLib = lcrInConsumer.getAllReferencingResources(resourceLibInConsumer); + // assertEquals(1, resReferencingLib.size()); + // assertTrue(resReferencingLib.iterator().next().getURI().toString().contains(SEMANTIC_MODEL_CONSUMER)); + } + + @Override + protected ICommandFactory getCommandFactory() { + return null; + } + +} diff --git a/plugins/org.eclipse.sirius.tests.junit/src/org/eclipse/sirius/tests/unit/common/SiriusCrossReferenceAdapterTests.java b/plugins/org.eclipse.sirius.tests.junit/src/org/eclipse/sirius/tests/unit/common/SiriusCrossReferenceAdapterTests.java index 14e14d30d0..fd98b27099 100644 --- a/plugins/org.eclipse.sirius.tests.junit/src/org/eclipse/sirius/tests/unit/common/SiriusCrossReferenceAdapterTests.java +++ b/plugins/org.eclipse.sirius.tests.junit/src/org/eclipse/sirius/tests/unit/common/SiriusCrossReferenceAdapterTests.java @@ -116,6 +116,8 @@ public class SiriusCrossReferenceAdapterTests extends SiriusTestCase { // ResourcesPlugin.getWorkspace().getRoot().refreshLocal(IResource.DEPTH_INFINITE, // null); + assertTrue("Deleted controlled resource is still in session controlled resources.", ((DAnalysisSessionEObject) session).getControlledResources().size() == 0); + // check that no warning "loading resource while unloading it" has been // dispatched for (Iterator<IStatus> warning = warnings.values().iterator(); warning.hasNext();) { |
