/*
***************************************************************************************
* Copyright (C) 2006 EsperTech, Inc. All rights reserved. *
* http://www.espertech.com/esper *
* http://www.espertech.com *
* ---------------------------------------------------------------------------------- *
* The software in this package is published under the terms of the GPL license *
* a copy of which has been included with this distribution in the license.txt file. *
***************************************************************************************
*/
package com.espertech.esper.regression.client;
import com.espertech.esper.client.EPServiceProvider;
import com.espertech.esper.client.EPServiceProviderManager;
import com.espertech.esper.client.deploy.*;
import com.espertech.esper.client.scopetest.EPAssertionUtil;
import com.espertech.esper.metrics.instrumentation.InstrumentationHelper;
import com.espertech.esper.supportregression.client.SupportConfigFactory;
import junit.framework.TestCase;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
public class TestDeployOrder extends TestCase
{
private EPServiceProvider epService;
private EPDeploymentAdmin deploymentAdmin;
public void setUp() {
epService = EPServiceProviderManager.getDefaultProvider(SupportConfigFactory.getConfiguration());
epService.initialize();
deploymentAdmin = epService.getEPAdministrator().getDeploymentAdmin();
if (InstrumentationHelper.ENABLED) { InstrumentationHelper.startTest(epService, this.getClass(), getName());}
}
public void tearDown() {
if (InstrumentationHelper.ENABLED) { InstrumentationHelper.endTest();}
}
public void testOrder() throws Exception {
Module moduleA = null;
Module moduleB = null;
Module moduleC = null;
Module moduleD = null;
Module moduleE = null;
DeploymentOrder order = null;
// Tree of 4 deep
moduleA = getModule("A");
moduleB = getModule("B", "A");
moduleC = getModule("C", "A", "B", "D");
moduleD = getModule("D", "A", "B");
order = deploymentAdmin.getDeploymentOrder(Arrays.asList(new Module[] {moduleC, moduleD, moduleB, moduleA}), new DeploymentOrderOptions());
assertOrder(new Module[] {moduleA, moduleB, moduleD, moduleC}, order);
// Zero items
order = deploymentAdmin.getDeploymentOrder(Arrays.asList(new Module[] {}), new DeploymentOrderOptions());
assertOrder(new Module[] {}, order);
// 1 item
moduleA = getModule("A");
order = deploymentAdmin.getDeploymentOrder(Arrays.asList(new Module[] {moduleA}), new DeploymentOrderOptions());
assertOrder(new Module[] {moduleA}, order);
// 2 item
moduleA = getModule("A", "B");
moduleB = getModule("B");
order = deploymentAdmin.getDeploymentOrder(Arrays.asList(new Module[] {moduleB, moduleA}), new DeploymentOrderOptions());
assertOrder(new Module[] {moduleB, moduleA}, order);
// 3 item
moduleB = getModule("B");
moduleC = getModule("C", "B");
moduleD = getModule("D");
order = deploymentAdmin.getDeploymentOrder(Arrays.asList(new Module[] {moduleB, moduleC, moduleD}), new DeploymentOrderOptions());
assertOrder(new Module[] {moduleB, moduleC, moduleD}, order);
order = deploymentAdmin.getDeploymentOrder(Arrays.asList(new Module[] {moduleD, moduleC, moduleB}), new DeploymentOrderOptions());
assertOrder(new Module[] {moduleB, moduleD, moduleC}, order);
// 2 trees of 2 deep
moduleA = getModule("A", "B");
moduleB = getModule("B");
moduleC = getModule("C", "D");
moduleD = getModule("D");
order = deploymentAdmin.getDeploymentOrder(Arrays.asList(new Module[] {moduleC, moduleB, moduleA, moduleD}), new DeploymentOrderOptions());
assertOrder(new Module[] {moduleB, moduleD, moduleC, moduleA}, order);
// Tree of 5 deep
moduleA = getModule("A", "C");
moduleB = getModule("B");
moduleC = getModule("C", "B");
moduleD = getModule("D", "C", "E");
moduleE = getModule("E");
order = deploymentAdmin.getDeploymentOrder(Arrays.asList(new Module[] {moduleA, moduleB, moduleC, moduleD, moduleE}), new DeploymentOrderOptions());
assertOrder(new Module[] {moduleB, moduleC, moduleE, moduleA, moduleD}, order);
order = deploymentAdmin.getDeploymentOrder(Arrays.asList(new Module[] {moduleB, moduleE, moduleC, moduleA, moduleD}), new DeploymentOrderOptions());
assertOrder(new Module[] {moduleB, moduleE, moduleC, moduleA, moduleD}, order);
order = deploymentAdmin.getDeploymentOrder(Arrays.asList(new Module[] {moduleA, moduleD, moduleE, moduleC, moduleB}), new DeploymentOrderOptions());
assertOrder(new Module[] {moduleB, moduleE, moduleC, moduleA, moduleD}, order);
// Tree with null names
moduleA = getModule(null, "C", "A", "B", "D");
moduleB = getModule(null, "C");
moduleC = getModule("A");
moduleD = getModule("B", "A", "C");
moduleE = getModule("C");
DeploymentOrderOptions options = new DeploymentOrderOptions();
options.setCheckUses(false);
order = deploymentAdmin.getDeploymentOrder(Arrays.asList(new Module[] {moduleA, moduleB, moduleC, moduleD, moduleE}), options);
assertOrder(new Module[] {moduleC, moduleE, moduleD, moduleA, moduleB}, order);
assertFalse(deploymentAdmin.isDeployed("C"));
// Tree with duplicate names
moduleA = getModule("A", "C");
moduleB = getModule("B", "C");
moduleC = getModule("A", "B");
moduleD = getModule("D", "A");
moduleE = getModule("C");
order = deploymentAdmin.getDeploymentOrder(Arrays.asList(new Module[] {moduleA, moduleB, moduleC, moduleD, moduleE}), options);
assertOrder(new Module[] {moduleE, moduleB, moduleA, moduleC, moduleD}, order);
}
public void testCircular() throws Exception {
// Circular 3
Module moduleB = getModule("B", "C");
Module moduleC = getModule("C", "D");
Module moduleD = getModule("D", "B");
try {
deploymentAdmin.getDeploymentOrder(Arrays.asList(new Module[] {moduleC, moduleD, moduleB}), new DeploymentOrderOptions());
fail();
}
catch (DeploymentOrderException ex) {
assertEquals("Circular dependency detected in module uses-relationships: module 'C' uses (depends on) module 'D' uses (depends on) module 'B'", ex.getMessage());
}
// Circular 1 - this is allowed
moduleB = getModule("B", "B");
DeploymentOrder order = deploymentAdmin.getDeploymentOrder(Arrays.asList(new Module[] {moduleC, moduleD, moduleB}), new DeploymentOrderOptions());
assertOrder(new Module[] {moduleB, moduleD, moduleC, }, order);
// Circular 2
moduleB = getModule("B", "C");
moduleC = getModule("C", "B");
try {
deploymentAdmin.getDeploymentOrder(Arrays.asList(new Module[] {moduleC, moduleB}), new DeploymentOrderOptions());
fail();
}
catch (DeploymentOrderException ex) {
assertEquals("Circular dependency detected in module uses-relationships: module 'C' uses (depends on) module 'B'", ex.getMessage());
}
// turn off circular check
DeploymentOrderOptions options = new DeploymentOrderOptions();
options.setCheckCircularDependency(false);
order = deploymentAdmin.getDeploymentOrder(Arrays.asList(new Module[] {moduleC, moduleB}), options);
assertOrder(new Module[] {moduleB, moduleC}, order);
}
public void testUnresolvedUses() throws Exception {
// Single module
Module moduleB = getModule("B", "C");
try {
deploymentAdmin.getDeploymentOrder(Arrays.asList(new Module[] {moduleB}), new DeploymentOrderOptions());
fail();
}
catch (DeploymentOrderException ex) {
assertEquals("Module-dependency not found as declared by module 'B' for uses-declaration 'C'", ex.getMessage());
}
// multiple module
Module[] modules = new Module[] {getModule("B", "C"), getModule("C", "D"), getModule("D", "x")};
try {
deploymentAdmin.getDeploymentOrder(Arrays.asList(modules), new DeploymentOrderOptions());
fail();
}
catch (DeploymentOrderException ex) {
assertEquals("Module-dependency not found as declared by module 'D' for uses-declaration 'x'", ex.getMessage());
}
// turn off uses-checks
DeploymentOrderOptions options = new DeploymentOrderOptions();
options.setCheckUses(false);
deploymentAdmin.getDeploymentOrder(Arrays.asList(modules), options);
}
private void assertOrder(Module[] ordered, DeploymentOrder order)
{
EPAssertionUtil.assertEqualsExactOrder(ordered, order.getOrdered().toArray());
}
private Module getModule(String name, String... uses) {
Set<String> usesSet = new HashSet<String>();
usesSet.addAll(Arrays.asList(uses));
return new Module(name, null, usesSet, Collections.EMPTY_SET, Collections.EMPTY_LIST, null);
}
}