/**
* Copyright 2014-2017 Linagora, Université Joseph Fourier, Floralis
*
* The present code is developed in the scope of the joint LINAGORA -
* Université Joseph Fourier - Floralis research program and is designated
* as a "Result" pursuant to the terms and conditions of the LINAGORA
* - Université Joseph Fourier - Floralis research program. Each copyright
* holder of Results enumerated here above fully & independently holds complete
* ownership of the complete Intellectual Property rights applicable to the whole
* of said Results, and may freely exploit it in any manner which does not infringe
* the moral rights of the other copyright holders.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.roboconf.core.model.helpers;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import org.junit.Assert;
import org.junit.Test;
import net.roboconf.core.Constants;
import net.roboconf.core.internal.tests.ComplexApplicationFactory1;
import net.roboconf.core.internal.tests.TestApplication;
import net.roboconf.core.internal.tests.TestApplicationTemplate;
import net.roboconf.core.model.beans.AbstractType;
import net.roboconf.core.model.beans.Application;
import net.roboconf.core.model.beans.ApplicationTemplate;
import net.roboconf.core.model.beans.Component;
import net.roboconf.core.model.beans.ExportedVariable;
import net.roboconf.core.model.beans.Facet;
import net.roboconf.core.model.beans.Graphs;
import net.roboconf.core.model.beans.ImportedVariable;
/**
* @author Vincent Zurczak - Linagora
*/
public class ComponentHelpersTest {
@Test
public void testFindComponent() {
Graphs g = new Graphs();
Assert.assertNull( ComponentHelpers.findComponent( g, "c" ));
Component c1 = new Component( "c1" );
g.getRootComponents().add( c1 );
Assert.assertEquals( c1, ComponentHelpers.findComponent( g, "c1" ));
Component c2 = new Component( "c2" );
g.getRootComponents().add( c2 );
Assert.assertEquals( c2, ComponentHelpers.findComponent( g, "c2" ));
Component c21 = new Component( "c21" );
c2.addChild( c21 );
Assert.assertEquals( c21, ComponentHelpers.findComponent( g, "c21" ));
Component duplicateC1 = new Component( "c1" );
g.getRootComponents().add( duplicateC1 );
Assert.assertNotNull( ComponentHelpers.findComponent( g, "c1" ));
TestApplication app = new TestApplication();
Assert.assertNotNull( ComponentHelpers.findComponent( app, "tomcat" ));
Assert.assertNull( ComponentHelpers.findComponent( app, "tommy" ));
}
@Test
public void testFindComponentFrom() {
TestApplicationTemplate app = new TestApplicationTemplate();
Component comp = app.getTomcatVm().getComponent();
Assert.assertNull( ComponentHelpers.findComponentFrom( comp, "inexisting" ));
Assert.assertNull( ComponentHelpers.findComponentFrom( null, "inexisting" ));
Assert.assertEquals( comp, ComponentHelpers.findComponentFrom( comp, comp.getName()));
Component targetComp = app.getTomcat().getComponent();
Assert.assertEquals( targetComp, ComponentHelpers.findComponentFrom( comp, targetComp.getName()));
targetComp = app.getWar().getComponent();
Assert.assertEquals( targetComp, ComponentHelpers.findComponentFrom( comp, targetComp.getName()));
}
@Test
public void testSearchForLoop() {
Component c1 = new Component( "c1" );
Assert.assertNull( ComponentHelpers.searchForLoop( c1 ));
Component c11 = new Component( "c11" );
c1.addChild( c11 );
Assert.assertNull( ComponentHelpers.searchForLoop( c1 ));
Component c12 = new Component( "c1" );
c1.addChild( c12 );
Assert.assertEquals( "c1 -> c1", ComponentHelpers.searchForLoop( c1 ));
Assert.assertNull( ComponentHelpers.searchForLoop( c11 ));
Assert.assertNull( ComponentHelpers.searchForLoop( c12 ));
c12.setName( "c12" );
Component c121 = new Component( "c1" );
c12.addChild( c121 );
Assert.assertEquals( "c1 -> c12 -> c1", ComponentHelpers.searchForLoop( c1 ));
Assert.assertNull( ComponentHelpers.searchForLoop( c11 ));
Assert.assertNull( ComponentHelpers.searchForLoop( c12 ));
Assert.assertNull( ComponentHelpers.searchForLoop( c121 ));
c121.setName( "c121" );
c121.addChild( c1 );
Assert.assertEquals( "c1 -> c12 -> c121 -> c1", ComponentHelpers.searchForLoop( c1 ));
Assert.assertEquals( "c12 -> c121 -> c1 -> c12", ComponentHelpers.searchForLoop( c12 ));
Assert.assertEquals( "c121 -> c1 -> c12 -> c121", ComponentHelpers.searchForLoop( c121 ));
Assert.assertNull( ComponentHelpers.searchForLoop( c11 ));
}
@Test
public void testFindAllComponents_simple() {
ApplicationTemplate app = new ApplicationTemplate();
Assert.assertEquals( 0, ComponentHelpers.findAllComponents( app ).size());
Graphs graphs = new Graphs();
app.setGraphs( graphs );
Component comp1 = new Component( "comp1" );
graphs.getRootComponents().add( comp1 );
Assert.assertEquals( 1, ComponentHelpers.findAllComponents( app ).size());
comp1.addChild( new Component( "comp-2" ));
Assert.assertEquals( 2, ComponentHelpers.findAllComponents( app ).size());
Component comp3 = new Component( "comp_3" );
graphs.getRootComponents().add( comp3 );
comp3.addChild( new Component( "comp-2" ));
Assert.assertEquals( 3, ComponentHelpers.findAllComponents( app ).size());
}
@Test
public void testFindAllComponents_complex1() {
ApplicationTemplate app = ComplexApplicationFactory1.newApplication();
Assert.assertEquals( 10, ComponentHelpers.findAllComponents( app ).size());
}
@Test
public void testFindAllComponents_appInstance() {
ApplicationTemplate tpl = ComplexApplicationFactory1.newApplication();
Application app = new Application( tpl );
Assert.assertEquals( 10, ComponentHelpers.findAllComponents( app ).size());
app = new Application( null );
Assert.assertEquals( 0, ComponentHelpers.findAllComponents( app ).size());
}
@Test
public void testFindAllComponents_extended() {
ApplicationTemplate app = ComplexApplicationFactory1.newApplication();
app.getGraphs().getRootComponents().clear();
Component root1 = new Component( "root1" ).installerName( Constants.TARGET_INSTALLER );
Component root2 = new Component( "root2" );
Component root3 = new Component( "root3" );
Assert.assertEquals( 0, ComponentHelpers.findAllComponents( app ).size());
app.getGraphs().getRootComponents().add( root1 );
Assert.assertEquals( 1, ComponentHelpers.findAllComponents( app ).size());
root2.extendComponent( root1 );
Assert.assertEquals( 2, ComponentHelpers.findAllComponents( app ).size());
root3.extendComponent( root2 );
Assert.assertEquals( 3, ComponentHelpers.findAllComponents( app ).size());
app.getGraphs().getRootComponents().add( root2 );
app.getGraphs().getRootComponents().add( root3 );
Assert.assertEquals( 3, ComponentHelpers.findAllComponents( app ).size());
Component childComponent = new Component( "child" ).installerName( "script" );
root3.addChild( childComponent );
Assert.assertEquals( 4, ComponentHelpers.findAllComponents( app ).size());
}
@Test
public void testFindAllChildren_complex1() {
ApplicationTemplate app = ComplexApplicationFactory1.newApplication();
Component root1 = ComponentHelpers.findComponent( app.getGraphs(), ComplexApplicationFactory1.ROOT_1 );
Assert.assertNotNull( root1 );
Assert.assertEquals( 1, root1.getChildren().size());
Collection<Component> children = ComponentHelpers.findAllChildren( root1 );
Assert.assertEquals( 5, children.size());
Assert.assertTrue( children.contains( new Component( ComplexApplicationFactory1.GLASSFISH )));
Assert.assertTrue( children.contains( new Component( ComplexApplicationFactory1.TOMCAT )));
Assert.assertTrue( children.contains( new Component( ComplexApplicationFactory1.TOMCAT_8 )));
Assert.assertTrue( children.contains( new Component( ComplexApplicationFactory1.MYSQL )));
Assert.assertTrue( children.contains( new Component( ComplexApplicationFactory1.MONGO_DB )));
Component root2 = ComponentHelpers.findComponent( app.getGraphs(), ComplexApplicationFactory1.ROOT_2 );
Assert.assertNotNull( root2 );
Assert.assertEquals( 0, root2.getChildren().size());
children = ComponentHelpers.findAllChildren( root2 );
Assert.assertEquals( 4, children.size());
Assert.assertTrue( children.contains( new Component( ComplexApplicationFactory1.GLASSFISH )));
Assert.assertTrue( children.contains( new Component( ComplexApplicationFactory1.TOMCAT )));
Assert.assertTrue( children.contains( new Component( ComplexApplicationFactory1.TOMCAT_8 )));
Assert.assertTrue( children.contains( new Component( ComplexApplicationFactory1.MYSQL )));
Component c = ComponentHelpers.findComponent( app.getGraphs(), ComplexApplicationFactory1.GLASSFISH );
Assert.assertNotNull( c );
Assert.assertEquals( 0, c.getChildren().size());
Assert.assertEquals( 0, ComponentHelpers.findAllChildren( c ).size());
c = ComponentHelpers.findComponent( app.getGraphs(), ComplexApplicationFactory1.MONGO_DB );
Assert.assertNotNull( c );
Assert.assertEquals( 0, c.getChildren().size());
Assert.assertEquals( 0, ComponentHelpers.findAllChildren( c ).size());
c = ComponentHelpers.findComponent( app.getGraphs(), ComplexApplicationFactory1.TOMCAT_8 );
Assert.assertNotNull( c );
Assert.assertEquals( 1, c.getChildren().size());
Assert.assertEquals( ComplexApplicationFactory1.APP_3, c.getChildren().iterator().next().getName());
List<Component> lastChildren = new ArrayList<Component> ();
lastChildren.addAll( ComponentHelpers.findAllChildren( c ));
Assert.assertEquals( 3, lastChildren.size());
Assert.assertEquals( ComplexApplicationFactory1.APP_1, lastChildren.get( 0 ).getName());
Assert.assertEquals( ComplexApplicationFactory1.APP_2, lastChildren.get( 1 ).getName());
Assert.assertEquals( ComplexApplicationFactory1.APP_3, lastChildren.get( 2 ).getName());
}
@Test
public void testFindAllChildren_testApp() {
TestApplicationTemplate app = new TestApplicationTemplate();
Collection<Component> children = ComponentHelpers.findAllChildren( app.getTomcat().getComponent());
Assert.assertEquals( 1, children.size());
Assert.assertTrue( children.contains( app.getWar().getComponent()));
children = ComponentHelpers.findAllChildren( app.getTomcatVm().getComponent());
Assert.assertEquals( 2, children.size());
Assert.assertTrue( children.contains( app.getTomcat().getComponent()));
Assert.assertTrue( children.contains( app.getMySql().getComponent()));
children = ComponentHelpers.findAllChildren( app.getMySqlVm().getComponent());
Assert.assertEquals( 2, children.size());
Assert.assertTrue( children.contains( app.getTomcat().getComponent()));
Assert.assertTrue( children.contains( app.getMySql().getComponent()));
Assert.assertEquals( 0, ComponentHelpers.findAllChildren( app.getMySql().getComponent()).size());
Assert.assertEquals( 0, ComponentHelpers.findAllChildren( app.getWar().getComponent()).size());
}
@Test
public void testFixVariableName() {
Component comp = new Component( "coMp" );
Assert.assertEquals( "coMp.ip", ComponentHelpers.fixVariableName( comp, "ip" ));
Assert.assertEquals( "coMp.ip", ComponentHelpers.fixVariableName( comp, "coMp.ip" ));
Facet facet = new Facet( "f" );
Assert.assertEquals( "f.port", ComponentHelpers.fixVariableName( facet, "port" ));
Assert.assertEquals( "f.ip", ComponentHelpers.fixVariableName( facet, "f.ip" ));
}
@Test
public void testFindFacets() {
ApplicationTemplate app = ComplexApplicationFactory1.newApplication();
Component root1 = ComponentHelpers.findComponent( app.getGraphs(), ComplexApplicationFactory1.ROOT_1 );
Assert.assertNotNull( root1 );
Assert.assertEquals( 1, root1.getFacets().size());
Facet vm = root1.getFacets().iterator().next();
Assert.assertEquals( ComplexApplicationFactory1.FACET_VM, vm.getName());
Assert.assertEquals( 1, vm.getChildren().size());
Facet deployable = (Facet) vm.getChildren().iterator().next();
Assert.assertEquals( ComplexApplicationFactory1.FACET_DEPLOYABLE, deployable.getName());
Collection<Facet> facets = ComponentHelpers.findAllExtendingFacets( deployable );
Assert.assertEquals( 4, facets.size());
Assert.assertTrue( facets.contains( new Facet( ComplexApplicationFactory1.FACET_DATABASE )));
Assert.assertTrue( facets.contains( new Facet( ComplexApplicationFactory1.FACET_JEE )));
Assert.assertTrue( facets.contains( new Facet( ComplexApplicationFactory1.FACET_STORAGE )));
Assert.assertTrue( facets.contains( new Facet( ComplexApplicationFactory1.FACET_WEB )));
Assert.assertEquals( 0, ComponentHelpers.findAllExtendingFacets( vm ).size());
Assert.assertEquals( 0, ComponentHelpers.findAllExtendedFacets( vm ).size());
Facet web = findFacetByName( facets, ComplexApplicationFactory1.FACET_WEB );
Assert.assertNotNull( web );
Assert.assertEquals( 0, ComponentHelpers.findAllExtendingFacets( web ).size());
Facet db = findFacetByName( facets, ComplexApplicationFactory1.FACET_DATABASE );
Assert.assertNotNull( db );
Facet storage = findFacetByName( facets, ComplexApplicationFactory1.FACET_STORAGE );
Assert.assertNotNull( storage );
facets = ComponentHelpers.findAllExtendingFacets( db );
Assert.assertEquals( 1, facets.size());
Assert.assertTrue( facets.contains( new Facet( ComplexApplicationFactory1.FACET_STORAGE )));
facets = ComponentHelpers.findAllExtendedFacets( db );
Assert.assertEquals( 1, facets.size());
Assert.assertTrue( facets.contains( new Facet( ComplexApplicationFactory1.FACET_DEPLOYABLE )));
facets = ComponentHelpers.findAllExtendingFacets( storage );
Assert.assertEquals( 0, facets.size());
facets = ComponentHelpers.findAllExtendedFacets( storage );
Assert.assertEquals( 2, facets.size());
Assert.assertTrue( facets.contains( new Facet( ComplexApplicationFactory1.FACET_DEPLOYABLE )));
Assert.assertTrue( facets.contains( new Facet( ComplexApplicationFactory1.FACET_DATABASE )));
}
@Test
public void testFindAllFacets() {
ApplicationTemplate app = ComplexApplicationFactory1.newApplication();
Component root1 = ComponentHelpers.findComponent( app.getGraphs(), ComplexApplicationFactory1.ROOT_1 );
Assert.assertNotNull( root1 );
Collection<Facet> facets = ComponentHelpers.findAllFacets( root1 );
Assert.assertEquals( 1, facets.size());
Assert.assertTrue( facets.contains( new Facet( ComplexApplicationFactory1.FACET_VM )));
Component mongoDb = ComponentHelpers.findComponent( app.getGraphs(), ComplexApplicationFactory1.MONGO_DB );
Assert.assertNotNull( mongoDb );
facets = ComponentHelpers.findAllFacets( mongoDb );
Assert.assertEquals( 0, facets.size());
Component glassfish = ComponentHelpers.findComponent( app.getGraphs(), ComplexApplicationFactory1.GLASSFISH );
Assert.assertNotNull( glassfish );
facets = ComponentHelpers.findAllFacets( glassfish );
Assert.assertEquals( 3, facets.size());
Assert.assertTrue( facets.contains( new Facet( ComplexApplicationFactory1.FACET_JEE )));
Assert.assertTrue( facets.contains( new Facet( ComplexApplicationFactory1.FACET_WEB )));
Assert.assertTrue( facets.contains( new Facet( ComplexApplicationFactory1.FACET_DEPLOYABLE )));
Component tomcat = ComponentHelpers.findComponent( app.getGraphs(), ComplexApplicationFactory1.TOMCAT );
Assert.assertNotNull( tomcat );
facets = ComponentHelpers.findAllFacets( tomcat );
Assert.assertEquals( 2, facets.size());
Assert.assertTrue( facets.contains( new Facet( ComplexApplicationFactory1.FACET_WEB )));
Assert.assertTrue( facets.contains( new Facet( ComplexApplicationFactory1.FACET_DEPLOYABLE )));
Component tomcat8 = ComponentHelpers.findComponent( app.getGraphs(), ComplexApplicationFactory1.TOMCAT_8 );
Assert.assertNotNull( tomcat8 );
facets = ComponentHelpers.findAllFacets( tomcat8 );
Assert.assertEquals( 2, facets.size());
Assert.assertTrue( facets.contains( new Facet( ComplexApplicationFactory1.FACET_WEB )));
Assert.assertTrue( facets.contains( new Facet( ComplexApplicationFactory1.FACET_DEPLOYABLE )));
}
@Test
public void testFindAllExtendedComponents_complex1() {
ApplicationTemplate app = ComplexApplicationFactory1.newApplication();
Component tomcat = ComponentHelpers.findComponent( app.getGraphs(), ComplexApplicationFactory1.TOMCAT );
Assert.assertNotNull( tomcat );
Collection<Component> extended = ComponentHelpers.findAllExtendedComponents( tomcat );
Assert.assertEquals( 1, extended.size());
Assert.assertTrue( extended.contains( tomcat ));
Component tomcat8 = ComponentHelpers.findComponent( app.getGraphs(), ComplexApplicationFactory1.TOMCAT_8 );
Assert.assertNotNull( tomcat8 );
extended = ComponentHelpers.findAllExtendedComponents( tomcat8 );
Assert.assertEquals( 2, extended.size());
Assert.assertTrue( extended.contains( tomcat ));
Assert.assertTrue( extended.contains( tomcat8 ));
}
@Test
public void testFindAllExtendedComponents_cycle() {
Component c1 = new Component( "c1" );
Component c2 = new Component( "c2" );
Component c3 = new Component( "c3" );
c3.extendComponent( c2 );
c2.extendComponent( c1 );
Collection<Component> extended = ComponentHelpers.findAllExtendedComponents( c1 );
Assert.assertEquals( 1, extended.size());
extended = ComponentHelpers.findAllExtendedComponents( c2 );
Assert.assertEquals( 2, extended.size());
Assert.assertTrue( extended.contains( c1 ));
Assert.assertTrue( extended.contains( c2 ));
extended = ComponentHelpers.findAllExtendedComponents( c3 );
Assert.assertEquals( 3, extended.size());
Assert.assertTrue( extended.contains( c1 ));
Assert.assertTrue( extended.contains( c2 ));
Assert.assertTrue( extended.contains( c3 ));
c1.extendComponent( c3 );
Assert.assertEquals( 3, ComponentHelpers.findAllExtendedComponents( c1 ).size());
Assert.assertEquals( 3, ComponentHelpers.findAllExtendedComponents( c2 ).size());
Assert.assertEquals( 3, ComponentHelpers.findAllExtendedComponents( c3 ).size());
}
@Test
public void testFindAllExtendingComponents_complex1() {
ApplicationTemplate app = ComplexApplicationFactory1.newApplication();
Component tomcat8 = ComponentHelpers.findComponent( app.getGraphs(), ComplexApplicationFactory1.TOMCAT_8 );
Assert.assertNotNull( tomcat8 );
Collection<Component> extending = ComponentHelpers.findAllExtendingComponents( tomcat8 );
Assert.assertEquals( 0, extending.size());
Component tomcat = ComponentHelpers.findComponent( app.getGraphs(), ComplexApplicationFactory1.TOMCAT );
Assert.assertNotNull( tomcat );
extending = ComponentHelpers.findAllExtendingComponents( tomcat );
Assert.assertEquals( 1, extending.size());
Assert.assertTrue( extending.contains( tomcat8 ));
}
@Test
public void testFindAllExtendingComponents_cycle() {
Component c1 = new Component( "c1" );
Component c2 = new Component( "c2" );
Component c3 = new Component( "c3" );
c3.extendComponent( c2 );
c2.extendComponent( c1 );
Collection<Component> extending = ComponentHelpers.findAllExtendingComponents( c3 );
Assert.assertEquals( 0, extending.size());
extending = ComponentHelpers.findAllExtendingComponents( c2 );
Assert.assertEquals( 1, extending.size());
Assert.assertTrue( extending.contains( c3 ));
extending = ComponentHelpers.findAllExtendingComponents( c1 );
Assert.assertEquals( 2, extending.size());
Assert.assertTrue( extending.contains( c2 ));
Assert.assertTrue( extending.contains( c3 ));
c1.extendComponent( c3 );
Assert.assertEquals( 2, ComponentHelpers.findAllExtendingComponents( c1 ).size());
Assert.assertEquals( 2, ComponentHelpers.findAllExtendingComponents( c2 ).size());
Assert.assertEquals( 2, ComponentHelpers.findAllExtendingComponents( c3 ).size());
}
@Test
public void testFindAllAncestors_testApp() {
TestApplicationTemplate app = new TestApplicationTemplate();
Collection<Component> ancestors = ComponentHelpers.findAllAncestors( app.getTomcat().getComponent());
Assert.assertEquals( 1, ancestors.size());
Assert.assertTrue( ancestors.contains( app.getMySqlVm().getComponent()));
Assert.assertTrue( ancestors.contains( app.getTomcatVm().getComponent()));
ancestors = ComponentHelpers.findAllAncestors( app.getMySql().getComponent());
Assert.assertEquals( 1, ancestors.size());
Assert.assertTrue( ancestors.contains( app.getMySqlVm().getComponent()));
Assert.assertTrue( ancestors.contains( app.getTomcatVm().getComponent()));
ancestors = ComponentHelpers.findAllAncestors( app.getWar().getComponent());
Assert.assertEquals( 1, ancestors.size());
Assert.assertTrue( ancestors.contains( app.getTomcat().getComponent()));
Assert.assertEquals( 0, ComponentHelpers.findAllAncestors( app.getMySqlVm().getComponent()).size());
Assert.assertEquals( 0, ComponentHelpers.findAllAncestors( app.getTomcatVm().getComponent()).size());
}
@Test
public void testFindAllAncestors_complex1() {
ApplicationTemplate app = ComplexApplicationFactory1.newApplication();
Component root1 = ComponentHelpers.findComponent( app.getGraphs(), ComplexApplicationFactory1.ROOT_1 );
Assert.assertNotNull( root1 );
Collection<Component> ancestors = ComponentHelpers.findAllAncestors( root1 );
Assert.assertEquals( 0, ancestors.size());
Component root2 = ComponentHelpers.findComponent( app.getGraphs(), ComplexApplicationFactory1.ROOT_2 );
Assert.assertNotNull( root2 );
ancestors = ComponentHelpers.findAllAncestors( root2 );
Assert.assertEquals( 0, ancestors.size());
Component mongoDb = ComponentHelpers.findComponent( app.getGraphs(), ComplexApplicationFactory1.MONGO_DB );
Assert.assertNotNull( mongoDb );
ancestors = ComponentHelpers.findAllAncestors( mongoDb );
Assert.assertEquals( 1, ancestors.size());
Assert.assertTrue( ancestors.contains( root1 ));
Component glassfish = ComponentHelpers.findComponent( app.getGraphs(), ComplexApplicationFactory1.GLASSFISH );
Assert.assertNotNull( glassfish );
ancestors = ComponentHelpers.findAllAncestors( glassfish );
Assert.assertEquals( 2, ancestors.size());
Assert.assertTrue( ancestors.contains( root1 ));
Assert.assertTrue( ancestors.contains( root2 ));
Component tomcat = ComponentHelpers.findComponent( app.getGraphs(), ComplexApplicationFactory1.TOMCAT );
Assert.assertNotNull( tomcat );
ancestors = ComponentHelpers.findAllAncestors( tomcat );
Assert.assertEquals( 2, ancestors.size());
Assert.assertTrue( ancestors.contains( root1 ));
Assert.assertTrue( ancestors.contains( root2 ));
Component tomcat8 = ComponentHelpers.findComponent( app.getGraphs(), ComplexApplicationFactory1.TOMCAT_8 );
Assert.assertNotNull( tomcat8 );
ancestors = ComponentHelpers.findAllAncestors( tomcat8 );
Assert.assertEquals( 2, ancestors.size());
Assert.assertTrue( ancestors.contains( root1 ));
Assert.assertTrue( ancestors.contains( root2 ));
}
@Test
public void testFindAllImportedVariables() {
Component root = new Component( "root" );
Component serverWithApp = new Component( "server with app" );
Component serverWithAnotherApp = new Component( "server with another app" );
Component db = new Component( "database" );
root.addChild( db );
root.addChild( serverWithAnotherApp );
root.addChild( serverWithApp );
serverWithApp.addImportedVariable( new ImportedVariable( "database.ip", false, false ));
serverWithApp.addImportedVariable( new ImportedVariable( "database.port", true, false ));
serverWithApp.addExportedVariable( new ExportedVariable( "url", "something" ));
serverWithAnotherApp.extendComponent( serverWithApp );
// Override the optional or mandatory aspect of an imported variable
serverWithAnotherApp.addImportedVariable( new ImportedVariable( "database.port", false, false ));
serverWithAnotherApp.addImportedVariable( new ImportedVariable( "whatever", false, false ));
db.addExportedVariable( new ExportedVariable( "ip", null ));
db.addExportedVariable( new ExportedVariable( "port", "3306" ));
Assert.assertEquals( 0, ComponentHelpers.findAllImportedVariables( db ).size());
Assert.assertEquals( 0, ComponentHelpers.findAllImportedVariables( root ).size());
Map<String,ImportedVariable> imports = ComponentHelpers.findAllImportedVariables( serverWithApp );
Assert.assertEquals( 2, imports.size());
Assert.assertTrue( imports.containsKey( "database.ip" ));
Assert.assertTrue( imports.containsKey( "database.port" ));
Assert.assertTrue( imports.get( "database.port" ).isOptional());
Assert.assertFalse( imports.get( "database.ip" ).isOptional());
imports = ComponentHelpers.findAllImportedVariables( serverWithAnotherApp );
Assert.assertEquals( 3, imports.size());
Assert.assertTrue( imports.containsKey( "database.ip" ));
Assert.assertTrue( imports.containsKey( "database.port" ));
Assert.assertTrue( imports.containsKey( "whatever" ));
Assert.assertFalse( imports.get( "database.ip" ).isOptional());
Assert.assertFalse( imports.get( "database.port" ).isOptional());
Assert.assertFalse( imports.get( "whatever" ).isOptional());
}
@Test
public void testFindAllExportedVariables_simple() {
Component comp = new Component( "comp" );
Map<String,String> exports = ComponentHelpers.findAllExportedVariables( comp );
Assert.assertEquals( 0, exports.size());
comp.addExportedVariable( new ExportedVariable( "test", "ok" ));
exports = ComponentHelpers.findAllExportedVariables( comp );
Assert.assertEquals( 1, exports.size());
Assert.assertEquals( "ok", exports.get( "comp.test" ));
}
@Test
public void testFindAllExportedVariables_withFacet() {
Component comp = new Component( "comp" );
comp.addExportedVariable( new ExportedVariable( "test", "ok" ));
Facet f = new Facet( "facet" );
f.addExportedVariable( new ExportedVariable( "property", "value" ));
comp.associateFacet( f );
Map<String,String> exports = ComponentHelpers.findAllExportedVariables( comp );
Assert.assertEquals( 3, exports.size());
Assert.assertEquals( "ok", exports.get( "comp.test" ));
Assert.assertEquals( "value", exports.get( "facet.property" ));
Assert.assertEquals( "value", exports.get( "comp.property" ));
// Override a facet property
comp.addExportedVariable( new ExportedVariable( "facet.property", "something different" ));
exports = ComponentHelpers.findAllExportedVariables( comp );
Assert.assertEquals( 3, exports.size());
Assert.assertEquals( "ok", exports.get( "comp.test" ));
Assert.assertEquals( "something different", exports.get( "facet.property" ));
Assert.assertEquals( "something different", exports.get( "comp.property" ));
// Global override
comp.exportedVariables.remove( "facet.property" );
comp.addExportedVariable( new ExportedVariable( "property", "great" ));
exports = ComponentHelpers.findAllExportedVariables( comp );
Assert.assertEquals( 3, exports.size());
Assert.assertEquals( "ok", exports.get( "comp.test" ));
Assert.assertEquals( "great", exports.get( "facet.property" ));
Assert.assertEquals( "great", exports.get( "comp.property" ));
// Local override
comp.exportedVariables.remove( "property" );
comp.addExportedVariable( new ExportedVariable( "comp.property", "ha! ha!" ));
exports = ComponentHelpers.findAllExportedVariables( comp );
Assert.assertEquals( 3, exports.size());
Assert.assertEquals( "ok", exports.get( "comp.test" ));
Assert.assertEquals( "value", exports.get( "facet.property" ));
Assert.assertEquals( "ha! ha!", exports.get( "comp.property" ));
// Verify we find the same thing with the abstract method
Map<String,String> abstractExports = ComponentHelpers.findAllExportedVariables((AbstractType) comp);
Assert.assertEquals( abstractExports.size(), exports.size());
abstractExports = ComponentHelpers.findAllExportedVariables((AbstractType) f);
Assert.assertEquals( 1, abstractExports.size());
}
@Test
public void testFindAllExportedVariables_withComponentExtension() {
Component comp = new Component( "comp" );
comp.addExportedVariable( new ExportedVariable( "test", "ok" ));
Component parent = new Component( "parent" );
parent.addExportedVariable( new ExportedVariable( "property", "value" ));
comp.extendComponent( parent );
Map<String,String> exports = ComponentHelpers.findAllExportedVariables( comp );
Assert.assertEquals( 3, exports.size());
Assert.assertEquals( "ok", exports.get( "comp.test" ));
Assert.assertEquals( "value", exports.get( "parent.property" ));
Assert.assertEquals( "value", exports.get( "comp.property" ));
// Override a parent property
comp.addExportedVariable( new ExportedVariable( "parent.property", "something different" ));
exports = ComponentHelpers.findAllExportedVariables( comp );
Assert.assertEquals( 3, exports.size());
Assert.assertEquals( "ok", exports.get( "comp.test" ));
Assert.assertEquals( "something different", exports.get( "parent.property" ));
Assert.assertEquals( "something different", exports.get( "comp.property" ));
// Global override
comp.exportedVariables.remove( "parent.property" );
comp.addExportedVariable( new ExportedVariable( "property", "great" ));
exports = ComponentHelpers.findAllExportedVariables( comp );
Assert.assertEquals( 3, exports.size());
Assert.assertEquals( "ok", exports.get( "comp.test" ));
Assert.assertEquals( "great", exports.get( "parent.property" ));
Assert.assertEquals( "great", exports.get( "comp.property" ));
// Local override
comp.exportedVariables.remove( "property" );
comp.addExportedVariable( new ExportedVariable( "comp.property", "ha! ha!" ));
exports = ComponentHelpers.findAllExportedVariables( comp );
Assert.assertEquals( 3, exports.size());
Assert.assertEquals( "ok", exports.get( "comp.test" ));
Assert.assertEquals( "value", exports.get( "parent.property" ));
Assert.assertEquals( "ha! ha!", exports.get( "comp.property" ));
}
@Test
public void testFindAllExportedVariables_veryComplex() {
// Create a model
Component root = new Component( "root" );
Component serverWithApp = new Component( "server with app" );
Component serverWithAnotherApp = new Component( "server with another app" );
Component db = new Component( "database" );
root.addChild( db );
root.addChild( serverWithAnotherApp );
root.addChild( serverWithApp );
serverWithAnotherApp.extendComponent( serverWithApp );
Facet serverFacet = new Facet( "server facet" );
Facet anotherServerFacet = new Facet( "another server facet" );
anotherServerFacet.extendFacet( serverFacet );
serverFacet.addExportedVariable( new ExportedVariable( "url-suffix", "some/path" ));
serverWithApp.associateFacet( anotherServerFacet );
serverWithApp.addExportedVariable( new ExportedVariable( "ip", null ));
serverWithApp.addExportedVariable( new ExportedVariable( serverWithApp.getName() + ".port", "8080" ));
serverWithApp.addExportedVariable( new ExportedVariable( "env", "test" ));
// Override the value of a variable that comes from a super facet/component
serverWithAnotherApp.addExportedVariable( new ExportedVariable( serverFacet.getName() + ".url-suffix", "another/path" ));
serverWithAnotherApp.addExportedVariable( new ExportedVariable( "whatever", "something" ));
serverWithAnotherApp.addExportedVariable( new ExportedVariable( "env", "prod" ));
db.addExportedVariable( new ExportedVariable( "ip", null ));
db.addExportedVariable( new ExportedVariable( "port", "3306" ));
// Check assertions
Assert.assertEquals( 0, ComponentHelpers.findAllExportedVariables( root ).size());
Map<String,String> exports = ComponentHelpers.findAllExportedVariables( db );
Assert.assertEquals( 2, exports.size());
Assert.assertTrue( exports.containsKey( "database.ip" ));
Assert.assertNull( exports.get( "database.ip" ));
Assert.assertEquals( "3306", exports.get( "database.port" ));
exports = ComponentHelpers.findAllExportedVariables( serverWithApp );
Assert.assertEquals( 5, exports.size());
Assert.assertTrue( exports.containsKey( serverWithApp.getName() + ".ip" ));
Assert.assertNull( exports.get( serverWithApp.getName() + ".ip" ));
Assert.assertEquals( "8080", exports.get( serverWithApp.getName() + ".port" ));
Assert.assertEquals( "test", exports.get( serverWithApp.getName() + ".env" ));
Assert.assertEquals( "some/path", exports.get( serverWithApp.getName() + ".url-suffix" ));
Assert.assertEquals( "some/path", exports.get( serverFacet.getName() + ".url-suffix" ));
// Since there is inheritance, there will be variables duplication
exports = ComponentHelpers.findAllExportedVariables( serverWithAnotherApp );
Assert.assertEquals( 10, exports.size());
Assert.assertTrue( exports.containsKey( serverWithApp.getName() + ".ip" ));
Assert.assertNull( exports.get( serverWithApp.getName() + ".ip" ));
Assert.assertTrue( exports.containsKey( serverWithAnotherApp.getName() + ".ip" ));
Assert.assertNull( exports.get( serverWithAnotherApp.getName() + ".ip" ));
Assert.assertEquals( "8080", exports.get( serverWithApp.getName() + ".port" ));
Assert.assertEquals( "8080", exports.get( serverWithAnotherApp.getName() + ".port" ));
Assert.assertEquals( "another/path", exports.get( serverFacet.getName() + ".url-suffix" ));
Assert.assertEquals( "some/path", exports.get( serverWithApp.getName() + ".url-suffix" ));
Assert.assertEquals( "some/path", exports.get( serverWithAnotherApp.getName() + ".url-suffix" ));
Assert.assertEquals( "something", exports.get( serverWithAnotherApp.getName() + ".whatever" ));
Assert.assertEquals( "prod", exports.get( serverWithApp.getName() + ".env" ));
Assert.assertEquals( "prod", exports.get( serverWithAnotherApp.getName() + ".env" ));
}
@Test
public void testExtractNames() {
List<Component> components = new ArrayList<Component> ();
components.add( new Component( "c1" ));
components.add( new Component( "c2" ));
List<String> names = ComponentHelpers.extractNames( components );
Assert.assertEquals( 2, names.size());
Assert.assertEquals( "c1", names.get( 0 ));
Assert.assertEquals( "c2", names.get( 1 ));
}
@Test
public void testFindComponentDependenciesFor_namesOnly() {
ApplicationTemplate app = ComplexApplicationFactory1.newApplication();
// Root with no dependency
Component comp = ComponentHelpers.findComponent( app.getGraphs(), ComplexApplicationFactory1.ROOT_1 );
Assert.assertNotNull( comp );
Map<String,Boolean> map = ComponentHelpers.findComponentDependenciesFor( comp );
Assert.assertEquals( 0, map.size());
// Application with several dependencies
comp = ComponentHelpers.findComponent( app.getGraphs(), ComplexApplicationFactory1.APP_1 );
Assert.assertNotNull( comp );
map = ComponentHelpers.findComponentDependenciesFor( comp );
Assert.assertEquals( 1, map.size());
Assert.assertTrue( map.containsKey( ComplexApplicationFactory1.FACET_DATABASE ));
Assert.assertTrue( map.get( ComplexApplicationFactory1.FACET_DATABASE ));
// Another application
comp = ComponentHelpers.findComponent( app.getGraphs(), ComplexApplicationFactory1.APP_2 );
Assert.assertNotNull( comp );
map = ComponentHelpers.findComponentDependenciesFor( comp );
Assert.assertEquals( 2, map.size());
Assert.assertTrue( map.containsKey( ComplexApplicationFactory1.MYSQL ));
Assert.assertFalse( map.get( ComplexApplicationFactory1.MYSQL ));
Assert.assertTrue( map.containsKey( ComplexApplicationFactory1.MONGO_DB ));
Assert.assertTrue( map.get( ComplexApplicationFactory1.MONGO_DB ));
// And another one
comp = ComponentHelpers.findComponent( app.getGraphs(), ComplexApplicationFactory1.APP_3 );
Assert.assertNotNull( comp );
map = ComponentHelpers.findComponentDependenciesFor( comp );
Assert.assertEquals( 0, map.size());
}
@Test
public void testFindComponentDependenciesFor_resolvedComponents() {
ApplicationTemplate app = ComplexApplicationFactory1.newApplication();
// Root with no dependency
Component comp = ComponentHelpers.findComponent( app.getGraphs(), ComplexApplicationFactory1.ROOT_1 );
Assert.assertNotNull( comp );
Map<Component,Boolean> map = ComponentHelpers.findComponentDependenciesFor( comp, app );
Assert.assertEquals( 0, map.size());
// Application with several dependencies
comp = ComponentHelpers.findComponent( app.getGraphs(), ComplexApplicationFactory1.APP_1 );
Assert.assertNotNull( comp );
map = ComponentHelpers.findComponentDependenciesFor( comp, app );
Assert.assertEquals( 1, map.size());
// We look for a Database facet. And only one component has it: MySql.
Component key = new Component( ComplexApplicationFactory1.MYSQL );
Assert.assertTrue( map.containsKey( key ));
Assert.assertTrue( map.get( key ));
// Another application
comp = ComponentHelpers.findComponent( app.getGraphs(), ComplexApplicationFactory1.APP_2 );
Assert.assertNotNull( comp );
map = ComponentHelpers.findComponentDependenciesFor( comp, app );
Assert.assertEquals( 2, map.size());
key = new Component( ComplexApplicationFactory1.MYSQL );
Assert.assertTrue( map.containsKey( key ));
Assert.assertFalse( map.get( key ));
key = new Component( ComplexApplicationFactory1.MONGO_DB );
Assert.assertTrue( map.containsKey( key ));
Assert.assertTrue( map.get( key ));
// And another one
comp = ComponentHelpers.findComponent( app.getGraphs(), ComplexApplicationFactory1.APP_3 );
Assert.assertNotNull( comp );
map = ComponentHelpers.findComponentDependenciesFor( comp, app );
Assert.assertEquals( 0, map.size());
}
@Test
public void testFindComponentsThatDependOn() {
ApplicationTemplate app = ComplexApplicationFactory1.newApplication();
// Root with no dependency
Component comp = ComponentHelpers.findComponent( app.getGraphs(), ComplexApplicationFactory1.ROOT_1 );
Assert.assertNotNull( comp );
Map<Component,Boolean> map = ComponentHelpers.findComponentsThatDependOn( comp, app );
Assert.assertEquals( 0, map.size());
// Application with several dependencies
comp = ComponentHelpers.findComponent( app.getGraphs(), ComplexApplicationFactory1.MYSQL );
Assert.assertNotNull( comp );
map = ComponentHelpers.findComponentsThatDependOn( comp, app );
Assert.assertEquals( 2, map.size());
Component key = new Component( ComplexApplicationFactory1.APP_1 );
Assert.assertTrue( map.containsKey( key ));
Assert.assertTrue( map.get( key ));
key = new Component( ComplexApplicationFactory1.APP_2 );
Assert.assertTrue( map.containsKey( key ));
Assert.assertFalse( map.get( key ));
// And another one
comp = ComponentHelpers.findComponent( app.getGraphs(), ComplexApplicationFactory1.MONGO_DB );
Assert.assertNotNull( comp );
map = ComponentHelpers.findComponentsThatDependOn( comp, app );
Assert.assertEquals( 1, map.size());
key = new Component( ComplexApplicationFactory1.APP_2 );
Assert.assertTrue( map.containsKey( key ));
Assert.assertTrue( map.get( key ));
// And again, another one
comp = ComponentHelpers.findComponent( app.getGraphs(), ComplexApplicationFactory1.APP_3 );
Assert.assertNotNull( comp );
map = ComponentHelpers.findComponentsThatDependOn( comp, app );
Assert.assertEquals( 0, map.size());
}
private Facet findFacetByName( Collection<Facet> facets, String facetName ) {
Facet result = null;
for( Facet f : facets ) {
if( facetName.equals( f.getName())) {
result = f;
break;
}
}
return result;
}
}