blob: ffea78baf973ec0467dea84a0af6bf17561c38c8 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.netbeans.nbbuild;
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.util.Arrays;
import junit.framework.AssertionFailedError;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.types.Path;
import org.netbeans.junit.*;
/**
* Test for SortSuiteModule
* @author pzajac
*/
public class SortSuiteModulesTest extends NbTestCase {
private Project project;
String a = "a";
String b = "b";
String c = "c";
String d = "d";
String e = "e";
String f = "f";
String g = "g";
String SORTED_MODULES = "sorted_modules";
String NULL[] = new String[0];
public SortSuiteModulesTest(java.lang.String testName) {
super(testName);
}
protected @Override void setUp() throws Exception {
clearWorkDir();
project = new Project();
project.setBaseDir(getWorkDir());
}
public void testOnlyModuleDependencies() throws IOException {
// a -> b means: a depends on b
// a-> b,c
// b -> d,e
// f -> g
createModule(g,NULL);
createModule(d,NULL);
createModule(c,NULL);
createModule(e,NULL);
createModule(a,new String[]{b,c});
createModule(b,new String[]{e,d});
createModule(f,new String[]{g});
Path path = createPath(new String[]{a,b,c,d,e,f,g});
SortSuiteModules ssm = new SortSuiteModules();
ssm.setProject(project);
ssm.setUnsortedModules(path);
ssm.setSortedModulesProperty(SORTED_MODULES);
ssm.execute();
String property = project.getProperty(SORTED_MODULES);
assertNotNull("null sorted modules path",property);
String paths[] = getSorted(property);
assertEdge(paths,a,b);
assertEdge(paths,a,c);
assertEdge(paths,b,d);
assertEdge(paths,b,e);
assertEdge(paths,f,g);
}
public void testModuleDependenciesCycle() throws IOException {
createModule(a,new String[]{b});
createModule(b,new String[]{a});
Path path = createPath(new String[]{a,b});
SortSuiteModules ssm = new SortSuiteModules();
ssm.setProject(project);
ssm.setUnsortedModules(path);
ssm.setSortedModulesProperty(SORTED_MODULES);
try {
ssm.execute();
fail("Exception must be thrown");
} catch(BuildException be) {
// ok
}
}
public void testModuleAndTestDependenciesDisabledTestSort() throws IOException {
generateTestModules1(false);
String property = project.getProperty(SORTED_MODULES);
assertNotNull("null sorted modules path",property);
String paths[] = getSorted(property);
assertEdge(paths,a,b);
assertEdge(paths,a,c);
assertEdge(paths,b,d);
assertEdge(paths,b,e);
assertEdge(paths,f,g);
try {
assertEdge(paths,b,g);
fail("sort test deps disabled");
} catch (AssertionFailedError be) {}
}
public void testModuleAndTestDependenciesEnabledTestSort() throws IOException {
generateTestModules1(true);
String property = project.getProperty(SORTED_MODULES);
assertNotNull("null sorted modules path",property);
String paths[] = getSorted(property);
assertEdge(paths,a,b);
assertEdge(paths,a,c);
assertEdge(paths,b,d);
assertEdge(paths,b,e);
assertEdge(paths,b,g);
assertEdge(paths,f,g);
}
private void generateTestModules1(boolean sortTests) throws IOException, BuildException {
// a -> b means: a depends on b
// a-> b,c
// b -> d,e, unittest g
// f -> g
createModule(g,NULL);
createModule(d,NULL);
createModule(c,NULL);
createModule(e,NULL);
createModule(a,new String[]{b,c});
createModule(b,new String[]{e,d},new String[]{g},NULL);
createModule(f,new String[]{g});
Path path = createPath(new String[]{a,b,c,d,e,f,g});
SortSuiteModules ssm = new SortSuiteModules();
ssm.setProject(project);
ssm.setUnsortedModules(path);
ssm.setSortedModulesProperty(SORTED_MODULES);
if (sortTests) {
ssm.setSortTests(true);
}
ssm.execute();
}
private void createModule(String module, String[] mdeps) throws IOException {
createModule(module,mdeps,new String[0],new String[0]);
}
/** create module/nbbuild/project.xml
* @param module module and cnd
* @param mdeps runtime dependencies
* @param udeps test unit dependencies with tests
* @param qadeps qa-functional dependencies with tests
*/
private void createModule(String module, String[] mdeps, String[] udeps, String[] qadeps) throws IOException {
File dir = new File(getWorkDir(),module + File.separator + "nbproject");
assertTrue("cannot create module dir",dir.mkdirs());
File xml = new File(dir,"project.xml");
PrintStream ps = new PrintStream(xml);
ps.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
ps.println("<project xmlns=\"http://www.netbeans.org/ns/project/1\">");
ps.println(" <type>org.netbeans.modules.apisupport.project</type>");
ps.println(" <configuration>");
ps.println(" <data xmlns=\"http://www.netbeans.org/ns/nb-module-project/2\">");
ps.println(" <code-name-base>" + module + "</code-name-base>");
ps.println(" <module-dependencies>");
for (int it = 0 ; it < mdeps.length ; it++) {
ps.println(" <dependency>");
ps.println(" <code-name-base>" + mdeps[it] + "</code-name-base>");
ps.println(" <build-prerequisite/>");
ps.println(" </dependency>");
}
ps.println(" </module-dependencies>");
ps.println(" <test-dependencies>");
ps.println(" <test-type>");
ps.println(" <name>unit</name>");
for (int it = 0 ; it < udeps.length ; it++ ) {
ps.println(" <test-dependency>");
ps.println(" <code-name-base>" + udeps[it] + "</code-name-base>");
ps.println(" <test/>");
ps.println(" </test-dependency>");
}
ps.println(" </test-type>");
ps.println(" <test-type>");
ps.println(" <name>qa-functional</name>");
for (int it = 0 ; it < qadeps.length ; it++ ) {
ps.println(" <test-dependency>");
ps.println(" <code-name-base>" + qadeps[it] + "</code-name-base>");
ps.println(" <test/>");
ps.println(" </test-dependency>");
}
ps.println(" </test-type>");
ps.println(" </test-dependencies>");
ps.println(" <public-packages/>");
ps.println(" </data>");
ps.println(" </configuration>");
ps.println("</project>");
}
private Path createPath(String[] paths) {
Path path = new Path(project);
StringBuffer sb = new StringBuffer();
for (int it = 0; it < paths.length; it++) {
if (sb.length() > 0) {
sb.append(":");
}
sb.append(paths[it]);
}
path.setPath(sb.toString());
return path;
}
private String[] getSorted(String property) {
Path path = new Path(project);
path.setPath(property);
String paths[] = path.list();
String rets [] = new String[paths.length];
for (int i = 0; i < paths.length; i++) {
rets[i] = new File(paths[i]).getName();
}
return rets;
}
private void assertEdge(String[] names, String a, String b) {
assertTrue(a + " after " + b + " in " + Arrays.toString(names), getIndex(names,a) > getIndex(names,b));
}
private int getIndex(String[] names, String a) {
for (int i = 0; i < names.length; i++) {
log(names[i]);
if (names[i].equals(a)) {
return i;
}
}
fail("index " + a);
return -1;
}
public void testTestDependenciesCycleEnabledTestSort() throws IOException {
createModule(a,new String[]{b},new String[]{b},NULL);
createModule(b,NULL,new String[]{a},NULL);
Path path = createPath(new String[]{a,b});
SortSuiteModules ssm = new SortSuiteModules();
ssm.setProject(project);
ssm.setUnsortedModules(path);
ssm.setSortedModulesProperty(SORTED_MODULES);
ssm.setSortTests(true);
try {
ssm.execute();
fail("Exception must be thrown");
} catch(BuildException be) {
// ok
}
}
public void testTestDependenciesCycleDisabledTestSort() throws IOException {
createModule(a,new String[]{b},new String[]{b},NULL);
createModule(b,NULL,new String[]{a},NULL);
Path path = createPath(new String[]{a,b});
SortSuiteModules ssm = new SortSuiteModules();
ssm.setProject(project);
ssm.setUnsortedModules(path);
ssm.setSortedModulesProperty(SORTED_MODULES);
// no exception
ssm.execute();
}
}