blob: db0a1e8cf8f672680f2abc7a073d0811b0f1ccde [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.apache.jmeter;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.jmeter.junit.JMeterTestCase;
import org.apache.jmeter.util.JMeterUtils;
/**
* Check the eclipse and Maven version definitions against build.properties
*/
public class JMeterVersionTest extends JMeterTestCase {
// Convert between eclipse jar name and build.properties name
private static Map<String, String> JAR_TO_BUILD_PROP = new HashMap<String, String>();
static {
JAR_TO_BUILD_PROP.put("bsf", "apache-bsf");
JAR_TO_BUILD_PROP.put("bsh", "beanshell");
JAR_TO_BUILD_PROP.put("geronimo-jms_1.1_spec", "jms");
JAR_TO_BUILD_PROP.put("htmllexer", "htmlparser"); // two jars same version
JAR_TO_BUILD_PROP.put("httpmime", "httpclient"); // two jars same version
JAR_TO_BUILD_PROP.put("mail", "javamail");
JAR_TO_BUILD_PROP.put("oro", "jakarta-oro");
JAR_TO_BUILD_PROP.put("xercesImpl", "xerces");
JAR_TO_BUILD_PROP.put("xpp3_min", "xpp3");
}
private static final File JMETER_HOME = new File(JMeterUtils.getJMeterHome());
public JMeterVersionTest() {
super();
}
public JMeterVersionTest(String arg0) {
super(arg0);
}
private final Map<String, String> versions = new HashMap<String, String>();
private final Set<String> propNames = new HashSet<String>();
private File getFileFromHome(String relativeFile) {
return new File(JMETER_HOME, relativeFile);
}
private Properties prop;
@Override
protected void setUp() throws Exception {
final Properties buildProp = new Properties();
final FileInputStream bp = new FileInputStream(getFileFromHome("build.properties"));
buildProp.load(bp);
bp.close();
for (Entry<Object, Object> entry : buildProp.entrySet()) {
final String key = (String) entry.getKey();
if (key.endsWith(".version")) {
final String value = (String) entry.getValue();
final String jarprop = key.replace(".version","");
final String old = versions.put(jarprop, value);
propNames.add(jarprop);
if (old != null) {
fail("Already have entry for "+key);
}
}
}
// remove docs-only jars
propNames.remove("velocity");
propNames.remove("commons-lang");
prop = buildProp;
}
/**
* Check eclipse.classpath contains the jars declared in build.properties
* @throws Exception if something fails
*/
public void testEclipse() throws Exception {
final BufferedReader eclipse = new BufferedReader(
new FileReader(getFileFromHome("eclipse.classpath"))); // assume default charset is OK here
// <classpathentry kind="lib" path="lib/geronimo-jms_1.1_spec-1.1.1.jar"/>
// <classpathentry kind="lib" path="lib/activation-1.1.1.jar"/>
// <classpathentry kind="lib" path="lib/jtidy-r938.jar"/>
final Pattern p = Pattern.compile("\\s+<classpathentry kind=\"lib\" path=\"lib/(?:api/)?(.+?)-([^-]+(-b\\d+|-BETA\\d)?)\\.jar\"/>");
final Pattern versionPat = Pattern.compile("\\$\\{(.+)\\.version\\}");
String line;
final ArrayList<String> toRemove = new ArrayList<String>();
while((line=eclipse.readLine()) != null){
final Matcher m = p.matcher(line);
if (m.matches()) {
String jar = m.group(1);
String version = m.group(2);
// System.out.println(jar + " => " + version);
if (jar.endsWith("-jdk15on")) { // special handling
jar=jar.replace("-jdk15on","");
} else if (jar.equals("commons-jexl") && version.startsWith("2")) { // special handling
jar="commons-jexl2";
} else {
String tmp = JAR_TO_BUILD_PROP.get(jar);
if (tmp != null) {
jar = tmp;
}
}
String expected = versions.get(jar);
if(expected == null) {
System.err.println("Didn't find version for jar name extracted by regexp, jar name extracted:"+jar+", version extracted:"+version+", current line:"+line);
fail("Didn't find version for jar name extracted by regexp, jar name extracted:"+jar+", version extracted:"+version+", current line:"+line);
}
// Process ${xxx.version} references
final Matcher mp = versionPat.matcher(expected);
if (mp.matches()) {
String key = mp.group(1);
expected = versions.get(key);
toRemove.add(key); // in case it is not itself used we remove it later
}
propNames.remove(jar);
if (expected == null) {
fail("Versions list does not contain: " + jar);
} else {
if (!version.equals(expected)) {
assertEquals(jar,version,expected);
}
}
}
}
// remove any possibly unused references
for(Object key : toRemove.toArray()) {
propNames.remove(key);
}
eclipse.close();
if (propNames.size() > 0) {
fail("Should have no names left: "+Arrays.toString(propNames.toArray()) + ". Check eclipse.classpath");
}
}
public void testMaven() throws Exception {
final BufferedReader maven = new BufferedReader(
new FileReader(getFileFromHome("res/maven/ApacheJMeter_parent.pom"))); // assume default charset is OK here
// <apache-bsf.version>2.4.0</apache-bsf.version>
final Pattern p = Pattern.compile("\\s+<([^\\.]+)\\.version>([^<]+)<.*");
String line;
while((line=maven.readLine()) != null){
final Matcher m = p.matcher(line);
if (m.matches()) {
String jar = m.group(1);
String version = m.group(2);
String expected = versions.get(jar);
propNames.remove(jar);
if (expected == null) {
fail("Versions list does not contain: " + jar);
} else {
if (!version.equals(expected)) {
assertEquals(jar,expected,version);
}
}
}
}
maven.close();
if (propNames.size() > 0) {
fail("Should have no names left: "+Arrays.toString(propNames.toArray()) + ". Check ApacheJMeter_parent.pom");
}
}
public void testLicences() {
Set<String> liceNames = new HashSet<String>();
for (Map.Entry<String, String> me : versions.entrySet()) {
final String key = me.getKey();
liceNames.add(key+"-"+me.getValue()+".txt");
if (key.equals("htmlparser")) {
liceNames.add("htmllexer"+"-"+me.getValue()+".txt");
}
}
File licencesDir = getFileFromHome("licenses/bin");
String [] lice = licencesDir.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return ! name.equalsIgnoreCase("README.txt")
&& !name.equals(".svn"); // Allow for old-style SVN workspaces
}
});
assertTrue("Expected at least one license file",lice.length > 0);
for(String l : lice) {
if (!liceNames.remove(l)) {
fail("Mismatched version in license file " + l);
}
}
}
/**
* Check that all downloads use Maven Central
*/
public void testMavenDownload() {
int fails = 0;
for (Entry<Object, Object> entry : prop.entrySet()) {
final String key = (String) entry.getKey();
if (key.endsWith(".loc")) {
final String value = (String) entry.getValue();
if (! value.startsWith("${maven2.repo}")) {
fails++;
System.err.println("ERROR: non-Maven download detected\n" + key + "=" +value);
}
}
}
if (fails > 0) {
// TODO replace with fail()
System.err.println("ERROR: All files must be available from Maven Central; but " + fails + " use(s) a different download source");
}
}
}